You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
docs(pm,agents): write identity follows the channel, not the account — REST-only content writes, the ACCEPT refuses MCP writes, a stale shared checkout re-seats
Equal-line edits under every ratchet (SKILL.md 812, os-dev.md 403,
platform-readings 454, rest-channel 82, core-rules 151), every touched
line at or under 120 bytes.
- facts and invariants: content writes go only through the REST proxy,
never an MCP content-write tool; `user.login` on a write names the
channel's token (installation ⇒ `claude[bot]`, user-to-server ⇒ the
bound user — per session, not the seat's to choose), never the actor;
attribution is the session ID in the text carrier. Rewritten in
os-dev.md :51/:53, SKILL.md :97–:98, core-rules :25,
platform-readings :129, rest-channel :54.
- dispatch order and acceptance: every dispatch order carries a
`Writes:` line; an os-dev-report whose `mcp_calls` names a write tool
(the settings deny list + `update_pull_request`) is refused, on both
the seat side (SKILL.md 复核) and the dev side (os-dev.md :369).
- propagation: at fire time the seat also reads the latest origin/main
touch of the harness-loaded files (.claude/settings.json,
.claude/agents/*.md, .claude/hooks/*) against the shared checkout's
HEAD; a touch not in HEAD ⇒ close the shift and re-seat in a fresh
session, never advance the shared checkout in place. The reading is
scripts/pm/check-harness-current.mjs (git only, seat-side, not CI).
- fleet: the new-repo registration checklist gains the write-identity
locks port (deny + hooks).
Density paid inside each file: four SKILL.md bullet pairs merged
(终报要求/机器可核字段, mode:cloud/build-heavy, marker spellings/
missing-notification, 报告契约 authority/second-copy); os-dev.md :53
drops the board/wide-search clause already carried by :50 and :54.
Co-authored-by: Claude <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DAcomhvR9kKizeYgg89Vo8
if(!touch.ok||!touch.out){undecided+=1;console.log(`? ${path}: no touch of ${ref} visible from ${shared} (unfetched ref, or a shallow window) -- UNDECIDED`);continue;}
49
+
const[sha,ct,ci]=touch.out.split(' ');
50
+
if(git(shared,'merge-base','--is-ancestor',sha,'HEAD').ok){console.log(`✓ ${path}: latest touch ${short(sha)} (${ci}) is in the shared HEAD`);continue;}
51
+
if(Number(ct)>headTime||!shallow){stale+=1;console.log(`✗ ${path}: latest touch ${short(sha)} (${ci}) is NOT in the shared HEAD ${short(head.out)} -- STALE`);continue;}
52
+
undecided+=1;
53
+
console.log(`? ${path}: touch ${short(sha)} (${ci}) is not under HEAD in a SHALLOW clone and not newer than HEAD -- UNDECIDED, deepen and rerun`);
54
+
}
55
+
constverdict=stale
56
+
? `STALE -- ${stale} harness-loaded path(s) on ${ref} are not in ${shared} HEAD ${short(head.out)}: close the shift and re-seat in a fresh session; ⛔ never advance the shared checkout in place`
57
+
: undecided ? `UNDECIDED -- ${undecided} path(s) could not be placed; fetch/deepen ${shared} and rerun` : `CURRENT -- every harness-loaded path on ${ref} is in ${shared} HEAD ${short(head.out)}`;
0 commit comments