@tea-agent/loop-agent 0.40.0-next.1 → 0.40.0-next.11
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/AGENTS.md +1 -1
- package/CHANGELOG.md +114 -109
- package/README.md +2 -2
- package/dist/application/dag/generate-task-dag.js +6 -2
- package/dist/application/task-lifecycle/advance.js +12 -0
- package/dist/build-stamp.json +3 -3
- package/dist/cli/update/runtime-activity.js +1 -29
- package/dist/commands/dag-rerun.js +1 -1
- package/dist/executors/dag-pi-executor.js +69 -7
- package/dist/executors/pi-executor.js +4 -2
- package/dist/executors/pi-sdk-executor.js +46 -1
- package/dist/executors/pi-writer-tool-policy.js +57 -1
- package/dist/executors/shell-executor.js +107 -20
- package/dist/executors/workspace-write-snapshot.js +68 -0
- package/dist/governance/checks.js +1 -0
- package/dist/infrastructure/harness/atomic-write.js +23 -0
- package/dist/shared/dag-prompt-override.js +4 -5
- package/dist/shared/update/npm-client.js +33 -11
- package/dist/task/config-types.js +10 -0
- package/dist/task/contract/apply.js +11 -1
- package/dist/task/contract/constants.js +2 -0
- package/dist/task/contract/hash.js +3 -0
- package/dist/task/contract/observe.js +25 -4
- package/dist/task/contract/paths.js +2 -1
- package/dist/task/contract/project.js +15 -1
- package/dist/task/contract/schema.js +2 -0
- package/dist/task/contract/transaction.js +12 -0
- package/dist/task/source-prepare/completeness.js +188 -0
- package/dist/task/source-prepare/fragment-inventory.js +474 -0
- package/dist/task/source-prepare/index.js +3 -0
- package/dist/task/source-prepare/ledger-reconciliation.js +127 -0
- package/dist/task/source-prepare/ledger-review.js +214 -0
- package/dist/task/source-prepare/ledger.js +545 -0
- package/dist/task/source-prepare/prepare.js +262 -1
- package/dist/task/source-prepare/semantic-intake.js +19 -3
- package/dist/task/source-prepare/source-fidelity-pi.js +384 -0
- package/dist/task/source-prepare/types.js +22 -0
- package/dist/worker/cli.js +12 -26
- package/dist/worker/console/chat/chat-event-store.js +75 -5
- package/dist/worker/console/chat/context-panel.js +7 -0
- package/dist/worker/console/chat/deferred-turn.js +12 -0
- package/dist/worker/console/chat/pi-runtime.js +331 -18
- package/dist/worker/console/chat/provider-error.js +98 -0
- package/dist/worker/console/chat/routes.js +389 -56
- package/dist/worker/console/chat/session-stats.js +179 -0
- package/dist/worker/console/chat/session-store.js +93 -63
- package/dist/worker/console/chat/todos.js +115 -0
- package/dist/worker/console/chat/tool-preview.js +42 -0
- package/dist/worker/console/chat/turn-process.js +20 -55
- package/dist/worker/console/chat/user-questions.js +266 -0
- package/dist/worker/console/chat/workspace-landing.js +79 -0
- package/dist/worker/console/console-handoff.js +82 -0
- package/dist/worker/console/console-update-and-init.js +115 -0
- package/dist/worker/console/console-update-runtime.js +84 -0
- package/dist/worker/console/dag-execution-receipt.js +20 -2
- package/dist/worker/console/draft-store.js +49 -0
- package/dist/worker/console/native-directory-picker.js +13 -0
- package/dist/worker/console/operation-store.js +1 -1
- package/dist/worker/console/operator-actions.js +133 -7
- package/dist/worker/console/operator-surface-health.js +1 -0
- package/dist/worker/console/prd-intake-bridge.js +13 -0
- package/dist/worker/console/routes.js +312 -1
- package/dist/worker/console/security.js +4 -4
- package/dist/worker/console/server.js +583 -172
- package/dist/worker/console/static/assets/{abnfDiagram-N423BO3Z-Br92EGb7.js → abnfDiagram-N423BO3Z-Bs-CDAXM.js} +1 -1
- package/dist/worker/console/static/assets/{arc-oulImtQq.js → arc-CAkA3We3.js} +1 -1
- package/dist/worker/console/static/assets/{architectureDiagram-T3A2C74G-tyHc6aqO.js → architectureDiagram-T3A2C74G-DEmI_zqr.js} +1 -1
- package/dist/worker/console/static/assets/{blockDiagram-VBNYF7ZC-CY86BSpT.js → blockDiagram-VBNYF7ZC-uDHANebE.js} +1 -1
- package/dist/worker/console/static/assets/{c4Diagram-5PPSVZJV-BKKsDmNs.js → c4Diagram-5PPSVZJV-Bv97b4_B.js} +1 -1
- package/dist/worker/console/static/assets/channel-amxUpk7o.js +1 -0
- package/dist/worker/console/static/assets/{chunk-2GRJ4B5K-CXZdjl3B.js → chunk-2GRJ4B5K-shmQKsFz.js} +1 -1
- package/dist/worker/console/static/assets/{chunk-2Q5K7J3B-B-aIFDQ5.js → chunk-2Q5K7J3B-BAraNvcN.js} +1 -1
- package/dist/worker/console/static/assets/{chunk-5RXB4S5H-BDgAW_B2.js → chunk-5RXB4S5H-BirhxUop.js} +1 -1
- package/dist/worker/console/static/assets/{chunk-5VM5RSS4-DABa4UPR.js → chunk-5VM5RSS4-C9LgUJpR.js} +1 -1
- package/dist/worker/console/static/assets/{chunk-6Q2QTUOP-aGbysVOx.js → chunk-6Q2QTUOP-DrU-s-t7.js} +1 -1
- package/dist/worker/console/static/assets/{chunk-GF5L2VYU-B8MSZDVs.js → chunk-GF5L2VYU-Tx-H_FA2.js} +1 -1
- package/dist/worker/console/static/assets/{chunk-JWPE2WC7-CpelV73g.js → chunk-JWPE2WC7-BjLtNFrR.js} +1 -1
- package/dist/worker/console/static/assets/{chunk-KBJHAD2P-BE04ty3z.js → chunk-KBJHAD2P-UNLVwSsy.js} +1 -1
- package/dist/worker/console/static/assets/{chunk-RYQCIY6F-BUxTkaaR.js → chunk-RYQCIY6F-CBEUX8XD.js} +1 -1
- package/dist/worker/console/static/assets/{chunk-XXDRQBXY-CYYBVKfX.js → chunk-XXDRQBXY-WTL7IZOq.js} +1 -1
- package/dist/worker/console/static/assets/classDiagram-JCYQIIEL-bejwBVIz.js +1 -0
- package/dist/worker/console/static/assets/classDiagram-v2-OCEON4UE-bejwBVIz.js +1 -0
- package/dist/worker/console/static/assets/{cose-bilkent-JH36ORCC-CEQF_xmQ.js → cose-bilkent-JH36ORCC-CkHG6W3s.js} +1 -1
- package/dist/worker/console/static/assets/{cynefin-VYW2F7L2-CqpxN5IT.js → cynefin-VYW2F7L2-BRzFqTaL.js} +1 -1
- package/dist/worker/console/static/assets/{cynefinDiagram-MW4NZA55-B3PzanVi.js → cynefinDiagram-MW4NZA55-2_CFp_i7.js} +1 -1
- package/dist/worker/console/static/assets/{dagre-VZM6K2ZE-BSUGCNx1.js → dagre-VZM6K2ZE-BJtsmdkE.js} +1 -1
- package/dist/worker/console/static/assets/{diagram-7IWD3JNH-CdLevU5T.js → diagram-7IWD3JNH-DNEFFo6w.js} +1 -1
- package/dist/worker/console/static/assets/{diagram-B4RE2ZJO-BjpF_Kok.js → diagram-B4RE2ZJO-B_IWV7eo.js} +1 -1
- package/dist/worker/console/static/assets/{diagram-LBJQPF4R-C4I6NJny.js → diagram-LBJQPF4R-DvvRx2dz.js} +1 -1
- package/dist/worker/console/static/assets/{diagram-Q27KOJAE-C8hecCr5.js → diagram-Q27KOJAE-CsibsWLg.js} +1 -1
- package/dist/worker/console/static/assets/{diagram-UB23O5K3-Daod6tOS.js → diagram-UB23O5K3-les_djBQ.js} +1 -1
- package/dist/worker/console/static/assets/{ebnfDiagram-BXEA7PRR-BvvmazGv.js → ebnfDiagram-BXEA7PRR-BEm2n7qJ.js} +1 -1
- package/dist/worker/console/static/assets/{erDiagram-JOGREHBK-DeN_vfV4.js → erDiagram-JOGREHBK-BI7vHHVm.js} +1 -1
- package/dist/worker/console/static/assets/{flowDiagram-UKHOOZJN-D6dq1t9z.js → flowDiagram-UKHOOZJN-CUFCERrB.js} +1 -1
- package/dist/worker/console/static/assets/{ganttDiagram-PKOTCBZU-DziIdNY4.js → ganttDiagram-PKOTCBZU-wxyLiGWt.js} +1 -1
- package/dist/worker/console/static/assets/{gitGraphDiagram-DS77QQ5N-Dy4s5CXr.js → gitGraphDiagram-DS77QQ5N-Bt897K8Z.js} +1 -1
- package/dist/worker/console/static/assets/index-BHhUOTri.css +1 -0
- package/dist/worker/console/static/assets/index-DqJbO3-p.js +407 -0
- package/dist/worker/console/static/assets/{infoDiagram-6WML65LV-Czv5eYx2.js → infoDiagram-6WML65LV-DYNx_IPv.js} +1 -1
- package/dist/worker/console/static/assets/{ishikawaDiagram-WSZJBQD7-Bsk3nFRT.js → ishikawaDiagram-WSZJBQD7-CzpLNEu6.js} +1 -1
- package/dist/worker/console/static/assets/{journeyDiagram-NVQOT4AX-DxGmNj5K.js → journeyDiagram-NVQOT4AX-97f9owNU.js} +1 -1
- package/dist/worker/console/static/assets/{kanban-definition-27J2QSJJ-CYCFqkO_.js → kanban-definition-27J2QSJJ-BxM9hyBn.js} +1 -1
- package/dist/worker/console/static/assets/{linear-B0YzRwrd.js → linear-ByuxcHvp.js} +1 -1
- package/dist/worker/console/static/assets/{mermaid.core-t3EZtIGh.js → mermaid.core-DwPGvpCv.js} +5 -5
- package/dist/worker/console/static/assets/{mindmap-definition-FAOFIHXS-BTXpTv0T.js → mindmap-definition-FAOFIHXS-DCoqG9RT.js} +1 -1
- package/dist/worker/console/static/assets/{pegDiagram-VL7TDLO6-DU8UkKqA.js → pegDiagram-VL7TDLO6-BLSBmBMx.js} +1 -1
- package/dist/worker/console/static/assets/{pieDiagram-7S7Q4E2Y-DP4y8ohp.js → pieDiagram-7S7Q4E2Y-B0t_0oJW.js} +1 -1
- package/dist/worker/console/static/assets/{quadrantDiagram-CIZ2JOQS-B07vNaYR.js → quadrantDiagram-CIZ2JOQS-sTzDk7Nt.js} +1 -1
- package/dist/worker/console/static/assets/{railroadDiagram-AXF67PYL-xDWktb2i.js → railroadDiagram-AXF67PYL-B3jRdATC.js} +1 -1
- package/dist/worker/console/static/assets/{requirementDiagram-LRYGKXZP-BLNMKqeS.js → requirementDiagram-LRYGKXZP-D-cTtXEN.js} +1 -1
- package/dist/worker/console/static/assets/{sankeyDiagram-W5VNT64P-n0adalxH.js → sankeyDiagram-W5VNT64P-B25igJRE.js} +1 -1
- package/dist/worker/console/static/assets/{sequenceDiagram-SI44F4Z6-BbnS-2DL.js → sequenceDiagram-SI44F4Z6-jW_lM1_D.js} +1 -1
- package/dist/worker/console/static/assets/{sizeCapture-X5ZJPWSS-B4uPpCLu.js → sizeCapture-X5ZJPWSS-CrzTgsHE.js} +1 -1
- package/dist/worker/console/static/assets/{stateDiagram-OKZ733FA--MMbB0fX.js → stateDiagram-OKZ733FA-B01MvlqE.js} +1 -1
- package/dist/worker/console/static/assets/stateDiagram-v2-UEYNNEHI-BvFKEtm2.js +1 -0
- package/dist/worker/console/static/assets/{swimlanes-SLNWSIFB-BXUgp2QY.js → swimlanes-SLNWSIFB-YcF12FiU.js} +2 -2
- package/dist/worker/console/static/assets/swimlanesDiagram-ULZ7WXOC-DIB2eVg-.js +8 -0
- package/dist/worker/console/static/assets/{timeline-definition-Z64GVDOM-CsaMxki7.js → timeline-definition-Z64GVDOM-ClnRcg2s.js} +1 -1
- package/dist/worker/console/static/assets/{vennDiagram-T6HMQDX7-C2IuG9iH.js → vennDiagram-T6HMQDX7-B6gr_z-q.js} +1 -1
- package/dist/worker/console/static/assets/{wardleyDiagram-T6FBY63Y-CmEWOXCW.js → wardleyDiagram-T6FBY63Y-CvSgguGH.js} +1 -1
- package/dist/worker/console/static/assets/{xychartDiagram-ELKLHX3M-D_9LE0MG.js → xychartDiagram-ELKLHX3M-23OtSZCb.js} +1 -1
- package/dist/worker/console/static/index.html +2 -2
- package/dist/worker/console/static-src/app/console-types.js +68 -4
- package/dist/worker/console/static-src/app/useConsoleShell.js +30 -12
- package/dist/worker/console/static-src/app/useOperatorActions.js +41 -6
- package/dist/worker/console/static-src/app/useRecoveryConsole.js +10 -11
- package/dist/worker/console/static-src/app/useRunProgress.js +2 -1
- package/dist/worker/console/static-src/app/useTaskWizard.js +74 -2
- package/dist/worker/console/static-src/night/useNightBoard.js +8 -5
- package/dist/worker/console/static-src/operator-chat/chat-sse-events.js +141 -8
- package/dist/worker/console/static-src/operator-chat/compaction-message.js +79 -0
- package/dist/worker/console/static-src/operator-chat/details-dag-actions.js +122 -0
- package/dist/worker/console/static-src/operator-chat/refs.js +3 -0
- package/dist/worker/console/static-src/operator-chat/runtime-selection-labels.js +27 -0
- package/dist/worker/console/static-src/operator-chat/spatial-overlay.js +1 -2
- package/dist/worker/console/static-src/operator-chat/turn-stream-controller.js +25 -0
- package/dist/worker/console/static-src/operator-chat/turn-submission.js +3 -2
- package/dist/worker/console/static-src/operator-chat/useChatSessions.js +181 -87
- package/dist/worker/console/static-src/operator-chat/useChatStream.js +159 -44
- package/dist/worker/console/static-src/operator-chat/useChatThread.js +177 -8
- package/dist/worker/console/static-src/operator-chat/useRepoBrowser.js +63 -9
- package/dist/worker/console/static-src/operator-chat/useWorkspaceBrowserGate.js +4 -0
- package/dist/worker/console/static-src/operator-chat/workspace-layout-mode.js +3 -3
- package/dist/worker/console/static-src/shell/useWorkspaces.js +299 -0
- package/dist/worker/console/static-src/shell/workspace-route.js +339 -0
- package/dist/worker/console/workspace-context.js +234 -0
- package/dist/worker/console/workspace-registry.js +214 -0
- package/dist/worker/observability/init-runtime-activity.js +26 -0
- package/dist/worker/observe/node-input.js +88 -2
- package/dist/worker/observe/routes.js +188 -0
- package/dist/worker/observe/server.js +4 -0
- package/dist/worker/observe/static/api.js +29 -9
- package/dist/worker/observe/static/app.js +18 -70
- package/dist/worker/observe/static/dag-node-purpose.d.ts +6 -0
- package/dist/worker/observe/static/dag-node-purpose.js +203 -0
- package/dist/worker/observe/static/format.js +37 -0
- package/dist/worker/observe/static/index.html +6 -1
- package/dist/worker/observe/static/inspect-workspace.js +307 -0
- package/dist/worker/observe/static/operator-chrome.css +145 -20
- package/dist/worker/observe/static/operator-chrome.d.ts +20 -3
- package/dist/worker/observe/static/operator-chrome.js +330 -100
- package/dist/worker/observe/static/prompt-restart-candidates.d.ts +18 -0
- package/dist/worker/observe/static/prompt-restart-candidates.js +36 -0
- package/dist/worker/observe/static/router.d.ts +46 -0
- package/dist/worker/observe/static/router.js +25 -1
- package/dist/worker/observe/static/state.d.ts +50 -0
- package/dist/worker/observe/static/state.js +174 -2
- package/dist/worker/observe/static/styles.css +357 -35
- package/dist/worker/observe/static/views/dag-graph.js +4 -2
- package/dist/worker/observe/static/views/dag-inspector.js +533 -79
- package/dist/worker/observe/static/views/dag.d.ts +13 -0
- package/dist/worker/observe/static/views/dag.js +6 -4
- package/dist/worker/observe/static/views/dashboard.js +6 -4
- package/dist/worker/observe/static/views/night.js +2 -2
- package/dist/worker/observe/static/views/pool.js +1 -0
- package/dist/worker/observe/static/views/run.js +3 -1
- package/dist/worker/observe/static/views/task.js +56 -1
- package/dist/workflows/dag/backend-test-case-coverage-analysis.js +186 -8
- package/dist/workflows/dag/backend-test-markdown-workflow.js +176 -1
- package/dist/workflows/dag/backend-test-pytest-collection.js +168 -16
- package/dist/workflows/dag/backend-test-result-contract.js +4 -0
- package/dist/workflows/dag/backend-test-scenario-param.js +339 -53
- package/dist/workflows/dag/backend-test-writer-completeness.js +28 -17
- package/dist/workflows/dag/dynamic-runtime/map.js +1 -0
- package/dist/workflows/dag/frontend-implementation-contract.js +88 -2
- package/dist/workflows/dag/frontend-plan-render.js +24 -0
- package/dist/workflows/dag/frontend-prewrite-gate.js +197 -0
- package/dist/workflows/dag/frontend-review-context.js +92 -10
- package/dist/workflows/dag/init-hybrid.js +239 -52
- package/dist/workflows/dag/interrupt-request.js +3 -3
- package/dist/workflows/dag/lifecycle.js +3 -3
- package/dist/workflows/dag/node-execution.js +45 -0
- package/dist/workflows/dag/types.js +62 -12
- package/docs/README.md +2 -0
- package/docs/architecture/evolution.md +45 -0
- package/docs/init-surface.manifest.json +1 -0
- package/docs/operations/local-development-environment.md +21 -0
- package/docs/templates/README.md +1 -1
- package/docs/templates/agent-dag.schema.json +18 -0
- package/docs/templates/backend-test-dag.json +267 -238
- package/docs/templates/frontend-implementation-contract.schema.json +681 -24
- package/harness.json +3 -3
- package/package.json +3 -1
- package/skills/loop-agent/references/hybrid-dag.md +7 -0
- package/dist/worker/console/static/assets/channel-TY36zt-i.js +0 -1
- package/dist/worker/console/static/assets/classDiagram-JCYQIIEL-Dk7QCChM.js +0 -1
- package/dist/worker/console/static/assets/classDiagram-v2-OCEON4UE-Dk7QCChM.js +0 -1
- package/dist/worker/console/static/assets/index-C3GgHg-g.css +0 -1
- package/dist/worker/console/static/assets/index-Ci8ksvBm.js +0 -406
- package/dist/worker/console/static/assets/stateDiagram-v2-UEYNNEHI-BqOigMQ4.js +0 -1
- package/dist/worker/console/static/assets/swimlanesDiagram-ULZ7WXOC-Caxz9UA2.js +0 -8
- package/dist/worker/console/static-src/operator-chat/activity-rail-presentation.js +0 -73
- package/dist/worker/console/static-src/operator-chat/useActivityRailTransition.js +0 -59
|
@@ -3,6 +3,7 @@ import { existsSync } from "node:fs";
|
|
|
3
3
|
import { readFile } from "node:fs/promises";
|
|
4
4
|
import path from "node:path";
|
|
5
5
|
import { pathMatchesPattern } from "../../shared/git-progress.js";
|
|
6
|
+
import { redactSecrets, truncateUtf8Preview } from "../../shared/preview.js";
|
|
6
7
|
import { recordDecisionEnvelopeForNode, shouldPauseOnHumanEscalation, writeHumanEscalationArtifacts, } from "./decision-envelope.js";
|
|
7
8
|
import { FRONTEND_PREWRITE_RESULT_SOURCE_ARTIFACT, FRONTEND_WRITER_NODE_IDS, isFrontendWriterAuthorized, readFrontendPrewriteResult, } from "./scheduler.js";
|
|
8
9
|
import { writeNodeRecord, writeNodeSkillArtifacts } from "./run-store.js";
|
|
@@ -306,6 +307,35 @@ function buildAttemptPrompt(task, basePrompt, attemptNumber, previousFailureCate
|
|
|
306
307
|
"</retry_instruction>",
|
|
307
308
|
].join("\n");
|
|
308
309
|
}
|
|
310
|
+
const PROMPT_RESTART_CANDIDATE_MAX_BYTES = 64 * 1024;
|
|
311
|
+
function promptRestartCandidateForAttempt(input) {
|
|
312
|
+
if (input.attemptPrompt === input.baseRuntimePrompt) {
|
|
313
|
+
return input.taskPrompt;
|
|
314
|
+
}
|
|
315
|
+
const appendedPrefix = `${input.baseRuntimePrompt}\n\n`;
|
|
316
|
+
if (input.attemptPrompt.startsWith(appendedPrefix)) {
|
|
317
|
+
return [
|
|
318
|
+
input.taskPrompt,
|
|
319
|
+
input.attemptPrompt.slice(appendedPrefix.length),
|
|
320
|
+
]
|
|
321
|
+
.filter(Boolean)
|
|
322
|
+
.join("\n\n");
|
|
323
|
+
}
|
|
324
|
+
return input.attemptPrompt;
|
|
325
|
+
}
|
|
326
|
+
async function persistFailedPromptRestartCandidate(input) {
|
|
327
|
+
const redacted = redactSecrets(input.prompt);
|
|
328
|
+
const preview = truncateUtf8Preview(redacted, PROMPT_RESTART_CANDIDATE_MAX_BYTES);
|
|
329
|
+
await writeDagNodeJsonArtifact(input.runDir, input.nodeId, `prompt-candidate-attempt-${input.attempt}.json`, {
|
|
330
|
+
schemaVersion: 1,
|
|
331
|
+
attempt: input.attempt,
|
|
332
|
+
failureCategory: input.failureCategory ?? "unknown",
|
|
333
|
+
prompt: preview,
|
|
334
|
+
truncated: preview !== redacted,
|
|
335
|
+
maxBytes: PROMPT_RESTART_CANDIDATE_MAX_BYTES,
|
|
336
|
+
sha256: createHash("sha256").update(redacted).digest("hex"),
|
|
337
|
+
});
|
|
338
|
+
}
|
|
309
339
|
export async function buildNodePromptWithResolvedSkillInstructions(spec, task, upstream, cwd, options) {
|
|
310
340
|
const policy = resolveContextPolicy(spec);
|
|
311
341
|
const skillNames = policy.resolveSkills(spec, task);
|
|
@@ -770,6 +800,7 @@ export async function executeDagNode(input) {
|
|
|
770
800
|
// exactly this attempt's segment (B1: earlier attempts legitimately use
|
|
771
801
|
// ls/find and must not be attributed to the repair attempt).
|
|
772
802
|
const attemptSessionEventsOffset = await sessionEventsByteLength(runDir, nodeId);
|
|
803
|
+
let promptRestartCandidate = task.subtask_prompt;
|
|
773
804
|
let result;
|
|
774
805
|
try {
|
|
775
806
|
validateRepairArtifactGateBeforeShell({
|
|
@@ -833,6 +864,11 @@ export async function executeDagNode(input) {
|
|
|
833
864
|
previousReason: previousProtocolReason,
|
|
834
865
|
});
|
|
835
866
|
}
|
|
867
|
+
promptRestartCandidate = promptRestartCandidateForAttempt({
|
|
868
|
+
taskPrompt: task.subtask_prompt,
|
|
869
|
+
baseRuntimePrompt: prompt,
|
|
870
|
+
attemptPrompt,
|
|
871
|
+
});
|
|
836
872
|
result = await executeNode({
|
|
837
873
|
task,
|
|
838
874
|
cwd,
|
|
@@ -960,6 +996,15 @@ export async function executeDagNode(input) {
|
|
|
960
996
|
const attemptWallDurationMs = durationBetween(attemptStartedAt, attemptFinishedAt);
|
|
961
997
|
totalAttemptWallDurationMs += attemptWallDurationMs;
|
|
962
998
|
const rawFailureCategory = result.rawFailureCategory ?? result.failureCategory;
|
|
999
|
+
if (task.executor === "pi" && !result.ok) {
|
|
1000
|
+
await persistFailedPromptRestartCandidate({
|
|
1001
|
+
runDir,
|
|
1002
|
+
nodeId,
|
|
1003
|
+
attempt: attemptNumber,
|
|
1004
|
+
failureCategory: result.failureCategory,
|
|
1005
|
+
prompt: promptRestartCandidate,
|
|
1006
|
+
});
|
|
1007
|
+
}
|
|
963
1008
|
const attemptRecord = {
|
|
964
1009
|
attempt: attemptNumber,
|
|
965
1010
|
startedAt: attemptStartedAt,
|
|
@@ -382,7 +382,7 @@ export const dagWritePolicySchema = z.enum([
|
|
|
382
382
|
"none",
|
|
383
383
|
]);
|
|
384
384
|
/** Git/post-diff write guard intensity for exclusive Pi writers. */
|
|
385
|
-
export const dagWriteGuardPolicySchema = z.enum(["full", "tools-only"]);
|
|
385
|
+
export const dagWriteGuardPolicySchema = z.enum(["full", "tools-only", "filesystem-only"]);
|
|
386
386
|
/**
|
|
387
387
|
* Fail-closed outcome/diff consistency contract for bounded Pi writers.
|
|
388
388
|
* The writer must begin with IMPLEMENTATION_OUTCOME: changed,
|
|
@@ -589,6 +589,8 @@ export const dagDynamicExpansionChildTaskSchema = z.object({
|
|
|
589
589
|
allowedPaths: z.array(z.string()).optional().default([]),
|
|
590
590
|
forbiddenPaths: z.array(z.string()).optional().default([]),
|
|
591
591
|
writeSet: z.array(z.string()).optional(),
|
|
592
|
+
/** Template-rendered strict repository-relative read allowlist. */
|
|
593
|
+
readSet: z.array(z.string()).optional(),
|
|
592
594
|
/**
|
|
593
595
|
* Materialized-child pass-through fields for bounded Pi writer children
|
|
594
596
|
* (backend-test md/pytest case sharding). All optional so legacy
|
|
@@ -776,6 +778,21 @@ export const dagTaskSchema = z.object({ id: z.string().regex(/^[a-z][a-z0-9-]*$/
|
|
|
776
778
|
commandPolicy: dagCommandPolicySchema.optional(),
|
|
777
779
|
writePolicy: dagWritePolicySchema.optional(),
|
|
778
780
|
writeSet: z.array(z.string()).optional(),
|
|
781
|
+
/** Strict repository-relative read allowlist for bounded Pi nodes. */
|
|
782
|
+
readSet: z.array(z.string()).optional(),
|
|
783
|
+
/**
|
|
784
|
+
* Online per-attempt Pi context guard. Unlike run/map cost budgets, this
|
|
785
|
+
* aborts the active SDK session before an oversized conversation reaches
|
|
786
|
+
* the provider's context rejection boundary.
|
|
787
|
+
*/
|
|
788
|
+
contextBudget: z
|
|
789
|
+
.object({
|
|
790
|
+
maxTurns: z.number().int().positive().optional(),
|
|
791
|
+
maxTokens: z.number().int().positive().optional(),
|
|
792
|
+
})
|
|
793
|
+
.strict()
|
|
794
|
+
.refine((value) => value.maxTurns !== undefined || value.maxTokens !== undefined, "contextBudget requires maxTurns or maxTokens")
|
|
795
|
+
.optional(),
|
|
779
796
|
piStep: z.string().optional(),
|
|
780
797
|
shell: dagShellConfigSchema.optional(),
|
|
781
798
|
static: dagStaticConfigSchema.optional(),
|
|
@@ -890,20 +907,51 @@ export const dagEvaluationBindingSchema = z
|
|
|
890
907
|
.strict();
|
|
891
908
|
/** Eval Lab Campaign Budget (W3.4); enforced by runner ledger when mode=hard. */
|
|
892
909
|
export const dagBudgetSchema = campaignBudgetSchema;
|
|
893
|
-
export const
|
|
910
|
+
export const dagSourceBindingSourceSchema = z.object({
|
|
911
|
+
kind: z.enum(["requirement", "constraint", "reference"]),
|
|
912
|
+
path: z.string().min(1),
|
|
913
|
+
sha256: z
|
|
914
|
+
.string()
|
|
915
|
+
.regex(/^[a-f0-9]{64}$/, "sha256 must be lowercase hex"),
|
|
916
|
+
});
|
|
917
|
+
/**
|
|
918
|
+
* DagSourceBinding v1:无 ledger 字段(schemaVersion=1,.strict() 拒绝 ledger
|
|
919
|
+
* 字段混入,不得以 v1+optional 冒充 v2)。非 frontend task / 无可解析引用时使用。
|
|
920
|
+
*/
|
|
921
|
+
export const dagSourceBindingV1Schema = z
|
|
922
|
+
.object({
|
|
894
923
|
schemaVersion: z.literal(1),
|
|
895
924
|
taskId: z.string().min(1),
|
|
896
|
-
sources: z
|
|
897
|
-
.array(z.object({
|
|
898
|
-
kind: z.enum(["requirement", "constraint", "reference"]),
|
|
899
|
-
path: z.string().min(1),
|
|
900
|
-
sha256: z
|
|
901
|
-
.string()
|
|
902
|
-
.regex(/^[a-f0-9]{64}$/, "sha256 must be lowercase hex"),
|
|
903
|
-
}))
|
|
904
|
-
.min(1),
|
|
925
|
+
sources: z.array(dagSourceBindingSourceSchema).min(1),
|
|
905
926
|
requirementIds: z.array(z.string().regex(/^(?:REQ|BR|AC)-[A-Z0-9]+(?:-[A-Z0-9]+)*$/)),
|
|
906
|
-
})
|
|
927
|
+
})
|
|
928
|
+
.strict();
|
|
929
|
+
/**
|
|
930
|
+
* DagSourceBinding v2(20260824-frontend-source-fidelity-ledger-v1):仅
|
|
931
|
+
* frontend-implementation 且存在可解析 requirement/acceptance 引用时产出;
|
|
932
|
+
* ledgerPath/ledgerSha256/inputDigest/requirementToFragments 全部必填且完整,
|
|
933
|
+
* 伪造或缺失任一字段被 schema/prewrite 拒绝(AC-002 / AC-FIDELITY-REPAIR-002)。
|
|
934
|
+
*/
|
|
935
|
+
export const dagSourceBindingV2Schema = z
|
|
936
|
+
.object({
|
|
937
|
+
schemaVersion: z.literal(2),
|
|
938
|
+
taskId: z.string().min(1),
|
|
939
|
+
sources: z.array(dagSourceBindingSourceSchema).min(1),
|
|
940
|
+
requirementIds: z.array(z.string().regex(/^(?:REQ|BR|AC)-[A-Z0-9]+(?:-[A-Z0-9]+)*$/)),
|
|
941
|
+
/** 受管 requirement-ledger.json 的 DAG 可解析路径(.harness/tasks/…/source/…)。 */
|
|
942
|
+
ledgerPath: z.string().min(1),
|
|
943
|
+
ledgerSha256: z.string().regex(/^[a-f0-9]{64}$/),
|
|
944
|
+
inputDigest: z.string().regex(/^[a-f0-9]{64}$/),
|
|
945
|
+
requirementToFragments: z.record(z.string(), z.array(z.string())),
|
|
946
|
+
})
|
|
947
|
+
.strict();
|
|
948
|
+
export const dagSourceBindingSchema = z.discriminatedUnion("schemaVersion", [
|
|
949
|
+
dagSourceBindingV1Schema,
|
|
950
|
+
dagSourceBindingV2Schema,
|
|
951
|
+
]);
|
|
952
|
+
export function isDagSourceBindingV2(binding) {
|
|
953
|
+
return binding.schemaVersion === 2;
|
|
954
|
+
}
|
|
907
955
|
const dagRerunFeedbackEvidencePathSchema = z
|
|
908
956
|
.string()
|
|
909
957
|
.min(1)
|
|
@@ -966,6 +1014,8 @@ export const dagSpecSchema = z
|
|
|
966
1014
|
taskContractBinding: dagTaskContractBindingSchema.optional(),
|
|
967
1015
|
/** Optional unresolved parent-run feedback for a full task rerun. */
|
|
968
1016
|
rerunFeedback: dagRerunFeedbackSchema.optional(),
|
|
1017
|
+
/** Backend-test-only workspace mutation control; absent means Git. */
|
|
1018
|
+
backendTestWorkspaceControl: z.enum(["git", "filesystem-only"]).optional(),
|
|
969
1019
|
/** Frozen backend-test artifact layout (plan A); absent = historical default testcase/ layout. */
|
|
970
1020
|
backendTestLayout: z
|
|
971
1021
|
.object({
|
package/docs/README.md
CHANGED
|
@@ -27,6 +27,7 @@
|
|
|
27
27
|
| 选择快速、标准或完整验证命令 | `governance/verification-matrix.md` |
|
|
28
28
|
| 理解 CLI、runtime 和初始化能力边界 | `runtime/loop-agent-harness.md` |
|
|
29
29
|
| 运行 DAG、查看报告或处理失败 | `runtime/agent-dag-runner.md`、`runtime/agent-dag-recovery-playbook.md`;Operator Chat P0 closeout 见 `reports/feature/2026-08-14-operator-chat-dag-recovery-p0.md` |
|
|
30
|
+
| 理解前端实现 DAG 与需求保真账本 | `runtime/frontend-implementation-workflow.md`(含 source fidelity ledger v2 绑定、顺序 reconciliation、独立 reviewer、human resolution 与 prewrite fail-closed);init-evolution 审查见 `reports/init-evolution/2026-08-24-frontend-source-fidelity-ledger-init-evolution-review.md` |
|
|
30
31
|
| 按 TDD、验证和调试纪律推进修复 | `governance/harness-methodology-tdd.md`、`governance/harness-methodology-verification.md`、`governance/harness-methodology-debugging.md` |
|
|
31
32
|
| 执行真实 backend-test provider 验证 | `runtime/backend-test-live-campaign.md` |
|
|
32
33
|
| 判断单任务 loop-agent Production Readiness | `operations/production-readiness.md` |
|
|
@@ -72,6 +73,7 @@
|
|
|
72
73
|
| `design/active/` | 仍会影响后续决策的设计输入、路线与契约 |
|
|
73
74
|
| `design/visual-references/` | 长期视觉参考,不表达实现状态 |
|
|
74
75
|
| `design/archive/` | 历史设计和已被实现/替代的阶段性设计 |
|
|
76
|
+
| `superpowers/specs/` | Superpowers 工作流产出的阶段性实现设计输入 |
|
|
75
77
|
| `exec-plans/active/` | 仍需推进或明确保持 open 的任务合同 |
|
|
76
78
|
| `exec-plans/completed/` | 已完成任务合同归档 |
|
|
77
79
|
| `progress/` | 仍需下一次会话接手的当前 handoff 入口 |
|
|
@@ -33,6 +33,7 @@ loop-agent CLI
|
|
|
33
33
|
| Worker readiness baseline | Attempt identity、immutable owner、lineage/revision、task-scoped lease、controller protocol、acceptance、reconcile | Agent Worker PR v1 Phase 1–7 / `0.32.0` |
|
|
34
34
|
| Operator Surface | 裸 `agent-worker console`;Operate、`/inspect/`、Operator Chat、recovery CTA、intake bridge | ADR 0005、0011–0013 |
|
|
35
35
|
| 自举与验证 | controller identity、skill snapshot、deterministic/live canary、verified tarball、`verify:tree` receipt | `runtime-boundaries.md`、verification matrix |
|
|
36
|
+
| Source fidelity ledger | 原始 requirement/acceptance 文档保持语义权威,派生 `source/需求.md` 仅作导航视图;确定性 fragment inventory、受管 `requirement-ledger.json`(进入 Task Contract transaction 与 canonical hash)、source binding v2(仅 frontend taskKind,schemaVersion=2 必填字段)、prewrite fail-closed 门禁(`SOURCE_FIDELITY_*`/`source-*` 稳定错误码)、顺序 reconciliation 与独立 reviewer、human resolution 生效、有界提示词与最终 reviewer 核对清单 | `20260824-frontend-source-fidelity-ledger-v1` + `2026-08-24-frontend-source-fidelity-repair-v2`(本页面下方 init-evolution 审查)、`CHANGELOG.md [Unreleased]` |
|
|
36
37
|
|
|
37
38
|
### 当前不变量
|
|
38
39
|
|
|
@@ -106,3 +107,47 @@ Evidence & Trust Plane
|
|
|
106
107
|
2. 证明成立后更新 current capability summary 和本页“当前架构”。
|
|
107
108
|
3. 未证明部分只保留在 active design/exec-plan,不能通过修改措辞升级状态。
|
|
108
109
|
4. 使用者短索引同步到 `website/docs/overview/roadmap.md`,避免复制长版本流水账。
|
|
110
|
+
|
|
111
|
+
## Init Evolution Review — 2026-08-24 frontend source fidelity ledger
|
|
112
|
+
|
|
113
|
+
Base/Head:见 `docs/reports/init-evolution/` 中对应 `*-init-evolution-review.md`(若已提交则含 Base/Head 字段;未提交工作区由 CI 非严格模式放行)。
|
|
114
|
+
|
|
115
|
+
### Changed Surface
|
|
116
|
+
|
|
117
|
+
- `src/task/source-prepare/**`:新增 `fragment-inventory.ts`、`ledger.ts`;扩展 `types.ts`、`prepare.ts`、`completeness.ts`、`parse-intent.ts`(无外部 API 变化)。
|
|
118
|
+
- `src/task/contract/**`:`requirement-ledger.json` 进入受管 transaction 与 canonical hash;`TaskContractSourceHashesV1` 新增可选 `requirementLedgerSha256`(legacy ref 向后兼容)。
|
|
119
|
+
- `src/workflows/dag/**`:`dagSourceBindingSchema` 拆为 v1/v2 discriminated union(v2 schemaVersion=2,四个 ledger 字段全部必填;v1 strict 拒绝 ledger 字段);`init-hybrid` 改读已持久化 ledger(缺失/漂移 fail closed);prewrite 门禁新增 ledger 检查与失败码。
|
|
120
|
+
- `src/task/source-prepare/**`:新增 `ledger-reconciliation.ts`(顺序 reconciliation)、`ledger-review.ts`(独立 reviewer);fragment inventory 表格行切分、跨文档稳定 REQ-SRC ID、V4 显式 AC 标题;human resolution 生效。
|
|
121
|
+
- `src/worker/observe/**`:新增只读 `GET /api/tasks/:id/ledger` 与展示(安全摘要,不泄漏原文)。
|
|
122
|
+
- `src/worker/console/**`:Draft/ContractPanel/InspectSplitPanel 安全摘要展示。
|
|
123
|
+
- `docs/templates/frontend-implementation-contract.schema.json`:requirements 增加可选 `sourceFragmentIds`/`sourceRefs`,sourceBinding 增加可选 ledger 字段(all-or-none)。
|
|
124
|
+
|
|
125
|
+
### Decision
|
|
126
|
+
|
|
127
|
+
**No init impact / Surface check only**。
|
|
128
|
+
|
|
129
|
+
Rationale:
|
|
130
|
+
|
|
131
|
+
- 新增均为模块内部实现;不新增 CLI 命令、不改 init 入口、不改变 target-project 初始化行为。
|
|
132
|
+
- `docs/templates/frontend-implementation-contract.schema.json` 已随 `docs/templates/` 目录 glob 打包(`package.json files`),无需新增 manifest 条目。
|
|
133
|
+
- 运行时加载 schema 的 `loadFrontendImplementationContractJsonSchema` 仅做结构性校验($id/required/properties/const),新增可选字段不破坏既有契约。
|
|
134
|
+
- 不新增任何运行时或开发依赖(node:crypto、既有 zod/Vitest/Vite/React 19)。
|
|
135
|
+
|
|
136
|
+
### Updates Made
|
|
137
|
+
|
|
138
|
+
- `docs/architecture/evolution.md`:本条目。
|
|
139
|
+
- `CHANGELOG.md [Unreleased]`、`CONTEXT.md`:glossary 术语。
|
|
140
|
+
- `docs/templates/frontend-implementation-contract.schema.json`:可选字段同步。
|
|
141
|
+
|
|
142
|
+
### Verification
|
|
143
|
+
|
|
144
|
+
```bash
|
|
145
|
+
npm run typecheck && npm run console:typecheck
|
|
146
|
+
npx vitest run test/task-source-prepare.test.ts test/task-contract-canonicalize.test.ts test/task-contract-observe.test.ts test/dag-init-hybrid.test.ts test/frontend-implementation-contract.test.ts test/frontend-prewrite-gate.test.ts test/frontend-writer-admission.test.ts test/worker/observe/dag-inspector-node-input.test.ts test/worker/console/inspect-split-panel.test.ts
|
|
147
|
+
```
|
|
148
|
+
|
|
149
|
+
### Residual Risk
|
|
150
|
+
|
|
151
|
+
- 长尾 24K 截断遗漏回归:以确定性分片 inventory + ledger 覆盖统计断言固定(AC-FIDELITY-001/007)。
|
|
152
|
+
- 账本漂移/篡改:inputDigest 复用失效 + prewrite fail closed(AC-FIDELITY-003/006)。
|
|
153
|
+
- 既有带引用 frontend task 重建路径变化:ledger 纳入 canonical hash 改变 `observeTaskContractState` 判定,legacy ref 向后兼容覆盖(AC-FIDELITY-004)。
|
|
@@ -30,6 +30,7 @@
|
|
|
30
30
|
"docs/templates/frontend-task-requirement.md",
|
|
31
31
|
"docs/templates/frontend-task-constraints.md",
|
|
32
32
|
"docs/templates/frontend-design-contract.md",
|
|
33
|
+
"docs/templates/frontend-implementation-contract.schema.json",
|
|
33
34
|
"docs/templates/worker-dogfood-setup.md",
|
|
34
35
|
"docs/templates/worker-dogfood-evidence.md",
|
|
35
36
|
"docs/templates/harness.schema.json",
|
|
@@ -2,6 +2,27 @@
|
|
|
2
2
|
|
|
3
3
|
本文记录仅与特定开发环境有关、但可能反复影响验证结果的问题。它不是通用工程规则;标准验证命令仍以 [`verification-matrix.md`](../governance/verification-matrix.md) 为准。
|
|
4
4
|
|
|
5
|
+
## Operator Console 前端快速迭代
|
|
6
|
+
|
|
7
|
+
对 `src/worker/console/static-src/` 内的对话样式和前端交互做高频调整时,使用固定 8790 的开发入口:
|
|
8
|
+
|
|
9
|
+
```bash
|
|
10
|
+
npm run console:dev
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
它从当前源码启动真实 Console 后端,并在内部 `8791` 常驻 Vite dev server。浏览器始终访问 `http://127.0.0.1:8790/`:API、HttpOnly Cookie、确认令牌和 Origin 校验仍由真实 Console 处理,前端 HTML/模块请求才由 8790 转发给 Vite。CSS 保存后原地热替换,TSX 保存后自动整页刷新;不生成 `static-dev` bundle,也不重复运行生产 build。
|
|
14
|
+
|
|
15
|
+
常用参数:
|
|
16
|
+
|
|
17
|
+
```bash
|
|
18
|
+
npm run console:dev -- --no-open
|
|
19
|
+
npm run console:dev -- --port 8792 --reload-port 8793 --no-open
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
默认端口是 Console `8790`、内部 Vite/HMR `8791`;两者都只允许 loopback。端口已占用时命令会失败并报告端口,不会停止或接管已有进程。前端类型检查在后台持续输出诊断,但不阻塞 HMR;后端源码变化时只重启 Console 子进程,Vite 保持常驻。
|
|
23
|
+
|
|
24
|
+
该命令只优化编辑反馈,不构成验收。独立交互修复完成后仍需运行定向 Vitest;交付前按验证矩阵运行 typecheck、正式 `npm run console:build` / `npm run build`。正式构建继续写入 `dist/worker/console/static/`,不会包含 `/@vite/client`、8791 或开发代理代码。
|
|
25
|
+
|
|
5
26
|
## Git hooks(本仓库)
|
|
6
27
|
|
|
7
28
|
每个 clone 安装一次:
|
package/docs/templates/README.md
CHANGED
|
@@ -37,7 +37,7 @@
|
|
|
37
37
|
## Frontend
|
|
38
38
|
|
|
39
39
|
- `frontend-task-requirement.md`、`frontend-task-constraints.md`、`frontend-design-contract.md` — 前端任务输入与设计合同。
|
|
40
|
-
- `frontend-implementation-contract.schema.json` — 前端实现合同 schema
|
|
40
|
+
- `frontend-implementation-contract.schema.json` — 前端实现合同 schema(sourceBinding v2 ledger 字段 all-or-none:任一出现则四项齐全,禁止 v1+optional 冒充 v2)。`requirements[].sourceRefs[].items` 使用合法 `$ref: #/$defs/path`(相对路径、无 `..` 逃逸、无反斜杠),模板 JSON 无非法键,运行时加载器可直接编译(AC-003)。
|
|
41
41
|
- `frontend-test-dag.json` — frontend-test DAG 模板;其 deterministic checklist 会拒绝 alternative executable instructions,仅允许 allowlisted `playwright-cli` command。Pi generator/reviser 的 runtime writeSet 仅授权下列目标项目生成路径(不是本仓库文档索引目标):
|
|
42
42
|
|
|
43
43
|
~~~text
|
|
@@ -538,6 +538,24 @@
|
|
|
538
538
|
"type": "array",
|
|
539
539
|
"items": { "type": "string", "minLength": 1 }
|
|
540
540
|
},
|
|
541
|
+
"readSet": {
|
|
542
|
+
"type": "array",
|
|
543
|
+
"items": { "type": "string", "minLength": 1 },
|
|
544
|
+
"description": "Strict repository-relative read allowlist for bounded Pi nodes."
|
|
545
|
+
},
|
|
546
|
+
"contextBudget": {
|
|
547
|
+
"type": "object",
|
|
548
|
+
"additionalProperties": false,
|
|
549
|
+
"description": "Online per-attempt Pi SDK conversation guard. At least one threshold is required; exhaustion aborts the active session with context-budget-exhausted partial evidence.",
|
|
550
|
+
"properties": {
|
|
551
|
+
"maxTurns": { "type": "integer", "minimum": 1 },
|
|
552
|
+
"maxTokens": { "type": "integer", "minimum": 1 }
|
|
553
|
+
},
|
|
554
|
+
"anyOf": [
|
|
555
|
+
{ "required": ["maxTurns"] },
|
|
556
|
+
{ "required": ["maxTokens"] }
|
|
557
|
+
]
|
|
558
|
+
},
|
|
541
559
|
"piStep": {
|
|
542
560
|
"type": "string",
|
|
543
561
|
"minLength": 1
|