@specverse/engines 6.53.1 → 6.63.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/dist/ai/analyse-runner.d.ts.map +1 -1
- package/dist/ai/analyse-runner.js +22 -1
- package/dist/ai/analyse-runner.js.map +1 -1
- package/dist/analyse-prepass/adapters/module-functions.d.ts +25 -0
- package/dist/analyse-prepass/adapters/module-functions.d.ts.map +1 -1
- package/dist/analyse-prepass/adapters/module-functions.js +54 -0
- package/dist/analyse-prepass/adapters/module-functions.js.map +1 -1
- package/dist/analyse-prepass/backends/gitnexus.d.ts +28 -0
- package/dist/analyse-prepass/backends/gitnexus.d.ts.map +1 -1
- package/dist/analyse-prepass/backends/gitnexus.js +36 -2
- package/dist/analyse-prepass/backends/gitnexus.js.map +1 -1
- package/dist/analyse-prepass/index.d.ts.map +1 -1
- package/dist/analyse-prepass/index.js +17 -1
- package/dist/analyse-prepass/index.js.map +1 -1
- package/dist/libs/instance-factories/controllers/templates/fastify/routes-generator.js +29 -10
- package/dist/libs/instance-factories/services/templates/_shared/step-matching.js +11 -0
- package/dist/libs/instance-factories/services/templates/mongodb-native/step-conventions.js +39 -19
- package/dist/libs/instance-factories/services/templates/postgres-native/step-conventions.js +35 -18
- package/dist/libs/instance-factories/services/templates/prisma/ai-behaviors-generator.js +16 -11
- package/dist/libs/instance-factories/services/templates/prisma/controller-generator.js +1 -1
- package/dist/libs/instance-factories/services/templates/prisma/step-conventions.js +34 -12
- package/dist/libs/instance-factories/services/templates/shared-patterns.js +5 -5
- package/dist/realize/index.d.ts.map +1 -1
- package/dist/realize/index.js +91 -10
- package/dist/realize/index.js.map +1 -1
- package/dist/realize/per-action-recovery.d.ts +74 -0
- package/dist/realize/per-action-recovery.d.ts.map +1 -0
- package/dist/realize/per-action-recovery.js +255 -0
- package/dist/realize/per-action-recovery.js.map +1 -0
- package/dist/realize/per-owner-emit.d.ts +6 -0
- package/dist/realize/per-owner-emit.d.ts.map +1 -1
- package/dist/realize/per-owner-emit.js +22 -6
- package/dist/realize/per-owner-emit.js.map +1 -1
- package/dist/realize/per-owner-runner.d.ts +23 -2
- package/dist/realize/per-owner-runner.d.ts.map +1 -1
- package/dist/realize/per-owner-runner.js +91 -46
- package/dist/realize/per-owner-runner.js.map +1 -1
- package/dist/realize/post-emit-verify/diagnostics.d.ts +107 -0
- package/dist/realize/post-emit-verify/diagnostics.d.ts.map +1 -0
- package/dist/realize/post-emit-verify/diagnostics.js +148 -0
- package/dist/realize/post-emit-verify/diagnostics.js.map +1 -0
- package/dist/realize/post-emit-verify/feedback-runner.d.ts +41 -1
- package/dist/realize/post-emit-verify/feedback-runner.d.ts.map +1 -1
- package/dist/realize/post-emit-verify/feedback-runner.js +62 -6
- package/dist/realize/post-emit-verify/feedback-runner.js.map +1 -1
- package/dist/realize/post-emit-verify/index.d.ts +4 -2
- package/dist/realize/post-emit-verify/index.d.ts.map +1 -1
- package/dist/realize/post-emit-verify/index.js +3 -1
- package/dist/realize/post-emit-verify/index.js.map +1 -1
- package/dist/realize/post-emit-verify/reemit.d.ts +22 -1
- package/dist/realize/post-emit-verify/reemit.d.ts.map +1 -1
- package/dist/realize/post-emit-verify/reemit.js +20 -18
- package/dist/realize/post-emit-verify/reemit.js.map +1 -1
- package/dist/realize/post-emit-verify/types.d.ts +49 -0
- package/dist/realize/post-emit-verify/types.d.ts.map +1 -1
- package/dist/realize/post-emit-verify/verifier-manifest.d.ts.map +1 -1
- package/dist/realize/post-emit-verify/verifier-manifest.js +2 -0
- package/dist/realize/post-emit-verify/verifier-manifest.js.map +1 -1
- package/dist/realize/post-emit-verify/verifiers/stub-completeness.d.ts +127 -0
- package/dist/realize/post-emit-verify/verifiers/stub-completeness.d.ts.map +1 -0
- package/dist/realize/post-emit-verify/verifiers/stub-completeness.js +423 -0
- package/dist/realize/post-emit-verify/verifiers/stub-completeness.js.map +1 -0
- package/dist/realize/realize-context-snapshot.d.ts +70 -0
- package/dist/realize/realize-context-snapshot.d.ts.map +1 -0
- package/dist/realize/realize-context-snapshot.js +96 -0
- package/dist/realize/realize-context-snapshot.js.map +1 -0
- package/dist/realize/structural-validator.d.ts +36 -2
- package/dist/realize/structural-validator.d.ts.map +1 -1
- package/dist/realize/structural-validator.js +50 -7
- package/dist/realize/structural-validator.js.map +1 -1
- package/libs/instance-factories/controllers/templates/fastify/routes-generator.ts +49 -15
- package/libs/instance-factories/services/templates/_shared/step-matching.ts +43 -0
- package/libs/instance-factories/services/templates/mongodb-native/step-conventions.ts +39 -19
- package/libs/instance-factories/services/templates/postgres-native/step-conventions.ts +35 -18
- package/libs/instance-factories/services/templates/prisma/__tests__/step-conventions-create.test.ts +184 -0
- package/libs/instance-factories/services/templates/prisma/ai-behaviors-generator.ts +34 -5
- package/libs/instance-factories/services/templates/prisma/controller-generator.ts +6 -1
- package/libs/instance-factories/services/templates/prisma/step-conventions.ts +34 -12
- package/libs/instance-factories/services/templates/shared-patterns.ts +20 -10
- package/package.json +1 -1
- package/libs/instance-factories/services/templates/_shared/step-matching.d.ts +0 -39
- package/libs/instance-factories/services/templates/_shared/step-matching.d.ts.map +0 -1
- package/libs/instance-factories/services/templates/_shared/step-matching.js +0 -90
- package/libs/instance-factories/services/templates/_shared/step-matching.js.map +0 -1
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Diagnostic layer — runs stub-completeness (and future observe-only
|
|
3
|
+
* verifiers) on the realized output and writes a `realize-quality.json`
|
|
4
|
+
* sidecar. Runs independently of the feedback runner.
|
|
5
|
+
*
|
|
6
|
+
* Why this exists (Phase 1 of 2026-05-13-VERIFIER-DIAGNOSTIC-TREATMENT-SPLIT):
|
|
7
|
+
* The realize pipeline used to print `✅ All code generated` and the
|
|
8
|
+
* user would only discover stub bodies at runtime. The post-emit-verify
|
|
9
|
+
* framework can detect stubs but only fires opt-in via
|
|
10
|
+
* `SPECVERSE_REALIZE_POST_VERIFY_ENABLE=stub-completeness`, and even
|
|
11
|
+
* then the findings are buried in pass logs. This module promotes the
|
|
12
|
+
* diagnostic to a first-class artifact: a sidecar JSON + a CLI summary
|
|
13
|
+
* line at end of realize.
|
|
14
|
+
*
|
|
15
|
+
* The diagnostic layer:
|
|
16
|
+
* - Runs ALWAYS when there are emitted `.ai.ts` files
|
|
17
|
+
* - Calls stub-completeness directly (bypasses the manifest's
|
|
18
|
+
* enabledByDefault gate — diagnostic should run regardless of whether
|
|
19
|
+
* the verifier is wired into the auto-fix loop)
|
|
20
|
+
* - Writes `<outputDir>/realize-quality.json`
|
|
21
|
+
* - Returns a summary suitable for CLI display
|
|
22
|
+
*
|
|
23
|
+
* Costs: regex-only scan of `.ai.ts` files. Milliseconds. No LLM calls.
|
|
24
|
+
* Disabled via `SPECVERSE_REALIZE_NO_DIAGNOSTICS=1` for users who really
|
|
25
|
+
* don't want the sidecar.
|
|
26
|
+
*/
|
|
27
|
+
import { existsSync, readFileSync, writeFileSync } from 'fs';
|
|
28
|
+
import { join } from 'path';
|
|
29
|
+
import { STUB_COMPLETENESS_VERIFIER } from './verifiers/stub-completeness.js';
|
|
30
|
+
import { defaultMapFileToOwner } from './feedback-runner.js';
|
|
31
|
+
/**
|
|
32
|
+
* Run the diagnostic verifiers on the realized output, write the
|
|
33
|
+
* sidecar, return a summary for the CLI.
|
|
34
|
+
*
|
|
35
|
+
* Returns null when there's nothing to report (e.g. no `.ai.ts` files
|
|
36
|
+
* at all — typical for backend-only validate-only specs). Caller
|
|
37
|
+
* suppresses CLI output in that case.
|
|
38
|
+
*/
|
|
39
|
+
export async function runDiagnostics(ctx) {
|
|
40
|
+
if (!STUB_COMPLETENESS_VERIFIER.applies(ctx))
|
|
41
|
+
return null;
|
|
42
|
+
const stubResult = await STUB_COMPLETENESS_VERIFIER.verify(ctx);
|
|
43
|
+
const byOwner = {};
|
|
44
|
+
const stubsByCode = {};
|
|
45
|
+
for (const e of stubResult.errors) {
|
|
46
|
+
const ownerName = defaultMapFileToOwner(e.file) ?? '__unmapped__';
|
|
47
|
+
if (!byOwner[ownerName]) {
|
|
48
|
+
byOwner[ownerName] = { ownerName, stubs: [] };
|
|
49
|
+
}
|
|
50
|
+
byOwner[ownerName].stubs.push({
|
|
51
|
+
code: e.code,
|
|
52
|
+
file: e.file,
|
|
53
|
+
line: e.line,
|
|
54
|
+
col: e.col,
|
|
55
|
+
message: e.message,
|
|
56
|
+
});
|
|
57
|
+
stubsByCode[e.code] = (stubsByCode[e.code] ?? 0) + 1;
|
|
58
|
+
}
|
|
59
|
+
const sidecar = {
|
|
60
|
+
schemaVersion: '1.0',
|
|
61
|
+
ranAt: new Date().toISOString(),
|
|
62
|
+
ctx: {
|
|
63
|
+
outputDir: ctx.outputDir,
|
|
64
|
+
...(ctx.targetLanguage ? { targetLanguage: ctx.targetLanguage } : {}),
|
|
65
|
+
...(ctx.subpath ? { subpath: ctx.subpath } : {}),
|
|
66
|
+
},
|
|
67
|
+
totals: {
|
|
68
|
+
stubs: stubResult.errors.length,
|
|
69
|
+
stubsByCode,
|
|
70
|
+
ownersWithStubs: Object.keys(byOwner).length,
|
|
71
|
+
},
|
|
72
|
+
byOwner,
|
|
73
|
+
notes: stubResult.notes,
|
|
74
|
+
};
|
|
75
|
+
const sidecarPath = join(ctx.outputDir, 'realize-quality.json');
|
|
76
|
+
try {
|
|
77
|
+
writeFileSync(sidecarPath, JSON.stringify(sidecar, null, 2));
|
|
78
|
+
}
|
|
79
|
+
catch {
|
|
80
|
+
return null;
|
|
81
|
+
}
|
|
82
|
+
return {
|
|
83
|
+
totalStubs: sidecar.totals.stubs,
|
|
84
|
+
ownersWithStubs: sidecar.totals.ownersWithStubs,
|
|
85
|
+
sidecarPath,
|
|
86
|
+
};
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Format the one-line CLI summary for `spv realize` output.
|
|
90
|
+
*
|
|
91
|
+
* ⚠ realize-quality: 5 stubs across 3 owners (see realize-quality.json)
|
|
92
|
+
*
|
|
93
|
+
* Returns null when there's nothing to flag — caller should not print
|
|
94
|
+
* anything in that case (no false-positive noise on clean realizes).
|
|
95
|
+
*/
|
|
96
|
+
export function formatSummaryLine(summary) {
|
|
97
|
+
if (!summary || summary.totalStubs === 0)
|
|
98
|
+
return null;
|
|
99
|
+
const ownerWord = summary.ownersWithStubs === 1 ? 'owner' : 'owners';
|
|
100
|
+
const stubWord = summary.totalStubs === 1 ? 'stub' : 'stubs';
|
|
101
|
+
return (` ⚠ realize-quality: ${summary.totalStubs} ${stubWord} across ` +
|
|
102
|
+
`${summary.ownersWithStubs} ${ownerWord} (see realize-quality.json)`);
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* Read the existing `realize-quality.json` sidecar, attach the
|
|
106
|
+
* feedback runner's `specGaps`, and rewrite. Idempotent — safe to call
|
|
107
|
+
* multiple times. Skips silently when the sidecar doesn't exist
|
|
108
|
+
* (diagnostics never ran or wrote it).
|
|
109
|
+
*
|
|
110
|
+
* Phase 2 of 2026-05-13-VERIFIER-DIAGNOSTIC-TREATMENT-SPLIT: the
|
|
111
|
+
* feedback runner returns specGaps; realize's index.ts calls this to
|
|
112
|
+
* merge them into the sidecar so users have one place to inspect
|
|
113
|
+
* realize quality.
|
|
114
|
+
*/
|
|
115
|
+
export function appendSpecGaps(outputDir, specGaps) {
|
|
116
|
+
if (specGaps.length === 0)
|
|
117
|
+
return;
|
|
118
|
+
const path = join(outputDir, 'realize-quality.json');
|
|
119
|
+
if (!existsSync(path))
|
|
120
|
+
return;
|
|
121
|
+
try {
|
|
122
|
+
const raw = readFileSync(path, 'utf8');
|
|
123
|
+
const sidecar = JSON.parse(raw);
|
|
124
|
+
sidecar.specGaps = specGaps;
|
|
125
|
+
sidecar.totals.specGaps = specGaps.length;
|
|
126
|
+
writeFileSync(path, JSON.stringify(sidecar, null, 2));
|
|
127
|
+
}
|
|
128
|
+
catch {
|
|
129
|
+
// best-effort sidecar — don't crash realize on a parse failure
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
/**
|
|
133
|
+
* Format the spec-gap one-liner for `spv realize` output. Distinct from
|
|
134
|
+
* the stub summary because spec gaps indicate the user needs to act
|
|
135
|
+
* (adjust spec/manifest/provider), not just inspect.
|
|
136
|
+
*
|
|
137
|
+
* ⚠ realize-quality: 3 spec gap(s) surfaced; review realize-quality.json::specGaps
|
|
138
|
+
*
|
|
139
|
+
* Returns null when there are no gaps.
|
|
140
|
+
*/
|
|
141
|
+
export function formatSpecGapLine(specGapCount) {
|
|
142
|
+
if (specGapCount === 0)
|
|
143
|
+
return null;
|
|
144
|
+
const word = specGapCount === 1 ? 'spec gap' : 'spec gaps';
|
|
145
|
+
return (` ⚠ realize-quality: ${specGapCount} ${word} surfaced; ` +
|
|
146
|
+
`review realize-quality.json::specGaps`);
|
|
147
|
+
}
|
|
148
|
+
//# sourceMappingURL=diagnostics.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"diagnostics.js","sourceRoot":"","sources":["../../../src/realize/post-emit-verify/diagnostics.ts"],"names":[],"mappings":"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"}
|
|
@@ -20,7 +20,7 @@
|
|
|
20
20
|
* the runner rolls back to the previous content. The LLM doesn't get
|
|
21
21
|
* to make things worse.
|
|
22
22
|
*/
|
|
23
|
-
import type { VerifyContext, VerifyError } from './types.js';
|
|
23
|
+
import type { SpecGapEntry, TreatmentSelector, TreatmentStrategy, VerifyContext, VerifyError } from './types.js';
|
|
24
24
|
export interface ReemitRequest {
|
|
25
25
|
/** Resolved owner name (e.g. `AuthController`). */
|
|
26
26
|
ownerName: string;
|
|
@@ -50,6 +50,25 @@ export interface FeedbackRunOptions {
|
|
|
50
50
|
* Set via env: `SPECVERSE_REALIZE_POST_VERIFY_MAX_FILES=N`.
|
|
51
51
|
*/
|
|
52
52
|
maxFilesPerPass?: number;
|
|
53
|
+
/**
|
|
54
|
+
* Set of verifier ids to enable in addition to the
|
|
55
|
+
* `enabledByDefault: true` set. Used to opt in to experimental
|
|
56
|
+
* verifiers like `stub-completeness` (default-off until empirically
|
|
57
|
+
* validated). Passed straight through to `runAllVerifiers`.
|
|
58
|
+
*
|
|
59
|
+
* Set via env: `SPECVERSE_REALIZE_POST_VERIFY_ENABLE=id1,id2`.
|
|
60
|
+
*/
|
|
61
|
+
enabledOverrides?: Set<string>;
|
|
62
|
+
/**
|
|
63
|
+
* Treatment selector — decides per-error whether to auto-reemit,
|
|
64
|
+
* surface as spec gap, or skip. Defaults to
|
|
65
|
+
* `defaultTreatmentSelector` (Phase 2 of
|
|
66
|
+
* 2026-05-13-VERIFIER-DIAGNOSTIC-TREATMENT-SPLIT).
|
|
67
|
+
*
|
|
68
|
+
* Override at the call site for advanced cases (custom verifiers,
|
|
69
|
+
* stricter / more permissive LLM tolerance profiles).
|
|
70
|
+
*/
|
|
71
|
+
treatmentSelector?: TreatmentSelector;
|
|
53
72
|
}
|
|
54
73
|
export interface PassResult {
|
|
55
74
|
passNumber: number;
|
|
@@ -72,6 +91,10 @@ export interface FeedbackRunResult {
|
|
|
72
91
|
verifierId: string;
|
|
73
92
|
notes: string[];
|
|
74
93
|
}>;
|
|
94
|
+
/** Errors classified `surface-spec-gap` by the treatment selector —
|
|
95
|
+
* these are NOT auto-fixed; the caller writes them to the
|
|
96
|
+
* realize-quality.json sidecar's `specGaps` field for user review. */
|
|
97
|
+
specGaps: SpecGapEntry[];
|
|
75
98
|
}
|
|
76
99
|
/**
|
|
77
100
|
* Default file→owner mapping for the SpecVerse TypeScript layout:
|
|
@@ -80,5 +103,22 @@ export interface FeedbackRunResult {
|
|
|
80
103
|
* Returns null for files that don't match.
|
|
81
104
|
*/
|
|
82
105
|
export declare function defaultMapFileToOwner(file: string): string | null;
|
|
106
|
+
/**
|
|
107
|
+
* Default treatment policy (Phase 2 of
|
|
108
|
+
* 2026-05-13-VERIFIER-DIAGNOSTIC-TREATMENT-SPLIT):
|
|
109
|
+
*
|
|
110
|
+
* - `STUB002` (LLM-throw stubs) → `surface-spec-gap`. The LLM already
|
|
111
|
+
* signaled "I lack context for this action" via the throw message;
|
|
112
|
+
* re-prompting either no-ops or hallucinates cross-file regressions.
|
|
113
|
+
* Better to tell the user about the gap so they can adjust the
|
|
114
|
+
* spec / manifest / provider choice.
|
|
115
|
+
*
|
|
116
|
+
* - Everything else (tsc errors, STUB001 γ-fallback, STUB003 trivial-
|
|
117
|
+
* return, STUB004 empty-body, STUB005 misplaced-brace, future
|
|
118
|
+
* codes) → `auto-reemit`.
|
|
119
|
+
*
|
|
120
|
+
* Override at the call site for testing or for advanced policies.
|
|
121
|
+
*/
|
|
122
|
+
export declare function defaultTreatmentSelector(error: VerifyError): TreatmentStrategy;
|
|
83
123
|
export declare function runPostEmitFeedback(ctx: VerifyContext, reemit: Reemit, options?: FeedbackRunOptions): Promise<FeedbackRunResult>;
|
|
84
124
|
//# sourceMappingURL=feedback-runner.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"feedback-runner.d.ts","sourceRoot":"","sources":["../../../src/realize/post-emit-verify/feedback-runner.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAKH,OAAO,KAAK,EACV,aAAa,EACb,WAAW,EAEZ,MAAM,YAAY,CAAC;AAEpB,MAAM,WAAW,aAAa;IAC5B,mDAAmD;IACnD,SAAS,EAAE,MAAM,CAAC;IAClB;yDACqD;IACrD,IAAI,EAAE,MAAM,CAAC;IACb,oCAAoC;IACpC,MAAM,EAAE,WAAW,EAAE,CAAC;IACtB,2DAA2D;IAC3D,eAAe,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,MAAM,MAAM,GAAG,CAAC,GAAG,EAAE,aAAa,KAAK,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;AAEpE,MAAM,WAAW,kBAAkB;IACjC;uEACmE;IACnE,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;2EACuE;IACvE,cAAc,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,GAAG,IAAI,CAAC;IACjD;;;;;;;;OAQG;IACH,eAAe,CAAC,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"feedback-runner.d.ts","sourceRoot":"","sources":["../../../src/realize/post-emit-verify/feedback-runner.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAKH,OAAO,KAAK,EACV,YAAY,EACZ,iBAAiB,EACjB,iBAAiB,EACjB,aAAa,EACb,WAAW,EAEZ,MAAM,YAAY,CAAC;AAEpB,MAAM,WAAW,aAAa;IAC5B,mDAAmD;IACnD,SAAS,EAAE,MAAM,CAAC;IAClB;yDACqD;IACrD,IAAI,EAAE,MAAM,CAAC;IACb,oCAAoC;IACpC,MAAM,EAAE,WAAW,EAAE,CAAC;IACtB,2DAA2D;IAC3D,eAAe,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,MAAM,MAAM,GAAG,CAAC,GAAG,EAAE,aAAa,KAAK,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;AAEpE,MAAM,WAAW,kBAAkB;IACjC;uEACmE;IACnE,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;2EACuE;IACvE,cAAc,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,GAAG,IAAI,CAAC;IACjD;;;;;;;;OAQG;IACH,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB;;;;;;;OAOG;IACH,gBAAgB,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IAC/B;;;;;;;;OAQG;IACH,iBAAiB,CAAC,EAAE,iBAAiB,CAAC;CACvC;AAED,MAAM,WAAW,UAAU;IACzB,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;IACpB,eAAe,EAAE,MAAM,CAAC;IACxB,cAAc,EAAE,MAAM,CAAC;IACvB,eAAe,EAAE,MAAM,CAAC;IACxB,gBAAgB,EAAE,MAAM,CAAC;IACzB,gBAAgB,EAAE,MAAM,CAAC;IACzB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,qEAAqE;IACrE,gBAAgB,EAAE,MAAM,CAAC;CAC1B;AAED,MAAM,WAAW,iBAAiB;IAChC,aAAa,EAAE,WAAW,EAAE,CAAC;IAC7B,WAAW,EAAE,WAAW,EAAE,CAAC;IAC3B,MAAM,EAAE,UAAU,EAAE,CAAC;IACrB,aAAa,EAAE,KAAK,CAAC;QAAE,UAAU,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC,CAAC;IAC9D;;2EAEuE;IACvE,QAAQ,EAAE,YAAY,EAAE,CAAC;CAC1B;AAED;;;;;GAKG;AACH,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAGjE;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,WAAW,GAAG,iBAAiB,CAG9E;AAyBD,wBAAsB,mBAAmB,CACvC,GAAG,EAAE,aAAa,EAClB,MAAM,EAAE,MAAM,EACd,OAAO,GAAE,kBAAuB,GAC/B,OAAO,CAAC,iBAAiB,CAAC,CAgK5B"}
|
|
@@ -33,6 +33,27 @@ export function defaultMapFileToOwner(file) {
|
|
|
33
33
|
const m = /(?:^|\/)([A-Za-z_][\w-]*)\.ai\.ts$/.exec(file);
|
|
34
34
|
return m ? m[1] : null;
|
|
35
35
|
}
|
|
36
|
+
/**
|
|
37
|
+
* Default treatment policy (Phase 2 of
|
|
38
|
+
* 2026-05-13-VERIFIER-DIAGNOSTIC-TREATMENT-SPLIT):
|
|
39
|
+
*
|
|
40
|
+
* - `STUB002` (LLM-throw stubs) → `surface-spec-gap`. The LLM already
|
|
41
|
+
* signaled "I lack context for this action" via the throw message;
|
|
42
|
+
* re-prompting either no-ops or hallucinates cross-file regressions.
|
|
43
|
+
* Better to tell the user about the gap so they can adjust the
|
|
44
|
+
* spec / manifest / provider choice.
|
|
45
|
+
*
|
|
46
|
+
* - Everything else (tsc errors, STUB001 γ-fallback, STUB003 trivial-
|
|
47
|
+
* return, STUB004 empty-body, STUB005 misplaced-brace, future
|
|
48
|
+
* codes) → `auto-reemit`.
|
|
49
|
+
*
|
|
50
|
+
* Override at the call site for testing or for advanced policies.
|
|
51
|
+
*/
|
|
52
|
+
export function defaultTreatmentSelector(error) {
|
|
53
|
+
if (error.code === 'STUB002')
|
|
54
|
+
return 'surface-spec-gap';
|
|
55
|
+
return 'auto-reemit';
|
|
56
|
+
}
|
|
36
57
|
/**
|
|
37
58
|
* Group verifier errors by file (preserving error order within each
|
|
38
59
|
* file). Files with no errors are absent from the map.
|
|
@@ -63,15 +84,49 @@ export async function runPostEmitFeedback(ctx, reemit, options = {}) {
|
|
|
63
84
|
const maxPasses = options.maxPasses ?? 1;
|
|
64
85
|
const maxFilesPerPass = options.maxFilesPerPass ?? 20;
|
|
65
86
|
const mapFileToOwner = options.mapFileToOwner ?? defaultMapFileToOwner;
|
|
87
|
+
const enabledOverrides = options.enabledOverrides;
|
|
88
|
+
const treatmentSelector = options.treatmentSelector ?? defaultTreatmentSelector;
|
|
66
89
|
const passes = [];
|
|
67
90
|
const verifierNotes = [];
|
|
91
|
+
const specGaps = [];
|
|
92
|
+
const seenSpecGaps = new Set();
|
|
93
|
+
/** Pull out spec-gap classified errors into the result's specGaps[]
|
|
94
|
+
* while leaving auto-reemit errors in place for the loop. Dedups
|
|
95
|
+
* across passes (same error from re-running verifiers shouldn't
|
|
96
|
+
* appear twice in the sidecar). */
|
|
97
|
+
function partitionErrors(errors) {
|
|
98
|
+
const actionable = [];
|
|
99
|
+
for (const e of errors) {
|
|
100
|
+
const strategy = treatmentSelector(e);
|
|
101
|
+
if (strategy === 'surface-spec-gap') {
|
|
102
|
+
const key = `${e.file}:${e.line ?? 0}:${e.col ?? 0}:${e.code}`;
|
|
103
|
+
if (!seenSpecGaps.has(key)) {
|
|
104
|
+
seenSpecGaps.add(key);
|
|
105
|
+
specGaps.push({
|
|
106
|
+
ownerName: mapFileToOwner(e.file),
|
|
107
|
+
file: e.file,
|
|
108
|
+
...(e.line !== undefined ? { line: e.line } : {}),
|
|
109
|
+
...(e.col !== undefined ? { col: e.col } : {}),
|
|
110
|
+
code: e.code,
|
|
111
|
+
message: e.message,
|
|
112
|
+
});
|
|
113
|
+
}
|
|
114
|
+
continue;
|
|
115
|
+
}
|
|
116
|
+
if (strategy === 'skip')
|
|
117
|
+
continue;
|
|
118
|
+
actionable.push(e);
|
|
119
|
+
}
|
|
120
|
+
return actionable;
|
|
121
|
+
}
|
|
68
122
|
// Initial verifier pass.
|
|
69
|
-
let currentResults = await runAllVerifiers(ctx);
|
|
123
|
+
let currentResults = await runAllVerifiers(ctx, enabledOverrides);
|
|
70
124
|
for (const r of currentResults) {
|
|
71
125
|
if (r.notes.length > 0)
|
|
72
126
|
verifierNotes.push({ verifierId: r.verifierId, notes: r.notes });
|
|
73
127
|
}
|
|
74
|
-
const
|
|
128
|
+
const initialErrorsRaw = currentResults.flatMap((r) => r.errors);
|
|
129
|
+
const initialErrors = partitionErrors(initialErrorsRaw);
|
|
75
130
|
let currentErrors = initialErrors;
|
|
76
131
|
for (let pass = 1; pass <= maxPasses; pass++) {
|
|
77
132
|
const errorsBefore = currentErrors.length;
|
|
@@ -129,8 +184,8 @@ export async function runPostEmitFeedback(ctx, reemit, options = {}) {
|
|
|
129
184
|
writeFileSync(absFile, newContent);
|
|
130
185
|
}
|
|
131
186
|
// Re-run verifiers, then compare per-file error counts.
|
|
132
|
-
const newResults = await runAllVerifiers(ctx);
|
|
133
|
-
let newErrors = newResults.flatMap((r) => r.errors);
|
|
187
|
+
const newResults = await runAllVerifiers(ctx, enabledOverrides);
|
|
188
|
+
let newErrors = partitionErrors(newResults.flatMap((r) => r.errors));
|
|
134
189
|
// Rollback pass: any file whose error count INCREASED gets restored.
|
|
135
190
|
// Only consider files we actually attempted (within the budget).
|
|
136
191
|
const filesToRestore = [];
|
|
@@ -155,8 +210,8 @@ export async function runPostEmitFeedback(ctx, reemit, options = {}) {
|
|
|
155
210
|
}
|
|
156
211
|
// Re-run verifiers one more time so the reported `errorsAfter`
|
|
157
212
|
// reflects the post-rollback state.
|
|
158
|
-
const finalResults = await runAllVerifiers(ctx);
|
|
159
|
-
newErrors = finalResults.flatMap((r) => r.errors);
|
|
213
|
+
const finalResults = await runAllVerifiers(ctx, enabledOverrides);
|
|
214
|
+
newErrors = partitionErrors(finalResults.flatMap((r) => r.errors));
|
|
160
215
|
}
|
|
161
216
|
passResult.errorsAfter = newErrors.length;
|
|
162
217
|
passes.push(passResult);
|
|
@@ -172,6 +227,7 @@ export async function runPostEmitFeedback(ctx, reemit, options = {}) {
|
|
|
172
227
|
finalErrors: currentErrors,
|
|
173
228
|
passes,
|
|
174
229
|
verifierNotes,
|
|
230
|
+
specGaps,
|
|
175
231
|
};
|
|
176
232
|
}
|
|
177
233
|
//# sourceMappingURL=feedback-runner.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"feedback-runner.js","sourceRoot":"","sources":["../../../src/realize/post-emit-verify/feedback-runner.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAEH,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,IAAI,CAAC;AACjD,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;
|
|
1
|
+
{"version":3,"file":"feedback-runner.js","sourceRoot":"","sources":["../../../src/realize/post-emit-verify/feedback-runner.ts"],"names":[],"mappings":"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"}
|
|
@@ -9,9 +9,11 @@
|
|
|
9
9
|
* See `specverse-self/docs/proposals/...` (TBD) for the design rationale
|
|
10
10
|
* + empirical evidence from idle-meta 2026-05-13.
|
|
11
11
|
*/
|
|
12
|
-
export { type PostEmitVerifier, type VerifyContext, type VerifyError, type VerifyResult, type OwnerMapping, } from './types.js';
|
|
12
|
+
export { type PostEmitVerifier, type VerifyContext, type VerifyError, type VerifyResult, type OwnerMapping, type TreatmentStrategy, type TreatmentSelector, type SpecGapEntry, } from './types.js';
|
|
13
13
|
export { VERIFIERS, runAllVerifiers, findVerifier, } from './verifier-manifest.js';
|
|
14
|
-
export { runPostEmitFeedback, defaultMapFileToOwner, type Reemit, type ReemitRequest, type FeedbackRunOptions, type FeedbackRunResult, type PassResult, } from './feedback-runner.js';
|
|
14
|
+
export { runPostEmitFeedback, defaultMapFileToOwner, defaultTreatmentSelector, type Reemit, type ReemitRequest, type FeedbackRunOptions, type FeedbackRunResult, type PassResult, } from './feedback-runner.js';
|
|
15
15
|
export { TSC_VERIFIER } from './verifiers/tsc.js';
|
|
16
16
|
export { buildLlmReemit, formatFeedbackPrompt, type BuildReemitOptions, } from './reemit.js';
|
|
17
|
+
export { runDiagnostics, formatSummaryLine, appendSpecGaps, formatSpecGapLine, type RealizeQualitySidecar, type RealizeQualitySummary, type OwnerQualityEntry, type OwnerStubIssue, } from './diagnostics.js';
|
|
18
|
+
export { STUB_COMPLETENESS_VERIFIER } from './verifiers/stub-completeness.js';
|
|
17
19
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/realize/post-emit-verify/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EACL,KAAK,gBAAgB,EACrB,KAAK,aAAa,EAClB,KAAK,WAAW,EAChB,KAAK,YAAY,EACjB,KAAK,YAAY,GAClB,MAAM,YAAY,CAAC;AAEpB,OAAO,EACL,SAAS,EACT,eAAe,EACf,YAAY,GACb,MAAM,wBAAwB,CAAC;AAEhC,OAAO,EACL,mBAAmB,EACnB,qBAAqB,EACrB,KAAK,MAAM,EACX,KAAK,aAAa,EAClB,KAAK,kBAAkB,EACvB,KAAK,iBAAiB,EACtB,KAAK,UAAU,GAChB,MAAM,sBAAsB,CAAC;AAE9B,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAElD,OAAO,EACL,cAAc,EACd,oBAAoB,EACpB,KAAK,kBAAkB,GACxB,MAAM,aAAa,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/realize/post-emit-verify/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EACL,KAAK,gBAAgB,EACrB,KAAK,aAAa,EAClB,KAAK,WAAW,EAChB,KAAK,YAAY,EACjB,KAAK,YAAY,EACjB,KAAK,iBAAiB,EACtB,KAAK,iBAAiB,EACtB,KAAK,YAAY,GAClB,MAAM,YAAY,CAAC;AAEpB,OAAO,EACL,SAAS,EACT,eAAe,EACf,YAAY,GACb,MAAM,wBAAwB,CAAC;AAEhC,OAAO,EACL,mBAAmB,EACnB,qBAAqB,EACrB,wBAAwB,EACxB,KAAK,MAAM,EACX,KAAK,aAAa,EAClB,KAAK,kBAAkB,EACvB,KAAK,iBAAiB,EACtB,KAAK,UAAU,GAChB,MAAM,sBAAsB,CAAC;AAE9B,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAElD,OAAO,EACL,cAAc,EACd,oBAAoB,EACpB,KAAK,kBAAkB,GACxB,MAAM,aAAa,CAAC;AAErB,OAAO,EACL,cAAc,EACd,iBAAiB,EACjB,cAAc,EACd,iBAAiB,EACjB,KAAK,qBAAqB,EAC1B,KAAK,qBAAqB,EAC1B,KAAK,iBAAiB,EACtB,KAAK,cAAc,GACpB,MAAM,kBAAkB,CAAC;AAE1B,OAAO,EAAE,0BAA0B,EAAE,MAAM,kCAAkC,CAAC"}
|
|
@@ -10,7 +10,9 @@
|
|
|
10
10
|
* + empirical evidence from idle-meta 2026-05-13.
|
|
11
11
|
*/
|
|
12
12
|
export { VERIFIERS, runAllVerifiers, findVerifier, } from './verifier-manifest.js';
|
|
13
|
-
export { runPostEmitFeedback, defaultMapFileToOwner, } from './feedback-runner.js';
|
|
13
|
+
export { runPostEmitFeedback, defaultMapFileToOwner, defaultTreatmentSelector, } from './feedback-runner.js';
|
|
14
14
|
export { TSC_VERIFIER } from './verifiers/tsc.js';
|
|
15
15
|
export { buildLlmReemit, formatFeedbackPrompt, } from './reemit.js';
|
|
16
|
+
export { runDiagnostics, formatSummaryLine, appendSpecGaps, formatSpecGapLine, } from './diagnostics.js';
|
|
17
|
+
export { STUB_COMPLETENESS_VERIFIER } from './verifiers/stub-completeness.js';
|
|
16
18
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/realize/post-emit-verify/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/realize/post-emit-verify/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAaH,OAAO,EACL,SAAS,EACT,eAAe,EACf,YAAY,GACb,MAAM,wBAAwB,CAAC;AAEhC,OAAO,EACL,mBAAmB,EACnB,qBAAqB,EACrB,wBAAwB,GAMzB,MAAM,sBAAsB,CAAC;AAE9B,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAElD,OAAO,EACL,cAAc,EACd,oBAAoB,GAErB,MAAM,aAAa,CAAC;AAErB,OAAO,EACL,cAAc,EACd,iBAAiB,EACjB,cAAc,EACd,iBAAiB,GAKlB,MAAM,kBAAkB,CAAC;AAE1B,OAAO,EAAE,0BAA0B,EAAE,MAAM,kCAAkC,CAAC"}
|
|
@@ -44,6 +44,20 @@ export interface BuildReemitOptions {
|
|
|
44
44
|
* convention, γ-stub shape).
|
|
45
45
|
*/
|
|
46
46
|
skills?: string[];
|
|
47
|
+
/**
|
|
48
|
+
* Optional context loader (Phase 3 of
|
|
49
|
+
* 2026-05-13-VERIFIER-DIAGNOSTIC-TREATMENT-SPLIT).
|
|
50
|
+
*
|
|
51
|
+
* For each owner whose file is being re-emitted, return the per-owner
|
|
52
|
+
* realize-context snapshot (TARGET RUNTIME + [PRE-BAKED] step bullets
|
|
53
|
+
* + cross-service surface + capabilities) as a markdown blob, or null
|
|
54
|
+
* if no snapshot exists. The returned blob is prepended to the
|
|
55
|
+
* reemit user prompt — same shape the original per-owner emit used.
|
|
56
|
+
*
|
|
57
|
+
* The default-built loader (in realize/index.ts) reads from
|
|
58
|
+
* `<outputDir>/.realize-context/<Owner>.md`. Tests may inject fakes.
|
|
59
|
+
*/
|
|
60
|
+
contextLoader?: (ownerName: string) => string | null;
|
|
47
61
|
}
|
|
48
62
|
/**
|
|
49
63
|
* Build a `Reemit` callback that uses the provided LLM model.
|
|
@@ -55,7 +69,14 @@ export declare function buildLlmReemit(options: BuildReemitOptions): Reemit;
|
|
|
55
69
|
* Format the feedback prompt body. Caller's LLM provider (e.g.
|
|
56
70
|
* claude-cli) loads the realize-emit skill as system context.
|
|
57
71
|
*
|
|
72
|
+
* The optional `ownerContext` (Phase 3) is the per-owner realize-context
|
|
73
|
+
* snapshot — TARGET RUNTIME + [PRE-BAKED] step bullets + cross-service
|
|
74
|
+
* surface + capabilities — prepended to the prompt so the LLM sees the
|
|
75
|
+
* same input the original per-owner emit had. Without this, smaller
|
|
76
|
+
* models (Ollama / MarrBox) hallucinate cross-file calls; with it,
|
|
77
|
+
* they have the canonical contract to anchor against.
|
|
78
|
+
*
|
|
58
79
|
* Exported for tests + so callers can override the prompt shape.
|
|
59
80
|
*/
|
|
60
|
-
export declare function formatFeedbackPrompt(req: ReemitRequest): string;
|
|
81
|
+
export declare function formatFeedbackPrompt(req: ReemitRequest, ownerContext?: string | null): string;
|
|
61
82
|
//# sourceMappingURL=reemit.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"reemit.d.ts","sourceRoot":"","sources":["../../../src/realize/post-emit-verify/reemit.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAGH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,IAAI,CAAC;AAGxC,OAAO,KAAK,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAGlE,MAAM,WAAW,kBAAkB;IACjC,4DAA4D;IAC5D,KAAK,EAAE,aAAa,CAAC;IACrB;6BACyB;IACzB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB;;gCAE4B;IAC5B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;;;;;;;;;OAUG;IACH,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"reemit.d.ts","sourceRoot":"","sources":["../../../src/realize/post-emit-verify/reemit.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAGH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,IAAI,CAAC;AAGxC,OAAO,KAAK,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAGlE,MAAM,WAAW,kBAAkB;IACjC,4DAA4D;IAC5D,KAAK,EAAE,aAAa,CAAC;IACrB;6BACyB;IACzB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB;;gCAE4B;IAC5B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;;;;;;;;;OAUG;IACH,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB;;;;;;;;;;;;OAYG;IACH,aAAa,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,MAAM,GAAG,IAAI,CAAC;CACtD;AAED;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,kBAAkB,GAAG,MAAM,CA8ClE;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,oBAAoB,CAClC,GAAG,EAAE,aAAa,EAClB,YAAY,GAAE,MAAM,GAAG,IAAW,GACjC,MAAM,CAiCR"}
|
|
@@ -32,6 +32,7 @@ export function buildLlmReemit(options) {
|
|
|
32
32
|
const maxAttempts = options.maxAttempts ?? 1;
|
|
33
33
|
const timeoutMs = options.timeoutMs ?? 3 * 60_000;
|
|
34
34
|
const skills = options.skills ?? ['realize-emit'];
|
|
35
|
+
const contextLoader = options.contextLoader;
|
|
35
36
|
// Provider-aware skill inlining: claude-cli auto-loads skills via the
|
|
36
37
|
// CLI's filesystem resolution; everyone else needs the skill content
|
|
37
38
|
// prepended to the system prompt. Compute once at build time — the
|
|
@@ -39,7 +40,8 @@ export function buildLlmReemit(options) {
|
|
|
39
40
|
const providerId = resolveProviderId();
|
|
40
41
|
const systemPrompt = assembleSystemWithSkills('', providerId, skills);
|
|
41
42
|
return async (req) => {
|
|
42
|
-
const
|
|
43
|
+
const ownerContext = contextLoader?.(req.ownerName) ?? null;
|
|
44
|
+
const prompt = formatFeedbackPrompt(req, ownerContext);
|
|
43
45
|
for (let attempt = 0; attempt < maxAttempts; attempt++) {
|
|
44
46
|
try {
|
|
45
47
|
const result = await Promise.race([
|
|
@@ -74,28 +76,28 @@ export function buildLlmReemit(options) {
|
|
|
74
76
|
* Format the feedback prompt body. Caller's LLM provider (e.g.
|
|
75
77
|
* claude-cli) loads the realize-emit skill as system context.
|
|
76
78
|
*
|
|
79
|
+
* The optional `ownerContext` (Phase 3) is the per-owner realize-context
|
|
80
|
+
* snapshot — TARGET RUNTIME + [PRE-BAKED] step bullets + cross-service
|
|
81
|
+
* surface + capabilities — prepended to the prompt so the LLM sees the
|
|
82
|
+
* same input the original per-owner emit had. Without this, smaller
|
|
83
|
+
* models (Ollama / MarrBox) hallucinate cross-file calls; with it,
|
|
84
|
+
* they have the canonical contract to anchor against.
|
|
85
|
+
*
|
|
77
86
|
* Exported for tests + so callers can override the prompt shape.
|
|
78
87
|
*/
|
|
79
|
-
export function formatFeedbackPrompt(req) {
|
|
88
|
+
export function formatFeedbackPrompt(req, ownerContext = null) {
|
|
80
89
|
const errorLines = req.errors
|
|
81
90
|
.map(formatError)
|
|
82
91
|
.join('\n');
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
''
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
'```typescript',
|
|
93
|
-
req.previousContent,
|
|
94
|
-
'```',
|
|
95
|
-
'',
|
|
96
|
-
`Fix the errors and emit the ENTIRE updated file inside one \`\`\`typescript code block.`,
|
|
97
|
-
`Do not change any logic beyond what's needed to fix the errors.`,
|
|
98
|
-
].join('\n');
|
|
92
|
+
const parts = [];
|
|
93
|
+
if (ownerContext) {
|
|
94
|
+
parts.push(ownerContext);
|
|
95
|
+
parts.push('');
|
|
96
|
+
parts.push('---');
|
|
97
|
+
parts.push('');
|
|
98
|
+
}
|
|
99
|
+
parts.push(`Re-emit the entire contents of \`${req.file}\`.`, '', `Your previous emission had the following compile / lint errors:`, '', errorLines, '', `Previous file content (re-emit this with the errors fixed):`, '', '```typescript', req.previousContent, '```', '', `Fix the errors and emit the ENTIRE updated file inside one \`\`\`typescript code block.`, `Honour the [PRE-BAKED] step bodies above verbatim where present; do not paraphrase.`, `Do not change any logic beyond what's needed to fix the errors.`);
|
|
100
|
+
return parts.join('\n');
|
|
99
101
|
}
|
|
100
102
|
function formatError(e) {
|
|
101
103
|
const pos = e.line !== undefined
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"reemit.js","sourceRoot":"","sources":["../../../src/realize/post-emit-verify/reemit.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,IAAI,CAAC;AAElC,OAAO,EAAE,wBAAwB,EAAE,MAAM,2BAA2B,CAAC;AACrE,OAAO,EAAE,iBAAiB,EAAE,MAAM,4BAA4B,CAAC;
|
|
1
|
+
{"version":3,"file":"reemit.js","sourceRoot":"","sources":["../../../src/realize/post-emit-verify/reemit.ts"],"names":[],"mappings":"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"}
|
|
@@ -135,4 +135,53 @@ export interface OwnerMapping {
|
|
|
135
135
|
* per-owner LLM emit — those should NOT receive feedback re-emits). */
|
|
136
136
|
ownerName: string | null;
|
|
137
137
|
}
|
|
138
|
+
/**
|
|
139
|
+
* Per-error fix strategy. Phase 2 of
|
|
140
|
+
* 2026-05-13-VERIFIER-DIAGNOSTIC-TREATMENT-SPLIT — different verifier
|
|
141
|
+
* errors need different fix strategies, not a single "always reemit"
|
|
142
|
+
* path:
|
|
143
|
+
*
|
|
144
|
+
* - `auto-reemit`: include this error in the file's reemit prompt;
|
|
145
|
+
* the LLM should try to fix it. Right for tsc errors (unambiguous
|
|
146
|
+
* fix) + γ-fallback / trivial-return / empty-body stubs (LLM never
|
|
147
|
+
* produced real output the first time; a second try with focused
|
|
148
|
+
* context is high-success).
|
|
149
|
+
*
|
|
150
|
+
* - `surface-spec-gap`: do NOT reemit; surface the error to the user
|
|
151
|
+
* via the `realize-quality.json` sidecar (`specGaps` field).
|
|
152
|
+
* Right for STUB002 (LLM-throw stubs) where the LLM already
|
|
153
|
+
* signaled a context gap on the original emit — re-prompting
|
|
154
|
+
* either no-ops or hallucinates cross-file regressions (measured
|
|
155
|
+
* on idle-meta 2026-05-13 at engines 6.54.0).
|
|
156
|
+
*
|
|
157
|
+
* - `skip`: ignore entirely. Right for unmappable errors (already
|
|
158
|
+
* filtered) and for future categories the framework doesn't know
|
|
159
|
+
* how to treat.
|
|
160
|
+
*/
|
|
161
|
+
export type TreatmentStrategy = 'auto-reemit' | 'surface-spec-gap' | 'skip';
|
|
162
|
+
/**
|
|
163
|
+
* Decides how each verifier error should be treated. The default
|
|
164
|
+
* selector lives in `feedback-runner.ts::defaultTreatmentSelector`;
|
|
165
|
+
* callers may override for advanced cases (testing, custom verifiers,
|
|
166
|
+
* different LLM tolerance profiles).
|
|
167
|
+
*/
|
|
168
|
+
export type TreatmentSelector = (error: VerifyError) => TreatmentStrategy;
|
|
169
|
+
/**
|
|
170
|
+
* A single spec-level gap surfaced from a verifier error that the
|
|
171
|
+
* framework chose NOT to auto-fix. Goes into the realize-quality.json
|
|
172
|
+
* sidecar's `specGaps` array; users read it and decide whether to
|
|
173
|
+
* adjust the spec/manifest, switch providers, or hand-edit.
|
|
174
|
+
*/
|
|
175
|
+
export interface SpecGapEntry {
|
|
176
|
+
/** Owner name (e.g. "AuthController"). null when unmappable. */
|
|
177
|
+
ownerName: string | null;
|
|
178
|
+
/** Source file path, relative to outputDir. */
|
|
179
|
+
file: string;
|
|
180
|
+
line?: number;
|
|
181
|
+
col?: number;
|
|
182
|
+
/** Verifier code (e.g. "STUB002"). */
|
|
183
|
+
code: string;
|
|
184
|
+
/** Verifier-formatted message — directly suitable for user reading. */
|
|
185
|
+
message: string;
|
|
186
|
+
}
|
|
138
187
|
//# sourceMappingURL=types.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/realize/post-emit-verify/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAEH;;;;GAIG;AACH,MAAM,WAAW,WAAW;IAC1B,oEAAoE;IACpE,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,oEAAoE;IACpE,IAAI,EAAE,MAAM,CAAC;IACb;yEACqE;IACrE,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,OAAO,GAAG,SAAS,CAAC;CAC/B;AAED;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,mDAAmD;IACnD,UAAU,EAAE,MAAM,CAAC;IACnB,4DAA4D;IAC5D,UAAU,EAAE,MAAM,CAAC;IACnB;;+EAE2E;IAC3E,EAAE,EAAE,OAAO,CAAC;IACZ,MAAM,EAAE,WAAW,EAAE,CAAC;IACtB;;mBAEe;IACf,KAAK,EAAE,MAAM,EAAE,CAAC;CACjB;AAED;;;;;GAKG;AACH,MAAM,WAAW,aAAa;IAC5B;mDAC+C;IAC/C,SAAS,EAAE,MAAM,CAAC;IAClB;kEAC8D;IAC9D,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB;uEACmE;IACnE,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB;;;;;;;;;;OAUG;IACH,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AAED;;;;;;;;GAQG;AACH,MAAM,WAAW,gBAAgB;IAC/B,oEAAoE;IACpE,EAAE,EAAE,MAAM,CAAC;IACX,8CAA8C;IAC9C,IAAI,EAAE,MAAM,CAAC;IACb;;;;;;;;OAQG;IACH,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,gEAAgE;IAChE,OAAO,EAAE,CAAC,GAAG,EAAE,aAAa,KAAK,OAAO,CAAC;IACzC,0EAA0E;IAC1E,MAAM,EAAE,CAAC,GAAG,EAAE,aAAa,KAAK,OAAO,CAAC,YAAY,CAAC,CAAC;CACvD;AAED;;;;;;;;;GASG;AACH,MAAM,WAAW,YAAY;IAC3B,gDAAgD;IAChD,IAAI,EAAE,MAAM,CAAC;IACb;;4EAEwE;IACxE,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;CAC1B"}
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/realize/post-emit-verify/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAEH;;;;GAIG;AACH,MAAM,WAAW,WAAW;IAC1B,oEAAoE;IACpE,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,oEAAoE;IACpE,IAAI,EAAE,MAAM,CAAC;IACb;yEACqE;IACrE,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,OAAO,GAAG,SAAS,CAAC;CAC/B;AAED;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,mDAAmD;IACnD,UAAU,EAAE,MAAM,CAAC;IACnB,4DAA4D;IAC5D,UAAU,EAAE,MAAM,CAAC;IACnB;;+EAE2E;IAC3E,EAAE,EAAE,OAAO,CAAC;IACZ,MAAM,EAAE,WAAW,EAAE,CAAC;IACtB;;mBAEe;IACf,KAAK,EAAE,MAAM,EAAE,CAAC;CACjB;AAED;;;;;GAKG;AACH,MAAM,WAAW,aAAa;IAC5B;mDAC+C;IAC/C,SAAS,EAAE,MAAM,CAAC;IAClB;kEAC8D;IAC9D,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB;uEACmE;IACnE,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB;;;;;;;;;;OAUG;IACH,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AAED;;;;;;;;GAQG;AACH,MAAM,WAAW,gBAAgB;IAC/B,oEAAoE;IACpE,EAAE,EAAE,MAAM,CAAC;IACX,8CAA8C;IAC9C,IAAI,EAAE,MAAM,CAAC;IACb;;;;;;;;OAQG;IACH,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,gEAAgE;IAChE,OAAO,EAAE,CAAC,GAAG,EAAE,aAAa,KAAK,OAAO,CAAC;IACzC,0EAA0E;IAC1E,MAAM,EAAE,CAAC,GAAG,EAAE,aAAa,KAAK,OAAO,CAAC,YAAY,CAAC,CAAC;CACvD;AAED;;;;;;;;;GASG;AACH,MAAM,WAAW,YAAY;IAC3B,gDAAgD;IAChD,IAAI,EAAE,MAAM,CAAC;IACb;;4EAEwE;IACxE,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;CAC1B;AAED;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,MAAM,MAAM,iBAAiB,GAAG,aAAa,GAAG,kBAAkB,GAAG,MAAM,CAAC;AAE5E;;;;;GAKG;AACH,MAAM,MAAM,iBAAiB,GAAG,CAAC,KAAK,EAAE,WAAW,KAAK,iBAAiB,CAAC;AAE1E;;;;;GAKG;AACH,MAAM,WAAW,YAAY;IAC3B,gEAAgE;IAChE,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,+CAA+C;IAC/C,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,sCAAsC;IACtC,IAAI,EAAE,MAAM,CAAC;IACb,uEAAuE;IACvE,OAAO,EAAE,MAAM,CAAC;CACjB"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"verifier-manifest.d.ts","sourceRoot":"","sources":["../../../src/realize/post-emit-verify/verifier-manifest.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,KAAK,EAAE,gBAAgB,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"verifier-manifest.d.ts","sourceRoot":"","sources":["../../../src/realize/post-emit-verify/verifier-manifest.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,KAAK,EAAE,gBAAgB,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAIhF,eAAO,MAAM,SAAS,EAAE,gBAAgB,EAQvC,CAAC;AAEF;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAsB,eAAe,CACnC,GAAG,EAAE,aAAa,EAClB,gBAAgB,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,GAC7B,OAAO,CAAC,YAAY,EAAE,CAAC,CAqBzB;AAED,wBAAgB,YAAY,CAAC,EAAE,EAAE,MAAM,GAAG,gBAAgB,GAAG,SAAS,CAErE"}
|
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
import { TSC_VERIFIER } from './verifiers/tsc.js';
|
|
2
|
+
import { STUB_COMPLETENESS_VERIFIER } from './verifiers/stub-completeness.js';
|
|
2
3
|
export const VERIFIERS = [
|
|
3
4
|
TSC_VERIFIER,
|
|
5
|
+
STUB_COMPLETENESS_VERIFIER,
|
|
4
6
|
// Future:
|
|
5
7
|
// PY_MYPY_VERIFIER — `mypy --strict src/`
|
|
6
8
|
// GO_VET_VERIFIER — `go vet ./...`
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"verifier-manifest.js","sourceRoot":"","sources":["../../../src/realize/post-emit-verify/verifier-manifest.ts"],"names":[],"mappings":"AAQA,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"verifier-manifest.js","sourceRoot":"","sources":["../../../src/realize/post-emit-verify/verifier-manifest.ts"],"names":[],"mappings":"AAQA,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,0BAA0B,EAAE,MAAM,kCAAkC,CAAC;AAE9E,MAAM,CAAC,MAAM,SAAS,GAAuB;IAC3C,YAAY;IACZ,0BAA0B;IAC1B,UAAU;IACV,6CAA6C;IAC7C,uCAAuC;IACvC,yCAAyC;IACzC,8CAA8C;CAC/C,CAAC;AAEF;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,GAAkB,EAClB,gBAA8B;IAE9B,MAAM,GAAG,GAAmB,EAAE,CAAC;IAC/B,KAAK,MAAM,CAAC,IAAI,SAAS,EAAE,CAAC;QAC1B,MAAM,gBAAgB,GAAG,CAAC,CAAC,gBAAgB,KAAK,KAAK,CAAC;QACtD,MAAM,iBAAiB,GAAG,gBAAgB,EAAE,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,KAAK,CAAC;QAC/D,IAAI,CAAC,gBAAgB,IAAI,CAAC,iBAAiB;YAAE,SAAS;QACtD,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC;YAAE,SAAS;QAC9B,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YACnC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACnB,CAAC;QAAC,OAAO,GAAQ,EAAE,CAAC;YAClB,GAAG,CAAC,IAAI,CAAC;gBACP,UAAU,EAAE,CAAC,CAAC,EAAE;gBAChB,UAAU,EAAE,CAAC;gBACb,EAAE,EAAE,KAAK;gBACT,MAAM,EAAE,EAAE;gBACV,KAAK,EAAE,CAAC,aAAa,CAAC,CAAC,EAAE,YAAY,GAAG,EAAE,OAAO,IAAI,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC;aACpE,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,EAAU;IACrC,OAAO,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;AAC5C,CAAC"}
|