Repository navigation
Description
security#1 · os-sales · session_01L6bhgVfjk2i8T2D4RmxsKg
.claude/skills/pm-dispatch/references/lanes/security.md (⛔ not copied here). Never-public rules: .claude/skills/pm-dispatch/references/security-findings.md. This is security seat 1. This post carries no finding, path, object name or mechanism, by rule.
Current PM — 🟢 os-sales
- Holder:
os-sales·session_01L6bhgVfjk2i8T2D4RmxsKg· seated 2026-11-05T10:45Z, on the maintainer's summons in the project (「接手 security 车道」), after the previous holder's clock-out brief (the latest event, so no takeover race). Run by the os-sales account's project. - Advisory access: the relay
advisory_readopened a sealed answer in this session (run 42013075070, state and counts only, nothing printed). - Session effort: below
highas set by the project; noted perseat-lifecycle.md. - Patrol:
trig_01YS6drHYT3ZaoxSo6Zp9tJF·42 * * * * - Mailbox: PR pm:mailbox — security#1 · os-sales #30424
- Previous holder:
os-justin·session_01QSeKYn5CmmdShCJifm6WYj· clocked out 2026-11-05T07:48Z; the previous body revision (edited 2026-11-05T07:48:58Z) is the archive. - Posture and round reports live in the project. Ledger rule: one row per advisory, opaque id · session · state, ⛔ no detail. Claims on advisory fixes live here, never in session memory.
Ledger
| advisory | session | state |
|---|---|---|
| GHSA-pr58-fh6c-gq2w | session_01QSeKYn5CmmdShCJifm6WYj | closed (fix merged; maintainer's standing order) |
| GHSA-v2v7-hqfg-w52f | session_01QSeKYn5CmmdShCJifm6WYj | closed (fix merged; maintainer's standing order) |
| GHSA-xqhh-j48f-jjrj | session_01QSeKYn5CmmdShCJifm6WYj | published (relay runs 41944485343 reopen · 41944573358 versions · 41944661850 publish) |
| GHSA-3v9p-7m67-852m | session_01QSeKYn5CmmdShCJifm6WYj | closed (fix merged; maintainer's standing order) · sibling doors: phone reset #29973 merged, sign-up #29975 merged; residual + anonymous resend on the maintainer's list |
| GHSA-8rj8-fch9-c2mw | session_01QSeKYn5CmmdShCJifm6WYj | published (relay runs 41944141606 reopen · 41944200038 versions · 41944243924 publish) |
| GHSA-xj95-6q7p-782x | session_01QSeKYn5CmmdShCJifm6WYj | published (relay runs 41873738957 reopen · 41873976222 versions · 41874125239 publish) |
| GHSA-2fm9-8g3q-7pjx | session_01QSeKYn5CmmdShCJifm6WYj | closed (fix merged; maintainer's standing order) |
| GHSA-wv48-4g3p-w8cg | session_01QSeKYn5CmmdShCJifm6WYj | published (relay runs 41944294449 reopen · 41944351397 versions · 41944396736 publish) |
| GHSA-x637-7736-x47w | session_01QSeKYn5CmmdShCJifm6WYj | closed (fix merged; maintainer's standing order) |
| GHSA-gwc4-gw6c-w5rj | session_01QSeKYn5CmmdShCJifm6WYj | closed (fix merged; maintainer's standing order) |
| GHSA-24x3-pfgx-xmxm | session_01QSeKYn5CmmdShCJifm6WYj | closed (fix merged; maintainer's standing order) |
| GHSA-7hhm-4cjx-xm5g | session_01QSeKYn5CmmdShCJifm6WYj | closed (fix merged #30151; the cloud driver census is a pre-release item) |
| GHSA-pg7r-xfxx-25xw | session_01QSeKYn5CmmdShCJifm6WYj | closed (fix merged: #29932 organization branch, #29950 delegated branch) |
| GHSA-gp32-mfp5-9h63 (public card #29761 moved in and closed on the maintainer's ruling) | session_01QSeKYn5CmmdShCJifm6WYj | closed (fix merged #29867; owner follow-up #30146 merged; docs #29866 awaits the maintainer's hand) |
| GHSA-m5r4-cjrf-239m | another session (maintainer-assigned) | received |
| GHSA-rcph-958x-q6j3 | — | closed (before this seat) |
| GHSA-p3w4-whfc-ff96 | — | closed (before this seat) |
| GHSA-h87h-xp7p-f8p4 | — | closed (before this seat) |
| GHSA-3p5q-jhx8-jc65 | session_01QSeKYn5CmmdShCJifm6WYj | closed (not a finding: a relay live test, card 29402) |
| (draft, id pending from the maintainer: change-email notice) | session_01L6bhgVfjk2i8T2D4RmxsKg (inherited) | merged (fix #30166); closes once the maintainer names the id |
| GHSA-c62f-x92q-ghm3 | session_01L6bhgVfjk2i8T2D4RmxsKg (inherited) | received (fix shape goes to the maintainer after review) |
| GHSA-hw27-vpwp-f94h | session_01L6bhgVfjk2i8T2D4RmxsKg (inherited) | closed (high; API-key half #30287 merged f4cd4ec879, OAuth half #30360 merged b3d2f4bdb7; relay run 42110886309) |
| GHSA-f69p-r3wc-64f8 | session_01L6bhgVfjk2i8T2D4RmxsKg (inherited) | closed (medium; the server lane's PR #30447 merged b5765be311; relay run 42123822884) |
| GHSA-hjqw-gxfh-v4vp | session_01L6bhgVfjk2i8T2D4RmxsKg (inherited) | fixing (predicate-write half merged #30219; the explain half awaits a maintainer ruling); the by-id re-read hardening #30307 merged 70981e63ed |
| GHSA-883m-4hm6-m2m2 (doorbell from domain:ui#6, mailbox #30424) | session_01L6bhgVfjk2i8T2D4RmxsKg | fixing (low; the assignment-table half merged #30578 6dd2ca5788; a sibling grant path is the next in-seat order; close once it merges) |
| GHSA-c9q6-f2m6-rfh7 (doorbell from domain:server#6, mailbox #30424) | session_01L6bhgVfjk2i8T2D4RmxsKg | fixing (medium; dispatched in-seat, branch claude/sec-hardening-r7) |
| GHSA-cxjx-wvh5-3jv4 (doorbell from domain:server#2, mailbox #30424) | session_01L6bhgVfjk2i8T2D4RmxsKg | fixing (medium; dispatched in-seat, branch claude/sec-hardening-r8) |
| GHSA-254j-2rxp-5mcx (doorbell from domain:server#3, mailbox #30424) | session_01L6bhgVfjk2i8T2D4RmxsKg | fixing (medium; dispatched in-seat, branch claude/sec-hardening-r9) |
| GHSA-4gjj-cw8r-9hc6 (this seat's read of PR #30672, asked by domain:server#2 on mailbox #30424) | session_01L6bhgVfjk2i8T2D4RmxsKg | received (low; #30672 holds its queue until this seat clears it) |
| GHSA-vmfv-999r-f7g8 (same read) | session_01L6bhgVfjk2i8T2D4RmxsKg | received (low) |
| GHSA-fwcx-33g5-wqcf (same read) | session_01L6bhgVfjk2i8T2D4RmxsKg | received (low) |
Standing orders (inherited: the maintainer's, given in the previous holder's session session_01QSeKYn5CmmdShCJifm6WYj, verbatim):
- 「目前的修复都关闭」 and 「你处理完的可以都先关闭」: once an advisory's fix merges, the seat closes it through the relay
advisory_stateand records it here. - 「哪些高危要发布应该在我版本发布前决策吧」: before each version release, the seat puts a publish-or-not list to the maintainer, covering the closed advisories since the last release (high and moderate first), reviewed at
CONTRACT_REVIEW_TIERfirst. Publishing is the maintainer's: they reopen and publish in the advisory UI, since the relay cannot move a closed advisory. - 「同意,batch 调到 5」: the previous holder ran at most 5 slots. This holder's account runs at most 4 per seat (its maintainer's word in the project at 2026-11-05T21:32Z, latest wins).
- 「只记录,暂停派发」 (2026-11-04), lifted by 「可以继续派发」: the fourth and fifth decision batches are ruled and recorded in the seat's private notes, and dispatch has resumed.
- 「changeset 改写确认都同意」 (2026-11-05): a pending-changeset DELIBERATE CORRECTION lands on the seat's own record, as
landing-operations.mdalready says (the ACCEPT quoting before and after, or the same-head at-tier PASS). The seat does not wait on the maintainer for it. Skills card: 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.
Inherited handover (previous holder's clock-out 2026-11-05T07:48Z, taken on as written)
In flight: dev done, contract review owed. Each PR carries its at-tier records so far; each needs a review on its current head and then landing.
- ✅ merged by this holder: fix(core)!: a banned user's credentials are refused while the ban holds, at every door #30287
f4cd4ec879, fix(plugin-security): a by-id write's row re-read propagates a store fault, and judges the platform's own predicates without the caller-predicate guard #3030770981e63ed, fix(runtime,plugin-auth)!: a banned user's OAuth access tokens and refresh grants are refused while the ban holds #30360b3d2f4bdb7and fix(plugin-security, plugin-auth)!: a person-to-permission-set assignment refuses an agent ceiling set at every write door, and so does the self-registration permission set #305786dd2ca5788(at-tier FAIL → findings commit → delta PASS → ACCEPT → queue). Original handover entries follow. - fix(core)!: a banned user's credentials are refused while the ban holds, at every door #30287 (the API-key half of the high advisory above). PASS at
15b303e0bf(comment 6650521523). Two findings commits since; headf064a0e418. Owes a delta review by an at-tier reviewer, then ACCEPT and landing. - fix(runtime,plugin-auth)!: a banned user's OAuth access tokens and refresh grants are refused while the ban holds #30360 (the OAuth half of the same advisory). Stacked on fix(core)!: a banned user's credentials are refused while the ban holds, at every door #30287, with its base the R4 branch. Once fix(core)!: a banned user's credentials are refused while the ban holds, at every door #30287 merges: rebase onto
origin/mainper the note in its body, retarget tomain, run the gates, then a full at-tier review. Not reviewed yet. - fix(plugin-security): a by-id write's row re-read propagates a store fault, and judges the platform's own predicates without the caller-predicate guard #30307 (the by-id write row re-read: store faults propagate, and platform predicates skip the caller-predicate guard). FAIL at
b6b340a3db(comment 6650951607), on public text only. The findings commitcc1fbac302and the replacement body address it; owes a delta review.
Waiting on the maintainer (analyses are in the previous holder's session notes, which this holder cannot read; each item stays open for the maintainer; each item was fable-reviewed before it was put):
- Batch 7: three items (transfer requires read; explain answers existence-blind; capability-layer write-implies-read).
- The fix shape for the high advisory received earlier (see its ledger row).
- The high advisory above: three items (a revoke switch on the ban act; refusing a credential whose owner row is gone; the answer shape for a banned owner's credential).
- Whether the controlled-by-parent master read should also propagate a store fault (fix(plugin-security): a by-id write's row re-read propagates a store fault, and judges the platform's own predicates without the caller-predicate guard #30307 open question; an older ruling note keeps its catch-all).
- Deleting the old PR-body revisions on fix(spec)!: an object permission that edits or deletes a record also reads it #30180 and fix(plugin-security)!: a write from a caller the read door refuses is refused, whatever rows it addresses #30219 (GitHub UI).
- The id of the draft change-email notice, and pasting its corrected description.
Next orders, not yet dispatched:
- The medium advisory above: covered by the server lane's PR fix(plugin-auth)!: clearing an authentication setting, or resetting the namespace, takes effect at once (#30312) #30447; no order of this seat.
- plugin-auth: an MCP JWT access token cannot be revoked — /oauth2/revoke answers 400 and delete-consent ends nothing, against IAuthService.verifyMcpAccessToken's 'falsy when revoked' (objectstack-ai/cloud#3606 ruling A) #30345 (p1; MCP access tokens cannot be revoked; the platform half of a cloud ruling). It touches the same verification point as fix(runtime,plugin-auth)!: a banned user's OAuth access tokens and refresh grants are refused while the ban holds #30360. Dispatch after fix(runtime,plugin-auth)!: a banned user's OAuth access tokens and refresh grants are refused while the ban holds #30360 lands, or fold it in.
- From the fix(runtime,plugin-auth)!: a banned user's OAuth access tokens and refresh grants are refused while the ban holds #30360 dev's census: the OAuth userinfo and introspection endpoints for a banned subject (one security order, after fix(runtime,plugin-auth)!: a banned user's OAuth access tokens and refresh grants are refused while the ban holds #30360). The ban docs and the Ban User copy gain OAuth credentials once fix(runtime,plugin-auth)!: a banned user's OAuth access tokens and refresh grants are refused while the ban holds #30360 lands.
- Skills cards 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 and pm-dispatch SKILL.md: the seat invariant still names MCP rerun_failed_jobs as the one allowed MCP write, while a re-run leaves only through the relay #30159, filed and not yet dispatched.
Hot-file serial queue
⛔ Re-derive from live claims and each open PR's file list before every dispatch.
- None held as a lane: fixes land in their owning packages through no-card orders.
- The skills-lane cards on
lanes/security.mdandsecurity-findings.mdthat the previous holder queued (pm/fleet-write: the relay publishes a security advisory on the maintainer's list: reopen, set the affected and patched versions, publish #30110, pm-dispatch skills: the security seat's triage of a non-finding, its ledger states after the close-on-merge order, a release's contents read by ancestry, and the CI recoveries the relay leaves #30111) are both closed; nothing is held on those files.
Notes
- Write path: the relay (
post-stamped.mjs,label-write.mjs,issue-create.mjs,fleet-write/dispatch.mjs). ⛔ No GitHub MCP writes. Advisory text is read only through the relayadvisory_read. domain:skills#2([PM seat] domain:skills · seat 2 — ⏳ vacant #19287), held by the previous holder's session for the security work's skills-lane cards, was handed back once they landed (clock-out brief 6598110373).
Activity
[-][PM seat] security — 🟢 os-justin[/-][+][PM seat] security — 🟢 os-sales[/+]objectstack-fleet commentedon Nov 5, 2026
security#1 · os-sales · session_01L6bhgVfjk2i8T2D4RmxsKg
Seat taken 2026-11-05T10:47Z by
os-sales(session_01L6bhgVfjk2i8T2D4RmxsKg), on the maintainer's summons in the os-sales project. The previous holder's clock-out brief (session_01QSeKYn5CmmdShCJifm6WYj, body revision of 2026-11-05T07:48Z) was the latest event on this post, so the seat was taken directly, with no takeover race.advisory_readopened in this session (run 42013075070); nothing printed.trig_01YS6drHYT3ZaoxSo6Zp9tJFhourly.