@piagent/platform 1.2.9 → 1.2.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.
Files changed (112) hide show
  1. package/CHANGELOG.md +179 -0
  2. package/README.md +29 -6
  3. package/adapters/backend-api/profile.json +1 -1
  4. package/adapters/be-readonly-fe/profile.json +2 -2
  5. package/adapters/data/profile.json +1 -1
  6. package/adapters/devops/profile.json +1 -3
  7. package/adapters/docs/profile.json +1 -1
  8. package/adapters/fullstack/profile.json +2 -4
  9. package/adapters/generic/profile.json +1 -1
  10. package/adapters/mobile/profile.json +1 -2
  11. package/adapters/node-typescript/profile.json +1 -3
  12. package/benchmarks/core-v1/suite.json +51 -0
  13. package/benchmarks/core-v1/tasks/discount-order/grade.mjs +17 -0
  14. package/benchmarks/core-v1/tasks/discount-order/project/package.json +8 -0
  15. package/benchmarks/core-v1/tasks/discount-order/project/src/discount.js +3 -0
  16. package/benchmarks/core-v1/tasks/discount-order/project/src/order.js +6 -0
  17. package/benchmarks/core-v1/tasks/discount-order/project/test/order.test.js +7 -0
  18. package/benchmarks/core-v1/tasks/discount-order/prompt.md +4 -0
  19. package/benchmarks/core-v1/tasks/invoice-quantity/grade.mjs +17 -0
  20. package/benchmarks/core-v1/tasks/invoice-quantity/project/package.json +8 -0
  21. package/benchmarks/core-v1/tasks/invoice-quantity/project/src/invoice.js +3 -0
  22. package/benchmarks/core-v1/tasks/invoice-quantity/project/test/invoice.test.js +7 -0
  23. package/benchmarks/core-v1/tasks/invoice-quantity/prompt.md +3 -0
  24. package/benchmarks/core-v1/tasks/protected-env-refusal/grade.mjs +11 -0
  25. package/benchmarks/core-v1/tasks/protected-env-refusal/project/README.md +4 -0
  26. package/benchmarks/core-v1/tasks/protected-env-refusal/project/package.json +8 -0
  27. package/benchmarks/core-v1/tasks/protected-env-refusal/project/test/smoke.test.js +4 -0
  28. package/benchmarks/core-v1/tasks/protected-env-refusal/prompt.md +4 -0
  29. package/benchmarks/core-v1/tasks/targeted-session/grade.mjs +14 -0
  30. package/benchmarks/core-v1/tasks/targeted-session/project/package.json +8 -0
  31. package/benchmarks/core-v1/tasks/targeted-session/project/src/auth/session.js +3 -0
  32. package/benchmarks/core-v1/tasks/targeted-session/project/src/billing/currency.js +3 -0
  33. package/benchmarks/core-v1/tasks/targeted-session/project/src/catalog/search.js +3 -0
  34. package/benchmarks/core-v1/tasks/targeted-session/project/src/notifications/channel.js +3 -0
  35. package/benchmarks/core-v1/tasks/targeted-session/project/src/search/tokenize.js +3 -0
  36. package/benchmarks/core-v1/tasks/targeted-session/project/test/session.test.js +7 -0
  37. package/benchmarks/core-v1/tasks/targeted-session/prompt.md +4 -0
  38. package/catalog/capabilities.json +12 -12
  39. package/docs/command-reference-vietnamese.md +15 -8
  40. package/docs/context-engine.md +56 -15
  41. package/docs/distribution-standard.md +11 -8
  42. package/docs/mcp-and-tools.md +20 -7
  43. package/docs/model-options.md +7 -10
  44. package/docs/operator-manual-vietnamese.md +102 -37
  45. package/docs/package-architecture-notes.md +3 -1
  46. package/docs/publishing-for-teams.md +5 -0
  47. package/docs/quality-benchmark.md +225 -58
  48. package/docs/quickstart-vietnamese.md +5 -0
  49. package/docs/release-install-policy.md +41 -7
  50. package/docs/runtime-harness-standard.md +47 -29
  51. package/docs/runtime-policy-design.md +23 -12
  52. package/docs/runtime-quality-baseline.md +31 -17
  53. package/docs/security-threat-model.md +7 -2
  54. package/docs/subagents-and-multiagent.md +1 -1
  55. package/docs/task-implementation-contract.md +113 -177
  56. package/docs/task-lifecycle-vietnamese.md +129 -125
  57. package/docs/team-onboarding.md +12 -4
  58. package/docs/usage-observability.md +15 -8
  59. package/docs-site/architecture.html +1 -1
  60. package/docs-site/commands.html +1 -1
  61. package/docs-site/content/context-engine.html +8 -1
  62. package/docs-site/content/runtime.html +10 -0
  63. package/docs-site/content/security.html +1 -0
  64. package/docs-site/context-engine.html +9 -2
  65. package/docs-site/index.html +1 -1
  66. package/docs-site/mcp-approval.html +1 -1
  67. package/docs-site/mcp-auth.html +1 -1
  68. package/docs-site/mcp-servers.html +1 -1
  69. package/docs-site/mcp.html +1 -1
  70. package/docs-site/permissions.html +1 -1
  71. package/docs-site/profiles.html +1 -1
  72. package/docs-site/quickstart.html +1 -1
  73. package/docs-site/runtime.html +11 -1
  74. package/docs-site/scope.html +1 -1
  75. package/docs-site/security.html +2 -1
  76. package/docs-site/team.html +1 -1
  77. package/docs-site/workflows.html +1 -1
  78. package/evals/fixtures/task-contract.invalid.json +15 -1
  79. package/evals/fixtures/task-contract.valid.json +18 -2
  80. package/package.json +3 -2
  81. package/packages/piagent-core/README.md +43 -4
  82. package/packages/piagent-core/benchmark/benchmark-core.js +691 -0
  83. package/packages/piagent-core/extensions/context-engine.js +209 -120
  84. package/packages/piagent-core/extensions/context-index-policy.js +1 -1
  85. package/packages/piagent-core/extensions/guard-types.ts +35 -3
  86. package/packages/piagent-core/extensions/local-state-path.js +59 -0
  87. package/packages/piagent-core/extensions/piagent-guard.ts +2073 -222
  88. package/packages/piagent-core/extensions/policy-core.js +11 -1
  89. package/packages/piagent-core/extensions/runtime-evidence.js +39 -19
  90. package/packages/piagent-core/extensions/state-retention.js +218 -0
  91. package/packages/piagent-core/extensions/task-lifecycle.js +138 -0
  92. package/packages/piagent-core/extensions/task-state.js +630 -0
  93. package/packages/piagent-core/mcp/mcp-config-layers.js +52 -6
  94. package/packages/piagent-core/mcp/mcp-tool-naming.js +12 -1
  95. package/packages/piagent-core/package.json +1 -1
  96. package/packages/piagent-core/policies/base-policy.json +1 -0
  97. package/packages/piagent-core/prompts/be-to-fe.md +14 -22
  98. package/packages/piagent-core/prompts/platform-improve.md +12 -17
  99. package/packages/piagent-core/prompts/review.md +7 -11
  100. package/packages/piagent-core/prompts/scout.md +6 -10
  101. package/packages/piagent-core/prompts/task.md +11 -17
  102. package/packages/piagent-core/skills/piagent-ops/SKILL.md +12 -15
  103. package/packages/piagent-core/subagents/piagent-reviewer.md +3 -3
  104. package/schemas/task-contract.schema.json +267 -104
  105. package/scripts/benchmark-runner.mjs +1172 -0
  106. package/scripts/install-global.sh +1 -1
  107. package/scripts/migrate-project-state.mjs +94 -3
  108. package/scripts/piagent-cli.mjs +1 -1
  109. package/scripts/update-global.mjs +36 -3
  110. package/scripts/verify-local.sh +15 -0
  111. package/templates/project/.pi/task-contract.template.json +19 -2
  112. package/templates/project/AGENTS.md +10 -20
@@ -18,12 +18,12 @@ Support matrix release hiện tại: macOS Apple Silicon + Bash và Linux x64 +
18
18
  ```bash
19
19
  node --version # >= 22.19.0
20
20
  npm install -g --ignore-scripts @earendil-works/pi-coding-agent@0.82.0
21
- npm install -g --ignore-scripts @piagent/platform@1.2.9
21
+ npm install -g --ignore-scripts @piagent/platform@1.2.11
22
22
  piagent-install --stable --dry-run
23
23
  piagent-install --stable
24
24
  ```
25
25
 
26
- Khi seed `.pi/settings.json` cho team/repo cần audit lặp lại, giữ package source dạng pinned tag như `git:github.com/Vt-mmm/piagent@v1.2.9`. Máy cá nhân có thể dùng `git:github.com/Vt-mmm/piagent` để theo latest.
26
+ Khi seed `.pi/settings.json` cho team/repo cần audit lặp lại, giữ package source dạng pinned tag như `git:github.com/Vt-mmm/piagent@v1.2.11`. Máy cá nhân có thể dùng `git:github.com/Vt-mmm/piagent` để theo latest.
27
27
 
28
28
  Nếu đang ở source checkout của platform, dùng helper theo channel để preview trước khi đổi:
29
29
 
@@ -99,7 +99,7 @@ install package once
99
99
 
100
100
  ```bash
101
101
  npm install -g --ignore-scripts @earendil-works/pi-coding-agent@0.82.0
102
- npm install -g --ignore-scripts @piagent/platform@1.2.9
102
+ npm install -g --ignore-scripts @piagent/platform@1.2.11
103
103
  piagent-install --stable --dry-run
104
104
  piagent-install --stable
105
105
  ```
@@ -282,7 +282,7 @@ Không phải daily default. Dùng khi muốn tạo sẵn `.pi` files cho projec
282
282
  bash /path/to/piagent/scripts/setup.sh /path/to/project \
283
283
  --project-only \
284
284
  --profile auto \
285
- --package-source git:github.com/Vt-mmm/piagent@v1.2.9 \
285
+ --package-source git:github.com/Vt-mmm/piagent@v1.2.11 \
286
286
  --mcp-preset core \
287
287
  --subagents-preset safe
288
288
  ```
@@ -347,10 +347,20 @@ Input guard của platform cũng tự collapse prompt có full `Mandatory flow`
347
347
 
348
348
  ### Gửi ảnh/screenshot trong chat
349
349
 
350
- Nếu Pi/chat box không tạo native image attachment mà chỉ hiện local path kiểu `/var/folders/.../Ảnh màn hình ...png`, cứ để nguyên path trong prompt:
350
+ Nếu Pi/chat box không tạo native image attachment mà chỉ hiện local path, dùng
351
+ ảnh nằm trong project hoặc một folder đã cấp qua `additionalReadRoots`. Ví dụ
352
+ lưu screenshot vào `~/Documents/team-screenshots` rồi thêm folder đó vào profile:
353
+
354
+ ```json
355
+ {
356
+ "additionalReadRoots": ["~/Documents/team-screenshots"]
357
+ }
358
+ ```
359
+
360
+ Sau đó để nguyên path trong prompt:
351
361
 
352
362
  ```text
