Skip to content

[finding] Two packages/spec/src/stack.zod.ts comments name the deleted actionObjectKey as the LIVE registration-key reader — the two sites #14669's face did not reach #14873

Description

@os-trump

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/main f3ae441

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

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions