{
  "_generated_by": "scripts/status.py via `make status`. Do not hand-edit.",
  "_why": "Every other file in docs/.ai/ is prose and can go stale. This one is read from the repository, so where it disagrees with prose, it is right.",
  "generated_at": "2026-08-20T23:05:38.848974+00:00",
  "git": {
    "head": "74033d2",
    "branch": "main",
    "commits": 209,
    "dirty": true
  },
  "tests": {
    "passed": 2785,
    "failed": null,
    "errors": 0,
    "measured": true,
    "problem": "",
    "files": [
      "test_a11y_guards.py",
      "test_actions_screen.py",
      "test_admin_index.py",
      "test_alignment_decision.py",
      "test_app_wiring.py",
      "test_approval_segregation_wired.py",
      "test_audit.py",
      "test_audit_v2.py",
      "test_backup.py",
      "test_backup_atomic.py",
      "test_change_mapping.py",
      "test_change_mapping_decisions.py",
      "test_change_view.py",
      "test_chat_agent.py",
      "test_chat_schema.py",
      "test_chat_surface.py",
      "test_chat_tools.py",
      "test_claims.py",
      "test_clock_pinned.py",
      "test_config.py",
      "test_context_budget.py",
      "test_contrast_report.py",
      "test_coverage_map.py",
      "test_design_guards.py",
      "test_diff.py",
      "test_diff_scale.py",
      "test_draft_final.py",
      "test_evals.py",
      "test_explain.py",
      "test_explain_ceiling.py",
      "test_explain_documents.py",
      "test_explain_tabs.py",
      "test_feedback.py",
      "test_fetch.py",
      "test_glass_contrast.py",
      "test_history_needs_a_budget.py",
      "test_identity.py",
      "test_ingestion.py",
      "test_invites.py",
      "test_isolation.py",
      "test_jobs.py",
      "test_live_transport_probe.py",
      "test_login.py",
      "test_migrate.py",
      "test_model_evals.py",
      "test_model_status.py",
      "test_normalize.py",
      "test_notify.py",
      "test_obligation_evals.py",
      "test_occurrence.py",
      "test_passage_isolation.py",
      "test_pdf_text.py",
      "test_permissions.py",
      "test_permissions_screen.py",
      "test_pipeline.py",
      "test_policy.py",
      "test_projects.py",
      "test_propose.py",
      "test_provisioning.py",
      "test_real_findings.py",
      "test_replay.py",
      "test_responsive.py",
      "test_retention.py",
      "test_review.py",
      "test_rollback.py",
      "test_route_assignees_can_answer.py",
      "test_routing.py",
      "test_schema.py",
      "test_screens.py",
      "test_search.py",
      "test_section_labels.py",
      "test_security_headers.py",
      "test_seed.py",
      "test_seed_chain.py",
      "test_seed_workspace.py",
      "test_seeded_refusal.py",
      "test_share_registry.py",
      "test_sharing.py",
      "test_smoke.py",
      "test_source_links.py",
      "test_sources.py",
      "test_status_script.py",
      "test_structure.py",
      "test_tdd_counts.py",
      "test_tenancy_derived.py",
      "test_tour.py",
      "test_users_admin.py",
      "test_verification.py",
      "test_workflow.py",
      "test_workflow_editor.py"
    ],
    "requires_network": false,
    "requires_api_key": false
  },
  "modules": {
    "app/auth/policy.py": {
      "lines": 647,
      "calls_a_model": false
    },
    "app/auth/sessions.py": {
      "lines": 582,
      "calls_a_model": false
    },
    "app/chat/agent.py": {
      "lines": 898,
      "calls_a_model": true
    },
    "app/chat/budget.py": {
      "lines": 368,
      "calls_a_model": false
    },
    "app/chat/engine.py": {
      "lines": 80,
      "calls_a_model": false
    },
    "app/chat/persona.py": {
      "lines": 211,
      "calls_a_model": false
    },
    "app/chat/pills.py": {
      "lines": 469,
      "calls_a_model": false
    },
    "app/chat/tools.py": {
      "lines": 2673,
      "calls_a_model": false
    },
    "app/config.py": {
      "lines": 92,
      "calls_a_model": false
    },
    "app/diff/engine.py": {
      "lines": 192,
      "calls_a_model": false
    },
    "app/diff/structure.py": {
      "lines": 1261,
      "calls_a_model": false
    },
    "app/evals/corpus.py": {
      "lines": 232,
      "calls_a_model": false
    },
    "app/evals/metrics.py": {
      "lines": 740,
      "calls_a_model": false
    },
    "app/evals/model.py": {
      "lines": 1872,
      "calls_a_model": false
    },
    "app/evals/obligations.py": {
      "lines": 1301,
      "calls_a_model": false
    },
    "app/evals/report.py": {
      "lines": 187,
      "calls_a_model": false
    },
    "app/evals/run.py": {
      "lines": 196,
      "calls_a_model": false
    },
    "app/explain/answerer.py": {
      "lines": 741,
      "calls_a_model": true
    },
    "app/explain/docindex.py": {
      "lines": 588,
      "calls_a_model": false
    },
    "app/explain/documents.py": {
      "lines": 445,
      "calls_a_model": false
    },
    "app/explain/embedding.py": {
      "lines": 209,
      "calls_a_model": false
    },
    "app/explain/knowledge.py": {
      "lines": 328,
      "calls_a_model": false
    },
    "app/ingestion/ingest.py": {
      "lines": 115,
      "calls_a_model": false
    },
    "app/interpretation/action.py": {
      "lines": 35,
      "calls_a_model": false
    },
    "app/interpretation/propose.py": {
      "lines": 1410,
      "calls_a_model": true
    },
    "app/jobs/runner.py": {
      "lines": 1242,
      "calls_a_model": false
    },
    "app/main.py": {
      "lines": 191,
      "calls_a_model": false
    },
    "app/notify/messages.py": {
      "lines": 436,
      "calls_a_model": false
    },
    "app/notify/transport.py": {
      "lines": 461,
      "calls_a_model": false
    },
    "app/pipeline.py": {
      "lines": 270,
      "calls_a_model": false
    },
    "app/seed.py": {
      "lines": 2204,
      "calls_a_model": false
    },
    "app/sources/fetch.py": {
      "lines": 1129,
      "calls_a_model": false
    },
    "app/state/actions.py": {
      "lines": 344,
      "calls_a_model": false
    },
    "app/state/alignment.py": {
      "lines": 613,
      "calls_a_model": false
    },
    "app/state/audit.py": {
      "lines": 974,
      "calls_a_model": false
    },
    "app/state/claims.py": {
      "lines": 667,
      "calls_a_model": false
    },
    "app/state/db.py": {
      "lines": 56,
      "calls_a_model": false
    },
    "app/state/feedback.py": {
      "lines": 864,
      "calls_a_model": false
    },
    "app/state/identity.py": {
      "lines": 1130,
      "calls_a_model": false
    },
    "app/state/invites.py": {
      "lines": 3377,
      "calls_a_model": false
    },
    "app/state/mapping.py": {
      "lines": 1405,
      "calls_a_model": false
    },
    "app/state/migrate.py": {
      "lines": 180,
      "calls_a_model": false
    },
    "app/state/models.py": {
      "lines": 3861,
      "calls_a_model": false
    },
    "app/state/permissions.py": {
      "lines": 1488,
      "calls_a_model": false
    },
    "app/state/projects.py": {
      "lines": 1058,
      "calls_a_model": false
    },
    "app/state/queries.py": {
      "lines": 416,
      "calls_a_model": false
    },
    "app/state/replay.py": {
      "lines": 762,
      "calls_a_model": false
    },
    "app/state/retention.py": {
      "lines": 1215,
      "calls_a_model": false
    },
    "app/state/review.py": {
      "lines": 575,
      "calls_a_model": false
    },
    "app/state/rollback.py": {
      "lines": 392,
      "calls_a_model": false
    },
    "app/state/routing.py": {
      "lines": 1511,
      "calls_a_model": false
    },
    "app/state/search.py": {
      "lines": 1335,
      "calls_a_model": false
    },
    "app/state/sharing.py": {
      "lines": 899,
      "calls_a_model": false
    },
    "app/state/sources.py": {
      "lines": 1536,
      "calls_a_model": false
    },
    "app/state/workflow.py": {
      "lines": 2471,
      "calls_a_model": false
    },
    "app/text/gutter.py": {
      "lines": 86,
      "calls_a_model": false
    },
    "app/text/normalize.py": {
      "lines": 292,
      "calls_a_model": false
    },
    "app/verification/verifier.py": {
      "lines": 262,
      "calls_a_model": false
    },
    "app/web/deps.py": {
      "lines": 491,
      "calls_a_model": false
    },
    "app/web/headers.py": {
      "lines": 246,
      "calls_a_model": false
    },
    "app/web/templating.py": {
      "lines": 383,
      "calls_a_model": false
    },
    "app/web/views/actions.py": {
      "lines": 603,
      "calls_a_model": false
    },
    "app/web/views/admin.py": {
      "lines": 1431,
      "calls_a_model": false
    },
    "app/web/views/admin_index.py": {
      "lines": 144,
      "calls_a_model": false
    },
    "app/web/views/auth.py": {
      "lines": 413,
      "calls_a_model": false
    },
    "app/web/views/changes.py": {
      "lines": 1743,
      "calls_a_model": false
    },
    "app/web/views/chat.py": {
      "lines": 806,
      "calls_a_model": false
    },
    "app/web/views/explain.py": {
      "lines": 111,
      "calls_a_model": false
    },
    "app/web/views/feedback_review.py": {
      "lines": 733,
      "calls_a_model": false
    },
    "app/web/views/integrations.py": {
      "lines": 780,
      "calls_a_model": false
    },
    "app/web/views/invite_accept.py": {
      "lines": 471,
      "calls_a_model": false
    },
    "app/web/views/permissions.py": {
      "lines": 1556,
      "calls_a_model": false
    },
    "app/web/views/proceedings.py": {
      "lines": 501,
      "calls_a_model": false
    },
    "app/web/views/projects.py": {
      "lines": 981,
      "calls_a_model": false
    },
    "app/web/views/review.py": {
      "lines": 566,
      "calls_a_model": false
    },
    "app/web/views/review_centre.py": {
      "lines": 1193,
      "calls_a_model": false
    },
    "app/web/views/share.py": {
      "lines": 249,
      "calls_a_model": false
    },
    "app/web/views/shares_admin.py": {
      "lines": 1261,
      "calls_a_model": false
    },
    "app/web/views/users_admin.py": {
      "lines": 1113,
      "calls_a_model": false
    },
    "app/web/views/workflow.py": {
      "lines": 686,
      "calls_a_model": false
    }
  },
  "decisions": [
    {
      "id": "ADR-001",
      "status": "accepted",
      "date": "2026-08-03",
      "area": "product",
      "depends_on": null,
      "revisits": null,
      "is_hard_bet": false,
      "title": "One user: the regulatory affairs analyst at a multi-state utility"
    },
    {
      "id": "ADR-002",
      "status": "accepted",
      "date": "2026-08-03",
      "area": "product",
      "depends_on": "ADR-001",
      "revisits": null,
      "is_hard_bet": false,
      "title": "The wedge is change-to-action, not search and not alerts"
    },
    {
      "id": "ADR-003",
      "status": "accepted",
      "date": "2026-08-03",
      "area": "hard-bet",
      "depends_on": "ADR-002",
      "revisits": null,
      "is_hard_bet": true,
      "title": "Citations are verified against source offsets, and an unverified claim cannot assert itself"
    },
    {
      "id": "ADR-004",
      "status": "accepted",
      "date": "2026-08-03",
      "area": "hard-bet",
      "depends_on": "ADR-002",
      "revisits": null,
      "is_hard_bet": false,
      "title": "Deterministic diff first, model interpretation second"
    },
    {
      "id": "ADR-005",
      "status": "accepted",
      "date": "2026-08-03",
      "area": "hard-bet",
      "depends_on": "ADR-002",
      "revisits": null,
      "is_hard_bet": false,
      "title": "Draft versus final is a first-class field, never inferred at read time"
    },
    {
      "id": "ADR-006",
      "status": "accepted",
      "date": "2026-08-03",
      "area": "hard-bet",
      "depends_on": "ADR-003",
      "revisits": null,
      "is_hard_bet": false,
      "title": "Confidence is explicit and low confidence escalates rather than guesses"
    },
    {
      "id": "ADR-007",
      "status": "accepted",
      "date": "2026-08-03",
      "area": "stack",
      "depends_on": null,
      "revisits": null,
      "is_hard_bet": false,
      "title": "Python, FastAPI, SQLite, server-rendered UI"
    },
    {
      "id": "ADR-008",
      "status": "accepted",
      "date": "2026-08-03",
      "area": "stack",
      "depends_on": null,
      "revisits": null,
      "is_hard_bet": false,
      "title": "Retrieval: lexical BM25 first, embeddings only where they earn it"
    },
    {
      "id": "ADR-009",
      "status": "accepted",
      "date": "2026-08-03",
      "area": "delivery",
      "depends_on": null,
      "revisits": null,
      "is_hard_bet": false,
      "title": "The hosted instance at verbatim.citelocal.ai is the primary surface; the local run remains the contract"
    },
    {
      "id": "ADR-010",
      "status": "accepted",
      "date": "2026-08-03",
      "area": "delivery",
      "depends_on": "ADR-009",
      "revisits": null,
      "is_hard_bet": false,
      "title": "Verbatim gets its own disposable droplet, not the existing shared one"
    },
    {
      "id": "ADR-011",
      "status": "accepted",
      "date": "2026-08-03",
      "area": "delivery",
      "depends_on": "ADR-010",
      "revisits": null,
      "is_hard_bet": false,
      "title": "Caddy and Docker Compose, not Coolify"
    },
    {
      "id": "ADR-012",
      "status": "accepted",
      "date": "2026-08-03",
      "area": "stack",
      "depends_on": null,
      "revisits": "ADR-007",
      "is_hard_bet": false,
      "title": "ADR-007 reaffirmed: server-rendered templates with a hand-built design system"
    },
    {
      "id": "ADR-013",
      "status": "accepted",
      "date": "2026-08-03",
      "area": "delivery",
      "depends_on": "ADR-003",
      "revisits": null,
      "is_hard_bet": false,
      "title": "Four screens, and the citation chip is where the hard bet becomes visible"
    },
    {
      "id": "ADR-014",
      "status": "accepted",
      "date": "2026-08-03",
      "area": "delivery",
      "depends_on": null,
      "revisits": null,
      "is_hard_bet": false,
      "title": "Secrets live in one gitignored file, copied at the narrowest possible width"
    },
    {
      "id": "ADR-015",
      "status": "accepted",
      "date": "2026-08-04",
      "area": "security",
      "depends_on": "ADR-007",
      "revisits": null,
      "is_hard_bet": false,
      "title": "Local password authentication on the standard library, and no new dependency for it"
    },
    {
      "id": "ADR-016",
      "status": "accepted",
      "date": "2026-08-04",
      "area": "security",
      "depends_on": "ADR-015",
      "revisits": null,
      "is_hard_bet": false,
      "title": "Login events join the existing hash chain rather than a second log"
    },
    {
      "id": "ADR-017",
      "status": "accepted",
      "date": "2026-08-04",
      "area": "security",
      "depends_on": "ADR-016",
      "revisits": null,
      "is_hard_bet": false,
      "title": "A second digest scheme, and the old rows are never re-hashed"
    },
    {
      "id": "ADR-018",
      "status": "accepted",
      "date": "2026-08-04",
      "area": "security",
      "depends_on": "ADR-017",
      "revisits": null,
      "is_hard_bet": false,
      "title": "Segregation of duties is enforced from the audit chain, not from a static permission"
    },
    {
      "id": "ADR-019",
      "status": "accepted",
      "date": "2026-08-04",
      "area": "security",
      "depends_on": "ADR-018",
      "revisits": null,
      "is_hard_bet": false,
      "title": "The demo may waive segregation of duties, and the waiver writes itself into the record"
    },
    {
      "id": "ADR-020",
      "status": "accepted",
      "date": "2026-08-04",
      "area": "security",
      "depends_on": "ADR-015",
      "revisits": null,
      "is_hard_bet": false,
      "title": "an identity system with no way to sign in is a library, not a control. The project list and detail are the frame the four original screens hang inside; the original four assumed a single project and the corpus has six. The read-only workflow route answers a pain that is written down: an analyst hands an item off and cannot say who has it or what happens if nobody acts, so they chase it by email \u2014 which is the workflow this product claims to replace. The new-project form and the split between the escalation queue and the review centre are the two that were"
    },
    {
      "id": "ADR-021",
      "status": "accepted",
      "date": "2026-08-04",
      "area": "security",
      "depends_on": "ADR-015",
      "revisits": null,
      "is_hard_bet": false,
      "title": "Authority is a grid of roles to permission codes, held in code, and the control is the row that is missing"
    },
    {
      "id": "ADR-022",
      "status": "accepted",
      "date": "2026-08-04",
      "area": "hard-bet",
      "depends_on": "ADR-003",
      "revisits": null,
      "is_hard_bet": false,
      "title": "Every synthesis states what it withheld, at the same visual weight as what it included"
    },
    {
      "id": "ADR-023",
      "status": "accepted",
      "date": "2026-08-04",
      "area": "delivery",
      "depends_on": "ADR-013",
      "revisits": null,
      "is_hard_bet": false,
      "title": "One router owns one path, and the guard is derived from the application rather than written by hand"
    },
    {
      "id": "ADR-024",
      "status": "accepted",
      "date": "2026-08-04",
      "area": "hard-bet",
      "depends_on": "ADR-003",
      "revisits": null,
      "is_hard_bet": true,
      "title": "A refusal may be disputed. The verifier may not be overridden"
    },
    {
      "id": "ADR-025",
      "status": "accepted",
      "date": "2026-08-04",
      "area": "hard-bet",
      "depends_on": "ADR-003",
      "revisits": null,
      "is_hard_bet": false,
      "title": "A soft hyphen at a line break produces the wrong text on purpose, because the wrong text fails closed"
    },
    {
      "id": "ADR-026",
      "status": "accepted",
      "date": "2026-08-04",
      "area": "hard-bet",
      "depends_on": "ADR-003",
      "revisits": null,
      "is_hard_bet": false,
      "title": "Compatibility folding is decided by what a folding does, not by which tag a character carries"
    },
    {
      "id": "ADR-027",
      "status": "accepted",
      "date": "2026-08-04",
      "area": "hard-bet",
      "depends_on": "ADR-003",
      "revisits": null,
      "is_hard_bet": false,
      "title": "A citation names a version, is checked against that version, and a verified fact has a shelf life"
    },
    {
      "id": "ADR-028",
      "status": "accepted",
      "date": "2026-08-04",
      "area": "stack",
      "depends_on": null,
      "revisits": "ADR-007",
      "is_hard_bet": false,
      "title": "SQLite now, Postgres at a named trigger \u2014 and the guarantees that are application promises until then"
    },
    {
      "id": "ADR-029",
      "status": "accepted",
      "date": "2026-08-04",
      "area": "security",
      "depends_on": "ADR-028",
      "revisits": null,
      "is_hard_bet": false,
      "title": "Tenant scope is one chokepoint, and no child row carries a second copy of the company"
    },
    {
      "id": "ADR-030",
      "status": "accepted",
      "date": "2026-08-04",
      "area": "stack",
      "depends_on": "ADR-028",
      "revisits": null,
      "is_hard_bet": false,
      "title": "Time is stored as UTC through a column type, and a naive timestamp raises rather than being assumed"
    },
    {
      "id": "ADR-031",
      "status": "accepted",
      "date": "2026-08-04",
      "area": "stack",
      "depends_on": "ADR-016",
      "revisits": null,
      "is_hard_bet": false,
      "title": "Knowledge is superseded, never edited"
    },
    {
      "id": "ADR-032",
      "status": "accepted",
      "date": "2026-08-04",
      "area": "security",
      "depends_on": "ADR-017",
      "revisits": null,
      "is_hard_bet": false,
      "title": "The reversal column exists and the digest scheme that would defend it does not, so nothing may treat it as evidence"
    },
    {
      "id": "ADR-033",
      "status": "accepted",
      "date": "2026-08-04",
      "area": "hard-bet",
      "depends_on": "ADR-003",
      "revisits": null,
      "is_hard_bet": false,
      "title": "Regulatory relationships are a citation-verified edge graph, not a graph database"
    },
    {
      "id": "ADR-034",
      "status": "accepted",
      "date": "2026-08-04",
      "area": "workflow",
      "depends_on": null,
      "revisits": null,
      "is_hard_bet": false,
      "title": "Time is injected into the approval engine, never read inside it"
    },
    {
      "id": "ADR-035",
      "status": "accepted",
      "date": "2026-08-04",
      "area": "workflow",
      "depends_on": "ADR-018",
      "revisits": null,
      "is_hard_bet": false,
      "title": "A bypassed approval is recorded as bypassed and never as approved"
    },
    {
      "id": "ADR-036",
      "status": "accepted",
      "date": "2026-08-04",
      "area": "workflow",
      "depends_on": "ADR-006",
      "revisits": null,
      "is_hard_bet": false,
      "title": "An escalation that cannot be routed stays in the shared queue, visibly unrouted"
    },
    {
      "id": "ADR-037",
      "status": "amended",
      "date": "2026-08-04",
      "area": "hard-bet",
      "depends_on": "ADR-003",
      "revisits": null,
      "is_hard_bet": false,
      "title": "Two named modules may call a model, the id is pinned in code, and with no key the path says so"
    },
    {
      "id": "ADR-038",
      "status": "accepted",
      "date": "2026-08-04",
      "area": "testing",
      "depends_on": null,
      "revisits": null,
      "is_hard_bet": false,
      "title": "No line-coverage target: branch coverage on the load-bearing modules, mutation testing, and properties"
    },
    {
      "id": "ADR-039",
      "status": "accepted",
      "date": "2026-08-04",
      "area": "testing",
      "depends_on": "ADR-022",
      "revisits": null,
      "is_hard_bet": false,
      "title": "Evals print raw counts with denominators, and the size of the independent sample is derived, not supplied"
    },
    {
      "id": "ADR-040",
      "status": "accepted",
      "date": "2026-08-04",
      "area": "testing",
      "depends_on": null,
      "revisits": null,
      "is_hard_bet": false,
      "title": "The corpus stays synthetic and keeps its fictional jurisdiction; real filings would be a second, labelled corpus"
    },
    {
      "id": "ADR-041",
      "status": "accepted",
      "date": "2026-08-04",
      "area": "docs",
      "depends_on": "ADR-008",
      "revisits": null,
      "is_hard_bet": false,
      "title": "Diagrams have one vocabulary, and unbuilt work is drawn as unbuilt"
    },
    {
      "id": "ADR-042",
      "status": "accepted",
      "date": "2026-08-04",
      "area": "docs",
      "depends_on": null,
      "revisits": null,
      "is_hard_bet": false,
      "title": "One file in this repository is generated, and where prose disagrees with it, it wins"
    },
    {
      "id": "ADR-043",
      "status": "accepted",
      "date": "2026-08-04",
      "area": "process",
      "depends_on": "ADR-014",
      "revisits": null,
      "is_hard_bet": false,
      "title": "The history is kept whole, commits are split honestly, and the repository starts private"
    },
    {
      "id": "ADR-044",
      "status": "accepted",
      "date": "2026-08-04",
      "area": "process",
      "depends_on": "ADR-023",
      "revisits": null,
      "is_hard_bet": false,
      "title": "Parallel agents own disjoint files, one process commits, and a wave that would collide is parked"
    },
    {
      "id": "ADR-045",
      "status": "accepted",
      "date": "2026-08-04",
      "area": "research",
      "depends_on": null,
      "revisits": null,
      "is_hard_bet": false,
      "title": "No gift-card incentive, and the write-up is offered unconditionally"
    },
    {
      "id": "ADR-046",
      "status": "accepted",
      "date": "2026-08-04",
      "area": "research",
      "depends_on": null,
      "revisits": "ADR-045",
      "is_hard_bet": false,
      "title": "The signature is a name and an address: no borrowed title, no third party named, and the disclosure line stays verbatim"
    },
    {
      "id": "ADR-047",
      "status": "accepted",
      "date": "2026-08-04",
      "area": "delivery",
      "depends_on": "ADR-012",
      "revisits": null,
      "is_hard_bet": false,
      "title": "Tables are made to scroll in the stylesheet, not by wrapping every table"
    },
    {
      "id": "ADR-048",
      "status": "accepted",
      "date": "2026-08-04",
      "area": "workflow",
      "depends_on": "ADR-023",
      "revisits": null,
      "is_hard_bet": false,
      "title": "The approval route gets two screens and two routers: what the route is, and what it shall be"
    },
    {
      "id": "ADR-049",
      "status": "accepted",
      "date": "2026-08-04",
      "area": "workflow",
      "depends_on": "ADR-036",
      "revisits": null,
      "is_hard_bet": false,
      "title": "A saved route may be incomplete; it may not be wrong. Activation is where absence becomes denial"
    },
    {
      "id": "ADR-050",
      "status": "accepted",
      "date": "2026-08-04",
      "area": "hard-bet",
      "depends_on": "ADR-003",
      "revisits": null,
      "is_hard_bet": false,
      "title": "The assistant is a records clerk, not a guide"
    },
    {
      "id": "ADR-051",
      "status": "accepted",
      "date": "2026-08-04",
      "area": "security",
      "depends_on": "ADR-029",
      "revisits": null,
      "is_hard_bet": false,
      "title": "The model never holds an identity, and the guard is an allowlist"
    },
    {
      "id": "ADR-052",
      "status": "accepted",
      "date": "2026-08-04",
      "area": "hard-bet",
      "depends_on": "ADR-022",
      "revisits": null,
      "is_hard_bet": false,
      "title": "A tool that can withhold must return the count, and a missing count stops the turn from claiming zero"
    },
    {
      "id": "ADR-053",
      "status": "accepted",
      "date": "2026-08-04",
      "area": "security",
      "depends_on": "ADR-032",
      "revisits": "ADR-032",
      "is_hard_bet": false,
      "title": "Digest scheme 3 is chosen by what a row carries, and a scheme that cannot cover the pointer refuses it"
    },
    {
      "id": "ADR-054",
      "status": "accepted",
      "date": "2026-08-04",
      "area": "security",
      "depends_on": "ADR-053",
      "revisits": null,
      "is_hard_bet": false,
      "title": "Taking back a decision is a row; taking back a reversal reinstates nothing"
    },
    {
      "id": "ADR-055",
      "status": "accepted",
      "date": "2026-08-04",
      "area": "hard-bet",
      "depends_on": "ADR-003",
      "revisits": null,
      "is_hard_bet": false,
      "title": "A complaint is referred, never escalated"
    },
    {
      "id": "ADR-056",
      "status": "accepted",
      "date": "2026-08-04",
      "area": "workflow",
      "depends_on": "ADR-036",
      "revisits": null,
      "is_hard_bet": false,
      "title": "A routing failure has a code, and the shared queue re-derives it on every read"
    },
    {
      "id": "ADR-057",
      "status": "accepted",
      "date": "2026-08-04",
      "area": "stack",
      "depends_on": "ADR-037",
      "revisits": null,
      "is_hard_bet": false,
      "title": "The model SDK pin moves to the version the code beside it can actually call"
    },
    {
      "id": "ADR-058",
      "status": "accepted",
      "date": "2026-08-04",
      "area": "testing",
      "depends_on": "ADR-040",
      "revisits": null,
      "is_hard_bet": false,
      "title": "Retrieving real filings: an empty haul is a successful run"
    },
    {
      "id": "ADR-059",
      "status": "accepted",
      "date": "2026-08-04",
      "area": "testing",
      "depends_on": "ADR-040",
      "revisits": null,
      "is_hard_bet": false,
      "title": "What a real filing is fetched for, and why it is stored dirty"
    },
    {
      "id": "ADR-060",
      "status": "accepted",
      "date": "2026-08-04",
      "area": "docs",
      "depends_on": "ADR-042",
      "revisits": null,
      "is_hard_bet": false,
      "title": "The status script reports no test count rather than a false one"
    },
    {
      "id": "ADR-061",
      "status": "accepted",
      "date": "2026-08-04",
      "area": "process",
      "depends_on": "ADR-044",
      "revisits": null,
      "is_hard_bet": false,
      "title": "Writing the decision log is a serialised stage that runs after the builders, not beside them"
    },
    {
      "id": "ADR-062",
      "status": "accepted",
      "date": "2026-08-04",
      "area": "process",
      "depends_on": "ADR-007",
      "revisits": null,
      "is_hard_bet": false,
      "title": "Playwright installs into a scratch virtualenv, not the project's"
    },
    {
      "id": "ADR-063",
      "status": "accepted",
      "date": "2026-08-04",
      "area": "research",
      "depends_on": "ADR-046",
      "revisits": null,
      "is_hard_bet": false,
      "title": "Guessed addresses send last, after every address read off a filing"
    },
    {
      "id": "ADR-064",
      "status": "accepted",
      "date": "2026-08-04",
      "area": "security",
      "depends_on": "ADR-019",
      "revisits": null,
      "is_hard_bet": false,
      "title": "Nobody may grant a permission they do not themselves hold"
    },
    {
      "id": "ADR-065",
      "status": "accepted",
      "date": "2026-08-04",
      "area": "security",
      "depends_on": "ADR-064",
      "revisits": null,
      "is_hard_bet": false,
      "title": "A conflict of duties is disclosed, not forbidden"
    },
    {
      "id": "ADR-066",
      "status": "accepted",
      "date": "2026-08-04",
      "area": "operations",
      "depends_on": "ADR-034",
      "revisits": null,
      "is_hard_bet": false,
      "title": "Periodic work is a separate process the entrypoint starts, off unless asked for, and it announces itself either way"
    },
    {
      "id": "ADR-067",
      "status": "accepted",
      "date": "2026-08-04",
      "area": "security",
      "depends_on": "ADR-066",
      "revisits": null,
      "is_hard_bet": false,
      "title": "The fetcher's guard is the feature: every resolved address checked, and every redirect hop"
    },
    {
      "id": "ADR-068",
      "status": "accepted",
      "date": "2026-08-04",
      "area": "audit",
      "depends_on": "ADR-020",
      "revisits": null,
      "is_hard_bet": false,
      "title": "Reading the past and restoring it are two functions, because they carry different risk"
    },
    {
      "id": "ADR-069",
      "status": "accepted",
      "date": "2026-08-04",
      "area": "web",
      "depends_on": null,
      "revisits": null,
      "is_hard_bet": false,
      "title": "One templates factory, and the administrative screens get an index rather than six more nav items"
    },
    {
      "id": "ADR-070",
      "status": "accepted",
      "date": "2026-08-04",
      "area": "security",
      "depends_on": "ADR-009",
      "revisits": null,
      "is_hard_bet": false,
      "title": null
    },
    {
      "id": "ADR-071",
      "status": "accepted",
      "date": "2026-08-04",
      "area": "stack",
      "depends_on": "ADR-008",
      "revisits": null,
      "is_hard_bet": false,
      "title": null
    },
    {
      "id": "ADR-072",
      "status": "accepted",
      "date": "2026-08-04",
      "area": "security",
      "depends_on": "ADR-003",
      "revisits": null,
      "is_hard_bet": false,
      "title": "Share links: the one read in this product that no session guards"
    },
    {
      "id": "ADR-073",
      "status": "accepted",
      "date": "2026-08-04",
      "area": "security",
      "depends_on": "ADR-016",
      "revisits": null,
      "is_hard_bet": false,
      "title": "The retention schedule is data the tests read, not a table in a document"
    },
    {
      "id": "ADR-074",
      "status": "accepted",
      "date": "2026-08-04",
      "area": "operations",
      "depends_on": "ADR-017",
      "revisits": null,
      "is_hard_bet": false,
      "title": "The migration is derived from the models, runs on every start, and does the audit chain first"
    },
    {
      "id": "ADR-075",
      "status": "accepted",
      "date": "2026-08-04",
      "area": "security",
      "depends_on": "ADR-064",
      "revisits": null,
      "is_hard_bet": false,
      "title": "Two kinds of invitation, one lifecycle, and a grant ceiling on only one of them"
    },
    {
      "id": "ADR-076",
      "status": "accepted",
      "date": "2026-08-04",
      "area": "security",
      "depends_on": "ADR-075",
      "revisits": null,
      "is_hard_bet": false,
      "title": "Composing a mail and sending one are two acts, and only one of them has ever run"
    },
    {
      "id": "ADR-077",
      "status": "accepted",
      "date": "2026-08-04",
      "area": "operations",
      "depends_on": "ADR-073",
      "revisits": null,
      "is_hard_bet": false,
      "title": "A backup is verified or it is a belief, and nothing schedules this one"
    },
    {
      "id": "ADR-078",
      "status": "accepted",
      "date": "2026-08-04",
      "area": "hard-bet",
      "depends_on": "ADR-004",
      "revisits": null,
      "is_hard_bet": true,
      "title": "The model judges materiality on one change, and that judgement passes the same citation gate as a claim"
    },
    {
      "id": "ADR-079",
      "status": "accepted",
      "date": "2026-08-04",
      "area": "stack",
      "depends_on": "ADR-071",
      "revisits": null,
      "is_hard_bet": false,
      "title": null
    },
    {
      "id": "ADR-080",
      "status": "accepted",
      "date": "2026-08-04",
      "area": "security",
      "depends_on": "ADR-075",
      "revisits": null,
      "is_hard_bet": false,
      "title": null
    },
    {
      "id": "ADR-081",
      "status": "accepted",
      "date": "2026-08-04",
      "area": "security",
      "depends_on": "ADR-080",
      "revisits": null,
      "is_hard_bet": false,
      "title": null
    },
    {
      "id": "ADR-082",
      "status": "accepted",
      "date": "2026-08-04",
      "area": "security",
      "depends_on": "ADR-016",
      "revisits": null,
      "is_hard_bet": false,
      "title": "Who resolved an escalation comes from the session, never from the form"
    },
    {
      "id": "ADR-083",
      "status": "accepted",
      "date": "2026-08-04",
      "area": "security",
      "depends_on": "ADR-015",
      "revisits": null,
      "is_hard_bet": false,
      "title": "The demonstration publishes a door, not a key, and the room behind it is disposable"
    },
    {
      "id": "ADR-084",
      "status": "accepted",
      "date": "2026-08-05",
      "area": "security",
      "depends_on": null,
      "revisits": null,
      "is_hard_bet": false,
      "title": null
    },
    {
      "id": "ADR-085",
      "status": "accepted",
      "date": "2026-08-05",
      "area": "architecture",
      "depends_on": null,
      "revisits": null,
      "is_hard_bet": false,
      "title": null
    },
    {
      "id": "ADR-086",
      "status": "accepted",
      "date": "2026-08-05",
      "area": "hard-bet",
      "depends_on": "ADR-003",
      "revisits": null,
      "is_hard_bet": true,
      "title": null
    },
    {
      "id": "ADR-087",
      "status": "accepted",
      "date": "2026-08-05",
      "area": "architecture",
      "depends_on": "ADR-085",
      "revisits": null,
      "is_hard_bet": false,
      "title": null
    },
    {
      "id": "ADR-088",
      "status": "accepted",
      "date": "2026-08-05",
      "area": "operations",
      "depends_on": "ADR-003",
      "revisits": null,
      "is_hard_bet": false,
      "title": null
    },
    {
      "id": "ADR-089",
      "status": "accepted",
      "date": "2026-08-05",
      "area": "architecture",
      "depends_on": "ADR-087",
      "revisits": null,
      "is_hard_bet": false,
      "title": null
    },
    {
      "id": "ADR-090",
      "status": "accepted",
      "date": "2026-08-05",
      "area": "hard-bet",
      "depends_on": "ADR-086",
      "revisits": null,
      "is_hard_bet": false,
      "title": null
    },
    {
      "id": "ADR-091",
      "status": "accepted",
      "date": "2026-08-05",
      "area": "security",
      "depends_on": "ADR-018",
      "revisits": null,
      "is_hard_bet": false,
      "title": null
    },
    {
      "id": "ADR-092",
      "status": "accepted",
      "date": "2026-08-07",
      "area": "stack",
      "depends_on": null,
      "revisits": "ADR-012",
      "is_hard_bet": false,
      "title": null
    },
    {
      "id": "ADR-093",
      "status": "accepted",
      "date": "2026-08-07",
      "area": "stack",
      "depends_on": "ADR-092",
      "revisits": null,
      "is_hard_bet": false,
      "title": null
    },
    {
      "id": "ADR-094",
      "status": "accepted",
      "date": "2026-08-07",
      "area": "testing",
      "depends_on": "ADR-003",
      "revisits": null,
      "is_hard_bet": false,
      "title": null
    },
    {
      "id": "ADR-095",
      "status": "accepted",
      "date": "2026-08-08",
      "area": "architecture",
      "depends_on": "ADR-003",
      "revisits": null,
      "is_hard_bet": false,
      "title": null
    },
    {
      "id": "ADR-096",
      "status": "accepted",
      "date": "2026-08-10",
      "area": "architecture",
      "depends_on": "ADR-004",
      "revisits": null,
      "is_hard_bet": false,
      "title": null
    },
    {
      "id": "ADR-097",
      "status": "accepted",
      "date": "2026-08-11",
      "area": "hard-bet",
      "depends_on": "ADR-003",
      "revisits": null,
      "is_hard_bet": false,
      "title": null
    },
    {
      "id": "ADR-098",
      "status": "accepted",
      "date": "2026-08-10",
      "area": "hard-bet",
      "depends_on": "ADR-003",
      "revisits": null,
      "is_hard_bet": false,
      "title": null
    },
    {
      "id": "ADR-099",
      "status": "accepted",
      "date": "2026-08-11",
      "area": "testing",
      "depends_on": "ADR-098",
      "revisits": null,
      "is_hard_bet": false,
      "title": null
    },
    {
      "id": "ADR-100",
      "status": "accepted",
      "date": "2026-08-11",
      "area": "testing",
      "depends_on": "ADR-038",
      "revisits": null,
      "is_hard_bet": false,
      "title": null
    },
    {
      "id": "ADR-101",
      "status": "accepted",
      "date": "2026-08-11",
      "area": "testing",
      "depends_on": "ADR-039",
      "revisits": null,
      "is_hard_bet": false,
      "title": null
    },
    {
      "id": "ADR-102",
      "status": "accepted",
      "date": "2026-08-11",
      "area": "hard-bet",
      "depends_on": "ADR-003",
      "revisits": null,
      "is_hard_bet": true,
      "title": null
    },
    {
      "id": "ADR-103",
      "status": "accepted",
      "date": "2026-08-11",
      "area": "hard-bet",
      "depends_on": "ADR-004",
      "revisits": null,
      "is_hard_bet": false,
      "title": null
    },
    {
      "id": "ADR-104",
      "status": "accepted",
      "date": "2026-08-11",
      "area": "stack",
      "depends_on": "ADR-095",
      "revisits": null,
      "is_hard_bet": false,
      "title": null
    }
  ],
  "built": {
    "ingestion": true,
    "normalization": true,
    "citation_verifier": true,
    "occurrence_disambiguation": true,
    "deterministic_diff": true,
    "draft_final_split": true,
    "tenant_scoped_reads": true,
    "audit_log_hash_chained": true,
    "audit_actor_attribution": true,
    "project_workspace": true,
    "review_centre": true,
    "web_surface": true,
    "authentication": true,
    "roles_and_permissions": true,
    "segregation_of_duties": true,
    "model_interpretation": true,
    "evals": true
  },
  "designed_not_built": {},
  "known_gaps": [
    "The verifier confirms a quoted passage EXISTS at the cited offsets. It does not confirm the passage supports the claim attached to it. Named in docs/security.html.",
    "The audit hash chain detects tampering; it does not prevent it. Closing that needs the chain head published outside the host.",
    "_spans_of in app/verification/verifier.py falls back to fixed-width window scanning, which breaks once normalization changes length -- i.e. on real PDF text.",
    "The eval corpus has five labelled changes. No percentage computed over five items should be reported as a measurement."
  ]
}
