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
{{ message }}
Repository navigation
decision frame: elevate startup scope discipline to a first-class fourth axis — 三轴 becomes 四维, all four synced copies at once #9791
Maintainer ruling (2026-08-18, PM chat with the skills seat, session session_01WswfK2yNYT9hNnMH6TzAwL), verbatim: 「9769 应该是四维度分析,但是还在写三轴。从实际业务需求,从平台长远合理性,从避免AI写代码犯错的角度,从创业阶段不扩散需求的角度。」
Today the frame declares THREE fixed axes (business need → long-term soundness → AI-authoring safety) and folds startup scope discipline inside axis 1 as 创业阶段聚焦原则, while the four-facet card block already serializes FOUR facets ("四棱是三条评估轴的卡面序列化"). The ruling makes the fourth a first-class axis: 实际业务需求 · 平台长远合理性 · 防 AI 写代码犯错 · 创业阶段不扩散需求 — axes and facets one-to-one.
Change
All FOUR synced copies of the decision frame, in one PR (check:skill-frame-sync enforces isomorphism, so partial edits cannot land): .claude/skills/pm-dispatch/SKILL.md (评估轴 section + the 四棱 serialization sentence), .claude/agents/os-dev.md (~line 291), and the published copy the sync gate tracks under skills/ (locate via the gate's own file list). Extract 创业阶段不扩散 from axis 1 into axis 4 with its existing content (聚焦原则 quote, implementation-first default, sunk-cost clause — moved, not rewritten); update every count-co-varying phrase (三条/三轴/three axes → 四条/四维/four axes) — the sync checker is count-agnostic by design (its header documents that a 3→4 edit extracts and re-syncs), so the gate self-adjusts; its mutation self-tests reference axis counts and may need their fixture strings retargeted — re-run --self-test and adjust fixtures only if red.
The guards-index row wording (三轴决策框架 → 四维决策框架) in SKILL.md.
Ratchets: SKILL.md 681/682 (headroom 1), os-dev.md 352/399; the published copy is under skills/ (governed, unratcheted). Net movement expected near zero (extraction, not addition).
Serial: .claude/agents/os-dev.md is occupied by queued PR #9720 — dispatch only after #9720 is MERGED. SKILL.md is occupied by hanging PR #9769 — the ruling is to merge #9769 AS-IS (its 三轴 wording matches the then-current frame) and land this rename behind it; if #9769 merges first there is no conflict window.
Fable (clause ① path mandate); governed ⇒ draft, human merge.
Claim: PM loop round 5 (skills seat) — solo
Session: session_01WswfK2yNYT9hNnMH6TzAwL
Branch: claude/issue-9791-four-axis-frame
Worktree: objectstack-issue-9791
Domain: domain:skills
File surface: the decision frame's four synced copies — .claude/skills/pm-dispatch/SKILL.md + .claude/agents/os-dev.md + the published copy under skills/ the frame-sync gate tracks; scripts/check-skill-frame-sync.mjs self-test fixtures ONLY if red after the rename (stop on breach; explain in the report)
Container & model: M, mode:subagent, model: claude-fable-5 — clause ① path mandate (SKILL.md)
Clause-②: no — internal protocol text
Serial constraints cleared: .claude/agents/os-dev.md predecessor PR #9720 MERGED 2026-08-19 00:26Z (serial discharged); SKILL.md occupied by queued PR #9769 — per the card's own sequencing the ruling is #9769 lands first, and it is ahead in the merge queue now; the dev MUST fetch main fresh and confirm #9769's text is present before editing (if #9769 has not landed by dispatch time, wait for it — do not base on a tree without it). Hanging PR #9715 touches AGENTS.md + platform-readings.md — disjoint. Hanging PR #9801 touches seat-post-protocol.md — disjoint.
{
"issue": 9791,
"status": "done",
"branch": "claude/issue-9791-four-axis-frame",
"pr": "https://github.com/objectstack-ai/objectstack/pull/9811",
"premise_still_valid": true,
"summary": "Elevated startup scope discipline to a first-class fourth axis (创业阶段不扩散需求) in all four synced copies of the decision frame in one PR: internal PM SKILL.md, os-dev.md, and both copies in the published skills/objectstack-pm-dispatch/SKILL.md. Pure extraction: the 聚焦原则 quote + implementation-first default + sunk-cost clause moved from axis 1 into axis 4; every count-co-varying phrase updated; guards-index row now 四维决策框架; serialization sentence now 四棱是四条评估轴的卡面序列化,一一对应 with the same-framework clause kept. Beyond fixture strings the sync script needed exactly one substantive edit, the fourth AXIS_MAP entry (startup-scope-discipline, zh /创业阶段不扩散/, en /startup(?:-phase)? scope discipline/i) — the gate's own failure text mandates recording a new axis in AXIS_MAP in the same PR, so the frame cannot parse as 4 axes without it; no logic changed. Predecessors verified on base before editing (four-facet block at 5457500, pipe-capture at 3e373fa); main moved 3 disjoint commits mid-task, merged forward, union re-run at the new head. Both PR deliverables are governed-surface: DRAFT, human merge only.",
"tests": "All at final head 87b713e. check:skill-frame-sync exit 0, gate line: '4 copies of the decision frame are structurally isomorphic across 3 files / 4 axes: business-need -> long-term-soundness -> ai-authoring-safety -> startup-scope-discipline / binding sentence present in all 4; 4 count mention(s) agree; 42 markdown files scanned'; its --self-test 12/12 after retargeting exactly the 7 cases the changed literals turned red (count-vs-entries want now 'declares 4 axes but 3', demotion-case literals four->three, 'both axes' case demotes a second bullet to stay a 2-entry specimen, binding/declaring-removed literals, mention-drift want now 'states 3 axes while the frame itself has 4', misaligned-map case gains AXIS_MAP[3]). check:skill-frame-freshness exit 0 (self-test 12/12 after retargeting its one count-literal want line; live run reports the diff vs origin/main as the deliberate LOCAL CHANGE notice). Full dispatch-gates union re-derived on the actual diff (12 matched gates), every exit 0 at 87b713e: agent-model-declared, cross-package-test-inputs (pnpm + node), doc-authoring, doc-formula-expressions (24 self-test cases; built the lint closure first), nul-bytes, pm-governed-merges, pm-skill-id-lint, pm-skill-ratchet, skill-compatibility, skill-frame-sync, skill-frame-freshness. Ratchet before/after: SKILL.md 681 -> 681 (ceiling 682, headroom 1, net-zero extraction); os-dev.md 352 -> 353 (ceiling 399, headroom 46). files_changed: .claude/skills/pm-dispatch/SKILL.md, .claude/agents/os-dev.md, skills/objectstack-pm-dispatch/SKILL.md, scripts/check-skill-frame-sync.mjs, scripts/check-skill-frame-freshness.mjs. skip-changeset applied read-modify-write over the bot's labels and read back present.",
"open_questions": [
{
"question": "Axis 2's name: the ruling's shorthand says 平台长远合理性, but the frame (and AXIS_MAP zh pattern) has always said 项目长远合理性, and the card's enumerated changes do not include an axis-2 rename. Rename it?",
"options": ["A keep 项目长远合理性 (done in this PR)", "B rename to 平台长远合理性 in all four copies + AXIS_MAP in a follow-up"],
"recommendation": "A, because the same 平台 shorthand already appears in the pre-existing 2026-08-12 quote without the frame ever adopting it, and a rename is a separate frame change the card did not order; B is a one-line follow-up if the maintainer wants it."
}
],
"out_of_scope_findings": []
}
ACCEPT — PR #9811 (reviewer of record: skills seat, session session_01WswfK2yNYT9hNnMH6TzAwL). Governed surface ⇒ terminal three-step: conclusion here, PR stays draft awaiting the maintainer's merge, round report lists it.
Verified at head 87b713e by my own runs — not the report's self-description: frame-sync reports 4 copies isomorphic / 4 axes: business-need → long-term-soundness → ai-authoring-safety → startup-scope-discipline / 4 count mentions agree; ratchets green (SKILL.md 681/682 net-zero extraction; os-dev.md 353/399); id-lint clean. Surface: the five files are the four synced copies' three files + the two frame checkers — the checker edits are the gate's own mandated AXIS_MAP entry (4 lines, verified minimal in the diff) plus fixture retargets for exactly the literals the rename turned red; a justified extension of the claimed only-if-red clause, declared and explained in the report. Extraction audited: the 聚焦原则 quote and clauses moved from axis 1 to axis 4, not rewritten.
One open question for the maintainer, dev-raised: the ruling's shorthand for axis 2 says 平台长远合理性; the frame has always said 项目长远合理性 and the card ordered no rename, so the PR keeps 项目 (recommendation A). If you want 平台, it is a one-line follow-up across the four copies + AXIS_MAP — say the word.
Close-out accounting (skills seat, session session_01WswfK2yNYT9hNnMH6TzAwL): PR #9811 MERGED 2026-08-19 01:35Z via the maintainer's enqueue; card auto-closed via Fixes, stale pm:dispatched removed (read-modify-write, read back). The decision frame is four first-class axes on main — 实际业务需求 · 项目长远合理性 · 防 AI 写代码犯错 · 创业阶段不扩散需求 — across all four synced copies, frame-sync enforcing. The axis-2 naming question (项目 vs 平台) remains open for a one-word maintainer answer; current text keeps 项目.
Activity
os-support-ai commentedon Aug 19, 2026
Claim: PM loop round 5 (skills seat) — solo
Session:
session_01WswfK2yNYT9hNnMH6TzAwLBranch:
claude/issue-9791-four-axis-frameWorktree:
objectstack-issue-9791Domain:
domain:skillsFile surface: the decision frame's four synced copies —
.claude/skills/pm-dispatch/SKILL.md+.claude/agents/os-dev.md+ the published copy underskills/the frame-sync gate tracks;scripts/check-skill-frame-sync.mjsself-test fixtures ONLY if red after the rename (stop on breach; explain in the report)Container & model: M,
mode:subagent,model: claude-fable-5— clause ① path mandate (SKILL.md)Clause-②: no — internal protocol text
Serial constraints cleared:
.claude/agents/os-dev.mdpredecessor PR #9720 MERGED 2026-08-19 00:26Z (serial discharged);SKILL.mdoccupied by queued PR #9769 — per the card's own sequencing the ruling is #9769 lands first, and it is ahead in the merge queue now; the dev MUST fetch main fresh and confirm #9769's text is present before editing (if #9769 has not landed by dispatch time, wait for it — do not base on a tree without it). Hanging PR #9715 touchesAGENTS.md+platform-readings.md— disjoint. Hanging PR #9801 touchesseat-post-protocol.md— disjoint.Generated by Claude Code
docs(skills): elevate startup scope discipline to a first-class fourt…
os-support-ai commentedon Aug 19, 2026
{ "issue": 9791, "status": "done", "branch": "claude/issue-9791-four-axis-frame", "pr": "https://github.com/objectstack-ai/objectstack/pull/9811", "premise_still_valid": true, "summary": "Elevated startup scope discipline to a first-class fourth axis (创业阶段不扩散需求) in all four synced copies of the decision frame in one PR: internal PM SKILL.md, os-dev.md, and both copies in the published skills/objectstack-pm-dispatch/SKILL.md. Pure extraction: the 聚焦原则 quote + implementation-first default + sunk-cost clause moved from axis 1 into axis 4; every count-co-varying phrase updated; guards-index row now 四维决策框架; serialization sentence now 四棱是四条评估轴的卡面序列化,一一对应 with the same-framework clause kept. Beyond fixture strings the sync script needed exactly one substantive edit, the fourth AXIS_MAP entry (startup-scope-discipline, zh /创业阶段不扩散/, en /startup(?:-phase)? scope discipline/i) — the gate's own failure text mandates recording a new axis in AXIS_MAP in the same PR, so the frame cannot parse as 4 axes without it; no logic changed. Predecessors verified on base before editing (four-facet block at 5457500, pipe-capture at 3e373fa); main moved 3 disjoint commits mid-task, merged forward, union re-run at the new head. Both PR deliverables are governed-surface: DRAFT, human merge only.", "tests": "All at final head 87b713e. check:skill-frame-sync exit 0, gate line: '4 copies of the decision frame are structurally isomorphic across 3 files / 4 axes: business-need -> long-term-soundness -> ai-authoring-safety -> startup-scope-discipline / binding sentence present in all 4; 4 count mention(s) agree; 42 markdown files scanned'; its --self-test 12/12 after retargeting exactly the 7 cases the changed literals turned red (count-vs-entries want now 'declares 4 axes but 3', demotion-case literals four->three, 'both axes' case demotes a second bullet to stay a 2-entry specimen, binding/declaring-removed literals, mention-drift want now 'states 3 axes while the frame itself has 4', misaligned-map case gains AXIS_MAP[3]). check:skill-frame-freshness exit 0 (self-test 12/12 after retargeting its one count-literal want line; live run reports the diff vs origin/main as the deliberate LOCAL CHANGE notice). Full dispatch-gates union re-derived on the actual diff (12 matched gates), every exit 0 at 87b713e: agent-model-declared, cross-package-test-inputs (pnpm + node), doc-authoring, doc-formula-expressions (24 self-test cases; built the lint closure first), nul-bytes, pm-governed-merges, pm-skill-id-lint, pm-skill-ratchet, skill-compatibility, skill-frame-sync, skill-frame-freshness. Ratchet before/after: SKILL.md 681 -> 681 (ceiling 682, headroom 1, net-zero extraction); os-dev.md 352 -> 353 (ceiling 399, headroom 46). files_changed: .claude/skills/pm-dispatch/SKILL.md, .claude/agents/os-dev.md, skills/objectstack-pm-dispatch/SKILL.md, scripts/check-skill-frame-sync.mjs, scripts/check-skill-frame-freshness.mjs. skip-changeset applied read-modify-write over the bot's labels and read back present.", "open_questions": [ { "question": "Axis 2's name: the ruling's shorthand says 平台长远合理性, but the frame (and AXIS_MAP zh pattern) has always said 项目长远合理性, and the card's enumerated changes do not include an axis-2 rename. Rename it?", "options": ["A keep 项目长远合理性 (done in this PR)", "B rename to 平台长远合理性 in all four copies + AXIS_MAP in a follow-up"], "recommendation": "A, because the same 平台 shorthand already appears in the pre-existing 2026-08-12 quote without the frame ever adopting it, and a rename is a separate frame change the card did not order; B is a one-line follow-up if the maintainer wants it." } ], "out_of_scope_findings": [] }Generated by Claude Code
Generated by Claude Code
os-support-ai commentedon Aug 19, 2026
ACCEPT — PR #9811 (reviewer of record: skills seat, session
session_01WswfK2yNYT9hNnMH6TzAwL). Governed surface ⇒ terminal three-step: conclusion here, PR stays draft awaiting the maintainer's merge, round report lists it.Verified at head
87b713eby my own runs — not the report's self-description: frame-sync reports 4 copies isomorphic / 4 axes: business-need → long-term-soundness → ai-authoring-safety → startup-scope-discipline / 4 count mentions agree; ratchets green (SKILL.md 681/682 net-zero extraction; os-dev.md 353/399); id-lint clean. Surface: the five files are the four synced copies' three files + the two frame checkers — the checker edits are the gate's own mandated AXIS_MAP entry (4 lines, verified minimal in the diff) plus fixture retargets for exactly the literals the rename turned red; a justified extension of the claimed only-if-red clause, declared and explained in the report. Extraction audited: the 聚焦原则 quote and clauses moved from axis 1 to axis 4, not rewritten.One open question for the maintainer, dev-raised: the ruling's shorthand for axis 2 says 平台长远合理性; the frame has always said 项目长远合理性 and the card ordered no rename, so the PR keeps 项目 (recommendation A). If you want 平台, it is a one-line follow-up across the four copies + AXIS_MAP — say the word.
Generated by Claude Code
os-support-ai commentedon Aug 19, 2026
Close-out accounting (skills seat, session
session_01WswfK2yNYT9hNnMH6TzAwL): PR #9811 MERGED 2026-08-19 01:35Z via the maintainer's enqueue; card auto-closed viaFixes, stalepm:dispatchedremoved (read-modify-write, read back). The decision frame is four first-class axes on main — 实际业务需求 · 项目长远合理性 · 防 AI 写代码犯错 · 创业阶段不扩散需求 — across all four synced copies, frame-sync enforcing. The axis-2 naming question (项目 vs 平台) remains open for a one-word maintainer answer; current text keeps 项目.Generated by Claude Code
docs(skills): elevate startup scope discipline to a first-class fourt…