Repository navigation
check-shell-escape-residue.test.ts's docblock has an empty ## Fixture discipline section — its body sits two sections below, under the wrong heading #8012
Description
Activity
- addeddocumentationImprovements or additions to documentationImprovements or additions to documentationdomain:devxobjectui devx stream: fix lands on .github/, scripts/ or release pipeline — devx lane cross-repoobjectui devx stream: fix lands on .github/, scripts/ or release pipeline — devx lane cross-repo
on Sep 8, 2026 Triage routing
Labels
documentationtoolingfindingdomain:devxpm:queuepriority:p3· Type TaskLane —
domain:devx.scripts/__tests__/— the engineering face, and the docblock's subject is a gate.Re-measured on
83d4fda16— confirmed exactly, with the anchors.scripts/__tests__/check-shell-escape-residue.test.ts::51—* ## Fixture discipline:53—* ## The second skills root (objectui#7403)— the very next heading, with only a bare*line between:55— that section's body (SCAN_ROOTScarries TWO skills trees…):63— the orphaned paragraph (scripts/is not inSCAN_ROOTS…), sitting after the check-shell-escape-residue lost the same two guides #7251 moved — itsskillsroot does not reach.claude/skills#7403 section with no heading of its own:71— the## Coveragematerial PR test(scripts): check-shell-escape-residue reds on an agent-tree document no scan root reaches (#7413) #8010 moved to the end rather than deepen the split
So
## Fixture disciplinehas no body at all, and its body is two sections below.Grade p3. A docblock arrangement in one test file; no behaviour, no gate reads it, nothing is wrong at runtime. This is the smallest card in today's batch and I am grading it honestly rather than inflating it.
But it is worth keeping open rather than closing as trivia, for the reason the card gives. An empty heading reads as a section someone meant to write and never did, so the next author is invited to either delete it (losing the pointer) or write a second fixture-discipline paragraph under it while the original sits below — two answers to one fact. That is not hypothetical: PR #8010 hit exactly that fork, placed its new
## Coveragesection at the same insertion point, and had to move it to the end of the docblock instead. The defect has already cost one author a decision, which is the whole argument for a one-line repair.The mechanism is worth naming because it will recur: the
## The second skills root (objectui#7403)section was inserted between a heading and its own body when #7403 widened the gate. Nothing catches that — a heading with no body is valid markdown and valid JSDoc.Fix, as filed: move the
scripts/is not inSCAN_ROOTSparagraph back under## Fixture discipline, above## The second skills root. No behaviour change; the docblock is not asserted by any pin.⚠️ One consequence of "not asserted by any pin" that the claimant should note rather than discover: there is no gate to prove this change, so the PR is a pure prose move and its own diff is the evidence. ⛔ Do not add a pin over the docblock's section structure to manufacture one — that would be a larger and much more brittle commitment than the defect warrants, and it is not what this card asks for.⛔ Not a duplicate of objectui#6280 — the card is right and the distinction is real: #6280 is about stale coverage claims in a docblock, i.e. a falsified premise. This is a displaced section — the text is correct, it is under the wrong heading.
Correctly filed rather than folded into PR #8010 — that PR left the pre-existing arrangement untouched rather than fixing it in an unrelated PR, which is the right instinct.
Triage seat only — no claim, no dispatch, no code.
Generated by Claude Code
Claim: PM loop round R48 —
domain:devx @ objectuiexecution seat.
Session:session_01FhBNJcLRZLe8M87VcUgpKr
Branch:claude/issue-8012-fixture-discipline-heading
Worktree:/home/user/objectui-issue-8012
Domain:domain:devx
Dispatch: oneos-devsubagent of this session (mode:subagent,model: opus); the dispatch note follows. Labelspm:queue→pm:dispatchedand assignee set in one write, read back and diffed against the union at 2026-09-08T17:48:19Z.Why this card
Taken by the written order: no
p0, ⛔ nopm:blocking, notarget:; theBuglevel holds only the already-fixed objectui#8380 ⇒ the rest, oldest first. This is second-oldest dispatchable after objectui#7966, both filed 2026-09-06. ⭐priority:p3is not what ranks it and is not an argument against it — belowp0the priority label does not rank.⚠️ The fence triage wrote, carried in whole⚠️ One consequence of "not asserted by any pin" that the claimant should note rather than discover: there is no gate to prove this change, so the PR is a pure prose move and its own diff is the evidence. ⛔ Do not add a pin over the docblock's section structure.⇒ ⛔ this dispatch does not buy a new assertion. It is a paragraph moved back under the heading it belongs to, and the diff is the proof.
Concurrency and file surface
Three in flight (
batch:3), surfaces pairwise disjoint — this card touchesscripts/__tests__/check-shell-escape-residue.test.tsand nothing else.
Generated by Claude Code
Dispatch — round R48,
domain:devx @ objectuiexecution seat, 2026-09-08T17:49ZOne
os-devsubagent of sessionsession_01FhBNJcLRZLe8M87VcUgpKr(mode:subagent,model: opus), branchclaude/issue-8012-fixture-discipline-heading, worktree/home/user/objectui-issue-8012. Three in flight (batch:3), surfaces pairwise disjoint.Adjudication section
⛔ No maintainer ruling applies. The single constraint below is triage's, from comment
5583458203.⛔ The fence, verbatim, and it is the whole shape of the dispatch
⚠️ One consequence of "not asserted by any pin" that the claimant should note rather than discover: there is no gate to prove this change, so the PR is a pure prose move and its own diff is the evidence. ⛔ Do not add a pin over the docblock's section structure.⇒ ⛔ no assertion, pin, gate or lint rule over the docblock's structure.
⚠️ And the brief names why that fence is easy to talk oneself out of: this lane's whole subject is that unpinned prose rots, so "while I'm here, let me pin it" feels like the right instinct. It is out of scope, triage said so in advance, and a dev who believes a pin is warranted ⛔ does not build it — it reports it as a candidate for a separate card.Preconditions the dev falsifies against the TREE first
⚠️ Anchored on text, ⛔ not on the recorded line numbers, and the numbers actually found are reported:## Fixture disciplineexists and has no body — the next non-blank comment line is another##heading.- The
scripts/is not inSCAN_ROOTSparagraph sits after the objectui#7403 section with no heading of its own. ## Coveragesits at the end of the docblock — the arrangement PR objectui#8010 chose to avoid deepening the split. ⛔ Not to be moved.- Nothing in the repository asserts this docblock's structure —
⚠️ with the instrument named, its exit-code semantics stated, and a firing control, so that zero is a reading rather than a bad pattern.
The change, and its boundaries
One paragraph moved back under its heading. ⛔ No rewording of the paragraph, the headings or any neighbouring prose; ⛔ no other section reordered; ⛔ no "improvements" taken while in the file.
⚠️ Known hazard carried in: a nested*/inside a docblock closes the comment early — a dev hit exactly that earlier today. The file's own suite must be shown green to prove it still parses.Changeset
⚠️ The dev picks the form fromAGENTS.md§9 itself; ⛔ this brief names no bump level.
Generated by Claude Code
os-dev-report
{ "issue": 8012, "status": "done", "branch": "claude/issue-8012-fixture-discipline-heading", "worktree": "/home/user/objectui-issue-8012", "pr": "https://github.com/objectstack-ai/objectui/pull/8625", "pr_number": 8625, "pr_draft": true, "pr_base": "main", "head_sha": "6e9425dd156f87891e4796d206ce0850ea409f44", "base_sha": "86ef0c7643f82a8843fd430ed3a746e52f677235", "premise_still_valid": true, "claim_check": "newest Claim: 5589443707 names claude/issue-8012-fixture-discipline-heading — matches. No second claim posted, assignee untouched, no pm:* label written.", "preconditions": [ { "id": 1, "verdict": "CONFIRMED", "reading": "origin/main 86ef0c764: ':51 * ## Fixture discipline', ':52 *' (bare separator), ':53 * ## The second skills root (objectui#7403)'. The next non-blank comment line after the heading IS another ## heading — no body at all." }, { "id": 2, "verdict": "CONFIRMED", "reading": "The 'scripts/ is not in SCAN_ROOTS' paragraph occupies :63-:67 (separator :68), i.e. AFTER the #7403 section body (:55-:61), carrying no heading of its own." }, { "id": 3, "verdict": "CONFIRMED", "reading": "'## Coverage, which is a different question from residue (objectui#7413)' heading at :69, body :71-:78, docblock closes at :79 — it is the last section. Triage's ':71' anchor points at that section's material; the heading itself is :69. NOT MOVED." }, { "id": 4, "verdict": "CONFIRMED", "instrument": "git grep -nIF <literal>, run from the branch worktree root (git rev-parse --is-inside-work-tree = true, so the exit-128 'not a work tree' false zero cannot apply). Exit semantics: 0 = >=1 match, 1 = zero matches, >=2 = error. Exit captured before any pipe.", "controls": "In-class and in the same run: 'RESIDUE_PATTERNS' -> exit 0, 12 matches; '## Fixture discipline' -> exit 0, 3 matches. The instrument fires on the exact class (docblock heading text) whose zero is being read.", "reading": "'The second skills root' -> exit 0, 1 match (the file itself, :53). 'check-shell-escape-residue.test.ts' -> exit 0, 4 matches: .github/workflows/shell-escape-residue.yml:15 (prose about paths/paths-ignore), content/docs/guide/ci-cd-pipeline.md:1239 (prose about the ablation), check-shell-escape-residue.mjs:22 and :123 (prose) — none asserts docblock section structure. 'eslint-plugin-jsdoc' -> exit 1. 'jsdoc/' -> exit 1. '__snapshots__' -> exit 1. Scripts whose names matched docblock/heading/section/jsdoc/comment: only js-comment-mask.mjs and check-comment-mask-corpus.mjs (code-vs-comment masking) and render-budget-comment.mjs — none reads section structure. The suite reads check-shell-escape-residue.mjs (:675) and the workflow dir (:699), never its own source. NOTHING asserts this docblock's structure." } ], "diff_shape": "1 source file, 6 insertions / 6 deletions — the paragraph's 5 lines plus its trailing ' *' separator, deleted at :63-:68 and re-inserted at :53-:58 directly under the heading. Text byte-identical; no heading, no neighbouring prose, no other section touched. Post-move: :51 heading, :53-:57 paragraph, :59 '## The second skills root', :69 '## Coverage'. Plus 1 new changeset file (8 lines).", "files_touched": [ "scripts/__tests__/check-shell-escape-residue.test.ts", ".changeset/8012-fixture-discipline-heading.md" ], "no_pin_added": "Correct — the fence was honoured. No pin, lint rule, snapshot or test over the docblock's section structure was added, and none was attempted.", "checks": [ "pnpm exec vitest run scripts/__tests__/check-shell-escape-residue.test.ts -> exit 0, 'Test Files 1 passed (1) / Tests 43 passed (43)'. Run for the nested-*/ parse hazard; file still parses.", "pnpm type-check:scripts (tsc -p tsconfig.scripts.json) -> exit 0. --listFiles proves the edited file is in that program (1 hit), so the green covers it.", "pnpm lint:root (eslint over the root surface, where scripts/ lives) -> exit 0, 14.2s, '32 problems (0 errors, 32 warnings)', all pre-existing, none in the edited file. Full root scan — no narrowing claimed.", "pnpm exec eslint --no-inline-config --format json <the file> -> exit 0, 1 file linted, 0 errors 0 warnings.", "node scripts/check-changeset-presence.mjs -> exit 0 before AND after: '0 of them published source of a package the release covers ... no changeset is owed'.", "control-character self-scan over both touched files -> exit 1 (clean), with an in-class control (\\x0b) proving the pattern fires at exit 0." ], "changeset": "Empty frontmatter (--- immediately followed by ---), AGENTS.md §9's first-class 'not released' declaration. The gate says none is owed (scripts/__tests__ is not published source), so this declares rather than bumps. NO bump level was taken from the brief.", "labels_written": "none — no skip-changeset label applied (objectui's copy of that label is read by nothing; the empty-frontmatter changeset is the declaration).", "mcp_calls": "2 — create_pull_request, add_issue_comment. Card body, comments and all tree reads went through REST/git.", "structural_pin_candidate": { "recommendation": "NOT warranted — no separate card proposed.", "reasoning": "A pin over 'every ## heading in this docblock is followed by a non-heading line' would assert shape, not truth: it goes green on a heading followed by one filler sentence, which is exactly the second-fixture-discipline-paragraph outcome the card wants to avoid. It is also the failure the docblock already names against itself at :41 ('the limitation is asserted as a FACT, never as a sentence'). Reported as a judgement, not built." }, "stopped_on": [], "open_questions": [], "out_of_scope_findings": [] }
Generated by Claude Code
LANDED — objectui#8012 via PR objectui#8625, merged
e11c7bfc6merged_at 2026-09-08T18:31:16Z. ⭐mergedandremoved_from_merge_queueshare that timestamp withmerged: true⇒ that removal is the merge, ⛔ not a dequeue.Landing probe on a re-fetched
origin/main(tipe11c7bfc6)⚠️ Run exactly as the Armed note scoped it — and as line ORDER, ⛔ never presence: the paragraph was already present before this PR, two sections lower, so a presence check would have passed on the unfixed tree.:51 ## Fixture discipline :53 `scripts/` is not in `SCAN_ROOTS` … <- its body, now directly beneath it :59 ## The second skills root (objectui#7403) :69 ## Coverage, which is a different question … <- FIRING CONTROL: still the last headingcheck reading order ## Fixture discipline< body <## The second skills root✅ 51 < 53 < 59 firing control — ## Coveragestill last, ⛔ not moved✅ 69 > 59 the file was actually read ✅ 755 lines (⛔ a bare zero would have proved nothing) nonsense control ✅ exit 1 What is now true that was not
## Fixture disciplinehad no body at all, and the paragraph that belongs to it sat two sections lower with no heading of its own — because the objectui#7403 section was inserted between a heading and its own body. ⇒ frome11c7bfc6the heading and its paragraph are together again.⭐ The cost this repairs is not cosmetic and is already documented: PR objectui#8010 hit the fork this created, placed its new
## Coveragesection at the same insertion point, and had to move it to the end instead. The defect had already cost one author a decision.⛔ What was deliberately not built, and why the recommendation is accepted
The dispatch fence said a dev who thinks a structural pin is warranted must report it, ⛔ not build it. It reported — and argued the pin should not exist:
A pin over "every
##heading in this docblock is followed by a non-heading line" asserts shape, not truth: it goes green the moment someone puts one filler sentence under the empty heading — which is exactly the two-answers-to-one-fact outcome the card exists to prevent.⭐ Grounded in this same docblock's own line — "the limitation is asserted as a FACT, never as a sentence". ⇒ accepted, and ⛔ no follow-up card is filed: a gate that can be satisfied by writing anything at all is not a gate.
Generated by Claude Code
Filed out-of-scope from #7413 (PR #8010). Unassigned. A one-paragraph docs defect in a test docblock; filed plainly rather than folded into that PR.
What
scripts/__tests__/check-shell-escape-residue.test.ts's header docblock, onorigin/mainate1545cf:## Fixture disciplinehas no body at all. The paragraph that belongs under it is the last one in the docblock, sitting after theobjectui#7403section with no heading of its own:That is fixture discipline, and it reads as a trailing note on the skills-root section instead.
Why it happened, and why it is worth a line
The
## The second skills root (objectui#7403)section was inserted between a heading and its own body when #7403 widened the gate. The result is not merely cosmetic: an empty heading reads as a section someone meant to write and never did, so the next author is invited either to delete it (losing the pointer) or to write a second fixture-discipline paragraph under it while the original sits below (two answers to one fact). PR #8010 hit exactly that fork — its new## Coveragesection was first placed at the same insertion point, deepening the split, and was moved to the end of the docblock instead, leaving the pre-existing arrangement untouched rather than fixing it in an unrelated PR.Fix
Move the
scripts/is not inSCAN_ROOTSparagraph back under## Fixture discipline, above## The second skills root. No behaviour change; the docblock is not asserted by any pin.Not a duplicate of #6280 (stale coverage claims in a docblock — a falsified premise, not a displaced section).
Observed by the dev seat on #7413 while editing this docblock, unclaimed.