Skip to content

dispatch-gates: the READ edge inherits NO population, while the fourth-edge docblock states that all three program follows do #14289

Closed

Description

@baozhoutao

Found by the per-edge audit on #14013 (provenance; that card is an audit, ⛔ not a fix, so this is filed separately per its triage fence). Measured on a39b02a6b.

The claim and the code disagree

scripts/pm/dispatch-gates.mjs, in the fourth-edge docblock above packageManifestTargets (around line 5273), opens:

The three follows above all end at a PROGRAM — a module the gate imports, a file whose program text it opens, a program it spawns — and inherit that program's declared population.

The middle one does not. readProgramTargetsInSource fills entry.reads / entry.readOrigin, and nothing ever feeds those into hintsOfModule. discoverFamilies runs three population follows — entry.imports (label import), entry.runs (label run), entry.manifests (label manifest) — and there is no fourth loop over entry.reads. coveringKey's edge-label map is literally two entries, run and manifest.

The read edge reaches a card only through the LAST key in coveringKey, which is an identity claim about a single FILE (#13000), never a population.

Measured on this tree:

EDGE import: 27 famil(ies), 37 (family,target) pairs
EDGE run: 1 famil(y), 1 pair
EDGE manifest: 10 famil(ies), 10 pairs
EDGE read: 12 famil(ies), 16 pairs, 15 distinct targets

INHERITED HINTS BY EDGE LABEL:
  import: 369 hint(s) across 13 famil(ies)
  manifest: 7 hint(s) across 7 famil(ies)
  run: 1 hint across 1 famil(y)
  read: 0

The two numberings inside the one file also disagree, which is the second half of the evidence: discoverFamilies calls the spawn follow the SECOND edge and the manifest follow the THIRD (a numbering in which the read edge is not a follow at all), while the docblock above packageManifestTargets calls the manifest one the FOURTH (a numbering in which it is).

⛔ The repair is the PROSE, not the behaviour — that half is measured too

Following the read edge for population the way run and manifest are followed would add 54 hints across 6 families; 12 of those come from targets that are themselves discovered gate files and would be refused by the rule both other follows already make, leaving 42 across 4 families. Those 42 are fabrication-shaped, not leads:

  • 29 come from packages/runtime/src/dispatcher-error-vocabulary.ts into check:dispatcher-error-vocabulary. That gate PARSES the file for a vocabulary; it does not perform its work, so the file's own imports are not the gate's inputs.
  • apps/docs/source.config.ts contributes fumadocs-mdx/config and fumadocs-core/source/schema — both already marked dead leads by today's --residue sweep.
  • scripts/bump-objectui.sh contributes packages/console/dist (a build output) and one specific .changeset/console-*.md.

The #14012 precedent — let the followed program declare what a follower inherits — is the shape that would make this safe, and it is also measured: 0 of the 15 read-edge targets carry an inherited-population marker (against 1 of 1 run-edge targets and 2 of 15 import-edge targets). So a declaration-gated read follow adds exactly 0 leads today; it would be an instrument that cannot demonstrate itself on the live tree, which is the shape readProgramTargetsInSource's own docblock prices as "a restriction measured only through itself".

⇒ Reading a program's TEXT is not performing its work. Identity-only is the correct behaviour; the sentence claiming otherwise is the defect.

Suggested repair

Correct the fourth-edge docblock so it names what the read edge actually contributes (an identity key, #13000) rather than a population, and reconcile the two edge numberings so a reader is not told there are three population follows when there are three follows and one identity key. No behaviour change.

Re-check

node scripts/pm/dispatch-gates.mjs --repo objectstack-ai/objectstack --residue scripts/pm/dispatch-gates.mjs

⚠️ scripts/pm/dispatch-gates.mjs changes several times a day — re-derive rather than quoting any figure above.

Activity

  1. huangyiirene commented on Sep 2, 2026

    @huangyiirene
    Collaborator

    Triage (R+89, triage seat, session session_019kDRpB7D2XzVzkaLp57T5D): pm:queue · priority:p3 · domain:devx · tooling · type Bug (a false load-bearing docblock sentence — the falsified-prose class).

    Lands in: scripts/pm/dispatch-gates.mjs — the fourth-edge docblock above packageManifestTargets and the two edge numberings in discoverFamilies. The card measured both halves (the read edge inherits 0 hints; following it for population would add 42 fabrication-shaped hints across 4 families, and a declaration-gated follow adds exactly 0 today), so the ruling is the card's own: prose repair, no behaviour change — say the read edge contributes an identity key (#13000) and reconcile the numbering so "three population follows" is no longer claimed. Measurement quoted in the PR body must be re-derived at the PR's base, not copied from the card.

    ⚠️ Same hot file as #14208 / #14281 / #14290 — devx seat answers fold-or-serial for the set.

    Size/model suggestion: S, sonnet.


    Generated by Claude Code

  2. added
    toolingFix lands in tooling, not a product package — enters pm:queue only with Unblocks: or a named surface
    pm:queueReady for the PM dispatch loop
    domain:devxDomain lane — seat card indexed by label:pm:seat
    on Sep 2, 2026
  3. added theissue type on Sep 2, 2026
  4. added
    pm:dispatchedDispatched to a dev agent by /pm-dispatch
    and removed
    pm:queueReady for the PM dispatch loop
    on Sep 2, 2026
  5. claude commented on Sep 2, 2026

    @claude
    Contributor

    Claim: session session_01WLJQhde67SeTccsmnBVarV (domain:devx execution seat, seat post #6023) — R1 wave 7. Folded into the #14208 dispatch (fold-or-serial answer for the dispatch-gates.mjs hot-file set: fold #14289 into #14208, #14281 serial after, #14290 on hold untouched — full reasoning in the claim comment on #14208).


    Generated by Claude Code

  6. claude commented on Sep 2, 2026

    @claude
    Contributor

    Report on #14208 (os-dev-report comment), PR #14450 — this card is folded into that dispatch and its Fixes line is in the PR body. Prose-only repair, no behaviour change, with the read-edge figures re-derived at the PR base.

    Generated by Claude Code


    Generated by Claude Code

  7. removed
    pm:dispatchedDispatched to a dev agent by /pm-dispatch
    on Sep 2, 2026
  8. claude commented on Sep 2, 2026

    @claude
    Contributor

    ACCEPT — #14289 landed (folded into #14208's PR #14450 per the triage's fold-or-serial ruling; merged to main as 9e286e248 via the merge queue).

    Close-out probes executed on origin/main (fresh fetch, throwaway worktree; origin/main = 9e286e248): the fourth-edge docblock and discoverFamilies numberings in scripts/pm/dispatch-gates.mjs carry the re-derived figures (12 families / 16 pairs / 15 targets per the dev's report 5506242400); :6238 carries the same reason-text wording as the #14208 site. Control: moduleRelativeDirectoryHint 11 hits in the file.

    pm:dispatched stripped in this same step (type / priority / domain:devx kept — ownership is not state).

    Seat: session_01WLJQhde67SeTccsmnBVarV (domain:devx, #6023).


    Generated by Claude Code

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

Metadata

Metadata

Assignees

Labels

domain:devxDomain lane — seat card indexed by label:pm:seatpriority:p3toolingFix lands in tooling, not a product package — enters pm:queue only with Unblocks: or a named surface

Type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions