@tea-agent/loop-agent 0.44.0-next.3 → 0.44.0-next.4

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 (92) hide show
  1. package/CHANGELOG.md +4 -3
  2. package/dist/build-stamp.json +3 -3
  3. package/dist/executors/dag-pi-executor.js +2 -2
  4. package/dist/task/config-types.js +2 -1
  5. package/dist/task/contract/schema.js +1 -0
  6. package/dist/worker/console/chat/chat-event-store.js +32 -0
  7. package/dist/worker/console/chat/conversation-nodes.js +383 -0
  8. package/dist/worker/console/chat/pi-runtime.js +128 -12
  9. package/dist/worker/console/chat/provider-error.js +0 -12
  10. package/dist/worker/console/chat/routes.js +136 -3
  11. package/dist/worker/console/chat/turn-process.js +128 -7
  12. package/dist/worker/console/prd-intake-bridge.js +3 -0
  13. package/dist/worker/console/static/assets/{abnfDiagram-N423BO3Z-COQlLTI7.js → abnfDiagram-N423BO3Z-B_lmJjOm.js} +1 -1
  14. package/dist/worker/console/static/assets/{arc-zN3QkNaV.js → arc-pymM4Qeh.js} +1 -1
  15. package/dist/worker/console/static/assets/{architectureDiagram-T3A2C74G-Pyoyj5f2.js → architectureDiagram-T3A2C74G-Bw9EPAhi.js} +1 -1
  16. package/dist/worker/console/static/assets/{blockDiagram-VBNYF7ZC-BNppA5WW.js → blockDiagram-VBNYF7ZC-C7_oXJp2.js} +1 -1
  17. package/dist/worker/console/static/assets/{c4Diagram-5PPSVZJV-lyxL8nTx.js → c4Diagram-5PPSVZJV-LnLWDbh8.js} +1 -1
  18. package/dist/worker/console/static/assets/channel-Ym13M3Lb.js +1 -0
  19. package/dist/worker/console/static/assets/{chunk-2GRJ4B5K-0hgjcdK4.js → chunk-2GRJ4B5K-BBiu3sCW.js} +1 -1
  20. package/dist/worker/console/static/assets/{chunk-2Q5K7J3B-D63N9d4i.js → chunk-2Q5K7J3B-DiXqDQml.js} +1 -1
  21. package/dist/worker/console/static/assets/{chunk-5RXB4S5H-CUw2AyB5.js → chunk-5RXB4S5H-lmNq9nYk.js} +1 -1
  22. package/dist/worker/console/static/assets/{chunk-5VM5RSS4-Q_kwZT30.js → chunk-5VM5RSS4-boBu74dU.js} +1 -1
  23. package/dist/worker/console/static/assets/{chunk-6Q2QTUOP-C7vMiKcw.js → chunk-6Q2QTUOP-CjxqoJLQ.js} +1 -1
  24. package/dist/worker/console/static/assets/{chunk-GF5L2VYU-T9GbV5Hz.js → chunk-GF5L2VYU-DL0vQ9MG.js} +1 -1
  25. package/dist/worker/console/static/assets/{chunk-JWPE2WC7-D8nUSUJI.js → chunk-JWPE2WC7-DGPqE-O0.js} +1 -1
  26. package/dist/worker/console/static/assets/{chunk-KBJHAD2P-BCH2ewdp.js → chunk-KBJHAD2P-v4BbT_r2.js} +1 -1
  27. package/dist/worker/console/static/assets/{chunk-RYQCIY6F-BTdDuDBN.js → chunk-RYQCIY6F-Ci0ynvyL.js} +1 -1
  28. package/dist/worker/console/static/assets/{chunk-XXDRQBXY-Cqm2RcKF.js → chunk-XXDRQBXY-CGsbJoTV.js} +1 -1
  29. package/dist/worker/console/static/assets/classDiagram-JCYQIIEL-BeFR1wGo.js +1 -0
  30. package/dist/worker/console/static/assets/classDiagram-v2-OCEON4UE-BeFR1wGo.js +1 -0
  31. package/dist/worker/console/static/assets/{cose-bilkent-JH36ORCC-pjwfpVu4.js → cose-bilkent-JH36ORCC-CzoRDEI7.js} +1 -1
  32. package/dist/worker/console/static/assets/{cynefin-VYW2F7L2-BvalptKA.js → cynefin-VYW2F7L2-BOwFwbX4.js} +1 -1
  33. package/dist/worker/console/static/assets/{cynefinDiagram-MW4NZA55-BU4qJ6d7.js → cynefinDiagram-MW4NZA55-2Cfg451l.js} +1 -1
  34. package/dist/worker/console/static/assets/{dagre-VZM6K2ZE-DVTpq8J9.js → dagre-VZM6K2ZE-DbT0D6Y5.js} +1 -1
  35. package/dist/worker/console/static/assets/{diagram-7IWD3JNH-B8s1W6Fc.js → diagram-7IWD3JNH-Dfd_JoMs.js} +1 -1
  36. package/dist/worker/console/static/assets/{diagram-B4RE2ZJO-DPrFk9yH.js → diagram-B4RE2ZJO-DaGm82kh.js} +1 -1
  37. package/dist/worker/console/static/assets/{diagram-LBJQPF4R-CnQIQsHC.js → diagram-LBJQPF4R-DMoI8Ibc.js} +1 -1
  38. package/dist/worker/console/static/assets/{diagram-Q27KOJAE-op0DEpCv.js → diagram-Q27KOJAE-BtIFA3aY.js} +1 -1
  39. package/dist/worker/console/static/assets/{diagram-UB23O5K3-DXQamm4T.js → diagram-UB23O5K3-D_2X1DTZ.js} +1 -1
  40. package/dist/worker/console/static/assets/{ebnfDiagram-BXEA7PRR-b1ad2C0r.js → ebnfDiagram-BXEA7PRR-yFW5ZYlZ.js} +1 -1
  41. package/dist/worker/console/static/assets/{erDiagram-JOGREHBK-B4cD-ZFJ.js → erDiagram-JOGREHBK-DBXh5Svj.js} +1 -1
  42. package/dist/worker/console/static/assets/{flowDiagram-UKHOOZJN-CrgGjlQ1.js → flowDiagram-UKHOOZJN-C4ycm8KM.js} +1 -1
  43. package/dist/worker/console/static/assets/{ganttDiagram-PKOTCBZU-DovmXQNV.js → ganttDiagram-PKOTCBZU-qr-_Pekr.js} +1 -1
  44. package/dist/worker/console/static/assets/{gitGraphDiagram-DS77QQ5N-DpFyu2Jn.js → gitGraphDiagram-DS77QQ5N-DzOSLv_A.js} +1 -1
  45. package/dist/worker/console/static/assets/index-PFjB6g6l.js +482 -0
  46. package/dist/worker/console/static/assets/index-ZtyB6Ol-.css +1 -0
  47. package/dist/worker/console/static/assets/{infoDiagram-6WML65LV-D3MoQZIl.js → infoDiagram-6WML65LV-C7Hl8D7l.js} +1 -1
  48. package/dist/worker/console/static/assets/{ishikawaDiagram-WSZJBQD7-Ci6C1yjS.js → ishikawaDiagram-WSZJBQD7-fBxVlr6t.js} +1 -1
  49. package/dist/worker/console/static/assets/{journeyDiagram-NVQOT4AX-BWMo2lIP.js → journeyDiagram-NVQOT4AX-CoiJEVCl.js} +1 -1
  50. package/dist/worker/console/static/assets/{kanban-definition-27J2QSJJ-BdthIAg3.js → kanban-definition-27J2QSJJ-TJXpxNuV.js} +1 -1
  51. package/dist/worker/console/static/assets/{linear-DuFAlSOj.js → linear-CjQWz1pG.js} +1 -1
  52. package/dist/worker/console/static/assets/{mermaid.core-Dqz3Slj9.js → mermaid.core-DY9_apIE.js} +5 -5
  53. package/dist/worker/console/static/assets/{mindmap-definition-FAOFIHXS-DNVTrD09.js → mindmap-definition-FAOFIHXS-HB0Id8gM.js} +1 -1
  54. package/dist/worker/console/static/assets/{pegDiagram-VL7TDLO6-CgfZPfBh.js → pegDiagram-VL7TDLO6-0OSWgr6v.js} +1 -1
  55. package/dist/worker/console/static/assets/{pieDiagram-7S7Q4E2Y-ClM9P7yo.js → pieDiagram-7S7Q4E2Y-Cei1GGC2.js} +1 -1
  56. package/dist/worker/console/static/assets/{quadrantDiagram-CIZ2JOQS-DwnEak2J.js → quadrantDiagram-CIZ2JOQS-CDy0Adfu.js} +1 -1
  57. package/dist/worker/console/static/assets/{railroadDiagram-AXF67PYL-rK4hxt9P.js → railroadDiagram-AXF67PYL-BwqzUWwN.js} +1 -1
  58. package/dist/worker/console/static/assets/{requirementDiagram-LRYGKXZP-Cjqa6vo3.js → requirementDiagram-LRYGKXZP-Bif2IBRL.js} +1 -1
  59. package/dist/worker/console/static/assets/{sankeyDiagram-W5VNT64P-D3Fa250Z.js → sankeyDiagram-W5VNT64P-CYIoNMLg.js} +1 -1
  60. package/dist/worker/console/static/assets/{sequenceDiagram-SI44F4Z6-2PdrNajj.js → sequenceDiagram-SI44F4Z6-BDS7Y0aQ.js} +1 -1
  61. package/dist/worker/console/static/assets/{sizeCapture-X5ZJPWSS-BBcuGeZn.js → sizeCapture-X5ZJPWSS-lZic-_Bp.js} +1 -1
  62. package/dist/worker/console/static/assets/{stateDiagram-OKZ733FA-CSJX9X6s.js → stateDiagram-OKZ733FA-WCVlCqSd.js} +1 -1
  63. package/dist/worker/console/static/assets/stateDiagram-v2-UEYNNEHI-cj5UUB6m.js +1 -0
  64. package/dist/worker/console/static/assets/{swimlanes-SLNWSIFB-pOUU1bic.js → swimlanes-SLNWSIFB-pGccxTw_.js} +2 -2
  65. package/dist/worker/console/static/assets/swimlanesDiagram-ULZ7WXOC-C_Qp6bnh.js +8 -0
  66. package/dist/worker/console/static/assets/{timeline-definition-Z64GVDOM-CAeqfQn0.js → timeline-definition-Z64GVDOM-D29RlrQA.js} +1 -1
  67. package/dist/worker/console/static/assets/{vennDiagram-T6HMQDX7-DYPLOMVO.js → vennDiagram-T6HMQDX7-01fEM1NU.js} +1 -1
  68. package/dist/worker/console/static/assets/{wardleyDiagram-T6FBY63Y-Dy2V0Cha.js → wardleyDiagram-T6FBY63Y-C4GeB6dq.js} +1 -1
  69. package/dist/worker/console/static/assets/{xychartDiagram-ELKLHX3M-Dj9o7jrn.js → xychartDiagram-ELKLHX3M-BXHrXHps.js} +1 -1
  70. package/dist/worker/console/static/index.html +2 -2
  71. package/dist/worker/console/static-src/operator-chat/animation-frame-batcher.js +38 -0
  72. package/dist/worker/console/static-src/operator-chat/chat-sse-events.js +97 -3
  73. package/dist/worker/console/static-src/operator-chat/process-label.js +11 -2
  74. package/dist/worker/console/static-src/operator-chat/turn-group-equality.js +2 -1
  75. package/dist/worker/console/static-src/operator-chat/useChatSessions.js +2 -0
  76. package/dist/worker/console/static-src/operator-chat/useChatThread.js +9 -0
  77. package/dist/workflows/dag/frontend-implementation-contract.js +3 -1
  78. package/dist/workflows/dag/frontend-plan-completeness.js +13 -3
  79. package/dist/workflows/dag/frontend-recovery-plan.js +10 -6
  80. package/dist/workflows/dag/frontend-typed-event-store.js +5 -0
  81. package/dist/workflows/dag/frontend-writer-admission.js +1 -0
  82. package/dist/workflows/dag/output-protocol.js +1 -0
  83. package/dist/workflows/dag/rerun-task.js +1 -0
  84. package/docs/governance/harness-methodology-verification.md +11 -0
  85. package/package.json +1 -1
  86. package/dist/worker/console/static/assets/channel-CgLPkTw2.js +0 -1
  87. package/dist/worker/console/static/assets/classDiagram-JCYQIIEL-CuSD1Mhb.js +0 -1
  88. package/dist/worker/console/static/assets/classDiagram-v2-OCEON4UE-CuSD1Mhb.js +0 -1
  89. package/dist/worker/console/static/assets/index-DHBWEwz_.css +0 -1
  90. package/dist/worker/console/static/assets/index-JRfTUgP7.js +0 -478
  91. package/dist/worker/console/static/assets/stateDiagram-v2-UEYNNEHI-Cqskj0zt.js +0 -1
  92. package/dist/worker/console/static/assets/swimlanesDiagram-ULZ7WXOC-CM0ZIhNP.js +0 -8
