elanous 0.2.17 → 0.2.19
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/J5H7BvqgSI8DUjtRRcA_S/_buildManifest.js +1 -0
- package/apps/pwa/out/_next/static/chunks/1105-c473ed46272fba79.js +1 -0
- package/apps/pwa/out/_next/static/chunks/1157-cba0e8553d35a980.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{726.83532d69452ee24b.js → 1470.98a6ab61ccb4131c.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/171-23a877ed11720de9.js +1 -0
- package/apps/pwa/out/_next/static/chunks/216-5acd01cbde4acda7.js +1 -0
- package/apps/pwa/out/_next/static/chunks/2330-c2f07246c8788af1.js +1 -0
- package/apps/pwa/out/_next/static/chunks/2336-e830c777eb6bce04.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{9247-269e4464cc4b491c.js → 2375-e061bb24cd2b5cde.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/2415.ed6428ff334c7ce2.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{211-9c9090c59e2c5907.js → 2977-e38442e86289f1d3.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{f6b7c9ba.64a895b8b2fedbdc.js → 2ea96958.e8c7e112de50b067.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/3094.67339318c7f72a3a.js +2 -0
- package/apps/pwa/out/_next/static/chunks/338-ceb956612dcfaa86.js +1 -0
- package/apps/pwa/out/_next/static/chunks/3395-835e4ceaa6335ba4.js +1 -0
- package/apps/pwa/out/_next/static/chunks/3403.4bc97b4066945a94.js +5 -0
- package/apps/pwa/out/_next/static/chunks/3441-be82e3595aef3a20.js +1 -0
- package/apps/pwa/out/_next/static/chunks/3689-89905039bf3e7257.js +1 -0
- package/apps/pwa/out/_next/static/chunks/371-4ad6af55dad02ced.js +1 -0
- package/apps/pwa/out/_next/static/chunks/3822-6f268bc26c6a84ac.js +1 -0
- package/apps/pwa/out/_next/static/chunks/4114-3e63117452378807.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{1268.0840ff91e083fcbd.js → 4323.c5dfb6f503304775.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/4457-d7df81c90f9d0268.js +1 -0
- package/apps/pwa/out/_next/static/chunks/4551-77dadae76f6cbace.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{6110.1297d4093fdfbb0d.js → 4847.56f5bc454fbcc827.js} +2 -2
- package/apps/pwa/out/_next/static/chunks/4978.6fd93b974441e87f.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5012-f746f6549b869f91.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5609-012bb3557211f07e.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5791-bb82743fa6299562.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{7327-2d69fb321ba73389.js → 6062-73e68343a9814f6a.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/62-5bfed1e23790b745.js +1 -0
- package/apps/pwa/out/_next/static/chunks/6320-9bc8561fde416e07.js +1 -0
- package/apps/pwa/out/_next/static/chunks/649-ca96d1c5d09e02b8.js +1 -0
- package/apps/pwa/out/_next/static/chunks/6725-68ab7cc0b1faf00d.js +1 -0
- package/apps/pwa/out/_next/static/chunks/6726-85a7db59b288c53f.js +1 -0
- package/apps/pwa/out/_next/static/chunks/6735-33267c4630d0d963.js +1 -0
- package/apps/pwa/out/_next/static/chunks/6998-a654fe5c58271600.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7633-141682015873beb6.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{935.4ddaa99fc1d1126c.js → 7647.2fcd30d894d5ee30.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/7673-2eda1507d38dadb8.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7990-e12efba616f46e03.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{f6231284-45726550aba08fca.js → 8046cadf-211ca3c0e00f2b72.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/8067-143791231c99bd02.js +1 -0
- package/apps/pwa/out/_next/static/chunks/8142-744998d65d7bb17e.js +1 -0
- package/apps/pwa/out/_next/static/chunks/8430-a10cfba8ef282d4e.js +1 -0
- package/apps/pwa/out/_next/static/chunks/8870-9614a213b990b10b.js +25 -0
- package/apps/pwa/out/_next/static/chunks/920-f7dceb78f1c585ef.js +1 -0
- package/apps/pwa/out/_next/static/chunks/9454-12c2f30dea62291c.js +1 -0
- package/apps/pwa/out/_next/static/chunks/976-4a9b4ebdca7c739a.js +1 -0
- package/apps/pwa/out/_next/static/chunks/9989-15cdf568bafa9fc8.js +1 -0
- package/apps/pwa/out/_next/static/chunks/ae787e4c-e5b1ef00b2dbceca.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/_not-found/page-859cea1570b6227a.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/approvals/page-deef5ee191830f14.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/autopilot/page-b193da485f9a14b2.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/board/page-b6e1a79df0e214f4.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/botlab/page-e84df4d907f703c7.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/bots/page-a5fb9a5db89ae4ea.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/ceo/page-1499f481d7fc52d6.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/chat/page-c7cf753aeb648790.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/consult/page-4118469e514e10fd.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/control/page-e968f7630654332a.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/decisions/page-505915052f947022.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/design-check/page-c2f962fb4a3b06c6.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/editor/page-7b5ed0bd8a589ec4.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/exec/page-cf8193250dd42dd4.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/field/page-cf3f5dfa35dea8e9.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/healthz/route-859cea1570b6227a.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/inside/page-5b29d9b06ceadade.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/intake/page-a15e7fcc283e9ca7.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/layout-d2915e7b70ff3d0e.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/live/page-b70cd005d9169e25.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/loops/page-2595f0eba29f57e1.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/market/page-c776322454156e36.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/missions/[id]/page-77bbd17f4435aa10.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/morning/page-049689e611ecc936.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/not-found-85954a4fb09c44eb.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/observatory/page-e773e552e1068ee6.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/ops/checklist/page-5633c4bfa7684b4a.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/ops/release/page-d829b92bd01b4994.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/ops/seats/page-061c317fc771becf.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/outputs/page-3a45ece8865ed4b6.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/page-0be990618c0d56bd.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/reflection/page-bfea4865dc244b73.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/scheduler/page-0d6ba8e337741484.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/sessions/page-76a88b55d816482e.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/settings/devices/page-bba1542df59f61ce.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/settings/page-4185c95689bb372e.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/setup/done/page-b699e1a8d5d34b8b.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/setup/layout-859cea1570b6227a.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/setup/page-c225e338c31bf274.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/share/page-449353f70507ca1f.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/showroom/page-90b889714102476d.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/tasks/page-f1ee7fbeb7f96ddc.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/term/page-d59a95e1434dfaa0.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/today/page-71491a23414d1a47.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/trace/page-de7112bdb65fa4fe.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/vault/page-feb4d0d88079660d.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/workflows/chat-ui/page-f17d887b40dd6b1d.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/workflows/page-8da77be2192bcd5d.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/workspace/page-72c3b9a5e9582b29.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/worktrees/page-c3afe4c8d0c48c39.js +1 -0
- package/apps/pwa/out/_next/static/chunks/framework-ea806bb57f2b8923.js +1 -0
- package/apps/pwa/out/_next/static/chunks/main-8d2302399c2c8f87.js +1 -0
- package/apps/pwa/out/_next/static/chunks/main-app-b9308f2d8a931531.js +1 -0
- package/apps/pwa/out/_next/static/chunks/pages/_app-b10928c60f0b8488.js +1 -0
- package/apps/pwa/out/_next/static/chunks/pages/_error-689039227d443fab.js +1 -0
- package/apps/pwa/out/_next/static/chunks/webpack-6f35f9d892fa630b.js +1 -0
- package/apps/pwa/out/_next/static/css/{e99e3cff94ced78a.css → 599369d853c61df7.css} +1 -1
- package/apps/pwa/out/_next/static/css/85f53c6f35d11382.css +1 -0
- package/apps/pwa/out/_next/static/css/d3427996da11e480.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/ceo/index.html +1 -1
- package/apps/pwa/out/ceo/index.txt +23 -23
- 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/decisions/index.html +1 -0
- package/apps/pwa/out/decisions/index.txt +30 -0
- 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 +25 -24
- 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 -1
- package/apps/pwa/out/inside/index.txt +24 -23
- 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/loops/index.html +1 -1
- package/apps/pwa/out/loops/index.txt +28 -27
- 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 -1
- package/apps/pwa/out/ops/seats/index.txt +22 -22
- package/apps/pwa/out/outputs/index.html +1 -1
- package/apps/pwa/out/outputs/index.txt +22 -22
- 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 -23
- package/apps/pwa/out/today/index.html +1 -1
- package/apps/pwa/out/today/index.txt +23 -23
- 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 -23
- package/apps/pwa/out/worktrees/index.html +1 -1
- package/apps/pwa/out/worktrees/index.txt +23 -23
- package/graphs/ops/guardian.yaml +26 -0
- package/graphs/ops/recipes.yaml +3 -0
- package/package.json +2 -1
- package/samples/workflows/templates/approval-gated-deploy.yaml +30 -0
- package/samples/workflows/templates/chat-driven-research.yaml +35 -0
- package/samples/workflows/templates/discord-listen-and-respond.yaml +29 -0
- package/samples/workflows/templates/http-poll-then-alert.yaml +30 -0
- package/samples/workflows/templates/manual-quickstart.yaml +21 -0
- package/samples/workflows/templates/scheduled-daily-digest.yaml +30 -0
- package/samples/workflows/templates/webhook-deploy-hook.yaml +27 -0
- package/scripts/ci-public-export-import-gate.ts +7 -2
- package/scripts/ci-typecheck-changed.ts +21 -6
- package/scripts/coord-channel-watch.sh +2 -2
- package/scripts/discord-seat-probe.ts +6 -3
- package/scripts/docs/generate-cli-anatomy.ts +162 -0
- package/scripts/goals/authoring-metrics.ts +73 -0
- package/scripts/landing-heal/must-fix-match.ts +7 -7
- package/scripts/landing-heal/run-mission.ts +3 -2
- package/scripts/lib/pch-regress-map.ts +23 -0
- package/scripts/morning-report.ts +18 -4
- package/scripts/pch-regress.ts +88 -0
- package/scripts/public-export-test-run.ts +37 -2
- package/scripts/release-loop/checklist-gate-node.ts +13 -11
- package/scripts/release-loop/cut-branch.ts +2 -1
- package/scripts/release-loop/cutoff.ts +4 -2
- package/scripts/release-loop/docs-land-node.ts +8 -1
- package/scripts/release-loop/docs-node.ts +1 -1
- package/scripts/release-loop/gate-diff.ts +18 -0
- package/scripts/release-loop/gate-node.ts +436 -59
- package/scripts/release-loop/gate-partial.ts +106 -0
- package/scripts/release-loop/gate-timing.ts +120 -0
- package/scripts/release-loop/node-verdict.ts +2 -1
- package/scripts/release-loop/npm-publish-node.ts +11 -7
- package/scripts/release-loop/ops-upgrade-node.ts +8 -1
- package/scripts/release-loop/preflight.ts +246 -0
- package/scripts/release-loop/publish-node.ts +8 -1
- package/scripts/release-loop/release-readiness.ts +11 -6
- package/scripts/release-loop/release-version.ts +48 -0
- package/scripts/release-loop/resume-release.ts +174 -0
- package/scripts/release-loop/shard-plan.ts +65 -0
- package/scripts/release-loop/unattended-release.ts +45 -7
- package/scripts/release-loop/version-node.ts +145 -40
- package/scripts/rhythm/daily.ts +25 -4
- package/scripts/skills/public-check.ts +62 -12
- package/scripts/test-deterministic.ts +51 -33
- package/scripts/test-diet/effectiveness.ts +62 -1
- package/scripts/test-diet/lib.ts +1 -1
- package/scripts/test-diet/node.ts +8 -1
- package/scripts/video/scene-table.ts +159 -0
- package/src/acp/core-turn-bridge.ts +39 -2
- package/src/agent-mission/review-loop.ts +4 -3
- package/src/agent-substrate/pr-comment-meta.ts +20 -0
- package/src/autopilot/build/llm-conflict-merge.ts +28 -8
- package/src/away/presence.ts +40 -0
- package/src/away/release-watch.ts +255 -0
- package/src/briefing/brief-items.ts +86 -17
- package/src/chat/index.ts +2 -1
- package/src/chat/short-question.ts +3 -40
- package/src/cli/autopilot-cli.ts +30 -11
- package/src/cli/away-cli.ts +68 -0
- package/src/cli/brief-cli.ts +36 -2
- package/src/cli/freeze-cli.ts +3 -2
- package/src/cli/guardian-cli.ts +49 -0
- package/src/cli/intake-cli.ts +85 -7
- package/src/cli/log-event-names.ts +1 -0
- package/src/cli/notify-cli.ts +75 -0
- package/src/cli/pod-cli.ts +5 -1
- package/src/cli/provider-cli.ts +12 -2
- package/src/cli/pty-drive-cli.ts +14 -3
- package/src/cli/release-cli.ts +128 -19
- package/src/cli/setup-cli.ts +31 -1
- package/src/cli/tasks-cli.ts +403 -4
- package/src/context-bus/condense.ts +19 -3
- package/src/context-bus/context-day.ts +77 -24
- package/src/context-bus/context-first.ts +33 -0
- package/src/context-bus/context-now-public.ts +1 -1
- package/src/context-bus/context-now-surfaces.ts +16 -6
- package/src/context-bus/context-now.ts +97 -3
- package/src/core-turn/short-question.ts +100 -0
- package/src/dashboard/dashboard-status-lines.ts +24 -4
- package/src/dashboard/index.ts +50 -5
- package/src/dashboard/input/slash-executor.ts +6 -2
- package/src/dashboard/slash-runtime/dashboard-handlers.ts +63 -36
- package/src/dashboard/slash-runtime/decide-slash.ts +60 -0
- package/src/dashboard/slash-runtime/help-from-registry.ts +21 -8
- package/src/dashboard/slash-runtime/help-groups.ts +44 -0
- package/src/dashboard/slash-runtime/model-choices.ts +125 -0
- package/src/discord-self-message.ts +20 -2
- package/src/discord-slash-wire.ts +1 -0
- package/src/domains/guardian-tick.ts +138 -0
- package/src/domains/outbound-alert.ts +244 -40
- package/src/domains/outbound-log-probe.ts +16 -1
- package/src/domains/release-tool.ts +2 -2
- package/src/domains/schedule-registry.ts +23 -0
- package/src/domains/telegram-kind-route.ts +39 -0
- package/src/domains/watch-default-scheduler.ts +95 -0
- package/src/esc-abort-gate.ts +44 -0
- package/src/execution-loop/gates.ts +11 -2
- package/src/flow-loop/split.ts +8 -4
- package/src/git-fs/worktree.ts +23 -3
- package/src/graph-runner/runner.ts +25 -5
- package/src/harness/harness-cli-command.ts +12 -2
- package/src/harness/harness-queue.ts +388 -33
- package/src/harness/harness-salvage-cli.ts +78 -0
- package/src/harness/harness-worktree-add.ts +68 -0
- package/src/harness/helper-scan.ts +10 -3
- package/src/harness/ledger-write-guard.ts +6 -16
- package/src/hq/hq.ts +6 -1
- package/src/hq/seats.ts +369 -0
- package/src/index.ts +185 -18
- package/src/instance/test-write-guard-spy-first.fixture.ts +13 -0
- package/src/instance/test-write-guard.ts +200 -0
- package/src/intake-plane/adopt-gate.ts +49 -0
- package/src/intake-plane/check.ts +3 -0
- package/src/intake-plane/collect-github.ts +57 -25
- package/src/intake-plane/digest.ts +39 -15
- package/src/intake-plane/discord-seat-work.ts +8 -2
- package/src/intake-plane/harness-target.ts +4 -3
- package/src/intake-plane/intake-sources.ts +1 -0
- package/src/intake-plane/items.ts +1 -0
- package/src/intake-plane/requirement-funnel.ts +316 -0
- package/src/knowledge/know-find.ts +10 -1
- package/src/loops/budget.ts +36 -0
- package/src/loops/orchestrator/degradation.ts +57 -0
- package/src/loops/orchestrator/finish-rate.ts +106 -4
- package/src/loops/orchestrator/grid-place.ts +11 -0
- package/src/loops/orchestrator/tick.ts +450 -54
- package/src/maturity/feature-maturity.ts +8 -5
- package/src/maturity/tui-slash-maturity.ts +1 -0
- package/src/mss/logging/log-store.ts +3 -0
- package/src/nexus/api/decisions-route.ts +11 -1
- package/src/nexus/api/http-server.ts +16 -5
- package/src/nexus/api/loop-edges.ts +352 -23
- package/src/nexus/api/ops-api.ts +96 -28
- package/src/nexus/api/ops-seats-sources.ts +2 -2
- package/src/nexus/api/workflow-templates.ts +3 -0
- package/src/nexus/index.ts +7 -0
- package/src/oauth/codex.ts +38 -0
- package/src/onboarding/first-chat-gate.ts +29 -0
- package/src/release-loop/checklist.ts +106 -6
- package/src/release-loop/feature-store.ts +64 -16
- package/src/release-loop/landing-freeze.ts +6 -4
- package/src/release-loop/light-rc.ts +173 -0
- package/src/release-loop/placement.ts +64 -20
- package/src/release-loop/rubric.ts +136 -0
- package/src/seat-dispatch/seat-ask.ts +79 -16
- package/src/seat-loop/seat-loop.ts +12 -6
- package/src/self-dev/ask-launch-flow.ts +24 -3
- package/src/self-dev/ask-path-candidates.ts +68 -0
- package/src/self-dev/dev-cli.ts +36 -0
- package/src/self-dev/dev-pipeline.ts +4 -0
- package/src/self-dev/draft-triage-rules.ts +1 -1
- package/src/self-dev/orchestrate-cli.ts +22 -0
- package/src/self-dev/orchestrate.ts +1 -0
- package/src/self-dev/pr-preview.ts +179 -0
- package/src/self-dev/round-pr-supersede.ts +244 -0
- package/src/self-dev/run-supervisor.ts +14 -0
- package/src/self-dev/shard-run.ts +23 -7
- package/src/self-implement/follow-up-goals.ts +2 -2
- package/src/self-implement/gate-cli.ts +29 -8
- package/src/self-implement/gate-remote.ts +427 -0
- package/src/self-implement/goal-author-clarification.ts +88 -13
- package/src/self-implement/goal-author.ts +8 -3
- package/src/self-implement/goal-clarification-escalation.ts +2 -0
- package/src/self-implement/l8-merge-queue.ts +29 -5
- package/src/self-implement/orchestrator.ts +61 -13
- package/src/self-implement/prior-draft-findings.ts +4 -3
- package/src/self-implement/salvage-branches.ts +254 -0
- package/src/skills/skill-feedback.ts +76 -0
- package/src/task-agent/actions.ts +101 -7
- package/src/task-agent/board.ts +132 -0
- package/src/task-agent/card-evidence.ts +203 -0
- package/src/task-agent/completion-evidence.ts +126 -0
- package/src/task-agent/judge.ts +49 -5
- package/src/task-agent/live-moves.ts +176 -0
- package/src/task-agent/mission.ts +449 -0
- package/src/task-agent/shadow.ts +258 -0
- package/src/task-agent/task-hand.ts +337 -0
- package/src/task-orchestrator/surfaces/pod-command-job.ts +64 -4
- package/src/task-orchestrator/surfaces/pod-failure-reason.ts +10 -0
- package/src/task-orchestrator/surfaces/pod-lease.ts +142 -13
- package/src/task-orchestrator/surfaces/pod-pool.ts +13 -5
- package/src/task-orchestrator/surfaces/self-implement-pod.ts +88 -20
- package/src/telegram-away-command.ts +38 -0
- package/src/telegram-commands.ts +11 -0
- package/src/telegram-loops-command.ts +1 -1
- package/src/telegram-report-log-probe.ts +21 -0
- package/src/telegram-report.ts +27 -3
- package/src/telegram.ts +5 -20
- package/src/tui-client/dashboard-session.ts +1 -0
- package/src/user-config.ts +196 -4
- package/src/version/packed-revision.json +1 -1
- package/apps/pwa/out/_next/static/chunks/1307-aac7332576c4d6fc.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1826-5d279da64bbbc2de.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1844-9ec4b1d12f6e80eb.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1866-e7a6999f25548b30.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1948.15f356b15a625597.js +0 -5
- package/apps/pwa/out/_next/static/chunks/2196-4700653d12a44b40.js +0 -1
- package/apps/pwa/out/_next/static/chunks/224-798346143007ff65.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2699-63b73fa4d3bcf6ff.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2957-96ffab3d521fb08f.js +0 -1
- package/apps/pwa/out/_next/static/chunks/311.e685738f92e6e2ec.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3194-807b212fb8eae065.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3324-d1d2979821dfa845.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3558-bbb5ab553a0471d3.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3916-3d02dd1fc257dd3c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4144-a0041c8dc3be57ac.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4554-3565eea1f1495ba7.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4614-21403aac730d4586.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4795-f372490b178583fc.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5135-44008fe8b1f2aa41.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5233-bf28bd6bd7a32099.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5360-be1f1d8f9fcc9755.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5977-c952712c87a1f757.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5994-ae92c0de046ab9ba.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6158.9c0449a9a8d0064b.js +0 -2
- package/apps/pwa/out/_next/static/chunks/6877-fe94e76a5841ee9b.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7290-f09c928a06c52e2d.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7395-164e238f471b5d7b.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7787-02a1c0b04e25e811.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8060-cc008cc6fedfa818.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8085-d065d0393c1760f5.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8401-4ce1c42c8d89903f.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8682-7061dd4fa7bd62ed.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8868-10a3a4440fb0ccd8.js +0 -25
- package/apps/pwa/out/_next/static/chunks/8949-ecb4128a0858b911.js +0 -1
- package/apps/pwa/out/_next/static/chunks/899-f41be85e8a680651.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9070.067c106528ec1ae6.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9103-60fbef33e66f0a46.js +0 -1
- package/apps/pwa/out/_next/static/chunks/a9f2b54d-7865aba0f4d2ee49.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/_not-found/page-c1a96669158471ec.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/approvals/page-3143b07a817d1da9.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/autopilot/page-17ba086ef82d339b.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/board/page-7eb661ff23af7da2.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/botlab/page-6b8444914da74ca6.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/bots/page-6e5c3a867557298b.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/ceo/page-7110f732f45bf944.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/chat/page-9a41d65355fc25b9.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/consult/page-5e77cd1802567c89.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/control/page-41afec0b255ed2bb.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/design-check/page-4187666132fc98c4.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/editor/page-09328d499162bae4.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/exec/page-29ff3a8f84f03b6a.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/field/page-80ec7401bc83f511.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/healthz/route-c1a96669158471ec.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/inside/page-ab93b240f687d69a.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/intake/page-fc7d86467291ae38.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/layout-de43a186e5ba5683.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/live/page-8b08cafad27759c9.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/loops/page-0e2d6985fb42cd2f.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/market/page-13e4108999f58d13.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/missions/[id]/page-e8296ee284aa1293.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/morning/page-043a9111e74f6b24.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/not-found-23a4601ceb7f452e.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/observatory/page-1ed1324b1dc36754.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/ops/checklist/page-10d958605a77b3bd.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/ops/release/page-166745e51ac0c7b0.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/ops/seats/page-a04260b8ccc968d4.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/outputs/page-7a1d85e121065cc8.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/page-1f50e3d4e13435f4.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/reflection/page-12916918988ac97e.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/scheduler/page-d8a3347a9d0c3f4a.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/sessions/page-a9117d2cd3093d36.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/settings/devices/page-5a64cb5208c6a8fd.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/settings/page-1407ec83ea64c1f9.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/setup/done/page-1d824510df025d18.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/setup/layout-c1a96669158471ec.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/setup/page-6e878ebbe1737d00.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/share/page-7f49fe645d5132f7.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/showroom/page-81a4e7f8dbfe74cb.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/tasks/page-27d71f131acd9320.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/term/page-3ab59d19913b200e.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/today/page-bf85b2f5bf077925.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/trace/page-424659bacfb8cdd7.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/vault/page-ab32a8f522a60371.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/workflows/chat-ui/page-fc2df261f8a2c7df.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/workflows/page-09461366af82ef13.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/workspace/page-5d4fef9ccd7d406b.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/worktrees/page-ea90a8ac73ce2749.js +0 -1
- package/apps/pwa/out/_next/static/chunks/framework-5c169757551134ed.js +0 -1
- package/apps/pwa/out/_next/static/chunks/main-59fe95fed40c7a01.js +0 -1
- package/apps/pwa/out/_next/static/chunks/main-app-4ca74dbbee7057c6.js +0 -1
- package/apps/pwa/out/_next/static/chunks/pages/_app-13a0a886df4d97a1.js +0 -1
- package/apps/pwa/out/_next/static/chunks/pages/_error-6af8591cd3a3f038.js +0 -1
- package/apps/pwa/out/_next/static/chunks/webpack-539cde99554be20f.js +0 -1
- package/apps/pwa/out/_next/static/css/001d5fbaee388a25.css +0 -1
- package/apps/pwa/out/_next/static/yRA5ur6DcPl0YHSRheH2O/_buildManifest.js +0 -1
- /package/apps/pwa/out/_next/static/{yRA5ur6DcPl0YHSRheH2O → J5H7BvqgSI8DUjtRRcA_S}/_ssgManifest.js +0 -0
|
@@ -1,3 +1,6 @@
|
|
|
1
|
+
import { readFileSync, realpathSync } from 'node:fs';
|
|
2
|
+
import { resolve, relative, isAbsolute } from 'node:path';
|
|
3
|
+
import ts from 'typescript';
|
|
1
4
|
import { tierModel } from '../llm/model-defaults.js';
|
|
2
5
|
import { debug } from '../debug/log.js';
|
|
3
6
|
import type { LLMUsage } from '../prompt-cache/types.js';
|
|
@@ -42,7 +45,7 @@ export function parseGoalAuthorParent(document: string): GoalAuthorParent | null
|
|
|
42
45
|
return matches.length === 1 ? matches[0] : null;
|
|
43
46
|
}
|
|
44
47
|
|
|
45
|
-
export type GoalAuthorClarificationAnswerSource = 'injected' | 'recommended' | 'self-authored';
|
|
48
|
+
export type GoalAuthorClarificationAnswerSource = 'injected' | 'recommended' | 'self-authored' | 'default';
|
|
46
49
|
|
|
47
50
|
export interface GoalAuthorClarificationProvenance {
|
|
48
51
|
source: GoalAuthorClarificationAnswerSource;
|
|
@@ -78,8 +81,8 @@ export interface GoalAuthorSelfResolutionContext {
|
|
|
78
81
|
}
|
|
79
82
|
|
|
80
83
|
export type GoalAuthorSelfResolution =
|
|
81
|
-
| { answer: string; evidence: readonly string[] }
|
|
82
|
-
| { answer?: undefined; evidence?: undefined };
|
|
84
|
+
| { answer: string; evidence: readonly string[]; declined?: undefined }
|
|
85
|
+
| { answer?: undefined; evidence?: undefined; declined?: boolean };
|
|
83
86
|
|
|
84
87
|
export interface GoalAuthorClarificationResolutionDeps {
|
|
85
88
|
/** Elanousic authoring seam; it must return no answer when the available evidence is insufficient. */
|
|
@@ -189,7 +192,7 @@ export async function defaultGoalAuthorSelfResolve(
|
|
|
189
192
|
const usages: LLMUsage[] = [];
|
|
190
193
|
if (context.evidence.length === 0) {
|
|
191
194
|
observeSelfResolve('self-resolve-no-evidence', context, startedAt, { usage: deriveUsage(usages) });
|
|
192
|
-
return {};
|
|
195
|
+
return context.questionId === 'preservation_contract' ? { declined: true } : {};
|
|
193
196
|
}
|
|
194
197
|
const controller = new AbortController();
|
|
195
198
|
const timeout = setTimeout(
|
|
@@ -230,7 +233,7 @@ export async function defaultGoalAuthorSelfResolve(
|
|
|
230
233
|
evidenceCount: context.evidence.length,
|
|
231
234
|
usage: deriveUsage(usages),
|
|
232
235
|
});
|
|
233
|
-
return {};
|
|
236
|
+
return answer === null && context.questionId === 'preservation_contract' ? { declined: true } : {};
|
|
234
237
|
} catch (error) {
|
|
235
238
|
observeSelfResolve(
|
|
236
239
|
isSelfResolutionTimeout(error, controller.signal) ? 'self-resolve-timeout' : 'self-resolve-error',
|
|
@@ -471,6 +474,57 @@ interface GoalAuthorClarificationSeed {
|
|
|
471
474
|
parent: GoalAuthorParent;
|
|
472
475
|
}
|
|
473
476
|
|
|
477
|
+
const PRESERVATION_DEFAULT = '대상 경로의 기존 공개 동작(내보내는 함수 시그니처 · CLI 인자·출력·종료 코드)은 그대로 유지한다 · 바뀌는 것은 골이 명시한 동작뿐';
|
|
478
|
+
|
|
479
|
+
function preservationDefault(ask: string): { answer: string; exportCount: number } {
|
|
480
|
+
const request = /Original ask \(verbatim, unmodified\):\s*```\r?\n([\s\S]*?)\r?\n```/.exec(ask)?.[1] ?? ask;
|
|
481
|
+
// Every `대상 경로:` line counts, plain or as a Markdown list item; backticks around a path are cosmetic.
|
|
482
|
+
const paths = [...new Set(request.split(/\r?\n/).flatMap((line) => {
|
|
483
|
+
const match = /^\s*(?:(?:[-*+]|\d+[.)])\s+)?대상 경로:\s*(.*)$/.exec(line);
|
|
484
|
+
return match ? match[1].split(/\s*[,·]\s*/).map((path) => path.trim().replace(/^`|`$/g, '')) : [];
|
|
485
|
+
}))];
|
|
486
|
+
const exports: string[] = [];
|
|
487
|
+
for (const path of paths) {
|
|
488
|
+
if (!/^[\w./-]+\.[cm]?[jt]sx?$/.test(path) || path.startsWith('/') || path.split('/').includes('..')) continue;
|
|
489
|
+
const absolute = resolve(process.cwd(), path);
|
|
490
|
+
try {
|
|
491
|
+
const actual = realpathSync(absolute);
|
|
492
|
+
const withinRepo = relative(realpathSync(process.cwd()), actual);
|
|
493
|
+
if (withinRepo === '..' || withinRepo.startsWith('../') || isAbsolute(withinRepo)) continue;
|
|
494
|
+
const source = ts.createSourceFile(path, readFileSync(actual, 'utf8'), ts.ScriptTarget.Latest, true);
|
|
495
|
+
for (const statement of source.statements) {
|
|
496
|
+
if (ts.isExportDeclaration(statement)) {
|
|
497
|
+
if (statement.exportClause && ts.isNamedExports(statement.exportClause)) {
|
|
498
|
+
for (const element of statement.exportClause.elements) exports.push(`${path}: ${element.name.text}`);
|
|
499
|
+
} else if (statement.exportClause && ts.isNamespaceExport(statement.exportClause)) {
|
|
500
|
+
exports.push(`${path}: ${statement.exportClause.name.text}`);
|
|
501
|
+
} else if (!statement.exportClause && statement.moduleSpecifier && ts.isStringLiteral(statement.moduleSpecifier)) {
|
|
502
|
+
// Names re-exported by `export *` are not resolved here; record the re-export itself so the preserved surface is explicit.
|
|
503
|
+
exports.push(`${path}: * from ${statement.moduleSpecifier.text}`);
|
|
504
|
+
}
|
|
505
|
+
} else if (ts.isExportAssignment(statement)) {
|
|
506
|
+
exports.push(`${path}: ${statement.isExportEquals ? 'export =' : 'default'}`);
|
|
507
|
+
} else if (ts.canHaveModifiers(statement) && ts.getModifiers(statement)?.some((modifier) => modifier.kind === ts.SyntaxKind.ExportKeyword)) {
|
|
508
|
+
if (ts.getModifiers(statement)?.some((modifier) => modifier.kind === ts.SyntaxKind.DefaultKeyword)) {
|
|
509
|
+
exports.push(`${path}: default`);
|
|
510
|
+
} else if (ts.isVariableStatement(statement)) {
|
|
511
|
+
const bindingNames = (name: ts.BindingName): string[] => ts.isIdentifier(name)
|
|
512
|
+
? [name.text]
|
|
513
|
+
: name.elements.flatMap((element) => ts.isOmittedExpression(element) ? [] : bindingNames(element.name));
|
|
514
|
+
for (const declaration of statement.declarationList.declarations) {
|
|
515
|
+
for (const exported of bindingNames(declaration.name)) exports.push(`${path}: ${exported}`);
|
|
516
|
+
}
|
|
517
|
+
} else if ('name' in statement && statement.name && ts.isIdentifier(statement.name as ts.Node)) {
|
|
518
|
+
exports.push(`${path}: ${(statement.name as ts.Identifier).text}`);
|
|
519
|
+
}
|
|
520
|
+
}
|
|
521
|
+
}
|
|
522
|
+
} catch { /* An unavailable target cannot supply verified export names. */ }
|
|
523
|
+
}
|
|
524
|
+
const names = [...new Set(exports)];
|
|
525
|
+
return { answer: names.length ? `${PRESERVATION_DEFAULT} · export 이름: ${names.join(', ')}` : PRESERVATION_DEFAULT, exportCount: names.length };
|
|
526
|
+
}
|
|
527
|
+
|
|
474
528
|
const DEFERRED_ANSWER = 'DEFERRED-UNTIL: ';
|
|
475
529
|
const DEFERRED_ANSWER_PREFIX = 'DEFERRED-UNTIL';
|
|
476
530
|
|
|
@@ -515,7 +569,7 @@ export function parseGoalDocumentClarifications(document: string): GoalDocumentC
|
|
|
515
569
|
readingOptions = false;
|
|
516
570
|
continue;
|
|
517
571
|
}
|
|
518
|
-
const provenanceSource = /^ - provenance\.source: (injected|recommended|self-authored)$/.exec(line);
|
|
572
|
+
const provenanceSource = /^ - provenance\.source: (injected|recommended|self-authored|default)$/.exec(line);
|
|
519
573
|
if (provenanceSource) {
|
|
520
574
|
fields.set('provenanceSource', provenanceSource[1]);
|
|
521
575
|
provenanceLines.push(index);
|
|
@@ -692,6 +746,7 @@ export async function selfAnswerGoalDocumentClarifications(
|
|
|
692
746
|
ask?: string;
|
|
693
747
|
evidence?: readonly string[];
|
|
694
748
|
resolver?: GoalClarificationSelfResolver;
|
|
749
|
+
runId?: string;
|
|
695
750
|
},
|
|
696
751
|
): Promise<{ document: string; asked: number; answered: number; unanswered: number; newlyAnswered: number }> {
|
|
697
752
|
const clarifications = parseGoalDocumentClarifications(document);
|
|
@@ -699,7 +754,7 @@ export async function selfAnswerGoalDocumentClarifications(
|
|
|
699
754
|
// The first say pass may already have self-answered some questions while authoring: count those,
|
|
700
755
|
// never re-ask them, and still attempt every question that is left unanswered.
|
|
701
756
|
const alreadySelfAnswered = options.path === 'say-first'
|
|
702
|
-
? clarifications.filter((item) => item.answered && item.provenanceSource === 'self-authored').length
|
|
757
|
+
? clarifications.filter((item) => item.answered && (item.provenanceSource === 'self-authored' || item.provenanceSource === 'default')).length
|
|
703
758
|
: 0;
|
|
704
759
|
let updated = document;
|
|
705
760
|
let answered = 0;
|
|
@@ -709,6 +764,7 @@ export async function selfAnswerGoalDocumentClarifications(
|
|
|
709
764
|
for (const item of pending) {
|
|
710
765
|
if (parseGoalDocumentClarifications(updated).filter((entry) => entry.questionId === item.questionId).length !== 1) continue;
|
|
711
766
|
let response: Awaited<ReturnType<typeof resolveGoalAuthorClarification>>;
|
|
767
|
+
let declined = false;
|
|
712
768
|
try { response = await resolveGoalAuthorClarification({
|
|
713
769
|
questionId: item.questionId,
|
|
714
770
|
kind: 'scope',
|
|
@@ -717,7 +773,11 @@ export async function selfAnswerGoalDocumentClarifications(
|
|
|
717
773
|
options: item.options.map((option) => ({ label: option.label, description: option.description })),
|
|
718
774
|
blocking: false,
|
|
719
775
|
}, {
|
|
720
|
-
selfResolve:
|
|
776
|
+
selfResolve: async (context) => {
|
|
777
|
+
const resolution = await (options.resolver ?? defaultGoalAuthorSelfResolve)(context);
|
|
778
|
+
declined = resolution.declined === true;
|
|
779
|
+
return resolution;
|
|
780
|
+
},
|
|
721
781
|
evidence,
|
|
722
782
|
ask: options.ask,
|
|
723
783
|
selfResolutionSelected: true,
|
|
@@ -725,11 +785,19 @@ export async function selfAnswerGoalDocumentClarifications(
|
|
|
725
785
|
// A resolver failure leaves this question unanswered; the remaining questions are still attempted.
|
|
726
786
|
continue;
|
|
727
787
|
}
|
|
728
|
-
|
|
788
|
+
let defaultExportCount: number | undefined;
|
|
789
|
+
if (response.answer === null && item.questionId === 'preservation_contract'
|
|
790
|
+
&& declined) {
|
|
791
|
+
const fallback = preservationDefault(options.ask ?? document);
|
|
792
|
+
response = { ...response, answer: fallback.answer, status: 'ANSWERED', provenance: { source: 'default' } };
|
|
793
|
+
defaultExportCount = fallback.exportCount;
|
|
794
|
+
}
|
|
795
|
+
if (response.answer === null || (response.provenance?.source !== 'self-authored' && response.provenance?.source !== 'default')
|
|
729
796
|
|| response.answer.startsWith(DEFERRED_ANSWER_PREFIX)) continue;
|
|
797
|
+
const answerSource = response.provenance.source;
|
|
730
798
|
try {
|
|
731
799
|
if (!response.answer.trim() || /[\r\n]/.test(response.answer)
|
|
732
|
-
|| (!item.includeOther && !item.options.some((option) => option.label === response.answer))) continue;
|
|
800
|
+
|| (answerSource !== 'default' && !item.includeOther && !item.options.some((option) => option.label === response.answer))) continue;
|
|
733
801
|
const current = findUnansweredGoalDocumentClarification(updated, item.questionId);
|
|
734
802
|
const lines = updated.split(/\r?\n/);
|
|
735
803
|
const provenanceLines = current.provenanceLines ?? [];
|
|
@@ -737,15 +805,22 @@ export async function selfAnswerGoalDocumentClarifications(
|
|
|
737
805
|
const answerLine = current.answerLine - provenanceLines.filter((line) => line < current.answerLine).length;
|
|
738
806
|
lines[answerLine] = ` - answer: ${response.answer}`;
|
|
739
807
|
lines.splice(answerLine + 1, 0,
|
|
740
|
-
|
|
741
|
-
...response.provenance.evidence
|
|
808
|
+
` - provenance.source: ${answerSource}`,
|
|
809
|
+
...(response.provenance.evidence ?? []).map((entry) => ` - evidence: ${entry.replace(/[\r\n]/g, ' ')}`));
|
|
742
810
|
updateWhatToBuildRenderAnswers(lines, item.questionId, response.answer);
|
|
743
811
|
if (hasWhatToBuildUnansweredRenderAnswer(lines, item.questionId)) continue;
|
|
744
812
|
const candidate = lines.join(document.includes('\r\n') ? '\r\n' : '\n');
|
|
745
813
|
if (!parseGoalDocumentClarifications(candidate).some((entry) => entry.questionId === item.questionId
|
|
746
|
-
&& entry.answered && entry.answer === response.answer && entry.provenanceSource ===
|
|
814
|
+
&& entry.answered && entry.answer === response.answer && entry.provenanceSource === answerSource)) continue;
|
|
747
815
|
updated = candidate;
|
|
748
816
|
answered += 1;
|
|
817
|
+
if (defaultExportCount !== undefined) {
|
|
818
|
+
observeGoalAuthor('goal-author', 'self-answer-default-applied', {
|
|
819
|
+
runId: options.runId ?? process.env.ELANOUS_RUN_ID,
|
|
820
|
+
questionId: item.questionId,
|
|
821
|
+
exportCount: defaultExportCount,
|
|
822
|
+
});
|
|
823
|
+
}
|
|
749
824
|
} catch {
|
|
750
825
|
// Leave malformed or disallowed answers deferred.
|
|
751
826
|
}
|
|
@@ -20,12 +20,17 @@ function observeGoalAuthor(
|
|
|
20
20
|
import { getUserConfig } from '../user-config.js';
|
|
21
21
|
|
|
22
22
|
export type GoalAuthorGrade = 'full' | 'lite';
|
|
23
|
-
export type GoalAuthorGradeSource = 'flag' | 'config' | 'default';
|
|
23
|
+
export type GoalAuthorGradeSource = 'flag' | 'env' | 'config' | 'default';
|
|
24
24
|
export interface GoalAuthorGradeSelection { grade: GoalAuthorGrade; source: GoalAuthorGradeSource }
|
|
25
25
|
|
|
26
|
-
/**
|
|
27
|
-
|
|
26
|
+
/**
|
|
27
|
+
* Precedence flag > env (`ELANOUS_AUTHOR_GRADE`) > config > default(full). Malformed env or
|
|
28
|
+
* configuration values are ignored and keep the full pipeline. The env seam lets the Pod carry the
|
|
29
|
+
* grade without a CLI flag an older in-Pod elanous would reject (AUTHOR-LITE2-POD).
|
|
30
|
+
*/
|
|
31
|
+
export function resolveGoalAuthorGrade(flag?: GoalAuthorGrade, configured?: unknown, env: unknown = process.env.ELANOUS_AUTHOR_GRADE): GoalAuthorGradeSelection {
|
|
28
32
|
if (flag !== undefined) return { grade: flag, source: 'flag' };
|
|
33
|
+
if (env === 'lite' || env === 'full') return { grade: env, source: 'env' };
|
|
29
34
|
if (configured === 'lite' || configured === 'full') return { grade: configured, source: 'config' };
|
|
30
35
|
return { grade: 'full', source: 'default' };
|
|
31
36
|
}
|
|
@@ -39,6 +39,7 @@ type GoalClarificationAnsweredBy = 'human' | 'agent' | 'none' | 'mixed';
|
|
|
39
39
|
|
|
40
40
|
export interface GoalClarificationEscalationInput {
|
|
41
41
|
goalFile: string;
|
|
42
|
+
runId?: string;
|
|
42
43
|
/** Explicit provenance for isolated test fixtures; never inferred from goalFile. */
|
|
43
44
|
testOrigin?: true;
|
|
44
45
|
delivery?: GoalClarificationDelivery;
|
|
@@ -443,6 +444,7 @@ export async function escalateGoalDocumentClarifications(
|
|
|
443
444
|
path: input.selfAnswerPath,
|
|
444
445
|
ask: document,
|
|
445
446
|
resolver: input.selfResolveClarification,
|
|
447
|
+
runId: input.runId ?? process.env.ELANOUS_RUN_ID,
|
|
446
448
|
});
|
|
447
449
|
if (resolution.newlyAnswered > 0) {
|
|
448
450
|
writeGoalDocumentAtomic(input.goalFile, resolution.document);
|
|
@@ -129,12 +129,33 @@ export async function runL8ShadowQueue(cwd: string, deps: L8ShadowQueueDeps = {}
|
|
|
129
129
|
if (changed.some((file) => file.startsWith('-') || file.startsWith('/') || file.split('/').includes('..') || file.includes('\\'))) throw new Error('unsafe changed-file path');
|
|
130
130
|
verdict.tests = files.filter((file) => /(?:^|\/)[^/]+\.(?:test|spec)\.(?:[cm]?[jt]sx?)$/.test(file));
|
|
131
131
|
const merge = execute('git', ['-c', 'user.name=elanous shadow', '-c', 'user.email=shadow@localhost', 'merge', '--no-ff', '--no-edit', item.head], temp);
|
|
132
|
+
let autoResolvedNextMd = false;
|
|
132
133
|
if (merge.status !== 0) {
|
|
133
|
-
const unresolved = run('git', ['diff', '--name-only', '--diff-filter=U'], temp);
|
|
134
|
-
if (!unresolved) throw new Error(`git merge failed: ${merge.stderr.trim() || `exit ${merge.status}`}`);
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
134
|
+
const unresolved = run('git', ['diff', '--name-only', '--diff-filter=U'], temp).split('\n').filter(Boolean);
|
|
135
|
+
if (!unresolved.length) throw new Error(`git merge failed: ${merge.stderr.trim() || `exit ${merge.status}`}`);
|
|
136
|
+
if (unresolved.length === 1 && unresolved[0] === NEXT_MD_PATH) {
|
|
137
|
+
const stage = (n: number): string => {
|
|
138
|
+
const result = execute('git', ['show', `:${n}:${NEXT_MD_PATH}`], temp!);
|
|
139
|
+
if (result.status !== 0) throw new Error(`release/next.md stage ${n} unavailable: ${result.stderr}`);
|
|
140
|
+
return result.stdout;
|
|
141
|
+
};
|
|
142
|
+
// Stage 2 is main in this checkout; preserve the incoming PR (stage 3) and union main's additions.
|
|
143
|
+
const resolved = resolveNextMdConflict(stage(1), stage(2), stage(3));
|
|
144
|
+
if (resolved === null) {
|
|
145
|
+
verdict.verdict = 'conflict';
|
|
146
|
+
verdict.detail = 'release/next.md conflict is not append-only';
|
|
147
|
+
} else {
|
|
148
|
+
writeFileSync(join(temp, NEXT_MD_PATH), resolved);
|
|
149
|
+
run('git', ['add', '--', NEXT_MD_PATH], temp);
|
|
150
|
+
run('git', ['-c', 'user.name=elanous shadow', '-c', 'user.email=shadow@localhost', 'commit', '-m', 'Integrate PR for L8 shadow evaluation'], temp);
|
|
151
|
+
autoResolvedNextMd = true;
|
|
152
|
+
}
|
|
153
|
+
} else {
|
|
154
|
+
verdict.verdict = 'conflict';
|
|
155
|
+
verdict.detail = unresolved.join('\n');
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
if (merge.status === 0 || autoResolvedNextMd) {
|
|
138
159
|
if (verdict.tests.length) {
|
|
139
160
|
if (verdict.tests.some((file) => !existsSync(join(temp!, file)))) throw new Error('changed test path unavailable');
|
|
140
161
|
run('bun', ['install', '--frozen-lockfile'], temp);
|
|
@@ -153,6 +174,9 @@ export async function runL8ShadowQueue(cwd: string, deps: L8ShadowQueueDeps = {}
|
|
|
153
174
|
} else {
|
|
154
175
|
verdict.verdict = 'pass';
|
|
155
176
|
}
|
|
177
|
+
if (autoResolvedNextMd) {
|
|
178
|
+
verdict.detail = verdict.detail ? `release/next.md auto-resolved; ${verdict.detail}` : 'release/next.md auto-resolved';
|
|
179
|
+
}
|
|
156
180
|
}
|
|
157
181
|
} finally {
|
|
158
182
|
try {
|
|
@@ -1078,6 +1078,9 @@ export interface SelfImplementSeams {
|
|
|
1078
1078
|
openPr: (opts: { title: string; body: string; head: string; base?: string; draft?: boolean; labels?: string[]; cwd: string }) => Promise<{ url: string; number: number }>;
|
|
1079
1079
|
/** PR 생성 뒤 런의 라운드 대화를 게시한다. 실패는 PR 개설을 되돌리지 않는다. */
|
|
1080
1080
|
postPrComment?: (opts: { number: number; body: string; cwd: string }) => Promise<void>;
|
|
1081
|
+
/** Read and edit the single marked status comment; missing seams fall back to individual comments. */
|
|
1082
|
+
findPrComment?: (opts: { number: number; marker: string; cwd: string; comments?: unknown }) => Promise<{ id: number; body: string } | undefined>;
|
|
1083
|
+
editPrComment?: (opts: { id: number; body: string; cwd: string }) => Promise<void>;
|
|
1081
1084
|
addPrLabel?: (opts: { number: number; label: string; cwd: string }) => Promise<void>;
|
|
1082
1085
|
readPrFiles?: (opts: { number: number; cwd: string; base?: string }) => Promise<string[]>;
|
|
1083
1086
|
/** PR의 base/head SHA와 관측된 PR base를 한 응답에서 고정한다. 미주입·실패·빈 SHA면 검사 대상을 증명할 수 없어 fail-closed로 PR을 열어 둔다. */
|
|
@@ -3185,6 +3188,20 @@ function autoMergeEnabled(opts: Pick<SelfImplementOptions, 'completion' | 'autoM
|
|
|
3185
3188
|
return completionIntentOf(opts) === 'auto-merge';
|
|
3186
3189
|
}
|
|
3187
3190
|
|
|
3191
|
+
/**
|
|
3192
|
+
* FREEZE-POD — a Pod child never merges its own PR. The host's landing freeze is invisible inside the Pod, so an
|
|
3193
|
+
* auto-merge run there always stops at merge-ready and the launching host re-gates and merges (or holds it).
|
|
3194
|
+
* Local (non-Pod) runs are returned unchanged.
|
|
3195
|
+
*/
|
|
3196
|
+
export function routePodMergeToHost<T extends Pick<SelfImplementOptions, 'completion' | 'autoMerge' | 'mergeByHost'>>(
|
|
3197
|
+
opts: T, env: NodeJS.ProcessEnv = process.env,
|
|
3198
|
+
): { opts: T; reason: 'requested' | 'pod-child-auto-merge' | null } {
|
|
3199
|
+
const podChild = env.ELANOUS_SUBSTRATE === 'pod' && Boolean(env.ELANOUS_POD_NAME?.trim());
|
|
3200
|
+
if (!podChild || !autoMergeEnabled(opts)) return { opts, reason: null };
|
|
3201
|
+
if (opts.mergeByHost === true) return { opts, reason: 'requested' };
|
|
3202
|
+
return { opts: { ...opts, mergeByHost: true }, reason: 'pod-child-auto-merge' };
|
|
3203
|
+
}
|
|
3204
|
+
|
|
3188
3205
|
const SELF_IMPLEMENT_LOG_CATEGORY = 'self-implement';
|
|
3189
3206
|
|
|
3190
3207
|
/** Emits a run-aware auxiliary log without admitting it to the run ledger. */
|
|
@@ -3468,6 +3485,12 @@ export async function runSelfImplement(opts: SelfImplementOptions): Promise<Self
|
|
|
3468
3485
|
}
|
|
3469
3486
|
const identity = resolveRunIdentity({ explicit: opts.runId });
|
|
3470
3487
|
const { runId } = identity;
|
|
3488
|
+
const podMerge = routePodMergeToHost(opts);
|
|
3489
|
+
if (podMerge.reason) {
|
|
3490
|
+
opts = podMerge.opts;
|
|
3491
|
+
try { debug.log('self-implement.pod', 'merge-routed-to-host', { job: process.env.ELANOUS_POD_NAME ?? null, runId, reason: podMerge.reason }); }
|
|
3492
|
+
catch { /* observation must not block the run */ }
|
|
3493
|
+
}
|
|
3471
3494
|
const branch = opts.branchName ?? plannedSelfImplBranch(opts.feature, opts.goalId, runId);
|
|
3472
3495
|
try {
|
|
3473
3496
|
debug.log('self-implement.branch', 'planned', {
|
|
@@ -5358,6 +5381,7 @@ async function runSelfImplementInner(
|
|
|
5358
5381
|
const { listSubscribers } = await import('../session/index.js');
|
|
5359
5382
|
clarificationEscalation = await escalateGoalDocumentClarifications({
|
|
5360
5383
|
goalFile: resolvedGoalFile,
|
|
5384
|
+
runId,
|
|
5361
5385
|
dispatchContext: clarificationDispatchContext,
|
|
5362
5386
|
resolveOriginDelivery: (sessionId) => originHitlDelivery(listSubscribers(sessionId)),
|
|
5363
5387
|
// ⛔ seam 이 주입되면 전역 리졸버는 «불리지 않는다» — 그때 'terminal' 이라 적으면
|
|
@@ -5444,9 +5468,11 @@ async function runSelfImplementInner(
|
|
|
5444
5468
|
const omission = `\n\n[${omittedChars} characters omitted; original body length ${body.length}]`;
|
|
5445
5469
|
prCommentBuffer.push(`${body.slice(0, MAX_PR_COMMENT_BODY_CHARS - omission.length)}${omission}`);
|
|
5446
5470
|
};
|
|
5447
|
-
|
|
5471
|
+
let statusCommentCreateAttempted = false;
|
|
5472
|
+
const flushPrComments = async (pr: { number: number }, salvageAction?: 'launched'): Promise<void> => {
|
|
5448
5473
|
if (!prCommentBuffer.length) return;
|
|
5449
5474
|
if (!s.postPrComment) {
|
|
5475
|
+
observe('pr.comment.mode', { number: pr.number, mode: 'seam-missing', buffered: prCommentBuffer.length });
|
|
5450
5476
|
observe('pr.comment.seam-missing', { number: pr.number, buffered: prCommentBuffer.length }, { level: 'warn' });
|
|
5451
5477
|
return;
|
|
5452
5478
|
}
|
|
@@ -5454,24 +5480,39 @@ async function runSelfImplementInner(
|
|
|
5454
5480
|
if (s.findPrComment && s.editPrComment) {
|
|
5455
5481
|
try {
|
|
5456
5482
|
const existing = await s.findPrComment({ number: pr.number, marker, cwd: wt.path });
|
|
5457
|
-
|
|
5458
|
-
|
|
5459
|
-
|
|
5460
|
-
|
|
5461
|
-
|
|
5462
|
-
|
|
5463
|
-
|
|
5464
|
-
|
|
5483
|
+
if (!existing && statusCommentCreateAttempted) {
|
|
5484
|
+
observe('pr.comment.mode', { number: pr.number, mode: 'individual-fallback', reason: 'status-creation-uncertain', buffered: prCommentBuffer.length });
|
|
5485
|
+
} else {
|
|
5486
|
+
const history = prCommentBuffer.join('\n\n');
|
|
5487
|
+
const body = existing
|
|
5488
|
+
? existing.body.includes('</details>')
|
|
5489
|
+
? existing.body.replace(/<\/details>(?![\s\S]*<\/details>)/, `\n\n${history}\n</details>`)
|
|
5490
|
+
: `${existing.body}\n\n<details>\n<summary>Round history</summary>\n\n${history}\n</details>`
|
|
5491
|
+
: `${marker}\n<details>\n<summary>Round history</summary>\n\n${history}\n</details>`;
|
|
5492
|
+
if (existing) await s.editPrComment({ id: existing.id, body, cwd: wt.path });
|
|
5493
|
+
else {
|
|
5494
|
+
statusCommentCreateAttempted = true;
|
|
5495
|
+
await s.postPrComment({ number: pr.number, body, cwd: wt.path });
|
|
5496
|
+
}
|
|
5497
|
+
observe('pr.comment.mode', { number: pr.number, mode: existing ? 'status-updated' : 'status-created', buffered: prCommentBuffer.length });
|
|
5498
|
+
prCommentBuffer.length = 0;
|
|
5499
|
+
}
|
|
5465
5500
|
} catch (error) {
|
|
5466
5501
|
// Unknown lookup/edit outcome is not proof of absence: never create a second status comment.
|
|
5467
5502
|
observe('pr.comment.status-failed', { number: pr.number, error: error instanceof Error ? error.message : String(error) }, { level: 'warn' });
|
|
5503
|
+
observe('pr.comment.mode', { number: pr.number, mode: 'individual-fallback', reason: 'status-failed', buffered: prCommentBuffer.length });
|
|
5468
5504
|
}
|
|
5505
|
+
} else {
|
|
5506
|
+
observe('pr.comment.mode', { number: pr.number, mode: 'individual-fallback', reason: 'status-seam-missing', buffered: prCommentBuffer.length });
|
|
5469
5507
|
}
|
|
5470
|
-
|
|
5508
|
+
if (!prCommentBuffer.length) return;
|
|
5509
|
+
const pending = prCommentBuffer.splice(0);
|
|
5510
|
+
for (const body of pending) {
|
|
5471
5511
|
try {
|
|
5472
5512
|
await s.postPrComment({ number: pr.number, body, cwd: wt.path });
|
|
5473
5513
|
} catch (error) {
|
|
5474
|
-
|
|
5514
|
+
// Posting may have succeeded remotely even if the response failed; do not retry an uncertain comment.
|
|
5515
|
+
observe('pr.comment.post-failed', { number: pr.number, ...(salvageAction && body.includes('Rework salvage status: launched.') ? { salvageAction } : {}), error: error instanceof Error ? error.message : String(error) }, { level: 'warn' });
|
|
5475
5516
|
}
|
|
5476
5517
|
}
|
|
5477
5518
|
};
|
|
@@ -5822,7 +5863,13 @@ async function runSelfImplementInner(
|
|
|
5822
5863
|
};
|
|
5823
5864
|
const postSalvageStatus = async (pr: { number: number } | undefined, action: 'launched' | 'parked', reason?: string): Promise<void> => {
|
|
5824
5865
|
if (!pr) return;
|
|
5866
|
+
if (action === 'launched') {
|
|
5867
|
+
bufferPrComment(round, 'author', 'Rework salvage status: launched.', reason ? [`reason: ${reason}`] : []);
|
|
5868
|
+
await flushPrComments(pr, 'launched');
|
|
5869
|
+
return;
|
|
5870
|
+
}
|
|
5825
5871
|
if (!s.postPrComment) {
|
|
5872
|
+
observe('pr.comment.mode', { number: pr.number, mode: 'seam-missing', salvageAction: action });
|
|
5826
5873
|
observe('pr.comment.seam-missing', { number: pr.number, salvageAction: action }, { level: 'warn' });
|
|
5827
5874
|
return;
|
|
5828
5875
|
}
|
|
@@ -5831,6 +5878,7 @@ async function runSelfImplementInner(
|
|
|
5831
5878
|
`Rework salvage status: ${action}.`,
|
|
5832
5879
|
...(reason ? ['', `- reason: ${reason}`] : []),
|
|
5833
5880
|
].join('\n');
|
|
5881
|
+
observe('pr.comment.mode', { number: pr.number, mode: 'individual', salvageAction: action });
|
|
5834
5882
|
try {
|
|
5835
5883
|
await s.postPrComment({ number: pr.number, body, cwd: wt.path });
|
|
5836
5884
|
} catch (error) {
|
|
@@ -6000,7 +6048,7 @@ async function runSelfImplementInner(
|
|
|
6000
6048
|
if (!s.launchReworkSalvage) throw new Error('launch seam unavailable');
|
|
6001
6049
|
await s.launchReworkSalvage({ goalFile: opts.goalFile!, base: wt.branch, salvageAttempt: (opts.salvageAttempt ?? 0) + 1 });
|
|
6002
6050
|
observe('rework-salvage', { action: 'launched', ...launchObservation });
|
|
6003
|
-
await postSalvageStatus(pr, 'launched');
|
|
6051
|
+
await postSalvageStatus(pr, 'launched', environmentReason ?? (hardCapBlockedExtend ? 'hard-cap-extend' : undefined));
|
|
6004
6052
|
return 'launched';
|
|
6005
6053
|
} catch (error) {
|
|
6006
6054
|
const reason = 'launch-failed';
|
|
@@ -6184,7 +6232,7 @@ async function runSelfImplementInner(
|
|
|
6184
6232
|
const source = readFileSync(opts.goalFile, 'utf8');
|
|
6185
6233
|
// Always run the shared self-answer so every rework pass leaves one observation, even with nothing pending.
|
|
6186
6234
|
const resolved = await selfAnswerGoalDocumentClarifications(source, {
|
|
6187
|
-
path: 'rework', ask: source, resolver: s.selfResolveClarification,
|
|
6235
|
+
path: 'rework', ask: source, resolver: s.selfResolveClarification, runId,
|
|
6188
6236
|
});
|
|
6189
6237
|
if (resolved.newlyAnswered > 0) writeGoalDocumentAtomic(opts.goalFile, resolved.document);
|
|
6190
6238
|
} catch (error) {
|
|
@@ -2,7 +2,7 @@ import { execFileSync } from 'node:child_process';
|
|
|
2
2
|
import { readFileSync } from 'node:fs';
|
|
3
3
|
import { resolve } from 'node:path';
|
|
4
4
|
import { debug } from '../debug/log.js';
|
|
5
|
-
import { parse as parsePrCommentMeta } from '../agent-substrate/pr-comment-meta.js';
|
|
5
|
+
import { expandRecords, parse as parsePrCommentMeta } from '../agent-substrate/pr-comment-meta.js';
|
|
6
6
|
|
|
7
7
|
export interface PriorDraftPr {
|
|
8
8
|
number: number;
|
|
@@ -85,9 +85,10 @@ export async function collectPriorDraftFindings({
|
|
|
85
85
|
continue;
|
|
86
86
|
}
|
|
87
87
|
const prActivity = Date.parse(pr.state.toUpperCase() === 'CLOSED' ? pr.closedAt ?? pr.createdAt : pr.createdAt);
|
|
88
|
+
const records = comments.flatMap((comment) => expandRecords(comment.body).map((body) => ({ ...comment, body })));
|
|
88
89
|
// A PR bearing the current run's comment is this run's PR, not a predecessor.
|
|
89
|
-
if (
|
|
90
|
-
const reviewers =
|
|
90
|
+
if (records.some((comment) => parsePrCommentMeta(comment.body)?.run === currentRunId)) continue;
|
|
91
|
+
const reviewers = records.flatMap((comment) => {
|
|
91
92
|
const meta = parsePrCommentMeta(comment.body);
|
|
92
93
|
return meta?.role === 'reviewer' && meta.run && meta.round !== undefined
|
|
93
94
|
? [{ comment, meta }] : [];
|