Skip to content

pm-dispatch: a dispatched ! (breaking) change carries a full dogfood battery run in its dev report before it is armed — push CI and the merge queue test only touched packages; two 18.x steps reddened the hourly battery (#24780, #24879) #24890

Open

Description

@objectstack-fleet

Filing gate ③: a task the maintainer set (「如何避免类似的问题」, then 「立卡」). Filed by the triage seat (#6015, session_01AavokzJ5DndAwitDXvKy4U). ⛔ Not a claim.

Reader (who acts): the domain:skills seat, in one PR on .claude/skills/pm-dispatch/** (and .claude/agents/os-dev.md if the report shape lives there). It is a governed surface, so it lands the way its tier allows. ⛔ No CI or workflow change, no new gate: a process line and a report field.

Measured

Done when

  • For a card whose PR title carries !, or whose changeset declares Clause-②: yes (narrowing), the dispatch contract requires the dev to run the full dogfood battery (pnpm --filter @objectstack/dogfood test) on the PR head. The report records the result (pass count / failures) before the PR is armed.
  • A red result is fixed in the same PR when the failure is the change's own consequence (a stale fixture). Otherwise it is reported. ⛔ Never skipped or narrowed.
  • The rule is stated once, where the dispatch contract lives, and the review checklist reads the field.

Dedupe

objectstack issues since 2026-09-20 were grepped for "full dogfood" near breaking / !, and for "push CI … only the packages". No hit. #24780 and #24879 are the instances, not the rule. New.


Generated by Claude Code

Activity

  1. objectstack-fleet commented on Oct 20, 2026

    @objectstack-fleet
    ContributorAuthor

    Claim: PM loop round 1
    Session: session_01M82feuetLzrCiBz41BJb7L
    Account: huangyiirene
    Branch: claude/issue-24890-breaking-dogfood-battery
    Worktree: objectstack-issue-24890
    Domain: domain:skills
    Seat: domain:skills#1
    File surface: .claude/agents/os-dev.md, .claude/skills/pm-dispatch/references/review-checklist.md; .claude/skills/pm-dispatch/references/execution-duties.md or dispatch-runbook.md only if the dispatch-side line must live there (stop on breach; explain in the report)
    Container & model: M, mode:subagent, model: CONTRACT_REVIEW_TIER (dispatch-gates --tier .claude/agents/os-dev.md .claude/skills/pm-dispatch/references/review-checklist.md: "Model tier — MANDATORY: claude-fable-5-1 (derived from the file surface, not recalled)"; .claude/agents/os-dev.md is a protocol semantic surface, clause ①)
    Clause-②: no
    Responsibility: n/a — not a defect card
    Thread-read: none
    Serial constraints cleared: none — the lane's other pm:dispatched cards are #24812 (.claude/hooks/**), #24849 (scripts/pm/check-expected-skips.mjs) and #24823 (docs/adr/0123-…), all disjoint; of the 17 open PRs (file lists read 2026-10-20T13:45Z), only this seat's PR #24886 and PR #24892 touch .claude/** or scripts/pm/**, on those disjoint files

    Landing path: .claude/** is Tier S governed text, so it needs an at-tier contract review record on the head and the seat's ACCEPT; then the seat lands it. Ratchets at dispatch: os-dev.md 404/404 and review-checklist.md 77/77, headroom 0 on both, so every added line is paid by a deletion. Posted 2026-10-20T13:46Z.


    Generated by Claude Code

  2. objectstack-fleet commented on Oct 20, 2026

    @objectstack-fleet
    ContributorAuthor

    os-dev-report

    {
      "issue": 24890,
      "status": "done",
      "branch": "claude/issue-24890-breaking-dogfood-battery",
      "pr": "https://github.com/objectstack-ai/objectstack/pull/24917",
      "session": "session_01M82feuetLzrCiBz41BJb7L",
      "premise_still_valid": true,
      "summary": "The trigger-less clause in .claude/agents/os-dev.md (「dogfood 只在终 head 跑一次」, from commit b8762c089) is extended in place into the rule the card orders: a PR whose title carries `!`, or whose `Clause-②:` line carries the `(narrowing)` arm (either value — H1 correction: `yes (narrowing)` and `no (narrowing)` are both legal, the arm is what marks breaking, per clause2-line.mjs and record-recognisers.mjs), runs the full dogfood battery once on its final head with the CI-equivalent command (closure build, then the unsharded `pnpm --filter @objectstack/dogfood test` under the verify lock), fixes a red that is its own stale fixture in the same PR and reports any other red, never skips or narrows, and records the result in a new `dogfood_battery` report field; L88 is generalised so the nohup + tail --pid form covers every run longer than the foreground cap. review-checklist.md 〈测试与门禁证据〉 reads the field before ready / auto-merge / queue. Both ratchets stay at 404/404 and 77/77; every added line is paid by deleting a non-rule line, each named in the PR body with where its content still lives. No CI, workflow, gate or script changes; landing-operations.md, execution-duties.md and dispatch-runbook.md untouched (H5: the checklist's last block is already the seat's pre-arm read).",
      "tests": "No package touched, so no package test or typecheck is owed and none was run; no test-pinned behaviour changed, so no ablation. Measurements behind the rule, all at a8b44d407: packages/qa/dogfood `npx vitest list --filesOnly` → 287 files (265 `*.dogfood.test.ts`), `find -name '*.test.ts'` → 287; vitest.config.ts `shard: process.env.OS_TEST_SHARD` is the only shard mechanism and ci.yml's dogfood job runs the same `test` script (`vitest run`) with `OS_TEST_SHARD=n/3`, so the plain command is the union of the three CI shards; `vitest list` printed 287 under each of OS_TEST_SHARD=1/3, 2/3, 3/3 (listing is not sharded). Line widths of the added prose lines: 119 / 120 / 119 / 118 bytes against the 120-byte cap; the JSON template line is in a fence, which the cap exempts.",
      "gates": "Local subset at bd8baf269 (tree clean), every exit captured before any pipe, each command exactly as `dispatch-gates --commands --repo objectstack-ai/objectstack` printed it (no paths; the 21 derived commands equal the dispatch brief's lead): check-closing-keyword-parity 0 (+ --self-test 0) · check-comment-mask-corpus 0 (9691 files, 0 disagree) · check-governed-queue-guard --self-test 0 (322 cases) · check-harness-current --self-test 0 (26 cases) · check:doc-formula-expressions 0 (first attempt exit 3 PREREQUISITE NOT MET, formula/lint unbuilt — built under the verify lock, VERDICT command-exit 0, held 2s, re-run: 23 examples across 476 files clean) · check:agent-model-declared 0 · check:agent-test-spelling 0 (0 violations, 14 separators judged) · check:commit-card-trailers 0 · check:cross-package-test-inputs 0 · check:doc-authoring 0 · check:driver-memory-census 0 · check:gitlink-declared 0 · check:nul-bytes 0 (11479 files, no control bytes) · check:pm-governed-merges 0 · check:pm-skill-id-lint 0 (87 files clean) · check:pm-skill-ratchet 0 (os-dev.md 404 lines, ceiling 404, headroom 0; review-checklist.md 77 lines, ceiling 77, headroom 0) · check:refd-timer-probe 0 · check:required-contexts 0 · check:skill-frame-sync 0 · check:watch-hint-literal 0. `dispatch-gates --ran ran.list --repo objectstack-ai/objectstack` → exit 0: 21 derived, 21 run, 0 NOT-MEASURED, 0 UNRUN. CI check-runs on head bd8baf269 as read at report time: completed/success — filter, Check Changeset, Check PR Size, Part-of PR must not also close its card, The card this PR closes must claim this branch, No other open PR may claim the same issue, No other open PR may claim the same single-writer path, Check Documentation Links; in_progress — Lint · ESLint, Lint · docs & code guards, Lint · repo & tooling gates, Lint · CI release & engine gates, Lint · PM dispatch-gates, Lint · scoped (3), Type Check · workspace / source gates / consumer gates / debt ledger, Test Core, Governed Surface Queue Guard, Dogfood Regression Gate (aggregator), Auto Label; completed/skipped — Dogfood Regression Gate (matrix shards), Dogfood Verify CLI, Console Pin Gate, Temporal Conformance, Build Core, Build Docs, opt-in harnesses. Local-only families (check:dev-prereqs, check:skill-frame-freshness) not owed: no packages/spec build, no four-axis frame file touched.",
      "dogfood_battery": "n/a — no `!` in the PR title and no (narrowing) arm (the claim's line is `Clause-②: no`, no arm)",
      "mcp_calls": "0 — no MCP GitHub tool was called",
      "api_writes": "4 REST writes in 2 relay strokes, both as objectstack-fleet[bot] through scripts/pm/fleet-write/dispatch.mjs: stroke fw-20261020T141217Z-f78d08 pr_create = POST /repos/objectstack-ai/objectstack/pulls (draft forced), POST /repos/objectstack-ai/objectstack/issues/24917/assignees (huangyiirene), POST /repos/objectstack-ai/objectstack/issues/24917/labels (skip-changeset) — read-back 14167 bytes sent, 14167 stored, identical; labels read back over REST: skip-changeset present (size/s added by the size labeler, not by me); this stroke = POST /repos/objectstack-ai/objectstack/issues/24890/comments. Two `git push` of the branch (not REST). Reads: GET issue 24890 + comments, GET pull 24917, GET check-runs on bd8baf269, one dry-run per stroke (sends nothing).",
      "line_budget": ".claude/agents/os-dev.md 404 → 404 (ceiling 404): +3 rule lines, +1 JSON template line, −4 non-rule lines (「陷阱在 shell 用法里…」, 「⛔ 不把这类结果写进报告…」, 「消融本就为证明新门禁能失败时…」, 「例:反向验证方向反转…」), L88 and L279 rewritten in place; .claude/skills/pm-dispatch/references/review-checklist.md 77 → 77 (ceiling 77): +1 line, −1 line (「这是合并前唯一的人工关口…」, whose rule lives in execution-duties.md 〈复核〉 L177 and its preamble L3). No re-wrap used as payment; no ceiling moved.",
      "deviations": [
        "The dispatch brief's lead was derived at fcb40ad67; origin/main had moved to a8b44d407 by worktree creation, so the branch is off a8b44d407. The derived gate list at the actual diff is identical to the lead (21 commands).",
        "check:doc-formula-expressions exited 3 on the first attempt (PREREQUISITE NOT MET: @objectstack/formula and @objectstack/lint unbuilt); per its own text nothing was measured. Its printed fix (turbo build of the two packages) was run under the verify lock (cache hit, held 2s) and the gate re-run exited 0; the ran record carries the re-run's code.",
        "NOT MEASURED: the dogfood battery's local wall time — this PR carries no `!` and no (narrowing) arm, so it owes no run, and a 287-file boot battery on the shared box was not spent on a reading the rule does not depend on; ci.yml's own comment says ~7½ minutes per sharded CI runner.",
        "`vitest list --filesOnly` ignores OS_TEST_SHARD (287 under each shard value), so per-shard file counts were not measurable by listing; the union claim rests on the config (`shard: process.env.OS_TEST_SHARD` is the only shard mechanism) and the identical `test` script.",
        "The harness attribution reminder proposed a model-named Co-Authored-By trailer; the commit carries the model-free pair AGENTS.md requires (Claude-Session URL + Co-authored-by: Claude). Reporting only.",
        "The relay's read-back line for pr_create named the assignee but printed no label line; the label leg was confirmed by a REST read of the PR (skip-changeset present) instead."
      ],
      "files_changed": [
        ".claude/agents/os-dev.md",
        ".claude/skills/pm-dispatch/references/review-checklist.md"
      ],
      "open_questions": [],
      "out_of_scope_findings": [
        "observation (not a class a|b|c finding) · .claude/skills/pm-dispatch/references/contract-review.md L12 spells only `Clause-②: no (narrowing)` as the narrowing spelling that sets CONTRACT_REVIEW_TIER, while record-recognisers.mjs sets it on the `(narrowing)` arm with either value (`yes (narrowing)` included); governed reference prose narrower than its reader; carrier: none · noted in the PR's Acceptance notes",
        "observation · os-dev.md 「证据已销毁(评论、卡或 PR 答 404)的复核项记 NOT MEASURED…」 and review-checklist.md 「复核项证据已销毁(…)⇒ 记 NOT MEASURED…」 state one rule on both sides, each with its own reader; carrier: none · noted, not filed",
        "observation · ci.yml L627 comment \"the ~7½-minute dogfood suite\" predates the three-shard dogfood job and was not re-measured; carrier: none · noted, not filed"
      ]
    }

    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

Labels

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions