@dtlabs/ai-toolkit 0.24.7 → 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,13 @@
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
+
2
11
  ## [0.24.7](https://github.com/dtlab-tech/ai-toolkit/compare/v0.24.6...v0.24.7) (2026-10-30)
3
12
 
4
13
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@dtlabs/ai-toolkit",
3
- "version": "0.24.7",
3
+ "version": "0.24.8",
4
4
  "description": "AI Toolkit — reusable agents and procedures for developers to build AI-powered applications.",
5
5
  "files": [
6
6
  "docs/",
@@ -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,
@@ -766,7 +768,17 @@ return c.run(meta.name, featureDir, prefix, async () => {
766
768
  validationSummary = `0 gaps (clean on cycle ${cycle})`
767
769
  break
768
770
  }
769
- if (cycle === 3) throw new Error('Validation gaps remain after 3 cycles')
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
+ }
770
782
  if (!mergedNeedsRequirementsFix && !mergedNeedsTechSpecFix) throw new Error(`Validation agent reported gaps on cycle ${cycle} but flagged neither document for revision`)
771
783
  revisionFindings = mergedFindings
772
784
  if (mergedNeedsRequirementsFix) { await generateRequirements(true); assembledRequirements = assembleRequirements() }
@@ -784,7 +796,7 @@ return c.run(meta.name, featureDir, prefix, async () => {
784
796
  prefix, feature_dir: featureDir, feature_path: featurePath,
785
797
  requirements: { path: reqIndexPath, summary: 'Requirements ready (split; req/index.md + req/use-cases/*.md)' },
786
798
  tech_spec: { path: specIndexPath, summary: 'Tech-Spec ready (split; spec/index.md + spec/components/*.md)' },
787
- validation: { path: file('Validation-Report'), summary: validationSummary },
799
+ validation: { path: file('Validation-Report'), summary: validationSummary, open_gaps: openGaps },
788
800
  docs_digest: docsDigest,
789
801
  token_ledger: c.tokenLedger, errors: [],
790
802
  }