@tea-agent/loop-agent 0.43.0-next.4 → 0.43.0-next.6

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.
Files changed (96) hide show
  1. package/CHANGELOG.md +82 -9
  2. package/dist/application/task-lifecycle/advance.js +17 -4
  3. package/dist/application/task-lifecycle/observe.js +43 -29
  4. package/dist/application/task-lifecycle/plan-transitions.js +5 -4
  5. package/dist/build-stamp.json +3 -3
  6. package/dist/executors/dag-pi-executor.js +233 -202
  7. package/dist/executors/pi-executor.js +2 -0
  8. package/dist/executors/pi-sdk-executor.js +77 -39
  9. package/dist/task/source-prepare/source-fidelity-pi.js +2 -2
  10. package/dist/task/source-references.js +48 -23
  11. package/dist/worker/console/chat/pi-runtime.js +113 -95
  12. package/dist/worker/console/chat/routes.js +164 -54
  13. package/dist/worker/console/chat/scm-routes.js +193 -0
  14. package/dist/worker/console/chat/scm-service.js +253 -0
  15. package/dist/worker/console/chat/scm-tools.js +111 -0
  16. package/dist/worker/console/chat/session-catalog.js +1 -0
  17. package/dist/worker/console/chat/session-mode-view.js +48 -0
  18. package/dist/worker/console/chat/session-mode.js +218 -0
  19. package/dist/worker/console/chat/session-store.js +22 -6
  20. package/dist/worker/console/chat/shortcuts.js +6 -0
  21. package/dist/worker/console/chat/tools.js +1 -0
  22. package/dist/worker/console/static/assets/{abnfDiagram-N423BO3Z-CCj36aaC.js → abnfDiagram-N423BO3Z-BuyrlONK.js} +1 -1
  23. package/dist/worker/console/static/assets/{arc-Cl3MIVFh.js → arc-BvCl_wpi.js} +1 -1
  24. package/dist/worker/console/static/assets/{architectureDiagram-T3A2C74G-C_n4kMJS.js → architectureDiagram-T3A2C74G-BkBpBaRq.js} +1 -1
  25. package/dist/worker/console/static/assets/{blockDiagram-VBNYF7ZC-DlWYJ7cK.js → blockDiagram-VBNYF7ZC-yve4Mcb_.js} +1 -1
  26. package/dist/worker/console/static/assets/{c4Diagram-5PPSVZJV-Ud5pS7vS.js → c4Diagram-5PPSVZJV-9yLGboBx.js} +1 -1
  27. package/dist/worker/console/static/assets/channel-BRahIhjw.js +1 -0
  28. package/dist/worker/console/static/assets/{chunk-2GRJ4B5K-CQPwOv_j.js → chunk-2GRJ4B5K-BKP69b8r.js} +1 -1
  29. package/dist/worker/console/static/assets/{chunk-2Q5K7J3B-CMzjxrWI.js → chunk-2Q5K7J3B-NWFRnXju.js} +1 -1
  30. package/dist/worker/console/static/assets/{chunk-5RXB4S5H-pcnXnD6t.js → chunk-5RXB4S5H-BiweqLEc.js} +1 -1
  31. package/dist/worker/console/static/assets/{chunk-5VM5RSS4-CEB3AvU2.js → chunk-5VM5RSS4-CP9GHmRY.js} +1 -1
  32. package/dist/worker/console/static/assets/{chunk-6Q2QTUOP-DSKnbXbp.js → chunk-6Q2QTUOP-BiGDkBtj.js} +1 -1
  33. package/dist/worker/console/static/assets/{chunk-GF5L2VYU-CS6-PjCZ.js → chunk-GF5L2VYU-DkJ4ZjQS.js} +1 -1
  34. package/dist/worker/console/static/assets/{chunk-JWPE2WC7-f6q8Tnzz.js → chunk-JWPE2WC7-B5jjn7zq.js} +1 -1
  35. package/dist/worker/console/static/assets/{chunk-KBJHAD2P-DkB0QX3q.js → chunk-KBJHAD2P-C6KoK9O0.js} +1 -1
  36. package/dist/worker/console/static/assets/{chunk-RYQCIY6F-BdB4jAv6.js → chunk-RYQCIY6F-BvNIfyn-.js} +1 -1
  37. package/dist/worker/console/static/assets/{chunk-XXDRQBXY-BVm1bnX6.js → chunk-XXDRQBXY-BZ33iX4W.js} +1 -1
  38. package/dist/worker/console/static/assets/classDiagram-JCYQIIEL-GOC80mhq.js +1 -0
  39. package/dist/worker/console/static/assets/classDiagram-v2-OCEON4UE-GOC80mhq.js +1 -0
  40. package/dist/worker/console/static/assets/{cose-bilkent-JH36ORCC-FV_P-IEp.js → cose-bilkent-JH36ORCC-CP8eIuZd.js} +1 -1
  41. package/dist/worker/console/static/assets/{cynefin-VYW2F7L2-BM7RtkA2.js → cynefin-VYW2F7L2-DZECjpOe.js} +1 -1
  42. package/dist/worker/console/static/assets/{cynefinDiagram-MW4NZA55-C1BZwTG5.js → cynefinDiagram-MW4NZA55-CvVJoFqf.js} +1 -1
  43. package/dist/worker/console/static/assets/{dagre-VZM6K2ZE-C6McNKmY.js → dagre-VZM6K2ZE-D_JTqdAn.js} +1 -1
  44. package/dist/worker/console/static/assets/{diagram-7IWD3JNH-C0aWRUaE.js → diagram-7IWD3JNH-Db7AQ0z0.js} +1 -1
  45. package/dist/worker/console/static/assets/{diagram-B4RE2ZJO-Bfk_SKE8.js → diagram-B4RE2ZJO-AZPVo5CZ.js} +1 -1
  46. package/dist/worker/console/static/assets/{diagram-LBJQPF4R-prx1T4qf.js → diagram-LBJQPF4R-BgXqI3E6.js} +1 -1
  47. package/dist/worker/console/static/assets/{diagram-Q27KOJAE-DBvty0eU.js → diagram-Q27KOJAE-BYjFn3Ba.js} +1 -1
  48. package/dist/worker/console/static/assets/{diagram-UB23O5K3-CF0em8e9.js → diagram-UB23O5K3-B4rJgGGO.js} +1 -1
  49. package/dist/worker/console/static/assets/{ebnfDiagram-BXEA7PRR-CF90b4Ws.js → ebnfDiagram-BXEA7PRR-C6XWZhpw.js} +1 -1
  50. package/dist/worker/console/static/assets/{erDiagram-JOGREHBK-hfunxzof.js → erDiagram-JOGREHBK-1YdQRIQW.js} +1 -1
  51. package/dist/worker/console/static/assets/{flowDiagram-UKHOOZJN-D-QSy4Nl.js → flowDiagram-UKHOOZJN-l3a0AwN0.js} +1 -1
  52. package/dist/worker/console/static/assets/{ganttDiagram-PKOTCBZU-DaBGNcvT.js → ganttDiagram-PKOTCBZU-CQL96F2Z.js} +1 -1
  53. package/dist/worker/console/static/assets/{gitGraphDiagram-DS77QQ5N-BChcubGL.js → gitGraphDiagram-DS77QQ5N-BxCvafRb.js} +1 -1
  54. package/dist/worker/console/static/assets/index-4wCGsXuU.js +465 -0
  55. package/dist/worker/console/static/assets/index-CiF9WBoR.css +1 -0
  56. package/dist/worker/console/static/assets/{infoDiagram-6WML65LV-BkC67fIa.js → infoDiagram-6WML65LV-BUipIeDO.js} +1 -1
  57. package/dist/worker/console/static/assets/{ishikawaDiagram-WSZJBQD7-ibhLczCD.js → ishikawaDiagram-WSZJBQD7-CRfomVMX.js} +1 -1
  58. package/dist/worker/console/static/assets/{journeyDiagram-NVQOT4AX-DCRMitay.js → journeyDiagram-NVQOT4AX-_UFvyviX.js} +1 -1
  59. package/dist/worker/console/static/assets/{kanban-definition-27J2QSJJ-DJ_hKaYI.js → kanban-definition-27J2QSJJ-CKIRoqKv.js} +1 -1
  60. package/dist/worker/console/static/assets/{linear-CIlLsYsA.js → linear-CjttJDCM.js} +1 -1
  61. package/dist/worker/console/static/assets/{mermaid.core-C-5IQMP_.js → mermaid.core-DPvHX155.js} +5 -5
  62. package/dist/worker/console/static/assets/{mindmap-definition-FAOFIHXS-TCzV5TQT.js → mindmap-definition-FAOFIHXS-Qmj-qwBe.js} +1 -1
  63. package/dist/worker/console/static/assets/{pegDiagram-VL7TDLO6-bfhd2BQH.js → pegDiagram-VL7TDLO6-Auw6DRgq.js} +1 -1
  64. package/dist/worker/console/static/assets/{pieDiagram-7S7Q4E2Y-BxFRAm5N.js → pieDiagram-7S7Q4E2Y-CqMrfD4c.js} +1 -1
  65. package/dist/worker/console/static/assets/{quadrantDiagram-CIZ2JOQS-C-m12lxv.js → quadrantDiagram-CIZ2JOQS-BAddeggH.js} +1 -1
  66. package/dist/worker/console/static/assets/{railroadDiagram-AXF67PYL-CwmLiGgx.js → railroadDiagram-AXF67PYL-DG1JuOu2.js} +1 -1
  67. package/dist/worker/console/static/assets/{requirementDiagram-LRYGKXZP-oc0Q1jiD.js → requirementDiagram-LRYGKXZP-DLYGMKlC.js} +1 -1
  68. package/dist/worker/console/static/assets/{sankeyDiagram-W5VNT64P-9Ght6Yur.js → sankeyDiagram-W5VNT64P-g68SbLM9.js} +1 -1
  69. package/dist/worker/console/static/assets/{sequenceDiagram-SI44F4Z6-ndm3lyz9.js → sequenceDiagram-SI44F4Z6-CmszLKv8.js} +1 -1
  70. package/dist/worker/console/static/assets/{sizeCapture-X5ZJPWSS-7sPlKVcw.js → sizeCapture-X5ZJPWSS-D2tEKUCj.js} +1 -1
  71. package/dist/worker/console/static/assets/{stateDiagram-OKZ733FA-Izl21-oS.js → stateDiagram-OKZ733FA-Syc5E_Jf.js} +1 -1
  72. package/dist/worker/console/static/assets/stateDiagram-v2-UEYNNEHI-CwWwuPI-.js +1 -0
  73. package/dist/worker/console/static/assets/{swimlanes-SLNWSIFB-CtO3D65o.js → swimlanes-SLNWSIFB-Ibn0IRCa.js} +2 -2
  74. package/dist/worker/console/static/assets/swimlanesDiagram-ULZ7WXOC-A7fqemr6.js +8 -0
  75. package/dist/worker/console/static/assets/{timeline-definition-Z64GVDOM-Cyg5cY7z.js → timeline-definition-Z64GVDOM-2ZW9W3iS.js} +1 -1
  76. package/dist/worker/console/static/assets/{vennDiagram-T6HMQDX7-CwtE_TFK.js → vennDiagram-T6HMQDX7-v50HsKUh.js} +1 -1
  77. package/dist/worker/console/static/assets/{wardleyDiagram-T6FBY63Y-Dtt9v8OO.js → wardleyDiagram-T6FBY63Y-DqCXEoDH.js} +1 -1
  78. package/dist/worker/console/static/assets/{xychartDiagram-ELKLHX3M-B2Y3ryb6.js → xychartDiagram-ELKLHX3M-vIP8Vo9d.js} +1 -1
  79. package/dist/worker/console/static/index.html +2 -2
  80. package/dist/worker/console/static-src/operator-chat/useChatSessions.js +20 -4
  81. package/dist/worker/console/static-src/operator-chat/useComposer.js +13 -7
  82. package/dist/worker/console/workspace-context.js +6 -0
  83. package/dist/workflows/dag/frontend-capacity.js +9 -0
  84. package/dist/workflows/dag/frontend-design-policy.js +2 -1
  85. package/dist/workflows/dag/frontend-plan-completeness.js +186 -0
  86. package/dist/workflows/dag/frontend-plan-recovery-policy.js +18 -0
  87. package/dist/workflows/dag/frontend-shape-facts.js +12 -2
  88. package/package.json +1 -1
  89. package/skills/frontend-plan/SKILL.md +7 -0
  90. package/dist/worker/console/static/assets/channel-CEMRpNm-.js +0 -1
  91. package/dist/worker/console/static/assets/classDiagram-JCYQIIEL-C9lhaZkR.js +0 -1
  92. package/dist/worker/console/static/assets/classDiagram-v2-OCEON4UE-C9lhaZkR.js +0 -1
  93. package/dist/worker/console/static/assets/index-CJkCY1XR.js +0 -464
  94. package/dist/worker/console/static/assets/index-DUBCbiqv.css +0 -1
  95. package/dist/worker/console/static/assets/stateDiagram-v2-UEYNNEHI-CmElLFpP.js +0 -1
  96. package/dist/worker/console/static/assets/swimlanesDiagram-ULZ7WXOC-DKRbGG8V.js +0 -8
