Skip to content

pm-dispatch references: platform-facts sweep — five measured deliverables across four member cards #8455

Description

@hotlong

Filed by the skills seat (session session_018WuTtyckQa1VcXwgd52JpN) under this shift's maintainer grant (2026-08-13, verbatim, untranslated: 「集中处理skills车道中的所有任务,包括分诊和集中开卡你都可以处理。」). Sweep-promotion of four graded findings plus one absorbed item, all hitting the same criterion: a measured platform/process fact whose deliverable is a self-contained row/line in .claude/skills/pm-dispatch/references/** — no SKILL.md lines, no code. Per the sweep rule: this card is the claim target; member cards keep their labels but are not separately dispatchable while this card is open.

Members and itemized deliverables (落点 | content)

  1. PM gate-reading does not pin the run to the PR's CURRENT head — a cancelled run on a superseded head gets rerun, burning a heavyweight cycle and producing a false red #8434 — references/review-checklist.md: two clauses — (a) pin every gate reading to the PR's CURRENT head: read pulls/{n}.head.sha first; a run whose head_sha differs is a reading about a dead commit — neither its green nor its red counts, in either direction; (b) never rerun a run on a superseded head: a cancelled conclusion on a non-current head needs no action at all — the newer push already has its own runs. Plus one references/platform-readings.md row: cheap sibling workflows success + heavyweight carrier cancelled on the same head is the expected signature of ordinary supersession (siblings finish in seconds, carriers take 10–15 min), not evidence of selective failure.
  2. [finding] list_issues returns no assignee field, so a lane inventory cannot tell a claimed card from a free one — add to the platform-readings trap table #8374 — references/platform-readings.md row: list_issues never returns assignees (no such fields member; absent from the response either way), so a lane listing cannot distinguish a claimed card from a free one — a listing is a shortlist, and every entry needs a full issue_read before it can be claimed.
  3. [finding] GitHub MCP issue_read returns HTML-entity-escaped bodies (' / "), so a body round-trip (read → edit → write) from an MCP-backed seat risks corrupting the original text #8272 — references/platform-readings.md row: MCP issue_read bodies are HTML-entity-escaped while comments come back raw; a body round-trip via issue_write is unsafe from MCP-backed seats — machine-greppable lines (e.g. the blocked-by reverse index) may live in comments instead, so unlock scans must read comments too, and any body rewrite should be verified against the raw body via REST first.
  4. finding: a dev session is invisible across GitHub accounts, so archive_session / probe / poke are all unavailable to a successor seat — the hand-off checklist asks for something the successor cannot do #8187 — references/dispatch-runbook.md, extending the existing "SendMessage 直投 not-reachable 是设计而非故障" line: session handles are account-scoped — get_session / archive_session / the trigger-poke route all answer not found for another account's session, and that answer is never a death signal. Plus references/seat-post-protocol.md 退场收尾清单: the outgoing PM archives its own dev sessions before standing down; if a session must be left running, the seat post says so and marks the archive obligation non-transferable.
  5. [finding] Three mechanizable items from a 16-hour spec-lane shift: os-dev's background-wait stall (6 instances), the verify-lock convention devs invented, and enable_pr_auto_merge's silent no-op #8294 item 3 only — references/platform-readings.md rows: (a) enable_pr_auto_merge without an explicit mergeMethod: "SQUASH" is a silent no-op on this repo — it falls back to the forbidden merge-commit method; the echo's empty method: field is the failure signal; (b) measured data points worth a line each: single-container heavy-verify concurrency sweet spot ≈3; merge-queue landing latency ~15–30 min per PR, serialized. Items 1–2 of [finding] Three mechanizable items from a 16-hour spec-lane shift: os-dev's background-wait stall (6 instances), the verify-lock convention devs invented, and enable_pr_auto_merge's silent no-op #8294 are absorbed elsewhere (the os-dev role-file card) — ⛔ this PR must NOT close [finding] Three mechanizable items from a 16-hour spec-lane shift: os-dev's background-wait stall (6 instances), the verify-lock convention devs invented, and enable_pr_auto_merge's silent no-op #8294; reference it in prose only, never in a closing position, and do not create a development link to it.

Constraints

  • File surface: .claude/skills/pm-dispatch/references/** ONLY. ⛔ No SKILL.md edits (line ratchet untouched). Rows land in the existing table/rule style, self-contained, ⛔ no issue-number references in the operational text (check:pm-skill-id-lint).
  • Serial: references/dispatch-runbook.md is held by the dispatch-strategy card's in-flight work — this sweep dispatches after that PR lands and rebases over it.
  • Model: claude-fable-5 mandatory (pm-dispatch skill root); the 2026-08-13 quota-exhaustion exemption applies (floor opus, downgrade + reason recorded in the claim comment).
  • Merge path: ADR-class three-piece — draft PR, ⛔ no auto-merge / queue / ready-flip by any AI seat; the maintainer lands it by hand.
  • PR first line: Fixes #8434, Fixes #8374, Fixes #8272, Fixes #8187 (all four fully delivered here). The PR body carries the per-member 落点|before|after list (sweep five-condition rule).

Activity

  1. added theissue type on Aug 13, 2026
  2. hotlong commented on Aug 13, 2026

    @hotlong
    ContributorAuthor

    Evidence refinement for member item 5's enable_pr_auto_merge row, measured live this shift (2026-08-13 ~14:29–14:30Z, two attempts): passing an explicit mergeMethod: "SQUASH" on this repo still echoes (method: MERGE, …) — the parameter is coerced/overridden, most plausibly by the merge queue governing main (whose landed history is one commit per PR regardless). The row's wording should therefore anchor on the failure signal, not the method name: an empty method: in the echo is the silent-no-op signal; a non-empty echo (even MERGE) has landed PRs on this repo through the queue. Keep the "always pass an explicit mergeMethod" instruction, but do not assert the echo will read back SQUASH — the implementing dev should fold this into the same row.


    Generated by Claude Code

  3. hotlong commented on Aug 13, 2026

    @hotlong
    ContributorAuthor

    Scope amendment (member item 6 added) — from the Part-of/auto-close investigation card's grading: the protocol fallback half of that card (make "re-pull the lane inventory after every merge and diff it against the expected state" an explicit post-merge step where the landing text lives, i.e. references/landing-operations.md) moves INTO this sweep. Reason: that one line is .claude/skills/pm-dispatch/** text and therefore under the fable-mandatory clause — it rides this sweep's fable dispatch instead of upgrading a whole investigation card's model for one sentence. The step is justified by the measured incident alone (it is what caught the wrongly-closed card), independent of what the mechanism investigation concludes. The investigation card itself stays scoped to the timeline-mechanism read + the scripts/pm/check-half-states.mjs contradiction guard, on opus.


    Generated by Claude Code

  4. hotlong commented on Aug 13, 2026

    @hotlong
    ContributorAuthor

    Scope amendment (member item 7 added) — from the Part-of/auto-close investigation's ACCEPT: the author-side keyword-hygiene rule, one deliverable in references/review-checklist.md's PR-shape section (beside the existing Fixes-vs-Part of first-line rule): GitHub's closing-keyword parser binds close/fix/resolve (+inflections, but NOT gerunds) to a #N on the same line and ignores all surrounding prose — negations, modals, and warnings included; the sentence written to prevent an auto-close is exactly what performed one. Therefore: ⛔ never put a closing keyword next to another open card's number in a PR body; write "card N is not addressed here" / "out of scope: card N", or put the keyword in backticks (measured: code spans do not fire). Reviewers check the PR body for this shape before ready-flip on any Part of PR; a report-only detector for the contradiction also patrols it.

    Evidence and phrasing source: the mechanism record now in scripts/pm/check-half-states.mjs's header (four live readings) — the implementing dev should keep the reference row self-contained per the id-lint rule.


    Generated by Claude Code

  5. self-assigned this
    on Aug 13, 2026
  6. hotlong commented on Aug 13, 2026

    @hotlong
    ContributorAuthor

    Claim: PM loop round 3
    Session: session_018WuTtyckQa1VcXwgd52JpN
    Branch: claude/issue-8455-references-facts-sweep
    Worktree: objectstack-issue-8455
    Domain: domain:skills
    File surface: .claude/skills/pm-dispatch/references/** ONLY — expected: platform-readings.md, review-checklist.md, dispatch-runbook.md, seat-post-protocol.md, landing-operations.md (stop on breach; explain in the report). ⛔ SKILL.md is held by the parallel Model-tiering card — zero SKILL.md lines from this card.
    Container & model: M, mode:subagent, model: claude-fable-5 (mandatory — pm-dispatch skill root; quota exemption per the standing ruling if the wall is measured, recorded here)
    Serial constraints cleared: dispatch-runbook.md freed — its holder PR merged to main at ff1e9b6 (this branch bases on it, so the four-rulings sections are already present; extend, don't collide); no other in-flight claim on references/** (lane inventory + per-card reads current as of this round).

    Deliverable enumeration for the dev: body items 1–5 plus the two scope-amendment comments on this card (auto-merge echo refinement; author-side keyword-hygiene rule → review-checklist) plus the post-merge lane-inventory re-pull step (→ landing-operations.md, from the Part-of incident — it is the step that caught the silent close). One more evidence point measured minutes ago for the echo row: on the merge-queue path the echo can be empty while the enqueued timeline event fires and the PR lands — the row should anchor on queue membership/timeline as the authoritative signal and treat the echo as unreliable in both directions.


    Generated by Claude Code

  7. hotlong commented on Aug 13, 2026

    @hotlong
    ContributorAuthor
    {
      "issue": 8455,
      "status": "done",
      "branch": "claude/issue-8455-references-facts-sweep",
      "pr": "https://github.com/objectstack-ai/objectstack/pull/8490",
      "premise_still_valid": true,
      "summary": "All seven deliverables (body items 1-5 + two scope amendments + the claim's lane-inventory step) landed as self-contained reading rules across exactly the five expected references files; zero SKILL.md lines. Per-member premise checks: all seven facts were absent from origin/main, with one partial-overlap note — the closing-keyword mechanism section already existed in platform-readings (negation trap + body-vs-commit dual parse), so the keyword-hygiene deliverable landed as the new reviewer clause in review-checklist plus a three-fact extension (same-line binding, gerunds excluded, inline code spans safe / fences unmeasured) of that existing row rather than a duplicate row. The echo row anchors per the amendments: explicit mergeMethod always, echo unreliable in both directions, timeline events + MERGED authoritative. PR body verified through the detector branch's h7PartOfWithClosingKeyword/closingKeywordTargets before opening: only the four member cards bind to closing keywords; the sweep card, the absorbed-item card and the investigation card are clean and remain open. skip-changeset applied via read-then-union (bots' documentation + size/s preserved) and read back: [documentation, size/s, skip-changeset]. PR stays draft per the ADR-class merge path.",
      "tests": "Six named gate families, foreground under flock /tmp/os-heavy-verify.lock: check:doc-authoring exit=0, check:nul-bytes exit=0, check:pm-skill-id-lint exit=0, check:pm-skill-ratchet exit=0, check:skill-frame-sync exit=0; check:doc-formula-expressions first run exit=1 (ERR_MODULE_NOT_FOUND @objectstack/formula/dist — fresh-worktree unbuilt deps, the known false red), exit=0 after pnpm --filter '@objectstack/lint^...' build. Re-derivation per contract: node scripts/pm/dispatch-gates.mjs over the five changed paths returned exactly the six named families — no additions beyond the prompt's list. Ratchet non-applicability verified by reading check-skill-line-ratchet.mjs (SKILL_PATH targets SKILL.md only).",
      "open_questions": [],
      "out_of_scope_findings": []
    }

    GitHub-write posture note: this container is MCP-only (REST rejected with a GitHub-App notice, no gh CLI), so the skip-changeset append used issue_write whole-set replace after reading the live label set — read-back confirms nothing was stripped.


    Generated by Claude Code


    Generated by Claude Code

  8. hotlong commented on Aug 13, 2026

    @hotlong
    ContributorAuthor

    Review: ACCEPT — reviewer of record: skills seat, session session_018WuTtyckQa1VcXwgd52JpN. PR #8490 reviewed hunk-by-hunk (5 references files, +63/−3, zero SKILL.md lines — surface verified against the claim).

    • All seven deliverables land as reading rules in each file's own idiom, each anchored on the failure signal: head-pinning + never-rerun-superseded (review-checklist) with the both-directions accounting rule; the supersession signature row; list_issues-is-a-shortlist; entity-escaped bodies + in:comments unlock-scan consequence; account-scoped session handles (runbook) + the non-transferable archive step ⑥ʹ (seat-post-protocol) — including the sharp line that a cross-account not found is indistinguishable from "never existed" and never a death signal; the echo row rewritten to "unreliable in both directions, authoritative = queue timeline events + MERGED" with both measured instances; the two throughput data points; the post-merge inventory-diff landing step with the correct complementarity note (per-card read needs a list, inventory diff needs none — and it is what caught the incident); and the keyword-hygiene reviewer clause beside the first-line rule, with the three measured parser boundaries extending the existing row rather than duplicating it — the right call, checked against the file.
    • Discipline: dispatch's six families green foreground under the lock (fresh-worktree false red correctly identified and re-run); re-derivation exact; ratchet non-applicability verified by reading the script, not assumed; PR body passed the H7 predicate before opening with only the four member cards bound to closing keywords; labels applied by read-then-union.
    • 综合分析: every row is a this-week measured fact that already cost a round somewhere; the sweep shape amortizes one fable run across seven deliverables; and the rows are written as machine-checkable reading rules, not advice — the AI-error-resistance axis satisfied by construction.

    Terminal state: ADR-class. PR #8490 stays a visibly-open draft for the maintainer's hand-merge. On merge: members #8434 / #8374 / #8272 / #8187 close via the Fixes lines; the seat then closes #8294 by hand (items 1–2 landed via the role-file PR already on main; item 3 lands here) and #8293 by hand (its detector is in the merge queue; its author-side rule lands here) — with links, per each card's split record.


    Generated by Claude Code

  9. hotlong commented on Aug 14, 2026

    @hotlong
    ContributorAuthor

    Closed as delivered (skills seat, session session_018WuTtyckQa1VcXwgd52JpN, deliberate close — the sweep PR's Fixes lines named the four member cards, not this claim-target card): all seven deliverables landed on main via the sweep PR merged 00:35Z. Members #8434 / #8374 / #8272 / #8187 closed by its Fixes lines; the two absorbed split-halves (#8294 item 3; the Part-of investigation's author-rule) are recorded on their own cards. pm:dispatched removed in the same action.


    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