kibi-cli 2.38.0 → 2.39.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/cli-json-command.d.ts.map +1 -1
- package/dist/cli-json-command.js +4 -0
- package/dist/cli-register-reporting.d.ts.map +1 -1
- package/dist/cli-register-reporting.js +1 -0
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +3 -0
- package/dist/commands/coverage.d.ts +1 -0
- package/dist/commands/coverage.d.ts.map +1 -1
- package/dist/commands/coverage.js +40 -0
- package/dist/commands/doctor.d.ts +5 -0
- package/dist/commands/doctor.d.ts.map +1 -1
- package/dist/commands/doctor.js +14 -0
- package/dist/commands/migrate.d.ts.map +1 -1
- package/dist/commands/migrate.js +9 -3
- package/dist/commands/sync/persistence.d.ts.map +1 -1
- package/dist/commands/sync/persistence.js +6 -0
- package/dist/extractors/markdown.d.ts +6 -0
- package/dist/extractors/markdown.d.ts.map +1 -1
- package/dist/extractors/markdown.js +21 -0
- package/dist/operations/bootstrap/discovery-evidence.d.ts.map +1 -1
- package/dist/operations/bootstrap/discovery-evidence.js +44 -2
- package/dist/operations/bootstrap/discovery.d.ts.map +1 -1
- package/dist/operations/bootstrap/discovery.js +1 -0
- package/dist/operations/proof/explain.d.ts +63 -0
- package/dist/operations/proof/explain.d.ts.map +1 -1
- package/dist/operations/proof/explain.js +162 -0
- package/dist/operations/semantic-advisor/analyze-prose.d.ts +9 -1
- package/dist/operations/semantic-advisor/analyze-prose.d.ts.map +1 -1
- package/dist/operations/semantic-advisor/analyze-prose.js +21 -0
- package/dist/operations/semantic-advisor/case-preview.d.ts +24 -0
- package/dist/operations/semantic-advisor/case-preview.d.ts.map +1 -0
- package/dist/operations/semantic-advisor/case-preview.js +216 -0
- package/dist/operations/semantic-advisor/shared.d.ts.map +1 -1
- package/dist/operations/semantic-advisor/shared.js +3 -0
- package/dist/operations/semantic-advisor/types.d.ts +23 -0
- package/dist/operations/semantic-advisor/types.d.ts.map +1 -1
- package/dist/plugins/approved-source-analyzers.generated.d.ts +11 -8
- package/dist/plugins/approved-source-analyzers.generated.d.ts.map +1 -1
- package/dist/plugins/approved-source-analyzers.generated.js +11 -8
- package/dist/plugins/source-classification.d.ts +2 -2
- package/dist/plugins/source-classification.d.ts.map +1 -1
- package/dist/plugins/source-classification.js +25 -1
- package/dist/public/operations/catalog.d.ts +31 -1
- package/dist/public/operations/catalog.d.ts.map +1 -1
- package/dist/public/operations/repair-plan.d.ts +46 -0
- package/dist/public/operations/repair-plan.d.ts.map +1 -1
- package/dist/public/operations/repair-plan.js +110 -1
- package/dist/public/operations/schema6-check-actions.js +1 -1
- package/dist/public/operations/specs/check-rules.generated.d.ts +1 -1
- package/dist/public/operations/specs/check-rules.generated.d.ts.map +1 -1
- package/dist/public/operations/specs/check-rules.generated.js +2 -1
- package/dist/public/operations/specs/check.d.ts +1 -1
- package/dist/public/operations/specs/mutation-schemas.d.ts +30 -0
- package/dist/public/operations/specs/mutation-schemas.d.ts.map +1 -1
- package/dist/public/operations/specs/mutation-schemas.js +30 -0
- package/dist/public/operations/specs/upsert.d.ts +30 -0
- package/dist/public/operations/specs/upsert.d.ts.map +1 -1
- package/dist/public/schemas/entity.d.ts.map +1 -1
- package/dist/public/schemas/entity.js +59 -0
- package/dist/public/skills/kibi-commit-review/SKILL.md +6 -2
- package/dist/public/skills/kibi-decisions/SKILL.md +7 -2
- package/dist/public/skills/kibi-decisions/resources/signoff-views.md +3 -1
- package/dist/public/skills/kibi-usage/SKILL.md +9 -1
- package/dist/schemas/entity.schema.json +92 -0
- package/dist/search-answer.d.ts +3 -2
- package/dist/search-answer.d.ts.map +1 -1
- package/dist/search-answer.js +56 -3
- package/dist/traceability/impact-knowledge.d.ts.map +1 -1
- package/dist/traceability/impact-knowledge.js +2 -0
- package/dist/traceability/temp-kb.d.ts.map +1 -1
- package/dist/traceability/temp-kb.js +11 -1
- package/dist/types/entities.d.ts +12 -0
- package/dist/types/entities.d.ts.map +1 -1
- package/dist/usage-telemetry.d.ts +9 -0
- package/dist/usage-telemetry.d.ts.map +1 -1
- package/dist/usage-telemetry.js +50 -4
- package/dist/utils/rule-registry.generated.d.ts +5 -0
- package/dist/utils/rule-registry.generated.d.ts.map +1 -1
- package/dist/utils/rule-registry.generated.js +6 -0
- package/package.json +3 -3
- package/schema/entities.pl +12 -0
- package/src/public/operations/repair-plan.ts +152 -1
- package/src/public/operations/schema6-check-actions.ts +1 -1
- package/src/public/operations/specs/check-rules.generated.ts +2 -1
- package/src/public/operations/specs/mutation-schemas.ts +34 -0
- package/src/public/schemas/entity.ts +65 -0
- package/src/public/skills/kibi-commit-review/SKILL.md +6 -2
- package/src/public/skills/kibi-decisions/SKILL.md +7 -2
- package/src/public/skills/kibi-decisions/resources/signoff-views.md +3 -1
- package/src/public/skills/kibi-usage/SKILL.md +9 -1
- package/src/schemas/entity.schema.json +92 -0
|
@@ -150,11 +150,170 @@ export function projectRequirementExplain(proof) {
|
|
|
150
150
|
: {}),
|
|
151
151
|
...claimFields(proof),
|
|
152
152
|
scenarios,
|
|
153
|
+
...negativePathField(stages.negativePath),
|
|
154
|
+
...dimensionField(stages.dimension),
|
|
155
|
+
...casesField(stages.cases),
|
|
153
156
|
tests,
|
|
154
157
|
productionSymbols: explanations.filter((item) => !structuralIds.has(item.symbolId)),
|
|
155
158
|
structuralSymbols: explanations.filter((item) => structuralIds.has(item.symbolId)),
|
|
156
159
|
};
|
|
157
160
|
}
|
|
161
|
+
// implements REQ-kibi-happy-path-gap
|
|
162
|
+
function negativePathField(stage) {
|
|
163
|
+
if (stage === undefined)
|
|
164
|
+
return {};
|
|
165
|
+
const record = asRecord(stage);
|
|
166
|
+
const suggestions = Array.isArray(record.suggestedNegatives)
|
|
167
|
+
? record.suggestedNegatives.map((item) => {
|
|
168
|
+
const entry = asRecord(item);
|
|
169
|
+
return {
|
|
170
|
+
claimKey: asString(entry.claimKey),
|
|
171
|
+
factId: asString(entry.factId),
|
|
172
|
+
assumption: asRecord(entry.assumption),
|
|
173
|
+
};
|
|
174
|
+
})
|
|
175
|
+
: [];
|
|
176
|
+
return {
|
|
177
|
+
negativePath: {
|
|
178
|
+
status: asString(record.status),
|
|
179
|
+
negativeScenarios: asStringArray(record.negativeScenarios),
|
|
180
|
+
claims: asStringArray(record.claims),
|
|
181
|
+
suggestedNegatives: suggestions,
|
|
182
|
+
...waiverField(record.waiver),
|
|
183
|
+
},
|
|
184
|
+
};
|
|
185
|
+
}
|
|
186
|
+
function waiverField(raw) {
|
|
187
|
+
const waiver = asRecord(raw);
|
|
188
|
+
const reason = asString(waiver.reason);
|
|
189
|
+
const approvedBy = asString(waiver.approvedBy);
|
|
190
|
+
return reason === ""
|
|
191
|
+
? {}
|
|
192
|
+
: { waiver: { reason, ...(approvedBy === "" ? {} : { approvedBy }) } };
|
|
193
|
+
}
|
|
194
|
+
// implements REQ-kibi-dimension-gap
|
|
195
|
+
function dimensionField(stage) {
|
|
196
|
+
if (stage === undefined)
|
|
197
|
+
return {};
|
|
198
|
+
const record = asRecord(stage);
|
|
199
|
+
const claims = (raw) => Array.isArray(raw)
|
|
200
|
+
? raw.map((item) => {
|
|
201
|
+
const entry = asRecord(item);
|
|
202
|
+
return {
|
|
203
|
+
claimKey: asString(entry.claimKey),
|
|
204
|
+
claimText: asString(entry.claimText),
|
|
205
|
+
quantifier: asString(entry.quantifier),
|
|
206
|
+
factIds: asStringArray(entry.factIds),
|
|
207
|
+
rewrites: asStringArray(entry.rewrites),
|
|
208
|
+
...waiverField(entry.waiver),
|
|
209
|
+
};
|
|
210
|
+
})
|
|
211
|
+
: [];
|
|
212
|
+
return {
|
|
213
|
+
dimension: {
|
|
214
|
+
status: asString(record.status),
|
|
215
|
+
claims: claims(record.claims),
|
|
216
|
+
waivedClaims: claims(record.waivedClaims),
|
|
217
|
+
},
|
|
218
|
+
};
|
|
219
|
+
}
|
|
220
|
+
// implements REQ-kibi-case-coverage
|
|
221
|
+
function casesField(stage) {
|
|
222
|
+
if (stage === undefined)
|
|
223
|
+
return {};
|
|
224
|
+
const record = asRecord(stage);
|
|
225
|
+
const cases = Array.isArray(record.cases)
|
|
226
|
+
? record.cases.map((item) => {
|
|
227
|
+
const entry = asRecord(item);
|
|
228
|
+
return {
|
|
229
|
+
caseId: asString(entry.caseId),
|
|
230
|
+
claimKey: asString(entry.claimKey),
|
|
231
|
+
factId: asString(entry.factId),
|
|
232
|
+
generator: asString(entry.generator),
|
|
233
|
+
constraint: asString(entry.constraint),
|
|
234
|
+
predicted: asString(entry.predicted),
|
|
235
|
+
coverage: asString(entry.coverage),
|
|
236
|
+
scenarios: asStringArray(entry.scenarios),
|
|
237
|
+
assumption: asRecord(entry.assumption),
|
|
238
|
+
...waiverField(entry.waiver),
|
|
239
|
+
};
|
|
240
|
+
})
|
|
241
|
+
: [];
|
|
242
|
+
const summary = asRecord(record.summary);
|
|
243
|
+
return {
|
|
244
|
+
cases: {
|
|
245
|
+
status: asString(record.status),
|
|
246
|
+
cases,
|
|
247
|
+
summary: Object.fromEntries(Object.entries(summary).filter((entry) => typeof entry[1] === "number")),
|
|
248
|
+
limitReached: record.limitReached === true,
|
|
249
|
+
},
|
|
250
|
+
};
|
|
251
|
+
}
|
|
252
|
+
function renderCases(view) {
|
|
253
|
+
const cases = view.cases;
|
|
254
|
+
if (cases === undefined || cases.cases.length === 0)
|
|
255
|
+
return [];
|
|
256
|
+
const summary = cases.summary;
|
|
257
|
+
const lines = [
|
|
258
|
+
"",
|
|
259
|
+
`Edge cases: ${cases.status} (${summary.covered ?? 0} covered, ${summary.uncovered ?? 0} uncovered, ${summary.unspecified ?? 0} unspecified, ${summary.waived ?? 0} waived)`,
|
|
260
|
+
];
|
|
261
|
+
for (const row of cases.cases) {
|
|
262
|
+
const where = row.coverage === "covered" ? ` by ${row.scenarios.join(", ")}` : "";
|
|
263
|
+
lines.push(` ${row.caseId} ${row.factId} ${row.constraint} -> ${row.predicted}: ${row.coverage}${where}`);
|
|
264
|
+
if (row.coverage === "uncovered" && row.predicted === "rejection")
|
|
265
|
+
lines.push(` add a scenario that assumes ${JSON.stringify(row.assumption)} and expects rejection`);
|
|
266
|
+
if (row.waiver !== undefined && row.waiver.approvedBy === undefined)
|
|
267
|
+
lines.push(` waiver awaiting approval (set case_waiver_approved_by to the person who accepts it, in this pull request): ${row.waiver.reason}`);
|
|
268
|
+
}
|
|
269
|
+
if (cases.limitReached)
|
|
270
|
+
lines.push(" (some facts have more cases than the per-fact limit of 12)");
|
|
271
|
+
return lines;
|
|
272
|
+
}
|
|
273
|
+
const DIMENSION_REWRITES = {
|
|
274
|
+
bound: "an integer property with the bound (lte, gte or eq)",
|
|
275
|
+
rule: "a rule over a variable (every X with P must Q)",
|
|
276
|
+
count: "an integer count of what varies",
|
|
277
|
+
set: "a set fact over the members",
|
|
278
|
+
};
|
|
279
|
+
function renderDimension(view) {
|
|
280
|
+
const dimension = view.dimension;
|
|
281
|
+
if (dimension === undefined || dimension.status === "not_required")
|
|
282
|
+
return [];
|
|
283
|
+
const lines = ["", `Quantified claims: ${dimension.status}`];
|
|
284
|
+
for (const claim of dimension.claims) {
|
|
285
|
+
lines.push(` ${claim.claimKey} (${claim.factIds.join(", ")}): "${claim.quantifier.replaceAll("_", " ")}" is grounded on a boolean: ${claim.claimText}`);
|
|
286
|
+
const rewrites = claim.rewrites
|
|
287
|
+
.map((rewrite) => DIMENSION_REWRITES[rewrite] ?? rewrite)
|
|
288
|
+
.join("; or ");
|
|
289
|
+
if (rewrites !== "")
|
|
290
|
+
lines.push(` ground it on ${rewrites}`);
|
|
291
|
+
if (claim.waiver !== undefined)
|
|
292
|
+
lines.push(` waiver awaiting approval (set dimension_waiver_approved_by to the person who accepts it, in this pull request): ${claim.waiver.reason}`);
|
|
293
|
+
}
|
|
294
|
+
for (const claim of dimension.waivedClaims) {
|
|
295
|
+
lines.push(` ${claim.claimKey} waived by ${claim.waiver?.approvedBy ?? ""}: ${claim.waiver?.reason ?? ""}`);
|
|
296
|
+
}
|
|
297
|
+
return lines;
|
|
298
|
+
}
|
|
299
|
+
function renderNegativePath(view) {
|
|
300
|
+
const negative = view.negativePath;
|
|
301
|
+
if (negative === undefined || negative.status === "not_required")
|
|
302
|
+
return [];
|
|
303
|
+
const lines = ["", `Failure side: ${negative.status}`];
|
|
304
|
+
if (negative.waiver !== undefined) {
|
|
305
|
+
lines.push(negative.waiver.approvedBy === undefined
|
|
306
|
+
? ` waiver awaiting approval (set failure_side_waiver_approved_by to the person who accepts it, in this pull request): ${negative.waiver.reason}`
|
|
307
|
+
: ` waived by ${negative.waiver.approvedBy}: ${negative.waiver.reason}`);
|
|
308
|
+
}
|
|
309
|
+
for (const scenarioId of negative.negativeScenarios) {
|
|
310
|
+
lines.push(` ${scenarioId} expects rejection or error`);
|
|
311
|
+
}
|
|
312
|
+
for (const suggestion of negative.suggestedNegatives) {
|
|
313
|
+
lines.push(` ${suggestion.claimKey} (${suggestion.factId}): assume ${JSON.stringify(suggestion.assumption)} and expect rejection`);
|
|
314
|
+
}
|
|
315
|
+
return lines;
|
|
316
|
+
}
|
|
158
317
|
function claimFields(proof) {
|
|
159
318
|
const summary = asRecord(proof.claimSummary);
|
|
160
319
|
const count = (key) => typeof summary[key] === "number" ? summary[key] : 0;
|
|
@@ -267,6 +426,9 @@ function renderRequirementExplain(view) {
|
|
|
267
426
|
for (const scenario of view.scenarios) {
|
|
268
427
|
lines.push(` ${scenario.id} -> ${scenario.tests.join(", ") || "(no tests)"}`);
|
|
269
428
|
}
|
|
429
|
+
lines.push(...renderNegativePath(view));
|
|
430
|
+
lines.push(...renderDimension(view));
|
|
431
|
+
lines.push(...renderCases(view));
|
|
270
432
|
lines.push("");
|
|
271
433
|
for (const test of view.tests) {
|
|
272
434
|
lines.push(`TEST ${test.testId}`);
|
|
@@ -1,8 +1,16 @@
|
|
|
1
1
|
import { propositionRole } from "./proposition-role.js";
|
|
2
|
-
import type { SemanticAdvisorAnalysisResult, SemanticAdvisorInput } from "./types.js";
|
|
2
|
+
import type { SemanticAdvisorAnalysisResult, SemanticAdvisorInput, SemanticPropositionDimension } from "./types.js";
|
|
3
3
|
export declare const SEMANTIC_ADVISOR_VERSION = "semantic-advisor-v2";
|
|
4
4
|
export { semanticClaimKey } from "./clauses.js";
|
|
5
5
|
export declare function stringLogicClaims(value: unknown): string[];
|
|
6
6
|
export { propositionRole };
|
|
7
|
+
/**
|
|
8
|
+
* The first quantifier over a collection or cardinality bound in a clause,
|
|
9
|
+
* and the typed groundings that represent it. The proof ladder's
|
|
10
|
+
* dimension_unrepresented gap uses the same words (requirement_proof.pl,
|
|
11
|
+
* claim_quantifier/2): only, any and some mostly scope a condition, so they
|
|
12
|
+
* are left out.
|
|
13
|
+
*/
|
|
14
|
+
export declare function claimDimension(text: string): SemanticPropositionDimension | undefined;
|
|
7
15
|
export declare function analyzeSemanticAdvisorInput(input: SemanticAdvisorInput): SemanticAdvisorAnalysisResult;
|
|
8
16
|
//# sourceMappingURL=analyze-prose.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"analyze-prose.d.ts","sourceRoot":"","sources":["../../../src/operations/semantic-advisor/analyze-prose.ts"],"names":[],"mappings":"AAuBA,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAiBxD,OAAO,KAAK,EACV,6BAA6B,EAC7B,oBAAoB,
|
|
1
|
+
{"version":3,"file":"analyze-prose.d.ts","sourceRoot":"","sources":["../../../src/operations/semantic-advisor/analyze-prose.ts"],"names":[],"mappings":"AAuBA,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAiBxD,OAAO,KAAK,EACV,6BAA6B,EAC7B,oBAAoB,EAKpB,4BAA4B,EAO7B,MAAM,YAAY,CAAC;AAEpB,eAAO,MAAM,wBAAwB,wBAAwB,CAAC;AAC9D,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAEhD,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,EAAE,CAI1D;AA6gBD,OAAO,EAAE,eAAe,EAAE,CAAC;AAwT3B;;;;;;GAMG;AACH,wBAAgB,cAAc,CAC5B,IAAI,EAAE,MAAM,GACX,4BAA4B,GAAG,SAAS,CAY1C;AAsED,wBAAgB,2BAA2B,CACzC,KAAK,EAAE,oBAAoB,GAC1B,6BAA6B,CAgE/B"}
|
|
@@ -654,6 +654,25 @@ function interpretationResults(interpretations, clauses, statement) {
|
|
|
654
654
|
warnings.push("Only the first three interpretations are considered; submit materially distinct alternatives explicitly and resolve them before writing.");
|
|
655
655
|
return { results, warnings };
|
|
656
656
|
}
|
|
657
|
+
// implements REQ-kibi-dimension-gap
|
|
658
|
+
/**
|
|
659
|
+
* The first quantifier over a collection or cardinality bound in a clause,
|
|
660
|
+
* and the typed groundings that represent it. The proof ladder's
|
|
661
|
+
* dimension_unrepresented gap uses the same words (requirement_proof.pl,
|
|
662
|
+
* claim_quantifier/2): only, any and some mostly scope a condition, so they
|
|
663
|
+
* are left out.
|
|
664
|
+
*/
|
|
665
|
+
export function claimDimension(text) {
|
|
666
|
+
const match = /\b(no more than|at least|at most|each|every|all|exactly)\b/i.exec(text);
|
|
667
|
+
if (!match?.[1])
|
|
668
|
+
return undefined;
|
|
669
|
+
const quantifier = match[1].toLowerCase().replaceAll(" ", "_");
|
|
670
|
+
const bound = ["exactly", "at_least", "at_most", "no_more_than"].includes(quantifier);
|
|
671
|
+
return {
|
|
672
|
+
quantifier,
|
|
673
|
+
rewrites: bound ? ["bound"] : ["rule", "count", "set"],
|
|
674
|
+
};
|
|
675
|
+
}
|
|
657
676
|
function propositionInventory(statement, clauses, suggestions, interpretations, inputPayloadHash) {
|
|
658
677
|
const interpretationKeys = new Map();
|
|
659
678
|
for (const interpretation of interpretations) {
|
|
@@ -701,6 +720,7 @@ function propositionInventory(statement, clauses, suggestions, interpretations,
|
|
|
701
720
|
reason =
|
|
702
721
|
"No accepted typed interpretation grounds this assertive proposition.";
|
|
703
722
|
}
|
|
723
|
+
const dimension = role === "normative" ? claimDimension(located.sourceText) : undefined;
|
|
704
724
|
return {
|
|
705
725
|
claim_key: clause.claim_key,
|
|
706
726
|
claim_text: located.sourceText,
|
|
@@ -710,6 +730,7 @@ function propositionInventory(statement, clauses, suggestions, interpretations,
|
|
|
710
730
|
payload_hash: inputPayloadHash,
|
|
711
731
|
...(semanticKey ? { semantic_key: semanticKey } : {}),
|
|
712
732
|
...(reason ? { reason } : {}),
|
|
733
|
+
...(dimension ? { dimension } : {}),
|
|
713
734
|
};
|
|
714
735
|
});
|
|
715
736
|
}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import type { SemanticStrictPropertyClaim } from "./types.js";
|
|
2
|
+
/**
|
|
3
|
+
* The edge cases the proof ladder will derive from a typed property claim
|
|
4
|
+
* once it is written (packages/core/src/cases.pl), so the author sees the
|
|
5
|
+
* scenario debt before committing the model: the bound and the value past
|
|
6
|
+
* it, zero, one and many for an integer count, each set member and the value
|
|
7
|
+
* outside the set. Each rejection case later needs a scenario that assumes
|
|
8
|
+
* it, or the requirement reports uncovered_case.
|
|
9
|
+
*/
|
|
10
|
+
export interface CasePreview {
|
|
11
|
+
readonly generator: "boundary" | "cardinality" | "member" | "non_member" | "excluded_member";
|
|
12
|
+
/** The value class, as `kibi coverage --cases` prints it. */
|
|
13
|
+
readonly constraint: string;
|
|
14
|
+
readonly predicted: "success" | "rejection" | "unspecified";
|
|
15
|
+
/** The assumes fact a scenario states to land in the case. */
|
|
16
|
+
readonly assumption: Readonly<Record<string, unknown>>;
|
|
17
|
+
}
|
|
18
|
+
/** Most cases one fact yields, as in cases.pl. */
|
|
19
|
+
export declare const CASE_LIMIT = 12;
|
|
20
|
+
export declare function previewCases(claim: SemanticStrictPropertyClaim): {
|
|
21
|
+
cases: CasePreview[];
|
|
22
|
+
limitReached: boolean;
|
|
23
|
+
};
|
|
24
|
+
//# sourceMappingURL=case-preview.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"case-preview.d.ts","sourceRoot":"","sources":["../../../src/operations/semantic-advisor/case-preview.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,2BAA2B,EAAE,MAAM,YAAY,CAAC;AAG9D;;;;;;;GAOG;AACH,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,SAAS,EACd,UAAU,GACV,aAAa,GACb,QAAQ,GACR,YAAY,GACZ,iBAAiB,CAAC;IACtB,6DAA6D;IAC7D,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,SAAS,EAAE,SAAS,GAAG,WAAW,GAAG,aAAa,CAAC;IAC5D,8DAA8D;IAC9D,QAAQ,CAAC,UAAU,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;CACxD;AAED,kDAAkD;AAClD,eAAO,MAAM,UAAU,KAAK,CAAC;AAkP7B,wBAAgB,YAAY,CAAC,KAAK,EAAE,2BAA2B,GAAG;IAChE,KAAK,EAAE,WAAW,EAAE,CAAC;IACrB,YAAY,EAAE,OAAO,CAAC;CACvB,CAaA"}
|
|
@@ -0,0 +1,216 @@
|
|
|
1
|
+
/** Most cases one fact yields, as in cases.pl. */
|
|
2
|
+
export const CASE_LIMIT = 12;
|
|
3
|
+
const NEGATED = {
|
|
4
|
+
eq: "neq",
|
|
5
|
+
neq: "eq",
|
|
6
|
+
lt: "gte",
|
|
7
|
+
gte: "lt",
|
|
8
|
+
gt: "lte",
|
|
9
|
+
lte: "gt",
|
|
10
|
+
};
|
|
11
|
+
const UPPER_PAST = {
|
|
12
|
+
eq: "gt",
|
|
13
|
+
neq: "gt",
|
|
14
|
+
lte: "gt",
|
|
15
|
+
lt: "gte",
|
|
16
|
+
};
|
|
17
|
+
const LOWER_PAST = {
|
|
18
|
+
eq: "lt",
|
|
19
|
+
neq: "lt",
|
|
20
|
+
gte: "lt",
|
|
21
|
+
gt: "lte",
|
|
22
|
+
};
|
|
23
|
+
function region({ op, value }, integer) {
|
|
24
|
+
// On integers a strict bound is the closed bound one step in.
|
|
25
|
+
const v = value;
|
|
26
|
+
switch (op) {
|
|
27
|
+
case "eq":
|
|
28
|
+
return { kind: "interval", lo: v, loOpen: false, hi: v, hiOpen: false };
|
|
29
|
+
case "neq":
|
|
30
|
+
return { kind: "except", value: v };
|
|
31
|
+
case "lt":
|
|
32
|
+
return integer
|
|
33
|
+
? {
|
|
34
|
+
kind: "interval",
|
|
35
|
+
lo: Number.NEGATIVE_INFINITY,
|
|
36
|
+
loOpen: true,
|
|
37
|
+
hi: v - 1,
|
|
38
|
+
hiOpen: false,
|
|
39
|
+
}
|
|
40
|
+
: {
|
|
41
|
+
kind: "interval",
|
|
42
|
+
lo: Number.NEGATIVE_INFINITY,
|
|
43
|
+
loOpen: true,
|
|
44
|
+
hi: v,
|
|
45
|
+
hiOpen: true,
|
|
46
|
+
};
|
|
47
|
+
case "lte":
|
|
48
|
+
return {
|
|
49
|
+
kind: "interval",
|
|
50
|
+
lo: Number.NEGATIVE_INFINITY,
|
|
51
|
+
loOpen: true,
|
|
52
|
+
hi: v,
|
|
53
|
+
hiOpen: false,
|
|
54
|
+
};
|
|
55
|
+
case "gt":
|
|
56
|
+
return integer
|
|
57
|
+
? {
|
|
58
|
+
kind: "interval",
|
|
59
|
+
lo: v + 1,
|
|
60
|
+
loOpen: false,
|
|
61
|
+
hi: Number.POSITIVE_INFINITY,
|
|
62
|
+
hiOpen: true,
|
|
63
|
+
}
|
|
64
|
+
: {
|
|
65
|
+
kind: "interval",
|
|
66
|
+
lo: v,
|
|
67
|
+
loOpen: true,
|
|
68
|
+
hi: Number.POSITIVE_INFINITY,
|
|
69
|
+
hiOpen: true,
|
|
70
|
+
};
|
|
71
|
+
case "gte":
|
|
72
|
+
return {
|
|
73
|
+
kind: "interval",
|
|
74
|
+
lo: v,
|
|
75
|
+
loOpen: false,
|
|
76
|
+
hi: Number.POSITIVE_INFINITY,
|
|
77
|
+
hiOpen: true,
|
|
78
|
+
};
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
function contains(r, value) {
|
|
82
|
+
if (r.kind === "except")
|
|
83
|
+
return value !== r.value;
|
|
84
|
+
const aboveLo = r.loOpen ? value > r.lo : value >= r.lo;
|
|
85
|
+
const belowHi = r.hiOpen ? value < r.hi : value <= r.hi;
|
|
86
|
+
return aboveLo && belowHi;
|
|
87
|
+
}
|
|
88
|
+
/** Whether every value constraint a admits, constraint b admits too. */
|
|
89
|
+
function entails(a, b, integer) {
|
|
90
|
+
const ra = region(a, integer);
|
|
91
|
+
const rb = region(b, integer);
|
|
92
|
+
if (ra.kind === "except")
|
|
93
|
+
return rb.kind === "except" && rb.value === ra.value;
|
|
94
|
+
if (rb.kind === "except")
|
|
95
|
+
return !contains(ra, rb.value);
|
|
96
|
+
const loInside = ra.lo > rb.lo || (ra.lo === rb.lo && (ra.loOpen || !rb.loOpen));
|
|
97
|
+
const hiInside = ra.hi < rb.hi || (ra.hi === rb.hi && (ra.hiOpen || !rb.hiOpen));
|
|
98
|
+
return loInside && hiInside;
|
|
99
|
+
}
|
|
100
|
+
function numericCases(integer, op, v) {
|
|
101
|
+
const cases = [];
|
|
102
|
+
const add = (generator, caseOp, value) => cases.push({ generator, constraint: { op: caseOp, value } });
|
|
103
|
+
if (["eq", "neq", "lte", "gte"].includes(op))
|
|
104
|
+
add("boundary", "eq", v);
|
|
105
|
+
if (integer && op === "lt")
|
|
106
|
+
add("boundary", "eq", v - 1);
|
|
107
|
+
if (integer && op === "gt")
|
|
108
|
+
add("boundary", "eq", v + 1);
|
|
109
|
+
const upper = UPPER_PAST[op];
|
|
110
|
+
if (upper)
|
|
111
|
+
add("boundary", upper, v);
|
|
112
|
+
const lower = LOWER_PAST[op];
|
|
113
|
+
if (lower &&
|
|
114
|
+
!(integer && lower === "lt" && v <= 0) &&
|
|
115
|
+
!(integer && lower === "lte" && v < 0))
|
|
116
|
+
add("boundary", lower, v);
|
|
117
|
+
if (integer && v >= 1) {
|
|
118
|
+
add("cardinality", "eq", 0);
|
|
119
|
+
add("cardinality", "eq", 1);
|
|
120
|
+
add("cardinality", "gte", 2);
|
|
121
|
+
}
|
|
122
|
+
return cases;
|
|
123
|
+
}
|
|
124
|
+
function predict(claim, candidate, integer) {
|
|
125
|
+
if (entails(candidate, claim, integer))
|
|
126
|
+
return "success";
|
|
127
|
+
if (entails(candidate, { op: NEGATED[claim.op], value: claim.value }, integer))
|
|
128
|
+
return "rejection";
|
|
129
|
+
return undefined;
|
|
130
|
+
}
|
|
131
|
+
function numericPreviews(claim, op) {
|
|
132
|
+
const integer = claim.value_type === "int";
|
|
133
|
+
const value = integer ? claim.value_int : claim.value_number;
|
|
134
|
+
if (typeof value !== "number" || !Number.isFinite(value))
|
|
135
|
+
return [];
|
|
136
|
+
const bound = { op, value };
|
|
137
|
+
const kept = [];
|
|
138
|
+
for (const raw of numericCases(integer, op, value)) {
|
|
139
|
+
const predicted = predict(bound, raw.constraint, integer);
|
|
140
|
+
if (predicted === undefined)
|
|
141
|
+
continue;
|
|
142
|
+
// A class already named, or inside an earlier class with the same
|
|
143
|
+
// outcome, is not a case of its own.
|
|
144
|
+
const subsumed = kept.some((earlier) => earlier.predicted === predicted &&
|
|
145
|
+
entails(raw.constraint, earlier.raw.constraint, integer));
|
|
146
|
+
if (!subsumed)
|
|
147
|
+
kept.push({ raw, predicted });
|
|
148
|
+
}
|
|
149
|
+
return kept.map(({ raw, predicted }) => ({
|
|
150
|
+
generator: raw.generator,
|
|
151
|
+
constraint: `${raw.constraint.op} ${raw.constraint.value}`,
|
|
152
|
+
predicted,
|
|
153
|
+
assumption: {
|
|
154
|
+
fact_kind: "property_value",
|
|
155
|
+
subject_key: claim.subject_key,
|
|
156
|
+
property_key: claim.property_key,
|
|
157
|
+
operator: raw.constraint.op,
|
|
158
|
+
value_type: claim.value_type,
|
|
159
|
+
value: raw.constraint.value,
|
|
160
|
+
},
|
|
161
|
+
}));
|
|
162
|
+
}
|
|
163
|
+
function setPreviews(claim) {
|
|
164
|
+
const members = claim.value_set ?? [];
|
|
165
|
+
const assumption = (value) => ({
|
|
166
|
+
fact_kind: "property_value",
|
|
167
|
+
subject_key: claim.subject_key,
|
|
168
|
+
property_key: claim.property_key,
|
|
169
|
+
operator: "includes",
|
|
170
|
+
value_type: "set",
|
|
171
|
+
value: [...value],
|
|
172
|
+
});
|
|
173
|
+
const previews = [];
|
|
174
|
+
if (["eq", "includes", "subset_of"].includes(claim.operator))
|
|
175
|
+
for (const member of members)
|
|
176
|
+
previews.push({
|
|
177
|
+
generator: "member",
|
|
178
|
+
constraint: `includes ${member}`,
|
|
179
|
+
predicted: "success",
|
|
180
|
+
assumption: assumption([member]),
|
|
181
|
+
});
|
|
182
|
+
const outside = claim.operator === "eq" || claim.operator === "subset_of"
|
|
183
|
+
? "rejection"
|
|
184
|
+
: claim.operator === "includes"
|
|
185
|
+
? "unspecified"
|
|
186
|
+
: undefined;
|
|
187
|
+
if (outside)
|
|
188
|
+
previews.push({
|
|
189
|
+
generator: "non_member",
|
|
190
|
+
constraint: `includes a value outside [${members.join(", ")}]`,
|
|
191
|
+
predicted: outside,
|
|
192
|
+
assumption: assumption(["<a value outside the set>"]),
|
|
193
|
+
});
|
|
194
|
+
if (claim.operator === "excludes")
|
|
195
|
+
for (const member of members)
|
|
196
|
+
previews.push({
|
|
197
|
+
generator: "excluded_member",
|
|
198
|
+
constraint: `includes ${member}`,
|
|
199
|
+
predicted: "rejection",
|
|
200
|
+
assumption: assumption([member]),
|
|
201
|
+
});
|
|
202
|
+
return previews;
|
|
203
|
+
}
|
|
204
|
+
export function previewCases(claim) {
|
|
205
|
+
const op = claim.operator;
|
|
206
|
+
const all = claim.value_type === "set"
|
|
207
|
+
? setPreviews(claim)
|
|
208
|
+
: (claim.value_type === "int" || claim.value_type === "number") &&
|
|
209
|
+
op in NEGATED
|
|
210
|
+
? numericPreviews(claim, op)
|
|
211
|
+
: [];
|
|
212
|
+
return {
|
|
213
|
+
cases: all.slice(0, CASE_LIMIT),
|
|
214
|
+
limitReached: all.length > CASE_LIMIT,
|
|
215
|
+
};
|
|
216
|
+
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"shared.d.ts","sourceRoot":"","sources":["../../../src/operations/semantic-advisor/shared.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"shared.d.ts","sourceRoot":"","sources":["../../../src/operations/semantic-advisor/shared.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EACV,0BAA0B,EAE1B,2BAA2B,EAC5B,MAAM,YAAY,CAAC;AAEpB,MAAM,MAAM,OAAO,GAAG,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;AACxD,MAAM,MAAM,WAAW,GAAG,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC,CAAC;AACvE,eAAO,MAAM,0BAA0B,+BAA+B,CAAC;AACvE,MAAM,MAAM,mBAAmB,GAAG,eAAe,GAAG,UAAU,GAAG,OAAO,CAAC;AAGzE,wBAAgB,QAAQ,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAEzE;AAGD,wBAAgB,WAAW,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAElD;AAGD,wBAAgB,YAAY,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CASnD;AAGD,wBAAgB,WAAW,CAAC,OAAO,EAAE,OAAO,GAAG,MAAM,CAKpD;AAGD,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,OAAO,GAAG;IAClD,QAAQ,CAAC,KAAK,EAAE,mBAAmB,CAAC;IACpC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;CACvB,CAmBA;AAED,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAEvD;AAED,wBAAgB,iBAAiB,CAC/B,OAAO,EAAE,OAAO,GACf,SAAS,MAAM,EAAE,GAAG,SAAS,CAO/B;AAGD,wBAAgB,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAE/C;AAGD,wBAAgB,YAAY,CAAC,OAAO,EAAE,OAAO,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAEtE;AAGD,wBAAgB,WAAW,CAAC,OAAO,EAAE,OAAO,GAAG,MAAM,CAEpD;AAGD,wBAAgB,QAAQ,CAAC,OAAO,EAAE,OAAO,GAAG,MAAM,CAIjD;AAGD,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAOlD;AAGD,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAQ7D;AAID;;;;;GAKG;AAEH,wBAAgB,gBAAgB,CAC9B,KAAK,EAAE,MAAM,EACb,IAAI,GAAE,SAAS,MAAM,EAAO,GAC3B,MAAM,CAUR;AAGD,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAEjD;AAGD,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAEzD;AAED,wBAAgB,YAAY,CAC1B,IAAI,EAAE,MAAM,EACZ,EAAE,EAAE,MAAM,EACV,IAAI,EAAE,MAAM,GACX,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAEzB;AAGD,wBAAgB,gBAAgB,CAC9B,OAAO,EAAE,OAAO,EAChB,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,2BAA2B,EAClC,SAAS,EAAE,MAAM,EACjB,UAAU,SAAM,GACf,0BAA0B,CAgG5B;AAGD,wBAAgB,mBAAmB,CACjC,OAAO,EAAE,OAAO,EAChB,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,SAAS,MAAM,EAAE,EACvB,SAAS,EAAE,MAAM,EACjB,QAAQ,GAAE,QAAQ,GAAG,MAAiB,GACrC,0BAA0B,CA+C5B"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { createHash } from "node:crypto";
|
|
2
|
+
import { previewCases } from "./case-preview.js";
|
|
2
3
|
import { semanticClaimKey } from "./clauses.js";
|
|
3
4
|
export const SEMANTIC_INVENTORY_VERSION = "kibi.semantic-inventory.v1";
|
|
4
5
|
// implements REQ-mcp-semantic-advisor-preflight
|
|
@@ -135,6 +136,7 @@ export function strictSuggestion(payload, evidence, claim, rationale, confidence
|
|
|
135
136
|
claim.value_int ??
|
|
136
137
|
claim.value_number ??
|
|
137
138
|
claim.value_bool;
|
|
139
|
+
const casesPreview = previewCases(claim);
|
|
138
140
|
const propertyFields = {
|
|
139
141
|
...(claim.value_string !== undefined
|
|
140
142
|
? { value_string: claim.value_string }
|
|
@@ -158,6 +160,7 @@ export function strictSuggestion(payload, evidence, claim, rationale, confidence
|
|
|
158
160
|
rationale,
|
|
159
161
|
suggested_next_tool: "kb_model_requirement",
|
|
160
162
|
claim,
|
|
163
|
+
...(casesPreview.cases.length > 0 ? { casesPreview } : {}),
|
|
161
164
|
rejected_alternatives: ["predicate", "observation_review"],
|
|
162
165
|
applyPlan: [
|
|
163
166
|
{
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import type { LogicRuleIR } from "../../logic/ir.js";
|
|
2
|
+
import type { CasePreview } from "./case-preview.js";
|
|
2
3
|
export type SemanticAdvisorLane = "strict_property" | "predicate" | "rule" | "observation_review" | "none";
|
|
3
4
|
export type SemanticAdvisorReadiness = "modeled" | "needs_modeling" | "not_applicable";
|
|
4
5
|
export type SemanticLogicCoverageStatus = "complete" | "partial" | "unverified" | "not_applicable";
|
|
@@ -17,6 +18,19 @@ export interface SemanticProposition {
|
|
|
17
18
|
readonly payload_hash?: string;
|
|
18
19
|
readonly semantic_key?: string;
|
|
19
20
|
readonly reason?: string;
|
|
21
|
+
/**
|
|
22
|
+
* Set when the clause quantifies over a collection (each, every, all) or
|
|
23
|
+
* bounds a cardinality (exactly, at least, at most, no more than). A
|
|
24
|
+
* boolean or ground-predicate grounding would state only the verdict, so
|
|
25
|
+
* the proof ladder reports dimension_unrepresented until the claim is
|
|
26
|
+
* grounded on one of `rewrites`.
|
|
27
|
+
*/
|
|
28
|
+
readonly dimension?: SemanticPropositionDimension;
|
|
29
|
+
}
|
|
30
|
+
export interface SemanticPropositionDimension {
|
|
31
|
+
readonly quantifier: string;
|
|
32
|
+
/** Typed groundings that represent what varies, likeliest first. */
|
|
33
|
+
readonly rewrites: readonly ("bound" | "rule" | "count" | "set")[];
|
|
20
34
|
}
|
|
21
35
|
export interface SemanticInterpretationInput {
|
|
22
36
|
readonly claim_key: string;
|
|
@@ -94,6 +108,15 @@ export type SemanticModelingSuggestion = {
|
|
|
94
108
|
readonly rationale: string;
|
|
95
109
|
readonly suggested_next_tool: "kb_model_requirement";
|
|
96
110
|
readonly claim: SemanticStrictPropertyClaim;
|
|
111
|
+
/**
|
|
112
|
+
* The edge cases the proof ladder derives from this claim once it is
|
|
113
|
+
* written; each rejection case needs a scenario that assumes it.
|
|
114
|
+
* Omitted when the claim yields none (a boolean or string value).
|
|
115
|
+
*/
|
|
116
|
+
readonly casesPreview?: {
|
|
117
|
+
readonly cases: readonly CasePreview[];
|
|
118
|
+
readonly limitReached: boolean;
|
|
119
|
+
};
|
|
97
120
|
readonly rejected_alternatives: readonly string[];
|
|
98
121
|
readonly applyPlan: readonly Readonly<Record<string, unknown>>[];
|
|
99
122
|
} | {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/operations/semantic-advisor/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAErD,MAAM,MAAM,mBAAmB,GAC3B,iBAAiB,GACjB,WAAW,GACX,MAAM,GACN,oBAAoB,GACpB,MAAM,CAAC;AAEX,MAAM,MAAM,wBAAwB,GAChC,SAAS,GACT,gBAAgB,GAChB,gBAAgB,CAAC;AACrB,MAAM,MAAM,2BAA2B,GACnC,UAAU,GACV,SAAS,GACT,YAAY,GACZ,gBAAgB,CAAC;AAErB,MAAM,MAAM,uBAAuB,GAC/B,WAAW,GACX,YAAY,GACZ,aAAa,GACb,WAAW,GACX,WAAW,GACX,WAAW,GACX,SAAS,GACT,YAAY,CAAC;AAEjB,MAAM,MAAM,yBAAyB,GACjC,SAAS,GACT,WAAW,GACX,cAAc,GACd,YAAY,GACZ,SAAS,CAAC;AAEd,MAAM,WAAW,uBAAuB;IACtC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,IAAI,EAAE,uBAAuB,CAAC;IACvC,QAAQ,CAAC,MAAM,EAAE,yBAAyB,CAAC;IAC3C,QAAQ,CAAC,IAAI,EAAE,uBAAuB,CAAC;IACvC,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/operations/semantic-advisor/types.ts"],"names":[],"mappings":"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"}
|