elanous 0.2.9 → 0.2.11
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/apps/pwa/out/404/index.html +1 -1
- package/apps/pwa/out/404.html +1 -1
- package/apps/pwa/out/_next/static/Y4zKzL62sakG5momz3SoQ/_buildManifest.js +1 -0
- package/apps/pwa/out/_next/static/chunks/1159-0c5ef8bc21cb6afb.js +1 -0
- package/apps/pwa/out/_next/static/chunks/1394-556de6d71bbdb0fb.js +1 -0
- package/apps/pwa/out/_next/static/chunks/1452.93700483b9d4fc61.js +9 -0
- package/apps/pwa/out/_next/static/chunks/{6062-73e68343a9814f6a.js → 1829-b453a1b22d3999bb.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/2176-c379e3ebce874151.js +1 -0
- package/apps/pwa/out/_next/static/chunks/2310-7a59f043f6db207e.js +1 -0
- package/apps/pwa/out/_next/static/chunks/2426.8c6ee0c668d53def.js +1 -0
- package/apps/pwa/out/_next/static/chunks/2548-6e316138d347cefe.js +1 -0
- package/apps/pwa/out/_next/static/chunks/3170-7ec60a56fa0e4728.js +1 -0
- package/apps/pwa/out/_next/static/chunks/3278-ae6ef084769f6195.js +1 -0
- package/apps/pwa/out/_next/static/chunks/3454-988a53dac60a1763.js +1 -0
- package/apps/pwa/out/_next/static/chunks/3638-aa80b4641ea439db.js +1 -0
- package/apps/pwa/out/_next/static/chunks/3735-fe3402553ac1c9c6.js +1 -0
- package/apps/pwa/out/_next/static/chunks/3869-a39d1d9921e10d43.js +1 -0
- package/apps/pwa/out/_next/static/chunks/390.c373e31b3b9d0c41.js +5 -0
- package/apps/pwa/out/_next/static/chunks/3992-2e522a8ac5f2afde.js +25 -0
- package/apps/pwa/out/_next/static/chunks/4215-c9d91dd644ec1719.js +1 -0
- package/apps/pwa/out/_next/static/chunks/4508-5d0161d1e724d735.js +1 -0
- package/apps/pwa/out/_next/static/chunks/4685-c3c1c625b71accd1.js +1 -0
- package/apps/pwa/out/_next/static/chunks/4733-623a79345b171e1c.js +1 -0
- package/apps/pwa/out/_next/static/chunks/4883.3bd969ea1d3aaaff.js +2 -0
- package/apps/pwa/out/_next/static/chunks/507-5acd98bd6dab2d8a.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5445-745eb795c5963d79.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5532.6899a12958a89b72.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5845-e6c003ce8d5fd36a.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5978-b27004c677119115.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{8046cadf-211ca3c0e00f2b72.js → 5cd7e3a9-404fd6b8d0ecd44c.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/6048-4c5c33579bc4ef78.js +1 -0
- package/apps/pwa/out/_next/static/chunks/6303-422dbf0f67c72aac.js +1 -0
- package/apps/pwa/out/_next/static/chunks/6751-bb3595948b2e311b.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7274-19b7279f18b47ab3.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{4323.c5dfb6f503304775.js → 7334.a6679d9168f37aa8.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/7551-a0e0707b79164ddd.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7777-79f845045aa1ed86.js +1 -0
- package/apps/pwa/out/_next/static/chunks/79f8be9e-957d68913b590b08.js +1 -0
- package/apps/pwa/out/_next/static/chunks/8025-cc24ee5d8f2fb6f8.js +1 -0
- package/apps/pwa/out/_next/static/chunks/8039-df92e08fede5de8f.js +1 -0
- package/apps/pwa/out/_next/static/chunks/8206-c6684dcde12be721.js +1 -0
- package/apps/pwa/out/_next/static/chunks/8421-1c4acfb1395a0edf.js +1 -0
- package/apps/pwa/out/_next/static/chunks/8605-ea5bee9dfae512c7.js +1 -0
- package/apps/pwa/out/_next/static/chunks/8725.bf46bb1395dd0fa2.js +1 -0
- package/apps/pwa/out/_next/static/chunks/8734-252d511cd276c0dc.js +1 -0
- package/apps/pwa/out/_next/static/chunks/8834-ca1cb09c1cb1a6bf.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{2415.ed6428ff334c7ce2.js → 9269.d2a4795bc6812717.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/9538-2816b90923606459.js +1 -0
- package/apps/pwa/out/_next/static/chunks/9656-c1540088f5859c80.js +1 -0
- package/apps/pwa/out/_next/static/chunks/9906-482c6619b3fdda20.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/_not-found/page-d16993889b125c42.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/approvals/page-1dcdc58fc2de2454.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/autopilot/page-6a061bd97f0b9398.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/board/page-cb95a7432c9ee744.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/botlab/{page-f972fc1c00a62e88.js → page-b12b6d2f8d2d1aea.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/app/bots/page-b9efe868bfd36255.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/chat/page-7c97dcdfe2e37a60.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/consult/page-8fd36984f549270a.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/control/page-5721537ca8a3598c.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/design-check/page-b654240a572e4c48.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/editor/page-b9750abc897508c3.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/exec/page-4cd1de371f8ad048.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/field/page-d99f89657828421c.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/healthz/route-d16993889b125c42.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/inside/page-50cb2a0eb15e6c83.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/intake/page-c8b1ccda6ba7ae98.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/layout-d6b1d156fb95e74b.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/live/page-2a9932ddb62d76bd.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/market/page-9688f5b4f1ff950f.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/missions/[id]/page-6b15dd6456c5df09.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/morning/{page-adfbd2ba9598e59a.js → page-35414e0a007b4082.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/app/not-found-e7a529e0507ac86c.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/observatory/page-e001823c35c9dd67.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/ops/checklist/page-371423d1a573d64b.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/ops/release/page-4b764b125339ac17.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/ops/seats/page-cdf8e4b01067bcf1.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/outputs/page-3a24072b35470157.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/page-94c82eb0ae5abb32.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/reflection/page-0be8d4b2ced75ba0.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/scheduler/page-d37cb0d52f9b6bd5.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/sessions/page-686da0df9bf23e5c.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/settings/devices/page-4dc614f3ce043e63.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/settings/page-53f80edc6b8dc07c.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/setup/done/page-d02c782fc792e2af.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/setup/layout-d16993889b125c42.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/setup/page-239c17b911b84e72.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/share/page-dc6a79fb003f746c.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/showroom/page-0fffb84cafdc9da6.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/tasks/page-1218753c82d585f6.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/term/page-4b5935e67531efb5.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/today/page-3285bc87caf1eaa5.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/trace/page-ad553b0e06505ecd.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/vault/page-fca096e3e860306f.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/workflows/chat-ui/page-9ebfa78f0d9885c3.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/workflows/page-3dc5f21f7e39622d.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/workspace/page-c6da2b468454532d.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/worktrees/page-93bc70e36f595414.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{2ea96958-e8c7e112de50b067.js → f48170cc-d05d28bf87a43bf4.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/framework-172630e6aa5e2d7f.js +1 -0
- package/apps/pwa/out/_next/static/chunks/main-app-f0fe2d7477845181.js +1 -0
- package/apps/pwa/out/_next/static/chunks/main-fc98ac70b44eccb0.js +1 -0
- package/apps/pwa/out/_next/static/chunks/pages/_app-5bd7f10271f72413.js +1 -0
- package/apps/pwa/out/_next/static/chunks/pages/_error-97d0d85ea05fef9b.js +1 -0
- package/apps/pwa/out/_next/static/chunks/webpack-9e4d02d567b98240.js +1 -0
- package/apps/pwa/out/_next/static/css/543f56bcb1f79fca.css +1 -0
- package/apps/pwa/out/approvals/index.html +1 -1
- package/apps/pwa/out/approvals/index.txt +23 -23
- package/apps/pwa/out/autopilot/index.html +1 -1
- package/apps/pwa/out/autopilot/index.txt +23 -23
- package/apps/pwa/out/board/index.html +1 -1
- package/apps/pwa/out/board/index.txt +23 -23
- package/apps/pwa/out/botlab/index.html +1 -1
- package/apps/pwa/out/botlab/index.txt +22 -22
- package/apps/pwa/out/bots/index.html +1 -1
- package/apps/pwa/out/bots/index.txt +22 -22
- package/apps/pwa/out/chat/index.html +1 -1
- package/apps/pwa/out/chat/index.txt +22 -22
- package/apps/pwa/out/consult/index.html +1 -1
- package/apps/pwa/out/consult/index.txt +23 -23
- package/apps/pwa/out/control/index.html +1 -1
- package/apps/pwa/out/control/index.txt +23 -23
- package/apps/pwa/out/design-check/index.html +1 -1
- package/apps/pwa/out/design-check/index.txt +23 -23
- package/apps/pwa/out/editor/index.html +1 -1
- package/apps/pwa/out/editor/index.txt +23 -23
- package/apps/pwa/out/exec/index.html +1 -1
- package/apps/pwa/out/exec/index.txt +23 -23
- package/apps/pwa/out/field/index.html +1 -1
- package/apps/pwa/out/field/index.txt +23 -23
- package/apps/pwa/out/healthz +1 -1
- package/apps/pwa/out/index.html +1 -1
- package/apps/pwa/out/index.txt +22 -22
- package/apps/pwa/out/inside/index.html +1 -0
- package/apps/pwa/out/inside/index.txt +31 -0
- package/apps/pwa/out/intake/index.html +1 -1
- package/apps/pwa/out/intake/index.txt +23 -23
- package/apps/pwa/out/live/index.html +1 -1
- package/apps/pwa/out/live/index.txt +23 -23
- package/apps/pwa/out/market/index.html +1 -1
- package/apps/pwa/out/market/index.txt +22 -22
- package/apps/pwa/out/missions/placeholder/index.html +1 -1
- package/apps/pwa/out/missions/placeholder/index.txt +22 -22
- package/apps/pwa/out/morning/index.html +1 -1
- package/apps/pwa/out/morning/index.txt +23 -23
- package/apps/pwa/out/observatory/index.html +1 -1
- package/apps/pwa/out/observatory/index.txt +23 -23
- package/apps/pwa/out/ops/checklist/index.html +1 -1
- package/apps/pwa/out/ops/checklist/index.txt +22 -22
- package/apps/pwa/out/ops/release/index.html +1 -1
- package/apps/pwa/out/ops/release/index.txt +22 -22
- package/apps/pwa/out/ops/seats/index.html +1 -0
- package/apps/pwa/out/ops/seats/index.txt +30 -0
- package/apps/pwa/out/outputs/index.html +1 -0
- package/apps/pwa/out/outputs/index.txt +30 -0
- package/apps/pwa/out/reflection/index.html +1 -1
- package/apps/pwa/out/reflection/index.txt +23 -23
- package/apps/pwa/out/scheduler/index.html +1 -1
- package/apps/pwa/out/scheduler/index.txt +23 -23
- package/apps/pwa/out/sessions/index.html +1 -1
- package/apps/pwa/out/sessions/index.txt +22 -22
- package/apps/pwa/out/settings/devices/index.html +1 -1
- package/apps/pwa/out/settings/devices/index.txt +23 -23
- package/apps/pwa/out/settings/index.html +1 -1
- package/apps/pwa/out/settings/index.txt +23 -23
- package/apps/pwa/out/setup/done/index.html +1 -1
- package/apps/pwa/out/setup/done/index.txt +23 -23
- package/apps/pwa/out/setup/index.html +1 -1
- package/apps/pwa/out/setup/index.txt +23 -23
- package/apps/pwa/out/share/index.html +1 -1
- package/apps/pwa/out/share/index.txt +23 -23
- package/apps/pwa/out/showroom/index.html +1 -1
- package/apps/pwa/out/showroom/index.txt +22 -22
- package/apps/pwa/out/tasks/index.html +1 -1
- package/apps/pwa/out/tasks/index.txt +23 -23
- package/apps/pwa/out/term/index.html +1 -1
- package/apps/pwa/out/term/index.txt +23 -24
- package/apps/pwa/out/today/index.html +1 -0
- package/apps/pwa/out/today/index.txt +33 -0
- package/apps/pwa/out/trace/index.html +1 -1
- package/apps/pwa/out/trace/index.txt +23 -23
- package/apps/pwa/out/vault/index.html +1 -1
- package/apps/pwa/out/vault/index.txt +23 -23
- package/apps/pwa/out/workflows/chat-ui/index.html +1 -1
- package/apps/pwa/out/workflows/chat-ui/index.txt +23 -23
- package/apps/pwa/out/workflows/index.html +1 -1
- package/apps/pwa/out/workflows/index.txt +23 -23
- package/apps/pwa/out/workspace/index.html +1 -1
- package/apps/pwa/out/workspace/index.txt +23 -24
- package/apps/pwa/out/worktrees/index.html +1 -1
- package/apps/pwa/out/worktrees/index.txt +23 -23
- package/graphs/drafts/draft-cleanup.yaml +19 -0
- package/graphs/drafts/recipes.yaml +23 -0
- package/graphs/field/field-feed.yaml +2 -0
- package/graphs/implement-loop.yaml +1 -1
- package/graphs/intake/intake-daily.yaml +2 -1
- package/graphs/ops/recipes.yaml +3 -0
- package/graphs/ops/secret-exposure.yaml +24 -0
- package/graphs/release/recipes.yaml +3 -0
- package/graphs/release/release-loop.yaml +4 -1
- package/graphs/video/explainer-line.yaml +2 -2
- package/package.json +2 -1
- package/plugins/card-followup/graphs/run-step.ts +48 -13
- package/plugins/doc-draft/graphs/doc-draft.yaml +3 -3
- package/plugins/doc-draft/graphs/run-step.ts +13 -6
- package/plugins/elanous-hwp/README.md +25 -0
- package/plugins/elanous-hwp/cli.ts +22 -0
- package/plugins/elanous-hwp/converter.ts +237 -0
- package/plugins/elanous-hwp/fixtures/fixed-controls.hwpx +0 -0
- package/plugins/elanous-hwp/fixtures/fixed-table-controls.hwpx +0 -0
- package/plugins/elanous-hwp/fixtures/fixed.hwpx +0 -0
- package/plugins/elanous-hwp/plugin.json +16 -0
- package/plugins/elanous-hwp/plugin.ts +40 -0
- package/scripts/ci-public-export-leak-gate.ts +75 -14
- package/scripts/ci-public-leak-gate.ts +44 -9
- package/scripts/ci-pwa-build-gate.ts +160 -0
- package/scripts/context-hooks/claude-stop.sh +4 -0
- package/scripts/context-hooks/emit.ts +24 -0
- package/scripts/context-hooks/post-tool-use.sh +4 -0
- package/scripts/coord-channel-watch.sh +54 -8
- package/scripts/coord-digest.ts +199 -0
- package/scripts/coord-post.sh +60 -3
- package/scripts/coord-requests-bridge.ts +143 -0
- package/scripts/field-feed/lib.ts +4 -0
- package/scripts/fleet/node-setup.sh +20 -3
- package/scripts/homebrew-formula-bump.ts +69 -0
- package/scripts/install.ps1 +68 -9
- package/scripts/install.sh +39 -12
- package/scripts/lib/pwa-scenarios/scenarios.ts +20 -0
- package/scripts/lib/tui-regress-checks.ts +146 -0
- package/scripts/marketing/measure-site-numbers.ts +169 -0
- package/scripts/measure-gate-shards.ts +309 -0
- package/scripts/memory-lifecycle-cycle.ts +2 -2
- package/scripts/mission-request-judge.ts +31 -1
- package/scripts/morning-report.ts +2 -2
- package/scripts/opportunity-scan.ts +1 -1
- package/scripts/ops-now-probe.ts +327 -0
- package/scripts/publish-internal-dist.ts +11 -1
- package/scripts/release-loop/auto-approve-node.ts +21 -4
- package/scripts/release-loop/cut-branch.ts +84 -0
- package/scripts/release-loop/cutoff.ts +19 -8
- package/scripts/release-loop/gate-node.ts +14 -13
- package/scripts/release-loop/mac-smoke-node.ts +229 -0
- package/scripts/release-loop/node-verdict.ts +3 -3
- package/scripts/release-loop/ops-upgrade-node.ts +72 -16
- package/scripts/release-loop/release-readiness.ts +9 -0
- package/scripts/release-loop/tui-node-checks.ts +42 -0
- package/scripts/release-loop/tui-sim-node.ts +32 -8
- package/scripts/release-loop/unattended-release.ts +5 -3
- package/scripts/release-loop/version-node.ts +112 -13
- package/scripts/repo-watch-cycle.ts +1 -1
- package/scripts/retro-cycle.ts +2 -2
- package/scripts/schedule-health-report.ts +1 -1
- package/scripts/signal-digest-cycle.ts +2 -7
- package/scripts/signal-digest-photo.ts +11 -0
- package/scripts/storyboard/storyboard.ts +5 -161
- package/scripts/tech1-public-measure.ts +94 -0
- package/scripts/test-diet/lib.ts +30 -1
- package/scripts/test-diet/node.ts +83 -8
- package/scripts/test-timeout-audit.ts +114 -0
- package/scripts/tree-sync-alert.ts +1 -1
- package/scripts/tui-regress.ts +71 -0
- package/scripts/ux/demo-rehearsal.ts +243 -0
- package/scripts/ux/lib/rehearsal-verdict.ts +73 -0
- package/scripts/waitlist-daily-digest.ts +1 -1
- package/skills/diagram-master/SKILL.md +366 -0
- package/skills/diagram-master/references/engines/excalidraw/color-palette.md +67 -0
- package/skills/diagram-master/references/engines/excalidraw/element-templates.md +182 -0
- package/skills/diagram-master/references/engines/excalidraw/json-schema.md +71 -0
- package/skills/diagram-master/references/engines/excalidraw/render_excalidraw.py +189 -0
- package/skills/diagram-master/references/engines/excalidraw/render_template.html +57 -0
- package/skills/diagram-master/references/engines/matplotlib/matplotlib-patterns.md +235 -0
- package/skills/diagram-master/references/engines/matplotlib/render_matplotlib.py +184 -0
- package/skills/diagram-master/references/engines/mermaid/domain-templates.md +435 -0
- package/skills/diagram-master/references/engines/mermaid/render_mermaid.py +116 -0
- package/skills/diagram-master/references/engines/mermaid/syntax-reference.md +2247 -0
- package/skills/diagram-master/references/engines/nanobannana/render_nanobannana2.py +168 -0
- package/skills/diagram-master/references/engines/svg/color-palette.md +188 -0
- package/skills/diagram-master/references/engines/svg/html-base-template.html +332 -0
- package/skills/diagram-master/references/engines/svg/interactivity-patterns.md +435 -0
- package/skills/diagram-master/references/engines/svg/render_interactive_svg.py +212 -0
- package/skills/diagram-master/references/engines/svg/svg-element-templates.md +349 -0
- package/skills/diagram-master/references/examples/README.md +69 -0
- package/skills/diagram-master/references/examples/ref_grid_architecture.png +0 -0
- package/skills/diagram-master/references/examples/ref_layered_flow.png +0 -0
- package/skills/diagram-master/references/pyproject.toml +16 -0
- package/skills/diagram-master/references/quality-checklist.md +33 -0
- package/skills/diagram-master/references/routing-guide.md +164 -0
- package/skills/diagram-master/references/uv.lock +1356 -0
- package/skills/explainer-video/SKILL.md +4 -0
- package/skills/explainer-video/engine/reel.mjs +18 -13
- package/skills/explainer-video/engine/reel.sh +24 -5
- package/skills/explainer-video/engine/stitch.mjs +145 -0
- package/skills/google-workspace/SKILL.md +33 -0
- package/skills/google-workspace/scripts/gws-safe.sh +177 -0
- package/skills/grill-me/SKILL.md +1 -1
- package/skills/lecture-note-digitizer/SKILL.md +926 -0
- package/skills/lecture-note-digitizer/references/convert_to_pdf.py +30 -0
- package/skills/lecture-note-digitizer/references/extract_slide_diagram.py +73 -0
- package/skills/lecture-note-digitizer/references/html-template.md +167 -0
- package/skills/lecture-note-digitizer/references/katex-style-guide.md +165 -0
- package/skills/omni-crawl/SKILL.md +21 -11
- package/skills/omni-crawl/scripts/main.ts +6 -6
- package/skills/omni-crawl/src/router.ts +3 -3
- package/skills/omni-digest/SKILL.md +17 -9
- package/skills/omni-digest/digest.md +2 -2
- package/skills/omni-digest/src/fetch.ts +30 -3
- package/skills/pitch-deck/SKILL.md +36 -0
- package/skills/pitch-deck/template.html +80 -0
- package/skills/youtube-master/SKILL.md +163 -0
- package/skills/youtube-master/package-lock.json +558 -0
- package/skills/youtube-master/package.json +13 -0
- package/skills/youtube-master/references/study-note-template.md +124 -0
- package/skills/youtube-master/scripts/main.ts +435 -0
- package/skills/youtube-master/scripts/transcribe-local.ts +24 -0
- package/skills/youtube-master/src/audio.ts +63 -0
- package/skills/youtube-master/src/domain-staging.ts +50 -0
- package/skills/youtube-master/src/env.ts +36 -0
- package/skills/youtube-master/src/obsidian.ts +155 -0
- package/skills/youtube-master/src/router.ts +110 -0
- package/skills/youtube-master/src/stt.ts +199 -0
- package/skills/youtube-master/src/study-note.ts +175 -0
- package/skills/youtube-master/src/summarize.ts +358 -0
- package/skills/youtube-master/src/transcript.ts +76 -0
- package/skills/youtube-master/src/types.ts +91 -0
- package/skills/youtube-master/src/util.ts +93 -0
- package/skills/youtube-master/src/youtube.ts +70 -0
- package/skills/youtube-master/tsconfig.json +13 -0
- package/src/acp/codex-approval-adapter.ts +9 -3
- package/src/acp/core-turn-bridge.ts +117 -18
- package/src/acp/fact-question.ts +11 -0
- package/src/acp/server.ts +53 -9
- package/src/acp/tool-approval.ts +126 -0
- package/src/acp/turn-runner.ts +36 -0
- package/src/agent/monad-agent-turn.ts +8 -0
- package/src/agent-mission/driver.ts +80 -10
- package/src/agent-mission/pty-decision.ts +71 -0
- package/src/agent-mission/review-loop.ts +30 -0
- package/src/ask-user-question/pending-questions.ts +25 -10
- package/src/ask-user-question/types.ts +9 -0
- package/src/auth/setup-link-tokens.ts +16 -5
- package/src/autopilot/build/integrity-gate.ts +12 -0
- package/src/autopilot/build/llm-conflict-merge.ts +16 -3
- package/src/autopilot/tool-registry.ts +2 -0
- package/src/boot/daemon-prompt-turn.ts +8 -0
- package/src/boot/daemon-runtime.ts +9 -3
- package/src/boot/daemon-tools/index.ts +8 -0
- package/src/boot/daemon-tools/types.ts +2 -0
- package/src/boot/daemon-tools/web-search.ts +4 -0
- package/src/card-followup/core.ts +109 -0
- package/src/chat/ctrl-c-in-input.ts +14 -0
- package/src/chat/index.ts +53 -0
- package/src/chat/pickers/state.ts +6 -2
- package/src/cli/agent-cli.ts +7 -0
- package/src/cli/decisions-cli.ts +25 -3
- package/src/cli/doctor-bundle-upload.ts +68 -0
- package/src/cli/doctor-cli.ts +38 -4
- package/src/cli/drive-input-jail.ts +101 -0
- package/src/cli/hooks-cli.ts +17 -3
- package/src/cli/make-cli.ts +43 -0
- package/src/cli/ops-cli.ts +20 -0
- package/src/cli/persona-cli.ts +90 -4
- package/src/cli/plugin-cli.ts +31 -22
- package/src/cli/pod-cli.ts +61 -2
- package/src/cli/pr-cli.ts +82 -17
- package/src/cli/pty-drive-cli.ts +41 -7
- package/src/cli/pty-drive-verdict.ts +40 -0
- package/src/cli/pwa-stop.ts +163 -13
- package/src/cli/pwa-test.ts +3 -0
- package/src/cli/release-cli.ts +80 -24
- package/src/cli/self-update.ts +14 -0
- package/src/cli/setup-cli.ts +43 -1
- package/src/cli/skills-cli.ts +17 -1
- package/src/cli/storyboard-cli.ts +37 -0
- package/src/cli/test-state-dir-flag.ts +11 -4
- package/src/connectors/linear.ts +146 -0
- package/src/context-bus/claude-hooks-install.ts +10 -0
- package/src/context-bus/context-now-surfaces.ts +48 -0
- package/src/context-bus/context-now.ts +104 -0
- package/src/context-bus/coord-events.ts +115 -0
- package/src/context-bus/external-events.ts +52 -0
- package/src/context-bus/long-term-memory.ts +108 -0
- package/src/dashboard/dashboard-boot-fixture.ts +23 -0
- package/src/dashboard/index.ts +63 -21
- package/src/dashboard/slash-runtime/dashboard-handlers.ts +14 -1
- package/src/dashboard/slash-runtime/help-from-registry.ts +43 -28
- package/src/decisions/decision-cards.ts +58 -3
- package/src/decisions/decision-ledger.ts +85 -6
- package/src/decisions/decision-linear-projection.ts +157 -0
- package/src/decisions/web-push-decision-cards.ts +50 -0
- package/src/directive/interpretation-card.ts +36 -0
- package/src/discord/sprint21-runtime.ts +5 -1
- package/src/discord-self-message.ts +32 -0
- package/src/discord-slash-wire.ts +5 -1
- package/src/discord.ts +19 -2
- package/src/domains/coo-admin-tool.ts +62 -0
- package/src/domains/core-tools.ts +13 -4
- package/src/domains/elanous-card.ts +29 -0
- package/src/domains/ops-facts-tool.ts +76 -0
- package/src/domains/outbound-alert.ts +46 -13
- package/src/domains/release-tool.ts +168 -0
- package/src/domains/telegram-kind-route.ts +65 -9
- package/src/exec-requests/default-outputs.ts +25 -0
- package/src/exec-requests/planner.ts +106 -28
- package/src/exec-requests/runner.ts +123 -12
- package/src/exec-requests/store.ts +11 -2
- package/src/execution-loop/launch-gate.ts +100 -0
- package/src/field/field-media.ts +10 -7
- package/src/field/field-reel.ts +19 -5
- package/src/field-note/index.ts +201 -0
- package/src/field-note/transcribe.ts +248 -0
- package/src/git-fs/worktree.ts +45 -6
- package/src/graph-kinds/registry.ts +3 -3
- package/src/graph-runner/graph-approval-card.ts +113 -0
- package/src/graph-runner/graph-cli.ts +189 -4
- package/src/graph-runner/graph-grow-llm.ts +37 -0
- package/src/graph-runner/graph-grow.ts +47 -0
- package/src/graph-runner/graph-notify.ts +25 -3
- package/src/graph-runner/runner.ts +453 -35
- package/src/grok/agent-search.ts +8 -2
- package/src/guardian/secret-exposure-scan.ts +101 -0
- package/src/harness/browser-verify.ts +25 -2
- package/src/harness/harness-cli-command.ts +478 -42
- package/src/harness/harness-incidents-writer.fixture.ts +24 -0
- package/src/harness/harness-incidents.ts +129 -0
- package/src/harness/harness-pod-dispatch.ts +43 -23
- package/src/harness/harness-seams.ts +38 -4
- package/src/harness/harness-stop.ts +75 -6
- package/src/harness/launch-registry.ts +91 -0
- package/src/harness/process-garbage.ts +5 -3
- package/src/hitl/clarification-policy.ts +3 -1
- package/src/hooks/dispatch.ts +82 -0
- package/src/hooks/expose.ts +254 -0
- package/src/hooks/github-shadow.ts +108 -0
- package/src/hooks/providers.ts +71 -5
- package/src/hooks/queue.ts +1 -1
- package/src/hooks/receiver.ts +21 -20
- package/src/index.ts +206 -49
- package/src/intake-plane/author-goals.ts +37 -4
- package/src/intake-plane/categorize.ts +18 -46
- package/src/intake-plane/check.ts +3 -0
- package/src/intake-plane/discord-seat-work.ts +57 -2
- package/src/intake-plane/front-route-classifier.ts +33 -39
- package/src/intake-plane/persona-answer.ts +30 -0
- package/src/intake-plane/runtime-callables.ts +8 -1
- package/src/intake-plane/seat-doc-route.ts +170 -6
- package/src/intake-plane/telegram-seat-work.ts +80 -4
- package/src/intake-plane/telegram-work.ts +1 -0
- package/src/intake-plane/wish-folder.ts +67 -0
- package/src/intent-gate/gate.ts +30 -10
- package/src/live/detail-switch.ts +5 -0
- package/src/llm/difficulty.ts +57 -0
- package/src/llm/judge-layer.ts +101 -0
- package/src/llm/mission-router.ts +33 -19
- package/src/loops/contract/examples/cmo-seat.loop.yaml +51 -0
- package/src/loops/contract/examples/orchestrator.loop.yaml +57 -0
- package/src/loops/contract/examples/steward.loop.yaml +50 -0
- package/src/loops/contract/loop-agent.schema.json +138 -0
- package/src/loops/contract/validate.ts +64 -0
- package/src/loops/registry.ts +20 -6
- package/src/market/signed-index.ts +4 -0
- package/src/maturity/bot-command-maturity.ts +45 -0
- package/src/maturity/cli-maturity.ts +34 -0
- package/src/maturity/feature-maturity.ts +120 -1
- package/src/maturity/tui-slash-maturity.ts +31 -0
- package/src/memory.ts +32 -4
- package/src/model-tier/index.ts +2 -2
- package/src/model-tier/tier-resolver.ts +20 -20
- package/src/model-tier/types.ts +6 -6
- package/src/mss/logging/log-store.ts +15 -0
- package/src/nexus/api/config-model-tier.ts +5 -4
- package/src/nexus/api/exec-requests.ts +33 -3
- package/src/nexus/api/fabric-plans.ts +53 -0
- package/src/nexus/api/harness-api.ts +5 -1
- package/src/nexus/api/health.ts +2 -0
- package/src/nexus/api/http-server.ts +89 -1
- package/src/nexus/api/inside-events.ts +226 -0
- package/src/nexus/api/meta-api.ts +32 -8
- package/src/nexus/api/missions.ts +6 -1
- package/src/nexus/api/ops-api.ts +10 -1
- package/src/nexus/api/ops-seats-sources.ts +37 -7
- package/src/nexus/api/ops-seats.ts +49 -6
- package/src/nexus/api/outputs-route.ts +44 -0
- package/src/nexus/api/seat-requests.ts +132 -10
- package/src/nexus/api/sessions-store.ts +42 -0
- package/src/nexus/api/setup-codex-login.ts +160 -0
- package/src/nexus/api/sub-seat-charters.ts +34 -0
- package/src/nexus/api/tabs-mutations.ts +3 -1
- package/src/nexus/api/trace.ts +18 -6
- package/src/nexus/api/usage-api.ts +102 -0
- package/src/nexus/api/workflow-run-event-bridge.ts +1 -0
- package/src/nexus/api/workflows.ts +80 -6
- package/src/nexus/index.ts +47 -4
- package/src/nexus/kinds/webterm.ts +2 -1
- package/src/nexus/webterm/pty.ts +6 -2
- package/src/onboarding/cli-auth-status.ts +80 -0
- package/src/onboarding/first-run.ts +89 -0
- package/src/onboarding/lan-address.ts +45 -0
- package/src/onboarding/voice-ai.ts +3 -3
- package/src/onboarding/web-first.ts +119 -24
- package/src/onboarding.ts +4 -0
- package/src/ops-now/ops-now-refresh.ts +100 -0
- package/src/org/seat-budget.ts +48 -0
- package/src/org/stall-escalation.ts +63 -0
- package/src/outputs/ledger.ts +120 -0
- package/src/persona/persona-todo.ts +79 -0
- package/src/persona/presets.ts +116 -2
- package/src/persona/team-set.ts +155 -0
- package/src/plugins/install/plugin-install.ts +14 -0
- package/src/plugins/maker/market-bundle.ts +109 -0
- package/src/plugins/maker/plugin-maker.ts +254 -11
- package/src/plugins/maker/wizard-generate.ts +103 -0
- package/src/pod-lease/admission.ts +150 -0
- package/src/pod-lease/dependency-state.ts +85 -0
- package/src/pod-lease/host-lease.ts +127 -0
- package/src/project/project-store.ts +115 -0
- package/src/project/project-suggestion.ts +16 -0
- package/src/project/session-context.ts +24 -0
- package/src/release-loop/checklist.ts +79 -5
- package/src/release-loop/feature-store.ts +159 -24
- package/src/release-loop/next-md-merge.ts +58 -0
- package/src/release-loop/release-note.ts +59 -4
- package/src/release-loop/release-schedule.ts +53 -0
- package/src/repl/index.ts +7 -0
- package/src/seat-dispatch/ceo-commands.ts +41 -8
- package/src/seat-dispatch/ceo-intent.ts +38 -0
- package/src/seat-dispatch/seat-ask.ts +130 -0
- package/src/seat-dispatch/seat-questions.ts +100 -0
- package/src/seat-loop/seat-loop.ts +750 -0
- package/src/seat-loop/seat-report.ts +99 -0
- package/src/self-dev/decompose.ts +66 -11
- package/src/self-dev/dev-cli.ts +4 -1
- package/src/self-dev/dev-pipeline.ts +37 -1
- package/src/self-dev/draft-sweep.ts +38 -33
- package/src/self-dev/draft-triage-rules.ts +8 -5
- package/src/self-dev/fabric-plan-core.ts +297 -0
- package/src/self-dev/orchestrate.ts +36 -4
- package/src/self-dev/release-path-guard.ts +62 -0
- package/src/self-dev/run-store.ts +10 -1
- package/src/self-dev/shard-aggregate.ts +230 -0
- package/src/self-dev/shard-placement.ts +60 -0
- package/src/self-dev/shard-plan.ts +48 -0
- package/src/self-dev/shard-pod-run.ts +77 -0
- package/src/self-dev/shard-run.ts +105 -0
- package/src/self-implement/execution-clarification.ts +115 -0
- package/src/self-implement/gate-baseline.ts +1 -1
- package/src/self-implement/gate-cli.ts +46 -4
- package/src/self-implement/gate-scope.ts +37 -7
- package/src/self-implement/graph-variant.ts +171 -0
- package/src/self-implement/harness-policy-gates.ts +1 -1
- package/src/self-implement/headless-elanous-driver.ts +22 -3
- package/src/self-implement/host-regate.ts +22 -1
- package/src/self-implement/importer-test-index.ts +2 -1
- package/src/self-implement/l8-merge-queue.ts +130 -0
- package/src/self-implement/orchestrator.ts +279 -12
- package/src/self-implement/pipeline-shape.ts +1 -1
- package/src/self-implement/route-consumer-test-index.ts +122 -0
- package/src/self-implement/run-status-mapping.ts +5 -3
- package/src/self-implement/seams.ts +72 -11
- package/src/self-implement/test-seams.ts +1 -0
- package/src/self-implement/uncommitted-work.ts +59 -0
- package/src/session/chat.ts +2 -0
- package/src/session/index.ts +45 -13
- package/src/shell-env-bootstrap.ts +17 -0
- package/src/skills/gift-install.ts +215 -0
- package/src/skills/tools/web-search.ts +4 -1
- package/src/steward/directive.ts +51 -2
- package/src/steward/launch.ts +266 -0
- package/src/steward/outcome-notify.ts +115 -0
- package/src/steward/steward-cards.ts +25 -11
- package/src/steward/triage-plan.ts +32 -4
- package/src/steward/triage.ts +129 -13
- package/src/steward/working-backwards.ts +64 -0
- package/src/storyboard/storyboard.ts +141 -0
- package/src/task-cards/card-cli.ts +25 -1
- package/src/task-cards/card-store.ts +2 -2
- package/src/task-orchestrator/mission.ts +5 -0
- package/src/task-orchestrator/store.ts +12 -3
- package/src/task-orchestrator/surfaces/pod-command-job.ts +29 -7
- package/src/task-orchestrator/surfaces/pod-lease.ts +397 -0
- package/src/task-orchestrator/surfaces/pod-pool.ts +127 -26
- package/src/task-orchestrator/surfaces/self-implement-pod.ts +214 -40
- package/src/task-orchestrator/surfaces/self-implement.ts +15 -2
- package/src/task-orchestrator/types.ts +2 -0
- package/src/telegram-card-followup.ts +153 -0
- package/src/telegram-commands.ts +10 -1
- package/src/telegram-project-command.ts +71 -0
- package/src/telegram-report.ts +29 -19
- package/src/telegram-run.ts +7 -0
- package/src/telegram.ts +58 -11
- package/src/tool-runtime/self-cognition-runtimes.ts +13 -3
- package/src/tool-runtime/types.ts +4 -0
- package/src/tui-client/dashboard-session.ts +2 -0
- package/src/user-config.ts +216 -27
- package/src/version/packed-revision.json +1 -1
- package/src/web-push/notify-exec-request.ts +32 -0
- package/src/web-search/grok.ts +7 -1
- package/src/web-search/index.ts +28 -1
- package/src/web-search/provider.ts +4 -0
- package/src/web-search/x-intent.ts +5 -0
- package/src/workflow-runtime/executor.ts +277 -47
- package/src/workflow-runtime/index.ts +1 -0
- package/src/workflow-runtime/nodes/subworkflow.ts +60 -0
- package/src/workflow-runtime/plugin-kind-node.ts +1 -1
- package/src/workflow-runtime/schema.ts +79 -4
- package/src/workflow-runtime/types.ts +35 -4
- package/apps/pwa/out/_next/static/bFI5EEwg7T6aG88ibX4Zq/_buildManifest.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1105-c473ed46272fba79.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1201-09613bce624467c0.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1377-1efeffbbac0963ff.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1470.98a6ab61ccb4131c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/216-5acd01cbde4acda7.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2330-c2f07246c8788af1.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2375-cb6debea56cce4fb.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2929-617f1e66a55be184.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2977-e38442e86289f1d3.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2982-2a2df543be3d2e5a.js +0 -25
- package/apps/pwa/out/_next/static/chunks/3403.4bc97b4066945a94.js +0 -5
- package/apps/pwa/out/_next/static/chunks/3441-a1dd4acfeda14488.js +0 -1
- package/apps/pwa/out/_next/static/chunks/371-4ad6af55dad02ced.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4114-3e63117452378807.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5080-1613752891fcadb4.js +0 -10
- package/apps/pwa/out/_next/static/chunks/5609-012bb3557211f07e.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5791-bb82743fa6299562.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6090-85a3f05f954e5697.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6284-69db415193d5f8bd.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6320-baac91d68843a9a6.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6416-505ba707cacafbba.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6725-68ab7cc0b1faf00d.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6998-a654fe5c58271600.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7032-f4ef698518fba61c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7647.2fcd30d894d5ee30.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7673-2eda1507d38dadb8.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7990-e12efba616f46e03.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8067-d976b441a104ab74.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8142-744998d65d7bb17e.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8519-5632377cce994f86.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8619-4365e03a2862830f.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8630-cdfc61e82c653ffc.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8894-e263b332208e3957.js +0 -1
- package/apps/pwa/out/_next/static/chunks/920-f7dceb78f1c585ef.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9454-139040d37c79dbc9.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9651-3cd291a6fa1370d2.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9740-8f5ff96c522b5f55.js +0 -1
- package/apps/pwa/out/_next/static/chunks/ae787e4c-f2998de7f1ba72a4.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/_not-found/page-859cea1570b6227a.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/approvals/page-fb7c2d458f32fcad.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/autopilot/page-35e2713597dd24d1.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/board/page-918b656f064577ba.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/bots/page-5f30e00693527ebd.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/chat/page-7fbae173b3c103a7.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/consult/page-3b4edcce364062ea.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/control/page-c5794f484c251f44.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/design-check/page-1130d8eefcd87e76.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/editor/page-973996d584f008c1.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/exec/page-016e2bda04eecb1f.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/field/page-b4d6d9a3b56f2940.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/healthz/route-859cea1570b6227a.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/intake/page-ec49a466121233ba.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/layout-f72db356744ceade.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/live/page-a6fd9b50d1b85378.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/market/page-8b0402a46a749a3d.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/missions/[id]/page-037f83e2a1edc8e2.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/not-found-46fedff57d4bec67.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/observatory/page-0cf318e9dcee2bbf.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/ops/checklist/page-899b327cb8b6845c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/ops/release/page-6c1e6ba743a29dfe.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/page-1a8e4807292f6b17.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/reflection/page-28deba6bcb834916.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/scheduler/page-de68e2205794037d.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/sessions/page-c71c33a573230672.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/settings/devices/page-0df30e0c7e50148a.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/settings/page-4fc56790fe0d2682.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/setup/done/page-59df2aebb38a7c1e.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/setup/layout-859cea1570b6227a.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/setup/page-4647be5dbcbd0795.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/share/page-e025892bda74b743.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/showroom/page-a0955de73b89f078.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/tasks/page-369846d2921af584.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/term/page-72cbc1c8cdd0f65d.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/trace/page-77b28bfb0996d5ea.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/vault/page-3220c4934f49c6c2.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/workflows/chat-ui/page-90670589b87abea8.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/workflows/page-7df9243ed021a4cc.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/workspace/page-4498c3853f4f688d.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/worktrees/page-35bedde6d885f08f.js +0 -1
- package/apps/pwa/out/_next/static/chunks/framework-ea806bb57f2b8923.js +0 -1
- package/apps/pwa/out/_next/static/chunks/main-8d2302399c2c8f87.js +0 -1
- package/apps/pwa/out/_next/static/chunks/main-app-6870f30ea99f8346.js +0 -1
- package/apps/pwa/out/_next/static/chunks/pages/_app-b10928c60f0b8488.js +0 -1
- package/apps/pwa/out/_next/static/chunks/pages/_error-689039227d443fab.js +0 -1
- package/apps/pwa/out/_next/static/chunks/webpack-e5bea36f183b25e6.js +0 -1
- package/apps/pwa/out/_next/static/css/f92f63a5df0ba229.css +0 -1
- package/src/dashboard/turn-typeahead-echo.ts +0 -23
- /package/apps/pwa/out/_next/static/{bFI5EEwg7T6aG88ibX4Zq → Y4zKzL62sakG5momz3SoQ}/_ssgManifest.js +0 -0
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
import { spawnSync } from 'node:child_process';
|
|
2
|
+
import { existsSync, mkdirSync, mkdtempSync, rmSync, writeFileSync } from 'node:fs';
|
|
3
|
+
import { tmpdir } from 'node:os';
|
|
4
|
+
import { join } from 'node:path';
|
|
5
|
+
import { NEXT_MD_PATH, resolveNextMdConflict } from '../release-loop/next-md-merge.js';
|
|
6
|
+
|
|
7
|
+
type Command = (bin: string, args: readonly string[], cwd: string) => { status: number | null; stdout: string; stderr: string };
|
|
8
|
+
export type L8MergeQueueInput = { number: number; cwd: string; matchHeadCommit: string };
|
|
9
|
+
export type L8MergeQueueResult = { merged: boolean; baseRefName?: string; mergeCommit?: string; detail?: string };
|
|
10
|
+
export type L8MergeQueueDeps = {
|
|
11
|
+
command?: Command;
|
|
12
|
+
/** Must identify the same shared repository across all harness processes. */
|
|
13
|
+
acquire?: (cwd: string) => Promise<() => void>;
|
|
14
|
+
};
|
|
15
|
+
|
|
16
|
+
const command: Command = (bin, args, cwd) => {
|
|
17
|
+
const r = spawnSync(bin, [...args], { cwd, encoding: 'utf8', timeout: 600_000, maxBuffer: 32 * 1024 * 1024 });
|
|
18
|
+
return { status: r.status, stdout: r.stdout ?? '', stderr: (r.stderr ?? '') + (r.error?.message ?? '') };
|
|
19
|
+
};
|
|
20
|
+
|
|
21
|
+
/** Serialize the whole read/integrate/test/merge transaction, not just the final push. */
|
|
22
|
+
export async function acquireL8MergeQueue(cwd: string): Promise<() => void> {
|
|
23
|
+
const git = command('git', ['rev-parse', '--path-format=absolute', '--git-common-dir'], cwd);
|
|
24
|
+
if (git.status !== 0 || !git.stdout.trim()) throw new Error('merge queue common git directory unavailable');
|
|
25
|
+
const slot = join(git.stdout.trim(), 'elanous-l8-merge-queue');
|
|
26
|
+
const deadline = Date.now() + 30 * 60_000;
|
|
27
|
+
for (;;) {
|
|
28
|
+
try {
|
|
29
|
+
mkdirSync(slot);
|
|
30
|
+
try { writeFileSync(join(slot, 'pid'), String(process.pid)); }
|
|
31
|
+
catch (error) { rmSync(slot, { recursive: true, force: true }); throw new Error(`merge queue pid write failed: ${String(error)}`); }
|
|
32
|
+
return () => rmSync(slot, { recursive: true, force: true });
|
|
33
|
+
} catch (error) {
|
|
34
|
+
if ((error as NodeJS.ErrnoException).code !== 'EEXIST') throw error;
|
|
35
|
+
// Fail closed on abandoned slots: never steal a slot while a live merge can own it.
|
|
36
|
+
if (Date.now() >= deadline) throw new Error('merge queue occupied for 30 minutes');
|
|
37
|
+
await new Promise((resolve) => setTimeout(resolve, 250));
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
/** One PR per shared git directory, integrated on a freshly fetched main in a disposable worktree. */
|
|
43
|
+
export async function runL8MergeQueue(input: L8MergeQueueInput, deps: L8MergeQueueDeps = {}): Promise<L8MergeQueueResult> {
|
|
44
|
+
if (!Number.isSafeInteger(input.number) || input.number <= 0 || !/^[0-9a-f]{40}$/i.test(input.matchHeadCommit)) {
|
|
45
|
+
return { merged: false, detail: 'invalid PR number or pinned head' };
|
|
46
|
+
}
|
|
47
|
+
const execute = deps.command ?? command;
|
|
48
|
+
const run = (bin: string, args: readonly string[], cwd: string): string => {
|
|
49
|
+
const result = execute(bin, args, cwd);
|
|
50
|
+
if (result.status !== 0) throw new Error(`${bin} ${args.join(' ')}: ${(result.stderr || result.stdout || `exit ${result.status}`).trim().slice(0, 500)}`);
|
|
51
|
+
return args.includes('-z') ? result.stdout : result.stdout.trim();
|
|
52
|
+
};
|
|
53
|
+
let release: (() => void) | undefined;
|
|
54
|
+
let temp: string | undefined;
|
|
55
|
+
let attached = false;
|
|
56
|
+
try {
|
|
57
|
+
release = await (deps.acquire ?? acquireL8MergeQueue)(input.cwd);
|
|
58
|
+
type View = { headRefOid?: string; headRefName?: string; baseRefName?: string; state?: string; isDraft?: boolean; isCrossRepository?: boolean; mergeCommit?: { oid?: string } | null };
|
|
59
|
+
const view = (): View => JSON.parse(run('gh', ['pr', 'view', String(input.number), '--json', 'headRefOid,headRefName,baseRefName,state,isDraft,isCrossRepository,mergeCommit'], input.cwd));
|
|
60
|
+
const first = view();
|
|
61
|
+
if (first.headRefOid !== input.matchHeadCommit || first.baseRefName !== 'main' || first.state !== 'OPEN' || first.isDraft !== false || first.isCrossRepository !== false || !first.headRefName || !/^[\w./-]+$/.test(first.headRefName) || first.headRefName.startsWith('-') || first.headRefName === 'main') {
|
|
62
|
+
throw new Error('PR head, base, or ready/open state changed');
|
|
63
|
+
}
|
|
64
|
+
run('git', ['fetch', 'origin', 'refs/heads/main'], input.cwd);
|
|
65
|
+
const base = run('git', ['rev-parse', 'FETCH_HEAD'], input.cwd);
|
|
66
|
+
run('git', ['fetch', 'origin', `refs/pull/${input.number}/head`], input.cwd);
|
|
67
|
+
if (run('git', ['rev-parse', 'FETCH_HEAD'], input.cwd) !== input.matchHeadCommit) throw new Error('fetched PR head changed');
|
|
68
|
+
temp = mkdtempSync(join(tmpdir(), 'elanous-l8-'));
|
|
69
|
+
run('git', ['worktree', 'add', '--detach', temp, input.matchHeadCommit], input.cwd);
|
|
70
|
+
attached = true;
|
|
71
|
+
const fork = run('git', ['merge-base', base, input.matchHeadCommit], temp);
|
|
72
|
+
const paths = run('git', ['diff', '--name-only', '-z', fork, input.matchHeadCommit], temp).split('\0').filter(Boolean);
|
|
73
|
+
if (!paths.length) throw new Error('PR changed-file paths unavailable');
|
|
74
|
+
if (paths.some((path) => path.startsWith('-') || path.startsWith('/') || path.split('/').includes('..') || path.includes('\\'))) throw new Error('unsafe PR changed-file path');
|
|
75
|
+
// Deleted tests are not runnable; a successful diff with no runnable paths is not a failed lookup.
|
|
76
|
+
const livePaths = run('git', ['diff', '--name-only', '-z', '--diff-filter=ACMRT', fork, input.matchHeadCommit], temp).split('\0').filter(Boolean);
|
|
77
|
+
const isBunTest = (path: string) => /(?:^|\/)[^/]+\.(?:test|spec)\.(?:[cm]?[jt]sx?)$/.test(path);
|
|
78
|
+
const tests = livePaths.filter(isBunTest);
|
|
79
|
+
const merge = execute('git', ['-c', 'user.name=elanous merge queue', '-c', 'user.email=queue@localhost', 'merge', '--no-ff', '--no-edit', base], temp);
|
|
80
|
+
if (merge.status !== 0) {
|
|
81
|
+
const unresolved = run('git', ['diff', '--name-only', '--diff-filter=U'], temp).split('\n').filter(Boolean);
|
|
82
|
+
if (unresolved.length !== 1 || unresolved[0] !== NEXT_MD_PATH) throw new Error(`merge conflicts: ${unresolved.join(', ') || merge.stderr}`);
|
|
83
|
+
const stage = (n: number): string => {
|
|
84
|
+
const result = execute('git', ['show', `:${n}:${NEXT_MD_PATH}`], temp!);
|
|
85
|
+
if (result.status !== 0) throw new Error(`release/next.md stage ${n} unavailable: ${result.stderr}`);
|
|
86
|
+
return result.stdout;
|
|
87
|
+
};
|
|
88
|
+
// Git stage 2 is the PR and stage 3 is main; the resolver preserves stage 2 and unions main's additions.
|
|
89
|
+
const resolved = resolveNextMdConflict(stage(1), stage(3), stage(2));
|
|
90
|
+
if (resolved === null) throw new Error('release/next.md conflict is not append-only');
|
|
91
|
+
writeFileSync(join(temp, NEXT_MD_PATH), resolved);
|
|
92
|
+
run('git', ['add', '--', NEXT_MD_PATH], temp);
|
|
93
|
+
run('git', ['-c', 'user.name=elanous merge queue', '-c', 'user.email=queue@localhost', 'commit', '-m', 'Integrate latest main for L8 merge queue'], temp);
|
|
94
|
+
}
|
|
95
|
+
if (tests.length) {
|
|
96
|
+
const unavailable = tests.filter((path) => !existsSync(join(temp!, path)));
|
|
97
|
+
if (unavailable.length) throw new Error(`changed test paths unavailable: ${unavailable.join(', ')}`);
|
|
98
|
+
// The disposable checkout must resolve the integrated candidate's lockfile, never the caller's modules.
|
|
99
|
+
run('bun', ['install', '--frozen-lockfile'], temp);
|
|
100
|
+
const result = execute('bun', ['test', ...tests], temp);
|
|
101
|
+
const output = `${result.stdout}\n${result.stderr}`;
|
|
102
|
+
if (result.status !== 0 || !/\b[1-9]\d* pass\b/.test(output) || !/\b0 fail\b/.test(output) || !/Ran [1-9]\d* tests? across [1-9]\d* files?/.test(output)) throw new Error(`changed tests failed or unmeasured: ${output.slice(-400)}`);
|
|
103
|
+
}
|
|
104
|
+
run('git', ['fetch', 'origin', 'refs/heads/main'], input.cwd);
|
|
105
|
+
if (run('git', ['rev-parse', 'FETCH_HEAD'], input.cwd) !== base) throw new Error('main advanced during queue verification; retry on latest main');
|
|
106
|
+
const current = view();
|
|
107
|
+
if (current.headRefOid !== first.headRefOid || current.headRefName !== first.headRefName || current.baseRefName !== 'main' || current.state !== 'OPEN' || current.isDraft !== false || current.isCrossRepository !== false) throw new Error('PR changed during queue verification');
|
|
108
|
+
const integrated = run('git', ['rev-parse', 'HEAD'], temp);
|
|
109
|
+
const remoteHead = run('git', ['ls-remote', 'origin', `refs/heads/${first.headRefName}`], temp).split(/\s+/)[0];
|
|
110
|
+
if (remoteHead !== input.matchHeadCommit) throw new Error('PR branch advanced before queue push');
|
|
111
|
+
run('git', ['fetch', 'origin', 'refs/heads/main'], input.cwd);
|
|
112
|
+
if (run('git', ['rev-parse', 'FETCH_HEAD'], input.cwd) !== base) throw new Error('main advanced before queue merge; retry on latest main');
|
|
113
|
+
// One atomic push (review must-fix: head check and merge were not atomic): the PR branch moves to the tested commit only
|
|
114
|
+
// while it still equals the pinned head (lease), and main moves to the same commit only as a fast-forward. The server
|
|
115
|
+
// applies both ref updates or neither, so an advanced PR head or main rejects the whole merge — nothing stale lands.
|
|
116
|
+
// main then contains the PR head, so GitHub records the PR as merged.
|
|
117
|
+
run('git', ['push', '--atomic', `--force-with-lease=refs/heads/${first.headRefName}:${input.matchHeadCommit}`, 'origin',
|
|
118
|
+
`HEAD:refs/heads/${first.headRefName}`, 'HEAD:refs/heads/main'], temp);
|
|
119
|
+
// The push itself is the merge decision; confirm main holds exactly the tested commit (a later push to the PR branch is a new change, not this merge).
|
|
120
|
+
run('git', ['fetch', 'origin', 'refs/heads/main'], input.cwd);
|
|
121
|
+
if (run('git', ['rev-parse', 'FETCH_HEAD'], input.cwd) !== integrated) throw new Error('main does not point to tested merge commit');
|
|
122
|
+
return { merged: true, baseRefName: 'main', mergeCommit: integrated };
|
|
123
|
+
} catch (error) {
|
|
124
|
+
return { merged: false, detail: String(error) };
|
|
125
|
+
} finally {
|
|
126
|
+
if (attached && temp) execute('git', ['worktree', 'remove', '--force', temp], input.cwd);
|
|
127
|
+
if (temp) rmSync(temp, { recursive: true, force: true });
|
|
128
|
+
release?.();
|
|
129
|
+
}
|
|
130
|
+
}
|
|
@@ -67,6 +67,7 @@ import { decideLineageSupersede, lineageSupersedeCloseComment, type LineageSuper
|
|
|
67
67
|
import { basename, isAbsolute, join, relative, resolve, sep } from 'node:path';
|
|
68
68
|
import { enqueueControlMemo, readSoftStopRequestStatus, type SoftStopRequestRead } from '../harness/control-inbox.js';
|
|
69
69
|
import { debug } from '../debug/log.js';
|
|
70
|
+
import { releasePathHold, releasePathHoldComment, RELEASE_PATH_LABEL } from '../self-dev/release-path-guard.js';
|
|
70
71
|
import { emitDecision } from '../live/detail-switch.js';
|
|
71
72
|
import { reworkDecision } from './decision-events.js';
|
|
72
73
|
import type { LogSink } from '../mss/logging/sink.js';
|
|
@@ -79,6 +80,7 @@ import { classifyReviewProviderFailure } from '../self-dev/review-provider-fallb
|
|
|
79
80
|
import { classifyError } from '../session-runtime/retry-policy.js';
|
|
80
81
|
import { decomposeSelfDevGoal, inferHotPaths, type SelfDevDecomposeOptions } from '../self-dev/decompose.js';
|
|
81
82
|
import { boundaryGlobs, boundaryViolations } from './goal-boundary.js';
|
|
83
|
+
import { askAtExecution, type ExecutionClarificationResult } from './execution-clarification.js';
|
|
82
84
|
import { targetScopedGoalText } from './goal-text-path-scope.js';
|
|
83
85
|
import type { SelfDevGoalType } from '../self-dev/orchestrate.js';
|
|
84
86
|
import { DEFAULT_BRANCH_WORKTREE_BASE, gateGitResidue, observeGitResidue } from '../git-fs/worktree.js';
|
|
@@ -92,10 +94,10 @@ import { originObservationFields } from '../agent/origin-observation.js';
|
|
|
92
94
|
import { getHarnessSpace, normalizeSpaceId, resolveRunIdentity } from '../harness/harness-space.js';
|
|
93
95
|
import { getElanousConfigDir } from '../elanous-config-dir.js';
|
|
94
96
|
import { elanousStateRoot } from '../autopilot/state-paths.js';
|
|
95
|
-
import { harnessReleaseNote, releaseNotesDir, renderReleaseNoteSection, writeReleaseNote, type ReleaseNoteFragment } from '../release-loop/release-note.js';
|
|
97
|
+
import { addNextMdReleaseNote, harnessReleaseNote, parseReleaseNoteSection, releaseNotesDir, renderReleaseNoteSection, writeReleaseNote, type ReleaseNoteFragment, type ReleaseNoteSection } from '../release-loop/release-note.js';
|
|
96
98
|
import { plannedSelfImplBranch } from '../harness/worktree-branch-prefix.js';
|
|
97
99
|
export { slugifyFeature } from '../harness/worktree-branch-prefix.js';
|
|
98
|
-
import { resolveAutoReviewLabels } from './context-capsule.js';
|
|
100
|
+
import { AUTO_REVIEW_LABEL, resolveAutoReviewLabels } from './context-capsule.js';
|
|
99
101
|
import { GOAL_TYPES, extractVerbatimOriginalAsk, leadingGoalMetadata, parseAskFile, parseGoalType, type GoalType } from './goal-author.js';
|
|
100
102
|
import { resolveAdaptiveMaxReworkDecision, resolveEscalateTier, resolveEscalateTarget, buildReworkFeature, failIndicator, isRepeatedUnverifiedOnlyGateFailure, unverifiedRepeatKey, appendReworkHistory, truncateReworkHistoryByItem, applyReworkBudgetDecision, parseContractConflictRelaxation, parseReworkBudgetDecision, resolveReworkBudgetCarry, stripReworkBudgetHeaders, countConsecutiveMustFixIds, mergeReworkNotes, resolveReworkKind, type ReworkPlanRevision, type ReworkNotePart } from './rework-policy.js';
|
|
101
103
|
import type { SupervisionReworkSource } from './supervision-vocabulary.js';
|
|
@@ -177,6 +179,8 @@ import type { EscalateTier } from './rework-policy.js';
|
|
|
177
179
|
import type { ClassifyShadowCallLLM } from './classify-shadow.js';
|
|
178
180
|
import { hasModuleLoadFailure, type GateTestFailure } from './gate-baseline.js';
|
|
179
181
|
import { commitWorktree, defaultBranchRef } from './seams.js';
|
|
182
|
+
import { detectUncommittedWork } from './uncommitted-work.js';
|
|
183
|
+
import { spawnSync } from 'node:child_process';
|
|
180
184
|
import { blockedDraftDisposition } from './blocked-draft-policy.js';
|
|
181
185
|
import { formatLlmMergeOutcome } from '../autopilot/build/llm-conflict-merge.js';
|
|
182
186
|
import { FOUND_CITED_PATH_REFUTATION_QUOTE, MISSING_CITED_PATH_REFUTATION_QUOTE, MUST_FIX_REFUTATION_ACKNOWLEDGEMENT_WITH_REASON, REFUTATION_QUOTE_GRAMMAR, observeMustFixCitedPaths, parseMustFixRefutationAcknowledgement, parseMustFixRefutations, renderMustFixCitedPathFacts, snapshotMustFixFindings, stableMustFixId, type ReflectEvidenceFacts, type ReflectGateFacts, type MustFixCitedPathFact, type MustFixFinding, type MustFixRecurrenceHistory, type MustFixRefutation, type MustFixRefutationKind } from './reflect-mustfix.js';
|
|
@@ -934,6 +938,10 @@ export interface SelfImplementSeams {
|
|
|
934
938
|
* PR 直前 main-싱크 전에 impl 변경을 먼저 커밋). 기본=commitWorktree. 미주입 시 G2 pre-PR 싱크 skip(fail-safe).
|
|
935
939
|
* [[ROADMAP-elanous-is-all-pty-unified-autonomy-2026-07-21]] G2. */
|
|
936
940
|
commitWork?: (cwd: string, message: string) => void;
|
|
941
|
+
/** Observe a finished child's uncommitted work before classifying a missing diff. */
|
|
942
|
+
detectUncommittedWork?: typeof detectUncommittedWork;
|
|
943
|
+
/** Commit only the measured, eligible target paths. An injected seam preserves the same path boundary. */
|
|
944
|
+
commitFinishedChildWork?: (cwd: string, paths: readonly string[], message: string) => { ok: boolean; out: string };
|
|
937
945
|
/** --ground 코드베이스 prepass seam. cwd는 구현 대상 worktree이며 실패는 goal-loop를 막지 않는다. */
|
|
938
946
|
groundGoal?: (goalText: string, deps: { cwd: string }) => Promise<string>;
|
|
939
947
|
/** ③ 구현 — cwd(worktree)에서 코딩 에이전트 구동(P1: 헤드리스 elanous spawn·goal-loop 아밍).
|
|
@@ -967,6 +975,8 @@ export interface SelfImplementSeams {
|
|
|
967
975
|
/** 변경 파일 목록 — 게이트 «라우터»가 「코드가 바뀌었나」를 판정하는 입력.
|
|
968
976
|
* ⛔ 미지정이면 실물 `changedFiles(cwd)` 를 쓴다. 못 얻으면 `undefined` 이고, 라우터는 그때 «돌린다»(fail-safe). */
|
|
969
977
|
changedFilesForGateRoute?: (cwd: string) => readonly string[] | undefined;
|
|
978
|
+
/** An execution choice is made only after a measured change crosses the authored target paths. */
|
|
979
|
+
askExecutionClarification?: typeof askAtExecution;
|
|
970
980
|
/** ★ ⑤ 내부 리뷰 seam(2026-07-21·review-gated merge) — gate 통과 diff 를 리뷰어(reviewPullRequest·
|
|
971
981
|
* agent-substrate·staged 하니스와 동일 엔진)가 비평. verdict fail(mustFix) → rework 재주입(A 확장),
|
|
972
982
|
* clean(pass/warn) → 병합 결정. 미주입 시 리뷰 스킵(gate 통과=바로 결정·종전 동작). */
|
|
@@ -1007,6 +1017,8 @@ export interface SelfImplementSeams {
|
|
|
1007
1017
|
openPr: (opts: { title: string; body: string; head: string; base?: string; draft?: boolean; labels?: string[]; cwd: string }) => Promise<{ url: string; number: number }>;
|
|
1008
1018
|
/** PR 생성 뒤 런의 라운드 대화를 게시한다. 실패는 PR 개설을 되돌리지 않는다. */
|
|
1009
1019
|
postPrComment?: (opts: { number: number; body: string; cwd: string }) => Promise<void>;
|
|
1020
|
+
addPrLabel?: (opts: { number: number; label: string; cwd: string }) => Promise<void>;
|
|
1021
|
+
readPrFiles?: (opts: { number: number; cwd: string }) => Promise<string[]>;
|
|
1010
1022
|
/** PR의 base/head SHA와 관측된 PR base를 한 응답에서 고정한다. 미주입·실패·빈 SHA면 검사 대상을 증명할 수 없어 fail-closed로 PR을 열어 둔다. */
|
|
1011
1023
|
readPrCommitShas?: (opts: { number: number; cwd: string }) => Promise<{ baseCommit: string; headCommit: string; baseRefName?: string }>;
|
|
1012
1024
|
/** 고정한 base/head SHA 쌍의 unified diff. 가변 PR 조회를 다시 사용하면 ABA head 변경에 안전하지 않으므로 두 SHA는 필수 입력이다. */
|
|
@@ -1082,7 +1094,7 @@ export const SELF_IMPLEMENT_PROGRESS_STAGES = [
|
|
|
1082
1094
|
'gating', 'gated', 'reviewing', 'reviewed', 'awaiting-approval',
|
|
1083
1095
|
'pr-opening', 'pr-opened', 'merging', 'merged', 'worktree-completed',
|
|
1084
1096
|
'aborted', 'gate-failed', 'review-blocked', 'merge-conflict', 'pr-declined',
|
|
1085
|
-
'awaiting-clarification',
|
|
1097
|
+
'awaiting-clarification', 'parked',
|
|
1086
1098
|
// ⭐⭐ 🩸 2026-09-12 — ***「선언한 대상을 «하나도» 안 만들고 끝났다」를 사람 표면에 낸다.***
|
|
1087
1099
|
// ⛔ 기존 단계 이름을 «빌려 쓰지 않는다» — `progress()` 는 단계 이름으로 원장 행을 만들므로
|
|
1088
1100
|
// 빌려 쓰면 그 단계 집계가 오염된다([T] 2026-09-12 · `#17767` 이후 계약).
|
|
@@ -1945,6 +1957,8 @@ export interface SelfImplementOptions {
|
|
|
1945
1957
|
onNodeEntry?: (node: PipelineNodeId, round: number) => void;
|
|
1946
1958
|
/** 시험이 런치 오버레이를 빼 «지금 YAML 예산»을 읽게 할 때 쓴다. 생략하면 디스크 오버레이다. */
|
|
1947
1959
|
graphOverlays?: readonly GraphOverlaySpec[];
|
|
1960
|
+
/** Validated, run-local graph variant injected at launch; rejected plans never start the pipeline. */
|
|
1961
|
+
graphVariantPlan?: import('./graph-variant.js').GraphVariantPlan;
|
|
1948
1962
|
/** ★ K run-identity — 이 self-implement 호출의 per-run join anchor. 미지정 시 상속(env)→canonical mint.
|
|
1949
1963
|
* 리워크 라운드 전부가 이 값을 공유한다(`elanous self run <runId>` 가 호출 전체를 조인). */
|
|
1950
1964
|
runId?: string;
|
|
@@ -2507,8 +2521,40 @@ function goalDocumentForReleaseNote(goalFile?: string): string {
|
|
|
2507
2521
|
catch { return ''; }
|
|
2508
2522
|
}
|
|
2509
2523
|
|
|
2524
|
+
function shardReleaseNote(feature: string): ReleaseNoteSection | undefined {
|
|
2525
|
+
const matches = [...feature.matchAll(/^## Shard identity\r?\n([^\r\n]+)/gm)];
|
|
2526
|
+
const identity = matches.at(-1)?.[1];
|
|
2527
|
+
if (!identity) return undefined;
|
|
2528
|
+
try {
|
|
2529
|
+
const value: unknown = JSON.parse(identity);
|
|
2530
|
+
if (!value || typeof value !== 'object' || !('releaseNote' in value)) return undefined;
|
|
2531
|
+
const note = (value as { releaseNote: unknown }).releaseNote;
|
|
2532
|
+
if (!note || typeof note !== 'object' || Array.isArray(note)) return undefined;
|
|
2533
|
+
const candidate = note as Record<string, unknown>;
|
|
2534
|
+
if (typeof candidate.line !== 'string' || typeof candidate.kind !== 'string'
|
|
2535
|
+
|| typeof candidate.target !== 'string' || !candidate.docs || typeof candidate.docs !== 'object') return undefined;
|
|
2536
|
+
const doc = candidate.docs as Record<string, unknown>;
|
|
2537
|
+
if (typeof doc.path !== 'string' && typeof doc.none !== 'string') return undefined;
|
|
2538
|
+
const section = `## 릴리스 노트\n- 한 줄: ${candidate.line}\n- 종류: ${candidate.kind}\n- 문서: ${typeof doc.path === 'string' ? doc.path : `없음(${doc.none})`}\n- 대상: ${candidate.target}\n`;
|
|
2539
|
+
return parseReleaseNoteSection(section).fragment;
|
|
2540
|
+
} catch { return undefined; }
|
|
2541
|
+
}
|
|
2542
|
+
|
|
2543
|
+
function releaseNoteForRun(goalFile: string | undefined, feature: string): ReleaseNoteSection {
|
|
2544
|
+
const note = goalFile ? undefined : shardReleaseNote(feature);
|
|
2545
|
+
if (note) return note;
|
|
2546
|
+
const shard = !goalFile && feature.includes('## Shard identity');
|
|
2547
|
+
return harnessReleaseNote(goalDocumentForReleaseNote(goalFile), prTitle(feature), shard);
|
|
2548
|
+
}
|
|
2549
|
+
|
|
2550
|
+
/** GATE-CALLERS (OP 10-03): caller tests that exceeded the gate cap must stay visible in the PR body even when the gate log is cut. */
|
|
2551
|
+
export function gateNotRunSection(gateLog?: string): string[] {
|
|
2552
|
+
const lines = (gateLog ?? '').split('\n').filter((line) => line.startsWith('⚠️ caller test cap exceeded'));
|
|
2553
|
+
return lines.length ? ['', '## Gate · 안 돈 소비자 시험(상한 초과)', ...lines.map((line) => `- ${line.replace(/^⚠️ caller test cap exceeded — not run: /, '')}`)] : [];
|
|
2554
|
+
}
|
|
2555
|
+
|
|
2510
2556
|
function prBody(feature: string, implSummary: string, gateLog?: string, review?: SelfImplementReview, reviewIntent?: string, autoReviewDeclineReasons?: readonly string[], evidence?: string, goalFile?: string, planRevision?: ReworkPlanRevision, releaseNote?: ReturnType<typeof harnessReleaseNote>): string {
|
|
2511
|
-
const note = releaseNote ??
|
|
2557
|
+
const note = releaseNote ?? releaseNoteForRun(goalFile, feature);
|
|
2512
2558
|
const relaxation = planRevision?.relaxation
|
|
2513
2559
|
? ['', '## 감독 수용 기준 완화', `- 대상: ${planRevision.relaxation.target}`, `- 이전: ${planRevision.relaxation.expected}`, `- 완화: ${planRevision.relaxation.replacement}`, `- 이유: ${planRevision.reason}`, `- 적용: ${planRevision.application?.status ?? 'failed'}${planRevision.application?.detail ? ` (${planRevision.application.detail})` : ''}`, ...(planRevision.disposition ? [`- 충돌 처분: ${planRevision.disposition}`] : [])]
|
|
2514
2560
|
: [];
|
|
@@ -2527,6 +2573,7 @@ function prBody(feature: string, implSummary: string, gateLog?: string, review?:
|
|
|
2527
2573
|
...(review ? ['', `## 내부 리뷰 — ${review.verdict}`, review.summary.trim().slice(0, 1500),
|
|
2528
2574
|
...(review.shouldFix.length ? ['', '**should-fix (비블로킹):**', ...review.shouldFix.slice(0, 8).map((f) => `- ${f}`)] : [])] : []),
|
|
2529
2575
|
...(autoReviewDeclineReasons?.length ? ['', '## Auto-review label not applied', 'The requested auto-review label was declined by the autonomy gate:', ...autoReviewDeclineReasons.map((reason) => `- ${reason}`)] : []),
|
|
2576
|
+
...gateNotRunSection(gateLog),
|
|
2530
2577
|
...(gateLog ? ['', '## Gate', '```', gateLog.trim().slice(0, 3000), '```'] : []),
|
|
2531
2578
|
...relaxation,
|
|
2532
2579
|
'',
|
|
@@ -4450,6 +4497,51 @@ async function runSelfImplementInner(
|
|
|
4450
4497
|
// ⛔⭐ `let` 인 이유는 ③ «다이나믹»이다 — 라운드마다 runtime 오버레이가 «앞을 보는 것»만 바꾼다.
|
|
4451
4498
|
// ⛔ 지난 노드를 재정의하지 않는다(RFC §6: 그러면 원장을 사후에 해석할 수 없다).
|
|
4452
4499
|
let graphTemplate = graphDecision.template;
|
|
4500
|
+
let variantSpec: import('./graph-yaml.js').GraphTemplateSpec | undefined;
|
|
4501
|
+
if (opts.graphVariantPlan !== undefined) {
|
|
4502
|
+
const { GRAPH_SPECS, specToTemplate } = await import('./graph-templates.js');
|
|
4503
|
+
const { graphVersionHash } = await import('./graph-yaml.js');
|
|
4504
|
+
const { applyGraphOverlays } = await import('./graph-overlay-yaml.js');
|
|
4505
|
+
const { createGraphVariant } = await import('./graph-variant.js');
|
|
4506
|
+
const { runLedgerPath } = await import('./run-ledger.js');
|
|
4507
|
+
const { stringify } = await import('yaml');
|
|
4508
|
+
const baseSpec = GRAPH_SPECS[graphTemplate.graphId];
|
|
4509
|
+
const variantRunId = identity?.runId ?? opts.runId;
|
|
4510
|
+
if (!baseSpec || !variantRunId || graphDecision.rejections.length) {
|
|
4511
|
+
throw new Error('graph variant rejected: missing graph specification, run identity, or valid launch overlay');
|
|
4512
|
+
}
|
|
4513
|
+
const launch = graphDecision.appliedIds.length
|
|
4514
|
+
? applyGraphOverlays(baseSpec, graphOverlays.filter(overlay => graphDecision.appliedIds.includes(overlay.overlayId)))
|
|
4515
|
+
: undefined;
|
|
4516
|
+
if (launch && !launch.ok) throw new Error(`graph variant rejected: ${JSON.stringify(launch.rejections)}`);
|
|
4517
|
+
const sourceSpec = launch?.ok ? launch.template : baseSpec;
|
|
4518
|
+
const variant = createGraphVariant({ template: sourceSpec, goal: `g_${variantRunId.replace(/[^a-z0-9_-]/gi, '_')}`, plan: opts.graphVariantPlan });
|
|
4519
|
+
if (!variant.ok) throw new Error(`graph variant rejected: ${JSON.stringify(variant.rejections)}`);
|
|
4520
|
+
variantSpec = variant.template;
|
|
4521
|
+
graphTemplate = { ...specToTemplate(variantSpec), version: graphVersionHash(variantSpec) };
|
|
4522
|
+
const { runLedgerDir } = await import('./run-ledger.js');
|
|
4523
|
+
const graphFile = `${runLedgerPath(variantRunId)}.graph.yaml`;
|
|
4524
|
+
mkdirSync(runLedgerDir(), { recursive: true });
|
|
4525
|
+
const { writeFileSync } = await import('node:fs');
|
|
4526
|
+
writeFileSync(graphFile, stringify({
|
|
4527
|
+
graph_id: variantSpec.graphId, version: variantSpec.version,
|
|
4528
|
+
entry_node: variantSpec.entryNode, terminal_nodes: variantSpec.terminalNodes,
|
|
4529
|
+
...(variantSpec.runContract ? { run_contract: variantSpec.runContract } : {}),
|
|
4530
|
+
nodes: variantSpec.nodes.map(n => ({
|
|
4531
|
+
node_id: n.nodeId, kind: n.kind, recipe: n.recipe, max_visits: n.maxVisits,
|
|
4532
|
+
...(n.progress ? { progress: n.progress } : {}), ...(n.phases ? { phases: n.phases } : {}),
|
|
4533
|
+
...(n.terminalStages ? { terminal_stages: n.terminalStages } : {}),
|
|
4534
|
+
...(n.fanOut ? { fan_out: n.fanOut } : {}), ...(n.contract ? { contract: n.contract } : {}),
|
|
4535
|
+
})),
|
|
4536
|
+
edges: variantSpec.edges.map(e => ({
|
|
4537
|
+
from: e.from, ...(e.to === undefined ? { on: e.on, map: e.map } : { to: e.to }),
|
|
4538
|
+
...(e.fallback ? { fallback: e.fallback } : {}),
|
|
4539
|
+
...(e.observed === undefined ? {} : { observed: e.observed }),
|
|
4540
|
+
})),
|
|
4541
|
+
}), { flag: 'wx' });
|
|
4542
|
+
observe('graph-variant-applied', { graphId: variant.template.graphId, overlayId: variant.overlay.overlayId,
|
|
4543
|
+
graphFile, patches: variant.patches });
|
|
4544
|
+
}
|
|
4453
4545
|
/** 단계 이름 → 그 템플릿의 노드 이름. */
|
|
4454
4546
|
const node = (stage: PipelineNodeId): PipelineNodeId => nodeNameForStage(stage, graphTemplate) as PipelineNodeId;
|
|
4455
4547
|
// ⛔⭐ 맥락이 정해진 «직후» 관측기에 심는다 — 이 줄이 없으면 걸음은 YAML 을 따르고 «신원은 안 따른다».
|
|
@@ -4482,6 +4574,7 @@ async function runSelfImplementInner(
|
|
|
4482
4574
|
overlays: graphOverlays,
|
|
4483
4575
|
state: runtimeOverlayState,
|
|
4484
4576
|
stage: 'runtime',
|
|
4577
|
+
...(variantSpec ? { specs: { [variantSpec.graphId]: variantSpec } } : {}),
|
|
4485
4578
|
});
|
|
4486
4579
|
if (decision.appliedIds.length > 0) graphTemplate = decision.template;
|
|
4487
4580
|
// ⛔⭐ 승격이 켜져 있으면 «언제나» 낸다 — 후보가 0이어도 낸다.
|
|
@@ -5168,6 +5261,9 @@ async function runSelfImplementInner(
|
|
|
5168
5261
|
cachedQuotaExhaustionAssessment ??= readQuotaExhausted(s.inspectCodexRotation, runProviderName);
|
|
5169
5262
|
return cachedQuotaExhaustionAssessment;
|
|
5170
5263
|
};
|
|
5264
|
+
let finishedChildCommitMissing = false;
|
|
5265
|
+
let finishedChildCommitFailure: string | undefined;
|
|
5266
|
+
let finishedChildCommitted = false;
|
|
5171
5267
|
const classifyUnfinishedRun = (stage: SelfImplementStage, verdict?: ReworkBudgetVerdict, decomposition?: TerminalDecomposition): AbandonedClassificationResult => {
|
|
5172
5268
|
const quotaExhaustionAssessment = quotaExhaustionAssessmentForRun();
|
|
5173
5269
|
const worktree = unfinishedWorktreeObservation(wt.path);
|
|
@@ -5180,7 +5276,7 @@ async function runSelfImplementInner(
|
|
|
5180
5276
|
...(hasCurrentProviderError() && providerErrorCategory() ? { providerErrorCategory: providerErrorCategory() } : {}),
|
|
5181
5277
|
worktreePorcelain: worktree.worktreePorcelain,
|
|
5182
5278
|
...(worktree.gitResidue ? { gitResidue: worktree.gitResidue } : {}),
|
|
5183
|
-
...(impl.completionDisposition ? { completionDisposition: impl.completionDisposition } : {}),
|
|
5279
|
+
...(!finishedChildCommitMissing && !finishedChildCommitted && impl.completionDisposition ? { completionDisposition: impl.completionDisposition } : {}),
|
|
5184
5280
|
...(verdict ? { supervisorVerdict: verdict } : lastSupervisorVerdict ? { supervisorVerdict: lastSupervisorVerdict } : {}),
|
|
5185
5281
|
...(hasMultipleStructuredTerminalPieces(decomposition ?? terminalDecomposition) ? { goalCauseObserved: true } : {}),
|
|
5186
5282
|
stage,
|
|
@@ -5499,8 +5595,12 @@ async function runSelfImplementInner(
|
|
|
5499
5595
|
return { decision };
|
|
5500
5596
|
}
|
|
5501
5597
|
const followUpMustFix = `\n\n## Follow-up must-fix (${decision.unresolvedMustFix.length})\n${decision.unresolvedMustFix.map((finding) => `- ${finding}`).join('\n')}`;
|
|
5598
|
+
const releaseNote = releaseNoteForRun(opts.goalFile, opts.feature);
|
|
5599
|
+
// openPr's default seam delegates to PrManager.upsertPr, which stages, commits,
|
|
5600
|
+
// and pushes this worktree after the note is written and before creating the PR.
|
|
5601
|
+
addNextMdReleaseNote(wt.path, releaseNote);
|
|
5502
5602
|
const preparedPrBody = preparePrBody(
|
|
5503
|
-
`${prBody(opts.feature, impl.summary, gate.log, review, reviewIntent, undefined, harvestedForPr(), opts.goalFile, lastPlanRevision)}${followUpMustFix}`,
|
|
5603
|
+
`${prBody(opts.feature, impl.summary, gate.log, review, reviewIntent, undefined, harvestedForPr(), opts.goalFile, lastPlanRevision, releaseNote)}${followUpMustFix}`,
|
|
5504
5604
|
s.persistPrBodyArtifact,
|
|
5505
5605
|
'self-implement-review-budget-pr',
|
|
5506
5606
|
followUpMustFix,
|
|
@@ -6157,6 +6257,76 @@ async function runSelfImplementInner(
|
|
|
6157
6257
|
// ⭐ 성공 경로에서도 닫는다 — 이 호출은 끝났고, 이후 자식이 늦게 보내는 입력은
|
|
6158
6258
|
// 「이 라운드의 재투입」이 아니다(다음 라운드는 자기 콜백을 새로 만든다).
|
|
6159
6259
|
closeSupervisorInput();
|
|
6260
|
+
// A finished child can leave edits without a commit. Measure them before any
|
|
6261
|
+
// diff/no-changes classification, and commit only paths declared in the goal.
|
|
6262
|
+
finishedChildCommitMissing = false;
|
|
6263
|
+
finishedChildCommitFailure = undefined;
|
|
6264
|
+
finishedChildCommitted = false;
|
|
6265
|
+
if (impl.ok) {
|
|
6266
|
+
const work = (s.detectUncommittedWork ?? detectUncommittedWork)(wt.path);
|
|
6267
|
+
if (work.status === 'unavailable') {
|
|
6268
|
+
// Fail closed when the branch already carries commits: a PR could open without knowing whether the
|
|
6269
|
+
// goal's changes were committed (HARV1 review round 3). With no commits, the no-changes path decides.
|
|
6270
|
+
let branchFiles: readonly string[] | undefined;
|
|
6271
|
+
try { branchFiles = (s.changedFilesForGateRoute ?? changedFiles)(wt.path); } catch { branchFiles = undefined; }
|
|
6272
|
+
// Only a run that would open a PR needs the block — worktree-only completion opens none.
|
|
6273
|
+
// A path that isn't a git worktree at all (no .git) has nothing to open a PR from — only real worktrees block.
|
|
6274
|
+
const blocks = opts.completion !== 'worktree-only' && existsSync(join(wt.path, '.git'))
|
|
6275
|
+
&& (branchFiles === undefined || branchFiles.length > 0);
|
|
6276
|
+
if (blocks) {
|
|
6277
|
+
finishedChildCommitMissing = true;
|
|
6278
|
+
finishedChildCommitFailure = `working tree status unavailable: ${work.reason ?? 'unknown'}`;
|
|
6279
|
+
}
|
|
6280
|
+
observe('finished-child-commit', { round, status: 'unavailable', reason: work.reason, blocked: blocks }, { level: 'warn' });
|
|
6281
|
+
} else if (work.status === 'changes') {
|
|
6282
|
+
let goalDocument: string | undefined;
|
|
6283
|
+
if (opts.goalFile) {
|
|
6284
|
+
try { goalDocument = readFileSync(opts.goalFile, 'utf8'); } catch { /* no declared scope */ }
|
|
6285
|
+
}
|
|
6286
|
+
const declared = goalDocument === undefined ? undefined : declaredPathsFromGoalDocumentText(goalDocument);
|
|
6287
|
+
const targets = declared?.readable
|
|
6288
|
+
? declared.paths
|
|
6289
|
+
: inferHotPaths(targetScopedGoalText(opts.feature));
|
|
6290
|
+
const eligible = [...new Set([...work.trackedChanges, ...work.untrackedFiles])]
|
|
6291
|
+
.filter((path) => !harnessSeededPaths.includes(path)
|
|
6292
|
+
&& targets.some((target) => changedFileIsInsideDeclaredTarget(path, target)));
|
|
6293
|
+
if (eligible.length) {
|
|
6294
|
+
const message = `self-implement: ${prTitle(opts.feature)}`;
|
|
6295
|
+
let outcome: { ok: boolean; out: string };
|
|
6296
|
+
try {
|
|
6297
|
+
outcome = (s.commitFinishedChildWork ?? ((cwd, paths, title) => {
|
|
6298
|
+
const env = { ...process.env };
|
|
6299
|
+
for (const key of Object.keys(env)) if (key.startsWith('GIT_')) delete env[key];
|
|
6300
|
+
const childName = `elanous child ${runId}`;
|
|
6301
|
+
const childEmail = `child+${runId.replace(/[^a-zA-Z0-9-]/g, '')}@elanous.local`;
|
|
6302
|
+
env.GIT_AUTHOR_NAME = childName;
|
|
6303
|
+
env.GIT_AUTHOR_EMAIL = childEmail;
|
|
6304
|
+
env.GIT_COMMITTER_NAME = childName;
|
|
6305
|
+
env.GIT_COMMITTER_EMAIL = childEmail;
|
|
6306
|
+
const git = (args: string[]) => spawnSync('git', ['--no-optional-locks', ...args], {
|
|
6307
|
+
cwd, env, encoding: 'utf8', timeout: 20_000,
|
|
6308
|
+
});
|
|
6309
|
+
const staged = git(['add', '-A', '--', ...paths]);
|
|
6310
|
+
if (staged.status !== 0) return { ok: false, out: staged.stderr || staged.stdout || staged.error?.message || 'git add failed' };
|
|
6311
|
+
// --only commits these paths even when unrelated edits were staged before the child finished.
|
|
6312
|
+
const commit = git(['commit', '-m', title, '--only', '--', ...paths]);
|
|
6313
|
+
return { ok: commit.status === 0, out: commit.stderr || commit.stdout || commit.error?.message || '' };
|
|
6314
|
+
}))(wt.path, eligible, message);
|
|
6315
|
+
} catch (error) {
|
|
6316
|
+
outcome = { ok: false, out: safeErrorDescription(error) };
|
|
6317
|
+
}
|
|
6318
|
+
finishedChildCommitMissing = !outcome.ok;
|
|
6319
|
+
finishedChildCommitFailure = outcome.ok ? undefined : outcome.out;
|
|
6320
|
+
finishedChildCommitted = outcome.ok;
|
|
6321
|
+
observe('finished-child-commit', {
|
|
6322
|
+
round, status: outcome.ok ? 'committed' : 'commit-missing', paths: eligible,
|
|
6323
|
+
...(outcome.ok ? {} : { reason: outcome.out.slice(0, 500) }),
|
|
6324
|
+
}, outcome.ok ? {} : { level: 'warn' });
|
|
6325
|
+
} else {
|
|
6326
|
+
observe('finished-child-commit', { round, status: 'out-of-scope' });
|
|
6327
|
+
}
|
|
6328
|
+
}
|
|
6329
|
+
}
|
|
6160
6330
|
// ⭐ S3 — 자식 요약에서 diff 밖 이행 주장을 분류한다(자식 반환 계약은 그대로 둔다).
|
|
6161
6331
|
// ⛔ 버린 것을 **세어서** 남긴다 — 조용히 버리면 관측값이 항상 0이 되어 거짓 초록이 된다.
|
|
6162
6332
|
// ★ I-9/RUN-T6 — 꼬리 2000자가 아니라 **수확본**에서 판다. 자식이 먼저 돌린 tsc·뮤테이션 출력이
|
|
@@ -6239,9 +6409,10 @@ async function runSelfImplementInner(
|
|
|
6239
6409
|
orphanResult: offDiffEvidence.orphanResult,
|
|
6240
6410
|
...harvestObs,
|
|
6241
6411
|
}, { compact: { stringMax: Math.max(MAX_HARVESTED_EVIDENCE_CHARS, harvestObs.harvestedEvidence?.length ?? 0) } });
|
|
6242
|
-
|
|
6412
|
+
if (impl.ok) completionDisposition = finishedChildCommitMissing || finishedChildCommitted ? undefined : impl.completionDisposition;
|
|
6413
|
+
const effectiveDisposition = impl.ok ? completionDisposition : impl.completionDisposition;
|
|
6414
|
+
observe('implemented', { ok: impl.ok, round, ...(effectiveDisposition ? { completionDisposition: effectiveDisposition } : {}) });
|
|
6243
6415
|
progress('implemented', impl.ok ? (round === 0 ? '구현 완료' : `rework ${round} 완료`) : impl.completionDisposition ? '변경 없이 완료 검증' : '구현 실패(worktree 보존)');
|
|
6244
|
-
if (impl.ok) completionDisposition = impl.completionDisposition;
|
|
6245
6416
|
if (!impl.ok) {
|
|
6246
6417
|
finalizeSupervisorDeliveries('next-round-implement-not-ok');
|
|
6247
6418
|
const abort = buildImplementAbortRecord(impl.summary, impl.terminalStatus);
|
|
@@ -6268,6 +6439,46 @@ async function runSelfImplementInner(
|
|
|
6268
6439
|
return { ok: false, stage: 'aborted', node: 'implement', ...resolveRunOutcome({ termination: 'abandoned' }), sessionId, worktreePath: wt.path, branch: wt.branch, quotaExhaustionAssessment: quotaExhaustionAssessmentForRun(), ...(impl.completionDisposition ? { completionDisposition: impl.completionDisposition } : {}), ...(pr ? { prUrl: pr.url, prNumber: pr.number } : {}), detail: impl.summary };
|
|
6269
6440
|
}
|
|
6270
6441
|
|
|
6442
|
+
if (finishedChildCommitMissing) {
|
|
6443
|
+
finalizeSupervisorDeliveries('finished-child-commit-missing');
|
|
6444
|
+
const detail = `finished child changes could not be committed: ${finishedChildCommitFailure ?? 'commit failed'}`;
|
|
6445
|
+
progress('aborted', detail);
|
|
6446
|
+
return { ok: false, stage: 'aborted', node: 'implement', ...resolveRunOutcome({ termination: 'abandoned' }), sessionId, worktreePath: wt.path, branch: wt.branch, detail };
|
|
6447
|
+
}
|
|
6448
|
+
|
|
6449
|
+
// Measure the existing declared-target boundary after implementation, before gate/PR.
|
|
6450
|
+
// Unknown declaration or changed files cannot justify an invented choice.
|
|
6451
|
+
let gateRouteFiles: readonly string[] | undefined;
|
|
6452
|
+
try { gateRouteFiles = (s.changedFilesForGateRoute ?? changedFiles)(wt.path); } catch { gateRouteFiles = undefined; }
|
|
6453
|
+
if (opts.goalFile) {
|
|
6454
|
+
let goalDocument: string | undefined;
|
|
6455
|
+
try { goalDocument = readFileSync(opts.goalFile, 'utf8'); } catch { /* unknown scope */ }
|
|
6456
|
+
const scope = detectDeclaredScopeDiff({ goalDocument, changedFiles: gateRouteFiles?.filter(file => !harnessSeededPaths.includes(file)), nameCap: gateRouteFiles?.length });
|
|
6457
|
+
if (scope.status === 'known' && scope.outsideCount !== null && scope.outsideCount > 0) {
|
|
6458
|
+
const result: ExecutionClarificationResult = await (s.askExecutionClarification ?? askAtExecution)({
|
|
6459
|
+
id: 'execution_scope', decision: 'Changing files outside the authored target paths',
|
|
6460
|
+
prompt: 'Implementation changed files outside the authored target paths. Keep the original scope or expand it?',
|
|
6461
|
+
whyNow: 'Continuing to gate or publish these edits would expand the requested scope.',
|
|
6462
|
+
impact: scope.outsideNames.some(file => {
|
|
6463
|
+
if (existsSync(join(wt.path, file))) return false;
|
|
6464
|
+
const tracked = runGitCommand(wt.path, ['ls-files', '--error-unmatch', '--', file], { encoding: 'utf8', timeout: 20_000 });
|
|
6465
|
+
return tracked.status === 0;
|
|
6466
|
+
}) ? 'critical' : 'high',
|
|
6467
|
+
options: [
|
|
6468
|
+
{ label: 'Stay in scope', description: 'Do not accept out-of-scope changes.', recommended: true },
|
|
6469
|
+
{ label: 'Expand scope', description: 'Accept the changed files outside the target paths.' },
|
|
6470
|
+
],
|
|
6471
|
+
}, { runId }, { writeRunLedger: s.writeRunLedger });
|
|
6472
|
+
if ('parked' in result || 'deferred' in result || result.choice !== 'Expand scope') {
|
|
6473
|
+
finalizeSupervisorDeliveries('execution-scope-not-approved');
|
|
6474
|
+
observe('execution-scope-held', { outsideCount: scope.outsideCount, disposition: 'parked' in result ? 'parked' : 'in-scope-only' });
|
|
6475
|
+
if ('parked' in result) progress('parked', `critical 질문 ${result.questionId} 미응답 — 이 런만 대기`);
|
|
6476
|
+
return { ok: false, stage: 'parked' in result ? 'parked' : 'soft-stopped', node: 'implement', ...resolveRunOutcome({ termination: 'abandoned' }), sessionId, worktreePath: wt.path, branch: wt.branch,
|
|
6477
|
+
detail: 'parked' in result ? `critical-unanswered: ${result.questionId}` : 'Out-of-scope edits held in the worktree; gate and publication skipped.' };
|
|
6478
|
+
}
|
|
6479
|
+
}
|
|
6480
|
+
}
|
|
6481
|
+
|
|
6271
6482
|
// ⛔⭐ 이 템플릿이 `gate` 노드를 «안 가지면» 그 단계는 돌지 않는다.
|
|
6272
6483
|
// 📌 research-loop 이 그렇다 — 문서만 바뀐 판에는 «변경 파일 범위» 게이트가 돌 시험이 없다.
|
|
6273
6484
|
// ⚠️ 꺼진 상태에서는 언제나 implement-loop 이라 참이다 ⇒ 오늘과 «같은» 걸음이다.
|
|
@@ -6275,8 +6486,6 @@ async function runSelfImplementInner(
|
|
|
6275
6486
|
// 기본이 꺼짐이라 지금 폭발 반경은 0이고, 기본을 켜기 «전»에 이 구멍을 먼저 막아야 한다.
|
|
6276
6487
|
// ⛔⭐ 라우터가 판정한다 — 값은 «코드»가 낸다(RFC §4.3 ⑵). 「모른다」는 «돌린다» 쪽이다.
|
|
6277
6488
|
// 🚨 이 줄이 2026-09-08 승격의 구멍 ⓐ 를 닫는다: research 골이 «코드»를 만지면 시험이 돈다.
|
|
6278
|
-
let gateRouteFiles: readonly string[] | undefined;
|
|
6279
|
-
try { gateRouteFiles = (s.changedFilesForGateRoute ?? changedFiles)(wt.path); } catch { gateRouteFiles = undefined; }
|
|
6280
6489
|
const gateRoute = routeGate(graphTemplate, gateRouteFiles);
|
|
6281
6490
|
const runsGate = gateRoute.runsGate;
|
|
6282
6491
|
progress('gating', !runsGate
|
|
@@ -7039,7 +7248,10 @@ async function runSelfImplementInner(
|
|
|
7039
7248
|
...(prEvidenceDecision.reason ? { reason: prEvidenceDecision.reason } : {}),
|
|
7040
7249
|
...(prEvidenceDecision.body ? { bodyChars: prEvidenceDecision.body.length } : {}),
|
|
7041
7250
|
});
|
|
7042
|
-
const releaseNote =
|
|
7251
|
+
const releaseNote = releaseNoteForRun(opts.goalFile, opts.feature);
|
|
7252
|
+
// openPr's default seam delegates to PrManager.upsertPr, which stages, commits,
|
|
7253
|
+
// and pushes this worktree after the note is written and before creating the PR.
|
|
7254
|
+
addNextMdReleaseNote(wt.path, releaseNote);
|
|
7043
7255
|
const preparedPrBody = preparePrBody(
|
|
7044
7256
|
[
|
|
7045
7257
|
prBody(opts.feature, impl.summary, gate.log, review, reviewIntent, declineReasons, harvestedForPr(), opts.goalFile, lastPlanRevision, releaseNote),
|
|
@@ -7056,7 +7268,8 @@ async function runSelfImplementInner(
|
|
|
7056
7268
|
head: wt.branch,
|
|
7057
7269
|
...(opts.base ? { base: opts.base } : {}),
|
|
7058
7270
|
draft: canAuto ? false : (opts.draft ?? true),
|
|
7059
|
-
|
|
7271
|
+
// The review poller must not see this PR before its actual paths have been inspected.
|
|
7272
|
+
...(labels?.length ? { labels: labels.filter((label) => label !== AUTO_REVIEW_LABEL) } : {}),
|
|
7060
7273
|
cwd: wt.path,
|
|
7061
7274
|
}), T.pr, 'pr');
|
|
7062
7275
|
} catch (error) {
|
|
@@ -7082,6 +7295,60 @@ async function runSelfImplementInner(
|
|
|
7082
7295
|
});
|
|
7083
7296
|
await flushPrComments(pr);
|
|
7084
7297
|
|
|
7298
|
+
// Inspect the opened PR itself: the goal text and the pre-sync worktree can differ from its final file list.
|
|
7299
|
+
let releaseHoldPath: string | undefined;
|
|
7300
|
+
let releasePathInspectionError: string | undefined;
|
|
7301
|
+
if (s.readPrFiles) {
|
|
7302
|
+
try {
|
|
7303
|
+
const files = await withStepTimeout(s.readPrFiles({ number: pr.number, cwd: wt.path }), T.pr, 'pr');
|
|
7304
|
+
if (!Array.isArray(files) || !files.every((path) => typeof path === 'string')) throw new Error('invalid PR file list');
|
|
7305
|
+
releaseHoldPath = releasePathHold(files);
|
|
7306
|
+
} catch (error) {
|
|
7307
|
+
releasePathInspectionError = safeErrorDescription(error);
|
|
7308
|
+
}
|
|
7309
|
+
} else if (canAuto || labels?.includes(AUTO_REVIEW_LABEL)) {
|
|
7310
|
+
releasePathInspectionError = 'readPrFiles seam unavailable';
|
|
7311
|
+
}
|
|
7312
|
+
if (releaseHoldPath) {
|
|
7313
|
+
debug.log('self-dev.merge', 'release-path-hold', { number: pr.number, path: releaseHoldPath, label: RELEASE_PATH_LABEL });
|
|
7314
|
+
canAuto = false;
|
|
7315
|
+
mergeSkipReason = mergeReason = 'release-path-hold';
|
|
7316
|
+
// Suppress the independent auto-review poller as well as this immediate merge path.
|
|
7317
|
+
// No merge is attempted even when an annotation fails; each failure is observable for OP repair.
|
|
7318
|
+
for (const [action, annotate] of [
|
|
7319
|
+
['add-label', s.addPrLabel && (() => s.addPrLabel!({ number: pr.number, label: RELEASE_PATH_LABEL, cwd: wt.path }))],
|
|
7320
|
+
['comment', s.postPrComment && (() => s.postPrComment!({ number: pr.number, body: releasePathHoldComment(releaseHoldPath), cwd: wt.path }))],
|
|
7321
|
+
] as const) {
|
|
7322
|
+
if (!annotate) {
|
|
7323
|
+
observe('release-path-annotation-failed', { number: pr.number, path: releaseHoldPath, action, error: 'annotation seam unavailable' }, { level: 'error' });
|
|
7324
|
+
continue;
|
|
7325
|
+
}
|
|
7326
|
+
try { await annotate(); }
|
|
7327
|
+
catch (error) {
|
|
7328
|
+
observe('release-path-annotation-failed', { number: pr.number, path: releaseHoldPath, action, error: safeErrorDescription(error) }, { level: 'error' });
|
|
7329
|
+
}
|
|
7330
|
+
}
|
|
7331
|
+
recordMergeDecision();
|
|
7332
|
+
progress('pr-opened', `OP 승인 대기 (#${pr.number}): ${releaseHoldPath}`);
|
|
7333
|
+
return { ok: true, stage: 'pr-opened', node: 'open-pr', ...resolveRunOutcome({ termination: 'completed' }), ...decisionSignalResult, ...preservedCompletionResult, ...(completionStatus ? { completionStatus } : {}), sessionId, worktreePath: wt.path, branch: wt.branch, gate, ...(review ? { review } : {}), mergeReason, prUrl: pr.url, prNumber: pr.number, detail: `OP approval required: ${releaseHoldPath}` };
|
|
7334
|
+
}
|
|
7335
|
+
if (!releasePathInspectionError && labels?.includes(AUTO_REVIEW_LABEL)) {
|
|
7336
|
+
try {
|
|
7337
|
+
if (!s.addPrLabel) throw new Error('addPrLabel seam unavailable');
|
|
7338
|
+
await s.addPrLabel({ number: pr.number, label: AUTO_REVIEW_LABEL, cwd: wt.path });
|
|
7339
|
+
} catch (error) {
|
|
7340
|
+
observe('auto-review-label-failed', { number: pr.number, error: safeErrorDescription(error) }, { level: 'warn' });
|
|
7341
|
+
}
|
|
7342
|
+
}
|
|
7343
|
+
if (releasePathInspectionError && (canAuto || labels?.includes(AUTO_REVIEW_LABEL))) {
|
|
7344
|
+
observe('release-path-inspection-failed', { number: pr.number, error: releasePathInspectionError }, { level: 'error' });
|
|
7345
|
+
canAuto = false;
|
|
7346
|
+
mergeSkipReason = mergeReason = 'release-path-inspection-failed';
|
|
7347
|
+
recordMergeDecision();
|
|
7348
|
+
progress('pr-opened', `OP 승인 대기 (#${pr.number}): PR 경로 조회 실패`);
|
|
7349
|
+
return { ok: true, stage: 'pr-opened', node: 'open-pr', ...resolveRunOutcome({ termination: 'completed' }), ...decisionSignalResult, ...preservedCompletionResult, ...(completionStatus ? { completionStatus } : {}), sessionId, worktreePath: wt.path, branch: wt.branch, gate, ...(review ? { review } : {}), mergeReason, prUrl: pr.url, prNumber: pr.number };
|
|
7350
|
+
}
|
|
7351
|
+
|
|
7085
7352
|
if (canAuto && (s.mergePr || opts.mergeByHost)) {
|
|
7086
7353
|
let docsMarkdownDeletions: number | undefined;
|
|
7087
7354
|
let nonDocsMarkdownDeletions: number | undefined;
|
|
@@ -13,7 +13,7 @@ export type PipelineNodeId =
|
|
|
13
13
|
|
|
14
14
|
/** Each pipeline node's possible terminal stages. Nodes without a terminal exit use an empty array. */
|
|
15
15
|
export const TERMINAL_STAGES_BY_NODE = {
|
|
16
|
-
implement: ['aborted', 'timed-out', 'soft-stopped'],
|
|
16
|
+
implement: ['aborted', 'timed-out', 'soft-stopped', 'parked'],
|
|
17
17
|
gate: [],
|
|
18
18
|
review: ['review-blocked'],
|
|
19
19
|
rework: ['gate-failed', 'review-blocked'],
|