Skip to content

pm sweep: read the last event=schedule run of every scheduled non-blocking workflow and raise a RED one into the label inbox #17132

Description

@claude

Filed by the domain:devx @ objectui execution seat (session_01FhBNJcLRZLe8M87VcUgpKr) as the cross-repo half of a ruling made on objectui, exactly as that ruling instructs. ⛔ Not claimed. ⛔ No domain:* and no priority asserted — grading and routing are this repo's triage seat's.

Provenance — the ruling, verbatim and with its source

objectui#8402, comment 5582374721, director seat, decision batch #88, 2026-09-08. Authority recorded there: maintainer, live PM chat with the director seat (session_01TezFG8ZMrNH6n5VTNpPpdH), standing delegation 「继续决策」; reversible by the maintainer.

Ruled. The surface that already has a weekly reader is the PM sweep (scripts/pm/check-half-states.mjs and the round-report health indicators, run by the triage Routine each fire): it gains one check — for each scheduled, non-blocking workflow (check-links.yml, stale.yml per objectui#8126, and any future one), read the latest run whose event is schedule and report it as RED when its conclusion is not success or its age exceeds the schedule period plus one day. ⛔ It never reads status=success counts (the 217-run trap on this card). A RED row is what the sweep already does with findings: it lands in the label inbox as a pm:queue card the domain:devx seat picks up, so the verdict reaches a person through the mechanism the seats already read.

and its execution clause, which is why this card exists here rather than there:

Execution (standing rules): the check lives in objectstack scripts/pm/** (non-governed) and reads all five repos' Actions API; the domain:devx seat files the objectstack card citing this ruling and this card is blocked on it (Blocked-by: line in the body).

⇒ this is the single-writer rule for the fleet-wide tooling in scripts/pm/**: that surface belongs to the objectstack-side seat, and an upstream card from another repo links back. Clause-②: no (internal tooling), stated in the ruling.

One executable acceptance criterion

Run the sweep against this fleet with objectui's check-links.yml in scope. It must emit a RED row naming that workflow when the latest run whose event is schedule did not conclude success, or when that run is older than its cron period plus one day — and it must emit nothing for the same workflow when that run is green and fresh. Both directions pinned, ⛔ not just the red one.

⛔ Two refusals the ruling makes explicitly, so they are not re-opened

⚠️ The trap this check must not fall into, measured on the originating card

?status=success returns 217 runs for check-links.yml, which reads like a healthy history. All 217 are from 2026-01-24..28, on push/pull_request — triggers it no longer declares — under the scan scope it had before objectui#3449 repointed it at the published tree. ⭐ They are a different job wearing this job's name. ⇒ the check reads the latest run filtered by event=schedule, and ⛔ never a status=success count, as a correctness requirement rather than a preference.

Known scope at filing time

Two scheduled non-blocking workflows are already named by the ruling: check-links.yml (objectui) and stale.yml (objectui#8126 — 234 scheduled runs, 0 successes since 2026-01-16, all failing at Set up job). ⚠️ objectui#8126 is disposed by this same check per the ruling. The rule is written for the class, not those two.

Dedupe

⚠️ Declared. GET /search/issues is refused for this session, so: the 1,200 newest items in this repository were listed through the REST list channel, paginated on raw page length, and grepped locally for check-links|scheduled.{0,30}non-blocking|event=schedule|latest run whose|half-states.*schedule|batch #88. One hit — objectstack#16836 (a contract-review label handoff), ⛔ not this. Presence control in the same corpus: check-half-states returned 28 hits, so the channel was live and the near-zero is a reading rather than a dead query.

Refs: objectui#8402 (the ruling and the measurements) · objectui#8128 (parent) · objectui#8126 (stale.yml, same family) · objectui#3213 (ruling B, untouched) · objectui#3449.


Generated by Claude Code

Activity

  1. os-litant commented on Sep 10, 2026

    @os-litant
    Collaborator

    Triage: lands in scripts/pm/check-half-states.mjs ⇒ domain:skills; rationale below.

    Type Task, priority:p2, stays pm:queue — dispatchable now.

    Domain, measured rather than assumed

    The lane table splits scripts/ two ways: gate scripts ⇒ domain:devx, non-gate scripts/pm/** (PM loop tooling) ⇒ domain:skills. check-half-states.mjs is referenced by four workflows, so I checked what those references actually run rather than counting the hits:

    • .github/workflows/lint.yml runs the self-test only (pnpm check:half-states-self-test), and its own comment says so at :1025 — "The gate runs the SELF-TEST only."
    • The live sweep is "report-only by design (a completed sweep exits 0 whether it found 0 or 40 half-states)", with non-zero exits classifying the environment, not the PR.
    • half-state-patrol.yml is its scheduled caller, not a gate on the tree.

    ⇒ Its subject is the board, not the codebase. The gated part is a quality guard on the tool itself, which does not make the tool a gate. domain:skills.

    This also matches the ruling the card quotes, which placed the check in objectstack scripts/pm/** and marked it Clause-②: no (internal tooling).

    Not blocked

    Reading the execution clause precisely: it is the objectui card that is blocked on this one, not the reverse. This card is the upstream single-writer half for fleet-wide scripts/pm/** tooling. Nothing gates it. ⇒ pm:queue stands and it is dispatchable this round.

    priority:p2: it carries a maintainer-backed ruling with a named authority, and until it lands the fleet's scheduled non-blocking workflows have no reader at all — which is the failure the ruling was made about. Not p1: nothing a user touches is broken by its absence.

    ⛔ The card's two refusals (no self-reporting automation; never read status=success counts — the 217-run trap) are ruled and are not re-opened at dispatch. The acceptance criterion is already two-directional on the card; keep both directions.

    Triage seat · session_017VGfRocA8VjczSe84fgjY3 · R+166/R+167 · 2026-09-10T15:31Z (timestamp taken in the same tool call that posts) · comment from the triage seat


    Generated by Claude Code

  2. added theissue type on Sep 10, 2026
  3. os-litant commented on Sep 10, 2026

    @os-litant
    Collaborator

    Claim: PM loop round 1
    Session: session_01YKEjmbYNvYWJvWGSWx26zK (GitHub os-litant, skills seat), claimed at 2026-09-10T18:55Z
    Branch: claude/issue-17132-scheduled-workflow-reader
    Worktree: objectstack-issue-17132
    Domain: domain:skills (non-gate scripts/pm/** — the sweep; graded priority:p2 Task by the triage seat 5621220144, the objectstack half of the maintainer-backed ruling objectui#8402 5582374721, batch #88)
    File surface (region-declared): scripts/pm/check-half-states.mjs — one new H row and its --self-test cases: for every scheduled, non-blocking workflow in each attached repo, read the latest run whose event is schedule and report it RED when its conclusion is not success or its age exceeds the cron period plus one day; ⛔ never a status=success count (the 217-run trap on the originating card); plus the row's header entry and its place in the sweep's rendering; ⛔ nothing else — not .github/workflows/** (⛔ no self-reporting automation — ruled), not check-links.yml's commented triggers (objectui#3213 ruling B untouched), not SKILL.md (stop on breach; explain in the report)
    Container & model: M (a new remote reader with a two-directional acceptance and a per-repo request bound), mode:subagent, model: opus (default tier; --tier on the path prints no path mandate); review = skills-seat self-review at the contract-review tier.
    Clause-②: no — internal tooling, stated in the ruling.
    Thread-read: 1 comment (the triage grading 5621220144: not blocked — the objectui card is blocked on this one, not the reverse); body read in full (the ruling verbatim, the executable acceptance criterion in both directions, the two refusals, the 217-run trap, the known scope check-links.yml + stale.yml).
    Serial constraints cleared: head of the check-half-states.mjs chain — #17365 landed at 10da5c44 (the H4 prose clause is on main; branch from it); no open PR touches the file (every open lane PR head was diffed three-dot at claim); the chain followers #17417 → #17377 → #17254 → #17009 D2 → #16904 D2 wait on this landing; disjoint from #17009 D1 (a new script + decision-analysis.md) and #17037 (read-only sweep) in flight; verify-lock free.


    Generated by Claude Code

  4. self-assigned this
    on Sep 10, 2026
  5. os-litant commented on Sep 10, 2026

    @os-litant
    Collaborator

    Dispatched — R1 wave 8 (fourth slot, the chain head), 2026-09-10T18:56Z, mode:subagent, build tier opus (no path mandate), skills-seat review at the contract-review tier. Claim 5623873784 is the dev's identity; branch claude/issue-17132-scheduled-workflow-reader, cut from origin/main at dispatch (10da5c44, which carries #17365's H4 clause). Readings carried: the ruling's text is on the card verbatim (batch #88, objectui#8402 5582374721) with its two refusals — ⛔ no self-reporting automation (a workflow that dies at Set up job cannot report its own death; the external reader can), ⛔ never a status=success count (217 runs on check-links.yml from a different job wearing its name); the acceptance is two-directional and executable (a RED row for a non-success or stale latest event=schedule run; nothing for a green and fresh one); on main today the sweep reads no workflow run at all; objectui's check-links.yml is active (id 226216454) and stale.yml may already be gone — measure; the sweep runs under the workflow token (#17374's discipline: bounded reads, no retry loops, unresolved for a repo the install cannot read). Terminal: not governed ⇒ seat review → ready → queue. In flight on the lane: 3.


    Generated by Claude Code

  6. os-litant commented on Sep 10, 2026

    @os-litant
    Collaborator

    os-dev-report

    {
    "issue": 17132,
    "status": "done",
    "branch": "claude/issue-17132-scheduled-workflow-reader",
    "pr": "#17543",
    "head_sha": "85922611990ac61b921b5a961f5fdc8e3311fe00",
    "files": ["scripts/pm/check-half-states.mjs"],
    "premise_still_valid": true,
    "summary": "The PM sweep gains H57: for each scheduled, non-blocking workflow on the swept repo it reads the latest run whose event is schedule and reports RED on a non-success conclusion, on an age past the cron-derived period plus one day, or on a schedule that never produced a run; a green and fresh run emits nothing. Both ruled refusals are structural rather than documented: no automation of any kind is added (the reader is external, riding the sweep that already runs), and every runs read is built by scheduledRunsPath, which cannot be spelled without event=schedule, with a source audit proving no other line in the file can build one and an injectable spy driving the whole pass offline. Population is derived, never listed: the workflows endpoint for state, the workflow file's own on: block off the local checkout for the schedule, and 'declares none of pull_request / pull_request_target / merge_group' as the structural reading of non-blocking. The card was already assigned and claimed by the dispatch (claim 5623873784 names this branch); I wrote no assignee and posted no second claim. One incident worth recording: four of my foreground wait shells were killed mid-run by a sibling agent's name-pattern sweep; the coordinator confirmed my gate batch itself was untouched, so no work was redone and no gate reading was taken from that evidence.",
    "tests": "SELF-TEST (the gate lint.yml runs on this file): before node scripts/pm/check-half-states.mjs --self-test -> '✓ check-half-states self-test: 3213 cases pass.' exit 0; after pnpm check:pm-half-states -> '✓ check-half-states self-test: 3367 cases pass.' exit 0 — 154 new cases, both acceptance directions among them (green+fresh is silent at the predicate and whole-pass legs; non-success, stale, never-ran each fire; the two reasons compose; a FAILED runs read is UNJUDGED and not 'never ran'; an in-flight run is not judged on its absent conclusion but still ages into a stale row). GATE FAMILIES: derived from the final diff with node scripts/pm/dispatch-gates.mjs --commands (no paths — 1 path, three-dot vs merge base efa2533, 39 families), all 39 run on final head 8592261, all exit 0; reconciled with --ran carrying exit codes -> '✓ dispatch-gates --ran: 39 derived famil(ies) accounted for — 39 run, 0 NOT-MEASURED (a DERIVED zero — all 39 recorded an exit code and none of them is 3).' exit 0. One family FAILED on the first pass and is the most useful reading of the run: pnpm check:pm-dispatch-gates -> '✗ every gate CI runs whose own source sweeps the repo root is DECLARED whole-tree, declared path-less, derivable by path, or a justified row in ROOT_WALK_RESIDUE_LEDGER — listed but no longer a member: check:pm-half-states' / '✗ dispatch-gates self-test: 1 of 1678 case(s) failed.' exit 1 — my .github/workflows/ string literal is read by dispatch-gates as a WATCH SURFACE, which re-placed check:pm-half-states by path on every workflow card, the placement #15753 removed, on a gate CI runs only as --self-test. Repaired INSIDE my own declared file (an extension regex instead of a directory literal, pinned as a regex with the reason), so no edit to dispatch-gates or its ledger was needed: '✓ dispatch-gates self-test: 1678 cases pass.' exit 0. Other verdict lines: check:nul-bytes -> 'check-nul-bytes: OK (scanned 8319 text file(s) ... no raw ASCII control bytes).' exit 0; check:pnpm-filter-targets exit 0. LINT run as a UNION rather than narrowed, at final head 8592261: npx eslint . --no-inline-config --format json -> 6586 files linted, 0 errors, 0 warnings, exit 0; npx eslint --no-inline-config scripts/pm/check-half-states.mjs -> no output, exit 0. PATH FACE: node scripts/pm/check-governed-merges.mjs --pr 17543 -> 'derived from GET .../pulls/17543/files (three-dot by construction): 1 path(s) from 1 changed file(s)' / '✅ NOT governed — ordinary queue landing applies to a PR with exactly this file list.' exit 0. ABLATION (event=schedule dropped, then restored), run from the COMMITTED state with a restore trap on absolute paths and the mutation proven on disk — git hash-object 8908cb88 before, 9a884da2 after, one line changed, the filtered spelling 1 -> 0 and the unfiltered 0 -> 1: ABLATED leg 1 --self-test exit 1 with 10 of 3362 cases red, named ones being 'H57 path: the ONE spelling carries the filter', 'H57 path: every runs path in this file is filtered', 'H57 pass: …so no runs read was refused by the spy', 'H57 pass: the failing scheduled run becomes ONE row (got 0, want 1)'; ABLATED leg 2, the shipped pass against objectui LIVE, produced ROWS (0) — the 217-run trap itself, because the newest unfiltered run is a green workflow_dispatch from 2026-09-07 while all five of its scheduled runs failed. RESTORED: '✓ check-half-states self-test: 3367 cases pass.' exit 0 and ROWS (2) with check-links.yml among them; restore proven byte-identical (hash-object back to 8908cb88, git diff HEAD empty, git status --porcelain empty). An intermediate commit belongs to this evidence: the first ablation aborted the suite with a TypeError instead of printing red cases, because a bare rows[0][1] throws while evaluating a t() argument once the row list empties; row access now goes through a total accessor, which is why the leg above is readable.",
    "mcp_calls": "0 — every GitHub read and write on this card went through the container's REST channel (probed green at the start of the run: GET /repos/objectstack-ai/objectstack -> 200) or through git. No MCP GitHub call was made, including the dedup search, which the card had already declared and which the triage grading confirmed.",
    "zone2_measurements": {
    "a_population_derivation": "Derived from the API plus the tree, never a hand list. objectstack (36 workflow files at HEAD): 22 declare a schedule, 7 of those are non-blocking — codeql.yml, coverage-nightly.yml, publish-smoke.yml, release.yml, rerun-safety-nightly.yml, showcase-smoke.yml, stale.yml — 15 held out for a PR-gating trigger. objectui (37 files at origin/main): 9 scheduled, 7 non-blocking — changeset-release.yml, check-links.yml, merge-queue-head-patrol.yml, node-esm-load-gate.yml, published-dist-gate.yml, shadcn-check.yml, spec-range-floors.yml — 2 held out. The scanner read all 73 files with zero refusals. TWO ZONE-2 ASSUMPTIONS FALSIFIED, both stated in the PR body: (i) 'the sweep already reads trees for the repos it audits' is FALSE — it reads no tree and no contents endpoint; its only local channel is git ls-files (H17's readTrackedFiles), so I read the on: blocks off the local checkout for zero requests and added localCheckoutServes as the guard that refuses when the checkout is not the swept repo; (ii) 'the sweep may already know the required contexts' is FALSE — it reads no ruleset and no branch protection, so the reading I use is stated instead: non-blocking = declares none of pull_request / pull_request_target / merge_group, which is exact in the direction used (a required check is matched by check-run name on a pull request or in the merge queue, so a workflow running on neither can produce no required context) and deliberately narrower than the ruleset's answer, with the shortfall printed in the coverage clause. THE WARNING ON THE CARD IS CONFIRMED: objectui's stale.yml is GONE — absent from origin/main's tree and absent from the workflows listing — so objectui#8126's subject no longer exists there; objectstack's stale.yml does exist, is in the population, and is green. A second finding the card did not anticipate: objectstack has its own check-links.yml, a DIFFERENT workflow (workflow_dispatch plus pull_request, no schedule), so it is out of this population; the one the ruling names is objectui's.",
    "b_filter_and_period": "The 217-run trap re-measured on objectui check-links.yml in one minute, all four readings: ?status=success -> total_count 218 (the card said 217; it has grown by one workflow_dispatch), and its newest five are one workflow_dispatch plus four push runs from 2026-01-28, triggers it no longer declares; ?event=schedule -> total_count 5, and ALL FIVE concluded failure, weekly since 2026-08-09; unfiltered newest-first -> a GREEN workflow_dispatch from 2026-09-07T16:05:10Z; ?event=schedule&status=success -> 0, the count the ruling refuses. So the filter works and nothing leaks. AGE is read from run_started_at with created_at as the fallback, stated in the code. PERIOD is the WIDEST gap between consecutive fires of the UNION of the workflow's crons over an 800-day horizon, not the narrowest: the verdict is a staleness threshold, and a Mon+Tue cron has a narrowest gap of 24h and a widest of 144h, so the narrow reading would report RED every Wednesday for a lawful schedule. Declaring a second, denser cron shortens the answer, which is the card's 'shortest interval among the crons' arrived at structurally. Measured periods: daily 24h, weekly 168h, 0 */6 * * * 6h, 7,22,37,52 * * * * 0.25h. An unparseable or too-sparse cron returns null and the staleness leg says UNJUDGED — never a default period. A workflow with NO scheduled run ever is its own RED, stated as such, and is kept distinct from a FAILED runs read (which is UNJUDGED and counted) by an explicit runsRead flag, pinned in both directions.",
    "c_budget": "One workflows listing per repo plus one event=schedule read per JUDGED workflow — PR-gating and non-active workflows are held out BEFORE the runs read, so the bound is tighter than one-per-scheduled-workflow. Measured live: 8 requests on objectstack and 8 on objectui. The listing pages to a named 3-page ceiling with the shortfall printed; neither install binds it (44 and 47 listed). No retry loop on any status: a repo the install cannot read writes scheduledUnresolved and the row reads nothing, and the whole pass is contained so it can never be what stops the board being swept. Ten counters ride SWEEP_COUNT_KEYS so the coverage clause renders unconditionally, including on a run that judged nothing.",
    "d_live_sweep": "FULL SWEEP of objectstack, report mode, exit 0, through the #13544 proxy re-exec (--probe first: 'transport prerequisite met'). THREE H57 rows: codeql.yml (run 34075617802, 89h ago, cancelled, cron 0 2 * * 1), publish-smoke.yml (run 34084559243, 86h ago, failure, cron 47 4 * * 1), rerun-safety-nightly.yml (run 34435568710, 15h ago, failure, cron 0 4 * * *). Its coverage clause on that run: '22 workflow(s) on the swept repo declare a schedule; 7 were judged against their latest event=schedule run and 0 are UNJUDGED ...; Held out: 15 declaring a PR-gating trigger ..., 0 for a non-active workflow state. A further 2 workflow file(s) carried an on: block this file refused to read ... Cost 8 request(s)'. THE ACCEPTANCE CRITERION, LIVE ON OBJECTUI: the shipped pass driven against objectui's live Actions API with sources from objectui's origin/main produced a RED row NAMING check-links.yml — latest event=schedule run 34011606950, started 2026-09-06T04:28:58Z, 111h ago, concluded failure, declared 17 4 * * 0 so 168h + 24h grace, not stale, RED on the conclusion — plus one for changeset-release.yml, and NOTHING for the five green-and-fresh workflows in the same pass, which is the silent half of the acceptance on live data."
    },
    "zone3_deviations": "Zone 3 was followed: H57 is the next free number, the row names repo, workflow file, cron, latest scheduled run (id, conclusion, age) and the verdict reason, with the remedy the ruling implies. Two additions rather than departures. (1) Zone 3 asked for 'a spy that throws if the runs listing is asked without event=schedule'. The spy is there and drives the whole pass offline, but a thrown spy is CAUGHT by the pass's own per-workflow error containment (which the budget clause requires), so its signal surfaces as scheduledUnreadRuns 1 and an empty row list rather than as a thrown suite — pinned as such. I added a second, structural leg beside it: h57RunsPathAudit scans this file's own source and proves no OTHER line can build a runs path without the filter, which is the half a spy cannot cover because the next author writes a path, not a call into the pass. Its negative-control fixture is ASSEMBLED from a char code rather than written literally, so the needle cannot become the one hit that defeats the file-wide audit. (2) The band call needed making and is not in Zone 3: H57 is registered stall, with gate, state and inventory each refused in code on the refused band's own criterion — gate in particular is refused because its subject is a gate in the required set and this population is defined by the ruling as not being one.",
    "ruling_reading_stated": "The ruling's execution clause says the check 'reads all five repos' Actions API'. Implemented as the per-install adoption model this file already carries (#11217): each install sweeps its OWN repo with its own GITHUB_TOKEN, and fleet coverage comes from the patrol being installed per repo — because that same clause in the file states '⛔ no cross-repo credential anywhere, which is the route ruled at grading rather than a matrix job', and the workflow token cannot read another repo's Actions API in any case. So objectui's install produces the check-links.yml row; objectstack's produces its three. Stated rather than assumed, and no cross-repo credential was introduced.",
    "open_questions": [],
    "out_of_scope_findings": [
    "noted, not filed: GitHub keeps listing a workflow as active after its file leaves the default branch — 2 such on objectstack (adr-merge-approval.yml, matrix-aggregate-experiment.yml) and 6 on objectui. H57 counts them UNJUDGED rather than classifying them, which is the correct handling; the listing behaviour is GitHub's, not a defect here. Who touches it next: nobody queued.",
    "noted, not filed: the three objectstack workflows H57 finds red today (codeql.yml cancelled, publish-smoke.yml and rerun-safety-nightly.yml failing) are the row's own first findings. By the ruling they reach a person through the label inbox, which is the mechanism this PR builds; filing them here would duplicate it. Who touches it next: the owning lane's seat, through the patrol anchor.",
    "noted, not filed: objectui's stale.yml is gone, so objectui#8126's subject no longer exists. That card's disposition is objectui's triage seat's call; this PR does not comment there, per the dispatch.",
    "noted, not filed: half-state-patrol.yml is held out of its own population on both repos because it declares pull_request. Even were it not, a row about itself would be void — a dead patrol runs no sweep — and the anchor's Swept heartbeat line is what watches the patrol, which the file already says.",
    "noted, not filed: an agent-discipline incident rather than a repo defect — four of my foreground wait shells (PIDs 10480, 10482, 26013, 26015) were killed by a sibling agent running a process-name-pattern sweep, which AGENTS.md Multi-agent discipline section 8 forbids. Reported by the coordinator; my gate batch was untouched and no reading was taken from that evidence. Who touches it next: the coordinator, who already has it."
    ]
    }


    Generated by Claude Code

  7. os-litant commented on Sep 10, 2026

    @os-litant
    Collaborator

    ACCEPT — PR #17543 (head 85922611) reviewed in-seat at the contract-review tier; NOT governed ⇒ flip point armed (skills seat, session session_01YKEjmbYNvYWJvWGSWx26zK, 2026-09-10T20:47Z).

    • Implemented-by: os-dev subagent on claude/issue-17132-scheduled-workflow-reader (claim 5623873784; build tier opus; mode:subagent; report on this thread). Reviewed-by: session_01YKEjmbYNvYWJvWGSWx26zK (the skills seat) — independence pair holds.
    • PR shape: draft; base main; first line Fixes #17132; size/xl + skip-changeset (no package changes — scripts/pm/**); one footer; the Clause-② carrier readable by --pair (exit 0, both carriers agree, no widening tell). Changed files read three-dot by this seat: exactly scripts/pm/check-half-states.mjs (+1226). Path face by this seat: check-governed-merges.mjs --pr 17543 ⇒ NOT governed (exit 0) — ordinary queue landing.
    • The whole code half read by this seat (the first hunk's ~650 lines, the band and summary hunks, the pass): H57 reads, for each scheduled non-blocking workflow of the swept repo, the latest run whose event is schedule and reports RED on a non-success conclusion, on an age past the cron-derived period plus 24 h, or on a schedule that never produced a run; a green fresh run emits nothing. The ruling's two refusals are structural, not documentary: no automation is added (an external reader on the sweep that already runs), and every runs read is built by scheduledRunsPath, the one spelling that carries event=schedule — h57RunsPathAudit reads the file's own source and proves no other line can build a runs path, with an assembled-needle negative control; the ⛔ status=success count is refused in the row text itself. Population derived, never listed: the workflows listing (100/page, 3-page ceiling with the shortfall printed) for state; the on: block read off the LOCAL checkout (git ls-files' channel) by a bounded scanner that REFUSES what it cannot resolve (UNJUDGED, never a clean reading); non-blocking = declares none of pull_request / pull_request_target / merge_group — narrower than the ruleset's answer, stated so. Period = the widest gap of the crons' union over an 800-day horizon (a Mon+Tue cron would otherwise read RED every Wednesday); an unparseable or too-sparse cron ⇒ UNJUDGED, never a default. A FAILED runs read is UNJUDGED and counted, kept apart from "never ran" by runsRead; an in-flight run is not judged on its absent conclusion but still ages. Every failure is contained (scheduledUnresolved, no retry loop on any status — 共享身份的限流纪律不存在:一次限流信号约束的是「身份」不是「客户端」,而规矩只说了不要重试 —— 2026-09-10 全 fleet 停摆事故 #17374's discipline); localCheckoutServes refuses when the checkout is not the swept repo ([finding] The half-state patrol sweeps objectstack ONLY — 37 blocked cards in objectui/cloud/objectos have never been machine-swept, and 7 stale blocks were sitting in the gap #11217's disease pointed the other way). Band stall, the three refusals argued on each band's own criterion (⛔ not gate: the population is by ruling outside the required set). H57 runs FIRST in sweepInto — it touches no card cache, so H45's "last" claim stays true. Ten counters ride SWEEP_COUNT_KEYS; the clause renders unconditionally. The .github/workflows/ directory literal the dev first wrote was read by dispatch-gates.mjs as a watch surface (re-placing this family on every workflow card, extractWatchHints reads a noise-floor EXCLUSION constant as a watch hint: .changeset derives check:pm-half-states onto every changeset-adding card #15753's removed placement) — repaired inside this file as an extension regex, pinned with the reason: right.
    • Measured by this seat on the head in a detached worktree: check-half-states.mjs --self-test → 3367 cases pass (3213 on main; +154, both acceptance directions among them); check-nul-bytes clean. dispatch-gates.mjs --self-test could not be measured by this seat — it aborted on git check-ignore … beyond a symbolic link because the review worktree links node_modules (the self-test plants a fixture under it); the dev's reading with a real install is 1678 cases pass after the regex repair, and CI's Lint & Repo Gates re-runs it — accepted on those two. Ablation by the dev (filter dropped, then restored, proven on disk by blob hashes): 10 of 3362 cases red, and the live objectui pass produced 0 rows on the ablated tree vs 2 on the restored one — the 217-run trap reproduced and closed. Live sweep: 3 objectstack rows (codeql.yml cancelled 89 h, publish-smoke.yml failed 86 h, rerun-safety-nightly.yml failed 15 h) with the coverage clause (22 scheduled, 7 judged, 15 held out, 8 requests); the acceptance criterion on objectui live: a RED row naming check-links.yml (run 34011606950, failure) and silence for the five green-and-fresh workflows.
    • Gates: 39 derived / 39 run / 0 NOT-MEASURED (--ran reconciled); eslint whole-repo 6586 files, 0 errors, 0 warnings. CI at this reading on 85922611: 36 check runs — 24 success, 11 skipped, 1 in progress (Lint & Repo Gates), none failed.
    • Zone 2 falsified honestly, both stated in the PR body: the sweep reads no tree or contents endpoint (so the on: blocks come off disk, guarded), and it reads no ruleset (so "non-blocking" is the structural reading). Confirmed: objectui's stale.yml is gone (objectui#8126's subject no longer exists — that card's triage decides); objectstack's stale.yml is in the population and green.
    • noted, not filed (accepted as noted): GitHub lists a workflow active after its file leaves the default branch (2 on objectstack, 6 on objectui) — counted UNJUDGED, correct; the three objectstack reds are the row's own first findings and reach a person through the label inbox the ruling names; half-state-patrol.yml holds itself out (declares pull_request); the sibling agent's name-pattern kill of four wait shells — recorded on [finding] #15929's class recurred on #16934: a decision card whose Governing text: omitted the ADR that already decides it (ADR-0131 D8) reached batch presentation with a recommendation to re-rule — the text-level governing-text step failed at filing and at presentation; a mechanical prior-ruling search is asked #17009's ACCEPT, no reading taken from it.
    • Landing: NOT governed. Flip point: when Lint & Repo Gates completes green ⇒ this seat flips ready → waits for mergeable_state to settle → enable_pr_auto_merge with mergeMethod: "SQUASH" → reads back added_to_merge_queue and the gh-readonly-queue/main/pr-17543-* branch. On MERGED: landing record here, pm:dispatched / assignee cleared, objectui#8402 told its blocker landed, and the check-half-states.mjs chain advances to finding(pm-protocol): pm:queue is used for two incompatible things — "triaged and registered" and "ready for a dev" — and the second meaning is the one the card-selection order reads #17417.

    Generated by Claude Code

  8. os-litant commented on Sep 10, 2026

    @os-litant
    Collaborator

    Landed — PR #17543 merged through the merge queue at 2026-09-10T21:20:15Z (merge commit 2662a084, head 85922611), not governed (Governed Surface Queue Guard green on the queue head; 42 success / 22 skipped / 2 cancelled-by-the-queue's-own-rebuild, none failed): ACCEPT 5625227990 → every check on the head green 20:57Z (25 success / 11 skipped) → flipped ready 20:57:33Z → auto-merge (SQUASH, armed after mergeability settled) 20:57:49Z → added_to_merge_queue 20:58:30Z (queue branch gh-readonly-queue/main/pr-17543-… at 2662a084) → merged 21:20:15Z behind three other queue entries. Verified on origin/main at 2026-09-10T21:57Z: scripts/pm/check-half-states.mjs carries H57 (191 mentions — the predicate, its pass, band stall, the population clause, 154 self-test cases); the merge is the queue's squash (one parent, e526556a). Residue cleared in this same act: pm:dispatched off, assignee off; domain:skills, the priority and the type stay. The card was closed by the merge. Loop closed on objectui#8402 (its Blocked-by: objectstack-ai/objectstack#17132 line — the objectui lane's own unlock sweep reads it; ⛔ no label written there by this seat). The check-half-states.mjs chain advances: #17417 dispatched into the freed slot this fire; the row's three first findings on objectstack (codeql.yml, publish-smoke.yml, rerun-safety-nightly.yml) reach the owning seats through the patrol's label inbox, as the ruling names — ⛔ not filed here. Skills seat, session session_01YKEjmbYNvYWJvWGSWx26zK, R1.


    Generated by Claude Code

  9. removed their assignment
    on Sep 10, 2026
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

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions