Templates/PropTech & Real Estate/Tenant-screening risk classifier

Tenant-screening risk classifier

Tri-state approve / conditional / decline verdict per applicant. Always-human reviewer-gate on declines for Fair Housing + ECOA adverse-action-notice evidence.

Category: classifier·Reviewer-gate: always-human·For PropTech & Real Estate

What this template is

Pattern: classifier producing tri-state rental-decision recommendation. Always-human reviewer-gate on decline ensures human review before any adverse-action notice is sent. Closed-enum reason-codes (from the ECOA adverse-action list) prevent free-text drift on the regulator-sensitive output. Hash-only redaction on applicant identifiers means no PII in the chain. Each L12 entry feeds Fair Housing disparate-impact analyses + ECOA adverse-action evidence.

The template

TypeScript · BSL-1.1 · License

import { RuntimeAISpec } from '@promethean/runtime-ai';

export const tenantScreenerSpec: RuntimeAISpec = {
  specId: 'tenant-screener-v1',
  displayName: 'Tenant-screening risk classifier',
  description:
    'Tri-state rental-decision recommendation with closed-enum adverse-action reasons.',
  category: 'classifier',
  schemaVersion: 'promethean-runtime-ai-spec-1.0',
  canonicalForm: 'v1',

  inputSchema: {
    fields: [
      { name: 'applicationId', type: 'string', required: true,
        redaction: 'hash-only' },
      { name: 'propertyId', type: 'string', required: true },
      // Applicant identifiers are PII; never raw.
      { name: 'applicantContextHash', type: 'string', required: true,
        redaction: 'hash-only' },
      { name: 'creditScoreBand', type: 'enum', required: true,
        enumValues: ['below-600', '600-649', '650-699', '700-749', '750-plus'] },
      { name: 'incomeToRentRatio', type: 'number', required: true,
        min: 0, max: 100 },
    ],
  },

  outputSchema: {
    fields: [
      { name: 'recommendation', type: 'enum', required: true,
        enumValues: ['approve', 'conditional', 'decline'] },
      { name: 'adverseActionReasons', type: 'string-list', required: false,
        maxItems: 4, maxLength: 80 },
      { name: 'confidence', type: 'number', required: true,
        min: 0, max: 1 },
    ],
  },

  promptTemplate: {
    system:
      'You score tenant-screening applications against the property profile. ' +
      'Recommend approve / conditional / decline. ' +
      'When decline, include adverse-action reason codes per ECOA. ' +
      'Do not infer protected-class characteristics. ' +
      'A human reviewer signs every decline before the adverse-action notice is sent.',
    user:
      'Application {{applicationId}} for property {{propertyId}}. ' +
      'Credit-score band: {{creditScoreBand}}. ' +
      'Income-to-rent ratio: {{incomeToRentRatio}}.',
  },

  modelIdentity: {
    provider: 'anthropic',
    model: 'claude-sonnet-4-5',
    version: '20250929',
  },

  reviewerGate: 'always-human',
  maxLatencyMs: 4000,
  fallbackBehavior: 'queue-for-review',
};

Regulations addressed

This template's configuration choices map to specific regulatory obligations. The substrate doesn't certify compliance — but the spec hash + reviewer-verdict + modelIdentity per L12 entry give you the evidence layer for these citations:

  • ·EU AI Act Annex III §5(b) — creditworthiness (when credit-based)
  • ·US Fair Housing Act
  • ·HUD Discriminatory Effects Standard (24 CFR §100.500)
  • ·ECOA — adverse-action notices

See citations index for official source URLs →

Installation + usage

  1. Create a free Dev-tier workspace — API key + Ed25519 signing key issued instantly.
  2. Install the SDK: npm install https://promethean.software/runtime-ai/latest.tgz.
  3. Paste the template above into your codebase. Adjust modelIdentity + prompt for your context.
  4. Call runConstrainedAI(spec, input, { client, receiptLogPath, productId, signingKey }) from your service code. For local testing pass createMockRuntimeAIClient(spec); for production, an Anthropic / OpenAI / Azure adapter.
  5. Verify the chain with the Apache-2.0 verifier.