Keel
keel route
Independence cannot be manufactured, but it can be routed.
Every ungrounded verification edge in keel, paired — where a pairing exists — with an anchored producer already present in the same measurement. Nothing here invents an anchor, and nothing here has been applied.
| target | keel |
|---|---|
| revision | 44f7e8d6cbdfaee7d0e4ff281d59a236ecf0c747 |
| source report | reports/keel.json |
| generated | 2026-07-25T05:12:33.411Z |
| status | proposed (all 9) |
anchored / (anchored + self_referential + unknown)
The second number is a projection: the ratio this target would carry if a human applied every route below and the applied routes measured as anchored on re-measurement. It is arithmetic on a hypothetical. It is not written to any report, it is not fed back into the grounding ratio, and no proposal on this page has been applied. Projected counts, for the same conditional: anchored 6 · self_referential 8 · unknown 0 · not_a_check 11. The delta is two different claims and is reported as two: 1 re-grounded — an existing check whose signal moves outside the write boundary, the proposition it asserts unchanged — and 0 constructed — a not_a_check node that becomes a check, entering the denominator as well as the numerator. Only the first repairs something that was already being claimed.
Scope. Keel measures the shape of verification, not its quality. A repo can be 100% anchored with terrible tests. Anchoring says the signal comes from outside; it does not say the signal is sufficient.
Routes — 1 routable · 8 unroutable
Existing checks whose signal could come from somewhere they cannot write. Cheapest effort on top. no route is a first-class answer: it means the fix needs a policy decision rather than a rewiring, and it is reported here rather than dropped.
| what's ungrounded | route to | why that's anchored | effort |
|---|---|---|---|
package.json#test
self_referential |
.github/workflows/portability.yml#25-scan-committed-files-for-absolute-home-paths
anchored
|
The execution axis of `bun test` is already honest — the Bun runtime's exit code, not any prose in the repo, decides pass or fail. What is ungrounded is the merge-time edge: at this revision no workflow invokes it, so the signal a reviewer actually reads is the `- [ ] bun test` box in the PR template, a field the same author sets. The `paths` job takes its verdict from a GitHub-hosted ubuntu-latest runner that checks out the PR's tree with none of the author's tooling present and reports the process exit status through the checks API; a contributor can edit the command and the tests but cannot write the exit code that runner observes, nor the status GitHub publishes from it. Hosting the suite in that job moves the merge-time fork point from a checkbox the author ticks to a runtime verdict on a machine the author does not control. Limit that this route does not fix and that belongs on the record: the assertions are authored in-repo alongside the implementation, so a green run shows the code does what the tests say, not that the tests say the right thing. |
wiring |
.github/workflows/l3-stability.yml#125-set-final-status
self_referential |
no route | This is the one edge in the job that can turn the check red, but it is a wrapper: it exits 1 exactly when compute-lambda returned non-zero over the repo's own asserted constants. Descending it lands on the same unmeasured parameters, and no candidate in this report emits a stability signal for it to read instead. |
— |
.github/workflows/l3-stability.yml#52-compute-lambda-rcs-stability-budget
self_referential |
no route | The arithmetic executes honestly; what is ungrounded is every input to it. gamma, rho, eta, beta, tau and nu are hand-declared constants in .control/rcs-parameters.toml, a file inside the PR's own tree and itself a trigger path for this workflow. No candidate in this report measures any of those quantities, so none can supply the operands the inequality needs. |
— |
.github/workflows/l3-stability.yml#68-run-l3-rate-gate
self_referential |
no route | The counted channel is the repository's own commit history, which is the actor's writes, and the comparison threshold tau_a plus the [gates.l3_paths] pattern list come from an in-repo TOML the same PR may edit. No anchored candidate observes commit rate or supplies a threshold from outside the tree, so there is no producer here to read instead. |
— |
.github/workflows/l3-stability.yml#83-comment-on-pr
self_referential |
no route | This step's own success means only that the GitHub API accepted a comment body; the verdict inside that body is computed by the same job from constants in the PR's own tree. Piping an anchored producer's status into the text would change what gets published without changing what the step itself asserts, and no candidate here produces a merge recommendation to relay. |
— |
Makefile#bstack-check
self_referential |
no route | Every anchored producer in this report emits a verdict about something else: whether tracked bytes contain machine-specific paths, whether governed HTML/CSS carries raw literals, whether GitHub accepted a Pages artifact. None of them emits any signal about whether the primitive contract holds, so none can carry this check's proposition. |
— |
Makefile#bstack-l3-trust
self_referential |
no route | The pack prints 'L3 trust gates passed — governance change is structurally valid' on the strength of one child that compares two markdown files. No anchored producer in this report emits a signal about structural validity of a governance change, and attaching one that emits something else — portability-check, say — would make the pack run a second real scan while the sentence it prints stayed exactly as unearned. |
— |
Makefile#bstack-primitive-lint
self_referential |
no route | The proposition here is that AGENTS.md's P-N sections carry four literal headings and match a table in CLAUDE.md. The two in-repo scanners that are anchored, portability-check and design-audit, are the same shape but assert about committed path strings and about design tokens; their exit codes say nothing about primitive documentation, so reading either one would add a passing signal without asserting this claim. |
— |
Makefile#bstack-rule-of-three
self_referential |
no route | The claim is that a promoted primitive recurred three or more times. Nothing in this report counts instances of anything: the anchored producers emit a path scan, a token scan, a sync-mode ink check and a Pages deployment status. No candidate can be read as evidence for a recurrence count. |
— |
Construct — not yet.
A route makes a check read a signal from outside itself. It does not pair that check with a counter-metric, name who arbitrates when the pair disagrees, or set a cadence at which the route is re-audited. Those three fields are declared in schemas/route.ts and are filled by keel construct, which is not built. The columns are empty by construction, not by omission.
| route | pairedWith | arbitratedBy | auditEvery |
|---|---|---|---|
| package.json#test | — | — | — |