@@ -0,0 +1,186 @@
1
+ import { collectCanonicalStateFlowNames } from "./frontend-contract-facts.js";
2
+ export function committedFactFromPlanRecord(value) {
3
+ if (!value || typeof value !== "object" || Array.isArray(value))
4
+ return undefined;
5
+ const record = value;
6
+ if (record.phase !== undefined && record.phase !== "committed")
7
+ return undefined;
8
+ const fact = record.fact;
9
+ return fact && typeof fact === "object" && !Array.isArray(fact)
10
+ ? fact
11
+ : typeof record.kind === "string"
12
+ ? record
13
+ : undefined;
14
+ }
15
+ export function planFactStringList(value) {
16
+ if (!Array.isArray(value))
17
+ return [];
18
+ return value.filter((item) => typeof item === "string" && item.trim().length > 0);
19
+ }
20
+ export function planFactScopeIntersects(fact, requirementIds) {
21
+ return planFactStringList(fact.scopeRequirementIds).some((id) => requirementIds.has(id));
22
+ }
23
+ /** Compute the authoritative coverage queue from the committed plan ledger. */
24
+ export function collectFrontendPlanMissingFacts(input) {
25
+ const requirements = new Map();
26
+ const standaloneEvidenceGaps = new Set();
27
+ const verificationTargetIds = new Set();
28
+ const verificationTargetRequirements = new Map();
29
+ for (const value of input.committedFacts) {
30
+ const fact = committedFactFromPlanRecord(value);
31
+ if (!fact || fact.origin !== "plan")
32
+ continue;
33
+ if (fact.kind === "plan-requirement" && fact.entry && typeof fact.entry === "object") {
34
+ const entry = fact.entry;
35
+ if (typeof entry.id === "string" && entry.id.trim())
36
+ requirements.set(entry.id, entry);
37
+ }
38
+ if (fact.kind === "plan-verification-target" && fact.entry && typeof fact.entry === "object") {
39
+ const entry = fact.entry;
40
+ const id = entry.id;
41
+ if (typeof id === "string" && id.trim()) {
42
+ verificationTargetIds.add(id);
43
+ verificationTargetRequirements.set(id, new Set(Array.isArray(entry.requirementIds)
44
+ ? entry.requirementIds.filter((value) => typeof value === "string")
45
+ : []));
46
+ }
47
+ }
48
+ if (fact.kind === "plan-evidence-gap" && fact.entry && typeof fact.entry === "object") {
49
+ const entry = fact.entry;
50
+ const requirementId = entry.requirementId;
51
+ const description = entry.description;
52
+ if (typeof requirementId === "string" && requirementId.trim() && typeof description === "string" && description.trim()) {
53
+ standaloneEvidenceGaps.add(requirementId);
54
+ }
55
+ }
56
+ }
57
+ const missing = [];
58
+ for (const id of input.requirementIds) {
59
+ const entry = requirements.get(id);
60
+ if (!entry) {
61
+ missing.push({
62
+ kind: "plan-requirement",
63
+ id,
64
+ requirementIds: [id],
65
+ reason: `requirement ${id} has no committed plan-requirement fact`,
66
+ });
67
+ continue;
68
+ }
69
+ const targetIds = Array.isArray(entry.verificationTargetIds)
70
+ ? entry.verificationTargetIds.filter((value) => typeof value === "string" && value.trim().length > 0)
71
+ : [];
72
+ const gap = entry.evidenceGap && typeof entry.evidenceGap === "object"
73
+ ? entry.evidenceGap
74
+ : undefined;
75
+ const hasEvidenceGap = (typeof gap?.description === "string" && gap.description.trim().length > 0) ||
76
+ standaloneEvidenceGaps.has(id);
77
+ if (targetIds.length === 0 && !hasEvidenceGap) {
78
+ missing.push({
79
+ kind: "plan-verification-target",
80
+ requirementIds: [id],
81
+ reason: `requirement ${id} declares neither a verification target nor a non-empty evidenceGap`,
82
+ });
83
+ continue;
84
+ }
85
+ for (const targetId of targetIds) {
86
+ if (!verificationTargetIds.has(targetId) ||
87
+ !verificationTargetRequirements.get(targetId)?.has(id)) {
88
+ missing.push({
89
+ kind: "plan-verification-target",
90
+ id: targetId,
91
+ requirementIds: [id],
92
+ reason: `requirement ${id} references verification target ${targetId}, but that target is not committed`,
93
+ });
94
+ }
95
+ }
96
+ }
97
+ return missing;
98
+ }
99
+ /** Completeness checks for phases whose facts are committed incrementally. */
100
+ export function collectFrontendPlanPhaseMissingFacts(input) {
101
+ const facts = input.committedFacts
102
+ .map(committedFactFromPlanRecord)
103
+ .filter((fact) => Boolean(fact && fact.origin === "plan"));
104
+ if (input.phase === "ux-registry") {
105
+ return facts.some((fact) => fact.kind === "state-registry")
106
+ ? []
107
+ : [
108
+ {
109
+ kind: "state-registry",
110
+ requirementIds: [...input.requirementIds],
111
+ reason: "global UX vocabulary phase has no committed state-registry fact",
112
+ },
113
+ ];
114
+ }
115
+ if (input.phase === "ux-local") {
116
+ // One snapshot per check: no cross-revision cache to invalidate.
117
+ const required = new Set(input.behaviorRequiredRequirementIds ?? []);
118
+ const requested = new Set(input.requirementIds.filter(id => required.has(id)));
119
+ if (!requested.size)
120
+ return [];
121
+ const byRequirement = new Map();
122
+ for (const fact of facts) {
123
+ for (const id of new Set(planFactStringList(fact.scopeRequirementIds))) {
124
+ if (!requested.has(id))
125
+ continue;
126
+ const entries = byRequirement.get(id) ?? [];
127
+ entries.push(fact);
128
+ byRequirement.set(id, entries);
129
+ }
130
+ }
131
+ const liveStateFlow = collectCanonicalStateFlowNames(facts);
132
+ const missing = [];
133
+ for (const id of input.requirementIds) {
134
+ if (!required.has(id))
135
+ continue;
136
+ const scopedFacts = byRequirement.get(id) ?? [];
137
+ const hasChoice = scopedFacts.some((fact) => fact.kind === "component-choice" &&
138
+ Array.isArray(fact.uiComponentChoices) &&
139
+ fact.uiComponentChoices.length > 0);
140
+ const canonicalStateFlow = collectCanonicalStateFlowNames(scopedFacts);
141
+ const hasStateFlow = [...canonicalStateFlow.uiStateNames].some(name => liveStateFlow.uiStateNames.has(name)) ||
142
+ [...canonicalStateFlow.interactionNames].some(name => liveStateFlow.interactionNames.has(name));
143
+ if (!hasChoice) {
144
+ missing.push({
145
+ kind: "component-choice",
146
+ requirementIds: [id],
147
+ reason: "behaviour-required UX slice has no committed component-choice fact",
148
+ });
149
+ }
150
+ if (!hasStateFlow) {
151
+ missing.push({
152
+ kind: "state-flow",
153
+ requirementIds: [id],
154
+ reason: "behaviour-required UX slice has no committed state-flow fact",
155
+ });
156
+ }
157
+ }
158
+ return missing;
159
+ }
160
+ const hasMockApi = facts.some((fact) => fact.kind === "mock-api");
161
+ const allInteractions = collectCanonicalStateFlowNames(facts).interactionNames;
162
+ const requested = new Set(input.requirementIds);
163
+ const liveInteractions = new Set([...collectCanonicalStateFlowNames(facts.filter(f => !planFactStringList(f.scopeRequirementIds).length || planFactScopeIntersects(f, requested))).interactionNames].filter(name => allInteractions.has(name)));
164
+ const coveredInteractions = new Set(facts
165
+ .filter((fact) => fact.kind === "data-flow")
166
+ .flatMap((fact) => planFactStringList(fact.interactions)));
167
+ const missing = [];
168
+ if (!hasMockApi) {
169
+ missing.push({
170
+ kind: "mock-api",
171
+ requirementIds: [...input.requirementIds],
172
+ reason: "global Mock/data phase has no committed mock-api fact",
173
+ });
174
+ }
175
+ for (const interaction of liveInteractions) {
176
+ if (coveredInteractions.has(interaction))
177
+ continue;
178
+ missing.push({
179
+ kind: "data-flow",
180
+ id: interaction,
181
+ requirementIds: [...input.requirementIds],
182
+ reason: `interaction ${interaction} has no committed data-flow fact`,
183
+ });
184
+ }
185
+ return missing;
186
+ }
@@ -0,0 +1,18 @@
1
+ /** Precise failures own their recovery. A stale transport length marker must
2
+ * never turn cancellation, provider rejection or policy failure into progress. */
3
+ export function classifyFrontendPlanRecovery(result) {
4
+ const category = result.failureCategory ?? "";
5
+ if (result.timedOut || result.stopReason === "aborted" ||
6
+ /interrupt|termination-unconfirmed|budget_breach/.test(category) ||
7
+ ["cancelled", "auth", "missing-api-key", "rate-limit", "quota", "timeout", "tool-policy", "write-guard", "path-violation", "governance-blocked", "human-rejected"].includes(category))
8
+ return "stop";
9
+ if (result.ok)
10
+ return "none";
11
+ if (category === "output-limit")
12
+ return "output";
13
+ if (["context-overflow", "context-budget-exhausted"].includes(category))
14
+ return "context";
15
+ if (result.stopReason === "length" && ["", "empty-output", "network", "nonzero-exit", "unknown"].includes(category))
16
+ return "output";
17
+ return "none";
18
+ }
@@ -1,4 +1,5 @@
1
1
  import { sha256OfCanonicalJson } from "../../task/contract/hash.js";