@@ -8,6 +8,7 @@ import { mergePendingSubmissionOnHydration } from "./pending-user-message.js";
8
8
  import { taskContextUnchanged } from "./format.js";
9
9
  import { upsertCompactionMessage } from "./compaction-message.js";
10
10
  import { sameTurnGroupInputs } from "./turn-group-equality.js";
11
+ import { conversationNodesFromEvents, } from "../../chat/conversation-nodes.js";
11
12
  const EMPTY_USAGE = {
12
13
  inputTokens: 0,
13
14
  outputTokens: 0,
@@ -141,6 +142,7 @@ export function useChatThread(params) {
141
142
  const [sessionStats, setSessionStats] = useState(EMPTY_SESSION_STATS);
142
143
  const [turnTelemetry, setTurnTelemetry] = useState([]);
143
144
  const [operatorActions, setOperatorActions] = useState([]);
145
+ const [conversationNodes, setConversationNodes] = useState([]);
144
146
  const [sddSessionIdentity, setSddSessionIdentity] = useState(null);
145
147
  const [streaming, setStreaming] = useState(false);
146
148
  const [turnPhase, setTurnPhase] = useState("idle");
@@ -192,6 +194,7 @@ export function useChatThread(params) {
192
194
  setTodos,
193
195
  setGoal,
194
196
  setOperatorActions,
197
+ setConversationNodes,
195
198
  setSddSessionIdentity,
196
199
  setStreamingAssistantId,
197
200
  setUnread,
@@ -330,6 +333,7 @@ export function useChatThread(params) {
330
333
  toolCalls,
331
334
  streaming,
332
335
  activeAssistantId: streamingAssistantId,
336
+ conversationNodes,
333
337
  });
334
338
  // Preserve completed group objects across streaming tokens. Stable
335
339
  // historical groups keep their references so
@@ -348,6 +352,7 @@ export function useChatThread(params) {
348
352
  toolCalls,
349
353
  streaming,
350
354
  streamingAssistantId,
355
+ conversationNodes,
351
356
  historyLimit,
352
357
  ]);
353
358
  const loadEarlierMessages = useCallback(async (beforePrepend) => {
@@ -427,6 +432,7 @@ export function useChatThread(params) {
427
432
  setSessionStats(EMPTY_SESSION_STATS);
428
433
  setTurnTelemetry([]);
429
434
  setOperatorActions([]);
435
+ setConversationNodes([]);
430
436
  setSddSessionIdentity(null);
431
437
  setStreaming(false);
432
438
  setTurnPhase("idle");
@@ -476,6 +482,7 @@ export function useChatThread(params) {
476
482
  }
477
483
  : undefined));
478
484
  setToolCalls(next.toolCalls);
485
+ setConversationNodes(conversationNodesFromEvents(next.conversationEvents ?? []));
479
486
  setOperationCards([]);
480
487
  setHumanGateCards([]);
481
488
  setArtifactCards([]);
@@ -546,6 +553,7 @@ export function useChatThread(params) {
546
553
  refs.turnAssistantIdsRef.current = new Map();
547
554
  refs.sealedAssistantIdsRef.current = new Set();
548
555
  const hydrated = hydrateSessionThread(body.session.messages ?? []);
556
+ setConversationNodes(conversationNodesFromEvents(body.conversationEvents ?? []));
549
557
  // Recovery is addressed to targetSessionId, so an optimistic
550
558
  // submission from another session must never be projected into
551
559
  // this snapshot (the activation path enforces the same owner gate).
@@ -618,6 +626,7 @@ export function useChatThread(params) {
618
626
  sessionStats,
619
627
  turnTelemetry,
620
628
  operatorActions,
629
+ conversationNodes,
621
630
  sddSessionIdentity,
622
631
  setSddSessionIdentity,
623
632
  streaming,
@@ -619,13 +619,15 @@ export function composeDependencyPolicyWithBoundary(policy, boundary) {
619
619
  return policy;
620
620
  const allowed = (boundary.allowed ?? []).filter((item) => item.trim());
621
621
  const forbidden = (boundary.forbidden ?? []).filter((item) => item.trim());
622
- if (allowed.length === 0 && forbidden.length === 0)
622
+ const requiredClauses = (boundary.requiredClauses ?? []).filter((item) => item.trim());
623
+ if (allowed.length === 0 && forbidden.length === 0 && requiredClauses.length === 0)
623
624
  return policy;
624
625
  if (policy?.includes(CAPABILITY_BOUNDARY_MARKER))
625
626
  return policy;
626
627
  const sentence = `${CAPABILITY_BOUNDARY_MARKER}:` +
627
628
  (allowed.length > 0 ? `仅可使用 ${allowed.join("、")}` : "无允许清单") +
628
629
  (forbidden.length > 0 ? `;禁止 ${forbidden.join("、")}` : "") +
630
+ (requiredClauses.length > 0 ? `;必须满足 ${requiredClauses.join(";")}` : "") +
629
631
  "。";
630
632
  return policy?.trim() ? `${policy.trim()};${sentence}` : sentence;
631
633
  }
@@ -1,4 +1,14 @@
1
1
  import { collectCanonicalStateFlowNames } from "./frontend-contract-facts.js";
2
+ export function enrichFrontendPlanMissingFacts(missing) {
3
+ return missing.map((item) => ({
4
+ ...item,
5
+ owner: "Plan",
6
+ repairScope: item.kind === "state-registry" || item.kind === "mock-api"
7
+ ? "global-phase"
8
+ : item.requirementIds.length > 1 ? "requirement-slice" : "fact",
9
+ nextAction: "replace-fact-and-finalize",
10
+ }));
11
+ }
2
12
  export function committedFactFromPlanRecord(value) {
3
13
  if (!value || typeof value !== "object" || Array.isArray(value))
4
14
  return undefined;
@@ -94,7 +104,7 @@ export function collectFrontendPlanMissingFacts(input) {
94
104
  }
95
105
  }
96
106
  }
97
- return missing;
107
+ return enrichFrontendPlanMissingFacts(missing);
98
108
  }
99
109
  /** Completeness checks for phases whose facts are committed incrementally. */
100
110
  export function collectFrontendPlanPhaseMissingFacts(input) {
@@ -155,7 +165,7 @@ export function collectFrontendPlanPhaseMissingFacts(input) {
155
165
  });
156
166
  }
157
167
  }