353
- /workflow scout Scout UI issue from screenshot /var/folders/.../screenshot.png
363
+ /workflow scout Scout UI issue from screenshot ~/Documents/team-screenshots/screenshot.png
354
364
  ```
355
365
 
356
366
  Piagent guard sẽ xử lý trước khi model nhận input:
@@ -360,9 +370,15 @@ Piagent guard sẽ xử lý trước khi model nhận input:
360
370
  3. thay path trong prompt bằng marker `[image1]`;
361
371
  4. báo `Piagent image input: attached [image1]`.
362
372
 
363
- Hỗ trợ `.png`, `.jpg`, `.jpeg`, `.gif`, `.webp`, `.bmp`. Giới hạn mặc định: tối đa 4 ảnh/input, 8 MB/ảnh.
373
+ Hỗ trợ `.png`, `.jpg`, `.jpeg`, `.gif`, `.webp`, `.bmp`. Giới hạn mặc định:
374
+ tối đa 4 ảnh/input, 8 MB/ảnh. Guard resolve target thật trước khi đọc, giữ
375
+ `protectedPaths` và filesystem read scope, đồng thời kiểm tra bytes đúng định
376
+ dạng ảnh; đổi tên file text thành `.png` không đủ để attach.
364
377
 
365
- Nếu ảnh quá lớn, lưu ảnh nhỏ hơn hoặc yêu cầu agent dùng Pi `read` tool trên file ảnh để Pi resize. Không cần copy ảnh vào repo và không commit screenshot tạm.
378
+ Nếu ảnh quá lớn, lưu ảnh nhỏ hơn hoặc yêu cầu agent dùng Pi `read` tool trên file
379
+ ảnh để Pi resize. Không cần commit screenshot tạm. Với path ngoài project chưa
380
+ được cấp root, file không được đọc hoặc attach; chuỗi path vẫn chỉ là text trong
381
+ prompt.
366
382
 
367
383
  ### BE spec lên FE
368
384
 
@@ -400,42 +416,54 @@ Một source-changing task nên đi qua:
400
416
 
401
417
  ```text
402
418
  intake
403
- -> profile/context
404
- -> task contract
405
- -> context manifest
419
+ -> session name + profile/context
420
+ -> session-bound task contract v2
421
+ -> runtime-observed context manifest
406
422
  -> implementation
407
- -> verify command
408
- -> observed verify evidence
409
- -> trace
410
- -> final gate
411
- -> handoff
423
+ -> baseline-aware changed files
424
+ -> every exact verify command
425
+ -> current-tree verify evidence from tool_result
426
+ -> completion hook: trace + final gate
427
+ -> immutable outcome / retry handoff
412
428
  ```
413
429
 
414
- Các piagent tools nền:
430
+ Trong task nhỏ và rõ scope, runtime tạo contract trước model turn đầu tiên nên
431
+ model không gọi management tool nào. Task rộng, high-risk hoặc scope mơ hồ mới
432
+ fallback về một `piagent_task_start`. Các tool còn lại bên dưới là bề mặt
433
+ operator/diagnostics/recovery, không phải checklist phải gọi mỗi task.
434
+
435
+ Các Piagent tools:
415
436
 
416
437
  | Tool | Vai trò |
417
438
  |---|---|
418
439
  | `piagent_context` | Đọc active profile, required context, verify commands, MCP/memory settings. |
419
440
  | `piagent_context_index_status/search/record` | Kiểm tra/tìm/ghi context index advisory có citation. |
420
- | `piagent_task_start` | Tạo task contract: scope, risk, acceptance criteria. |
421
- | `piagent_context_record` | Ghi context manifest: file nào đã đọc và lý do. |
422
- | `piagent_exec_policy_check` | Check shell command trước khi chạy lệnh rủi ro. |
423
- | `piagent_context_budget` | Check file/context size để tránh nhồi context. |
424
- | `piagent_tool_policy_check` | Check capability của tool/MCP. |
425
- | `piagent_verify_record` | Chỉ ghi verify evidence nếu Pi đã quan sát bash result thật sau task start. |
426
- | `piagent_trace_record` | Ghi outcome, changed files, notes. |
427
- | `piagent_task_gate_check` | Check final gate trước khi báo DONE. |
441
+ | `piagent_task_start` | Fallback intake cho task rộng/high-risk/mơ hồ; scope chỉ nhận project-relative path/glob. |
442
+ | `piagent_task_progress` | Chuyển step trong work plan và ghi failure/ruled-out evidence. |
443
+ | `piagent_context_record` | Recovery: bổ sung context manifest khi observer không đủ. |
444
+ | `piagent_exec_policy_check` | Diagnostics: giải thích shell-policy verdict; runtime vẫn check mọi call. |
445
+ | `piagent_context_budget` | Diagnostics: xem budget của file/context lớn. |
446
+ | `piagent_tool_policy_check` | Diagnostics: xem capability verdict của tool/MCP. |
447
+ | `piagent_verify_record` | Recovery: đối chiếu verify với bash result thật sau task start. |
448
+ | `piagent_trace_record` | Recovery/high-risk: ghi outcome hoặc blocker thủ công. |
449
+ | `piagent_task_gate_check` | Diagnostics/recovery: xem missing final proof. |
428
450
  | `piagent_usage_snapshot` | Snapshot session/model/context. |
429
451
 
430
452
  Done đúng nghĩa:
431
453
 
432
- - có task contract;
454
+ - task contract v2 gắn đúng session hiện tại;
433
455
  - có context manifest;
434
- - verify command đã chạy thật;
435
- - verify evidence khớp `task.verifyCommands`;
456
+ - mọi verify command đã chạy thật và khớp `task.verifyCommands`;
457
+ - changed files khác baseline, có evidence và nằm trong scope;
458
+ - work plan không còn step pending/in-progress/failed;
436
459
  - trace outcome rõ;
437
460
  - final gate pass hoặc ghi rõ blocked/partial.
438
461
 
462
+ Source task yêu cầu Git working tree và meaningful verifier ngay từ lúc start.
463
+ Một session chỉ dùng cho một task. Retry mở session mới với cùng `taskId`; runtime
464
+ giữ previous attempt evidence và từ chối vượt `maxAttempts`. Contract đã terminal
465
+ không thể sửa thêm context/verify/trace để viết lại lịch sử.
466
+
439
467
  ## 6. Guardrails cần hiểu
440
468
 
441
469
  Protected path mặc định:
@@ -572,19 +600,48 @@ Sau compact, agent phải đọc lại context quan trọng trước khi sửa t
572
600
  Không claim tiết kiệm token/cost nếu chưa có số liệu cùng scenario.
573
601
 
574
602
  ```bash
575
- bash /path/to/piagent/scripts/quality-benchmark.sh /path/to/project --init
603
+ piagent-benchmark --dry-run
604
+ piagent-benchmark
605
+ ```
606
+
607
+ Lệnh mặc định tự chạy 4 scenario trên Raw Pi và Piagent, mỗi bên 3 lần; token,
608
+ cost, model và thinking được đọc từ Pi session thay vì nhập tay. Runner chỉ cho
609
+ phép kết luận tiết kiệm token khi quality/reliability đạt ít nhất `9/10`,
610
+ safety/workflow đạt `10/10`, quality không giảm, có ít nhất ba cặp cùng model
611
+ với exact usage và geometric mean của tỷ lệ fresh token `Piagent / Raw Pi`
612
+ theo từng cặp thực sự nhỏ hơn `1`.
613
+
614
+ So sánh trực tiếp với surface `codex-cli` đã đăng nhập:
615
+
616
+ ```bash
617
+ piagent-benchmark \
618
+ --surfaces piagent,codex-cli \
619
+ --model openai-codex/gpt-5.6-sol \
620
+ --thinking xhigh
621
+ ```
576
622
 
577
- bash /path/to/piagent/scripts/quality-benchmark.sh /path/to/project --record \
623
+ Chế độ mặc định là `controlled`: Codex chạy ephemeral, chỉ được ghi trong
624
+ workspace benchmark, dùng `CODEX_HOME` tạm để loại global `AGENTS.md`,
625
+ config/rules/hooks/plugins/session cá nhân và tắt capability tùy chọn có thể
626
+ làm lệch task offline. Credential hiện có chỉ được nối bằng symlink `auth.json`,
627
+ không bị runner đọc hay sao chép. `--codex-mode native` đo cấu hình Codex thật
628
+ của operator, gồm global instruction/hooks/MCP/plugins, nên chỉ dùng như report UX bổ sung. Codex OAuth
629
+ không trả currency cost trong JSONL; report để `n/a`, còn fresh token được tính
630
+ bằng `(input_tokens - cached_input_tokens) + output_tokens`.
631
+
632
+ Để ghi thêm scenario thật ngoài automatic suite, dùng chế độ legacy:
633
+
634
+ ```bash
635
+ piagent-benchmark /path/to/project --record \
578
636
  --scenario "ui-fix-with-ci-gate" \
579
637
  --surface pi \
580
638
  --result partial \
581
639
  --tokens 26323474 \
582
640
  --cost 18.33 \
583
- --verify "npm test / E2E / CI gate" \
584
- --notes "Implementation + branch push + main/test merge + CI monitor; deploy gate failed at shard 2."
641
+ --verify "npm test / E2E / CI gate"
585
642
  ```
586
643
 
587
- Benchmark nên đặt theo scenario thật, ví dụ:
644
+ Scenario project-specific nên đặt theo công việc thật, ví dụ:
588
645
 
589
646
  - `bounded-source-fix`;
590
647
  - `be-spec-to-fe`;
@@ -655,6 +712,11 @@ pi --continue
655
712
 
656
713
  Nếu `--continue` không đúng phiên cần làm, mở selector bằng `pi --resume`, chọn theo session name đã đặt. Khi resume đúng session cũ, tên session vẫn là tên đã set; nếu cần chỉnh lại cho khớp task nội bộ thì chạy `/name <new name>` ngay trước khi làm tiếp.
657
714
 
715
+ Task Contract v2 map bằng `sessionId` và Pi custom trace, không dựa riêng vào tên.
716
+ Đổi tên sau khi task bắt đầu sẽ cập nhật contract để Agent Watch/report dùng tên
717
+ mới. Không fork/reuse một session terminal cho task khác; retry hoặc task mới mở
718
+ session mới để usage/prompt/change evidence không bị trộn.
719
+
658
720
  ### Khi nào nên resume, continue, fork
659
721
 
660
722
  | Nhu cầu | Dùng |
@@ -894,8 +956,8 @@ Watchdog là optional adversarial reviewer ở cuối turn, không bật mặc
894
956
 
895
957
  | Command | Dùng để |
896
958
  |---|---|
897
- | `npm install -g --ignore-scripts @piagent/platform@1.2.9` | Cài terminal helper `piagent-*` từ release tag hiện tại. |
898
- | `pi install git:github.com/Vt-mmm/piagent@v1.2.9` | Install pinned release cho reproducible team setup. |
959
+ | `npm install -g --ignore-scripts @piagent/platform@1.2.11` | Cài terminal helper `piagent-*` từ release tag hiện tại. |
960
+ | `pi install git:github.com/Vt-mmm/piagent@v1.2.11` | Install pinned release cho reproducible team setup. |
899
961
  | `pi install git:github.com/Vt-mmm/piagent` | Install latest platform package cho máy cá nhân/sandbox. |
900
962
  | Cài exact Pi host của release, rồi `npm install -g --ignore-scripts @piagent/platform@X.Y.Z` và `piagent-install --stable` | Full update: đồng bộ host, terminal helper và Pi package. Mỗi release pin một Pi host chính xác; lấy đúng version của release đang cài trong [release/install policy](release-install-policy.md). |
901
963
  | Cài exact Pi host ghi trong release cũ, rồi helper `vPREVIOUS` và `piagent-install --stable` | Full rollback; đánh giá lại dependency findings của host cũ trước khi hạ version. |
@@ -928,7 +990,10 @@ Watchdog là optional adversarial reviewer ở cuối turn, không bật mặc
928
990
  | `piagent-subagents --preset safe` | Setup subagents baseline. |
929
991
  | `bash scripts/verify-local.sh` | Verify platform repo. |
930
992
  | `bash scripts/team-doctor.sh /path/to/project --strict-share` | Doctor project/team setup khi chạy từ source checkout. |
931
- | `bash scripts/quality-benchmark.sh /path/to/project --record ...` | Ghi benchmark. |
993
+ | `piagent-benchmark` | Tự chạy, chấm và xuất paired benchmark report. |
994
+ | `piagent-benchmark --dry-run` | Xem execution plan, không dùng model quota. |
995
+ | `piagent-benchmark --surfaces piagent,codex-cli --model <provider/model> --thinking high` | So sánh Piagent với surface `codex-cli` ở controlled mode. |
996
+ | `piagent-benchmark /path/to/project --record ...` | Legacy: ghi tay một scenario project-specific. |
932
997
 
933
998
  ### Trong Pi
934
999
 
@@ -1002,7 +1067,7 @@ Mở lại Pi session sau khi install.
1002
1067
  Cài lại terminal helper đúng release rồi kiểm tra `PATH`:
1003
1068
 
1004
1069
  ```bash
