Found by the #14669 dev seat while doing that card's required repo-wide sweep. Recording only — no severity asserted, no assignee.
#14669 named three sites (packages/cli ×2, examples/app-showcase ×1). The sweep that card required turned up two more live, present-tense sites in a package outside its face, and they are the same defect: a comment naming ObjectQLPlugin.actionObjectKey, which PR #14667 deleted, as something that reads a key today.
The two sites, at origin/mainf3ae441
packages/spec/src/stack.zod.ts:381 * registration key `collectBundleActions` / `actionObjectKey` read). One
packages/spec/src/stack.zod.ts:1572 * `actionObjectKey` — reads the action's own `objectName` instead; the walk
Both are present tense and both pair the dead name with a live one, in the same clause:
:381 — "An embedded action is keyed by the object it is written ON — the declaration-resolution key collectActionDeclarations / resolveRouteActionDeclaration use — not by its own objectName (the registration key collectBundleActions / actionObjectKey read).":1572 — "(The runtime's REGISTRATION key — collectBundleActions / actionObjectKey — reads the action's own objectName instead; the walk deliberately follows the resolution side …)"
The nuance a fixer must not get wrong, measured
⛔ Only the actionObjectKey half rots.collectBundleActions is live — packages/runtime/src/app-plugin.ts:1878 defines it and packages/runtime/src/index.ts:61 exports it (git grep -c collectBundleActions finds it in 10 non-CHANGELOG files). Rewriting the whole clause makes it wrong in the other direction, exactly as #14669's triage warned for its own three sites.
The live spelling for the deleted half is standaloneActionOwnerKey, packages/objectql/src/action-governance.ts:91, exported from @objectstack/objectql (src/index.ts). Both statements the two comments make remain TRUE of it — it reads the action's own objectName — so this is a rename of one name inside a sentence that is otherwise accurate, not a deletion.
Why the #14669 seat did not fold it in
Its declared file face was packages/cli/src/commands/lint.ts, packages/cli/test/lint-namespace-prefix.test.ts and examples/app-showcase/test/actions.test.ts. stack.zod.ts is the spec's schema source: editing it pulls the spec gate farm (check:authorable-surface / gen:schema baselines and the rest) into that PR's affected set, which is a new verification surface rather than an adjacent one — the bounded in-place-fix exemption fails on that condition. #14669's triage had also scoped it explicitly to three comments.
⚠️ A fixer should confirm whether a comment-only edit inside stack.zod.ts moves any generated baseline before assuming it is free — the .describe() strings in that file DO ship, and the two sites here are JSDoc above them rather than the describe text itself, but that distinction is the whole cost question and is worth measuring rather than assuming.
The rest of the class, for whoever takes this
The full sweep at f3ae441 returned 17 occurrences. Fixed by #14669: 3. Left deliberately and correct as written (12): four CHANGELOG files (cli ×2, client ×2, runtime ×2), PR #14667's own changeset, packages/objectql/src/action-governance.ts:78 and packages/runtime/src/action-owner-key-single-source.test.ts:10 — all of which name it in the past, as one of the writers that was converged away — plus packages/objectql/src/action-owner-key-single-source.test.ts:6/:69/:72, the weld that asserts its absence (expect(plugin!.text).not.toContain('actionObjectKey')): editing that one deletes the check. Live and stale: only the 2 sites above.
Re-check
git grep -n "actionObjectKey" origin/main -- packages/spec
Negative claims here were paired with a positive control on the same object: actionObjectKey is 0 in packages/objectql/src/plugin.ts, while standaloneActionOwnerKey (5), registerAction (4), isArtifactShippedAction (2) and class ObjectQLPlugin (1) all hit with the identical command shape.
Dedup
One search_issues pass with a named positive control (#14669 returned first, so the search was live rather than silently zero). Nearest neighbours are the same SHAPE and none is this subject: #14166 (spec notes citing objectui's retired accessor), #14806 (comments naming deleted app paths), #14583 (a spec comment claiming an undeclared key), #14678 (bare 'global' literals in action-execution.ts — a different defect, and its packages/cli instance was folded into #14669's PR on a PM hand-off).
Refs: #14669, #14678, PR #14667.
Generated by Claude Code
Found by the #14669 dev seat while doing that card's required repo-wide sweep. Recording only — no severity asserted, no assignee.
#14669 named three sites (
packages/cli×2,examples/app-showcase×1). The sweep that card required turned up two more live, present-tense sites in a package outside its face, and they are the same defect: a comment namingObjectQLPlugin.actionObjectKey, which PR #14667 deleted, as something that reads a key today.The two sites, at
origin/mainf3ae441Both are present tense and both pair the dead name with a live one, in the same clause:
:381— "An embedded action is keyed by the object it is written ON — the declaration-resolution keycollectActionDeclarations/resolveRouteActionDeclarationuse — not by its ownobjectName(the registration keycollectBundleActions/actionObjectKeyread).":1572— "(The runtime's REGISTRATION key —collectBundleActions/actionObjectKey— reads the action's ownobjectNameinstead; the walk deliberately follows the resolution side …)"The nuance a fixer must not get wrong, measured
⛔ Only the
actionObjectKeyhalf rots.collectBundleActionsis live —packages/runtime/src/app-plugin.ts:1878defines it andpackages/runtime/src/index.ts:61exports it (git grep -c collectBundleActionsfinds it in 10 non-CHANGELOG files). Rewriting the whole clause makes it wrong in the other direction, exactly as #14669's triage warned for its own three sites.The live spelling for the deleted half is
standaloneActionOwnerKey,packages/objectql/src/action-governance.ts:91, exported from@objectstack/objectql(src/index.ts). Both statements the two comments make remain TRUE of it — it reads the action's ownobjectName— so this is a rename of one name inside a sentence that is otherwise accurate, not a deletion.Why the #14669 seat did not fold it in
Its declared file face was
packages/cli/src/commands/lint.ts,packages/cli/test/lint-namespace-prefix.test.tsandexamples/app-showcase/test/actions.test.ts.stack.zod.tsis the spec's schema source: editing it pulls the spec gate farm (check:authorable-surface/gen:schemabaselines and the rest) into that PR's affected set, which is a new verification surface rather than an adjacent one — the bounded in-place-fix exemption fails on that condition. #14669's triage had also scoped it explicitly to three comments.stack.zod.tsmoves any generated baseline before assuming it is free — the.describe()strings in that file DO ship, and the two sites here are JSDoc above them rather than the describe text itself, but that distinction is the whole cost question and is worth measuring rather than assuming.The rest of the class, for whoever takes this
The full sweep at
f3ae441returned 17 occurrences. Fixed by #14669: 3. Left deliberately and correct as written (12): four CHANGELOG files (cli×2,client×2,runtime×2), PR #14667's own changeset,packages/objectql/src/action-governance.ts:78andpackages/runtime/src/action-owner-key-single-source.test.ts:10— all of which name it in the past, as one of the writers that was converged away — pluspackages/objectql/src/action-owner-key-single-source.test.ts:6/:69/:72, the weld that asserts its absence (expect(plugin!.text).not.toContain('actionObjectKey')): editing that one deletes the check. Live and stale: only the 2 sites above.Re-check
Negative claims here were paired with a positive control on the same object:
actionObjectKeyis 0 inpackages/objectql/src/plugin.ts, whilestandaloneActionOwnerKey(5),registerAction(4),isArtifactShippedAction(2) andclass ObjectQLPlugin(1) all hit with the identical command shape.Dedup
One
search_issuespass with a named positive control (#14669 returned first, so the search was live rather than silently zero). Nearest neighbours are the same SHAPE and none is this subject: #14166 (spec notes citing objectui's retired accessor), #14806 (comments naming deleted app paths), #14583 (a spec comment claiming an undeclared key), #14678 (bare'global'literals inaction-execution.ts— a different defect, and itspackages/cliinstance was folded into #14669's PR on a PM hand-off).Refs: #14669, #14678, PR #14667.
Generated by Claude Code