158
- return missing;
168
+ return enrichFrontendPlanMissingFacts(missing);
159
169
  }
160
170
  const hasMockApi = facts.some((fact) => fact.kind === "mock-api");
161
171
  const allInteractions = collectCanonicalStateFlowNames(facts).interactionNames;
@@ -182,5 +192,5 @@ export function collectFrontendPlanPhaseMissingFacts(input) {
182
192
  reason: `interaction ${interaction} has no committed data-flow fact`,
183
193
  });
184
194
  }
185
- return missing;
195
+ return enrichFrontendPlanMissingFacts(missing);
186
196
  }
@@ -14,7 +14,8 @@ export const FRONTEND_RECOVERY_IMPORT_MANIFEST_REL_PATH = ".runtime/import-manif
14
14
  /** Staging directory prefix under `active/` for in-flight child materialization. */
15
15
  export const FRONTEND_RECOVERY_STAGING_PREFIX = ".frontend-recovery-staging-";
16
16
  export function deriveFrontendRecoveryFailureSource(result) {
17
- if (result.failureSource === "frontend-plan-pi" ||
17
+ if (result.failureSource === "frontend-contract-pi" ||
18
+ result.failureSource === "frontend-plan-pi" ||
18
19
  result.failureSource === "frontend-design-policy-shell" ||
19
20
  result.failureSource === "frontend-implement-pi" ||
20
21
  result.failureSource === "frontend-verify-shell") {
@@ -61,11 +62,14 @@ function computeFrontendRecoveryPlanForSource(input) {
61
62
  // verification commands / trace. Resetting only verify + its descendants
62
63
  // would re-run the same failing checks against the same implementation, so
63
64
  // reset from implement: the recovery re-implements and re-verifies.
64
- const resetRoot = input.failureSource === "frontend-verify-shell"
65
- ? "frontend-implement-pi"
66
- : input.failureSource === "frontend-review-pi"
67
- ? "frontend-implement-pi"
68
- : input.failureSource;
65
+ const resetRoot = input.failureSource === "frontend-contract-pi"
66
+ ? "frontend-contract-pi"
67
+ :
68
+ input.failureSource === "frontend-verify-shell"
69
+ ? "frontend-implement-pi"
70
+ : input.failureSource === "frontend-review-pi"
71
+ ? "frontend-implement-pi"
72
+ : input.failureSource;
69
73
  const resetNodeIds = computeResetClosure(input.spec, resetRoot);
70
74
  const resetSet = new Set(resetNodeIds);
71
75
  const importedNodeIds = input.spec.tasks
@@ -196,6 +196,11 @@ export const reviewFindingSchema = z
196
196
  line: z.number().int().positive().optional(),
197
197
  issue: z.string().min(1),
198
198
  requiredChange: z.string().min(1).optional(),
199
+ repairAssertions: z.array(z.object({
200
+ check: z.enum(["file-absent", "state-present", "vt-changed"]),
201
+ token: z.string().min(1), source: z.string(),
202
+ expectedRequirementIds: z.array(z.string().min(1)).optional(),
203
+ }).strict()).optional(),
199
204
  })
200
205
  .strict();
201
206
  /** `approve_review` terminal fact payload. Approval may carry informational
@@ -49,6 +49,7 @@ export const frontendAdmissionCoverageSchema = z.discriminatedUnion("coverageId"
49
49
  ]);
50
50
  /** Failure-source values shared with frontend recovery planning (M8). */
51
51
  export const frontendAdmissionFailureSourceSchema = z.enum([
52
+ "frontend-contract-pi",
52
53
  "frontend-plan-pi",
53
54
  "frontend-design-policy-shell",
54
55
  "frontend-writer-admission-shell",
@@ -39,6 +39,7 @@ const reviewFindingSchema = z
39
39
  line: z.number().int().positive().optional(),
40
40
  issue: z.string().min(1),
41
41
  requiredChange: z.string().min(1).optional(),
42
+ repairAssertions: z.array(z.record(z.unknown())).optional(),
42
43
  })
43
44
  .strict();
44
45
  const reviewJsonVerdictSchema = z
@@ -447,6 +447,7 @@ async function executeFrontendRecoveryContinuation(input) {
447
447
  severity: typeof finding.severity === "string" ? finding.severity : "Important",
448
448
  issue: typeof finding.issue === "string" ? finding.issue : "",
449
449
  requiredChange: typeof finding.requiredChange === "string" ? finding.requiredChange : "",
450
+ ...(Array.isArray(finding.repairAssertions) ? { repairAssertions: finding.repairAssertions } : {}),
450
451
  });
451
452
  }
452
453
  }
@@ -19,9 +19,20 @@
19
19
  | 行为有覆盖 | `npm test` |
20
20
  | 完整本地交付有效 | `bash scripts/ci.sh` |
21
21
 
22
+ ## 代理与拦截层:校验状态码分布,不是请求条数
23
+
24
+ 当验证经过中间层(网关 shim、mock server、反向代理、录制层)时,「请求到了中间层」不等于「中间层在起作用」:
25
+
26
+ - 只看条数会把 **404/5xx 也算成命中**。真实的失败模式是「流量根本没经过」或「经过了但立刻被拒」,两者都产出请求记录。
27
+ - 必须核对 **状态码分布**(如 `200×99` 而非 `200×1 + 404×42`),以及流量是否落在**目标时间窗口**内。
28
+ - 用一条已知成功的直接调用(curl)建立参照,并确认它的路径形态与被测链路的路径形态**一致**——baseUrl 拼接差异(如 `/v1` 重复)会造成静默 404,而外层 runner 可能仍产出看似完整的产物。
29
+ - 尤其警惕「未触发阈值」这类结论:它既可能是真的余量充足,也可能是**根本没走到阈值判断**。两者的证据形态完全不同,不能只凭「无拦截记录」下结论。
30
+
22
31
  ## Red Flags
23
32
 
24
33
  - 凭意图声明完成
25
34
  - 依赖陈旧命令输出
26
35
  - 用窄检查支撑宽声明
27
36
  - 跳过失败命令的细节
37
+ - 用计数(请求数/命中数)代替状态码与时间窗口证据
38
+ - 把「没有触发拦截」直接读成「余量充足」,未确认流量确实经过了拦截点
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@tea-agent/loop-agent",
3
- "version": "0.44.0-next.3",
3
+ "version": "0.44.0-next.4",
4
4
  "type": "module",
5
5
  "bin": {
6
6
  "loop-agent": "bin/loop-agent.js",
@@ -1 +0,0 @@
1
- import{ag as o,ah as n}from"./mermaid.core-Dqz3Slj9.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-T9GbV5Hz.js";import{_ as i}from"./mermaid.core-Dqz3Slj9.js";import"./chunk-5VM5RSS4-Q_kwZT30.js";import"./chunk-XXDRQBXY-Cqm2RcKF.js";import"./chunk-KBJHAD2P-BCH2ewdp.js";import"./chunk-2GRJ4B5K-0hgjcdK4.js";import"./index-JRfTUgP7.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-T9GbV5Hz.js";import{_ as i}from"./mermaid.core-Dqz3Slj9.js";import"./chunk-5VM5RSS4-Q_kwZT30.js";import"./chunk-XXDRQBXY-Cqm2RcKF.js";import"./chunk-KBJHAD2P-BCH2ewdp.js";import"./chunk-2GRJ4B5K-0hgjcdK4.js";import"./index-JRfTUgP7.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};