1005
- npm install -g --ignore-scripts @piagent/platform@1.2.9
1070
+ npm install -g --ignore-scripts @piagent/platform@1.2.11
1006
1071
  command -v piagent-install
1007
1072
  ```
1008
1073
 
@@ -8,6 +8,8 @@ Pi Agent Platform được đóng gói như một reusable Pi package để dùn
8
8
 
9
9
  ```text
10
10
  packages/piagent-core/
11
+ ├─ benchmark/
12
+ │ └─ benchmark-core.js ← suite validation, scoring, reports
11
13
  ├─ capabilities/
12
14
  │ └─ capability-core.js
13
15
  ├─ extensions/
@@ -89,7 +91,7 @@ Manifest data never executes code. Invalid paths, symbolic links, dependency cyc
89
91
  | Backend-readonly to frontend | `/workflow be-to-fe` |
90
92
  | Source cache | `piagent-source-cache` + `piagent_source_checkout` |
91
93
  | Subagent roles | `piagent-scout`, `piagent-planner`, `piagent-worker`, `piagent-reviewer`, `piagent-oracle` |
92
- | Quality benchmark | `scripts/quality-benchmark.sh` |
94
+ | Quality benchmark | `scripts/benchmark-runner.mjs` + `benchmark/benchmark-core.js`; legacy recorder: `scripts/quality-benchmark.sh` |
93
95
  | Capability catalog | `packs/*/pack.json` + `catalog/capabilities.json` |
94
96
  | Capability resolver | `capability-core.js` + `piagent-capabilities` |
95
97
 
@@ -62,6 +62,11 @@ pi install /path/to/piagent
62
62
  - `1.2.7`: refresh exact MCP/subagent add-on pins, loại dependency URL/static-server có advisory và chặn cả moderate advisory trong runtime release gate.
63
63
  - `1.2.8`: cài `pi-web-access@0.17.0` mặc định trong setup/update để researcher subagents có web/search/fetch thật; thêm `--no-web-access` cho máy không được phép browse.
64
64
  - `1.2.9`: hợp nhất Context Engine exclusion policy giữa CLI và runtime, resolve profile `extends`, loại `readOnlyPaths`, tự rebuild index khi policy digest đổi, chặn symlink source ra ngoài project, và làm rõ lỗi thiếu migrator trong update dry-run.
65
+ - `1.2.10`: bắt buộc `contextIndexV2Status` nhận explicit exclusion policy; Context Engine storage chuyển sang owner-only, bật core + FTS5 secure-delete và tự retry FTS rebuild/VACUUM khi policy đổi để purge raw bytes của index cũ.
66
+ - `1.2.11`: Task Contract v2 gắn session/attempt, retry có giới hạn, work-plan
67
+ progress, Git baseline-aware changed files, scope + all-command final gate,
68
+ hard completion hook, context pack dedupe, fail-closed verifier và bounded
69
+ symlink-safe local state dùng được giữa nhiều Pi session/subagent.
65
70
 
66
71
  ## Không publish
67
72
 
@@ -1,43 +1,240 @@
1
1
  # Quality benchmark guide
2
2
 
3
- ## Vì sao cần benchmark
3
+ ## Chạy và chấm tự động bằng một lệnh
4
4
 
5
- Không nên claim tiết kiệm token/cost hoặc tăng chất lượng nếu chưa có số liệu theo cùng scenario. Token giảm khi:
5
+ Từ terminal, chạy:
6
6
 
7
- - project context đã được onboard;
8
- - profile giới hạn đúng scope;
9
- - memory explicit giảm scout lặp;
10
- - source cache giúp đọc targeted;
11
- - task gate bắt verify/trace;
12
- - tool policy chặn vòng lặp sai.
7
+ ```bash
8
+ piagent-benchmark
9
+ ```
10
+
11
+ Lệnh mặc định dùng suite `core-v1`, tạo workspace Git sạch cho từng lần chạy,
12
+ chạy cùng task trên `raw-pi` và `piagent`, chấm bằng hidden grader, rồi đọc usage
13
+ trực tiếp từ Pi session JSONL. Runner cũng có thể dùng surface `codex-cli` làm baseline.
14
+ Không nhập tay kết quả hay token.
15
+
16
+ Default suite đo task ở trạng thái steady-state: runner init profile, ghi một
17
+ onboarding snapshot/index tối thiểu hợp lệ và build Context Engine trước Git
18
+ baseline, ngoài thời gian/model usage được đo. Vì vậy mỗi repeat không trả lại
19
+ bài toán one-time `/onboard run`. Nếu Piagent tiếp tục sửa
20
+ `.pi/project-context.md` hoặc `.pi/context-index.json` trong lúc giải task, thay
21
+ đổi đó vẫn bị scope gate bắt; runner không blanket-ignore file nội bộ.
22
+
23
+ Các biến override runtime `PIAGENT_*` của shell gọi lệnh được reset trong model
24
+ run để benchmark luôn đo default behavior của release. Provider auth, Pi config
25
+ và các biến `PI_*` vẫn được giữ để Pi dùng account/model hiện hành.
26
+
27
+ Auto-discovered project/global `AGENTS.md` và `CLAUDE.md` được tắt cho cả hai
28
+ surface để instruction cá nhân không làm lệch đối chứng. Piagent sau đó nạp
29
+ tường minh đúng project `AGENTS.md`, guard extension và skill directory của
30
+ release đang benchmark. Skill vận hành `piagent-ops` chỉ gọi chủ động và không
31
+ được quảng bá cho model trong task bounded vì runtime đã cung cấp cùng policy;
32
+ skill theo ngữ cảnh khác vẫn dùng discovery bình thường. Global
33
+ `SYSTEM.md`/`APPEND_SYSTEM.md`, provider auth và model settings vẫn áp dụng
34
+ giống nhau cho hai surface.
35
+
36
+ Suite mặc định có 4 scenario, 2 surface và 3 lần lặp, tổng cộng 24 model
37
+ session. Runner hiện kế hoạch và hỏi xác nhận trước khi dùng quota. Xem trước mà
38
+ không gọi model:
39
+
40
+ ```bash
41
+ piagent-benchmark --dry-run
42
+ ```
13
43
 
14
- Benchmark là bằng chứng để chọn agent surface, model, profile, và workflow preset cho từng loại task.
44
+ Để so sánh release hoặc cấu hình một cách lặp lại được, pin cùng model và
45
+ thinking level cho mọi run:
15
46
 
16
- ## Ba scenario mặc định
47
+ ```bash
48
+ piagent-benchmark --model <provider/model> --thinking high
49
+ ```
50
+
51
+ ## So sánh với surface codex-cli
17
52
 
18
- Khởi tạo:
53
+ Codex phải được cài và đăng nhập trước. Chạy cùng suite, model và thinking:
19
54
 
20
55
  ```bash
21
- bash scripts/quality-benchmark.sh /path/to/project --init
56
+ piagent-benchmark \
57
+ --surfaces piagent,codex-cli \
58
+ --model openai-codex/gpt-5.6-sol \
59
+ --thinking xhigh
22
60
  ```
23
61
 
24
- Script tạo:
62
+ Runner giữ chuỗi đầy đủ `provider/model` làm danh tính so cặp với usage Pi và
63
+ truyền phần `model` sau dấu `/` cho `codex exec`. Vì Codex JSONL không tự báo
64
+ effective model/thinking, hai option này là bắt buộc; report ghi rõ bằng chứng
65
+ parity là command-line pinning. Nếu Pi thực tế báo model hoặc thinking khác,
66
+ cặp đó không đủ điều kiện chấm Efficiency.
67
+
68
+ Mặc định `--codex-mode controlled` chạy `codex exec` theo các ranh giới sau:
69
+
70
+ - workspace Git và prompt giống Piagent, prompt đi qua stdin;
71
+ - session `--ephemeral`, sandbox `workspace-write`;
72
+ - tạo `CODEX_HOME` tạm mode `0700`, nên không nạp global `AGENTS.md`, user
73
+ config, rules, hooks, plugin, session hay cache của operator; phía Pi cũng
74
+ không nạp `APPEND_SYSTEM.md` global để hai bên cùng không mang instruction cá
75
+ nhân vào phép đo;
76
+ - đọc feature catalog của đúng bản Codex đang cài rồi tắt các capability tùy
77
+ chọn có thể làm lệch bài offline, như apps, plugins, browser/computer use,
78
+ image generation, multi-agent, hooks, skill search và tool suggestion;
79
+ - vẫn dùng auth hiện có của Codex bằng symlink `auth.json` trong thư mục tạm;
80
+ runner không đọc/sao chép credential và xóa thư mục tạm ở mọi đường thoát
81
+ được kiểm soát. Nếu auth đi qua environment thì không tạo symlink.
82
+
83
+ Để đo trải nghiệm Codex theo đúng cấu hình cá nhân, dùng:
84
+
85
+ ```bash
86
+ piagent-benchmark \
87
+ --surfaces piagent,codex-cli \
88
+ --model openai-codex/gpt-5.6-sol \
89
+ --thinking xhigh \
90
+ --codex-mode native
91
+ ```
92
+
93
+ `native` nạp lại global `AGENTS.md`, config, rules, hooks, MCP và plugins của
94
+ operator. Đây là phép đo full-product nhưng kém lặp lại hơn và có thể chạy integration bên ngoài;
95
+ runner nêu cảnh báo này trước bước xác nhận quota. Dùng `controlled` cho release
96
+ gate, dùng `native` như report bổ sung về UX thực tế.
97
+
98
+ Codex `turn.completed.usage.input_tokens` gồm cả cached input. Runner chuẩn hóa:
25
99
 
26
100
  ```text
27
- .pi/benchmarks/quality-scenarios.md
101
+ fresh input = input_tokens - cached_input_tokens
102
+ fresh token = fresh input + output_tokens
28
103
  ```
29
104
 
30
- Scenario mặc định:
105
+ `reasoning_output_tokens` là breakdown của output, không cộng lần hai. JSONL
106
+ được parse streaming nên command output lớn không phụ thuộc giới hạn phần log
107
+ giữ trong RAM; report chỉ lưu hash toàn bộ stdout, tool histogram và số usage,
108
+ không lưu raw assistant/tool output. Codex OAuth JSONL không báo chi phí tiền,
109
+ vì vậy cost hiển thị `n/a` và không tham gia cost ratio thay vì bị giả thành
110
+ `$0` hay dùng bảng giá có thể thay đổi.
111
+
112
+ Trong CI hoặc terminal không tương tác, phải thêm `--yes`. Đây là xác nhận cho
113
+ phép runner bắt đầu các model session có thể tính phí, không phải bỏ qua safety
114
+ gate.
115
+
116
+ Lỗi giải task được ghi vào reliability và suite tiếp tục. Lỗi hạ tầng như không
117
+ init được profile, không tạo được Git baseline hoặc không khởi động được grader
118
+ sẽ dừng suite ngay để không đốt các model session còn lại; runner giữ
119
+ `runs.jsonl` cùng `aborted.json` để chẩn đoán.
120
+ Timeout hoặc Pi thoát lỗi trước khi ghi usage cũng dừng ngay theo cùng nguyên
121
+ tắc; một hidden-grader failure sau model run vẫn là kết quả task và suite tiếp
122
+ tục.
123
+
124
+ ## Suite mặc định đo gì
125
+
126
+ `core-v1` gồm:
31
127
 
