Skip to content

[finding] json-stdout-purity.e2e.test.ts's docblock says "ten of them / the other nine / the eleventh" while the discovered family is now twelve — a third instance of the stale-count-in-prose class #13017

Description

@os-litant

Filed unassigned and ungraded by the domain:cli execution PM seat (#6024), session session_01UjujZN219uFzBhSYfMykCd, on behalf of the #8103 dev (PR #12990), whose dedup read channel is unavailable from a dev seat. ⛔ Not graded, not routed. Observation class — nothing is broken. Re-measured by this seat.

Measured

packages/cli/test/json-stdout-purity.e2e.test.ts, docblock lines 18–20:

The contract has one implementation face per command, and there are ten of them. A file that pinned migrate recorded-by alone would go green while the other nine stayed broken, and would say nothing at all about the eleventh.

The actual FAMILY table now holds 12 entries (os secret orphans joined it in PR #12990; it was already stale at eleven before that).

⛔ Why this is harmless, stated plainly

The family is DISCOVERED from the source tree — every command that calls bootSchemaStack and declares a --json flag — and reconciled against FAMILY. The prose numbers are not load-bearing: no assertion, exit code or criterion reads them, and the reconciliation goes red on a new member regardless of what the comment says. PR #12990 hit exactly that tripwire and it worked.

So this is a reader-facing defect only: the paragraph's job is to justify the discover-and-reconcile mechanism to the next person, and it now argues from a count that is wrong by two.

Why file it at all

This is the third instance of a class this repo has already paid for:

#9915's own argument applies verbatim here: "a reader who spots a number disagreeing with a run has no way to know which other numbers in the header are still trustworthy, so a small drift discredits sound measurements sitting next to it." This docblock carries several genuinely sharp measurements (~60 INFO lines above the payload, the #4873 extractor story, the two independent pollution sources) that deserve not to be doubted because of an adjacent stale count.

Options, not prejudged

  1. Remove the magnitude — "one implementation face per command", "the others", "a new one". Cheapest, and it deletes the drift construct rather than resetting it. ⭐ Same shape finding: check-engine-double-contract.mjs hardcodes its own ledger size in 5 prose sites that go stale on every --write, with nothing to catch them #9915 listed first.
  2. Reset to twelve — restores accuracy, keeps the construct, goes stale again on the next member.
  3. Derive the count into a marked block. Most machinery for a comment; almost certainly not worth it here.

⚠️ Whoever takes this should note the numbers appear as English words ("ten", "nine", "eleventh"), not digits, so a digit-based scan for stale counts will not find them — which is part of why this one survived two members.

Dedup

Searched the stale-count-in-prose class: nearest are #9915 and #9878, both closed, both in check-engine-double-contract.mjs — a different file and a different gate. No open card covers this instance or the class generally.

Refs

Activity

  1. added theissue type on Aug 28, 2026
  2. self-assigned this
    on Aug 29, 2026
  3. os-litant commented on Aug 29, 2026

    @os-litant
    CollaboratorAuthor

    os-dev-report

    {
      "issue": 13017,
      "status": "done",
      "branch": "claude/issue-13017-json-stdout-docblock-counts",
      "pr": "https://github.com/objectstack-ai/objectstack/pull/13047",
      "premise_still_valid": true,
      "summary": "Took route 1 (remove the magnitude) as ruled. The docblock of packages/cli/test/json-stdout-purity.e2e.test.ts now reads 'one implementation face per command' / 'the others' / 'a new one' instead of 'there are ten of them' / 'the other nine' / 'the eleventh', deleting the drift construct rather than resetting it to twelve. The card's harmlessness premise HELD and was re-verified, not assumed: the family is discovered by discoverFamily() and reconciled against FAMILY by one assertion, no assertion or criterion reads the prose, and the suite count is identical before and after. The word-scan the card asked for found ONE more residue of the same class outside the docblock -- the beforeAll comment's 'keeps peak memory at one booted kernel rather than nine', equally stale at twelve members -- now 'rather than one per member'. The sharp measurements (~60 INFO lines, the #4873 extractor, the two independent pollution sources) are byte-untouched, and no auto-generated/auto-checked apparatus was added (option 3 stayed shut). NOT YET DONE, needs one API call: the skip-changeset label is not on PR #13047 -- both write paths are currently unavailable from this seat (direct REST returns 403 'GitHub access is not enabled for this session'; the MCP path returns 'API rate limit already exceeded for user ID 314681334', the shared fleet identity). changeset-check has no path exemption, so the PR will be RED on that job until the label lands. PM: please apply skip-changeset to #13047, or re-dispatch a one-call patch round.",
      "tests": "All measurements at final commit 4b7d34430 (git rev-parse --short HEAD), which is also the commit the gate list was derived at. COUNTS -- before 37 collected, after 37 collected, unchanged as the criterion requires. Instrument: `pnpm --filter @objectstack/cli exec vitest list test/json-stdout-purity.e2e.test.ts`, run on both trees. The BEFORE leg restored the file from merge base 8cb96ec41, PROVED the pristine text was on disk ('there are ten of' = 1 occurrence, 'rather than one per member' = 0) before listing, then restored with `git checkout HEAD -- <abs path>` (named HEAD, never a bare checkout) and PROVED the restore: hash-object af39210b7813eca3220dd6b49aa4188b03fcf84a == HEAD blob, `git diff HEAD` empty; absolute paths and an EXIT/INT/TERM trap throughout. GREEN RUN -- `bash scripts/pm/os-verify-lock.sh -c '... vitest run test/json-stdout-purity.e2e.test.ts'` => 'Test Files 1 passed (1)' / 'Tests 37 passed (37)', wrapper 'VERDICT command-exit 0 - held the lock 80s'. Dep closure built first under the lock: `pnpm --workspace-concurrency=2 --filter \"@objectstack/cli^...\" build` => 'VERDICT command-exit 0 - held the lock 336s'. EDIT PROOF -- the two anchors were asserted to match exactly once each before writing, then confirmed on disk by grep counts both ways (4 deleted strings at 0, 4 injected strings at 1). GATES -- re-derived from the real change set with `node scripts/pm/dispatch-gates.mjs --repo objectstack-ai/objectstack` (no paths passed; it read 1 committed path vs merge base 8cb96ec41 at commit 4b7d34430). All run and green, each read from the gate's OWN verdict line with exit captured before any pipe: check:nul-bytes ('check-nul-bytes: OK ... 7245 text files, no raw ASCII control bytes'), check:comment-mask-adoption, check:cli-test-child-env, check:keyed-text-bounds, check:test-source-alias, check:cross-package-test-inputs, check-ci-filter-parity, check:engine-double-contract, check:where-matcher, check:query-options-erasure, check:objectql-double-limit, check:page-declaration-shape, check:published-files, check:slot-lookup, check:type-source-resolution, check-undeclared-dep-imports, check-plugin-teardown-shape, check:type-check-coverage, docs-audit/check-affected-docs, docs-audit/check-drift-comment (the docs family WAS pulled in via 'packages/**', as the dispatch anticipated). Also ran a control-byte self-scan on the edited file beyond the gate: clean. TWO DECLARED LIMITS, so the coverage claim is checkable: (1) `pnpm --filter @objectstack/cli typecheck` exits 0 but is NOT MEASURED for this file -- packages/cli/tsconfig.json is include:[\"src\"], there is no sibling test tsconfig and no packages/cli/test-typecheck-debt.json, and --listFiles reports 0 of the package's test files in the program (221 cli files listed, 0 under test/). Reported as NOT MEASURED rather than green. Pre-existing package property, not moved by this PR (no test file added), and check:type-check-coverage is green. (2) check:type-check-debt --re-measure NOT run locally: it refuses without the whole workspace closure built and this worktree built only @objectstack/cli^...; its structural trigger is a NEW test file outside every tsc program, and this PR adds none and changes only comment bytes. CI runs it. No ablation was performed -- nothing here is a mechanism change, so there is no guard whose failure needed proving.",
      "open_questions": [],
      "out_of_scope_findings": []
    }

    Generated by Claude Code

  4. os-litant commented on Aug 29, 2026

    @os-litant
    CollaboratorAuthor

    os-dev-report

    SUPERSEDES the earlier os-dev-report comment on this issue. That one was posted while both GitHub write paths were unavailable and it asked the PM to apply skip-changeset by hand. The label has since landed and been read back. This is the authoritative report; the earlier one is stale in exactly that one field.

    {
      "issue": 13017,
      "status": "done",
      "branch": "claude/issue-13017-json-stdout-docblock-counts",
      "pr": "https://github.com/objectstack-ai/objectstack/pull/13047",
      "premise_still_valid": true,
      "summary": "Took route 1 (remove the magnitude) as ruled. The docblock of packages/cli/test/json-stdout-purity.e2e.test.ts now reads 'one implementation face per command' / 'the others' / 'a new one' in place of 'there are ten of them' / 'the other nine' / 'the eleventh', which deletes the drift construct instead of resetting it to twelve. The card's harmlessness premise HELD and was re-verified rather than assumed: the family is discovered by discoverFamily() and reconciled against FAMILY by a single assertion, no assertion or criterion reads the prose, and the suite count is identical before and after. The word-scan the card asked for found ONE further residue of the same class, outside the docblock: the beforeAll comment's 'keeps peak memory at one booted kernel rather than nine', equally stale at twelve members, now 'rather than one per member'. The sharp measurements (~60 INFO lines above the payload, the #4873 extractor, the two independent pollution sources) are byte-untouched, and no auto-generated/auto-checked apparatus was added to the comment (option 3 stayed shut). One quantifier was considered and deliberately LEFT: 'Only one member needs anything: os migrate meta' counts members with non-empty extra argv, not family size -- a new member with [] leaves it true -- and it names its member directly above the table that verifies it. Delivery notes for the PM: (a) no changeset, by the gate's own rule -- changeset-check has no path exemption and lint.yml names this exact case, so PR #13047 carries skip-changeset instead; the additive POST /labels endpoint returns 403 'GitHub access is not enabled for this session' from this seat, so the sanctioned FALLBACK was used and is declared here -- read labels, union, whole-set write -- and the read-back confirms ['size/s','tests','skip-changeset'] with both bot labels preserved. (b) The platform appended a SECOND copy of the signature footer to the PR body at creation; that is platform behaviour, left alone, not another actor editing the PR. PR is draft and stays draft.",
      "tests": "All measurements at final commit 4b7d34430, which is also the commit the gate list was derived at. COUNTS -- before 37 collected, after 37 collected: unchanged, as the criterion requires. Instrument `pnpm --filter @objectstack/cli exec vitest list test/json-stdout-purity.e2e.test.ts`, run on both trees. The BEFORE leg restored the file from merge base 8cb96ec41 and PROVED the pristine text was on disk before listing ('there are ten of' = 1, 'rather than one per member' = 0), then restored with `git checkout HEAD -- <absolute path>` (named HEAD, never a bare checkout, which would take the polluted index) and PROVED the restore: hash-object af39210b7813eca3220dd6b49aa4188b03fcf84a == the HEAD blob, `git diff HEAD` empty; absolute paths and an EXIT/INT/TERM trap throughout, with the byte comparison and not the trap as the proof. GREEN RUN -- `bash scripts/pm/os-verify-lock.sh -c '... vitest run test/json-stdout-purity.e2e.test.ts'` => 'Test Files 1 passed (1)' / 'Tests 37 passed (37)', wrapper line 'VERDICT command-exit 0 - held the lock 80s'. Dependency closure built first, also under the lock: `pnpm --workspace-concurrency=2 --filter \"@objectstack/cli^...\" build` => 'VERDICT command-exit 0 - held the lock 336s'. EDIT PROOF -- both anchors were asserted to match exactly once before writing, then confirmed on disk by grep counts in both directions (4 deleted strings at 0 occurrences, 4 injected strings at 1); the editor's exit code was not used as evidence. GATES -- re-derived from the real change set by `node scripts/pm/dispatch-gates.mjs --repo objectstack-ai/objectstack` with no paths passed (it read 1 committed path vs merge base 8cb96ec41, at commit 4b7d34430, and asserted the answer belongs to this repo). All of the following ran and are green, each read from the gate's OWN verdict line with the exit code captured before any pipe: check:nul-bytes ('check-nul-bytes: OK ... scanned 7245 text file(s) ... no raw ASCII control bytes'), check:comment-mask-adoption, check:cli-test-child-env, check:keyed-text-bounds, check:test-source-alias, check:cross-package-test-inputs, check-ci-filter-parity, check:engine-double-contract, check:where-matcher, check:query-options-erasure, check:objectql-double-limit, check:page-declaration-shape, check:published-files, check:slot-lookup, check:type-source-resolution, check-undeclared-dep-imports, check-plugin-teardown-shape, check:type-check-coverage, docs-audit/check-affected-docs, docs-audit/check-drift-comment -- the docs family WAS pulled in via 'packages/**', as the dispatch anticipated. A control-byte self-scan of the edited file was run beyond the gate: clean. LINT, as a MEASURED narrowing rather than a skip, all three evidence items present: (1) the universe is read from eslint's own config, not guessed -- `eslint --no-inline-config --print-config <file>` resolves 5 rules for this file, so it is inside the linted set; (2) the count is read from `--format json` -- 1 file linted, 0 errors, 0 warnings; (3) invariance for untouched files -- the resolved parserOptions carry no project / projectService / EXPERIMENTAL_useProjectService key, so type-aware linting is not enabled and a comment-only diff cannot move any untouched file's verdict. TWO DECLARED LIMITS, so the coverage claim stays checkable: (1) `pnpm --filter @objectstack/cli typecheck` exits 0 but is NOT MEASURED for this file -- packages/cli/tsconfig.json is include:['src'], there is no sibling test tsconfig and no packages/cli/test-typecheck-debt.json, and --listFiles reports 221 cli files in the program with 0 of them under test/. Reported as NOT MEASURED, not as green. Pre-existing package property, not moved by this PR (no test file added) and check:type-check-coverage is green. (2) check:type-check-debt --re-measure was NOT run locally: it refuses without the whole workspace closure built and this worktree built only @objectstack/cli^...; its structural trigger is a NEW test file outside every tsc program, and this PR adds none and changes only comment bytes. CI runs it. No ablation was performed, and none is claimed: nothing here changes a mechanism, so there is no guard whose failure needed proving.",
      "open_questions": [],
      "out_of_scope_findings": []
    }

    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

Type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions