enterprise-agent-designer 0.34.1

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 (34) hide show
  1. package/.codebuddy-plugin/plugin.json +66 -0
  2. package/CHANGELOG.md +729 -0
  3. package/DESIGN_NOTE.md +101 -0
  4. package/LICENSE +21 -0
  5. package/PACKAGE.yaml +209 -0
  6. package/README.md +109 -0
  7. package/RETROSPECTIVE_v0.1-v0.10.md +67 -0
  8. package/RUNTIME_ASSEMBLY.md +134 -0
  9. package/SYSTEM_PROMPT.md +139 -0
  10. package/agents/agent-designer.md +151 -0
  11. package/avatars/.gitkeep +0 -0
  12. package/avatars/expert.png +0 -0
  13. package/evaluation/README.md +60 -0
  14. package/evaluation/cases.json +2045 -0
  15. package/evaluation/document-reviewer-holdout.md +24 -0
  16. package/package.json +33 -0
  17. package/references/optional-host-workflow.md +105 -0
  18. package/scripts/check_agent_delivery.py +202 -0
  19. package/scripts/optional/workflow_controller.py +478 -0
  20. package/scripts/validate.py +437 -0
  21. package/scripts/verify_v0321_guards.py +410 -0
  22. package/skills/design-enterprise-agent/SKILL.md +131 -0
  23. package/skills/design-enterprise-agent/references/41-performance-worked-example.md +199 -0
  24. package/skills/design-enterprise-agent/references/cold-start-and-writing.md +163 -0
  25. package/skills/design-enterprise-agent/references/requirements-grilling.md +40 -0
  26. package/skills/design-enterprise-agent/references/runtime-and-integration.md +102 -0
  27. package/skills/design-enterprise-agent/references/task-adaptive-runtime.md +70 -0
  28. package/skills/design-enterprise-agent/scripts/finalize_agent_delivery.py +748 -0
  29. package/skills/grill-with-docs/SKILL.md +58 -0
  30. package/skills/grill-with-docs/references/design-context-format.md +101 -0
  31. package/skills/grilling/SKILL.md +62 -0
  32. package/skills/review-enterprise-agent/SKILL.md +86 -0
  33. package/skills/review-enterprise-agent/references/isolated-review-contract.md +154 -0
  34. package/skills/review-enterprise-agent/scripts/validate_review_receipt.py +338 -0
