Repository navigation
docs(ci-cd-pipeline): the Half-State Patrol section describes PM_SWEEP_CLOSED_WINDOW_PAGES: '0', a knob the workflow no longer sets — the closed-card reader is ON with PM_SWEEP_CLOSED_FLOOR #8043
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 6, 2026 Claim: PM loop round R46 — a docs correction plus a pin: rewrite the Half-State Patrol paragraph on
content/docs/guide/ci-cd-pipeline.mdto the configuration.github/workflows/half-state-patrol.ymlactually sets, and extendscripts/__tests__/ci-cd-pipeline-doc.test.tsso everyPM_SWEEP_*name the page uses is one the workflow sets (control: the current wrong name reds it)
Session:session_01FhBNJcLRZLe8M87VcUgpKr
Branch:claude/issue-8043-half-state-patrol-doc-knob
Worktree:objectui-issue-8043
Domain:domain:devx
File surface:content/docs/guide/ci-cd-pipeline.md(the Half-State Patrol section only) +scripts/__tests__/ci-cd-pipeline-doc.test.ts(a newdescribeblock; existing assertions untouched). ⛔.github/workflows/half-state-patrol.ymlis read, not written; ⛔ nocontent/docs/releases/change (stop on breach; explain in the report)
Container & model: S, mechanical (the director's split names the sentence, the variable, and the pin shape),mode:subagent,model: opus— no path-derived tier mandate; default judgment tier taken
Clause-②: no (docs + a scripts test; no published package moves)
Serial constraints cleared: no triage comment on this card (director split from #7852 under decision batch #54, labels from the split); premise onorigin/maina12ef6c3fat 13:00Z —ci-cd-pipeline.md:1887still says the reader is switched off viaPM_SWEEP_CLOSED_WINDOW_PAGES: '0'; the workflow's env block sets exactlyPM_SWEEP_REPOandPM_SWEEP_CLOSED_FLOOR: '2026-08-28'(:280),PM_SWEEP_CLOSED_WINDOW_PAGESappears there only in header comments:39/:80; the doc test today has zero mentions ofPM_SWEEPor the half-state section; last churn on the three files is #8004 / #7970 / #7909; no open PR orclaude/*branch names them (read 13:00Z). Correction to the card body: objectui has NOskip-changesetlabel (the same doc test pins that it is phantom,:235/:277) —node scripts/check-changeset-presence.mjsdecides, and for docs + a scripts test none is owed. This seat's in-flight devs (#6892 s3:packages/authtests + the vi-mock gate; #5174 b22: one README + the doc-snippet ledger; PR #8053 converging) are disjoint.pm:queue→pm:dispatched+ assignee written in one stroke at 13:17Z and read back.
Generated by Claude Code
os-dev-report
{ "issue": 8043, "status": "done", "branch": "claude/issue-8043-half-state-patrol-doc-knob", "pr": "https://github.com/objectstack-ai/objectui/pull/8061", "head": "8d17db858", "premise_still_valid": true, "files_changed": [ "content/docs/guide/ci-cd-pipeline.md", "scripts/__tests__/ci-cd-pipeline-doc.test.ts" ], "line_budget": "n/a — no skills/** in the diff", "summary": "Rewrote the Half-State Patrol section's wiring paragraph against the workflow's own env block (:270-280) and header divergence (1) (:37-39): the closed-card reader is ON with PM_SWEEP_CLOSED_FLOOR: '2026-08-28', the page window is deliberately absent (back to CLOSED_ISSUE_WINDOW_PAGES = 4), and the dated floor -- not a zeroed window -- is what keeps the ~815 historical pm:dispatched carriers out. The retired knob is no longer named anywhere in the section. Two neighbouring claims were re-checked against the code rather than carried over: 'stripping pm:* on close was never this repo's practice' is now false as written (it became the practice on the cutover date), and the 'UNREAD, never clean' sentence is true only while the escape hatch is set -- summaryLine branches on closedWindowDisabled, and with the window unset it renders 'H22 read N recently-closed issue(s) ... only cards closed on/after 2026-08-28 are judged'. Kept but re-conditioned onto the hatch, which is dormant live code. Added a new describe block to scripts/__tests__/ci-cd-pipeline-doc.test.ts (no existing assertion touched) asserting every PM_SWEEP_* the section names is a key the workflow sets in an env: mapping. The workflow was read, never written; half (1) of #7852 (HALF_STATE_ANCHOR_ISSUE) was not touched. Assignee was already set to baozhoutao by the PM; not written by this seat, and no label was applied.", "premise_verification": { "A1_doc_side": "VERIFIED — exactly one PM_SWEEP_* name on the page at :1887 before the edit (PM_SWEEP_CLOSED_WINDOW_PAGES); one after (PM_SWEEP_CLOSED_FLOOR).", "A1_workflow_side": "VERIFIED — comments excluded, env keys are exactly PM_SWEEP_REPO (:272) and PM_SWEEP_CLOSED_FLOOR (:280); the retired knob appears only at :37/:39/:80, all whole-line comments. The pin's own failure output prints this set.", "A2": "VERIFIED — reused the file's existing module-scope doc/workflowDir readers plus readWorkflow (:928) and withoutComments (:936); no second file-loading path added. Zero PM_SWEEP mentions in the file before this change.", "A3": "VERIFIED — git grep -l ci-cd-pipeline over scripts/packages/apps/examples names 15 files under scripts/__tests__ (all covered by the whole-directory run) plus packages/auth/src/__tests__/reserved-auth-features.test.ts, run separately: 17 passed (17).", "A4": "PARTIALLY FALSIFIED — origin/main moved once during the run (a12ef6c3f -> a8f4bd75f, #8046, plugin-markdown tests, disjoint). Merged origin/main and re-ran the whole battery on the merged head 8d17db858; every reading below is from that head." }, "tests": { "ablation": "Doc mutated on disk back to the wrong sentence AFTER the implementation was committed (so the restore leg had a real restore point), restored under a trap ... EXIT INT TERM with absolute paths. HEAD blob e2db116a866c53033c1f9d34de5ba81e060c8618 == before blob (tree at HEAD before mutating); after blob cd01541b3ab4631ca101f9c83b8e9313a4dc1008 (changed, so not a no-op); anchor counts PM_SWEEP_CLOSED_FLOOR 1->0 and PM_SWEEP_CLOSED_WINDOW_PAGES 0->1 measured both directions. ABLATION-VITEST-EXIT=1, 'Tests 2 failed | 42 passed (44)'. Predicted direction (red naming the knob) observed verbatim: 'The Half-State Patrol section names these PM_SWEEP_* variables: - PM_SWEEP_CLOSED_WINDOW_PAGES ... and half-state-patrol.yml sets none of them. What it does set is: - PM_SWEEP_CLOSED_FLOOR - PM_SWEEP_REPO'. Second failure is the value leg. Restore verified by blob equality (back to e2db116a8) and 'RESTORE-DIFF: 0 path(s) still differing', not by an exit code. No build/dist step is involved: the pin reads repo files directly, so there is no dist to preflight.", "gates": { "pnpm exec vitest run scripts/__tests__/ci-cd-pipeline-doc.test.ts": "PASS exit 0 — Tests 44 passed (44)", "pnpm exec vitest run scripts/__tests__/": "PASS exit 0 — Test Files 111 passed (111), Tests 3331 passed (3331) [pre-merge head]; on the merged head the first run was 1 failed | 110 passed with two 15000ms timeouts in check-doc-links.test.ts — see deviations", "pnpm type-check:scripts": "PASS exit 0", "pnpm lint:root": "PASS exit 0 (full root surface, not narrowed)", "pnpm check:doc-fences": "PASS exit 0", "pnpm check:doc-snippets": "PASS exit 0 — 'Scanned 227 document(s): 211 covered (109 of them hold a ts/tsx block), 16 ungated' / 'Semantic phase: 549 of 549 block(s) judged, 0 failed.' The page IS in the scan surface (DOC_EXTENSIONS = ['.mdx','.md'], DOCS_ROOT = content/docs) and holds 8 fences, 0 of them ts/tsx. First invocation answered 'PRECONDITION NOT MET (exit 2)' — NOT MEASURED, not a red; ran its own --build-filter build (34 tasks, exit 0) and re-ran.", "node scripts/check-doc-links.mjs": "PASS exit 0 — 'Links are valid across 17 scan roots.'", "pnpm check:doc-example-readers": "PASS exit 0", "pnpm check:control-bytes": "PASS exit 0", "manual control-byte scan (grep -naP over both paths)": "PASS — grep exit 1, no matches", "node scripts/check-changeset-presence.mjs": "PASS exit 0 — 'Compared the working tree with a8f4bd75f (merge-base with origin/main): 2 file(s) changed, 0 of them published source ... 0 changeset(s) added.' / 'no changeset is owed.'", "node scripts/check-governed-queue-guard.mjs --test content/docs/guide/ci-cd-pipeline.md scripts/__tests__/ci-cd-pipeline-doc.test.ts": "PASS exit 0 — 'NOT GOVERNED — 2 path(s) checked against 5 governed surface(s); none matched.'", "node scripts/check-doc-component-types.mjs": "PASS exit 0 — 'Every documented component type is registered.' (re-derived: reads content/docs)", "node scripts/check-doc-expression-carriage.mjs": "PASS exit 0, report-only census (re-derived: reads content/docs)", "node scripts/check-shell-escape-residue.mjs": "PASS exit 0 — 'content/docs: 184 file(s), 1064 fence(s)' (re-derived)", "node scripts/check-upstream-port-parity.mjs": "PASS exit 0 — '3 ported file(s) match ... modulo their declared divergences' (re-derived: the sweeper pair is ported; neither ported file was touched)", "pnpm exec vitest run packages/auth/src/__tests__/reserved-auth-features.test.ts": "PASS exit 0 — 17 passed (17) (A3 reader outside scripts/__tests__)" }, "gate_reading_discipline": "Every exit code captured by redirect-then-capture (cmd > log 2>&1; EXIT=$?), never across a pipe; verdict lines quoted from each gate's own output.", "ci_status": "in_progress — reported at draft-PR time per protocol; CI convergence is the PM's, not this seat's. 'Live E2E (informational)' is red on every branch today for an upstream reason (#7990) and is not this branch's." }, "deviations": [ "origin/main moved under the branch (a12ef6c3f -> a8f4bd75f, #8046). Merged origin/main per A4 and re-ran the entire battery on the merged head 8d17db858; every gate reading in this report is from that head, and the changeset gate's merge-base line confirms it (a8f4bd75f).", "check:doc-snippets required its own scoped build to be measured at all (exit 2 = PRECONDITION NOT MET). Ran 'pnpm exec turbo run build $(node scripts/check-doc-snippet-types.mjs --build-filter) --concurrency=2' (34 tasks, 33 cached, exit 0) and re-ran the gate. The exit-2 run is reported as NOT MEASURED, not as a failure.", "FLAKE, not a defect: on the first scripts/__tests__/ run after the merge, two whole-corpus tests in check-doc-links.test.ts timed out at 15000ms (1 failed | 110 passed | 3329 passed). The same command on the same tree content passed minutes earlier (111 passed / 3331 passed), and the file alone re-runs green: 121 passed in 12.5s. Measured solo with --reporter=verbose those two tests are 4429ms and 3792ms against a 15000ms default. The variable is container load (188s vs 118s for the same command), not this diff. The gate itself, node scripts/check-doc-links.mjs, is green on the merged head. Filed as objectui#8062.", "The dispatch's gate list named a hand-derived set; four more were re-derived against the actual diff by grepping which scripts/*.mjs read content/docs or scripts/__tests__ and cross-checking .github/workflows: check-doc-component-types, check-doc-expression-carriage, check-shell-escape-residue, check-upstream-port-parity. All green. objectui has no scripts/pm/dispatch-gates.mjs (that is objectstack's), so this derivation is by hand and by grep, not by that tool.", "The rewritten section deliberately does NOT name PM_SWEEP_CLOSED_WINDOW_PAGES. Naming a retired knob is the defect the card is about, and the new pin (by ruling 2's design) would red on it. The knob's continued existence as dormant live code is described in prose without the identifier, pointing the reader at the workflow header's divergence list.", "Added one link the section did not carry, objectui#5985 (the card the floor decision is recorded under, cited by the very workflow comment being paraphrased). The #5791 link is kept, moved onto the port sentence where it belongs. Both verified to exist and to be the cards the workflow header names. The #4690 number in the sweeper's own header is an OBJECTSTACK number and was deliberately not carried onto the page." ], "mcp_calls": "1 — mcp__github__create_pull_request. Everything else went over git or the session's repo-scoped REST channel (probed green at the start of the round with GET /repos/objectstack-ai/objectui, http=200): issue and comment reads, the dedup listing, the finding POST (201), and this report comment. The one permitted MCP dedup search was not needed — REST list + local scan answered it deterministically with a live control.", "open_questions": [], "out_of_scope_findings": [ "filed as objectui#8062 (label `finding` only, no assignee, no domain label): two whole-corpus tests in scripts/__tests__/check-doc-links.test.ts run at 4429ms and 3792ms against vitest's 15000ms default and time out under container contention; each independently re-parses the same ~230-document corpus, so the work is duplicated and grows with the doc tree. AGENTS.md's own remedy (move unbounded work to module scope, never raise the timeout, never beforeAll) is named in the card. Dedup: PM's full open domain:devx read at 09:19Z + lane list at 12:55Z stands for everything older; this seat re-read only the increment, GET /issues?state=open&since=2026-09-06T12:55:00Z -> 22 items with objectui#8043 present as the live control, none of them this." ] }
Generated by Claude Code
ACCEPT — PR #8061, head
8d17db858. The Half-State Patrol paragraph now describes the wiring the workflow sets (reader ON,PM_SWEEP_CLOSED_FLOOR: '2026-08-28', window unset), the retired knob is gone from the section, and a four-leg pin reads the workflow'senv:keys against the section. Flip and arming on CI convergence.domain:devx @ objectuiexecution seat, PM sessionsession_01FhBNJcLRZLe8M87VcUgpKr, R46, 2026-09-06T13:43Z. Report5559602308reviewed against GitHub and the tree, ⛔ not against its narrative.item reading (mine) PR shape draft ✅ · base main✅ · first lineFixes #8043✅ · other closing keywords in body / commits: 0 (#7852is named as the parent, no closer) ✅ · 2 files (+183/−7) ✅Diff shape ( a8f4bd75f..8d17db858)ci-cd-pipeline.md+22/−7, one section;ci-cd-pipeline-doc.test.ts+161/−0— a newdescribeblock with fourits, zero existing lines removed ✅Doc-side names PM_SWEEP_*identifiers in the page after the rewrite: exactlyPM_SWEEP_CLOSED_FLOOR(×1); the retired knob is absent ✅Pin reads env keys, not text envKeysOfstrips whole-line comments and readsenv:children at indent + 2, unit-controlled against a specimen carrying a commented key and a folded scalar — so the workflow's own header mentions of the retired knob (:39/:80) cannot satisfy it ✅Facts in the rewrite spot-checked on origin/main: the 2026-08-24 measurement (815 carriers, ~87% vs 26% upstream), objectui#5985 as the two-way-choice record, the malformed-floor refusal, the escape hatch and the "UNREAD" wording all sit in the workflow header (:41-81) andcheck-half-states.mjs:6795-6797— the paraphrase is true of its sources ✅Ablation doc restored to the wrong sentence on disk (blob e2db116a8 → cd01541b3), pin exit 1 namingPM_SWEEP_CLOSED_WINDOW_PAGESand listing what the workflow sets; restored undertrap, blob back ✅Changeset docs + a scripts/__tests__file, presence script: none owed ✅ · noskip-changesetlabel (phantom in objectui) ✅Governed 2 paths, NOT GOVERNED; the workflow was read, not written; half ① of #7852 untouched ✅ check:doc-snippetsthe page is in the gate's scan surface ( .mdcollected — objectui#5174's collector change is onmain), 0 ts/tsx fences, 549/549 judged ✅Report hygiene: 1 MCP call (the PR creation). The
check-doc-links.test.tstimeout pair on the merged-head whole-directory run re-ran green in isolation; the dev filed it as objectui#8062 (findingonly, unassigned — with triage, not this seat's to route).Next: standing-down note for
Live E2E (informational)on the PR, wait for CI convergence on8d17db858, flip ready, post-flip guard, arm auto-merge (squash), then the landing probe on re-fetchedorigin/main:PM_SWEEP_CLOSED_WINDOW_PAGESincontent/docs/guide/ci-cd-pipeline.md= 0,PM_SWEEP_CLOSED_FLOOR= 1,Half-State Patrol sweeper wiring (#8043)in the test = 1, control:PM_SWEEP_CLOSED_WINDOW_PAGESstill present in the workflow header comments (2). Card closes on merge;pm:dispatchedoff and assignee cleared in the same stroke.
Generated by Claude Code
Armed: PR #8061 (head
8d17db858) flipped ready 13:51:38Z on all-green-but-the-base-red lane (28 checks, standing-down note5559613869, anchor #7990), post-flipGoverned Surface Queue Guardsuccess13:51:55Z, auto-merge (squash) enabled,added_to_merge_queue13:52:24Z (REST timeline). Landing stroke on MERGED per the ACCEPT5559613597: on re-fetchedorigin/main,PM_SWEEP_CLOSED_WINDOW_PAGESincontent/docs/guide/ci-cd-pipeline.md= 0,PM_SWEEP_CLOSED_FLOOR= 1,Half-State Patrol sweeper wiring (#8043)in the doc test = 1, control: the retired knob still in the workflow header comments; the card closes on merge (Fixes), thenpm:dispatchedcomes off and the assignee is cleared.
Generated by Claude Code
LANDED — PR #8061 merged 2026-09-06T14:07:45Z (queued 13:52:24Z). Verified on
origin/main119802708by CONTENT, ⛔ not by the merge event.domain:devx @ objectuiexecution seat, PM sessionsession_01FhBNJcLRZLe8M87VcUgpKr, R46, 2026-09-06T14:09Z.reading expected got PM_SWEEP_CLOSED_WINDOW_PAGESincontent/docs/guide/ci-cd-pipeline.md0 0 PM_SWEEP_CLOSED_FLOORin that page1 1 Half-State Patrol sweeper wiring (#8043)inscripts/__tests__/ci-cd-pipeline-doc.test.ts1 1 control — the retired knob still in half-state-patrol.yml's header comments2 2 ✅ probe fires (and the pin reads env keys, so those comments do not red it) Card closed by
Fixes;pm:dispatchedcomes off and the assignee is cleared in the same stroke. #7852 stayspm:awaiting-maintainerfor half ① (theHALF_STATE_ANCHOR_ISSUErepository variable). objectui#8062 (thecheck-doc-links.test.tstimeout pair) stays with triage.
Generated by Claude Code
Split from #7852 (half ②) by the director seat under decision batch #54 (maintainer 「同意」, 2026-09-06). #7852 itself is now
pm:awaiting-maintainerfor half ① (the repository variableHALF_STATE_ANCHOR_ISSUEonly a maintainer can set); this card is the docs correction, which a dev can land independently.The defect
content/docs/guide/ci-cd-pipeline.md:1887(Half-State Patrol section) says:.github/workflows/half-state-patrol.ymldoes not set that variable anywhere (it appears only in the header comments at:39/:80as history). It setsand its own header says the reader is on with a dated floor, page window back to the script's upstream default of 4.
What to do
2026-08-28, window default 4, and why.scripts/__tests__/ci-cd-pipeline-doc.test.tstoday reads headings and file names only; extend it (or add a sibling) to assert that everyPM_SWEEP_*variable the doc names is one the workflow actually sets — a control that the current wrong name reds it.skip-changeset(docs + test only).Re-check before claiming