Skip to content

docs(pm-dispatch): backlog sweep predicate ① is a per-round stock query, never a changed-since frontier - #8638

Closed
hotlong wants to merge 1 commit into
mainfrom
claude/issue-8561-sweep-stock-query
Closed

docs(pm-dispatch): backlog sweep predicate ① is a per-round stock query, never a changed-since frontier#8638
hotlong wants to merge 1 commit into
mainfrom
claude/issue-8561-sweep-stock-query

Conversation

@hotlong

Copy link
Copy Markdown
Contributor

Fixes#8561

What

Rewrites the Backlog sweep paragraph in .claude/skills/pm-dispatch/SKILL.md (the 分诊座位职责 section): predicate ① (fully bare cards — no pm:*, no needs-user-decision, no domain:*) is now answered by a per-round stock query — one list_issues over all open cards with minimal fields, filtered locally for cards matching ① — and never by a "changed since last round" frontier. The frontier explicitly stays for shapes ② and ③, which the protocol already time-gates.

Why (the self-blinding mechanism, now stated in the text)

An untouched card's updated_at never advances. A changed-since frontier is therefore structurally blind to exactly the cards predicate ① exists to catch: once a bare card slips past the round covering its creation it never re-enters any later frontier — and the failure is symptom-free, because every subsequent brief truthfully reports the frontier clean (two bare cards measured to sit invisible for ~8 hours across ~8 healthy rounds). The reason is kept in the text compactly because reasons prevent regression.

Net-zero accounting (686/686, headroom 0)

The file stays at exactly 686 lines; the ratchet reads 686/686. Funding is line-by-line inside the paragraph: 4 lines replaced by 4 lines (+4/-4), the new rule paid for by lengthening the four rewritten lines (~190–217 bytes each vs the paragraph's previous ~130-byte wrap; the same paragraph already carried a 189-byte line). Every surrounding line is byte-identical; no references files touched (owned by parallel cards this round).

  • old L251 → new L251: predicate-list tail, unchanged + the new bold rule opener (stock query, never a frontier)
  • old L252 → new L252: the query shape (one list_issues, all open cards, minimal fields, local filter) + the mechanism (updated_at never advances; the blindness is symptom-free)
  • old L253 → new L253: frontier scoped to ②③ + the preserved ~2-minute time-gate sentence and its half-annotated-cards rationale
  • old L254 → new L254: preserved exclusions and volume-cap sentence + the untouched emergency-triage block opener

Verification (all local, all green)

Gate families named at dispatch AND re-derived from the actual diff via node scripts/pm/dispatch-gates.mjs .claude/skills/pm-dispatch/SKILL.md — the two lists agree; no additional family surfaced:

  • pnpm check:doc-authoring — 377 files clean
  • pnpm --filter @objectstack/lint run check:doc-formula-expressions — clean (after building @objectstack/formula in the fresh worktree; the first run was a missing-dist false red, not a finding)
  • pnpm check:nul-bytes — 7770 text files clean
  • pnpm check:pm-skill-id-lint — 9 files clean (no issue-ID citations added)
  • pnpm check:pm-skill-ratchet — 686 lines (ceiling 686; headroom 0)
  • pnpm check:skill-frame-sync — 4 copies structurally isomorphic

Merge path

Per the dispatch ruling this PR stays draft — the maintainer merges by hand (or per-PR authorizes). Ready is never flipped and auto-merge is never armed by this session.


Generated by Claude Code

…stock query, never a changed-since frontier
A frontier defined as 'changed since the last round' is structurally blind
to exactly the cards predicate ① (fully bare) exists for: an untouched
card's updated_at never advances, so once it slips past its creation round
it never re-enters any later frontier, and every subsequent brief truthfully
reports the frontier clean. Predicate ① is now answered by a per-round
stock query (one list_issues over all open cards, minimal fields, filtered
locally); the frontier stays for shapes ② and ③, which are already
time-gated. Net-zero on SKILL.md (686/686): four lines rewritten in place.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_018WuTtyckQa1VcXwgd52JpN
@vercel

vercelBot commented Aug 14, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

1 Skipped Deployment
ProjectDeploymentActionsUpdated (UTC)
objectstackIgnoredIgnoredAug 14, 2026 4:42am

Request Review

@hotlonghotlong added the skip-changeset PR has no user-facing published change; bypasses the changeset gate label Aug 14, 2026 — with Claude
@github-actionsgithub-actionsBot added the documentation Improvements or additions to documentation label Aug 14, 2026
@hotlongClaude

Copy link
Copy Markdown
ContributorAuthor

Review: ACCEPT — PM seat, session 018WuTtyckQa1VcXwgd52JpN. Stays draft for human merge (SKILL.md is fable-mandatory surface; dispatched at fable). Auto-merge not armed, not queued.

Substance

  • Net-zero independently verified. This seat fetched the PR head and counted: .claude/skills/pm-dispatch/SKILL.md is exactly 686 lines — ceiling 686, headroom 0 preserved. The diff is +4/−4 inside one paragraph with byte-identical surroundings, funded line-by-line in the PR body as the ratchet demands.
  • The rewrite says the right thing and says why. Predicate ① (fully bare cards) is answered by a per-round stock query — one list_issues over all open cards, minimal fields, local filter — and the mechanism is stated compactly: an untouched card's updated_at never advances, so a changed-since frontier is structurally blind to exactly the cards ① exists to catch, and the blindness is symptom-free (every brief truthfully reports the frontier clean). Keeping the reason in the text is what prevents a future edit from "simplifying" this back into the bug.
  • The frontier's remaining scope is mechanically sound. Shapes ② and ③ are produced by label writes, and a label write advances updated_at — so a frontier read genuinely catches them. The ~2-minute time-gate and its half-annotated-cards rationale survive verbatim, as do the exclusions, the volume cap, and the emergency-triage block.
  • Reasonableness (three axes): the starvation is measured, not hypothetical (bare cards sitting invisible ~8 hours across ~8 healthy rounds); a stock query over open cards at minimal fields is cheap and scales with backlog size, not with history (platform fit); and the ⛔-marked rule plus the named symptom-free failure mode is exactly the shape that stops a future seat from reasoning itself back into the frontier (error prevention). Proportionate: the smallest diff that closes the gap, with no references-file riders — correctly, since those files are owned by parallel cards this round.

Local gates: all six named families green in the dev's run, and the load-bearing one (the ratchet) re-verified here at the current head. These families don't run in CI, so the local union is the governing signal — the union-HEAD binding contract in the sibling PR is not applied retroactively; the reviewer's own count covers the gap for this diff. CI at review time: completed checks green or skipped.


Generated by Claude Code

@hotlongClaude

Copy link
Copy Markdown
ContributorAuthor

Closed unmerged on maintainer ruling (2026-08-14, verbatim, untranslated): 「8561 作废, 8638 关闭」. Card #8561 closed as not planned under the same ruling. SKILL.md keeps its current main text (686/686, unchanged by this PR).


Generated by Claude Code

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

Labels

documentationImprovements or additions to documentationsize/xsskip-changesetPR has no user-facing published change; bypasses the changeset gate

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[finding] A frontier-based backlog sweep never revisits an untouched card — two bare cards sat invisible for ~8 hours across ~8 triage rounds

2 participants

@hotlong@claude