@@ -0,0 +1,478 @@
1
+ #!/usr/bin/env python3
2
+ """Deterministic phase and completion controller for full Agent-source delivery.
3
+
4
+ This controller does not judge business or Agent-design quality. It validates
5
+ phase transitions and evidence needed to continue, package, or declare a
6
+ handoff-ready result.
7
+ """
8
+
9
+ from __future__ import annotations
10
+
11
+ import argparse
12
+ import json
13
+ import subprocess
14
+ import sys
15
+ from pathlib import Path
16
+
17
+
18
+ ROOT = Path(__file__).resolve().parents[2]
19
+ VERSION = "0.32.1"
20
+ SCHEMA_VERSION = "1.0"
21
+ DEFAULT_REVIEW_VALIDATOR = (
22
+ ROOT / "skills/review-enterprise-agent/scripts/validate_review_receipt.py"
23
+ )
24
+
25
+
26
+ class WorkflowError(ValueError):
27
+ pass
28
+
29
+
30
+ def parse_args() -> argparse.Namespace:
31
+ parser = argparse.ArgumentParser(
32
+ description="Control legal workflow transitions for full_agent_source delivery."
33
+ )
34
+ subparsers = parser.add_subparsers(dest="command", required=True)
35
+
36
+ init_parser = subparsers.add_parser("init")
37
+ init_parser.add_argument("state", type=Path)
38
+ init_parser.add_argument("--overall-goal-ref", required=True)
39
+ init_parser.add_argument(
40
+ "--workflow-mode",
41
+ choices=("host_integrated", "reference_only"),
42
+ default="reference_only",
43
+ help="host_integrated 表示宿主已绑定阶段 Hook;否则仅为可调用参考控制器。",
44
+ )
45
+ init_parser.add_argument("--max-invalid-receipt-retries", type=int, default=1)
46
+
47
+ event_parser = subparsers.add_parser("event")
48
+ event_parser.add_argument("state", type=Path)
49
+ event_parser.add_argument(
50
+ "event",
51
+ choices=(
52
+ "candidate-grounded",
53
+ "grounding-gate-started",
54
+ "source-written",
55
+ "source-review-prepared",
56
+ "source-gate-started",
57
+ "source-changed",
58
+ "review-tool-unavailable",
59
+ "review-resume-authorized",
60
+ ),
61
+ )
62
+ event_parser.add_argument("--gate", choices=("grounding-gate", "source-gate"))
63
+ event_parser.add_argument("--manifest", type=Path)
64
+ event_parser.add_argument("--reason")
65
+ event_parser.add_argument("--failure-evidence")
66
+
67
+ gate_parser = subparsers.add_parser("gate")
68
+ gate_parser.add_argument("state", type=Path)
69
+ gate_parser.add_argument("--gate", choices=("grounding-gate", "source-gate"), required=True)
70
+ gate_parser.add_argument("--receipt", type=Path, required=True)
71
+ gate_parser.add_argument("--expected-round", type=int, required=True)
72
+ gate_parser.add_argument(
73
+ "--validator", type=Path, default=DEFAULT_REVIEW_VALIDATOR
74
+ )
75
+
76
+ delivery_parser = subparsers.add_parser("delivery")
77
+ delivery_parser.add_argument("state", type=Path)
78
+ delivery_parser.add_argument("--receipt", type=Path, required=True)
79
+
80
+ status_parser = subparsers.add_parser("status")
81
+ status_parser.add_argument("state", type=Path)
82
+
83
+ terminal_parser = subparsers.add_parser("check-terminal")
84
+ terminal_parser.add_argument("state", type=Path)
85
+
86
+ return parser.parse_args()
87
+
88
+
89
+ def load_json(path: Path) -> dict[str, object]:
90
+ try:
91
+ payload = json.loads(path.read_text(encoding="utf-8"))
92
+ except FileNotFoundError as exc:
93
+ raise WorkflowError(f"文件不存在:{path}") from exc
94
+ except (OSError, UnicodeError, json.JSONDecodeError) as exc:
95
+ raise WorkflowError(f"文件无法按 UTF-8 JSON 读取:{path}:{exc}") from exc
96
+ if not isinstance(payload, dict):
97
+ raise WorkflowError(f"JSON 顶层必须是对象:{path}")
98
+ return payload
99
+
100
+
101
+ def load_state(path: Path) -> dict[str, object]:
102
+ state = load_json(path)
103
+ if state.get("schema_version") != SCHEMA_VERSION:
104
+ raise WorkflowError("状态 schema_version 不受支持")
105
+ if state.get("product_version") != VERSION:
106
+ raise WorkflowError("状态 product_version 与当前控制器不一致")
107
+ if state.get("delivery_mode") != "full_agent_source":
108
+ raise WorkflowError("控制器当前只处理 full_agent_source")
109
+ return state
110
+
111
+
112
+ def allowed_actions(state: dict[str, object]) -> list[str]:
113
+ phase = state.get("phase")
114
+ grounding = state.get("grounding_gate_status")
115
+ source = state.get("source_gate_status")
116
+
117
+ if phase == "discovery":
118
+ if grounding == "candidate_ready":
119
+ return ["invoke-grounding-gate"]
120
+ return ["continue-discovery"]
121
+ if phase == "grounding_review":
122
+ if grounding == "in_progress":
123
+ return ["await-grounding-receipt"]
124
+ if grounding == "invalid_receipt":
125
+ return ["retry-grounding-gate"]
126
+ return ["invoke-grounding-gate"]
127
+ if phase == "design":
128
+ return ["run-design-skill"]
129
+ if phase == "source_review":
130
+ if source == "not_attempted":
131
+ return ["prepare-source-review"]
132
+ if source == "prepared":
133
+ return ["invoke-source-gate"]
134
+ if source == "in_progress":
135
+ return ["await-source-gate-receipt"]
136
+ if source == "invalid_receipt":
137
+ return ["retry-source-gate"]
138
+ return ["prepare-source-review"]
139
+ if phase == "packaging":
140
+ return ["run-delivery-finalizer"]
141
+ if phase == "ready_for_handoff":
142
+ return ["provide-verified-zip-path"]
143
+ if phase == "blocked":
144
+ return ["report-blocker", "resume-after-external-change"]
145
+ raise WorkflowError(f"未知 phase:{phase}")
146
+
147
+
148
+ def persist(path: Path, state: dict[str, object]) -> None:
149
+ state["allowed_actions"] = allowed_actions(state)
150
+ path = path.resolve()
151
+ path.parent.mkdir(parents=True, exist_ok=True)
152
+ temporary = path.with_name(path.name + ".tmp")
153
+ temporary.write_text(
154
+ json.dumps(state, ensure_ascii=False, indent=2) + "\n", encoding="utf-8"
155
+ )
156
+ temporary.replace(path)
157
+
158
+
159
+ def initialize(args: argparse.Namespace) -> int:
160
+ if args.max_invalid_receipt_retries < 0:
161
+ raise WorkflowError("max-invalid-receipt-retries 不能小于 0")
162
+ if args.state.exists():
163
+ raise WorkflowError(f"状态文件已存在,不能覆盖:{args.state}")
164
+ state: dict[str, object] = {
165
+ "schema_version": SCHEMA_VERSION,
166
+ "product_version": VERSION,
167
+ "delivery_mode": "full_agent_source",
168
+ "workflow_mode": args.workflow_mode,
169
+ "enforcement_level": (
170
+ "deterministic_host_hooks"
171
+ if args.workflow_mode == "host_integrated"
172
+ else "callable_reference_only"
173
+ ),
174
+ "overall_goal_ref": args.overall_goal_ref,
175
+ "phase": "discovery",
176
+ "grounding_gate_status": "not_attempted",
177
+ "source_status": "not_started",
178
+ "source_gate_status": "not_attempted",
179
+ "source_snapshot_id": None,
180
+ "source_review_manifest": None,
181
+ "package_status": "not_started",
182
+ "delivery_receipt": None,
183
+ "output_zip": None,
184
+ "invalid_receipt_attempts": {"grounding-gate": 0, "source-gate": 0},
185
+ "max_invalid_receipt_retries": args.max_invalid_receipt_retries,
186
+ "blocked_reason": None,
187
+ "last_event": "initialized",
188
+ }
189
+ persist(args.state, state)
190
+ print_state(state)
191
+ return 0
192
+
193
+
194
+ def require(condition: bool, message: str) -> None:
195
+ if not condition:
196
+ raise WorkflowError(message)
197
+
198
+
199
+ def read_manifest(path: Path) -> tuple[str, Path]:
200
+ payload = load_json(path)
201
+ snapshot = payload.get("source_snapshot_id")
202
+ if not isinstance(snapshot, str) or not snapshot.startswith("sha256:"):
203
+ raise WorkflowError("送审清单缺少有效 source_snapshot_id")
204
+ return snapshot, path.resolve()
205
+
206
+
207
+ def apply_event(args: argparse.Namespace) -> int:
208
+ state = load_state(args.state)
209
+ event = args.event
210
+ phase = state.get("phase")
211
+
212
+ if event == "candidate-grounded":
213
+ require(phase == "discovery", "candidate-grounded 只能发生在 discovery")
214
+ state["grounding_gate_status"] = "candidate_ready"
215
+ elif event == "grounding-gate-started":
216
+ require(
217
+ phase == "grounding_review"
218
+ or (phase == "discovery" and state.get("grounding_gate_status") == "candidate_ready"),
219
+ "grounding-gate 尚未具备调用条件",
220
+ )
221
+ state["phase"] = "grounding_review"
222
+ state["grounding_gate_status"] = "in_progress"
223
+ state["blocked_reason"] = None
224
+ elif event == "source-written":
225
+ require(phase == "design", "source-written 只能由 design 阶段提交")
226
+ state["phase"] = "source_review"
227
+ state["source_status"] = "written"
228
+ state["source_gate_status"] = "not_attempted"
229
+ state["source_snapshot_id"] = None
230
+ state["source_review_manifest"] = None
231
+ state["package_status"] = "not_started"
232
+ state["delivery_receipt"] = None
233
+ state["output_zip"] = None
234
+ state["invalid_receipt_attempts"]["source-gate"] = 0
235
+ elif event == "source-review-prepared":
236
+ require(phase == "source_review", "只能在 source_review 冻结送审源码")
237
+ require(state.get("source_status") == "written", "源码尚未登记为 written")
238
+ require(args.manifest is not None, "source-review-prepared 必须提供 --manifest")
239
+ snapshot, manifest = read_manifest(args.manifest)
240
+ state["source_status"] = "frozen"
241
+ state["source_snapshot_id"] = snapshot
242
+ state["source_review_manifest"] = str(manifest)
243
+ state["source_gate_status"] = "prepared"
244
+ elif event == "source-gate-started":
245
+ require(phase == "source_review", "source-gate 只能发生在 source_review")
246
+ require(
247
+ state.get("source_gate_status") in {"prepared", "invalid_receipt"},
248
+ "source-gate 尚未冻结源码或不在可重试状态",
249
+ )
250
+ state["source_gate_status"] = "in_progress"
251
+ state["blocked_reason"] = None
252
+ elif event == "source-changed":
253
+ require(phase in {"source_review", "packaging", "ready_for_handoff"}, "当前没有可失效的源码许可")
254
+ state["phase"] = "source_review"
255
+ state["source_status"] = "written"
256
+ state["source_gate_status"] = "not_attempted"
257
+ state["source_snapshot_id"] = None
258
+ state["source_review_manifest"] = None
259
+ state["package_status"] = "not_started"
260
+ state["delivery_receipt"] = None
261
+ state["output_zip"] = None
262
+ state["invalid_receipt_attempts"]["source-gate"] = 0
263
+ elif event == "review-tool-unavailable":
264
+ require(args.gate is not None, "review-tool-unavailable 必须提供 --gate")
265
+ require(args.reason and args.failure_evidence, "Tool 不可用必须提供原因和真实失败依据")
266
+ expected_phase = "grounding_review" if args.gate == "grounding-gate" else "source_review"
267
+ require(phase == expected_phase, "Tool 不可用事件与当前阶段不一致")
268
+ state["phase"] = "blocked"
269
+ state[gate_status_key(args.gate)] = "tool_unavailable"
270
+ state["blocked_reason"] = {
271
+ "kind": "tool_unavailable",
272
+ "gate": args.gate,
273
+ "reason": args.reason,
274
+ "failure_evidence": args.failure_evidence,
275
+ }
276
+ elif event == "review-resume-authorized":
277
+ require(phase == "blocked", "只有 blocked 状态可以恢复评审")
278
+ require(args.gate is not None and args.reason, "恢复评审必须提供 gate 和原因")
279
+ if args.gate == "grounding-gate":
280
+ state["phase"] = "grounding_review"
281
+ state["grounding_gate_status"] = "candidate_ready"
282
+ else:
283
+ require(state.get("source_snapshot_id") is not None, "恢复 source-gate 前必须仍有冻结快照")
284
+ state["phase"] = "source_review"
285
+ state["source_gate_status"] = "prepared"
286
+ state["invalid_receipt_attempts"][args.gate] = 0
287
+ state["blocked_reason"] = None
288
+ else:
289
+ raise WorkflowError(f"未实现事件:{event}")
290
+
291
+ state["last_event"] = event
292
+ persist(args.state, state)
293
+ print_state(state)
294
+ return 0
295
+
296
+
297
+ def gate_status_key(gate: str) -> str:
298
+ return "grounding_gate_status" if gate == "grounding-gate" else "source_gate_status"
299
+
300
+
301
+ def mark_invalid_receipt(
302
+ state_path: Path,
303
+ state: dict[str, object],
304
+ gate: str,
305
+ reason: str,
306
+ ) -> int:
307
+ attempts = state["invalid_receipt_attempts"]
308
+ attempts[gate] = int(attempts.get(gate, 0)) + 1
309
+ state[gate_status_key(gate)] = "invalid_receipt"
310
+ state["last_event"] = f"{gate}-invalid-receipt"
311
+ maximum = int(state.get("max_invalid_receipt_retries", 1))
312
+ if attempts[gate] > maximum:
313
+ state["phase"] = "blocked"
314
+ state["blocked_reason"] = {
315
+ "kind": "invalid_receipt_retries_exhausted",
316
+ "gate": gate,
317
+ "reason": reason,
318
+ }
319
+ persist(state_path, state)
320
+ print_state(state)
321
+ print(f"receipt_validation={reason}")
322
+ return 2
323
+
324
+
325
+ def run_receipt_validator(
326
+ validator: Path,
327
+ receipt: Path,
328
+ gate: str,
329
+ expected_round: int,
330
+ snapshot: str | None,
331
+ ) -> subprocess.CompletedProcess[str]:
332
+ command = [
333
+ sys.executable,
334
+ str(validator.resolve()),
335
+ str(receipt.resolve()),
336
+ "--expected-mode",
337
+ gate,
338
+ "--expected-round",
339
+ str(expected_round),
340
+ ]
341
+ if gate == "source-gate":
342
+ if snapshot is None:
343
+ raise WorkflowError("source-gate 状态缺少冻结快照")
344
+ command.extend(["--expected-snapshot", snapshot])
345
+ return subprocess.run(command, text=True, capture_output=True, encoding="utf-8")
346
+
347
+
348
+ def apply_gate_receipt(args: argparse.Namespace) -> int:
349
+ state = load_state(args.state)
350
+ gate = args.gate
351
+ expected_phase = "grounding_review" if gate == "grounding-gate" else "source_review"
352
+ require(state.get("phase") == expected_phase, "评审收据与当前阶段不一致")
353
+ require(state.get(gate_status_key(gate)) == "in_progress", "当前没有等待中的评审调用")
354
+
355
+ try:
356
+ receipt = load_json(args.receipt)
357
+ except WorkflowError as exc:
358
+ return mark_invalid_receipt(args.state, state, gate, str(exc))
359
+
360
+ result = run_receipt_validator(
361
+ args.validator,
362
+ args.receipt,
363
+ gate,
364
+ args.expected_round,
365
+ str(state.get("source_snapshot_id")) if gate == "source-gate" else None,
366
+ )
367
+ if result.returncode != 0:
368
+ detail = (result.stdout + result.stderr).strip() or "收据校验器失败"
369
+ return mark_invalid_receipt(args.state, state, gate, detail)
370
+
371
+ verdict = receipt.get("verdict")
372
+ state[gate_status_key(gate)] = verdict
373
+ state["invalid_receipt_attempts"][gate] = 0
374
+ state["blocked_reason"] = None
375
+ state["last_event"] = f"{gate}-{verdict}"
376
+
377
+ if gate == "grounding-gate":
378
+ if verdict == "pass":
379
+ state["phase"] = "design"
380
+ elif verdict in {"revision_required", "insufficient_basis"}:
381
+ state["phase"] = "discovery"
382
+ else:
383
+ raise WorkflowError(f"不支持的 grounding verdict:{verdict}")
384
+ else:
385
+ if verdict == "pass":
386
+ state["phase"] = "packaging"
387
+ state["package_status"] = "not_started"
388
+ elif verdict == "revision_required":
389
+ state["phase"] = "design"
390
+ state["source_status"] = "written"
391
+ state["source_snapshot_id"] = None
392
+ state["source_review_manifest"] = None
393
+ state["package_status"] = "not_started"
394
+ elif verdict == "insufficient_basis":
395
+ state["phase"] = "discovery"
396
+ state["grounding_gate_status"] = "insufficient_basis"
397
+ state["source_status"] = "written"
398
+ state["source_snapshot_id"] = None
399
+ state["source_review_manifest"] = None
400
+ state["package_status"] = "not_started"
401
+ else:
402
+ raise WorkflowError(f"不支持的 source verdict:{verdict}")
403
+
404
+ persist(args.state, state)
405
+ print_state(state)
406
+ return 0
407
+
408
+
409
+ def apply_delivery(args: argparse.Namespace) -> int:
410
+ state = load_state(args.state)
411
+ require(state.get("phase") == "packaging", "只有 source-gate pass 后才能接收交付收据")
412
+ receipt = load_json(args.receipt)
413
+ require(receipt.get("package_status") == "packaged_verified", "交付收据没有 packaged_verified")
414
+ require(receipt.get("handoff_status") == "ready_for_handoff", "交付收据没有 ready_for_handoff")
415
+ require(receipt.get("source_snapshot_id") == state.get("source_snapshot_id"), "交付收据与当前源码快照不一致")
416
+ output_zip = receipt.get("output_zip")
417
+ require(isinstance(output_zip, str) and output_zip.strip(), "交付收据缺少 output_zip")
418
+ zip_path = Path(output_zip).resolve()
419
+ require(zip_path.is_file(), f"最终 ZIP 不存在:{zip_path}")
420
+
421
+ state["phase"] = "ready_for_handoff"
422
+ state["package_status"] = "packaged_verified"
423
+ state["delivery_receipt"] = str(args.receipt.resolve())
424
+ state["output_zip"] = str(zip_path)
425
+ state["blocked_reason"] = None
426
+ state["last_event"] = "delivery-receipt-validated"
427
+ persist(args.state, state)
428
+ print_state(state)
429
+ return 0
430
+
431
+
432
+ def is_terminal(state: dict[str, object]) -> bool:
433
+ output_zip = state.get("output_zip")
434
+ return (
435
+ state.get("phase") == "ready_for_handoff"
436
+ and state.get("package_status") == "packaged_verified"
437
+ and isinstance(state.get("delivery_receipt"), str)
438
+ and isinstance(output_zip, str)
439
+ and Path(output_zip).is_file()
440
+ )
441
+
442
+
443
+ def print_state(state: dict[str, object]) -> None:
444
+ print(json.dumps(state, ensure_ascii=False, indent=2))
445
+ print(f"terminal={'true' if is_terminal(state) else 'false'}")
446
+
447
+
448
+ def main() -> int:
449
+ args = parse_args()
450
+ try:
451
+ if args.command == "init":
452
+ return initialize(args)
453
+ if args.command == "event":
454
+ return apply_event(args)
455
+ if args.command == "gate":
456
+ return apply_gate_receipt(args)
457
+ if args.command == "delivery":
458
+ return apply_delivery(args)
459
+ state = load_state(args.state)
460
+ print_state(state)
461
+ if args.command == "check-terminal":
462
+ if not is_terminal(state):
463
+ print("WORKFLOW_NOT_TERMINAL:完整源码交付尚未取得有效终结器收据与最终 ZIP")
464
+ return 1
465
+ if state.get("workflow_mode") == "host_integrated":
466
+ print("WORKFLOW_TERMINAL:宿主控制链已到终态,可以提供已验证 ZIP 的准确路径")
467
+ else:
468
+ print("WORKFLOW_TERMINAL_REFERENCE_ONLY:本次显式调用链已到终态,但未证明宿主已绑定自动 Hook")
469
+ return 0
470
+ except WorkflowError as exc:
471
+ print(f"WORKFLOW_FAIL:{exc}")
472
+ return 1
473
+
474
+
475
+ if __name__ == "__main__":
476
+ raise SystemExit(main())
477
+
478
+