DUNIN7 · LOOMWORKS · RECORD
record.dunin7.com
Status Current
Path change-requests/cr-2026-168-surface-typecheck-gate-v0_1.md

DUNIN7-M4 — CHANGE REQUEST

CR-2026-168 — B-50: the type check the build cannot see — v0.1

Version. v0.1 Date. 2026-08-04 Author. Claude.ai (drafting session). Approving: Marvin Percival. Charter. standing-notes/dunin7-standing-authorization-charter-v0_1. No session executes a change request it drafted (§1). Target. /Users/dunin7/loomworks at main 1fc6a65, tag surface-ci-gate-v0_1. One repository. No engine change. Baseline. Lint, tests and build all pass and are gated as of CR-2026-167. A direct type check of the whole project does not pass — that is this change request's subject. The criterion is no new failure in the gated commands, against sets recorded at Step 0. Build-list item. B-50. CR number. CR-2026-168. Highest confirmed is CR-2026-167. [EXECUTING SESSION: verify; advance if taken.] Grounding. inspection-briefs/loomworks-clean-report-cluster-step-0-findings-v0_1 (which found the gap); inspection-briefs/loomworks-b49-step-0-findings-v0_1 (the workflow this extends). Status. Pre-execution. No separate Step 0 brief — the work is small enough that its determination lives at §5 Step 0, and the change request halts if that determination says otherwise.


1. What this fixes

The surface's build passes and the project does not type-check. The build only compiles files reachable from the running application, so the test tree is invisible to it — and that is where the errors are.

A green build has been read as a checked codebase. It is not one, and now that a gate exists it would go on saying so on every push.

This is the last of the three gates nobody had named. The other two are the engine's quality-tooling backlog, which is B-48's decision.


2. Construction decisions

D-1 — the errors are fixed, not excluded. A type checker configured to skip the files that fail it is the vacuous-green hazard in its purest form.

[EXECUTING SESSION: if any error cannot be fixed without a structural change — a dependency's types being wrong, a pattern the configuration genuinely disallows — halt and report it. Do not add an ignore comment to make the count reach zero.] An ignore that is genuinely correct is possible; an ignore added to satisfy a gate is the gate defeating itself.

D-2 — the check joins the existing workflow rather than getting its own.

CR-2026-167 installed one workflow running lint, tests and build. A second workflow for one command splits the report and makes did everything pass a question requiring two answers.

D-3 — the gate is demonstrated failing before it is trusted.

The precedent from CR-2026-167, and it is not a formality: every gate installed there was deliberately broken, observed failing, and restored. A gate whose failure nobody has seen is a claim.

D-4 — the coverage comment is updated, because it currently tells the truth and would stop.

CR-2026-167 put a comment in each workflow naming what it runs and what it deliberately does not, with the engine's quality tooling named as the open decision. The surface's comment says types are not checked. After this, they are.

> This is the first time that comment has needed maintaining, and it is worth naming as a standing obligation rather than a one-off. A coverage statement that is not updated when coverage changes becomes exactly the misleading green it was written to prevent. Every future change to either workflow updates its comment in the same commit.

D-5 — no engine change, and B-48 stays out.

The engine's ruff and mypy backlogs are a decision about what a gate should check, at a volume that makes deciding badly expensive. This change request touches neither, and its coverage comment continues to say so.


3. In scope

3.1 The type errors. Fixed, per D-1. [EXECUTING SESSION: enumerate them at Step 0 and report the count you find — a prior reading said four, and that reading is not carried here. It moves with the test tree.]

3.2 The workflow — the type check added to the existing job, per D-2.

3.3 The coverage comment — updated, per D-4.


4. Out of scope


5. Order of operations

Per-step commits. Check the current branch before the first commit.

Step 0 — pre-flight and one determination. Verify HEAD, tree, CR number. Record the baseline: lint, tests, build, and the type check's current error list in full — every error, not a count.

Then settle: is every error fixable without a structural change or an ignore? Per D-1. Report the enumeration before fixing anything, and halt if the answer is no for any of them.

Step 1 — the fixes. §3.1. Verify the type check exits clean and the three gated commands still pass.

Step 2 — the gate and its comment. §3.2 and §3.3, in one commit — per D-4, a coverage change and its statement travel together.

Step 3 — the failure demonstration. Break a type deliberately, confirm the command exits non-zero, restore. Record what was broken and the output.

CHECKPOINT A — report, then proceed. The baseline comparison; the enumeration and what each fix was; the failure demonstration. No Operator confirmation. Halt and queue on: any error needing a structural change or an ignore; any new failure in the gated commands; any charter §6 anomaly.

Step 4 — implementation notes.

CHECKPOINT B — merge and tag. --no-ff to main, tag surface-typecheck-gate-v0_1, push. Authorized under R-2 including the push.

> And watch the first run. The gate fires on push, so Checkpoint B is the first time it executes on a fresh machine. Report its outcome. A gate that passes locally and fails on a runner is an ordinary result — the engine's took three attempts. Fix and report; do not disable it to make the merge look clean.

Deployment is never autonomous (F-1).


6. Acceptance gate

  1. The type check exits clean, with no ignore comment added to reach it.
  2. Lint, tests and build still pass — no new failure against the Step 0 baseline.
  3. The type check runs on every push to main, in the existing workflow rather than a new one.
  4. The gate has been demonstrated failing, with what was broken and the output recorded.
  5. The coverage comment names the type check as covered, and still names the engine's quality tooling and the end-to-end gap as not.
  6. The first real run's outcome is reported.
  7. No engine change. No file outside /Users/dunin7/loomworks.
  8. Implementation notes carry the enumeration and the failure demonstration.
  9. The status brief is appended, per charter §7.

7. Claude Code kickoff


CR-2026-168 — B-50, the type check the build cannot see. Execution session.

CR: loomworks-record/change-requests/cr-2026-168-surface-typecheck-gate-v0_1.md
Confirm it exists, and that it is the highest version present — numeric sort.

Grounding, read before the CR:
  inspection-briefs/loomworks-b49-step-0-findings-v0_1.md

Charter dunin7-standing-authorization-charter-v0_1 governs.
Read the CR in full. It is the authority on what changes, where and why; this
block repeats none of it. Where this block and the CR appear to differ, the CR
is right and you halt rather than choosing.

  Section 2 — the construction decisions and their reasoning
  Section 3 — what changes
  Section 4 — what is out of scope
  Section 5 — the step sequence and both checkpoints
  Section 6 — the acceptance gate

ONE REPOSITORY — the CR's header names the target. No engine change; if anything
in the engine appears to need changing, halt.

There is no separate Step 0 brief. Section 5's Step 0 carries the determination,
and it can legitimately halt this change request.

This CR installs automation that runs on push. Checkpoint B is the first time it
executes for real, and its outcome is part of the report. Fix and report a
runner-only failure; do not disable the gate to make a merge look clean.

Standing fences, true regardless of this CR:
  playground_dev and playground_test are live databases and are not touched.
  Commit to a branch; check the current branch before the first commit.
  Deployment is never yours.
  Append the outcome to current-status/dunin7-status-brief at close.

DUNIN7 — Done In Seven LLC — Miami, Florida CR-2026-168 — B-50: the type check the build cannot see — v0.1 — 2026-08-04 The build compiles what the application reaches. This checks the rest.