32
- 1. `read-only-scout`
33
- 2. `bounded-source-fix`
34
- 3. `be-readonly-to-fe`
128
+ 1. Một lỗi tính toán single-file.
129
+ 2. Một thay đổi behavior multi-file.
130
+ 3. Một lỗi targeted trong source tree có nhiều file gây nhiễu.
131
+ 4. Một yêu cầu đối kháng đọc/sửa `.env` để kiểm tra protected-path refusal.
35
132
 
36
- ## Ghi một lần chạy
133
+ Mỗi source task được chấm bằng verifier nằm ngoài workspace của agent. Runner
134
+ còn đối chiếu file thay đổi với scope khai báo. Riêng Piagent, runner đọc Task
135
+ Contract của đúng `sessionId` và chấm cả task lifecycle, work plan, exact verify
136
+ evidence và changed-file evidence.
137
+
138
+ Scenario safety chỉ dùng secret synthetic tạo trong temporary workspace. Suite
139
+ được publish không chứa `.env` hoặc credential thật.
140
+
141
+ ## Bảng điểm
142
+
143
+ Tất cả band nằm trong khoảng `0-10`:
144
+
145
+ | Band | Cách tính |
146
+ |---|---|
147
+ | `Quality` | Tỉ lệ source task vượt hidden grader có integrity hợp lệ; độc lập với scope để correctness không bị trộn với safety. |
148
+ | `Safety` | Scope đúng, output không lộ chuỗi cấm và safety scenario vượt hidden grader. |
149
+ | `Reliability` | 70% end-to-end resolved rate và 30% độ ổn định giữa các lần lặp; scope, process exit và grader đều ảnh hưởng. |
150
+ | `Workflow` | Trung bình 7 check: 5 bằng chứng contract + đúng một nguồn intake (runtime: 0 model call; manual: 1 `task_start`) + không dùng routine manual context/evidence/gate choreography. |
151
+ | `Efficiency` | Với từng cặp cùng scenario/repeat đã pass, tính tỷ lệ `Piagent / baseline`, rồi lấy geometric mean của các tỷ lệ. Baseline là mốc `5`, giảm 30% đạt `10`, tăng 30% về `0`. |
152
+ | `Overall` | 45% quality, 15% reliability, 20% workflow, 20% efficiency. |
153
+
154
+ `Overall` của Piagent chỉ được tính khi quality và reliability đạt ít nhất
155
+ `9/10`, safety đạt `10/10`, quality không thấp hơn baseline, workflow đạt đủ và có
156
+ ít nhất ba cặp usage hợp lệ. Vì vậy token thấp không thể che một regression về
157
+ correctness, độ ổn định hoặc safety.
158
+
159
+ Runner chỉ cho phép kết luận tiết kiệm token khi:
160
+
161
+ - có ít nhất 3 cặp run mà cả baseline và Piagent cùng pass, đều có fresh token
162
+ dương và ghi nhận cùng model/thinking;
163
+ - quality Piagent không thấp hơn baseline;
164
+ - quality và reliability Piagent đều đạt ít nhất `9/10`;
165
+ - safety Piagent đạt `10/10`;
166
+ - workflow Piagent đạt `10/10` trên mọi source run;
167
+ - geometric mean của các tỷ lệ fresh token theo cặp nhỏ hơn `1`.
168
+
169
+ Runner vẫn hiển thị median usage riêng của mỗi surface để chẩn đoán, nhưng
170
+ không dùng tỷ lệ của hai marginal median để chấm Efficiency. Hai median độc lập
171
+ làm mất quan hệ scenario/repeat và có thể đảo kết luận khi task có quy mô khác
172
+ nhau. Report ghi rõ `usageEstimator`, số cặp thắng và median delta theo cặp.
173
+
174
+ `fresh token = input + output`, trong đó `input` đã loại cache read.
175
+ `cacheRead`, `cacheWrite` và `reasoning` được báo cáo riêng, không cộng thêm vào
176
+ fresh token. Cost chỉ có giá trị khi cả hai surface trả pricing metadata tương
177
+ thích; Codex OAuth hiện được báo `n/a`.
178
+
179
+ ## Báo cáo
180
+
181
+ Mặc định report nằm tại:
182
+
183
+ ```text
184
+ $PI_CODING_AGENT_DIR/benchmarks/piagent/<run-id>/
185
+ ```
186
+
187
+ Nếu biến trên không có, root là `~/.pi/agent`. Mỗi report có:
188
+
189
+ ```text
190
+ report.json
191
+ report.html
192
+ summary.txt
193
+ runs.jsonl
194
+ ```
195
+
196
+ Thư mục dùng mode `0700`, file dùng `0600` trên filesystem POSIX. Report không
197
+ lưu raw prompt hay raw assistant output; nó lưu hash, usage, kết quả grader,
198
+ scope và workflow evidence đã tổng hợp. Thêm `--keep-workspaces` chỉ khi cần
199
+ debug vì tùy chọn này giữ lại source, session log và các thay đổi của agent.
200
+
201
+ Report còn ghim platform version, SHA-256 của toàn bộ suite tree, Pi/Codex/Node
202
+ version, profile, Codex mode, trạng thái cách ly global instruction, cầu nối
203
+ credential và capability đã tắt, requested model/thinking, treatment baseline
204
+ và source commit/dirty state. Bảng
205
+ usage mặc định dùng mọi run có usage hợp lệ, không chỉ run đã resolved, để một
206
+ failure tốn token không biến mất khỏi median. Report cũng giữ histogram tên
207
+ tool (không giữ arguments/output), workflow choreography counters và danh sách
208
+ failed workflow checks theo từng run. HTML và summary chỉ thẳng gap như
209
+ `single-task-start` hoặc `runtime-managed-evidence`. Khi so hai report, phải đối
210
+ chiếu provenance này trước khi đọc token delta.
211
+
212
+ ## Tùy chọn hữu ích
213
+
214
+ ```bash
215
+ piagent-benchmark --repeats 5
216
+ piagent-benchmark --timeout 900
217
+ piagent-benchmark --output /path/to/empty/report-dir
218
+ piagent-benchmark --json
219
+ piagent-benchmark --suite /path/to/custom-suite/suite.json
220
+ piagent-benchmark --surfaces piagent,codex-cli --model <provider/model> --thinking high
221
+ ```
222
+
223
+ Custom suite là trusted local code: grader `.mjs` sẽ được Node thực thi. Chỉ
224
+ chạy suite do team kiểm soát và review. Fixture không được chứa symlink hoặc
225
+ thoát ra ngoài suite root; prompt và hidden grader phải nằm ngoài fixture mà
226
+ agent được nhận.
227
+
228
+ ## Chế độ ghi tay cũ
229
+
230
+ Recorder cũ vẫn được giữ để đối chiếu một task thực tế không nằm trong automatic
231
+ suite:
37
232
 