2
+ import { FRONTEND_MAX_IMPLEMENTATION_FILES, frontendConcreteDeliveryFiles } from "./frontend-capacity.js";
2
3
  import { buildFrontendShapeTransitionCapsule, deriveFrontendRuntimeShapeFacts, evaluateFrontendShapeEscalation, parseFrontendShapeTransitionCapsule, } from "./frontend-shape.js";
3
4
  import { createTypedEventStore, readCommittedEvents, } from "./frontend-typed-event-store.js";
4
5
  import { adoptTypedEventFact, stageTypedEventFact, } from "./frontend-typed-event-transaction.js";
@@ -222,7 +223,13 @@ function extractRuntimeShapeEvidence(input) {
222
223
  !sourceText.includes(path) &&
223
224
  /(?:\.[A-Za-z0-9]+|\*\*)$/.test(path));
224
225
  const routes = canonicalStrings(text.match(/\/(?:[A-Za-z0-9_:[\]-]+\/?)+/g) ?? []);
225
- const splitRequired = /["']splitRequired["']\s*:\s*true|\bsplit-required\s+shape\b/i.test(text);
226
+ // The frozen delivery inventory is available before Plan. Do not spend
227
+ // coverage/UX sessions building a contract the same capacity gate will reject.
228
+ // allowedPaths and text mentions are permissions/evidence, never this count.
229
+ const skeleton = input.tasksById.get("frontend-plan-pi")?.structuredContractOutput?.skeleton;
230
+ const deliveryFiles = frontendConcreteDeliveryFiles(skeleton?.targets?.files);
231
+ const capacitySplit = deliveryFiles.length > FRONTEND_MAX_IMPLEMENTATION_FILES;
232
+ const splitRequired = capacitySplit || /["']splitRequired["']\s*:\s*true|\bsplit-required\s+shape\b/i.test(text);
226
233
  return {
227
234
  sourceNodeId: input.sourceNodeId,
228
235
  sourceNodeDigest: computeFrontendShapeNodeDigest(node),
@@ -232,7 +239,10 @@ function extractRuntimeShapeEvidence(input) {
232
239
  targetPaths,
233
240
  routes,
234
241
  splitRequired,
235
- evidenceRefs: [`node:${input.sourceNodeId}:stdout`],
242
+ evidenceRefs: [
243
+ ...(capacitySplit ? ["dag:frontend-plan-pi:structuredContractOutput.skeleton.targets.files"] : []),
244
+ `node:${input.sourceNodeId}:stdout`,
245
+ ],
236
246
  };
237
247
  }
238
248
  /** Commit a typed, structured runtime fact immediately after a canonical source
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@tea-agent/loop-agent",
3
- "version": "0.43.0-next.4",
3
+ "version": "0.43.0-next.6",
4
4
  "type": "module",
5
5
  "bin": {
6
6
  "loop-agent": "bin/loop-agent.js",
@@ -29,6 +29,13 @@ cite `evidencePath` of an existing file; greenfield is `decision=new`.
29
29
  Bind every file in the Contract-owned `requiredDeliverables` inventory. It records
30
30
  explicit source obligations, not every path mentioned by a requirement.
31
31
 
32
+ Large UX work runs in bounded scopes against that shared registry. Complete every
33
+ assigned requirement; preserve earlier scopes' shared bindings when correcting an
34
+ entry. Ledger previews are incomplete. Use `read_plan_facts` to retrieve full
35
+ fields, following `nextOffset` with `expectedRevision` pinned. For oversized
36
+ strings use `stringOffset` and follow `nextStringOffset`; restart pagination when
37
+ the revision changes. Never submit a truncated preview as a replacement payload.
38
+
32
39
  Cross-slice citations must close in the same session: when a requirement cites a
33
40
  verification target committed in another slice's session, re-commit that target
34
41
  here with the same id and `replace=true` (union backfill) before finalize. A
@@ -1 +0,0 @@
1
- import{ag as o,ah as n}from"./mermaid.core-C-5IQMP_.js";const t=(a,r)=>o.lang.round(n.parse(a)[r]);export{t as c};
@@ -1 +0,0 @@
1
- import{s as a,c as s,a as e,C as t}from"./chunk-GF5L2VYU-CS6-PjCZ.js";import{_ as i}from"./mermaid.core-C-5IQMP_.js";import"./chunk-5VM5RSS4-CEB3AvU2.js";import"./chunk-XXDRQBXY-BVm1bnX6.js";import"./chunk-KBJHAD2P-DkB0QX3q.js";import"./chunk-2GRJ4B5K-CQPwOv_j.js";import"./index-CJkCY1XR.js";var n={parser:e,get db(){return new t},renderer:s,styles:a,init:i(r=>{r.class||(r.class={}),r.class.arrowMarkerAbsolute=r.arrowMarkerAbsolute},"init")};export{n as diagram};
@@ -1 +0,0 @@
1
- import{s as a,c as s,a as e,C as t}from"./chunk-GF5L2VYU-CS6-PjCZ.js";import{_ as i}from"./mermaid.core-C-5IQMP_.js";import"./chunk-5VM5RSS4-CEB3AvU2.js";import"./chunk-XXDRQBXY-BVm1bnX6.js";import"./chunk-KBJHAD2P-DkB0QX3q.js";import"./chunk-2GRJ4B5K-CQPwOv_j.js";import"./index-CJkCY1XR.js";var n={parser:e,get db(){return new t},renderer:s,styles:a,init:i(r=>{r.class||(r.class={}),r.class.arrowMarkerAbsolute=r.arrowMarkerAbsolute},"init")};export{n as diagram};