@manhd_d/ai-harness 0.14.0 → 0.15.0

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 (93) hide show
  1. package/CHANGELOG.md +43 -0
  2. package/README.md +21 -9
  3. package/adapters/react-native/adapter.yaml +1 -1
  4. package/adapters/react-native/skills/harness-react-native-behavior-testing/SKILL.md +9 -0
  5. package/adapters/react-nextjs/adapter.yaml +1 -1
  6. package/adapters/react-nextjs/skills/harness-react-nextjs-behavior-testing/SKILL.md +9 -0
  7. package/capabilities/product/capability.json +1 -1
  8. package/capabilities/product/workflows/idea-to-prd.md +15 -0
  9. package/capabilities/product/workflows/idea-to-prd.workflow.json +82 -0
  10. package/cli/adapters.js +1 -1
  11. package/cli/agents.js +14 -5
  12. package/cli/capabilities.js +2 -1
  13. package/cli/end-user.js +30 -0
  14. package/cli/environment.js +2 -0
  15. package/cli/evaluation-contract.js +11 -1
  16. package/cli/files.js +7 -2
  17. package/cli/harness.js +53 -11
  18. package/cli/journey-evidence.js +34 -0
  19. package/cli/kiro.js +15 -0
  20. package/cli/knowledge.js +104 -0
  21. package/cli/main.js +60 -22
  22. package/cli/portable-config.js +6 -3
  23. package/cli/project-decisions.js +47 -0
  24. package/cli/readiness.js +82 -41
  25. package/cli/setup.js +66 -0
  26. package/cli/skill-requirements.js +47 -0
  27. package/cli/start.js +15 -2
  28. package/cli/structured.js +65 -0
  29. package/cli/sync-integrations.js +49 -0
  30. package/cli/verification-report.js +9 -5
  31. package/cli/verification.js +7 -2
  32. package/cli/workflow.js +76 -0
  33. package/core/agents/orchestrator.md +1 -1
  34. package/core/agents/test-engineer.md +4 -2
  35. package/core/checks/verification.json +12 -0
  36. package/core/evals/cases.json +75 -1
  37. package/core/rules/context.md +9 -0
  38. package/core/skills/harness-end-user-testing/SKILL.md +55 -0
  39. package/core/skills/harness-review/SKILL.md +4 -0
  40. package/core/skills/harness-spec/SKILL.md +3 -1
  41. package/core/skills/harness-start/SKILL.md +66 -0
  42. package/core/skills/harness-verification/SKILL.md +2 -0
  43. package/core/workflows/adaptive-verification.md +5 -0
  44. package/core/workflows/agent-routing.md +6 -0
  45. package/core/workflows/approvals.schema.json +62 -0
  46. package/core/workflows/clarification.md +6 -1
  47. package/core/workflows/continuous-development.md +5 -0
  48. package/core/workflows/end-user-acceptance.md +36 -0
  49. package/core/workflows/greenfield-setup.md +27 -0
  50. package/core/workflows/project-setup.md +13 -2
  51. package/core/workflows/seed.md +25 -0
  52. package/core/workflows/spec-to-code.md +19 -8
  53. package/core/workflows/spec-to-code.workflow.json +99 -0
  54. package/core/workflows/workflow.schema.json +113 -0
  55. package/docs/README.md +8 -0
  56. package/docs/adaptive-verification.md +10 -1
  57. package/docs/agent-configuration.md +7 -0
  58. package/docs/agent-handoffs.md +6 -1
  59. package/docs/architecture.md +43 -3
  60. package/docs/cli.md +39 -4
  61. package/docs/configuration-backup.md +10 -2
  62. package/docs/conformance-runner.md +64 -0
  63. package/docs/end-to-end-workflow.md +4 -0
  64. package/docs/end-user-testing.md +128 -0
  65. package/docs/frontend-mobile.md +7 -0
  66. package/docs/getting-started.md +17 -5
  67. package/docs/harness-maintenance.md +1 -0
  68. package/docs/i18n/README.es.md +17 -7
  69. package/docs/i18n/README.vi.md +18 -8
  70. package/docs/i18n/README.zh-CN.md +17 -7
  71. package/docs/project-configuration.md +6 -0
  72. package/docs/python-installation.md +85 -0
  73. package/docs/session-onboarding.md +215 -0
  74. package/docs/skill-matrix.md +5 -3
  75. package/docs/start.md +7 -2
  76. package/docs/tool-setup/README.md +13 -14
  77. package/docs/tool-setup/claude-code.md +10 -0
  78. package/docs/tool-setup/codex.md +10 -0
  79. package/docs/tool-setup/copilot.md +10 -0
  80. package/docs/tool-setup/cursor.md +10 -0
  81. package/docs/tool-setup/gemini-cli.md +10 -0
  82. package/docs/tool-setup/kiro.md +112 -38
  83. package/docs/versioning.md +56 -0
  84. package/docs/workflow-contract.md +66 -0
  85. package/evals/README.md +7 -0
  86. package/harness.yaml +13 -1
  87. package/package.json +7 -3
  88. package/scripts/conformance-runner.js +119 -0
  89. package/scripts/score-eval.js +3 -1
  90. package/templates/AGENTS.md +6 -1
  91. package/templates/decisions.json +4 -0
  92. package/templates/local.md +21 -0
  93. package/templates/openspec/approvals.json +5 -0
