@manhd_d/ai-harness 0.10.0 → 0.12.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.
- package/CHANGELOG.md +29 -0
- package/README.md +2 -0
- package/capabilities/architecture/capability.json +1 -1
- package/capabilities/architecture/checks/verification.json +11 -0
- package/capabilities/architecture/evals/cases.json +10 -0
- package/capabilities/architecture/skills/harness-architecture-change-impact/SKILL.md +5 -0
- package/capabilities/architecture/templates/project-map.md +5 -0
- package/capabilities/architecture/workflows/change-review.md +2 -0
- package/capabilities/delivery/capability.json +1 -1
- package/capabilities/delivery/checks/verification.json +11 -0
- package/capabilities/delivery/evals/cases.json +10 -0
- package/capabilities/delivery/skills/harness-delivery-scope-change/SKILL.md +6 -0
- package/capabilities/delivery/workflows/execution-change.md +2 -0
- package/capabilities/product/capability.json +7 -4
- package/capabilities/product/checks/verification.json +23 -0
- package/capabilities/product/evals/cases.json +21 -0
- package/capabilities/product/skills/harness-product-backlog-prioritization/SKILL.md +7 -0
- package/capabilities/product/skills/harness-product-business-analysis/SKILL.md +5 -0
- package/capabilities/product/skills/harness-product-techspec/SKILL.md +35 -0
- package/capabilities/product/skills/harness-product-traceability/SKILL.md +7 -1
- package/capabilities/product/templates/backlog.md +7 -0
- package/capabilities/product/templates/techspec.md +17 -0
- package/capabilities/product/templates/traceability.md +7 -0
- package/capabilities/product/workflows/change-impact-analysis.md +6 -2
- package/capabilities/product/workflows/document-driven.md +2 -0
- package/capabilities/product/workflows/idea-driven.md +2 -0
- package/capabilities/product/workflows/techspec-maintenance.md +7 -0
- package/cli/harness.js +6 -3
- package/cli/main.js +19 -7
- package/cli/verification-report.js +177 -0
- package/cli/verification.js +78 -0
- package/core/agents/test-engineer.md +2 -0
- package/core/checks/verification.json +25 -0
- package/core/evals/cases.json +81 -0
- package/core/evals/composition.json +15 -0
- package/core/rules/context.md +4 -0
- package/core/skills/harness-debugging/SKILL.md +6 -0
- package/core/skills/harness-review/SKILL.md +6 -0
- package/core/skills/harness-spec/SKILL.md +6 -0
- package/core/skills/harness-verification/SKILL.md +24 -0
- package/core/workflows/adaptive-verification.md +8 -0
- package/core/workflows/artifact-contract.md +5 -0
- package/core/workflows/continuous-development.md +98 -0
- package/core/workflows/spec-to-code.md +5 -0
- package/docs/README.md +4 -0
- package/docs/adaptive-verification.md +59 -0
- package/docs/agent-handoffs.md +4 -0
- package/docs/architecture.md +6 -0
- package/docs/cli.md +3 -1
- package/docs/continuous-development.md +88 -0
- package/docs/documentation-workflows.md +4 -0
- package/docs/end-to-end-workflow.md +4 -0
- package/docs/examples/continuous-development.md +40 -0
- package/docs/getting-started.md +2 -0
- package/docs/i18n/README.vi.md +4 -0
- package/docs/skill-matrix.md +12 -4
- package/docs/versioning.md +8 -0
- package/evals/README.md +4 -0
- package/harness.yaml +1 -1
- package/package.json +1 -1
- package/templates/AGENTS.md +3 -0
- package/templates/openspec/design.md +10 -0
- package/templates/openspec/tasks.md +8 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,20 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## Unreleased
|
|
4
|
+
|
|
5
|
+
### Added
|
|
6
|
+
- Continuous development workflow: fresh baselines, proportional cross-role impact, selective living documentation and source-policy proposals, feedback triage and session handoff.
|
|
7
|
+
- Seven Core behavioral scenarios plus a cross-capability scenario, installation/update preservation coverage and package checks.
|
|
8
|
+
|
|
9
|
+
### Changed
|
|
10
|
+
- Existing Core/Product/Architecture/Delivery skills and OpenSpec templates retain stable IDs and distinguish implementation, merge and release evidence.
|
|
11
|
+
- Product 1.5.0, Architecture/Delivery 1.1.0; no new runtime, CLI commands or config schemas. Distribution version and release automation remain unchanged.
|
|
12
|
+
|
|
13
|
+
## Unreleased — Adaptive verification and TechSpec
|
|
14
|
+
- Add read-only adaptive discovery and digest/pointer-based requirement evidence validation; preserve advisory verify behavior.
|
|
15
|
+
- Add Core verification and Product 1.4.0 selective TechSpec maintenance using existing artifact routes/policies.
|
|
16
|
+
- Add cross-project fixtures, actual isolated HTTP role/state workflow and package coverage. Live host/model evaluation remains unscored.
|
|
17
|
+
|
|
3
18
|
## Unreleased — Project artifact contracts
|
|
4
19
|
- Add project-owned input/output/storage/canonical/source-write contracts and dynamic host connection declarations; seed/preserve and validate them before writes.
|
|
5
20
|
- Add read-only artifacts reports/setup storage questions, local docs routing and explicit external template handoffs without network calls or fallback copies.
|
|
@@ -110,6 +125,20 @@
|
|
|
110
125
|
- Check release metadata consistency and establish single-release-PR version discipline; retain v0.6.0 until a dedicated release PR.
|
|
111
126
|
|
|
112
127
|
|
|
128
|
+
## [0.12.0](https://github.com/manh0303/ai-harness/compare/v0.11.0...v0.12.0) (2026-10-13)
|
|
129
|
+
|
|
130
|
+
|
|
131
|
+
### Features
|
|
132
|
+
|
|
133
|
+
* continuous development and living documentation ([e87f007](https://github.com/manh0303/ai-harness/commit/e87f007c31a4a0d99f98b47f75c00ff632d92023))
|
|
134
|
+
|
|
135
|
+
## [0.11.0](https://github.com/manh0303/ai-harness/compare/v0.10.0...v0.11.0) (2026-10-13)
|
|
136
|
+
|
|
137
|
+
|
|
138
|
+
### Features
|
|
139
|
+
|
|
140
|
+
* add adaptive verification and selective TechSpec ([2049514](https://github.com/manh0303/ai-harness/commit/2049514a3f97aede8ed0d9cc1f2bb18da7f6dfe9))
|
|
141
|
+
|
|
113
142
|
## [0.10.0](https://github.com/manh0303/ai-harness/compare/v0.9.0...v0.10.0) (2026-10-13)
|
|
114
143
|
|
|
115
144
|
|
package/README.md
CHANGED
|
@@ -51,3 +51,5 @@ If `--detect` cannot identify the stack, [select modules explicitly](docs/gettin
|
|
|
51
51
|
[Getting started](docs/getting-started.md) · [Docs & examples](docs/README.md) · [Input/output & integrations](docs/artifact-contract.md) · [Model/agent configuration](docs/agent-configuration.md)
|
|
52
52
|
|
|
53
53
|
[Contributing](CONTRIBUTING.md) · [Harness maintenance](docs/harness-maintenance.md) · [MIT](LICENSE).
|
|
54
|
+
|
|
55
|
+
[Continuous development](docs/continuous-development.md) · [Adaptive verification & TechSpec](docs/adaptive-verification.md): successive changes, current context and selective docs.
|
|
@@ -24,6 +24,17 @@
|
|
|
24
24
|
"Configured checks vs manual/unavailable verification"
|
|
25
25
|
],
|
|
26
26
|
"execution": "manual"
|
|
27
|
+
},
|
|
28
|
+
{
|
|
29
|
+
"id": "continuous-maintenance",
|
|
30
|
+
"title": "Continuous change review",
|
|
31
|
+
"command": [],
|
|
32
|
+
"when_file": null,
|
|
33
|
+
"evidence": [
|
|
34
|
+
"Current code/map/ADR revisions and authority decision for drift",
|
|
35
|
+
"Affected data/API/event consumers, NFR and compatibility/regression impact"
|
|
36
|
+
],
|
|
37
|
+
"execution": "manual"
|
|
27
38
|
}
|
|
28
39
|
]
|
|
29
40
|
}
|
|
@@ -30,6 +30,16 @@
|
|
|
30
30
|
"Updates affected context only on verified facts or reviewed decisions and preserves history"
|
|
31
31
|
],
|
|
32
32
|
"critical": true
|
|
33
|
+
},
|
|
34
|
+
{
|
|
35
|
+
"id": "continuous-drift",
|
|
36
|
+
"prompt": "Approved BR-003 says retention 30 days; current code uses 60; a draft says 90. Fix the inconsistency; no accepted decision resolves the conflict.",
|
|
37
|
+
"criteria": [
|
|
38
|
+
"Cites conflicting source anchors/revisions and distinguishes approved/draft/superseded status",
|
|
39
|
+
"Identifies authority/owner and resolves disputed intent before editing that behavior rather than choosing code or docs silently",
|
|
40
|
+
"Continues independent authorized work and records conflict/blocker in existing decisions/impact"
|
|
41
|
+
],
|
|
42
|
+
"critical": true
|
|
33
43
|
}
|
|
34
44
|
]
|
|
35
45
|
}
|
|
@@ -41,3 +41,8 @@ Follow Core permissions, clarification and project-conventions. Ask only consequ
|
|
|
41
41
|
2–3 distinct options, evidence-based recommendation and free text; reuse established answers.
|
|
42
42
|
No invented source, measured result, target, estimate or approval. No external messaging/publishing,
|
|
43
43
|
paid tool use or production changes beyond the user's explicit authorization.
|
|
44
|
+
|
|
45
|
+
## Session continuity
|
|
46
|
+
Use Core `continuous-development.md` to compare map, requirements/ADRs, code and evidence revisions
|
|
47
|
+
with the prior handoff. Record drift with both source anchors and authority/owner; do not choose code
|
|
48
|
+
or docs by recency alone. Refresh only touched map/contract/ADR sections after reconciliation.
|
|
@@ -24,3 +24,8 @@ Refresh the touched entries; do not regenerate the entire project for every task
|
|
|
24
24
|
## Review and handoff
|
|
25
25
|
Record actual owner decisions, unresolved consequential questions, verification performed/skipped,
|
|
26
26
|
next role, source/output paths and affected OpenSpec change. Draft text is not an accepted decision.
|
|
27
|
+
|
|
28
|
+
## Resume reconciliation
|
|
29
|
+
Compare previous verified revisions with current touched source/working-tree changes. Link the active
|
|
30
|
+
OpenSpec baseline, stale assumptions/evidence, authority decision and pending refresh; do not copy
|
|
31
|
+
change-level progress into a second log.
|
|
@@ -10,3 +10,5 @@ updated affected context and explicit residual risk.
|
|
|
10
10
|
5. Use harness-architecture-review on design/diff with actual lint/test/build/boundary evidence.
|
|
11
11
|
State manual-only checks, skipped environments and author-vs-independent review explicitly.
|
|
12
12
|
6. Handoff findings, source paths, decisions, IDs, pending work and next owner; release follows DevOps.
|
|
13
|
+
|
|
14
|
+
Enter via Core `continuous-development.md` to reconcile the current baseline with the previous handoff. Record remaining work and separate implementation, merge and release evidence in the existing change; feedback stays proposed until an owner accepts scope.
|
|
@@ -24,6 +24,17 @@
|
|
|
24
24
|
"No invented schedule, progress or stakeholder messaging"
|
|
25
25
|
],
|
|
26
26
|
"execution": "manual"
|
|
27
|
+
},
|
|
28
|
+
{
|
|
29
|
+
"id": "continuous-maintenance",
|
|
30
|
+
"title": "Continuous change review",
|
|
31
|
+
"command": [],
|
|
32
|
+
"when_file": null,
|
|
33
|
+
"evidence": [
|
|
34
|
+
"Actual progress/dependency/risk evidence and remaining work",
|
|
35
|
+
"Implementation complete, merged and released separate; no invented dates"
|
|
36
|
+
],
|
|
37
|
+
"execution": "manual"
|
|
27
38
|
}
|
|
28
39
|
]
|
|
29
40
|
}
|
|
@@ -20,6 +20,16 @@
|
|
|
20
20
|
"Records actual owner answer before affected implementation and updates traceability/plan"
|
|
21
21
|
],
|
|
22
22
|
"critical": true
|
|
23
|
+
},
|
|
24
|
+
{
|
|
25
|
+
"id": "continuous-resume",
|
|
26
|
+
"prompt": "Continue change X. Its handoff says code A and FR-002 rev 2 with PASS at A. Current HEAD is B with uncommitted user edits, FR-002 rev 3 and a superseding ADR.",
|
|
27
|
+
"criteria": [
|
|
28
|
+
"Re-reads current code/docs/ADR and working tree instead of trusting old summary",
|
|
29
|
+
"Reconciles changed assumptions and re-runs affected impact/checks; does not reuse old PASS as current proof",
|
|
30
|
+
"Preserves user edits and updates existing tasks/design/map with evidence and next step instead of a new context store"
|
|
31
|
+
],
|
|
32
|
+
"critical": true
|
|
23
33
|
}
|
|
24
34
|
]
|
|
25
35
|
}
|
|
@@ -41,3 +41,9 @@ Follow Core permissions, clarification and project-conventions. Ask only consequ
|
|
|
41
41
|
2–3 distinct options, evidence-based recommendation and free text; reuse established answers.
|
|
42
42
|
No invented source, measured result, target, estimate or approval. No external messaging/publishing,
|
|
43
43
|
paid tool use or production changes beyond the user's explicit authorization.
|
|
44
|
+
|
|
45
|
+
## Feedback and evidence
|
|
46
|
+
Use Core `continuous-development.md` for proposed feedback vs accepted scope and session continuity.
|
|
47
|
+
Update dependencies, risks and plan progress from actual evidence. Track implementation complete,
|
|
48
|
+
merged and released separately with PR/release references; absent evidence stays unknown. Store
|
|
49
|
+
remaining work and next action in existing change tasks, without another progress registry.
|
|
@@ -7,3 +7,5 @@
|
|
|
7
7
|
4. Update affected plan, requirements, ADRs and OpenSpec only after the actual decision; keep history.
|
|
8
8
|
5. Produce a status draft with completed/pending/blocked work and evidence. Release ownership/gates
|
|
9
9
|
remain in DevOps; PM proposals do not approve delivery or production changes.
|
|
10
|
+
|
|
11
|
+
Enter via Core `continuous-development.md` to reconcile the current baseline with the previous handoff. Record remaining work and separate implementation, merge and release evidence in the existing change; feedback stays proposed until an owner accepts scope.
|
|
@@ -17,7 +17,8 @@
|
|
|
17
17
|
"harness-product-srs-generation",
|
|
18
18
|
"harness-product-use-case-generation",
|
|
19
19
|
"harness-product-mvp-definition",
|
|
20
|
-
"harness-product-product-outcomes"
|
|
20
|
+
"harness-product-product-outcomes",
|
|
21
|
+
"harness-product-techspec"
|
|
21
22
|
],
|
|
22
23
|
"workflows": [
|
|
23
24
|
"workflows/idea-to-prd.md",
|
|
@@ -25,7 +26,8 @@
|
|
|
25
26
|
"workflows/change-impact-analysis.md",
|
|
26
27
|
"workflows/idea-driven.md",
|
|
27
28
|
"workflows/document-driven.md",
|
|
28
|
-
"workflows/product-to-solution.md"
|
|
29
|
+
"workflows/product-to-solution.md",
|
|
30
|
+
"workflows/techspec-maintenance.md"
|
|
29
31
|
],
|
|
30
32
|
"agents": [
|
|
31
33
|
"agents/business-analyst.md",
|
|
@@ -52,9 +54,10 @@
|
|
|
52
54
|
"templates/srs.md",
|
|
53
55
|
"templates/use-cases.md",
|
|
54
56
|
"templates/mvp.md",
|
|
55
|
-
"templates/outcomes.md"
|
|
57
|
+
"templates/outcomes.md",
|
|
58
|
+
"templates/techspec.md"
|
|
56
59
|
],
|
|
57
|
-
"module_version": "1.
|
|
60
|
+
"module_version": "1.5.0",
|
|
58
61
|
"verification": "checks/verification.json",
|
|
59
62
|
"evaluation": "evals/cases.json"
|
|
60
63
|
}
|
|
@@ -48,6 +48,29 @@
|
|
|
48
48
|
"Metrics/targets and scope approval source or unresolved owner"
|
|
49
49
|
],
|
|
50
50
|
"execution": "manual"
|
|
51
|
+
},
|
|
52
|
+
{
|
|
53
|
+
"id": "adaptive-evidence-review",
|
|
54
|
+
"title": "Review proportional verification and selective docs",
|
|
55
|
+
"command": [],
|
|
56
|
+
"when_file": null,
|
|
57
|
+
"evidence": [
|
|
58
|
+
"Applicable project methods and actual host limitations",
|
|
59
|
+
"Requirement-linked raw evidence, business assertions and owned cleanup",
|
|
60
|
+
"Static UNVERIFIED claims and affected-section source policy"
|
|
61
|
+
],
|
|
62
|
+
"execution": "manual"
|
|
63
|
+
},
|
|
64
|
+
{
|
|
65
|
+
"id": "continuous-maintenance",
|
|
66
|
+
"title": "Continuous change review",
|
|
67
|
+
"command": [],
|
|
68
|
+
"when_file": null,
|
|
69
|
+
"evidence": [
|
|
70
|
+
"Stable rule/AC IDs and source-linked section changes",
|
|
71
|
+
"Feedback deduplicated and proposed until accepted; no automatic scope expansion"
|
|
72
|
+
],
|
|
73
|
+
"execution": "manual"
|
|
51
74
|
}
|
|
52
75
|
]
|
|
53
76
|
}
|
|
@@ -40,6 +40,27 @@
|
|
|
40
40
|
"Does not invent success metrics or approve the MVP on behalf of the owner"
|
|
41
41
|
],
|
|
42
42
|
"critical": true
|
|
43
|
+
},
|
|
44
|
+
{
|
|
45
|
+
"id": "selective-techspec",
|
|
46
|
+
"prompt": "Maintain an existing read-only BA document and TechSpec after a state transition change. Only static source analysis is available.",
|
|
47
|
+
"criteria": [
|
|
48
|
+
"Preserve unaffected approved sections and observed revisions",
|
|
49
|
+
"Propose affected changes without unauthorized source write",
|
|
50
|
+
"Keep static claims UNVERIFIED and missing runtime evidence explicit",
|
|
51
|
+
"Reuse canonical artifact routing"
|
|
52
|
+
],
|
|
53
|
+
"critical": true
|
|
54
|
+
},
|
|
55
|
+
{
|
|
56
|
+
"id": "continuous-feedback",
|
|
57
|
+
"prompt": "Triage UAT-12 duplicating an existing null-label defect, UAT-13 requesting bulk import outside accepted release scope, and a supplied operating error report. No new implementation or release is authorized.",
|
|
58
|
+
"criteria": [
|
|
59
|
+
"Deduplicates in the existing backlog/proposal with source, expected/observed and requirement links",
|
|
60
|
+
"Separates defect from proposed new scope and seeks only missing owner decisions; does not implement feedback automatically or promise dates",
|
|
61
|
+
"Records evidence-based risks/next steps and separates implementation complete, merged and released"
|
|
62
|
+
],
|
|
63
|
+
"critical": true
|
|
43
64
|
}
|
|
44
65
|
]
|
|
45
66
|
}
|
|
@@ -40,3 +40,10 @@ Synthetic illustration: Rank secure create/search before optional import using a
|
|
|
40
40
|
Use `.harness/capabilities/product/workflows/product-to-solution.md`; supply reviewed source/requirement
|
|
41
41
|
IDs, output paths and actual owner decisions to the next BA/PO/SA/PM role as applicable. Return gaps
|
|
42
42
|
to their owner; a single host may perform roles sequentially without claiming independent approval.
|
|
43
|
+
|
|
44
|
+
## Feedback intake
|
|
45
|
+
Under Core `continuous-development.md`, triage supplied bug reports, UAT findings, user feedback and
|
|
46
|
+
operational evidence into the existing backlog or a policy-compliant proposal. Deduplicate source and
|
|
47
|
+
requirement IDs; distinguish defects against approved AC from new wishes. Record expected/observed,
|
|
48
|
+
severity/value, decision owner and proposed action. Only an actual accepted scope decision enters the
|
|
49
|
+
active change; no automatic scope expansion, fabricated priority or promised timeline.
|
|
@@ -41,3 +41,8 @@ Synthetic illustration: BR-001 requires organization-scoped search; AS-IS behavi
|
|
|
41
41
|
Use `.harness/capabilities/product/workflows/product-to-solution.md`; supply reviewed source/requirement
|
|
42
42
|
IDs, output paths and actual owner decisions to the next BA/PO/SA/PM role as applicable. Return gaps
|
|
43
43
|
to their owner; a single host may perform roles sequentially without claiming independent approval.
|
|
44
|
+
|
|
45
|
+
## Continuous changes
|
|
46
|
+
Use Core `continuous-development.md`. Compare approved vs proposed rule/use-case/AC deltas at actual
|
|
47
|
+
source revisions; retain IDs and withdrawn history. Trace changed rules into API/data/event contracts
|
|
48
|
+
and regression expectations. Record docs–code disagreement and its decision owner before propagation.
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: harness-product-techspec
|
|
3
|
+
description: Maintain a selective technical specification from requirements, scoped code, contracts and honest verification evidence.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# TechSpec
|
|
7
|
+
|
|
8
|
+
## Input
|
|
9
|
+
Approved/provisional requirements, code revision, applicable contracts, existing canonical docs, artifact/source-write policy and runtime evidence.
|
|
10
|
+
|
|
11
|
+
## Procedure
|
|
12
|
+
1. Use existing artifacts.json/integrations.json. Reuse known storage answers; for idea-only input ask where canonical docs should live before writing. External tools need actual host capability, not just a configured alias.
|
|
13
|
+
2. Inspect existing documentation and affected code/contracts. Identify facts, proposals and unknowns; do not derive runtime success from static inspection.
|
|
14
|
+
3. Include only relevant overview, architecture, business rules, API/error contracts, data/auth, UI flows, dependencies, compatibility, security and operations sections. Do not force a CRM template, database or API onto every project.
|
|
15
|
+
4. Link requirement IDs to scenario status and raw evidence. Use Core harness-verification; keep static statements UNVERIFIED until checked. Record BLOCKED/NOT_RUN and measured usage honestly.
|
|
16
|
+
5. For existing documents, propose affected section changes and retain unaffected user edits. Compare observed source revision and before/after contracts; record artifact-impact. Source read-only means no write; propose means reviewable patch; write still requires actual host authorization and concurrency checks.
|
|
17
|
+
6. Route a new draft with `aih new-doc techspec`, optionally `--report verification/report.json`. The CLI refuses overwrite and hands external destinations to the host; it does not publish or automatically update sources.
|
|
18
|
+
|
|
19
|
+
## Output
|
|
20
|
+
Selective draft TechSpec, traceability, evidence and affected-section maintenance proposal.
|
|
21
|
+
|
|
22
|
+
## Constraints
|
|
23
|
+
No invented requirements, universal test suite, credentials, blanket regeneration or automatic merge/deployment. Existing BA source is writable only under its declared policy plus actual host permission.
|
|
24
|
+
|
|
25
|
+
## Template
|
|
26
|
+
Use `.harness/capabilities/product/templates/techspec.md` and existing canonical documents.
|
|
27
|
+
|
|
28
|
+
## Example
|
|
29
|
+
Idea: a static calculator needs UX/formula/build/accessibility evidence, no API section. Existing document: an approval transition needs role/state assertions and a proposed affected-section patch.
|
|
30
|
+
|
|
31
|
+
## Quality checklist
|
|
32
|
+
Source revisions, requirement IDs, contracts, actual execution evidence and limits are distinguishable. Partial updates preserve approved text.
|
|
33
|
+
|
|
34
|
+
## Handoff
|
|
35
|
+
Use `.harness/capabilities/product/workflows/techspec-maintenance.md`; pass evidence and proposed changes to review. Documentation remains pending-review until accepted.
|
|
@@ -13,7 +13,7 @@ description: Maintain bidirectional links from document sources through BRD/PRD/
|
|
|
13
13
|
2. Verify referential integrity: no duplicate IDs, orphan stories, orphan AC, or nonexistent source anchors.
|
|
14
14
|
3. Mark not-yet-created artifacts as `pending`; never manufacture Figma node IDs or repository commits.
|
|
15
15
|
4. Compute coverage (e.g. requirements with story, AC and review status) and explicitly state excluded or deferred items.
|
|
16
|
-
5. On source change, compare source version/content, create an impact report for BRD/PRD/stories/UX/OpenSpec and
|
|
16
|
+
5. On source change, compare source version/content, create an impact report for BRD/PRD/stories/UX/OpenSpec and resolve only missing consequential owner decisions before propagation; reuse existing scoped authorization.
|
|
17
17
|
|
|
18
18
|
## Output
|
|
19
19
|
- `docs/product/traceability.md` and `change-impact.md` when requested.
|
|
@@ -39,3 +39,9 @@ Synthetic illustration: SRC-001 → FR-001 → US-001 → AC-US-001-01 → ADR-0
|
|
|
39
39
|
Use `.harness/capabilities/product/workflows/product-to-solution.md`; supply reviewed source/requirement
|
|
40
40
|
IDs, output paths and actual owner decisions to the next BA/PO/SA/PM role as applicable. Return gaps
|
|
41
41
|
to their owner; a single host may perform roles sequentially without claiming independent approval.
|
|
42
|
+
|
|
43
|
+
## Continuous changes
|
|
44
|
+
Extend the same matrix through scoped code/contracts and tests/raw evidence with their revisions.
|
|
45
|
+
On resume, revalidate touched links and invalidate stale coverage; missing artifacts remain pending.
|
|
46
|
+
Preserve stable IDs and unrelated rows. Use Core `continuous-development.md` for source authority,
|
|
47
|
+
section-level proposals and unchanged reasons rather than generating another trace registry.
|
|
@@ -21,3 +21,10 @@ Version: 0.1-draft | PO: <person> | Prioritization method: proposed / approved
|
|
|
21
21
|
- [ ] Story acceptance criteria are testable
|
|
22
22
|
- [ ] UX states and permissions are specified where relevant
|
|
23
23
|
- [ ] PO has explicitly approved priority and readiness
|
|
24
|
+
|
|
25
|
+
## Feedback triage
|
|
26
|
+
| Feedback ID / source / revision | Expected vs observed | Existing requirement / AC | Defect or new request / duplicate of | Proposed priority / value | Decision owner / accepted evidence | Change / next step |
|
|
27
|
+
| --- | --- | --- | --- | --- | --- | --- |
|
|
28
|
+
|
|
29
|
+
Bug reports, UAT findings, user feedback and supplied operating results remain proposals until an
|
|
30
|
+
owner accepts scope. Do not promise a date or add work to the active change just because feedback exists.
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
# TechSpec
|
|
2
|
+
|
|
3
|
+
Status: draft / pending-review
|
|
4
|
+
Source revision: UNVERIFIED
|
|
5
|
+
Canonical storage / source-write policy: pending
|
|
6
|
+
|
|
7
|
+
## Feature overview and requirements
|
|
8
|
+
Link approved or provisional requirement IDs and authoritative source revisions.
|
|
9
|
+
|
|
10
|
+
## Applicable design and contracts
|
|
11
|
+
UNVERIFIED: inspect scoped code. Include only relevant architecture, business rules, UI flows, API/error/data/auth/integration contracts, compatibility and operational concerns.
|
|
12
|
+
|
|
13
|
+
## Verification
|
|
14
|
+
Link requirement → scenario → actual evidence. Record PASSED/FAILED/BLOCKED/NOT_RUN and VERIFIED/UNVERIFIED coverage. Static inspection is not runtime proof.
|
|
15
|
+
|
|
16
|
+
## Maintenance and limitations
|
|
17
|
+
Propose affected sections only; preserve existing edits and apply artifact/source policies. Record unknowns, evidence gaps and review decisions.
|
|
@@ -21,3 +21,10 @@ Version: 0.1-draft | Status: pending-review | Sources reviewed at: <date>
|
|
|
21
21
|
- Missing or pending mappings: <number>
|
|
22
22
|
|
|
23
23
|
Do not fabricate Figma node IDs, code commits or approvals. Write `pending` until they exist.
|
|
24
|
+
|
|
25
|
+
## Implementation and verification links
|
|
26
|
+
| Stable requirement / AC | Spec section / revision | Code / contract path / revision | Test / raw evidence / tested revision | Result / gap |
|
|
27
|
+
| --- | --- | --- | --- | --- |
|
|
28
|
+
|
|
29
|
+
Only observed execution supports runtime PASS. Invalidate affected stale coverage after baseline
|
|
30
|
+
changes; record BLOCKED/NOT_RUN and their reasons. Preserve unchanged rows and retired ID history.
|
|
@@ -9,11 +9,15 @@ A Confluence page, approved brief, BRD/PRD requirement or business rule changed.
|
|
|
9
9
|
3. Identify downstream UI screen IDs and OpenSpec changes only when real mapping entries exist; `pending` is not evidence of a completed artifact.
|
|
10
10
|
4. Analyze scope, security, privacy, business process, cost and schedule impacts. Ask accountable owners to decide whether to accept the change.
|
|
11
11
|
5. Draft proposed changes with new source anchors and a rollback/review plan; never overwrite approved Figma, code or product docs automatically.
|
|
12
|
-
6. Re-run document-review
|
|
12
|
+
6. Re-run document-review; resolve new consequential decisions before downstream handoff. Reuse existing scoped authorization and approval evidence instead of repeating approvals.
|
|
13
13
|
|
|
14
14
|
## Output
|
|
15
|
-
|
|
15
|
+
Impact in the active OpenSpec design or existing canonical change-impact document (do not create a parallel log), mapping `old source version → new version → affected IDs → proposed change → owner/status` and explicit review checkpoints. No automatic external updates.
|
|
16
16
|
|
|
17
17
|
Apply `.harness/core/workflows/artifact-contract.md` for canonical source revisions and storage/write
|
|
18
18
|
policies. Record configured output impact in artifact-impact.json; complete docs/spec/UI updates or
|
|
19
19
|
report blocking dependencies with evidence before review. Do not treat structural readiness as approval.
|
|
20
|
+
|
|
21
|
+
For implementation documentation and affected-section evidence updates, follow `techspec-maintenance.md` with `harness-product-techspec`.
|
|
22
|
+
|
|
23
|
+
Enter via Core `continuous-development.md` for each change/resume; reconcile baseline and carry stable IDs into code/tests/evidence. Treat supplied feedback as proposed backlog scope until accepted.
|
|
@@ -20,3 +20,5 @@ Canonical enterprise source stays in the enterprise system; consumer repo stores
|
|
|
20
20
|
For new/material journeys, continue with `product-to-solution.md` after resolving the relevant scope.
|
|
21
21
|
Use reviewed MVP/outcomes and optional Architecture/Delivery to assess solution/dependencies before
|
|
22
22
|
OpenSpec implementation. Existing approved sources remain canonical; small clear changes stay compact.
|
|
23
|
+
|
|
24
|
+
For implementation documentation and affected-section evidence updates, follow `techspec-maintenance.md` with `harness-product-techspec`.
|
|
@@ -20,3 +20,5 @@ Deliverables are **consumer-owned** `docs/discovery/`, `docs/product/` and `open
|
|
|
20
20
|
For new/material journeys, continue with `product-to-solution.md` after resolving the relevant scope.
|
|
21
21
|
Use reviewed MVP/outcomes and optional Architecture/Delivery to assess solution/dependencies before
|
|
22
22
|
OpenSpec implementation. Existing approved sources remain canonical; small clear changes stay compact.
|
|
23
|
+
|
|
24
|
+
For implementation documentation and affected-section evidence updates, follow `techspec-maintenance.md` with `harness-product-techspec`.
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
# TechSpec maintenance
|
|
2
|
+
|
|
3
|
+
Use `harness-product-techspec` after idea/document intake or a code/contract change. Apply Core artifact-contract before selecting canonical storage and Core adaptive-verification before runtime claims. Requirements, scoped code/contracts and evidence jointly inform the draft; approved SRS intent must not be silently rewritten to match code. If sources conflict, record both revisions and establish the authoritative source/owner decision before changing disputed behavior.
|
|
4
|
+
|
|
5
|
+
For new docs clarify unknown storage, then scaffold only missing documents. For existing docs inspect observed revision and propose affected sections with before/after contracts and artifact-impact. External Confluence/Jira/Figma/database connections remain host-dependent aliases under existing integrations.json, with no new configuration or provider runtime. Recheck actual permission and source-write policy before writes. Return a reviewed patch/publication receipt or a precise BLOCKED handoff; never overwrite or merge automatically.
|
|
6
|
+
|
|
7
|
+
Use Core `continuous-development.md` for every resume: recheck revisions immediately before section writes, reconcile concurrent edits and invalidate affected stale evidence. Preserve stable IDs and unrelated sections; a proposed patch is not canonical publication.
|
package/cli/harness.js
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import fs from 'node:fs';
|
|
2
2
|
import { emptyEnvironment, environmentReport } from './environment.js';
|
|
3
3
|
import { AGENT_CONFIG, agentDefaults, loadAgentConfig } from './agents.js';
|
|
4
|
+
import { reviewVerification, techspecEvidence } from './verification-report.js';
|
|
4
5
|
import { ARTIFACTS, INTEGRATIONS, emptyArtifacts, emptyIntegrations, loadArtifactContract, artifactReport, docRoute } from './artifacts.js';
|
|
5
6
|
import path from 'node:path';
|
|
6
7
|
import { randomUUID } from 'node:crypto';
|
|
@@ -250,7 +251,7 @@ export function newChange(root, name) {
|
|
|
250
251
|
}
|
|
251
252
|
|
|
252
253
|
// Capability drafts are project-owned and never added to the managed bundle.
|
|
253
|
-
export function newDoc(root, name, capability = 'product') {
|
|
254
|
+
export function newDoc(root, name, capability = 'product', options = {}) {
|
|
254
255
|
if (!SLUG.test(name)) throw new HarnessError('Document type must be a lowercase hyphenated slug');
|
|
255
256
|
if (!SLUG.test(capability)) throw new HarnessError('Capability must be a lowercase hyphenated slug');
|
|
256
257
|
return guard(root, () => {
|
|
@@ -266,15 +267,17 @@ export function newDoc(root, name, capability = 'product') {
|
|
|
266
267
|
const declared = loadCapability(path.join(root, '.harness'), capability).templates;
|
|
267
268
|
if (!declared.includes(`templates/${name}.md`)) throw new HarnessError(`Unknown document type for ${capability}: ${name}`);
|
|
268
269
|
if (!Object.hasOwn(lock.files, sourceName)) throw new HarnessError(`Document template is not locked: ${capability}/${name}`);
|
|
270
|
+
if (options.report && (capability !== 'product' || name !== 'techspec')) throw new HarnessError('--report is supported only for product techspec');
|
|
271
|
+
const content = options.report ? techspecEvidence(reviewVerification(root, options.report)) : fs.readFileSync(safe(root, sourceName), 'utf8');
|
|
269
272
|
const folder = capability === 'product' && ['idea', 'research'].includes(name) ? 'discovery' : capability;
|
|
270
273
|
const route = docRoute(root, capability, name);
|
|
271
274
|
if (route?.external) return { status: 'planned', type: name, capability, destination: route.destination,
|
|
272
275
|
write_policy: route.write_policy, executed: false,
|
|
273
|
-
template:
|
|
276
|
+
template: content,
|
|
274
277
|
note: 'External destination: host handoff only. No local fallback or remote write. Use the declared connection and existing authorization; preserve observed revision and return publication evidence.' };
|
|
275
278
|
const outputName = route?.path ?? `docs/${folder}/${name}.md`;
|
|
276
279
|
if (stat(safe(root, outputName))) throw new HarnessError(`Document already exists: ${outputName}`);
|
|
277
|
-
transaction(root, { [outputName]:
|
|
280
|
+
transaction(root, { [outputName]: content });
|
|
278
281
|
return { status: 'ok', type: name, capability, path: outputName,
|
|
279
282
|
note: 'Template only; populate from authorized evidence and obtain human approval.' };
|
|
280
283
|
});
|
package/cli/main.js
CHANGED
|
@@ -4,6 +4,8 @@ import { resolveModules } from './composition.js';
|
|
|
4
4
|
import { parseArgs } from 'node:util';
|
|
5
5
|
import { setupPlan } from './environment.js';
|
|
6
6
|
import { ready } from './readiness.js';
|
|
7
|
+
import { adaptiveVerification } from './verification.js';
|
|
8
|
+
import { reviewVerification } from './verification-report.js';
|
|
7
9
|
import { artifactReport } from './artifacts.js';
|
|
8
10
|
import { SOURCE, readJson, targetRoot, install, check, doctor, newChange, newDoc, loadLock } from './harness.js';
|
|
9
11
|
import path from 'node:path';
|
|
@@ -16,7 +18,7 @@ Usage: aih <command> [options]
|
|
|
16
18
|
skill <name> Load one installed skill on demand
|
|
17
19
|
detect Suggest adapters with evidence from target files
|
|
18
20
|
resolve Validate a module selection and show compatibility warnings
|
|
19
|
-
verify
|
|
21
|
+
verify Plan checks or validate --report evidence (does not execute)
|
|
20
22
|
eval Emit evaluation template, or score --report <file>
|
|
21
23
|
init Install rules and selected adapters
|
|
22
24
|
update Apply the installed CLI bundle to the project (no download)
|
|
@@ -36,7 +38,8 @@ Options:
|
|
|
36
38
|
--agent-preset <id> init only: recommended (default), economy, custom; no overwrite
|
|
37
39
|
--host <id> setup only: codex,claude-code,gemini-cli,cursor,copilot or custom host ID
|
|
38
40
|
--scope <type> verify/eval: adapters (default), capabilities, core, all
|
|
39
|
-
--
|
|
41
|
+
--adaptive verify: discover a read-only project verification plan
|
|
42
|
+
--report <file> eval: score; verify: validate evidence; new-doc techspec: link evidence
|
|
40
43
|
--adapters <a,b> init/resolve: java-spring,react-nextjs,react-native,ai-python,kubernetes,astro
|
|
41
44
|
--capabilities <a,b> init/resolve: uiux,product,architecture,delivery,devops,monetization
|
|
42
45
|
--source <directory> init/update/list/detect/resolve: trusted alternate bundle directory
|
|
@@ -46,7 +49,7 @@ Options:
|
|
|
46
49
|
-v, --version Show installed CLI version
|
|
47
50
|
|
|
48
51
|
Start: init → fill .harness/local.md → ask your AI host to read AGENTS.md.
|
|
49
|
-
The host runs application tests; verify
|
|
52
|
+
The host runs application tests; verify prints plans or validates supplied evidence.
|
|
50
53
|
Update a global CLI with npm install -g @manhd_d/ai-harness@latest,
|
|
51
54
|
then run aih update --dry-run, aih update, and aih check in the project.
|
|
52
55
|
|
|
@@ -61,6 +64,9 @@ Examples:
|
|
|
61
64
|
aih doctor
|
|
62
65
|
aih ready add-order --stage implement
|
|
63
66
|
aih skills
|
|
67
|
+
aih verify --adaptive
|
|
68
|
+
aih verify --report verification/report.json
|
|
69
|
+
aih new-doc techspec --report verification/report.json
|
|
64
70
|
aih new-doc brd
|
|
65
71
|
aih new-doc idea
|
|
66
72
|
aih new-doc research
|
|
@@ -83,7 +89,7 @@ export function main(argv = process.argv.slice(2)) {
|
|
|
83
89
|
args = parseArgs({ args: argv, allowPositionals: true, strict: true, tokens: true, options: {
|
|
84
90
|
target: { type: 'string' }, adapters: { type: 'string' }, capabilities: { type: 'string' }, capability: { type: 'string' }, source: { type: 'string' },
|
|
85
91
|
'agent-preset': { type: 'string' }, host: { type: 'string' },
|
|
86
|
-
detect: { type: 'boolean' }, report: { type: 'string' }, scope: { type: 'string' }, stage: { type: 'string' },
|
|
92
|
+
adaptive: { type: 'boolean' }, detect: { type: 'boolean' }, report: { type: 'string' }, scope: { type: 'string' }, stage: { type: 'string' },
|
|
87
93
|
'dry-run': { type: 'boolean' }, 'allow-major': { type: 'boolean' },
|
|
88
94
|
help: { type: 'boolean', short: 'h' }, version: { type: 'boolean', short: 'v' },
|
|
89
95
|
} });
|
|
@@ -98,7 +104,10 @@ export function main(argv = process.argv.slice(2)) {
|
|
|
98
104
|
if (!['init', 'update', 'check', 'doctor', 'new-change', 'new-doc', 'list', 'detect', 'resolve', 'verify', 'eval', 'skills', 'skill', 'setup', 'ready', 'artifacts'].includes(command)) throw new Error(`Unknown command: ${command}`);
|
|
99
105
|
if (extra.length || (!['new-change', 'new-doc', 'skill', 'ready'].includes(command) && name !== undefined) || (['new-change', 'new-doc', 'skill', 'ready'].includes(command) && name === undefined)) throw new Error('Unexpected or missing positional argument; run aih --help');
|
|
100
106
|
const allowed = new Set(['target', ...(['init', 'update'].includes(command) ? ['source', 'dry-run', 'allow-major'] : []), ...(['init', 'resolve'].includes(command) ? ['adapters', 'capabilities'] : []), ...(command === 'init' ? ['detect'] : []), ...(['list', 'detect', 'resolve'].includes(command) ? ['source'] : []), ...(command === 'eval' ? ['report'] : []), ...(command === 'ready' ? ['stage'] : []), ...(['verify', 'eval'].includes(command) ? ['scope'] : [])]);
|
|
101
|
-
if (command === 'new-doc') allowed.add('capability');
|
|
107
|
+
if (command === 'new-doc') { allowed.add('capability'); allowed.add('report'); }
|
|
108
|
+
if (command === 'verify') { allowed.add('adaptive'); allowed.add('report'); }
|
|
109
|
+
if (args.values.adaptive && args.values.report) throw new Error('Choose --adaptive or --report');
|
|
110
|
+
if (args.values.scope && (args.values.adaptive || (command === 'verify' && args.values.report))) throw new Error('--scope applies only to advisory checks');
|
|
102
111
|
if (command === 'init') allowed.add('agent-preset');
|
|
103
112
|
if (command === 'setup') allowed.add('host');
|
|
104
113
|
for (const key of Object.keys(args.values)) if (!allowed.has(key)) throw new Error(`--${key} is not supported for ${command}`);
|
|
@@ -131,7 +140,10 @@ export function main(argv = process.argv.slice(2)) {
|
|
|
131
140
|
capabilities: values.capabilities === undefined ? [] : values.capabilities.split(',').map(x => x.trim()),
|
|
132
141
|
});
|
|
133
142
|
else if (command === 'detect') result = detect(root, targetRoot(values.source ?? SOURCE));
|
|
134
|
-
else if (command === 'verify')
|
|
143
|
+
else if (command === 'verify') {
|
|
144
|
+
if (values.adaptive || values.report) { if (check(root).status !== 'ok') throw new Error('Fix installation drift before verification'); }
|
|
145
|
+
result = values.report ? reviewVerification(root, values.report) : values.adaptive ? adaptiveVerification(root, SOURCE) : verify(root, values.scope ?? 'adapters');
|
|
146
|
+
}
|
|
135
147
|
else if (command === 'eval') result = evaluate(root, values.report, values.scope ?? 'adapters');
|
|
136
148
|
else if (command === 'artifacts') {
|
|
137
149
|
if (check(root).status !== 'ok') throw new Error('Fix installation drift before reading artifact declarations');
|
|
@@ -143,7 +155,7 @@ export function main(argv = process.argv.slice(2)) {
|
|
|
143
155
|
result = command === 'setup' ? setupPlan(root, loadLock(root).adapters, process.env, values.host) : ready(root, name, values.stage ?? 'implement');
|
|
144
156
|
}
|
|
145
157
|
else if (command === 'new-change') result = newChange(root, name);
|
|
146
|
-
else if (command === 'new-doc') result = newDoc(root, name, values.capability ?? 'product');
|
|
158
|
+
else if (command === 'new-doc') result = newDoc(root, name, values.capability ?? 'product', { report: values.report });
|
|
147
159
|
else result = command === 'doctor' ? doctor(root) : check(root);
|
|
148
160
|
if (command === 'init' || command === 'update') result.next_steps = values['dry-run']
|
|
149
161
|
? ['Review the proposed changes, then repeat without --dry-run.']
|