@dtlabs/ai-toolkit 0.24.6 → 0.24.8
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
CHANGED
|
@@ -1,4 +1,22 @@
|
|
|
1
1
|
## 0.1.4 (2026-07-21)
|
|
2
|
+
## [0.24.8](https://github.com/dtlab-tech/ai-toolkit/compare/v0.24.7...v0.24.8) (2026-11-02)
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
### Bug Fixes
|
|
6
|
+
|
|
7
|
+
* **pm-phase1:** hand gaps still open after three validation cycles to Gate 1 instead of failing the run ([a57e05a](https://github.com/dtlab-tech/ai-toolkit/commit/a57e05abf61ea3c42a36a92cd190cc3d3a57a39c))
|
|
8
|
+
* **pm-phase1:** hand gaps still open after three validation cycles to Gate 1 instead of failing the run ([d759efa](https://github.com/dtlab-tech/ai-toolkit/commit/d759efa9e13d464740698d3b8e01f131e91c848a))
|
|
9
|
+
* **pm-phase1:** hand gaps still open after three validation cycles to Gate 1 instead of failing the run ([976aa27](https://github.com/dtlab-tech/ai-toolkit/commit/976aa2724b8e1e2e91293d88bc0581a5fef01f01))
|
|
10
|
+
|
|
11
|
+
## [0.24.7](https://github.com/dtlab-tech/ai-toolkit/compare/v0.24.6...v0.24.7) (2026-10-30)
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
### Bug Fixes
|
|
15
|
+
|
|
16
|
+
* **pm-phase1:** route validator findings to a document by their prefix when the flags are omitted ([7bd9a38](https://github.com/dtlab-tech/ai-toolkit/commit/7bd9a38de571c07d233a5212dfba9213a1b7d562))
|
|
17
|
+
* **pm-phase1:** route validator findings to a document by their prefix when the flags are omitted ([f957d72](https://github.com/dtlab-tech/ai-toolkit/commit/f957d726294d2b563e67ba1c3f4e59f9c8d57be4))
|
|
18
|
+
* **pm-phase1:** route validator findings to a document by their prefix when the flags are omitted ([e33faef](https://github.com/dtlab-tech/ai-toolkit/commit/e33faefc4488f256e42ec459cefa547f7b5efbf2))
|
|
19
|
+
|
|
2
20
|
## [0.24.6](https://github.com/dtlab-tech/ai-toolkit/compare/v0.24.5...v0.24.6) (2026-10-29)
|
|
3
21
|
|
|
4
22
|
|
package/package.json
CHANGED
|
@@ -71,6 +71,9 @@ Extract from the result:
|
|
|
71
71
|
- `tech_spec.path` / `tech_spec.summary` — Tech-Spec artifact path (the split `spec/index.md` by
|
|
72
72
|
default) and its summary
|
|
73
73
|
- `validation.summary` — validation result (gaps or clean)
|
|
74
|
+
- `validation.open_gaps` — array of the validator's findings still open after the last revision
|
|
75
|
+
cycle; empty when validation was clean. Non-empty means the workflow stopped revising and left
|
|
76
|
+
these for the Gate 1 reviewer to accept, reject or send back
|
|
74
77
|
- `docs_digest` — content digest binding this approval to the exact Requirements/Tech-Spec
|
|
75
78
|
bytes just produced; embed verbatim into `{PREFIX}-Approvals.md` in Step 2 below
|
|
76
79
|
- `token_ledger` — array of per-agent token data from phase 1
|
|
@@ -92,6 +95,11 @@ Documents generated for {PREFIX}:
|
|
|
92
95
|
{tech_spec.path} — {tech_spec.summary}
|
|
93
96
|
{PREFIX}-Validation-Report.md — {validation.summary}
|
|
94
97
|
|
|
98
|
+
If `validation.open_gaps` is non-empty, also list every entry verbatim under a heading
|
|
99
|
+
"Open validation gaps — your decision at this gate", then continue. These are design points the
|
|
100
|
+
validator could not close in three cycles. "Approve with notes" records the ones you accept in
|
|
101
|
+
`{PREFIX}-Approvals.md`; "Request changes" sends them back.
|
|
102
|
+
|
|
95
103
|
To view a single combined document instead of the split source files, run:
|
|
96
104
|
/assemble-docs {PREFIX} [req|spec|all]
|
|
97
105
|
```
|
|
@@ -677,6 +677,8 @@ return c.run(meta.name, featureDir, prefix, async () => {
|
|
|
677
677
|
let assembledRequirements = assembleRequirements()
|
|
678
678
|
let assembledTechSpec = assembleTechSpec()
|
|
679
679
|
let validationSummary = 'skipped (fresh)'
|
|
680
|
+
// Gaps still open after the last revision cycle, handed to Gate 1 for a human decision.
|
|
681
|
+
let openGaps = []
|
|
680
682
|
if (force || changed || !fresh(file('Validation-Report'), [featurePath, reqIndexPath, specIndexPath])) {
|
|
681
683
|
for (let cycle = 1; cycle <= 3; cycle++) {
|
|
682
684
|
// needsRequirementsFix/needsTechSpecFix: explicit structured routing fields,
|
|
@@ -744,8 +746,14 @@ return c.run(meta.name, featureDir, prefix, async () => {
|
|
|
744
746
|
// now-stale self-report. The only authoritative signal for the final verdict is whether any
|
|
745
747
|
// finding remains, from any source, after every check this cycle has run.
|
|
746
748
|
const mergedValid = mergedFindings.length === 0
|
|
747
|
-
|
|
748
|
-
|
|
749
|
+
// Routing reads the prefix of EVERY finding, the validator's own included: the validator is
|
|
750
|
+
// required to prefix each finding with the document it concerns (gaia-validate-feature-docs,
|
|
751
|
+
// output contract), and its own example verdict omits needsRequirementsFix/needsTechSpecFix
|
|
752
|
+
// altogether. Reading the prefix only on host-computed findings made a verdict with prefixed
|
|
753
|
+
// findings and no flags fail with "flagged neither document" (seen on FTR-034). A finding
|
|
754
|
+
// with no prefix and no flag still fails closed below.
|
|
755
|
+
const mergedNeedsTechSpecFix = result.needsTechSpecFix || mergedFindings.some(f => f.startsWith('Tech-Spec:'))
|
|
756
|
+
const mergedNeedsRequirementsFix = result.needsRequirementsFix || mergedFindings.some(f => f.startsWith('Requirements:'))
|
|
749
757
|
|
|
750
758
|
// c.worker() already wrote result.report verbatim via its own outputs[0] contract; only
|
|
751
759
|
// overwrite it when this cycle actually added findings the LLM's own report text doesn't
|
|
@@ -760,7 +768,17 @@ return c.run(meta.name, featureDir, prefix, async () => {
|
|
|
760
768
|
validationSummary = `0 gaps (clean on cycle ${cycle})`
|
|
761
769
|
break
|
|
762
770
|
}
|
|
763
|
-
if (cycle === 3)
|
|
771
|
+
if (cycle === 3) {
|
|
772
|
+
// The deterministic AC<->component traceability gaps stay a hard failure: they are
|
|
773
|
+
// mechanical and the Work Breakdown relies on that mapping. What the validator judges
|
|
774
|
+
// (open design points, drill-down findings) is for a person to accept or reject, and Gate
|
|
775
|
+
// 1 is that review: regenerating again cannot decide a point feature.md leaves undecided
|
|
776
|
+
// (on FTR-034 three full runs of three cycles each never converged for that reason).
|
|
777
|
+
if (structuralFindings.length) throw new Error('Validation gaps remain after 3 cycles')
|
|
778
|
+
openGaps = mergedFindings
|
|
779
|
+
validationSummary = `${openGaps.length} open gap(s) after 3 cycles, left for Gate 1 review (see the Validation Report)`
|
|
780
|
+
break
|
|
781
|
+
}
|
|
764
782
|
if (!mergedNeedsRequirementsFix && !mergedNeedsTechSpecFix) throw new Error(`Validation agent reported gaps on cycle ${cycle} but flagged neither document for revision`)
|
|
765
783
|
revisionFindings = mergedFindings
|
|
766
784
|
if (mergedNeedsRequirementsFix) { await generateRequirements(true); assembledRequirements = assembleRequirements() }
|
|
@@ -778,7 +796,7 @@ return c.run(meta.name, featureDir, prefix, async () => {
|
|
|
778
796
|
prefix, feature_dir: featureDir, feature_path: featurePath,
|
|
779
797
|
requirements: { path: reqIndexPath, summary: 'Requirements ready (split; req/index.md + req/use-cases/*.md)' },
|
|
780
798
|
tech_spec: { path: specIndexPath, summary: 'Tech-Spec ready (split; spec/index.md + spec/components/*.md)' },
|
|
781
|
-
validation: { path: file('Validation-Report'), summary: validationSummary },
|
|
799
|
+
validation: { path: file('Validation-Report'), summary: validationSummary, open_gaps: openGaps },
|
|
782
800
|
docs_digest: docsDigest,
|
|
783
801
|
token_ledger: c.tokenLedger, errors: [],
|
|
784
802
|
}
|