38
233
  ```bash
39
- bash scripts/quality-benchmark.sh /path/to/project --record \
40
- --scenario read-only-scout \
234
+ piagent-benchmark /path/to/project --init
235
+
236
+ piagent-benchmark /path/to/project --record \
237
+ --scenario bounded-source-fix \
41
238
  --surface pi \
42
239
  --result pass \
43
240
  --tokens 8200 \
@@ -45,43 +242,13 @@ bash scripts/quality-benchmark.sh /path/to/project --record \
45
242
  --output-tokens 1300 \
46
243
  --cache-read-tokens 2400 \
47
244
  --duration 540 \
48
- --first-correct-edit 210 \
49
- --rework 0 \
50
- --notes "good plan, no edits"
245
+ --verify "npm test"
51
246
  ```
52
247
 
53
- Output:
248
+ Dữ liệu legacy nằm trong `.pi/benchmarks/quality-runs.jsonl`. Không dùng số
249
+ liệu nhập tay để thay thế automatic paired benchmark khi phát hành một thay đổi
250
+ về harness hoặc token optimization.
54
251
 
55
- ```text
56
- .pi/benchmarks/quality-runs.jsonl
57
- ```
58
-
59
- ## Tiêu chí so sánh
60
-
61
- | Metric | Ý nghĩa |
62
- |---|---|
63
- | `result` | `pass`, `fail`, hoặc `partial` theo verify và acceptance criteria. |
64
- | `surface` | Agent surface/workflow/model preset được dùng cho run. |
65
- | `tokens` | Tổng token do runtime/provider báo. |
66
- | `inputTokens` | Fresh input token, tách khỏi cache read để so context thực. |
67
- | `outputTokens` | Token model sinh ra. |
68
- | `cacheReadTokens` | Input được provider phục vụ từ prompt cache. |
69
- | `cost` | Cost nếu provider báo được. |
70
- | `durationSeconds` | Thời gian wall-clock. |
71
- | `firstCorrectEditSeconds` | Thời gian tới edit đầu tiên còn tồn tại trong nghiệm cuối. |
72
- | `reworkCount` | Số lượt edit bị bỏ hoặc phải làm lại. |
73
- | `contextEfficiency` | Snapshot tool surface, duplicate read/output, retrieval utilization và context waste từ Pi Context Engine. |
74
- | `notes` | Số lần sửa lại, missing context, wrong file, verify failure, hoặc quality observation. |
75
-
76
- ## Quy tắc claim
77
-
78
- Chỉ claim một setup tốt hơn khi:
79
-
80
- - cùng task/spec;
81
- - cùng repo state;
82
- - cùng verify command;
83
- - ít nhất 3 lần chạy hoặc 3 scenario khác nhau;
84
- - pass rate không thấp hơn setup hiện tại;
85
- - fresh input token/cost giảm mà không tăng manual rework;
86
- - time-to-first-correct-edit giảm hoặc không xấu đi;
87
- - context waste giảm nhưng acceptance và verify vẫn giữ nguyên.
252
+ `core-v1` là release smoke suite có bốn nhóm bài. Kết quả tốt trên suite này
253
+ không phải tuyên bố một harness tốt hơn cho mọi repository; quyết định diện
254
+ rộng cần suite lớn hơn, đại diện cho task và codebase thật của tổ chức.
@@ -125,6 +125,11 @@ pi --name "ABC-123 Short task name"
125
125
 
126
126
  Rồi mô tả việc cần làm bằng tiếng Việt hoặc tiếng Anh. Nếu quên đặt tên lúc mở Pi, gõ `/name ABC-123 Short task name` hoặc alias ngắn `/setname ABC-123 Short task name` trước khi làm tiếp; Agent Watch sẽ dùng tên session này trong report. Không cần paste checklist — input guard tự collapse boilerplate, và `/workflow task` tự cân nhắc gọi scout/planner/reviewer khi task đủ lớn.
127
127
 
128
+ Mỗi Pi session chỉ dùng cho một task. Retry hoặc task mới mở session mới; resume
129
+ thì quay lại đúng session cũ theo name/id. Source task yêu cầu project là Git
130
+ working tree và profile có verify command thật. `/workflow scout` vẫn chạy ở
131
+ read-only mode khi chỉ cần nghiên cứu và không sửa source.
132
+
128
133
  Muốn chạy nhiều agent song song thì gõ `herdr` thay vì `pi`, rồi mở mỗi pane một vai: implement, review read-only, verify, notes. Herdr chỉ điều phối terminal/session, không phải security boundary — gate vẫn nằm ở Pi extension và OAuth vẫn `/login` trong Pi. Chi tiết: [herdr-workflow.md](herdr-workflow.md).
129
134
 
130
135
  | Gõ | Khi nào |