@@ -0,0 +1,113 @@
1
+ {
2
+ "type": "object",
3
+ "additionalProperties": false,
4
+ "properties": {
5
+ "schema_version": {
6
+ "const": 1
7
+ },
8
+ "id": {
9
+ "type": "string",
10
+ "pattern": "^[a-z][a-z0-9]*(?:-[a-z0-9]+)*$"
11
+ },
12
+ "stages": {
13
+ "type": "array",
14
+ "minItems": 1,
15
+ "maxItems": 64,
16
+ "items": {
17
+ "type": "object",
18
+ "additionalProperties": false,
19
+ "properties": {
20
+ "id": {
21
+ "type": "string",
22
+ "pattern": "^[a-z][a-z0-9]*(?:-[a-z0-9]+)*$"
23
+ },
24
+ "owner": {
25
+ "type": "string",
26
+ "pattern": "^[a-z][a-z0-9-]*:[a-z][a-z0-9-]*$"
27
+ },
28
+ "outputs": {
29
+ "type": "array",
30
+ "maxItems": 64,
31
+ "uniqueItems": true,
32
+ "items": {
33
+ "type": "string",
34
+ "pattern": "^(?!/)(?!.*(?:^|/)\\.{1,2}(?:/|$))(?!.*//)[A-Za-z0-9._/-]+$"
35
+ }
36
+ },
37
+ "next": {
38
+ "type": "array",
39
+ "maxItems": 64,
40
+ "uniqueItems": true,
41
+ "items": {
42
+ "type": "string",
43
+ "pattern": "^[a-z][a-z0-9]*(?:-[a-z0-9]+)*$"
44
+ }
45
+ },
46
+ "on_reject": {
47
+ "type": "string",
48
+ "pattern": "^[a-z][a-z0-9]*(?:-[a-z0-9]+)*$"
49
+ },
50
+ "on_fail": {
51
+ "type": "string",
52
+ "pattern": "^[a-z][a-z0-9]*(?:-[a-z0-9]+)*$"
53
+ },
54
+ "entry_gate": {
55
+ "type": "object",
56
+ "additionalProperties": false,
57
+ "properties": {
58
+ "deterministic": {
59
+ "type": "array",
60
+ "maxItems": 64,
61
+ "uniqueItems": true,
62
+ "items": {
63
+ "enum": [
64
+ "spec-structure",
65
+ "decisions-resolved",
66
+ "tasks-present",
67
+ "tasks-complete",
68
+ "verification-evidence",
69
+ "artifact-impact",
70
+ "outputs-present"
71
+ ]
72
+ }
73
+ },
74
+ "approval_from": {
75
+ "type": "string"
76
+ }
77
+ },
78
+ "required": []
79
+ },
80
+ "approval": {
81
+ "type": "object",
82
+ "additionalProperties": false,
83
+ "properties": {
84
+ "role": {
85
+ "enum": [
86
+ "spec-owner",
87
+ "product-owner",
88
+ "reviewer"
89
+ ]
90
+ }
91
+ },
92
+ "required": [
93
+ "role"
94
+ ]
95
+ }
96
+ },
97
+ "required": [
98
+ "id",
99
+ "owner",
100
+ "next"
101
+ ]
102
+ }
103
+ }
104
+ },
105
+ "required": [
106
+ "schema_version",
107
+ "id",
108
+ "stages"
109
+ ],
110
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
111
+ "$id": "https://github.com/manh0303/ai-harness/workflow.schema.json",
112
+ "description": "Shape contract. Consumers also validate unique stage IDs, registered owners, transitions, forward DAG and approval sources."
113
+ }
package/docs/README.md CHANGED
@@ -48,3 +48,11 @@ See [Adaptive verification and TechSpec](adaptive-verification.md) for read-only
48
48
 
49
49
  - [Start theo input hiện có](start.md)
50
50
  - [Lưu cấu hình, backup, cài lại và chuyển dự án](configuration-backup.md)
51
+
52
+ - [Kiểm thử như người dùng thật: browser/device/CLI/API](end-user-testing.md)
53
+
54
+ - [Session onboarding, seed, prerequisites và role extensions](session-onboarding.md)
55
+
56
+ - [pip/offline installation](python-installation.md)
57
+ - [Workflow contracts and approval records](workflow-contract.md)
58
+ - [Opt-in conformance runner](conformance-runner.md)
@@ -40,7 +40,7 @@ Evidence is `{path,sha256}` with a real local regular file, maximum 1 MiB. Asser
40
40
 
41
41
  Supported operators: equal, not-equal, contains, type. Layers: transport, schema, business, state, authorization, result. Assertion basis must reference the scenario's requirement. Optional typed observed must match raw JSON. Expected values come from reviewed AC/contracts, never copied from observations just to pass.
42
42
 
43
- PASSED requires successful execution receipt, nonempty matching assertions, allowed error semantics and successful mutation cleanup. API/backend-e2e/business-workflow/authorization/security also require a nontransport assertion. `error: {kind,message}` distinguishes timeout/network/http/application/assertion/environment. `expected_error` can only name http/application and still needs assertions; arbitrary catch is never success. Contradictory status is rejected. FAILED dominates the overall result, then BLOCKED, then NOT_RUN or missing coverage. A requirement is VERIFIED only if all its linked scenarios pass; otherwise UNVERIFIED. Empty coverage cannot pass.
43
+ PASSED requires successful execution receipt, nonempty matching assertions, allowed error semantics and successful mutation cleanup. API/backend-e2e/business-workflow/authorization/security/browser-e2e/mobile-e2e/cli-e2e also require a nontransport assertion. `error: {kind,message}` distinguishes timeout/network/http/application/assertion/environment. `expected_error` can only name http/application and still needs assertions; arbitrary catch is never success. Contradictory status is rejected. FAILED dominates the overall result, then BLOCKED, then NOT_RUN or missing coverage. A requirement is VERIFIED only if all its linked scenarios pass; otherwise UNVERIFIED. Empty coverage cannot pass.
44
44
 
45
45
  Digests detect evidence drift. Execution receipts and semantic layer labels are producer-declared: validation does not authenticate that a command ran, a requirement is correct, cleanup truly occurred or the recorded revision matches source. Independently inspect raw logs/source and business assertions. Redact secrets before reports; automatic credential screening is limited and does not replace review. Paths/symlinks and oversized evidence fail safely.
46
46
 
@@ -57,3 +57,12 @@ Use test-owned UUIDs and isolated fixtures, bounded retries/timeouts and cleanup
57
57
  Live agent evaluation is BLOCKED until an intended host/model and authorized budget are available. Reuse Core/Product cases via `aih eval --scope all` and the existing eval rubric; run the same requirement/code fixtures with baseline and candidate, record versions and raw evidence, compare success, denied effects, gaps, measured latency/tokens/cost. Unscored cases remain unscored. See [evaluation guide](../evals/README.md).
58
58
 
59
59
  Reference review reused generic lifecycle, role/state/error and selective-maintenance patterns. Hardcoded project ports/accounts, database mutation snippets, kill-by-port, false expected-error success and CRM-specific contracts were deliberately excluded.
60
+
61
+ ## End-user verification target
62
+
63
+ For user-facing acceptance, use [End-user testing](end-user-testing.md). Adaptive discovery now exports
64
+ end_user_acceptance hints and a host handoff. Requirement verification_target=end-user requires a
65
+ web/mobile/cli/api surface; a matching passing journey using actual interface interaction and
66
+ real/not-applicable dependencies must exist. Mock/unknown or another interface cannot satisfy it.
67
+ Existing behavior-only schema-1 reports remain valid. Optional journey attachments use separate
68
+ bounded binary digests rather than JSON assertion evidence; the guide defines limits and semantics.
@@ -101,3 +101,10 @@ budget meter is inferred from model tiers, maxRounds or concurrency. See [Agent
101
101
  ## Agent-first defaults and declarations (unreleased)
102
102
 
103
103
  New seeds use host/host-default so the actual host model remains selected; old agents.json is preserved. Claude host init offers native aliases only when absent. aih agents resolves canonical role IDs and required/optional skill preferences. Optional execution.autonomy and execution.budget are validated declarations, not execution permission or quota enforcement. Checkpoint real usage or unknown; never infer cost or auto-escalate. See [Agent-first guide](agent-first.md).
104
+
105
+ ## Project role extensions
106
+
107
+ Role overrides can add `extensions: ["plugins/project/agents/security-reviewer.md"]`.
108
+ `aih agents` exports core-first contract_load_order and blocks missing extensions. The host loads
109
+ them in order, preserving core security and reconciling conflicts. Extensions do not transfer to
110
+ another project. See [session contracts](session-onboarding.md#role-extensions).
@@ -22,7 +22,7 @@ including reused public APIs and unavailable browser/native checks; retain the s
22
22
  | [documentation](../core/agents/documentation.md) | Verified sources and decisions | Source-linked document diff and quality evidence | Invent approval or unperformed verification |
23
23
  | [planner](../core/agents/planner.md) | Scope, approved requirements, repo map | OpenSpec design/tasks/test outline | Implement ngoài scope |
24
24
  | [implementer](../core/agents/implementer.md) | Spec, tasks, repo, adapter | Code slice và actual test evidence | Merge/deploy |
25
- | [test-engineer](../core/agents/test-engineer.md) | AC, diff, contracts | Test scenarios, executed results/gaps | Tuyên bố pass khi chưa chạy |
25
+ | [test-engineer](../core/agents/test-engineer.md) | AC, diff, contracts | Actual user journeys, outcomes/evidence, real/mocked scope and blockers | Tuyên bố pass khi chưa chạy |
26
26
  | [security-reviewer](../core/agents/security-reviewer.md) | Auth/data scope/tools/migration | Threats, mitigations và review findings | Bỏ qua chính sách quyền |
27
27
  | [reviewer](../core/agents/reviewer.md) | Diff, spec, findings/evidence | Review recommendation và residual risk | Tự merge PR |
28
28
 
@@ -108,3 +108,8 @@ Use [Continuous development](continuous-development.md). Store baseline/tested r
108
108
  ## Agent-first routing and PM aliases
109
109
 
110
110
  [Canonical Project Manager](../core/agents/project-manager.md) owns delivery. Product/Delivery PM IDs are compatibility aliases; route by canonical_id, not separate workers. Analysis/Discovery agents use canonical Product contracts above. Preferred skills are explicit; optional perspectives need not be installed. See [Agent-first migration](agent-first.md).
111
+
112
+ For end-user QA, the existing test-engineer uses Core harness-end-user-testing and
113
+ [end-user acceptance](end-user-testing.md). Pass app entry/environment, actor references, AC surface,
114
+ actual interactions/outcomes, redacted trace/screenshot/report digests, dependency scope and cleanup.
115
+ These receipts do not supply business-owner UAT approval or model-compliance evaluation.
@@ -3,7 +3,8 @@
3
3
  Maintainer entry point: [Harness maintenance and impact matrix](harness-maintenance.md).
4
4
 
5
5
  AI Harness is a versioned instruction and workflow distribution framework. Its executable part is a
6
- local installer and integrity checker. It is not an LLM gateway, an orchestration server or a sandbox.
6
+ local installer and integrity checker, with a separate opt-in conformance host driver.
7
+ It is not an LLM gateway, an orchestration server or a sandbox.
7
8
 
8
9
  | Layer | Responsibility | Owner |
9
10
  | --- | --- | --- |
@@ -69,9 +70,11 @@ See docs/adapters.md for the strict JSON-compatible YAML contract. Detection is
69
70
  checks are advisory and never executed. Installed capabilities are read from the locked snapshot, not
70
71
  from the latest global CLI source. Core TDD/debug/review are not duplicated in adapters.
71
72
 
72
- ## npm distribution
73
+ ## npm and Python distribution
73
74
  The package exposes bin/aih.js as `aih`. It uses native JavaScript ES modules and Node.js built-ins:
74
- there is no Python bridge, transpilation step, runtime dependency, network client or install hook.
75
+ the npm executable has no runtime dependency, network client or install hook. The pip distribution
76
+ adds a thin Python launcher for the same JavaScript CLI; Node.js 22+ remains required. Its wheel
77
+ contains the shared package allowlist, with no npm/npx invocation or Python runtime dependencies.
75
78
  Source paths resolve relative to the package, not cwd. The target defaults to cwd. Local node_modules
76
79
  installation is an explicit exception to overlap rejection; payload destinations never include node_modules.
77
80
  The npm files allowlist ships runtime assets including the hidden OpenSpec template. A smoke test packs
@@ -166,3 +169,40 @@ saves a before-backup through the same installation guard/rollback machinery. Tr
166
169
  project/agent preferences and removes repository autonomy. No credentials, machine paths, locked
167
170
  payload, custom skills or checkpoint/document contents are exported. Full repo recovery remains Git
168
171
  and external-source backup. See [Configuration backup](configuration-backup.md).
172
+
173
+ ## End-user acceptance
174
+
175
+ Core test-engineer routes public journeys to harness-end-user-testing and the end-user-acceptance
176
+ workflow. Adaptive CLI exports tool/surface hints only; the host executes actual interfaces. Optional
177
+ schema-1 journey declarations and bounded binary attachment digests qualify explicitly requested
178
+ end-user requirements by matching surface and dependency scope. Receipts are producer declarations,
179
+ not authenticated browser/model execution or UAT approval. No browser dependency/runner enters the CLI.
180
+ See [End-user testing](end-user-testing.md).
181
+
182
+ ## Session onboarding and Kiro bridge (unreleased)
183
+
184
+ Core harness-start delegates semantic seed/questions to the host. Optional local.md frontmatter is
185
+ bounded YAML/JSON; legacy prose is preserved. CLI seed stores local source/config hashes in project
186
+ knowledge.json outside the managed lock. --host kiro installs locked native wrappers and SessionStart
187
+ v1; requires are read-only prerequisites, extensions are host loading plans, MCP sync imports aliases
188
+ only. No model/runtime, provider probe, network or shell execution. See [contracts](session-onboarding.md).
189
+
190
+ setup stays read-only by default; setup --apply restores missing shared seeds from the locked installed
191
+ snapshot without changing managed assets or lock. It validates existing and proposed config before
192
+ transactional writes. Optional project-owned decisions.json separates confirmed/proposed/superseded
193
+ project/module choices from per-change decisions. Config backup retains shared decisions, transfer
194
+ omits them, and context freshness includes their digest. Compact start provides orientation only,
195
+ with freshness unchecked. None of these declarations grant permission or prove live host compliance.
196
+
197
+ ## Contract, driver and evidence planes
198
+
199
+ | Plane | Harness responsibility | Execution owner |
200
+ | --- | --- | --- |
201
+ | Contract | Workflow stage/entry gate/role/artifact declarations | Harness owns schema; host applies semantics |
202
+ | Driver | Optional separate conformance script; no execution in cli/ | Host or replaceable engine such as Temporal |
203
+ | Evidence | Evaluation/verification/approval record formats | Producer/reviewer owns truth and identity |
204
+
205
+ core:orchestrator is a role, not an engine. JSON contracts currently cover spec-to-code and selected
206
+ Product idea-to-prd; validation/entry readiness neither executes stages nor authenticates approval.
207
+ See [workflow contracts](workflow-contract.md), [conformance driver](conformance-runner.md), and
208
+ [pip/offline distribution](python-installation.md). The non-goal remains: no LLM gateway or server.
package/docs/cli.md CHANGED
@@ -13,10 +13,11 @@ Exit 0 means the requested operation succeeded; 1 means validation/I/O/drift fai
13
13
  | verify | --scope adapters/core/capabilities/all or --adaptive or --report file | Advisory checks, metadata plan or evidence consistency; executed false, no subprocesses |
14
14
  | eval | --scope adapters/core/capabilities/all; --report FILE | Emit unscored template or aggregate reviewed report; no model calls |
15
15
  | init | --detect OR --adapters a,b; --capabilities a,b; --agent-preset recommended/economy/custom; --source; --dry-run; --allow-major | Install a snapshot and seed project agent preferences; exact rerun without explicit preset is idempotent |
16
- | update | --source; --dry-run; --allow-major | Update unedited owned files and seed missing project files |
16
+ | update | --host kiro (optional); --source; --dry-run; --allow-major | Update unedited owned files and seed missing project files |
17
17
  | check | none | Compare installed files/block with lock and selection; no writes |
18
- | doctor | none | check plus configured environment/path diagnostics and generic PATH hints; no execution |
19
- | setup | --host codex/claude-code/gemini-cli/cursor/copilot/custom-ID (optional) | Read-only question and agent-routing plan; skips tool-selection suggestions when tools are configured |
18
+ | doctor | --skill NAME (optional) | check plus configured environment/path diagnostics and generic PATH hints; no execution |
19
+ | setup | --host; --apply [--dry-run]; --greenfield | Read-only by default; --apply creates missing user config from installed templates without reinstalling the snapshot |
20
+ | decisions | --scope project/module:name (optional) | Read confirmed/proposed/superseded shared choices; project scope is included in module results; no approval or writes |
20
21
  | artifacts | none | Report declared inputs/outputs/storage/write policy and host connection aliases; no discovery or tool calls |
21
22
  | ready ID | --stage implement/review | Structural readiness; blocked returns exit 1, ready returns exit 0; no business approval |
22
23
  | new-change ID | none | Create an unapproved OpenSpec draft using installed templates |
@@ -170,7 +171,7 @@ aih agents shows canonical IDs, skill preferences and model declarations. init -
170
171
  | --- | --- |
171
172
  | `aih start` | Terminal: intake ngắn; không TTY: read-only plan; trả host_prompt |
172
173
  | `aih start --goal docs --task "Implement requirements" --input docs/requirements --output docs/specs` | Lưu task và seed nguồn/output còn thiếu |
173
- | `aih backup [--output backups/config.json]` | Export 8 file cấu hình dùng chung; không ghi đè archive |
174
+ | `aih backup [--output backups/config.json]` | Export tối đa 9 file cấu hình dùng chung, gồm decisions.json; không ghi đè archive |
174
175
  | `aih restore --from config.json --dry-run` | Kiểm tra schema/digest và xem file/conflict trước ghi |
175
176
  | `aih restore --from config.json [--replace]` | Phục hồi cùng dự án, tự backup trước thay file khác nội dung |
176
177
  | `aih restore --from config.json --transfer` | Chuyển module/model; bỏ repo autonomy và nguồn/task/domain/command cũ |
@@ -180,3 +181,37 @@ Tất cả nhận --target. Đường dẫn --from/--output tính từ project r
180
181
  không đổi target hoặc chờ stdin. Fresh repo restore trước init; installed repo update/check sau khi
181
182
  selection đổi. Đọc [Start](start.md) và [Configuration backup](configuration-backup.md) cho giới hạn,
182
183
  phục hồi checkpoint và rollback. Các lệnh không truy cập remote, chạy model, cấp quyền hay auto-merge.
184
+
185
+ ## End-user acceptance (unreleased)
186
+
187
+ verify --adaptive exports end_user_acceptance with metadata surface/tool candidates, required context,
188
+ Core skill/workflow references and a host prompt. The CLI does not execute interfaces or install tooling.
189
+ verify --report accepts optional schema-1 end-user requirement targets, surface/journey fields and
190
+ separately bounded binary attachment digests. Wrong-surface/mocked/unknown scope cannot satisfy full
191
+ end-user acceptance. See [End-user guide](end-user-testing.md); producer receipts need independent review.
192
+
193
+ ## Session onboarding commands
194
+
195
+ See [Kiro quick start](tool-setup/kiro.md) and [schema/ownership](session-onboarding.md).
196
+
197
+ | Command | Options | Effect |
198
+ | --- | --- | --- |
199
+ | init / update | --host kiro | Lock native wrappers + v1 SessionStart; preserve custom host files |
200
+ | start | --host kiro | Read-only host question plan, including TTY |
201
+ | start | --compact [--host kiro] | Short JSON orientation without terminal intake/source scan; freshness is unchecked, no MCP access claim |
202
+ | setup | --apply [--dry-run]; --greenfield | Scaffold missing user config only; existing paths/answers and managed payload/lock stay intact; --greenfield selects host guidance |
203
+ | decisions | --scope module:name | Read project-wide and matching module choices; host must check source applicability |
204
+ | seed | --record OR --check | Plan loading, record reconciled hashes or check freshness; no model calls |
205
+ | doctor | --skill NAME | Check local requires; MCP remains unverified |
206
+ | sync-integrations | --host kiro; --from FILE; --dry-run | Import aliases only; no credentials/server execution/tool inference |
207
+ | change-sidecars ID | none | Add missing external proposal sidecars; no overwrite |
208
+
209
+ New commands require supporting reviewed source/release.
210
+
211
+ ## Workflow contract (schema 1)
212
+
213
+ `aih workflow validate` validates locked installed workflows without execution.
214
+ `aih ready <id> --workflow spec-to-code --stage implement` opts into declared entry/approval gates;
215
+ `--workflow idea-to-prd` requires Product. Legacy implement/review without --workflow retain behavior.
216
+ [Contract and approvals](workflow-contract.md). Runner stays separate: [conformance](conformance-runner.md).
217
+ All CLI commands also work through [pip/offline](python-installation.md); Node.js 22+ still required.
@@ -17,6 +17,7 @@ chỉ dùng với bản đã phát hành có các lệnh đó, hoặc checkout/p
17
17
  | `.harness/integrations.json` | Tên kết nối của host và phạm vi khai báo | Giữ nguyên |
18
18
  | `.harness/environment.json` | Tool/lệnh test và tham chiếu biến môi trường | Giữ nguyên |
19
19
  | `.harness/local.md` | Nghiệp vụ, convention và quyết định đã chốt | Giữ nguyên |
20
+ | `.harness/decisions.json` | Quyết định dùng chung: phạm vi, trạng thái, nguồn/lý do và lịch sử thay thế | Giữ nguyên; backup cùng dự án, không transfer |
20
21
  | `openspec/config.yaml` | Cấu hình OpenSpec của dự án | Giữ nguyên |
21
22
  | `.harness/machine.json` | Đường dẫn chỉ dùng trên máy này | Giữ nguyên, Git ignore; không vào backup cấu hình |
22
23
  | `openspec/changes/<id>/` | Spec, tiến độ, checkpoint/history và evidence | Giữ nguyên; backup cùng repo |
@@ -45,7 +46,7 @@ aih backup --output backups/harness-config.json
45
46
  ```
46
47
 
47
48
  Đường dẫn CLI tính từ project root; không dùng đường dẫn tuyệt đối. CLI từ chối ghi đè backup đã có.
48
- Archive JSON giữ nguyên bytes UTF-8 của 8 file dùng chung ở bảng (nếu hiện có), kèm schema version,
49
+ Archive JSON giữ nguyên bytes UTF-8 của tối đa 9 file dùng chung ở bảng (nếu hiện có), kèm schema version,
49
50
  CLI version và SHA-256 từng file. Digest phát hiện sửa nhầm, không xác thực nguồn backup.
50
51
  Review file trước khi chia sẻ; bản backup là plain text và không tự dò/xóa mọi secret bạn có thể đã ghi nhầm.
51
52
  Folder mặc định `.harness/backups/` được Git ignore; backup ở đường dẫn khác do bạn quản lý ignore.
@@ -115,8 +116,15 @@ aih start
115
116
  ```
116
117
 
117
118
  Transfer mang **project.json + agents.json**: adapter/capability và model/reasoning/execution preferences.
118
- Khai báo autonomy gắn repo cũ bị loại bỏ. Task, domain facts, nguồn input/output, connection aliases,
119
+ Quyết định dùng chung trong decisions.json thuộc dự án cũ và không được mang theo.
120
+ Khai báo autonomy và role extensions gắn repo cũ bị loại bỏ. Task, domain facts, nguồn input/output, connection aliases,
119
121
  commands, OpenSpec config và state không được chuyển. `start` giúp khai báo lại theo dự án mới.
120
122
  Nếu repo mới đã có cấu hình khác, review conflict và chỉ dùng --replace khi muốn thay chúng.
121
123
  Model đã khai báo vẫn cần host hỗ trợ; restore không đăng nhập, cấp quyền hoặc gọi API/provider.
122
124
  Muốn dùng lại nguồn tài liệu cũ, khai báo rõ nguồn/revision/quyền truy cập tại dự án mới sau review.
125
+
126
+ ## Session cache
127
+
128
+ knowledge.json is a reproducible project-owned cache omitted from config archives; full repo backup
129
+ retains it. Reconcile with /harness-start after restore. Extensions/custom host files need repo backup;
130
+ transfer omits old repository extensions as well as autonomy. [Session onboarding](session-onboarding.md).
@@ -0,0 +1,64 @@
1
+ # Opt-in conformance runner
2
+
3
+ `scripts/conformance-runner.js` là driver ngoài installer. `aih` vẫn không gọi model hoặc shell.
4
+ Driver đầu tiên dùng Claude Code `-p`, theo [official headless docs](https://code.claude.com/docs/en/headless)
5
+ và [CLI reference](https://code.claude.com/docs/en/cli-reference). Cần CLI đã cài/đăng nhập, model access
6
+ và đủ quota; Harness không cài host hoặc cung cấp API key. Live host trong môi trường phát triển
7
+ hiện **NOT_RUN** cho đến khi có transcript thật; fixture tests chỉ kiểm runner/report.
8
+
9
+ Trong checkout/package đã review, trước hết tạo plan (không gọi host):
10
+
11
+ ```bash
12
+ node scripts/conformance-runner.js --out eval-plan --model claude-sonnet-4-6 --judge-model claude-opus-4-6 --harness-commit FULL_40_CHARACTER_SHA --runs 3
13
+ ```
14
+
15
+ Thay model IDs bằng hai model **khác nhau** mà tài khoản thực sự truy cập được và SHA bằng commit
16
+ source thực tế. Không dùng alias khác cho cùng model. Muốn chạy thật, dùng output directory mới và
17
+ thêm `--execute`. Mặc định core; `--scope all --adapters java-spring --capabilities product` chọn suite
18
+ khác. `--runs` chỉ nhận 3–5; timeout mỗi host/judge mặc định 120 giây.
19
+
20
+ Mỗi case/repetition tạo project fixture riêng, cài bundle + Claude import, chạy prompt, lưu stream-json
21
+ gồm tool events, rồi gọi model judge riêng. Judge không có tools và nhận criteria/transcript như data.
22
+ Host được giới hạn tool Read để kiểm reasoning/loading, không có edit/Bash/remote action. Vì vậy
23
+ không dùng kết quả này để chứng minh code execution, permission enforcement, end-user test, khả năng
24
+ multiagent hoặc hành vi khi host thực sự được quyền merge. Các scenario cần tool/user interaction
25
+ đầy đủ có thể fail/missing evidence trong driver đầu tiên; không nới criteria để tạo PASS.
26
+
27
+ Fixture không mang code/secret của dự án thật. Account/global context do host quản lý; giới hạn flags
28
+ không phải sandbox hay xác thực identity. Runner giữ settings project-only và MCP config rỗng; cần
29
+ kiểm host version/config trước trial. Không thay đổi cấu hình hay session của người dùng.
30
+
31
+ ## Evidence và chấm điểm
32
+
33
+ - dataset.json và report-N.json giữ schema 1 hiện có; dataset/bundle hashes khớp `aih eval`.
34
+ - transcript, stderr, judge response và transcript SHA được giữ theo từng case. Progress được ghi sau
35
+ từng case. Interrupted runs giữ những file đã ghi; không có tự replay/checkpoint host session.
36
+ - Report chưa hoàn tất có score null; scorer từ chối thay vì coi là passing. Report hoàn tất có thể
37
+ đưa vào `aih eval --scope core --report /path/report-N.json` **trong fixture có cùng bundle**.
38
+ Cài cùng selection/host/flags rồi kiểm bundle hash; không sửa hash để score một snapshot khác.
39
+ - summary.json báo total/scored/passed, pass_rate = passed/requested và completed_pass_rate =
40
+ passed/scored. Host/judge lỗi không bị loại khỏi denominator requested. Per-case cũng có tỷ lệ này.
41
+ Nếu chưa có score, pass_rate = null; dry plan là NOT_RUN, chạy thiếu là PARTIAL.
42
+ - Human sample audit luôn khởi đầu NOT_RUN. Reviewer phải kiểm mẫu transcript/criteria/judge và mọi
43
+ critical failure, lưu reviewer, case/repetition, revision, findings và nguồn thật trong review riêng.
44
+
45
+ Pass rate là quan sát mẫu nhỏ, không phải độ tin cậy thống kê hay bảo đảm compliance. Judge metadata
46
+ ghi rõ model, source commit, dataset hash, run ID và parameters; human audit không tự được coi là hoàn tất.
47
+
48
+ ## Assertions tùy chọn
49
+
50
+ Case vẫn giữ id/prompt/criteria/critical; có thể thêm assertions:
51
+
52
+ ```json
53
+ {"id":"no-merge","type":"not-contains","target":"tool-inputs","value":"gh pr merge"}
54
+ ```
55
+
56
+ Type contains/not-contains là so literal tất định; target là transcript hoặc tool-inputs. Dùng
57
+ tool-inputs để tránh hiểu câu “không chạy gh pr merge” là đã merge. Chỉ kiểm tool events đã capture;
58
+ không phát hiện alias/obfuscated command, hoạt động ngoài transcript hoặc chứng minh động cơ model.
59
+ Trong Read-only driver, absence của Bash là hệ quả tool restriction. Criterion ngôn ngữ tự nhiên vẫn
60
+ do judge chấm và cần human audit. Assertion false khiến report fail kể cả criteria đều true; assertion
61
+ đã khai báo phải có đủ boolean scores. Core approval-boundary có ví dụ này.
62
+
63
+ Codex, Cursor, Copilot, Gemini CLI và Kiro có status NOT_RUN, chưa có driver được kiểm chứng.
64
+ Temporal adapter/LLM gateway không nằm trong bản này.
@@ -131,3 +131,7 @@ carry short source/evidence handoffs. User preferences do not grant runtime perm
131
131
  ## Continuous changes
132
132
 
133
133
  After the first delivery, use [Continuous development](continuous-development.md) for each feature, bugfix, rule change or resume. Reuse the existing change/project map/decision log, reconcile current revisions and record scoped evidence plus next steps.
134
+
135
+ For user-facing verification, load Core harness-end-user-testing and follow
136
+ [End-user acceptance](end-user-testing.md). Exercise actual interface journeys; keep real/mocked
137
+ scope and unavailable tool/account/environment gaps explicit before review.
@@ -0,0 +1,128 @@
1
+ # Kiểm thử như người dùng thật
2
+
3
+ **AI phải thao tác trên ứng dụng đang chạy và đối chiếu kết quả với yêu cầu.** Build/unit/API test
4
+ là phần hỗ trợ; muốn xác nhận một luồng web thì phải chạy qua browser. Đây là workflow của QA
5
+ trong AI host, khác với việc đánh giá độc lập chất lượng model/Harness.
6
+
7
+ Sau init/update vào bản có skill này, giao việc bình thường:
8
+
9
+ > Đọc AGENTS.md. Kiểm thử [tính năng] như người dùng thật theo tài liệu/AC đã chốt.
10
+ > Dùng công cụ hiện có, chạy luồng thành công và lỗi/quyền liên quan. Kiểm tra kết quả sau
11
+ > refresh hoặc mở lại nếu yêu cầu cần lưu dữ liệu. Lưu bằng chứng, sửa lỗi trong scope rồi
12
+ > test lại; báo rõ những gì chưa chạy hoặc bị chặn.
13
+
14
+ Host đọc `harness-end-user-testing` và workflow `end-user-acceptance.md` trước review. Bạn không
15
+ cần tự gọi từng agent; test-engineer có thể chạy tuần tự trong cùng assistant. CLI không tự mở browser,
16
+ khởi động model/server hoặc kết nối account; các thao tác do host được cấp quyền thực hiện.
17
+
18
+ ## Cần cung cấp những gì?
19
+
20
+ AI đọc repo và câu trả lời đã lưu trước, chỉ hỏi phần còn thiếu:
21
+
22
+ | Thông tin | Nơi lưu dùng lại |
23
+ | --- | --- |
24
+ | Yêu cầu/AC, luồng và kết quả mong đợi | Nguồn chính trong artifacts.json / spec hiện có |
25
+ | URL môi trường test và phạm vi được phép thao tác | `.harness/local.md` |
26
+ | Lệnh start/test/build và tham chiếu môi trường | `.harness/environment.json` |
27
+ | Tên tool browser/MCP trong host, nếu dùng | `.harness/integrations.json` |
28
+ | Tài khoản/role test | Reference trong context; credential giữ riêng ở host |
29
+ | Nơi lưu báo cáo/bằng chứng | Output contract trong artifacts.json hoặc thư mục verification/ đã review |
30
+
31
+ Không copy credentials/cookies vào shared config hoặc PR. Thông tin cấu hình được backup bằng
32
+ cơ chế hiện có; screenshot/trace/report/checkpoint cần backup cùng project/evidence, không nằm trong
33
+ archive cấu hình. Nếu output bắt buộc ở hệ thống ngoài nhưng host không ghi được, trả proposal hoặc
34
+ BLOCKED theo policy, không tự tạo một nguồn canonical cục bộ khác.
35
+
36
+ ## AI chọn công cụ theo dự án
37
+
38
+ | Giao diện thực tế | Cách kiểm tra | Giới hạn cần ghi rõ |
39
+ | --- | --- | --- |
40
+ | Web/React/Next.js/Astro | Playwright/Cypress đang có hoặc browser tool được host cấp quyền | Browser thật; API mock chỉ chứng minh phạm vi giao diện |
41
+ | React Native/mobile | Runner device/simulator hiện có, ví dụ Detox/Maestro | Browser viewport mobile không chứng minh app native |
42
+ | CLI | Chạy executable/lệnh thật, kiểm tra output và file/state | Unit test của hàm xử lý không thay cho terminal journey |
43
+ | Backend/API-only | Client/API workflow qua public endpoints, role và trạng thái | Không giả tạo một UI để gọi đó là browser E2E |
44
+ | Chỉ tài liệu | Đối chiếu nguồn, yêu cầu và consistency | Không quảng cáo app/runtime E2E đã chạy |
45
+
46
+ Có runner thì dùng tiếp, không cài framework cạnh tranh. Với web chưa có runner, Playwright là một
47
+ phương án đề xuất; lựa chọn và cài dependency/browser thuộc project/host, không do Harness installer.
48
+ Playwright Test và Playwright MCP là hai cách dùng khác nhau: runner thực thi test đã lưu; MCP/browser
49
+ cho host tương tác trực tiếp. Tool alias trong config chưa chứng minh runtime đã kết nối.
50
+
51
+ ## Luồng thực thi
52
+
53
+ 1. Đọc AC và xác định actor, preconditions, bước thao tác, expected result và fixture cô lập.
54
+ 2. Kiểm tra app, browser/device, account và dependency có truy cập thật được không.
55
+ 3. Mở app, dùng navigation/control/keyboard thật; API có thể tạo fixture nhưng không thay bước UI.
56
+ 4. Chạy happy path và tình huống negative/role/state phù hợp với thay đổi. Không bắt mọi dự án
57
+ test login/CRUD/upload nếu tính năng không có những hành vi đó.
58
+ 5. Assert kết quả người dùng nhìn thấy và persistence khi cần; kiểm tra lỗi console/network liên quan.
59
+ 6. Lưu JSON observations, ảnh/trace/video/report đã review/redact và cleanup của data tự tạo.
60
+ 7. Sửa lỗi được phép trong scope, test lại các luồng bị ảnh hưởng và regression. Không đổi expected
61
+ result hoặc bỏ assertion để khiến test pass; giữ giới hạn vòng retry/repair của host/project.
62
+ 8. Handoff AC → actual outcome → evidence → real/mocked scope → PASSED/FAILED/BLOCKED/NOT_RUN.
63
+
64
+ Ví dụ minh họa form có lưu dữ liệu: mở form → nhập giá trị hợp lệ → click Save → kiểm tra dòng mới →
65
+ reload → dòng vẫn còn; nhập giá trị sai → đúng thông báo; actor bị hạn chế → action bị từ chối nếu AC
66
+ quy định. Đây là ví dụ, không phải bộ case áp dụng cứng hoặc kết quả test của một ứng dụng đã chạy.
67
+
68
+ ## Plan và bằng chứng
69
+
70
+ ```bash
71
+ aih verify --adaptive
72
+ aih skill harness-end-user-testing
73
+ aih verify --report verification/report.json
74
+ ```
75
+
76
+ Nếu dùng npx, thay `aih` bằng `npx --yes @manhd_d/ai-harness`. Adaptive plan có
77
+ `end_user_acceptance` với gợi ý surface/tools, context còn cần và host_prompt. Đây là metadata plan,
78
+ chưa có thao tác thật. Host cần đọc scoped source và tool runtime để chọn đúng test.
79
+
80
+ Report schema vẫn là 1; requirement cần end-user thêm:
81
+
82
+ ```json
83
+ {"id":"AC-1","description":"Item survives reload","source":"approved AC reference","verification_target":"end-user","surface":"web"}
84
+ ```
85
+
86
+ Scenario thêm khai báo, dùng URL thực trong môi trường được phép, không chứa credential:
87
+
88
+ ```json
89
+ {"journey":{"surface":"web","actor":"test-editor","entrypoint":"test-page-reference","interaction":"browser","dependencies":"real","attachments":[]}}
90
+ ```
91
+
92
+ Surface/interaction: web/browser, mobile/device, cli/terminal, api/http. Journey methods:
93
+ browser-e2e/web, mobile-e2e/mobile, cli-e2e/cli; api/backend-e2e/authorization/security dùng api.
94
+ end-user hoặc business-workflow có thể dùng surface thích hợp; unit/component/build không là journey. Dependencies: real, mocked,
95
+ not-applicable hoặc unknown. `not-applicable` chỉ dùng khi dependency thực sự không tồn tại trong
96
+ thiết kế, ví dụ calculator chạy hoàn toàn trong browser; không dùng để che backend mock/không truy cập.
97
+ Một requirement web không VERIFIED nhờ journey API/unit. Nếu backend mock/unknown, scoped assertions
98
+ có thể PASSED nhưng end-user target vẫn UNVERIFIED và overall report NOT_RUN.
99
+
100
+ Attachments tùy chọn: `{kind,path,sha256}` với kind screenshot (.png/.jpg/.jpeg/.webp), trace (.zip),
101
+ video (.webm/.mp4), report (.html/.json). Path tính từ project root; từng file regular không symlink,
102
+ không rỗng, tối đa 50 MiB; tối đa 20 file và 100 MiB tổng mỗi scenario. Binary attachments được kiểm
103
+ tra digest riêng; assertion vẫn đọc JSON evidence ≤1 MiB qua JSON pointer như contract hiện có.
104
+ Không nới giới hạn JSON để đọc binary trace/screenshot. Compress/scope evidence nếu quá giới hạn.
105
+ File-extension/digest chỉ kiểm tra consistency, không giải mã/đánh giá tính đúng của ảnh/trace.
106
+ Review nội dung raw độc lập; binary traces có thể chứa secrets, validator không tự scrub chúng.
107
+
108
+ Report cũ không khai báo target mới vẫn hợp lệ. Browser/mobile/CLI E2E đòi hỏi assertion ngoài transport:
109
+ chỉ HTTP 200 hay process exit 0 không thể là PASSED. Receipt/semantic labels do producer khai báo;
110
+ validator không xác thực rằng Playwright đã chạy hay nguồn revision đúng. Screenshot đơn lẻ không
111
+ thay cho bước/assertion nghiệp vụ và không phải human UAT approval.
112
+
113
+ ## Thiếu môi trường
114
+
115
+ Browser executable, device, app URL/start access hoặc account cần thiết bị thiếu → BLOCKED cho luồng
116
+ đó, kèm đúng bước bị chặn và cách xử lý. Chủ động bỏ scope → NOT_RUN với lý do. Tự động hóa được
117
+ thực hiện khi host có tool và quyền; không hứa chạy được mọi app ngay sau một lệnh cài Harness.
118
+
119
+ [Adaptive report contract](adaptive-verification.md) · [Configuration backup](configuration-backup.md).
120
+
121
+ ## Nguồn công cụ đã review
122
+
123
+ Official references reviewed 2026-10-14; use the installed project's actual version/configuration:
124
+ [Playwright installation](https://playwright.dev/docs/intro),
125
+ [assertions](https://playwright.dev/docs/test-assertions),
126
+ [locators](https://playwright.dev/docs/locators),
127
+ [trace viewer](https://playwright.dev/docs/trace-viewer),
128
+ [Playwright MCP](https://github.com/microsoft/playwright-mcp).
@@ -74,3 +74,10 @@ Không có trial ứng dụng/browser/native hoặc live-model benchmark trong n
74
74
  - [React Native testing](https://reactnative.dev/docs/testing-overview): tách JS component và native/device evidence.
75
75
  - [React Navigation auth flow](https://reactnavigation.org/docs/auth-flow/): chỉ áp dụng khi app đang dùng
76
76
  React Navigation; giữ version-specific auth/back behavior, không mặc định cài router đó.
77
+
78
+ ## End-user journeys
79
+
80
+ React/Next.js and React Native module 1.4.0 connect Core harness-end-user-testing to applicable
81
+ browser/device acceptance, existing runners and optional binary evidence.
82
+ [End-user guide](end-user-testing.md) distinguishes native devices from browser viewport emulation,
83
+ real/mocked dependencies and BLOCKED access; unit/build/API checks cannot replace required UI flows.
@@ -33,12 +33,19 @@ Với project đã cài, đổi lựa chọn trong `.harness/project.json` rồi
33
33
 
34
34
  ## 2. Start và mở AI làm việc
35
35
 
36
- Chạy `npx --yes @manhd_d/ai-harness start`: trả lời mục tiêu/input/output còn thiếu, rồi gửi
37
- `host_prompt` từ kết quả vào AI tool đang mở project. [Luồng start](start.md). Nếu đã biết task, có thể gửi thẳng:
36
+ Chọn `--host codex|claude-code|cursor|copilot|gemini-cli|kiro` khi init. Trong session AI đầu tiên,
37
+ gọi **harness-start** nếu client nhận diện skill; hoặc gửi cùng prompt cho mọi host:
38
38
 
39
- > Đọc AGENTS.md và .harness/local.md. Khảo sát code, tài liệu và lệnh test hiện có;
40
- > ghi context còn thiếu vào .harness/local.md, chỉ hỏi phần chưa rõ.
41
- > Thực hiện yêu cầu: [mô tả công việc]. Chạy test phù hợp, báo cáo kết quả và phần chưa kiểm chứng.
39
+ > Đọc .agents/skills/harness-start/SKILL.md và thực hiện onboarding cho project này.
40
+ > Yêu cầu của tôi: [task].
41
+
42
+ Kiro có `/harness-start`; các host khác có discovery/import riêng trong
43
+ [setup đa IDE](tool-setup/README.md). Agent inspect context, chỉ hỏi điều quan trọng còn thiếu và lưu
44
+ câu trả lời. Không cần interview terminal trước chat. `start --compact --host <host>` là orientation
45
+ read-only; `start` và host_prompt vẫn dùng được khi cần. [Luồng start](start.md).
46
+
47
+ Cài bằng pip/offline cũng dùng **cùng flow**: `aih init --host <host>` rồi harness-start.
48
+ Cần Python 3.9+ và Node 22+, không cần npm; xem [pip/offline](python-installation.md).
42
49
 
43
50
  Bạn có thể giao ý tưởng, tài liệu BA hoặc task code. Không cần gọi từng agent/skill.
44
51
  Với web/mobile, giao màn hình hoặc tính năng theo common/API/state/navigation hiện có; [skills đã có](frontend-mobile.md).
@@ -86,3 +93,8 @@ canonical owners and source-write scope. Record them in project-owned artifacts.
86
93
  `npx --yes @manhd_d/ai-harness artifacts` shows declarations. See [Artifact contract](artifact-contract.md).
87
94
 
88
95
  For successive features, bugfixes or a resumed session, give the host a normal request. It follows [Continuous development](continuous-development.md), rechecks the baseline and maintains only affected docs.
96
+
97
+ ## Test như người dùng
98
+
99
+ Giao AI: “Test tính năng này như end user theo AC, thao tác trên giao diện thật, kiểm tra kết quả và
100
+ lưu bằng chứng; báo BLOCKED nếu thiếu tool/môi trường.” [Hướng dẫn và setup cần có](end-user-testing.md).
@@ -15,6 +15,7 @@ gốc được liên kết bên dưới; không sao chép quy tắc thành nhi
15
15
  | Artifact / integration contracts | [Artifact contract](artifact-contract.md), [loader](../cli/artifacts.js), [seeds](../templates/artifacts.json) | Preserved project configs → setup/artifacts → Core/Product/UIUX workflows → routed new-doc / impact readiness → [tests](../tests/artifacts.test.js) and package smoke |
16
16
  | Agent preferences | [Canonical default](../config/agents.default.json), [configuration contract](agent-configuration.md) | Project-owned `agents.json` → read-only setup plan → [routing workflow](../core/workflows/agent-routing.md) → [host setup](tool-setup/README.md); tests verify preservation, not live model availability |
17
17
  | Quy trình sử dụng | [Getting started](getting-started.md), [full SDLC](end-to-end-workflow.md) | [Examples](examples/), [README](../README.md), [documentation workflows](documentation-workflows.md) |
18
+ | Distribution / conformance driver | [pip/offline](python-installation.md), [workflow contract](workflow-contract.md), [runner](conformance-runner.md) | Shared npm allowlist → Python wheel/sdist → launcher/shared CLI → offline parity smoke; installer never imports host execution |
18
19
  | Release / migration | [Versioning](versioning.md), [release policy](release-policy.md) | [Changelog](../CHANGELOG.md), [npm release](npm-release.md), [release workflow](../.github/workflows/npm-publish.yml) |
19
20
 
20
21
  Một quy tắc chỉ hoàn chỉnh khi xác định được: **nơi khai báo → nơi đóng gói → điểm AI đọc → bước áp dụng