Skip to content

Commit 95d8715

Browse files
alex-strukclaude
andcommitted
docs(workflow-builder): verify the last 27 register entries — every fix proposal now measured
Completes the verification pass. All 43 C-cluster `fix` proposals have now been checked against current source; 5 (12%) were already fixed. Two newly found stale, both fixed by earlier work that cited its own gap id in a comment — G-038 by G-010's `resolveAnchorTarget`, G-064 by G-012's shared `noOutputReasonForNode`. Measured staleness is 12%. The 33% I estimated from a four-entry sample was wrong in the safe direction but was still an extrapolation and should not have been offered as a rate — C1 ran 18%, C3 ran 0%. The pass also surfaced a category the register has no column for: entries that are structurally true but that nothing shipped can reach. - G-066 — `registerArtifactKind` has ZERO production call sites, so the stored value the frozen snapshot would destroy cannot exist. - G-046 half one — ZERO of the catalog's activities declare a kindless input port. Five unreachable binding states, for an empty port family. And the inverse, in the same entry: G-046's other half covers 26 optional base-`Artifact` ports, each owning a canvas handle invisible to the Inputs panel, badge and drawer — the same population behind the agent scenario-1 catalog-vs-runtime mismatch. One entry, one empty half and one 26-port half; they need separate rulings. Finding those three needed enumeration of what the catalog and call graph actually contain. Grepping the cited evidence line alone would have confirmed all three as "still true" and been useless. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
1 parent a5e8700 commit 95d8715

2 files changed

Lines changed: 142 additions & 1 deletion

File tree

feature-docs/20260724-workflow-builder-spec-completion/DECISION_SHEET.md

Lines changed: 64 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -239,7 +239,70 @@ warning (`8fb19d57`, earlier this session) had broken a backend
239239
that shipped; the backend one was not. Recorded here rather than buried in the
240240
commit, because the lesson is about which suites a package-level change reaches.
241241

242-
## Remaining verification
242+
## Verification complete — all 43 C-cluster entries measured, 2026-07-27
243+
244+
The remaining 27 are verified. Combined with C1 and the earlier C5 pass, **every
245+
`fix` proposal in the register has now been checked against current source.**
246+
247+
| Cluster | Verified | Already fixed | Still true |
248+
|---|---|---|---|
249+
| C1 reference integrity | 11 | 2 (G-030, G-048) | 9 → **all 7 remaining now shipped** |
250+
| C5 control-flow & registry | 11 | 1 (G-067, this session) | 10 |
251+
| C2 validation surfacing | 7 | **1 (G-038)** | 6 |
252+
| C4 run observability | 8 | **1 (G-064)** | 7 |
253+
| C3 composition & authoring | 6 | 0 | 6 |
254+
| **Total** | **43** | **5 (12%)** | **38** |
255+
256+
**Measured staleness is 12%, not the 50% the first four-entry sample suggested
257+
and not the 33% I estimated from it.** The estimate was wrong in the safe
258+
direction, but it was still an extrapolation from four entries and should not
259+
have been offered as a rate. The clusters differ sharply — C1 ran 18%, C3 ran
260+
0% — and the only reason to know that is to have measured each.
261+
262+
### The two newly-found stale entries
263+
264+
- **G-038** (workflow-level validation rows inert) — fixed by G-010.
265+
`resolveAnchorTarget` now routes edge, group, entryNodeId, ctx and
266+
library-port anchors; only the genuinely workflow-level ones stay inert. The
267+
fix commit says so in a comment, which is why this was cheap to confirm.
268+
- **G-064** (wire-peek blames the cache for a producer that never ran) — fixed
269+
by G-012. `WirePeekPopover` reads `producerStatus` from `nodeStatuses` and
270+
shares `noOutputReasonForNode` with the node card, so the two surfaces agree.
271+
272+
### Three entries are TRUE but not LIVE — this changes what they are worth
273+
274+
Verification turned up a distinct category the register does not have a column
275+
for: the code is exactly as described, but nothing shipped can reach it. These
276+
should not be ruled `fix` on the same footing as the rest.
277+
278+
| Entry | Structurally true | But |
279+
|---|---|---|
280+
| **G-066** `KindSelect` reads the frozen registry snapshot | yes — `Object.keys(ARTIFACT_REGISTRY)` | `registerArtifactKind` has **zero production call sites** (tests only). No kind can be dynamically registered today, so the value it would destroy cannot exist. |
281+
| **G-046** half 1 — kindless input ports | yes — `resolveInputPort` returns `unsatisfied` on `kind === undefined` | **0 of the catalog's activities declare a kindless input port.** Five unreachable binding states, for an empty port family. |
282+
| **G-081** `ctx-bound` unmodelled | yes | already downgraded to minor in pass C for the same reason: `computeNodeStatus` has no production caller. |
283+
284+
**G-046's other half is the opposite — much bigger than the entry implies.**
285+
There are **26 optional base-`Artifact` input ports** across the catalog
286+
(`file.prepare.fileName` / `.fileType` / `.contentType`, `azureOcr.poll.modelId`,
287+
`azureOcr.extract.fileName`, …). Every one owns a canvas handle you can drag
288+
onto while being invisible to the Inputs panel, the badge and the drawer. These
289+
are the same ports behind the agent scenario-1 catalog-vs-runtime mismatch, so
290+
this is a live gap with a known second symptom, not a theoretical one.
291+
292+
The lesson is the same one the linter's shape-coverage pass taught: *a check
293+
nothing can exercise and a gap nothing can hit are the same kind of finding.*
294+
Both halves of G-046 were written as one entry because they share a code path;
295+
they should be ruled separately because one is empty and one is 26 ports wide.
296+
297+
### Method note
298+
299+
Every check was a direct read of the cited evidence line against current source,
300+
plus — where the claim was about reachability rather than code — an enumeration
301+
of what the catalog or the call graph actually contains. The second kind found
302+
all three latent entries; grepping the cited line alone would have confirmed
303+
every one of them as "still true" and been useless.
304+
305+
## Remaining verification (historical — now complete)
243306

244307
C2 (validation surfacing, 7), C3 (composition & authoring, 6), C4 (run
245308
observability, 8), plus the six C5 entries above — 27 entries. The method is

0 commit comments

Comments
 (0)