Repository navigation
docs(pm): the security lane charter carries the maintainer's working rules — reviewed escalation, cloud orders, close-out, intake - #29840
Conversation
…rules Reviewed escalation at CONTRACT_REVIEW_TIER before any question reaches the maintainer, cloud orders for heavy fixes, the per-object close-out, the relay closed move on merge, the pre-release publish-or-not list and the intake and read rules; S1-S3 of the PR 29695 contract review. The Notify: security doorbell reads a labelled public card's number alone; fleet-roster imports the seat signature line instead of mirroring it, and pins the lane grammar. Claude-Session: https://claude.ai/code/session_01QSeKYn5CmmdShCJifm6WYj Co-authored-by: Claude <noreply@anthropic.com>
|
security#1 · os-justin · session_01QSeKYn5CmmdShCJifm6WYj Contract-review-claim: session_01QSeKYn5CmmdShCJifm6WYj · head 08f26b8 · 2026-11-03T06:58Z |
|
security#1 · os-justin · session_01QSeKYn5CmmdShCJifm6WYj Contract reviewServed-tier: Inputs: card #29726 (body; comments 6595030876, 6595626876, 6596935692, 6597456457 — the last is the author's account and was tested, not cited), PR #29840 (body, file list, net diff against ① Derived judgmentsEach rule the charter now states, against the verbatim rulings on the card and in amendment 6595626876:
② Semver level
③ Boundary flags
④ Design judgment
No must-fix. Should-fix (line 48's no-patrol case; line 36's carried-over 「发布归维护者」) and the line-47 nit are for the next edit of these files, not this PR. Implemented-by: VERDICT: PASS |
|
domain:skills#2 · os-justin · session_01QSeKYn5CmmdShCJifm6WYj 席位核对ACCEPT · head
|
Fixes #29726
Clause-②: no
Metadata-protocol: none
维护者速读
lanes/security.md写入你在本会话定的工作规则——呈你之前先经隔离复核、复杂修复开云卡、逐对象收口、修复合入即关公告、发版前呈发布与否清单、接收与读公告的规矩;误公开卡的转交读得懂了。scripts/pm工具,不进任何发布包;回滚即 revert 本 PR。唯一行为变化是信箱门铃Notify: security多认一种「卡号」写法。.claude/skills/pm-dispatch/references/lanes/security.md(新增「呈维护者」「收口」两节);②scripts/pm/record-recognisers.mjs的notify:security读法;③scripts/pm/fleet-roster.mjs签名行改为导入。pnpm check:pm-record-recognisers,预期四个自测全绿(record-recognisers 360 例)。CONTRACT_REVIEW_TIER复核 PASS)。What changes
lanes/security.md(34 → 53 lines) — the maintainer's working rules for the security seat, as pointers plus the minimum new text; no never-public rule is restated:CONTRACT_REVIEW_TIERreviews the analysis — fed the analysis and evidence, never the seat's conclusion — checking the four axes, missing options, the recommendation and the evidence; the question carries the verdict and every dissent. No model name in the text.mode:cloud, the restmode:subagent, pointing atexecution-duties.md; the seat archives each cloud card when its work lands.landing-operations.md);Fixes #N/Part of #Ncards; an advisory moves toclosedthrough the relayadvisory_stateonce its fix merges, recorded on the seat post, no per-advisory ask; cloud cards archived; a subagent ends itself and removes its worktree.received→fixing→merged→closed, and only what the pick sends to publishing goesawaiting publish→published.--reveal, never a file, a log or a background task's output; fix claims live in the seat post's ledger.security-findings.md§3/§9; both are now pointers.security-labelled cards, so the label is the hand-over; triage's doorbell only speeds it up.Notify: securityreads a labelled card's number (S2's measured half). Triage already rangNotify: security · #29761into the security mailbox (#29743, comment 6595011108). Measured onorigin/mainat b0ef25f:readMailboxLineansweredunreadable("does not spellNotify: security · GHSA-ID"), as the PR #29695 review predicted. Of the two fixes, widening the reader is the smaller change (no new key, no new table row, no new protocol line): the one field is either the opaque advisory id or a card number, never both. An already-public card number is not a mechanism. After the change the same comment reads{ card: 29761, numbers: [29761] }. Template nowNotify: security · GHSA-ID or #n.S3. The
MAILBOX_KEYSnotify:securityfrom:is now the seat holding the finding (a dev's or a QA runner's finding reaches its PM session privately first), or triage for a public card it labelled.project-forms.mdsays the same in place (still 56 lines, ≤120 bytes).Lane-list three-copy drift.
fleet-roster.mjsnow importsSEAT_SIGNATURE_LINEfromcheck-half-states.mjsand deletes its mirror. The mirror's stated reason ("so the relay never loads the patrol") is false on this tree:fleet-write/dispatch.mjs, the relay that importsROSTER_MARKER, statically importscheck-half-states.mjsitself (line 482). So the import loads nothing new there and adds no cycle, becausecheck-half-states.mjsnever importsfleet-roster.mjs. The third copy,mailbox-open.mjsSEAT_BARE_LANES, cannot import the patrol: the patrol loads the opener lazily, and H72 pins that, so the edge would be the top-level-await deadlock measured at check-half-states.mjs:14681. It is pinned instead by a newfleet-rosterself-test row (the only file that imports both). The signature's kinds must equal the opener's kinds plusepic, and its bare words the opener's bare lanes pluscoordinator. No new gate.Ratchet.
lanes/security.mdrow 34 → 53, the measured delta +19. The row's comment cites the card body and amendment comment 6595626876 as the ruling record. No other row moves.Tests
node scripts/pm/record-recognisers.mjs --self-test→✓ record-recognisers self-test: 360 cases pass(was 359; the mailbox battery floor 40 → 41). The old refusal row dropped its#28001case. The new row reads#29761alone and refuses a card plus an id, a second field,PR #n,#0and the verbatim template.node scripts/pm/fleet-roster.mjs --self-test→✓ fleet-roster self-test: 105 cases in 9 batteries pass(was 104; battery floor 13 → 14).node scripts/pm/mailbox-open.mjs --self-test→✓ mailbox-open self-test: 82 cases in 10 batteries pass.Ablations (one-time proofs, run through scripts/ablation-replace.mjs against the committed head 08f26b8)
notify:securityreader:✗ record-recognisers self-test: 1 of 360 case(s) failed(the new row), restored: blob == HEAD,git diff HEADempty.auditortoSIGNATURE_LANE_SOURCEalone: the fleet-roster lane-grammar row reds (1 failure(s)), restored and proven.auditortoSEAT_BARE_LANESalone: the same row reds, restored and proven.Acceptance notes
fleet-roster.mjs'sisEpicParentheader carries the same stale reason ("not imported, so the relay … never loads the patrol") for its H45 mirror. Untouched here; a note only.security-findings.md§9 still says "发现者 … 敲Notify: security · GHSA-ID". It still reads true: §5 sends a dev's finding to its seat first. It is unchanged because the claim limits that file to pointers.SKILL.md'smode:*row routessecurity-labelled cards tothreadwhen a seat is a project thread. The charter's cloud rule covers the seat's no-card fix orders, a different object. No change.Verification
Gates derived by
node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstackat 08f26b8 (38 commands). Every one ran, with the exit code captured before any pipe. Reconciled:✓ dispatch-gates --ran: 38 derived famil(ies) accounted for — 38 run, 0 NOT-MEASURED (a DERIVED zero — all 38 recorded an exit code and none of them is 3).Per-command exits
All exit 0, including
pnpm check:pm-skill-ratchet,pnpm check:pm-skill-id-lint(109 file(s) clean),pnpm check:skill-frame-sync,pnpm check:pm-record-recognisers,pnpm check:pm-dispatch-gates,pnpm check:doc-authoringandpnpm check:nul-bytes. One exception:pnpm --filter @objectstack/lint run check:doc-formula-expressionsfirst exited 3 (PREREQUISITE NOT MET:@objectstack/formulaand@objectstack/lintunbuilt). It exited 0 afterturbo run build --filter=@objectstack/formula --filter=@objectstack/lintunder the verify lock. Also run outside the derivation: the--self-testof each touchedscripts/pmfile (check-skill-line-ratchet,fleet-roster,mailbox-open,record-recognisers), all exit 0.No changeset:
.claude/**andscripts/pm/**ship in no released package (skip-changeset).🤖 Generated with Claude Code
https://claude.ai/code/session_01QSeKYn5CmmdShCJifm6WYj
Generated by Claude Code