elanous 0.2.17 → 0.2.18
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/P6YTVgzuZz5oTZhY4Din_/_buildManifest.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{1307-aac7332576c4d6fc.js → 1307-30dff22c9e1f3073.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/195-fb1d7690bf30bab4.js +1 -0
- package/apps/pwa/out/_next/static/chunks/1986-33e13d648a9df765.js +1 -0
- package/apps/pwa/out/_next/static/chunks/2537-6c289376caa88ca1.js +1 -0
- package/apps/pwa/out/_next/static/chunks/2699-325cc923ba7b8631.js +1 -0
- package/apps/pwa/out/_next/static/chunks/3857-4f936cdb30322aa6.js +1 -0
- package/apps/pwa/out/_next/static/chunks/4554-5761612531d0146b.js +1 -0
- package/apps/pwa/out/_next/static/chunks/4565-3d7e3fdeb43686a8.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5977-a11f37254196b659.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{6158.9c0449a9a8d0064b.js → 6158.af2e93b7adff709b.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/6877-74399f69c7da1433.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7797-df5aa0381fdc078f.js +1 -0
- package/apps/pwa/out/_next/static/chunks/8401-8615a660c84cdb03.js +1 -0
- package/apps/pwa/out/_next/static/chunks/8695-846034ce44852c70.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/approvals/{page-3143b07a817d1da9.js → page-d92f7ee3994e84c7.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/app/autopilot/{page-17ba086ef82d339b.js → page-4733c967b56a4277.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/app/board/{page-7eb661ff23af7da2.js → page-d22fd849cc22f104.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/app/botlab/page-bb742f995c6769e7.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/bots/{page-6e5c3a867557298b.js → page-02b073a2ac793b83.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/app/ceo/page-60c3da708f9a0ccc.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/chat/page-8a9b3594bc23289b.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/consult/{page-5e77cd1802567c89.js → page-a0eb02638b1e6f31.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/app/control/page-308111abadf35670.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/decisions/page-6eaf7bac37830c21.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/design-check/{page-4187666132fc98c4.js → page-5d97b2901e0d1ea6.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/app/editor/{page-09328d499162bae4.js → page-c39554c321576982.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/app/exec/{page-29ff3a8f84f03b6a.js → page-8c3d8e63ae2e1c98.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/app/field/{page-80ec7401bc83f511.js → page-9b72a07d424701c6.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/app/inside/page-bd5d586429167fea.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/intake/{page-fc7d86467291ae38.js → page-a572f58cd3ca5864.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/app/layout-59b7834d497c2255.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/live/page-be5ea965a07fbc41.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/loops/{page-0e2d6985fb42cd2f.js → page-c130b63862437814.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/app/market/{page-13e4108999f58d13.js → page-fa244bd146a00ae8.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/app/missions/[id]/{page-e8296ee284aa1293.js → page-44d56d6391965a6a.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/app/morning/{page-043a9111e74f6b24.js → page-83a700d4c754d802.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/app/{not-found-23a4601ceb7f452e.js → not-found-7b3170f374f77b9d.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/app/observatory/page-5f23d0c66a3b4793.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/ops/checklist/{page-10d958605a77b3bd.js → page-a3c58f5c72a5f3f9.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/app/ops/release/page-a2c4625596f8d69c.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/ops/seats/page-0e9099531d239f11.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/outputs/{page-7a1d85e121065cc8.js → page-e8e1ecaea7cd71d2.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/app/page-a1b7ffed710a93e0.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/reflection/{page-12916918988ac97e.js → page-1467047104141297.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/app/scheduler/{page-d8a3347a9d0c3f4a.js → page-2da6f9b8a38c6978.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/app/sessions/page-102310930791197a.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/settings/devices/page-f331e38fefc00393.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/settings/page-6ed0b73bae8351d8.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/setup/done/{page-1d824510df025d18.js → page-44d5f767491692bf.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/app/setup/page-43336055451f6e37.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/share/{page-7f49fe645d5132f7.js → page-3cc47dca0922ab9a.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/app/showroom/page-a77ee355a2304ff0.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/tasks/{page-27d71f131acd9320.js → page-b17cd46cf0e9b8cf.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/app/term/page-61553851aa606146.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/today/page-a1f585e154e61c59.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/trace/{page-424659bacfb8cdd7.js → page-7bf54c9bb9274af8.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/app/vault/page-5150ef17b5383a57.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/workflows/chat-ui/page-b9d8ce70792c1672.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/workflows/page-a5a3de231f2cc7d5.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/workspace/{page-5d4fef9ccd7d406b.js → page-134da468538baf48.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/app/worktrees/page-31ac4afa2dcd915c.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{webpack-539cde99554be20f.js → webpack-c2782b330447ffb6.js} +1 -1
- package/apps/pwa/out/_next/static/css/7fa358fec7da7c47.css +1 -0
- package/apps/pwa/out/approvals/index.html +1 -1
- package/apps/pwa/out/approvals/index.txt +14 -14
- package/apps/pwa/out/autopilot/index.html +1 -1
- package/apps/pwa/out/autopilot/index.txt +14 -14
- package/apps/pwa/out/board/index.html +1 -1
- package/apps/pwa/out/board/index.txt +14 -14
- package/apps/pwa/out/botlab/index.html +1 -1
- package/apps/pwa/out/botlab/index.txt +14 -14
- package/apps/pwa/out/bots/index.html +1 -1
- package/apps/pwa/out/bots/index.txt +14 -14
- package/apps/pwa/out/ceo/index.html +1 -1
- package/apps/pwa/out/ceo/index.txt +14 -14
- package/apps/pwa/out/chat/index.html +1 -1
- package/apps/pwa/out/chat/index.txt +14 -14
- package/apps/pwa/out/consult/index.html +1 -1
- package/apps/pwa/out/consult/index.txt +14 -14
- package/apps/pwa/out/control/index.html +1 -1
- package/apps/pwa/out/control/index.txt +14 -14
- 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 +14 -14
- package/apps/pwa/out/editor/index.html +1 -1
- package/apps/pwa/out/editor/index.txt +14 -14
- package/apps/pwa/out/exec/index.html +1 -1
- package/apps/pwa/out/exec/index.txt +14 -14
- package/apps/pwa/out/field/index.html +1 -1
- package/apps/pwa/out/field/index.txt +14 -14
- package/apps/pwa/out/healthz +1 -1
- package/apps/pwa/out/index.html +1 -1
- package/apps/pwa/out/index.txt +14 -14
- package/apps/pwa/out/inside/index.html +1 -1
- package/apps/pwa/out/inside/index.txt +14 -14
- package/apps/pwa/out/intake/index.html +1 -1
- package/apps/pwa/out/intake/index.txt +14 -14
- package/apps/pwa/out/live/index.html +1 -1
- package/apps/pwa/out/live/index.txt +14 -14
- package/apps/pwa/out/loops/index.html +1 -1
- package/apps/pwa/out/loops/index.txt +14 -14
- package/apps/pwa/out/market/index.html +1 -1
- package/apps/pwa/out/market/index.txt +14 -14
- package/apps/pwa/out/missions/placeholder/index.html +1 -1
- package/apps/pwa/out/missions/placeholder/index.txt +14 -14
- package/apps/pwa/out/morning/index.html +1 -1
- package/apps/pwa/out/morning/index.txt +14 -14
- package/apps/pwa/out/observatory/index.html +1 -1
- package/apps/pwa/out/observatory/index.txt +14 -14
- package/apps/pwa/out/ops/checklist/index.html +1 -1
- package/apps/pwa/out/ops/checklist/index.txt +14 -14
- package/apps/pwa/out/ops/release/index.html +1 -1
- package/apps/pwa/out/ops/release/index.txt +14 -14
- package/apps/pwa/out/ops/seats/index.html +1 -1
- package/apps/pwa/out/ops/seats/index.txt +14 -14
- package/apps/pwa/out/outputs/index.html +1 -1
- package/apps/pwa/out/outputs/index.txt +14 -14
- package/apps/pwa/out/reflection/index.html +1 -1
- package/apps/pwa/out/reflection/index.txt +15 -15
- package/apps/pwa/out/scheduler/index.html +1 -1
- package/apps/pwa/out/scheduler/index.txt +14 -14
- package/apps/pwa/out/sessions/index.html +1 -1
- package/apps/pwa/out/sessions/index.txt +14 -14
- package/apps/pwa/out/settings/devices/index.html +1 -1
- package/apps/pwa/out/settings/devices/index.txt +14 -14
- package/apps/pwa/out/settings/index.html +1 -1
- package/apps/pwa/out/settings/index.txt +14 -14
- package/apps/pwa/out/setup/done/index.html +1 -1
- package/apps/pwa/out/setup/done/index.txt +14 -14
- package/apps/pwa/out/setup/index.html +1 -1
- package/apps/pwa/out/setup/index.txt +14 -14
- package/apps/pwa/out/share/index.html +1 -1
- package/apps/pwa/out/share/index.txt +14 -14
- package/apps/pwa/out/showroom/index.html +1 -1
- package/apps/pwa/out/showroom/index.txt +14 -14
- package/apps/pwa/out/tasks/index.html +1 -1
- package/apps/pwa/out/tasks/index.txt +14 -14
- package/apps/pwa/out/term/index.html +1 -1
- package/apps/pwa/out/term/index.txt +14 -14
- package/apps/pwa/out/today/index.html +1 -1
- package/apps/pwa/out/today/index.txt +14 -14
- package/apps/pwa/out/trace/index.html +1 -1
- package/apps/pwa/out/trace/index.txt +14 -14
- package/apps/pwa/out/vault/index.html +1 -1
- package/apps/pwa/out/vault/index.txt +14 -14
- package/apps/pwa/out/workflows/chat-ui/index.html +1 -1
- package/apps/pwa/out/workflows/chat-ui/index.txt +14 -14
- package/apps/pwa/out/workflows/index.html +1 -1
- package/apps/pwa/out/workflows/index.txt +14 -14
- package/apps/pwa/out/workspace/index.html +1 -1
- package/apps/pwa/out/workspace/index.txt +14 -14
- package/apps/pwa/out/worktrees/index.html +1 -1
- package/apps/pwa/out/worktrees/index.txt +14 -14
- 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/discord-seat-probe.ts +3 -2
- 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/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-node.ts +99 -14
- 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 +115 -0
- package/scripts/release-loop/unattended-release.ts +43 -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/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/briefing/brief-items.ts +86 -17
- package/src/cli/autopilot-cli.ts +30 -11
- package/src/cli/brief-cli.ts +36 -2
- package/src/cli/freeze-cli.ts +3 -2
- package/src/cli/intake-cli.ts +73 -1
- package/src/cli/notify-cli.ts +75 -0
- package/src/cli/provider-cli.ts +12 -2
- package/src/cli/release-cli.ts +101 -17
- package/src/cli/tasks-cli.ts +309 -3
- 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/discord-self-message.ts +20 -2
- package/src/discord-slash-wire.ts +1 -0
- package/src/domains/outbound-alert.ts +200 -27
- package/src/domains/outbound-log-probe.ts +16 -1
- package/src/domains/release-tool.ts +2 -2
- 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/harness/harness-cli-command.ts +10 -2
- package/src/harness/harness-queue.ts +388 -33
- package/src/harness/helper-scan.ts +10 -3
- package/src/hq/seats.ts +369 -0
- package/src/index.ts +133 -15
- 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/discord-seat-work.ts +8 -2
- 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/finish-rate.ts +73 -1
- package/src/loops/orchestrator/grid-place.ts +11 -0
- package/src/loops/orchestrator/tick.ts +295 -20
- package/src/maturity/feature-maturity.ts +3 -2
- package/src/nexus/api/decisions-route.ts +11 -1
- package/src/nexus/api/loop-edges.ts +69 -13
- package/src/nexus/api/ops-seats-sources.ts +2 -2
- package/src/nexus/api/workflow-templates.ts +3 -0
- package/src/oauth/codex.ts +38 -0
- package/src/onboarding/first-chat-gate.ts +29 -0
- package/src/release-loop/checklist.ts +104 -6
- package/src/release-loop/feature-store.ts +10 -9
- package/src/release-loop/landing-freeze.ts +6 -4
- package/src/release-loop/placement.ts +13 -3
- package/src/release-loop/rubric.ts +80 -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-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/round-pr-supersede.ts +244 -0
- package/src/self-dev/run-supervisor.ts +14 -0
- package/src/self-implement/follow-up-goals.ts +2 -2
- package/src/self-implement/gate-remote.ts +427 -0
- package/src/self-implement/goal-author.ts +8 -3
- package/src/self-implement/l8-merge-queue.ts +29 -5
- package/src/self-implement/orchestrator.ts +59 -12
- package/src/self-implement/prior-draft-findings.ts +4 -3
- package/src/skills/skill-feedback.ts +76 -0
- package/src/task-agent/actions.ts +39 -6
- package/src/task-agent/judge.ts +31 -5
- package/src/task-agent/mission.ts +423 -0
- package/src/task-agent/shadow.ts +90 -0
- package/src/task-agent/task-hand.ts +235 -0
- package/src/task-orchestrator/surfaces/pod-failure-reason.ts +10 -0
- package/src/task-orchestrator/surfaces/self-implement-pod.ts +86 -18
- package/src/telegram-loops-command.ts +1 -1
- package/src/telegram.ts +5 -20
- package/src/user-config.ts +63 -3
- package/src/version/packed-revision.json +1 -1
- package/apps/pwa/out/_next/static/chunks/2699-63b73fa4d3bcf6ff.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/5135-44008fe8b1f2aa41.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5233-bf28bd6bd7a32099.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5977-c952712c87a1f757.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6877-fe94e76a5841ee9b.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/8401-4ce1c42c8d89903f.js +0 -1
- 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/app/botlab/page-6b8444914da74ca6.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/control/page-41afec0b255ed2bb.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/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/observatory/page-1ed1324b1dc36754.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/page-1f50e3d4e13435f4.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/page-6e878ebbe1737d00.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/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/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/worktrees/page-ea90a8ac73ce2749.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 → P6YTVgzuZz5oTZhY4Din_}/_ssgManifest.js +0 -0
|
@@ -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 }] : [];
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
import { appendFileSync, readFileSync } from 'node:fs';
|
|
2
|
+
import { debug } from '../debug/log.js';
|
|
3
|
+
|
|
4
|
+
export interface SkillRun {
|
|
5
|
+
skill: string;
|
|
6
|
+
runId: string;
|
|
7
|
+
outcome: 'success' | 'failure';
|
|
8
|
+
failureKind?: string;
|
|
9
|
+
userCorrected: boolean;
|
|
10
|
+
retries: number;
|
|
11
|
+
durationMs: number;
|
|
12
|
+
at: string;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
export interface SkillFixProposal {
|
|
16
|
+
skill: string;
|
|
17
|
+
failureKind: string;
|
|
18
|
+
evidenceRunIds: string[];
|
|
19
|
+
suggestion: string;
|
|
20
|
+
expectedEffect: string;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
/** Record one run at the caller-supplied ledger path; never touch a skill file. */
|
|
24
|
+
export function appendSkillRun(ledgerPath: string, run: SkillRun): void {
|
|
25
|
+
appendFileSync(ledgerPath, `${JSON.stringify(run)}\n`, 'utf8');
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
/** Read the JSONL ledger in append order; an absent ledger has no runs. */
|
|
29
|
+
export function readSkillRuns(ledgerPath: string): SkillRun[] {
|
|
30
|
+
let text: string;
|
|
31
|
+
try {
|
|
32
|
+
text = readFileSync(ledgerPath, 'utf8');
|
|
33
|
+
} catch (error) {
|
|
34
|
+
if ((error as NodeJS.ErrnoException).code === 'ENOENT') return [];
|
|
35
|
+
throw error;
|
|
36
|
+
}
|
|
37
|
+
return text.split('\n').filter((line) => line.trim() !== '').map((line) => JSON.parse(line) as SkillRun);
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
/** Shadow-only suggestions for recurring failures within the same skill and failure kind. */
|
|
41
|
+
export function proposeSkillFixes(
|
|
42
|
+
runs: readonly SkillRun[],
|
|
43
|
+
{ threshold = 3 }: { threshold?: number } = {},
|
|
44
|
+
): SkillFixProposal[] {
|
|
45
|
+
const grouped = new Map<string, Map<string, Map<string, SkillRun>>>();
|
|
46
|
+
for (const run of runs) {
|
|
47
|
+
if (run.outcome !== 'failure' || !run.failureKind) continue;
|
|
48
|
+
let kinds = grouped.get(run.skill);
|
|
49
|
+
if (!kinds) { kinds = new Map(); grouped.set(run.skill, kinds); }
|
|
50
|
+
let failures = kinds.get(run.failureKind);
|
|
51
|
+
if (!failures) { failures = new Map(); kinds.set(run.failureKind, failures); }
|
|
52
|
+
const previous = failures.get(run.runId);
|
|
53
|
+
if (!previous || run.at >= previous.at) failures.set(run.runId, run);
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
const proposals: SkillFixProposal[] = [];
|
|
57
|
+
for (const [skill, kinds] of grouped) {
|
|
58
|
+
for (const [failureKind, failures] of kinds) {
|
|
59
|
+
if (failures.size < threshold) continue;
|
|
60
|
+
const evidenceRunIds = [...failures.values()]
|
|
61
|
+
.map((run, index) => ({ run, index }))
|
|
62
|
+
.sort((a, b) => a.run.at.localeCompare(b.run.at) || a.index - b.index)
|
|
63
|
+
.slice(-3)
|
|
64
|
+
.map(({ run }) => run.runId);
|
|
65
|
+
proposals.push({
|
|
66
|
+
skill,
|
|
67
|
+
failureKind,
|
|
68
|
+
evidenceRunIds,
|
|
69
|
+
suggestion: `스킬 ${skill}의 ${failureKind} 실패 처리를 점검·개선하세요 — 같은 실패가 ${failures.size}번 반복됐습니다.`,
|
|
70
|
+
expectedEffect: `${skill}의 ${failureKind} 재발 감소`,
|
|
71
|
+
});
|
|
72
|
+
debug.log('skill.feedback', 'proposal', { skill, failureKind, runs: failures.size });
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
return proposals;
|
|
76
|
+
}
|
|
@@ -1,6 +1,17 @@
|
|
|
1
1
|
export type NextActionKind = 'review' | 'land' | 'retry' | 'green' | 'decision';
|
|
2
|
+
/**
|
|
3
|
+
* `retry` 의 갈래(RFC §A9 G1·G2). 없으면 종전 그대로 «must-fix 로 좁힌 재발사»다(must-fix 가 없으면 카드).
|
|
4
|
+
* - narrow: 범위를 좁혀 한 번 재발사(must-fix 없이도 간다 — no-progress)
|
|
5
|
+
* - wait: 기다렸다 재시도 — 실행부는 발사하지 않고 «대기 표지»만 남긴다(provider-exhausted · step-timeout)
|
|
6
|
+
* - salvage: 수확 가지에서 이어 발사(handed-off-to-salvage)
|
|
7
|
+
* - alternative: 같은 수 2회 실패 뒤 «다른 수»
|
|
8
|
+
*/
|
|
9
|
+
export type RetryVariant = 'narrow' | 'wait' | 'salvage' | 'alternative';
|
|
2
10
|
export interface NextAction {
|
|
3
11
|
kind: NextActionKind;
|
|
12
|
+
variant?: RetryVariant;
|
|
13
|
+
/** salvage 갈래에서 이어 받을 수확 가지(모르면 비운다). */
|
|
14
|
+
salvageBranch?: string;
|
|
4
15
|
taskId: string;
|
|
5
16
|
rationale: string;
|
|
6
17
|
pr: number;
|
|
@@ -30,10 +41,21 @@ export interface ActionDeps {
|
|
|
30
41
|
observe(event: 'task-agent.action', data: { taskId: string; kind: NextActionKind; result: string; reason: string }): void;
|
|
31
42
|
}
|
|
32
43
|
|
|
44
|
+
/** 실패 셈 키. 갈래가 있으면 갈래별로 센다(G2 — «다른 수»의 실패가 같은 칸에 쌓이지 않게). 없으면 종전 키 그대로. */
|
|
45
|
+
export function failureKey(action: Pick<NextAction, 'taskId' | 'kind' | 'variant'>): string {
|
|
46
|
+
return JSON.stringify(action.variant ? [action.taskId, action.kind, action.variant] : [action.taskId, action.kind]);
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
const RETRY_HINT: Record<Exclude<RetryVariant, 'wait'>, (action: NextAction) => string> = {
|
|
50
|
+
narrow: action => `Narrow relaunch: previous run ${action.runId} made no progress. Halve the scope; keep the same acceptance line.`,
|
|
51
|
+
salvage: action => `Salvage relaunch: continue from the salvage branch ${action.salvageBranch ?? `of run ${action.runId}`} — take its diff, do not restart from scratch.`,
|
|
52
|
+
alternative: () => 'Alternative approach: the same move already failed twice. Choose a different approach than the previous runs.',
|
|
53
|
+
};
|
|
54
|
+
|
|
33
55
|
export async function executeNextAction(action: NextAction, deps: ActionDeps): Promise<string> {
|
|
34
56
|
const record = (result: string, reason: string) => {
|
|
35
57
|
if (result === 'failed' && (deps.failureCounts || deps.incrementFailure)) {
|
|
36
|
-
const key =
|
|
58
|
+
const key = failureKey(action);
|
|
37
59
|
const next = deps.incrementFailure ? deps.incrementFailure(key) : (deps.failureCounts![key] ?? 0) + 1;
|
|
38
60
|
if (deps.failureCounts) deps.failureCounts[key] = next;
|
|
39
61
|
if (!deps.incrementFailure) deps.saveState?.();
|
|
@@ -41,14 +63,14 @@ export async function executeNextAction(action: NextAction, deps: ActionDeps): P
|
|
|
41
63
|
deps.observe('task-agent.action', { taskId: action.taskId, kind: action.kind, result, reason });
|
|
42
64
|
return result;
|
|
43
65
|
};
|
|
44
|
-
if (deps.mode !== 'live') return record('shadow', `would ${action.kind}: ${action.rationale}`);
|
|
66
|
+
if (deps.mode !== 'live') return record('shadow', `would ${action.kind}${action.variant ? `:${action.variant}` : ''}: ${action.rationale}`);
|
|
45
67
|
const card = async (reason: string) => {
|
|
46
68
|
const evidence = JSON.stringify({ runId: action.runId, pr: action.pr, mustFix: action.mustFix ?? [], history: action.history ?? [], selected: action.kind, reason });
|
|
47
69
|
const result = await deps.command(['decisions', 'raise', '--title', `${action.taskId}: ${reason}`, '--category', action.risk === 'money' ? 'money' : action.risk === 'security' ? 'security' : action.risk === 'irreversible-publication' ? 'publish' : 'other', '--s', `Task ${action.taskId} needs a decision.`, '--c', reason, '--ref', evidence, '--q', 'Which action should be taken?', '--option', 'h=Keep on hold:no automatic execution', '--option', 'p=Approve action:execute after approval', '--skip-recommend', 'requires human decision', '--no-xcheck', 'automated escalation']);
|
|
48
70
|
return record(result.status === 0 ? 'decision' : 'failed', reason);
|
|
49
71
|
};
|
|
50
72
|
if (action.risk) return card(`risk: ${action.risk}`);
|
|
51
|
-
if ((deps.failureCounts?.[
|
|
73
|
+
if ((deps.failureCounts?.[failureKey(action)] ?? deps.failures ?? 0) >= 2) return card('same task/action failed twice');
|
|
52
74
|
if (action.kind === 'land') {
|
|
53
75
|
if (!action.cwd) return card('landing worktree unknown');
|
|
54
76
|
const view = await deps.command(['gh', 'pr', 'view', String(action.pr), '--json', 'labels']);
|
|
@@ -66,7 +88,10 @@ export async function executeNextAction(action: NextAction, deps: ActionDeps): P
|
|
|
66
88
|
}
|
|
67
89
|
if (action.kind === 'decision') return card(action.rationale);
|
|
68
90
|
if (action.kind === 'green') return card('green requires a verified landing in this execution');
|
|
69
|
-
|
|
91
|
+
// G1 — 기다림은 발사가 아니다: 대기 표지만 남기고 다음 틱이 다시 판단한다(카드로 올리지 않는다).
|
|
92
|
+
if (action.kind === 'retry' && action.variant === 'wait') return record('waiting', `wait marker: ${action.rationale}`);
|
|
93
|
+
// must-fix 없는 재발사가 카드로 가는 것은 갈래 없는(종전) retry 뿐이다 — narrow·salvage·alternative 는 갈래 문면으로 간다.
|
|
94
|
+
if (action.kind === 'retry' && !action.variant && !action.mustFix?.length) return card('must-fix missing; cannot narrow retry');
|
|
70
95
|
if (action.kind === 'review') {
|
|
71
96
|
const review = await deps.command(['self', 'review', String(action.pr), '--json']);
|
|
72
97
|
if (review.status !== 0) return record('failed', 'review command failed');
|
|
@@ -83,8 +108,7 @@ export async function executeNextAction(action: NextAction, deps: ActionDeps): P
|
|
|
83
108
|
return card('review verdict or must-fix unavailable');
|
|
84
109
|
}
|
|
85
110
|
// 여기 닿는 종류는 land · retry 둘뿐이다(green·decision·review 는 위에서 끝난다).
|
|
86
|
-
const args = action.kind === 'land' ? ['pr', 'land', '--cwd', action.cwd!]
|
|
87
|
-
: ['harness', 'say', `${action.original}\n\nMust-fix:\n${(action.mustFix ?? []).join('\n')}\n\nPrevious run: ${action.runId}`];
|
|
111
|
+
const args = action.kind === 'land' ? ['pr', 'land', '--cwd', action.cwd!] : ['harness', 'say', retryText(action)];
|
|
88
112
|
const day = deps.landingDay ?? new Date().toLocaleDateString('en-CA', { timeZone: 'Asia/Seoul' });
|
|
89
113
|
const outcome = await deps.command(args);
|
|
90
114
|
if (outcome.status !== 0) {
|
|
@@ -116,3 +140,12 @@ export async function executeNextAction(action: NextAction, deps: ActionDeps): P
|
|
|
116
140
|
}
|
|
117
141
|
return record('done', action.rationale);
|
|
118
142
|
}
|
|
143
|
+
|
|
144
|
+
/** 재발사 문면 — 원문은 고치지 않고 앞에 둔다 · 갈래 문면 · must-fix · 직전 런 순서. */
|
|
145
|
+
export function retryText(action: NextAction): string {
|
|
146
|
+
const sections = [action.original];
|
|
147
|
+
if (action.variant && action.variant !== 'wait') sections.push(RETRY_HINT[action.variant](action));
|
|
148
|
+
if (action.mustFix?.length) sections.push(`Must-fix:\n${action.mustFix.join('\n')}`);
|
|
149
|
+
sections.push(`Previous run: ${action.runId}`);
|
|
150
|
+
return sections.join('\n\n');
|
|
151
|
+
}
|
package/src/task-agent/judge.ts
CHANGED
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
* 부작용이 없다(발사·리뷰·착지는 실행부 `actions.ts` 의 몫). 수확 원천 = run-c9ad6d6d `chooseTaskAction`.
|
|
6
6
|
*/
|
|
7
7
|
import type { SupervisorStopReason } from '../self-dev/run-supervisor.js';
|
|
8
|
-
import type { NextActionKind } from './actions.js';
|
|
8
|
+
import type { NextActionKind, RetryVariant } from './actions.js';
|
|
9
9
|
|
|
10
10
|
export type TaskMove =
|
|
11
11
|
| 'propose-green'
|
|
@@ -35,6 +35,11 @@ export interface TaskJudgement {
|
|
|
35
35
|
reason: string;
|
|
36
36
|
/** 실행부(`executeNextAction`)가 바로 받는 수면 그 종류. 없으면 발사·대기 계열(실행부 밖). */
|
|
37
37
|
executorKind?: NextActionKind;
|
|
38
|
+
/**
|
|
39
|
+
* 실행부 `retry` 의 갈래(§A9 G2). 좁혀 재발사 · 기다렸다 재시도 · 수확 이어 발사 · 다른 수가
|
|
40
|
+
* 같은 재발사로 접히지 않게 실행부에 넘긴다. retry 가 아닌 수에는 없다.
|
|
41
|
+
*/
|
|
42
|
+
executorVariant?: RetryVariant;
|
|
38
43
|
}
|
|
39
44
|
|
|
40
45
|
/** 같은 수가 이 횟수만큼 실패하면 다른 수로 넘어간다(RFC §A2 «같은 수 2번 실패»). */
|
|
@@ -51,6 +56,13 @@ const EXECUTOR_KIND: Partial<Record<TaskMove, NextActionKind>> = {
|
|
|
51
56
|
'decision-card': 'decision',
|
|
52
57
|
};
|
|
53
58
|
|
|
59
|
+
const EXECUTOR_VARIANT: Partial<Record<TaskMove, RetryVariant>> = {
|
|
60
|
+
'narrow-relaunch': 'narrow',
|
|
61
|
+
'wait-retry': 'wait',
|
|
62
|
+
'salvage-relaunch': 'salvage',
|
|
63
|
+
alternative: 'alternative',
|
|
64
|
+
};
|
|
65
|
+
|
|
54
66
|
function base(input: TaskJudgeInput): Omit<TaskJudgement, 'executorKind'> {
|
|
55
67
|
const stop = input.stopReason;
|
|
56
68
|
const merged = input.prState === 'MERGED' && input.pr !== undefined && input.pr !== '';
|
|
@@ -82,15 +94,29 @@ function base(input: TaskJudgeInput): Omit<TaskJudgement, 'executorKind'> {
|
|
|
82
94
|
}
|
|
83
95
|
}
|
|
84
96
|
|
|
85
|
-
/**
|
|
97
|
+
/** 재발사 계열 — 대안(alternative)이 실패한 «같은 실패 흐름»에 속하는 수. */
|
|
98
|
+
const RETRY_FAMILY: ReadonlySet<TaskMove> = new Set<TaskMove>(['narrow-relaunch', 'wait-retry', 'salvage-relaunch']);
|
|
99
|
+
|
|
100
|
+
/**
|
|
101
|
+
* 종료 어휘·관측에서 다음 한 수를 고른다. 같은 수 2회 실패 → 다른 수 → 그것도 실패 → 결정 카드.
|
|
102
|
+
*
|
|
103
|
+
* ⭐ 새 관측이 이긴다(사후 리뷰 must-fix · #24453): 병합된 PR(propose-green)·종료 미관측(wait)·표 밖 어휘(decision-card)는
|
|
104
|
+
* 실패 셈과 무관하게 그대로 간다. 「대안도 실패 → 결정 카드」 승격은 지금 수가 같은 실패 흐름일 때만 —
|
|
105
|
+
* 재발사 계열이거나, 그 수 자신이 이미 같은 수 한도만큼 실패했을 때다.
|
|
106
|
+
*/
|
|
86
107
|
export function judgeNextMove(input: TaskJudgeInput): TaskJudgement {
|
|
87
108
|
const failures = input.failures ?? {};
|
|
88
109
|
let judged = base(input);
|
|
89
|
-
|
|
110
|
+
const escalatable = judged.move !== 'wait' && judged.move !== 'decision-card' && judged.move !== 'propose-green';
|
|
111
|
+
const exhausted = escalatable && (failures[judged.move] ?? 0) >= SAME_MOVE_FAILURE_LIMIT;
|
|
112
|
+
const inFailingFlow = RETRY_FAMILY.has(judged.move) || exhausted;
|
|
113
|
+
if (escalatable && inFailingFlow && (failures.alternative ?? 0) >= 1) {
|
|
90
114
|
judged = { move: 'decision-card', stage: 'escalated', reason: `대안도 실패 — 런·PR·must-fix 근거로 사람 결정 (직전: ${judged.move})` };
|
|
91
|
-
} else if (
|
|
115
|
+
} else if (exhausted) {
|
|
92
116
|
judged = { move: 'alternative', stage: 'repairing', reason: `같은 수 ${SAME_MOVE_FAILURE_LIMIT}회 실패 — 다른 수 선택 (${judged.move})` };
|
|
93
117
|
}
|
|
94
118
|
const executorKind = EXECUTOR_KIND[judged.move];
|
|
95
|
-
|
|
119
|
+
const executorVariant = EXECUTOR_VARIANT[judged.move];
|
|
120
|
+
if (!executorKind) return judged;
|
|
121
|
+
return executorVariant ? { ...judged, executorKind, executorVariant } : { ...judged, executorKind };
|
|
96
122
|
}
|