Skip to content

pm-dispatch skills: say who confirms a pending-changeset correction (the seat's record, never a maintainer wait) everywhere a dev or the gate is told to "get it confirmed", and keep PR bodies from narrating pre-fix behaviour on security fixes #30271

Closed

Description

@objectstack-fleet

security#1 · os-justin · session_01QSeKYn5CmmdShCJifm6WYj

Why

references/landing-operations.md already states the rule (#19970, #23257): a check-empty-changeset DELIBERATE CORRECTION red does not wait for the maintainer. The confirmation is the dispatching seat's own record:

  • For a text-only diff: the ACCEPT, quoting each note before and after.
  • Otherwise: the same-head at-tier contract-review PASS, which judges each corrected sentence.

The texts a dev and a seat actually meet do not say this.

The maintainer has now said, in the security seat's session, verbatim: 「changeset 改写确认都同意」 (2026-11-05). This restates the existing rule. It does not create a new one.

Changes

  1. Gate remedy text. FOREIGN_CORRECTION_REMEDY (scripts/check-empty-changeset.mjs) names the confirmer by pointing at landing-operations.md (the seat's ACCEPT or its same-head at-tier PASS record). Keep the one-source / two-renderings construction and its self-test assertions in step. Keep the verdict unchanged: the class stays refused, and only the remedy wording moves.
  2. The dev's side. references/execution-duties.md, or os-dev.md if that is where PR-body duties live, says:
    • A dev who corrects a pending note declares it on the PR as a DELIBERATE CORRECTION, naming each note and quoting the corrected sentences.
    • ⛔ The dev does not ask the maintainer to confirm it. The dispatching seat's record confirms it.
  3. Security PR bodies state the rule, never the pre-fix path. This goes in references/security-findings.md §6, or in the os-dev pointer to it. Twice this week a security fix's PR body narrated what the code did before the fix (fix(spec)!: an object permission that edits or deletes a record also reads it #30180, fix(plugin-security)!: a write from a caller the read door refuses is refused, whatever rows it addresses #30219), and the contract review failed it on §6. The rule to add: on a security fix, the PR body, its Verification section and its ablation notes describe the rule and the counts ("red, then restored"). ⛔ They never describe what the unguarded code does. That detail goes in the dev's private security_findings only.

Acceptance

  • Each rule lives in the one reference that owns it, with no restatement. The hot files' line ratchets are respected.
  • check-empty-changeset's self-test is green, and its verdicts are unchanged.
  • The skills gates the diff derives are green.
  • lanes/security.md and security-findings.md still carry no finding, id, path, object or mechanism.

Activity

  1. added
    toolingFix lands in tooling, not a product package — enters pm:queue only with Unblocks: or a named surface
    domain:skillsDomain lane — seat card indexed by label:pm:seat
    on Nov 5, 2026
  2. objectstack-fleet commented on Nov 5, 2026

    @objectstack-fleet
    ContributorAuthor

    triage#1 · os-zhuang · session_01AavokzJ5DndAwitDXvKy4U

    Path: none

    Triage: first-touch audit · p2 kept · domain:skills kept · pm:queue · 2026-11-05T04:57Z

    ⛔ Not a claim.


    Generated by Claude Code

  3. added
    pm:queueReady for the PM dispatch loop
    pm:dispatchedDispatched to a dev agent by /pm-dispatch
    and removed
    pm:queueReady for the PM dispatch loop
    on Nov 5, 2026
  4. objectstack-fleet commented on Nov 6, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:skills#2 · os-tesla · session_01L9qibz5RLVEYDFco93jZ7u

    Claim: PM loop round 1 · 2026-11-06T05:39Z
    Session: session_01L9qibz5RLVEYDFco93jZ7u
    Account: os-tesla (the card's assignee)
    Branch: claude/project-thread-nmt62i (the card thread's designated branch; dev session session_01L9qibxpHybSfTtRNdGnUZZ)
    Worktree: objectstack-issue-30271
    Domain: domain:skills
    Seat: domain:skills#2
    File surface: scripts/check-empty-changeset.mjs (remedy wording only, verdict unchanged) with its self-test, .claude/skills/pm-dispatch/references/execution-duties.md, .claude/skills/pm-dispatch/references/landing-operations.md; .claude/agents/os-dev.md and references/security-findings.md only on lines named to the seat first. ⛔ every skill ceiling (pay by deletion, never re-wrap) (stop on breach)
    Container & model: M, mode:thread, model: claude-fable-5-1 (dispatch-gates --tier: MANDATORY for .claude/agents/os-dev.md clause ①, taken for the whole card), effort: high (p2)
    Clause-②: no
    Metadata-protocol: none
    Responsibility: n/a — not a defect card (restates the rule in landing-operations.md; maintainer 「changeset 改写确认都同意」, 2026-11-05)
    Thread-read: 6650089856
    Premise: holds: FOREIGN_CORRECTION_REMEDY reads "get it confirmed on the PR" with no confirmer, on origin/main c17719dd
    Serial constraints: seat 1 #30114 holds security-findings.md and pointer wording in .claude/agents/os-dev.md; this card touches either only after the seat serializes with seat 1.

    Tier S (.claude/**, gate script remedy text): the seat lands on its at-tier contract-review PASS.

    Order: /mnt/project-files/skills-seat-2/r2026-11-06/dispatch-30271.md (frame FRAME.md beside it).

  5. objectstack-fleet commented on Nov 6, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:skills#2 · os-tesla · session_01L9qibxpHybSfTtRNdGnUZZ
    os-dev-report

    Reported 2026-11-06T06:23Z · PR #30845 · head b297730 · status rework (card item 3 follows after #30114 merges, see deviations).

    {
      "issue": 30271,
      "status": "rework",
      "branch": "claude/project-thread-nmt62i",
      "pr": "https://github.com/objectstack-ai/objectstack/pull/30845",
      "session": "session_01L9qibxpHybSfTtRNdGnUZZ",
      "premise_still_valid": true,
      "summary": "Draft PR #30845 at head b297730a lands card items 1 and 2: FOREIGN_CORRECTION_REMEDY in scripts/check-empty-changeset.mjs names the confirmer by pointing at pm-dispatch references/landing-operations.md (the dispatching seat's ACCEPT for a text-only diff, otherwise its same-head at-tier contract-review PASS, never a maintainer wait), the reportForeign prose says the same, the one-source / two-renderings construction and the verdict are unchanged, and the self-test pins the new wording (D battery 12 to 14). The dev side in .claude/agents/os-dev.md (Definition of done, L300-301) now says the dev declares the DELIBERATE CORRECTION in the PR body, names each note and quotes the corrected sentences, and does not ask the maintainer to confirm; paid by deleting the pkill line that AGENTS.md multi-agent section 8 states and guard-process-kill.sh enforces. execution-duties.md L180 points at the one home instead of restating. Card item 3 (security-findings.md section 6: security-fix PR bodies state the rule, never the pre-fix path) is NOT in this push: the seat held it because seat 1's #30114 rewrites the payment line and adds a section-6 line; it follows as its own commit on this PR after #30114 merges and origin/main is merged in. Status is rework for that reason only.",
      "tests": "node scripts/check-empty-changeset.mjs --self-test at b297730a: '✓ check-empty-changeset --self-test: 167 assertions over real temp git repos (real scan() path)', exit 0. node scripts/check-empty-changeset.mjs --base origin/main: exit 0. No ablation (refusal text and instruction text only, which the ablation rule excludes).",
      "gates": "Derived with dispatch-gates --commands --repo objectstack-ai/objectstack at b297730a: 43 commands, each run with stdin from /dev/null, exit code landed on disk before any pipe, all 43 exit 0; --ran reconciliation: '✓ dispatch-gates --ran: 43 derived famil(ies) accounted for — 43 run, 0 NOT-MEASURED'. Ran-list: project files skills-seat-2/r2026-11-06/out/30271-gates-ran-b297730a.list. First sweep at a566bb6d had two reds, both resolved before the final sweep: check:doc-formula-expressions exit 3 (formula and lint packages unbuilt in the fresh worktree, a prerequisite not a finding; built under the verify lock, rerun exit 0) and check:pm-skill-ratchet exit 1 (120-byte line budget on the three edited lines; shortened, rerun exit 0, every ceiling at headroom 0). CI-owned, not run locally: pnpm lint, test:repo, type-check lanes, the 8 whole-tree and 11 wide-population families; read them off the PR's check-runs (in_progress at report time).",
      "dogfood_battery": "n/a — no `!` in the PR title and no (narrowing) arm",
      "mcp_calls": "4 — GitHub MCP reads only: issue_read get x1, issue_read get_comments x2, pull_request_read get x1; 0 write tools",
      "api_writes": "0 REST proxy writes. Relay writes 2: pr_create (fleet-write run 42173906064, read back identical, 11853 bytes) and post-stamped --comment=30271 (this report)",
      "files_changed": [
        "scripts/check-empty-changeset.mjs",
        ".claude/agents/os-dev.md",
        ".claude/skills/pm-dispatch/references/execution-duties.md"
      ],
      "line_budget": "os-dev.md 405 lines before and after (ceiling 405, headroom 0): +2 lines at L300-301 paid by deleting the pkill line (former 资源纪律 item 5). execution-duties.md 188 before and after (ceiling 188). Every edited line within the 120-byte line budget (114B, 114B, 119B). No re-wrap. landing-operations.md untouched.",
      "deviations": [
        "Card item 3 (security-findings.md section 6) left out of this push on the seat's instruction (serialized behind seat 1's #30114, which rewrites the payment line 40 and adds a section-6 line); the line and its payment were named to the seat before any edit and follow after #30114 merges.",
        "Harness assignee/reviewer step skipped: the relay's pr_create carries none by design and no GitHub MCP write tool was used.",
        "Edits were made in the linked worktree objectstack-issue-30271 on the designated branch (the primary checkout was detached at d996c381) because guard-main-checkout blocks writes in the primary checkout; no empty-branch probe push.",
        "pnpm install in the fresh worktree needed the registry for fumadocs-core (offline store incomplete); @objectstack/formula and @objectstack/lint were built under the verify lock to satisfy check:doc-formula-expressions' prerequisite."
      ],
      "open_questions": [],
      "security_findings": "none",
      "out_of_scope_findings": [
        "class: none of a/b/c (instruction-text residue, not a defect) · reach: none · .github/workflows/pr-automation.yml route 0 (the 'This PR adds no changeset' message, near L727) still says 'get it confirmed there in writing' and 'the approver merges over it' without naming the confirmer · dedupe words: route 0, get it confirmed, approver merges over it, pr-automation",
        "carrier: domain:skills#2 seat · noted, not filed (workflows are outside this card; the seat ruled to leave it)"
      ]
    }

    Generated by Claude Code

  6. objectstack-fleet commented on Nov 6, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:skills#2 · os-tesla · session_01L9qibxpHybSfTtRNdGnUZZ
    os-dev-report

    Reported 2026-11-06T06:55Z · PR #30845 · head aa641e2 · status done · supersedes comment 6678631527.

    {
      "issue": 30271,
      "status": "done",
      "branch": "claude/project-thread-nmt62i",
      "pr": "https://github.com/objectstack-ai/objectstack/pull/30845",
      "session": "session_01L9qibxpHybSfTtRNdGnUZZ",
      "premise_still_valid": true,
      "summary": "Refreshed report, supersedes comment 6678631527 (status rework). Draft PR #30845 at head aa641e2b now lands all three card items. Item 1: FOREIGN_CORRECTION_REMEDY and the reportForeign prose in scripts/check-empty-changeset.mjs name the confirmer by pointing at pm-dispatch references/landing-operations.md (the dispatching seat's ACCEPT for a text-only diff, otherwise its same-head at-tier contract-review PASS, never a maintainer wait); one-source / two-renderings construction and the verdict unchanged; self-test pins the wording (D battery floor 12 to 14). Item 2: .claude/agents/os-dev.md L300-301 say the dev declares the DELIBERATE CORRECTION in the PR body, names each note, quotes the corrected sentences and asks no maintainer to confirm; paid by deleting the pkill line that AGENTS.md multi-agent section 8 states and guard-process-kill.sh enforces; execution-duties.md L180 is a pointer to the one home. Item 3 (commit aa641e2b, added after the seat lifted its hold): security-findings.md section 6 gains 「正文、验证、消融只写规则与计数(红、后复原);未守卫代码做什么只进 `security_findings`。」, paid by deleting the section-5 line that restated section 5's first line and section 3; 64 lines before and after. That deletion sits inside seat 1's #30114 hunks (its branch rewrites the same line) — ordinary concurrency, the later lander merges and resolves a one-line conflict.",
      "tests": "node scripts/check-empty-changeset.mjs --self-test at aa641e2b: '✓ check-empty-changeset --self-test: 167 assertions over real temp git repos (real scan() path)', exit 0. node scripts/check-empty-changeset.mjs --base origin/main: exit 0. No ablation (refusal text and instruction text only, which the ablation rule excludes).",
      "gates": "Derived with dispatch-gates --commands --repo objectstack-ai/objectstack at aa641e2b (same 43 commands as at b297730a; 4 files, 49 changed lines): each run with stdin from /dev/null, exit code landed on disk before any pipe, all 43 exit 0; --ran: '✓ dispatch-gates --ran: 43 derived famil(ies) accounted for — 43 run, 0 NOT-MEASURED'. Ran-list: project files skills-seat-2/r2026-11-06/out/30271-gates-ran-aa641e2b.list. A first sweep on this head was discarded because a stray runner from an aborted attempt interleaved its lines; the clean sweep is the reading. CI at aa641e2b, read from the PR check-runs: Lint & Repo Gates success, TypeScript Type Check success, Test Core success (shards 1/8, 2/8 success), Governed Surface Queue Guard success, PR-body guards success, Check PR Size success, Test UI success, Dogfood Regression Gate success, Plan Test Core shards success; Lint UI, Type Check UI, Build & E2E UI, Live E2E UI, Build Core, Build Docs, Build UI Deps, Check Changeset (skip-changeset), Temporal Conformance, Dogfood Verify CLI, upgrade harness, packed-tarball smoke: skipped by their filters. No red check-run.",
      "dogfood_battery": "n/a — no `!` in the PR title and no (narrowing) arm",
      "mcp_calls": "6 — GitHub MCP reads only: issue_read get x1, issue_read get_comments x2, pull_request_read get x2, pull_request_read get_check_runs x1; 0 write tools",
      "api_writes": "0 REST proxy writes. Relay writes 3: pr_create (fleet-write run 42173906064, read back identical), post-stamped --comment=30271 x2 (6678631527 and this refresh)",
      "files_changed": [
        "scripts/check-empty-changeset.mjs",
        ".claude/agents/os-dev.md",
        ".claude/skills/pm-dispatch/references/execution-duties.md",
        ".claude/skills/pm-dispatch/references/security-findings.md"
      ],
      "line_budget": "os-dev.md 405 before and after (ceiling 405): +2 lines paid by the pkill line. execution-duties.md 188 before and after. security-findings.md 64 before and after (ceiling 64): +1 section-6 line paid by the duplicated section-5 line. Every edited line within the 120-byte line budget (114B, 114B, 119B, 118B). No re-wrap. landing-operations.md untouched.",
      "deviations": [
        "PR body (written once at pr_create, head b297730a) is now stale in two places and the dev does not PATCH it: the Acceptance note that defers card item 3 should read that item 3 landed in aa641e2b (security-findings.md section 6, paid by the section-5 line, inside #30114's hunks by the seat's leave), and the 维护者速读 先看 line and the Tests/Verification readings should cite aa641e2b. The seat writes that edit.",
        "Harness assignee/reviewer step skipped: the relay's pr_create carries none by design and no GitHub MCP write tool was used.",
        "Edits were made in the linked worktree objectstack-issue-30271 on the designated branch (primary checkout detached at d996c381) because guard-main-checkout blocks writes in the primary checkout; no empty-branch probe push.",
        "pnpm install in the fresh worktree needed the registry for fumadocs-core; @objectstack/formula and @objectstack/lint were built under the verify lock for check:doc-formula-expressions' prerequisite (exit 3 before, 0 after)."
      ],
      "open_questions": [],
      "security_findings": "none",
      "out_of_scope_findings": [
        "class: none of a/b/c (instruction-text residue, not a defect) · reach: none · .github/workflows/pr-automation.yml route 0 (the 'This PR adds no changeset' message, near L727) still says 'get it confirmed there in writing' and 'the approver merges over it' without naming the confirmer · dedupe words: route 0, get it confirmed, approver merges over it, pr-automation",
        "carrier: domain:skills#2 seat · noted, not filed (workflows are outside this card; the seat ruled to leave it)"
      ]
    }

    Generated by Claude Code

  7. objectstack-fleet commented on Nov 6, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:skills#2 · os-tesla · session_01L9qibz5RLVEYDFco93jZ7u

    Landed · 2026-11-06T14:52Z · PR #30845 merged as 1b3e22f0 through the merge queue (ACCEPT 6679270020). The Claim is discharged; pm:dispatched removed. Branch claude/project-thread-nmt62i is retired.

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

Metadata

Metadata

Assignees

Labels

domain:skillsDomain lane — seat card indexed by label:pm:seatpriority:p2Medium: important, M3toolingFix lands in tooling, not a product package — enters pm:queue only with Unblocks: or a named surface

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions