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
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mutation-schemas.d.ts","sourceRoot":"","sources":["../../../../src/public/operations/specs/mutation-schemas.ts"],"names":[],"mappings":"AAWA,eAAO,MAAM,YAAY,gFASf,CAAC;AAWX,eAAO,MAAM,wBAAwB
|
|
1
|
+
{"version":3,"file":"mutation-schemas.d.ts","sourceRoot":"","sources":["../../../../src/public/operations/specs/mutation-schemas.ts"],"names":[],"mappings":"AAWA,eAAO,MAAM,YAAY,gFASf,CAAC;AAWX,eAAO,MAAM,wBAAwB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAqb3B,CAAC;AAEX,eAAO,MAAM,oBAAoB;;;;;;;;;;;;;;;;;;;;;;CA8CvB,CAAC"}
|
|
@@ -103,6 +103,16 @@ export const ENTITY_PROPERTIES_SCHEMA = {
|
|
|
103
103
|
minLength: 1,
|
|
104
104
|
description: "Requirement-only. Optional reference to the exception's approval decision record.",
|
|
105
105
|
},
|
|
106
|
+
failure_side_waiver: {
|
|
107
|
+
type: "string",
|
|
108
|
+
minLength: 1,
|
|
109
|
+
description: "Requirement-only. Why the requirement has no failure side to test (its claims state a capability or output shape). Waives happy_path_only once failure_side_waiver_approved_by is set.",
|
|
110
|
+
},
|
|
111
|
+
failure_side_waiver_approved_by: {
|
|
112
|
+
type: "string",
|
|
113
|
+
minLength: 1,
|
|
114
|
+
description: "Requirement-only. The person who accepted failure_side_waiver.",
|
|
115
|
+
},
|
|
106
116
|
firmness: {
|
|
107
117
|
type: "string",
|
|
108
118
|
enum: ["firm", "default", "exploratory"],
|
|
@@ -277,6 +287,26 @@ export const ENTITY_PROPERTIES_SCHEMA = {
|
|
|
277
287
|
type: "string",
|
|
278
288
|
description: "Exact atomic requirement clause represented by this fact, retained for human audit. On a grounding fact Kibi derives claim_key from it; an observation or meta fact quotes the clause it is about without a key.",
|
|
279
289
|
},
|
|
290
|
+
dimension_waiver: {
|
|
291
|
+
type: "string",
|
|
292
|
+
minLength: 1,
|
|
293
|
+
description: "Fact-only. Why the quantifier word in claim_text ranges over nothing, so the claim needs no count, set or rule. Waives dimension_unrepresented once dimension_waiver_approved_by is set.",
|
|
294
|
+
},
|
|
295
|
+
dimension_waiver_approved_by: {
|
|
296
|
+
type: "string",
|
|
297
|
+
minLength: 1,
|
|
298
|
+
description: "Fact-only. The person who accepted dimension_waiver.",
|
|
299
|
+
},
|
|
300
|
+
case_waiver: {
|
|
301
|
+
type: "string",
|
|
302
|
+
minLength: 1,
|
|
303
|
+
description: "Fact-only. Why the edge cases derived from this fact are covered some other way or cannot occur. Waives uncovered_case once case_waiver_approved_by is set.",
|
|
304
|
+
},
|
|
305
|
+
case_waiver_approved_by: {
|
|
306
|
+
type: "string",
|
|
307
|
+
minLength: 1,
|
|
308
|
+
description: "Fact-only. The person who accepted case_waiver.",
|
|
309
|
+
},
|
|
280
310
|
predicate_name: {
|
|
281
311
|
type: "string",
|
|
282
312
|
description: "Optional predicate name for ontology predicate facts. Prefer kb_model mode predicates before hand-writing predicate_name.",
|
|
@@ -135,6 +135,16 @@ export declare const upsertSpec: {
|
|
|
135
135
|
readonly minLength: 1;
|
|
136
136
|
readonly description: "Requirement-only. Optional reference to the exception's approval decision record.";
|
|
137
137
|
};
|
|
138
|
+
readonly failure_side_waiver: {
|
|
139
|
+
readonly type: "string";
|
|
140
|
+
readonly minLength: 1;
|
|
141
|
+
readonly description: "Requirement-only. Why the requirement has no failure side to test (its claims state a capability or output shape). Waives happy_path_only once failure_side_waiver_approved_by is set.";
|
|
142
|
+
};
|
|
143
|
+
readonly failure_side_waiver_approved_by: {
|
|
144
|
+
readonly type: "string";
|
|
145
|
+
readonly minLength: 1;
|
|
146
|
+
readonly description: "Requirement-only. The person who accepted failure_side_waiver.";
|
|
147
|
+
};
|
|
138
148
|
readonly firmness: {
|
|
139
149
|
readonly type: "string";
|
|
140
150
|
readonly enum: readonly ["firm", "default", "exploratory"];
|
|
@@ -837,6 +847,26 @@ export declare const upsertSpec: {
|
|
|
837
847
|
readonly type: "string";
|
|
838
848
|
readonly description: "Exact atomic requirement clause represented by this fact, retained for human audit. On a grounding fact Kibi derives claim_key from it; an observation or meta fact quotes the clause it is about without a key.";
|
|
839
849
|
};
|
|
850
|
+
readonly dimension_waiver: {
|
|
851
|
+
readonly type: "string";
|
|
852
|
+
readonly minLength: 1;
|
|
853
|
+
readonly description: "Fact-only. Why the quantifier word in claim_text ranges over nothing, so the claim needs no count, set or rule. Waives dimension_unrepresented once dimension_waiver_approved_by is set.";
|
|
854
|
+
};
|
|
855
|
+
readonly dimension_waiver_approved_by: {
|
|
856
|
+
readonly type: "string";
|
|
857
|
+
readonly minLength: 1;
|
|
858
|
+
readonly description: "Fact-only. The person who accepted dimension_waiver.";
|
|
859
|
+
};
|
|
860
|
+
readonly case_waiver: {
|
|
861
|
+
readonly type: "string";
|
|
862
|
+
readonly minLength: 1;
|
|
863
|
+
readonly description: "Fact-only. Why the edge cases derived from this fact are covered some other way or cannot occur. Waives uncovered_case once case_waiver_approved_by is set.";
|
|
864
|
+
};
|
|
865
|
+
readonly case_waiver_approved_by: {
|
|
866
|
+
readonly type: "string";
|
|
867
|
+
readonly minLength: 1;
|
|
868
|
+
readonly description: "Fact-only. The person who accepted case_waiver.";
|
|
869
|
+
};
|
|
840
870
|
readonly predicate_name: {
|
|
841
871
|
readonly type: "string";
|
|
842
872
|
readonly description: "Optional predicate name for ontology predicate facts. Prefer kb_model mode predicates before hand-writing predicate_name.";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"upsert.d.ts","sourceRoot":"","sources":["../../../../src/public/operations/specs/upsert.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,aAAa,EAAE,MAAM,wCAAwC,CAAC;AAQvE,eAAO,MAAM,UAAU
|
|
1
|
+
{"version":3,"file":"upsert.d.ts","sourceRoot":"","sources":["../../../../src/public/operations/specs/upsert.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,aAAa,EAAE,MAAM,wCAAwC,CAAC;AAQvE,eAAO,MAAM,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA0DuC,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"entity.d.ts","sourceRoot":"","sources":["../../../src/public/schemas/entity.ts"],"names":[],"mappings":"AAmUA,QAAA,MAAM,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,
|
|
1
|
+
{"version":3,"file":"entity.d.ts","sourceRoot":"","sources":["../../../src/public/schemas/entity.ts"],"names":[],"mappings":"AAmUA,QAAA,MAAM,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CA8gBzC,CAAC;AAEF,eAAe,YAAY,CAAC"}
|
|
@@ -369,6 +369,18 @@ const entitySchema = {
|
|
|
369
369
|
minLength: 1,
|
|
370
370
|
description: "Requirement-only. Optional reference to the approval decision record (ticket, ADR or review link) for an exception requirement.",
|
|
371
371
|
},
|
|
372
|
+
failure_side_waiver: {
|
|
373
|
+
type: "string",
|
|
374
|
+
minLength: 1,
|
|
375
|
+
pattern: "\\S",
|
|
376
|
+
description: "Requirement-only. Why the requirement has no failure side to test: its claims state a capability or an output shape, so there is no input or attempt for Kibi to refuse. Waives the happy_path_only gap once failure_side_waiver_approved_by is set.",
|
|
377
|
+
},
|
|
378
|
+
failure_side_waiver_approved_by: {
|
|
379
|
+
type: "string",
|
|
380
|
+
minLength: 1,
|
|
381
|
+
pattern: "\\S",
|
|
382
|
+
description: "Requirement-only. The person who accepted failure_side_waiver. Without it the waiver is reported as awaiting approval and the gap stays open.",
|
|
383
|
+
},
|
|
372
384
|
rationale: {
|
|
373
385
|
type: "string",
|
|
374
386
|
minLength: 1,
|
|
@@ -452,6 +464,23 @@ const entitySchema = {
|
|
|
452
464
|
semantic_key: { type: "string" },
|
|
453
465
|
payload_hash: { type: "string" },
|
|
454
466
|
reason: { type: "string" },
|
|
467
|
+
// The advisor's hint for a quantified clause, kept so its receipt
|
|
468
|
+
// propositions can be copied into the inventory unchanged.
|
|
469
|
+
dimension: {
|
|
470
|
+
type: "object",
|
|
471
|
+
required: ["quantifier", "rewrites"],
|
|
472
|
+
properties: {
|
|
473
|
+
quantifier: { type: "string", minLength: 1 },
|
|
474
|
+
rewrites: {
|
|
475
|
+
type: "array",
|
|
476
|
+
items: {
|
|
477
|
+
type: "string",
|
|
478
|
+
enum: ["bound", "rule", "count", "set"],
|
|
479
|
+
},
|
|
480
|
+
},
|
|
481
|
+
},
|
|
482
|
+
additionalProperties: false,
|
|
483
|
+
},
|
|
455
484
|
},
|
|
456
485
|
additionalProperties: false,
|
|
457
486
|
},
|
|
@@ -561,6 +590,30 @@ const entitySchema = {
|
|
|
561
590
|
canonical_key: { type: "string" },
|
|
562
591
|
claim_key: { type: "string", pattern: "^CLAIM-[A-F0-9]{16}$" },
|
|
563
592
|
claim_text: { type: "string" },
|
|
593
|
+
dimension_waiver: {
|
|
594
|
+
type: "string",
|
|
595
|
+
minLength: 1,
|
|
596
|
+
pattern: "\\S",
|
|
597
|
+
description: "Fact-only. Why the quantifier word in claim_text (each, every, all, or a cardinality bound) ranges over nothing, so the claim needs no count, set or rule. Waives dimension_unrepresented for the claim once dimension_waiver_approved_by is set.",
|
|
598
|
+
},
|
|
599
|
+
dimension_waiver_approved_by: {
|
|
600
|
+
type: "string",
|
|
601
|
+
minLength: 1,
|
|
602
|
+
pattern: "\\S",
|
|
603
|
+
description: "Fact-only. The person who accepted dimension_waiver. Without it the waiver is reported as awaiting approval and the gap stays open.",
|
|
604
|
+
},
|
|
605
|
+
case_waiver: {
|
|
606
|
+
type: "string",
|
|
607
|
+
minLength: 1,
|
|
608
|
+
pattern: "\\S",
|
|
609
|
+
description: "Fact-only. Why the edge cases Kibi derives from this fact (the value past a bound, a value outside a set) are covered some other way or cannot occur. Waives uncovered_case for the fact once case_waiver_approved_by is set.",
|
|
610
|
+
},
|
|
611
|
+
case_waiver_approved_by: {
|
|
612
|
+
type: "string",
|
|
613
|
+
minLength: 1,
|
|
614
|
+
pattern: "\\S",
|
|
615
|
+
description: "Fact-only. The person who accepted case_waiver. Without it the waiver is reported as awaiting approval and the gap stays open.",
|
|
616
|
+
},
|
|
564
617
|
predicate_name: { type: "string" },
|
|
565
618
|
predicate_namespace: { type: "string" },
|
|
566
619
|
predicate_arity: { type: "integer", minimum: 1 },
|
|
@@ -654,6 +707,10 @@ const entitySchema = {
|
|
|
654
707
|
{ required: ["canonical_key"] },
|
|
655
708
|
{ required: ["claim_key"] },
|
|
656
709
|
{ required: ["claim_text"] },
|
|
710
|
+
{ required: ["dimension_waiver"] },
|
|
711
|
+
{ required: ["dimension_waiver_approved_by"] },
|
|
712
|
+
{ required: ["case_waiver"] },
|
|
713
|
+
{ required: ["case_waiver_approved_by"] },
|
|
657
714
|
{ required: ["predicate_name"] },
|
|
658
715
|
{ required: ["predicate_namespace"] },
|
|
659
716
|
{ required: ["predicate_arity"] },
|
|
@@ -715,6 +772,8 @@ const entitySchema = {
|
|
|
715
772
|
{ required: ["proof_exempt_reason"] },
|
|
716
773
|
{ required: ["approved_by"] },
|
|
717
774
|
{ required: ["approval_ref"] },
|
|
775
|
+
{ required: ["failure_side_waiver"] },
|
|
776
|
+
{ required: ["failure_side_waiver_approved_by"] },
|
|
718
777
|
{ required: ["rationale"] },
|
|
719
778
|
{ required: ["exempts_claims"] },
|
|
720
779
|
{ required: ["required_evidence"] },
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
id: kibi-commit-review
|
|
3
3
|
name: kibi-commit-review
|
|
4
4
|
description: "Use when kibi check --staged or the Kibi pre-commit hook blocks a commit (kibi_impact_evidence_missing, symbols_manifest_stale, symbol_granularity_violation, symbol-coverage, kibi check-generated drift, Staged impact review failed), or when preparing a commit or pull-request impact review. Covers reading the per-file Detail lines, authoring .kb/symbols.yaml symbol entries through kb_upsert, staging the tracked Kibi evidence with git add (symbol coordinates are derived and never staged), kb_prepare_impact_review for a staged or diff scope, the kibi signoff requirements summary to show before a commit, and how merge commits and migration renames are judged."
|
|
5
|
-
version: 1.
|
|
5
|
+
version: 1.4.0
|
|
6
6
|
kibiCompatibility: ">=1.0.0"
|
|
7
7
|
tags:
|
|
8
8
|
- kibi
|
|
@@ -91,7 +91,11 @@ apps); never attach the `.html` as a file, which chat apps show as raw source;
|
|
|
91
91
|
past 15 requirements the Markdown stops and only the page lists them all.
|
|
92
92
|
Host details: `kibi-decisions`, `resources/signoff-views.md`. `--no-proof` skips the proof lookup, which reads coverage and is slow
|
|
93
93
|
on a large knowledge base. The summary is not an approval: never set
|
|
94
|
-
`approved_by` or `origin.ref` from it.
|
|
94
|
+
`approved_by` or `origin.ref` from it. Show it before you open or merge the
|
|
95
|
+
pull request. When the person answers, record their answer in the same
|
|
96
|
+
change (their name in `approved_by`, their words in `origin.ref` or
|
|
97
|
+
`approval_ref`) and push it to the same pull request; never move a signoff,
|
|
98
|
+
firmness or waiver approval into a separate pull request.
|
|
95
99
|
|
|
96
100
|
## Impact reviews
|
|
97
101
|
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
id: kibi-decisions
|
|
3
3
|
name: kibi-decisions
|
|
4
4
|
description: "Use when the person states a rule or decision (must, never, always, from now on, we decided), when a Kibi hook asks to confirm or warns about an edit to code that implements a firm requirement, when the Stop hook says source files changed but nothing was recorded, when kb_check quotes requirement_statement_unverified, or when a request conflicts with a recorded requirement or ADR. Covers reading firmness and origin, recording a person's rule as firm with origin.ref, superseding with a Why this changed section, the kb_compile_intent unresolved/reviewCandidates/conflictReviews loop, asking before overriding a firm rule, and putting decisions to the person as one numbered kibi signoff --questions view."
|
|
5
|
-
version: 1.
|
|
5
|
+
version: 1.5.0
|
|
6
6
|
kibiCompatibility: ">=1.0.0"
|
|
7
7
|
tags:
|
|
8
8
|
- kibi
|
|
@@ -115,7 +115,12 @@ again until none is open, then record each rule with their words in
|
|
|
115
115
|
`origin.ref`. Fields and outputs: `resources/signoff-views.md`.
|
|
116
116
|
|
|
117
117
|
Never invent words for `origin.ref`, never set `approved_by` yourself, and
|
|
118
|
-
mark your own picks `default` and guesses `exploratory`.
|
|
118
|
+
mark your own picks `default` and guesses `exploratory`. Once the person has
|
|
119
|
+
answered, recording their answer (their name in `approved_by` or a
|
|
120
|
+
`*_waiver_approved_by` field, their words in `origin.ref` or `approval_ref`)
|
|
121
|
+
is yours to do: put it on the branch of the change it approves and push it to
|
|
122
|
+
that pull request, never to a separate one. Ask before you open or merge the
|
|
123
|
+
pull request, so the answer lands in it. Payload shapes,
|
|
119
124
|
refusal messages and the `kb_compile_intent` review loop are in
|
|
120
125
|
`resources/decision-records.md`.
|
|
121
126
|
|
|
@@ -51,7 +51,9 @@ writes and opens the page; `--format json` prints the view.
|
|
|
51
51
|
The person answers by number ("1 yes, 2 exploratory, 3 reword: ..."). Copy
|
|
52
52
|
each answer into `answer`, render again, and record the rules only once every
|
|
53
53
|
question is answered. An answer is the person's words: quote it in
|
|
54
|
-
`origin.ref`; a view itself is never an approval.
|
|
54
|
+
`origin.ref`; a view itself is never an approval. Record the answers on the
|
|
55
|
+
branch of the change they approve and push them to its pull request, never to
|
|
56
|
+
a separate one.
|
|
55
57
|
|
|
56
58
|
## Summary contents
|
|
57
59
|
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
id: kibi-usage
|
|
3
3
|
name: Kibi Usage
|
|
4
4
|
description: Use Kibi's source-first, exact-Git, migration-aware, proof-aware operations safely across MCP or the trusted local CLI, including partial completion repair.
|
|
5
|
-
version: 2.
|
|
5
|
+
version: 2.37.0
|
|
6
6
|
kibiCompatibility: ">=1.0.0"
|
|
7
7
|
tags:
|
|
8
8
|
- kibi
|
|
@@ -372,6 +372,14 @@ human sets `approved_by`; `kb_check` flags approvals an agent recorded without
|
|
|
372
372
|
corroboration. Never fill in an approval yourself. Record why a requirement
|
|
373
373
|
exists in `rationale`, or link the ADR that explains it.
|
|
374
374
|
|
|
375
|
+
A signoff belongs to the change it approves. Ask for it before you open or
|
|
376
|
+
merge the pull request, and when the person answers, record their answer
|
|
377
|
+
(`approved_by` or a `*_waiver_approved_by` field set to them, their words in
|
|
378
|
+
`origin.ref` or `approval_ref`) on the same branch and push it to the same pull
|
|
379
|
+
request. Writing down an answer the person gave is not approving it yourself.
|
|
380
|
+
Never open a separate pull request only to carry a signoff, firmness or waiver
|
|
381
|
+
approval.
|
|
382
|
+
|
|
375
383
|
## Decision firmness
|
|
376
384
|
|
|
377
385
|
Requirements and ADRs carry `firmness`, which says what you may do with them.
|
|
@@ -562,6 +562,18 @@
|
|
|
562
562
|
"minLength": 1,
|
|
563
563
|
"description": "Requirement-only. Optional reference to the approval decision record (ticket, ADR or review link) for an exception requirement."
|
|
564
564
|
},
|
|
565
|
+
"failure_side_waiver": {
|
|
566
|
+
"type": "string",
|
|
567
|
+
"minLength": 1,
|
|
568
|
+
"pattern": "\\S",
|
|
569
|
+
"description": "Requirement-only. Why the requirement has no failure side to test: its claims state a capability or an output shape, so there is no input or attempt for Kibi to refuse. Waives the happy_path_only gap once failure_side_waiver_approved_by is set."
|
|
570
|
+
},
|
|
571
|
+
"failure_side_waiver_approved_by": {
|
|
572
|
+
"type": "string",
|
|
573
|
+
"minLength": 1,
|
|
574
|
+
"pattern": "\\S",
|
|
575
|
+
"description": "Requirement-only. The person who accepted failure_side_waiver. Without it the waiver is reported as awaiting approval and the gap stays open."
|
|
576
|
+
},
|
|
565
577
|
"rationale": {
|
|
566
578
|
"type": "string",
|
|
567
579
|
"minLength": 1,
|
|
@@ -684,6 +696,32 @@
|
|
|
684
696
|
},
|
|
685
697
|
"reason": {
|
|
686
698
|
"type": "string"
|
|
699
|
+
},
|
|
700
|
+
"dimension": {
|
|
701
|
+
"type": "object",
|
|
702
|
+
"required": [
|
|
703
|
+
"quantifier",
|
|
704
|
+
"rewrites"
|
|
705
|
+
],
|
|
706
|
+
"properties": {
|
|
707
|
+
"quantifier": {
|
|
708
|
+
"type": "string",
|
|
709
|
+
"minLength": 1
|
|
710
|
+
},
|
|
711
|
+
"rewrites": {
|
|
712
|
+
"type": "array",
|
|
713
|
+
"items": {
|
|
714
|
+
"type": "string",
|
|
715
|
+
"enum": [
|
|
716
|
+
"bound",
|
|
717
|
+
"rule",
|
|
718
|
+
"count",
|
|
719
|
+
"set"
|
|
720
|
+
]
|
|
721
|
+
}
|
|
722
|
+
}
|
|
723
|
+
},
|
|
724
|
+
"additionalProperties": false
|
|
687
725
|
}
|
|
688
726
|
},
|
|
689
727
|
"additionalProperties": false
|
|
@@ -1602,6 +1640,30 @@
|
|
|
1602
1640
|
"claim_text": {
|
|
1603
1641
|
"type": "string"
|
|
1604
1642
|
},
|
|
1643
|
+
"dimension_waiver": {
|
|
1644
|
+
"type": "string",
|
|
1645
|
+
"minLength": 1,
|
|
1646
|
+
"pattern": "\\S",
|
|
1647
|
+
"description": "Fact-only. Why the quantifier word in claim_text (each, every, all, or a cardinality bound) ranges over nothing, so the claim needs no count, set or rule. Waives dimension_unrepresented for the claim once dimension_waiver_approved_by is set."
|
|
1648
|
+
},
|
|
1649
|
+
"dimension_waiver_approved_by": {
|
|
1650
|
+
"type": "string",
|
|
1651
|
+
"minLength": 1,
|
|
1652
|
+
"pattern": "\\S",
|
|
1653
|
+
"description": "Fact-only. The person who accepted dimension_waiver. Without it the waiver is reported as awaiting approval and the gap stays open."
|
|
1654
|
+
},
|
|
1655
|
+
"case_waiver": {
|
|
1656
|
+
"type": "string",
|
|
1657
|
+
"minLength": 1,
|
|
1658
|
+
"pattern": "\\S",
|
|
1659
|
+
"description": "Fact-only. Why the edge cases Kibi derives from this fact (the value past a bound, a value outside a set) are covered some other way or cannot occur. Waives uncovered_case for the fact once case_waiver_approved_by is set."
|
|
1660
|
+
},
|
|
1661
|
+
"case_waiver_approved_by": {
|
|
1662
|
+
"type": "string",
|
|
1663
|
+
"minLength": 1,
|
|
1664
|
+
"pattern": "\\S",
|
|
1665
|
+
"description": "Fact-only. The person who accepted case_waiver. Without it the waiver is reported as awaiting approval and the gap stays open."
|
|
1666
|
+
},
|
|
1605
1667
|
"predicate_name": {
|
|
1606
1668
|
"type": "string"
|
|
1607
1669
|
},
|
|
@@ -1839,6 +1901,26 @@
|
|
|
1839
1901
|
"claim_text"
|
|
1840
1902
|
]
|
|
1841
1903
|
},
|
|
1904
|
+
{
|
|
1905
|
+
"required": [
|
|
1906
|
+
"dimension_waiver"
|
|
1907
|
+
]
|
|
1908
|
+
},
|
|
1909
|
+
{
|
|
1910
|
+
"required": [
|
|
1911
|
+
"dimension_waiver_approved_by"
|
|
1912
|
+
]
|
|
1913
|
+
},
|
|
1914
|
+
{
|
|
1915
|
+
"required": [
|
|
1916
|
+
"case_waiver"
|
|
1917
|
+
]
|
|
1918
|
+
},
|
|
1919
|
+
{
|
|
1920
|
+
"required": [
|
|
1921
|
+
"case_waiver_approved_by"
|
|
1922
|
+
]
|
|
1923
|
+
},
|
|
1842
1924
|
{
|
|
1843
1925
|
"required": [
|
|
1844
1926
|
"predicate_name"
|
|
@@ -2051,6 +2133,16 @@
|
|
|
2051
2133
|
"approval_ref"
|
|
2052
2134
|
]
|
|
2053
2135
|
},
|
|
2136
|
+
{
|
|
2137
|
+
"required": [
|
|
2138
|
+
"failure_side_waiver"
|
|
2139
|
+
]
|
|
2140
|
+
},
|
|
2141
|
+
{
|
|
2142
|
+
"required": [
|
|
2143
|
+
"failure_side_waiver_approved_by"
|
|
2144
|
+
]
|
|
2145
|
+
},
|
|
2054
2146
|
{
|
|
2055
2147
|
"required": [
|
|
2056
2148
|
"rationale"
|
package/dist/search-answer.d.ts
CHANGED
|
@@ -218,8 +218,9 @@ export declare function buildSearchAnswer(prolog: Pick<PrologPort, "query">, mat
|
|
|
218
218
|
/**
|
|
219
219
|
* Hold the whole answer under `maxBytes`, marking it truncated when anything
|
|
220
220
|
* is cut. In order: long titles, excerpts and details are clipped; ADR
|
|
221
|
-
* excerpts are dropped, last rationale entry first;
|
|
222
|
-
*
|
|
221
|
+
* excerpts are dropped, last rationale entry first; each governing
|
|
222
|
+
* requirement keeps only its first scenario and test, last requirement first;
|
|
223
|
+
* the least relevant governing requirements are dropped;
|
|
223
224
|
* list items are dropped (notes and side lists before the remaining
|
|
224
225
|
* requirement's own lists, its verdict witnesses last); then the remaining
|
|
225
226
|
* requirement's title and `via` are clipped. A verdict keeps its status when
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"search-answer.d.ts","sourceRoot":"","sources":["../src/search-answer.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"search-answer.d.ts","sourceRoot":"","sources":["../src/search-answer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,QAAQ,EAAqB,MAAM,wBAAwB,CAAC;AAC1E,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAY5D,OAAO,KAAK,EACV,UAAU,EAEX,MAAM,sCAAsC,CAAC;AAI9C;;;;;;;;;;;;;;GAcG;AACH,MAAM,MAAM,kBAAkB,GAAG,QAAQ,CAAC;IACxC,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB;;;;OAIG;IACH,QAAQ,CAAC,EAAE,QAAQ,CAAC;CACrB,CAAC,CAAC;AAEH;;;GAGG;AAEH,MAAM,MAAM,gBAAgB,GAAG,kBAAkB,GAAG,QAAQ,CAAC;IAAE,GAAG,EAAE,MAAM,CAAA;CAAE,CAAC,CAAC;AAE9E,sEAAsE;AAEtE,MAAM,MAAM,qBAAqB,GAAG,kBAAkB,GACpD,QAAQ,CAAC;IAAE,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAAC;AAElD,0EAA0E;AAE1E,MAAM,MAAM,mBAAmB,GAAG,QAAQ,CAAC;IACzC,KAAK,EAAE,uBAAuB,GAAG,sBAAsB,CAAC;IACxD,MAAM,EAAE,eAAe,GAAG,YAAY,CAAC;IACvC,uEAAuE;IACvE,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,SAAS,MAAM,EAAE,CAAC;IACzB,MAAM,EAAE,MAAM,CAAC;CAChB,CAAC,CAAC;AAEH;;;;;GAKG;AAEH,MAAM,MAAM,mBAAmB,GAAG,QAAQ,CAAC;IACzC,IAAI,EACA,0BAA0B,GAC1B,qBAAqB,GACrB,wBAAwB,GACxB,qBAAqB,GACrB,qBAAqB,CAAC;IAC1B,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,SAAS,MAAM,EAAE,CAAC;CAC7B,CAAC,CAAC;AAGH,MAAM,MAAM,mBAAmB,GAAG,QAAQ,CAAC;IACzC;;;;OAIG;IACH,MAAM,EAAE,eAAe,GAAG,YAAY,GAAG,SAAS,GAAG,MAAM,CAAC;IAC5D,SAAS,EAAE,SAAS,mBAAmB,EAAE,CAAC;CAC3C,CAAC,CAAC;AAEH,sDAAsD;AAEtD,MAAM,MAAM,qBAAqB,GAAG,kBAAkB,GACpD,QAAQ,CAAC;IAAE,UAAU,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAAC;AAEpC;;;;;;;;;;GAUG;AAEH,MAAM,MAAM,gBAAgB,GAAG,kBAAkB,GAC/C,QAAQ,CAAC;IAAE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAAC;AAGhE,MAAM,MAAM,uBAAuB,GAAG,kBAAkB,GACtD,QAAQ,CAAC;IACP,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,SAAS,gBAAgB,EAAE,CAAC;IACnC;;;OAGG;IACH,SAAS,CAAC,EAAE,QAAQ,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACrD,SAAS,EAAE,SAAS,kBAAkB,EAAE,CAAC;IACzC,KAAK,EAAE,SAAS,gBAAgB,EAAE,CAAC;IACnC,IAAI,EAAE,SAAS,kBAAkB,EAAE,CAAC;IACpC,OAAO,EAAE,mBAAmB,CAAC;IAC7B,UAAU,EAAE,SAAS,qBAAqB,EAAE,CAAC;IAC7C,QAAQ,EAAE,SAAS,mBAAmB,EAAE,CAAC;CAC1C,CAAC,CAAC;AAEL,2CAA2C;AAE3C,MAAM,MAAM,iBAAiB,GAAG,QAAQ,CAAC;IACvC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;CACzB,CAAC,CAAC;AAEH;;;;;;GAMG;AAEH,MAAM,MAAM,sBAAsB,GAAG,gBAAgB,GACnD,QAAQ,CAAC;IACP,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb;;;OAGG;IACH,YAAY,CAAC,EAAE,QAAQ,CAAC;QACtB,IAAI,EAAE,MAAM,CAAC;QACb,WAAW,EAAE,MAAM,CAAC;QACpB,KAAK,CAAC,EAAE,MAAM,CAAC;KAChB,CAAC,CAAC;CACJ,CAAC,CAAC;AAGL,MAAM,MAAM,YAAY,GAAG,QAAQ,CAAC;IAClC,OAAO,EAAE,uBAAuB,CAAC;IACjC,SAAS,EAAE,SAAS,uBAAuB,EAAE,CAAC;IAC9C,SAAS,EAAE,SAAS,qBAAqB,EAAE,CAAC;IAC5C,YAAY,EAAE,SAAS,CAAC,kBAAkB,GAAG;QAAE,YAAY,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,EAAE,CAAC;IAC1E,YAAY,EAAE,SAAS,kBAAkB,EAAE,CAAC;IAC5C,UAAU,EAAE,SAAS,sBAAsB,EAAE,CAAC;IAC9C,KAAK,EAAE,iBAAiB,CAAC;IACzB,SAAS,EAAE,OAAO,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;CACd,CAAC,CAAC;AAGH,MAAM,MAAM,mBAAmB,GAAG,QAAQ,CAAC;IACzC,qEAAqE;IACrE,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,kDAAkD;IAClD,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CACxB,CAAC,CAAC;AA8DH,eAAO,MAAM,oBAAoB;;;;IAI/B;;;;OAIG;;;;;;IAMH,iEAAiE;;;IAGjE,wEAAwE;;IAExE,yDAAyD;;IAEzD,sDAAsD;;CAE9C,CAAC;AAgCX;;;;GAIG;AAEH,MAAM,MAAM,mBAAmB,GAAG,QAAQ,CAAC;IACzC,aAAa,EAAE,SAAS,MAAM,EAAE,CAAC;IACjC,YAAY,EAAE,SAAS,MAAM,EAAE,CAAC;CACjC,CAAC,CAAC;AAEH;;;;;;GAMG;AAEH,wBAAgB,kBAAkB,CAChC,IAAI,EAAE,SAAS,MAAM,EAAE,EACvB,MAAM,EAAE,mBAAmB,GAC1B,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,SAAS,CAcpC;AA8PD;;;;GAIG;AAEH,wBAAgB,UAAU,CACxB,IAAI,EAAE,MAAM,EACZ,QAAQ,GAAE,MAA0C,GACnD,MAAM,GAAG,SAAS,CAqDpB;AA0BD,KAAK,UAAU,GAAG,QAAQ,CAAC;IACzB,EAAE,CAAC,EAAE,OAAO,CAAC;IACb,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB,CAAC,CAAC;AAkCH,4EAA4E;AAE5E,wBAAgB,cAAc,CAC5B,GAAG,EAAE,UAAU,GAAG,SAAS,EAC3B,cAAc,GAAE,MAA4C,GAC3D;IACD,OAAO,EAAE,mBAAmB,CAAC;IAC7B,QAAQ,EAAE,mBAAmB,EAAE,CAAC;IAChC,SAAS,EAAE,OAAO,CAAC;CACpB,CAyGA;AA6ED,wBAAsB,iBAAiB,CACrC,MAAM,EAAE,IAAI,CAAC,UAAU,EAAE,OAAO,CAAC,EACjC,OAAO,EAAE,SAAS,iBAAiB,EAAE,EACrC,OAAO,GAAE,mBAAwB,GAChC,OAAO,CAAC,YAAY,CAAC,CA4YvB;AAmGD;;;;;;;;;;;GAWG;AACH,wBAAgB,eAAe,CAC7B,MAAM,EAAE,YAAY,EACpB,QAAQ,GAAE,MAAsC,GAC/C,YAAY,CAmId"}
|
package/dist/search-answer.js
CHANGED
|
@@ -20,6 +20,7 @@ const ANSWER_RELATIONSHIPS = [
|
|
|
20
20
|
"specified_by",
|
|
21
21
|
"verified_by",
|
|
22
22
|
"validates",
|
|
23
|
+
"assumes",
|
|
23
24
|
"implements",
|
|
24
25
|
"constrains",
|
|
25
26
|
"requires_property",
|
|
@@ -643,6 +644,10 @@ export async function buildSearchAnswer(prolog, matches, options = {}) {
|
|
|
643
644
|
// A matched test may verify a scenario rather than a requirement; its
|
|
644
645
|
// targets are resolved to their governing requirements after the loop.
|
|
645
646
|
const testTargets = [];
|
|
647
|
+
// A matched fact that no requirement grounds may be the assumption of a
|
|
648
|
+
// requirement's scenario, such as its failure side; it is resolved through
|
|
649
|
+
// that scenario after the loop.
|
|
650
|
+
const assumedFacts = [];
|
|
646
651
|
for (const [index, match] of seeds.entries()) {
|
|
647
652
|
const id = text(match.entity.id);
|
|
648
653
|
const entity = graph.row(id) ?? match.entity;
|
|
@@ -674,6 +679,19 @@ export async function buildSearchAnswer(prolog, matches, options = {}) {
|
|
|
674
679
|
testTargets.push({ id, score: match.score, targets: owners });
|
|
675
680
|
continue;
|
|
676
681
|
}
|
|
682
|
+
if (type === "fact" && owners.length === 0) {
|
|
683
|
+
const scenarios = seedEdges
|
|
684
|
+
.filter((edge) => edge.rel === "assumes" && edge.to === id)
|
|
685
|
+
.map((edge) => edge.from);
|
|
686
|
+
if (scenarios.length > 0) {
|
|
687
|
+
assumedFacts.push({
|
|
688
|
+
id,
|
|
689
|
+
score: match.score,
|
|
690
|
+
scenarios: unique(scenarios),
|
|
691
|
+
});
|
|
692
|
+
continue;
|
|
693
|
+
}
|
|
694
|
+
}
|
|
677
695
|
if (owners.length === 0 && ["fact", "scenario", "symbol"].includes(type)) {
|
|
678
696
|
// A fact's claim and ask are filled in once its schema is known.
|
|
679
697
|
if (ungoverned.length < limits.ungoverned)
|
|
@@ -688,7 +706,10 @@ export async function buildSearchAnswer(prolog, matches, options = {}) {
|
|
|
688
706
|
const byScore = () => [...candidates.entries()]
|
|
689
707
|
.sort(([, left], [, right]) => right.score - left.score)
|
|
690
708
|
.map(([id]) => id);
|
|
691
|
-
const targetIds = unique(
|
|
709
|
+
const targetIds = unique([
|
|
710
|
+
...testTargets.flatMap((test) => test.targets),
|
|
711
|
+
...assumedFacts.flatMap((fact) => fact.scenarios),
|
|
712
|
+
]);
|
|
692
713
|
// Test targets and the candidates found so far share one round trip.
|
|
693
714
|
await graph.fetch({
|
|
694
715
|
edges: [...targetIds, ...byScore()],
|
|
@@ -720,6 +741,22 @@ export async function buildSearchAnswer(prolog, matches, options = {}) {
|
|
|
720
741
|
propose(owner, test.score * 0.85, `test ${test.id} via ${target}`);
|
|
721
742
|
}
|
|
722
743
|
}
|
|
744
|
+
for (const fact of assumedFacts) {
|
|
745
|
+
const owners = fact.scenarios.flatMap((scenario) => targetEdges
|
|
746
|
+
.filter((edge) => edge.rel === "specified_by" && edge.to === scenario)
|
|
747
|
+
.map((edge) => ({ owner: edge.from, scenario })));
|
|
748
|
+
if (owners.length === 0) {
|
|
749
|
+
const row = graph.row(fact.id);
|
|
750
|
+
const rank = seedIds.indexOf(fact.id) + 1;
|
|
751
|
+
if (row !== null && ungoverned.length < limits.ungoverned)
|
|
752
|
+
ungoverned.push({ ...brief(row), type: "fact", rank });
|
|
753
|
+
else if (row !== null)
|
|
754
|
+
truncated = true;
|
|
755
|
+
continue;
|
|
756
|
+
}
|
|
757
|
+
for (const { owner, scenario } of owners)
|
|
758
|
+
propose(owner, fact.score * 0.85, `fact ${fact.id} via ${scenario}`);
|
|
759
|
+
}
|
|
723
760
|
const supersededBy = new Map();
|
|
724
761
|
for (const edge of seedEdges)
|
|
725
762
|
if (edge.rel === "supersedes")
|
|
@@ -1035,8 +1072,9 @@ const REQUIREMENT_TRIM_ORDER = [
|
|
|
1035
1072
|
/**
|
|
1036
1073
|
* Hold the whole answer under `maxBytes`, marking it truncated when anything
|
|
1037
1074
|
* is cut. In order: long titles, excerpts and details are clipped; ADR
|
|
1038
|
-
* excerpts are dropped, last rationale entry first;
|
|
1039
|
-
*
|
|
1075
|
+
* excerpts are dropped, last rationale entry first; each governing
|
|
1076
|
+
* requirement keeps only its first scenario and test, last requirement first;
|
|
1077
|
+
* the least relevant governing requirements are dropped;
|
|
1040
1078
|
* list items are dropped (notes and side lists before the remaining
|
|
1041
1079
|
* requirement's own lists, its verdict witnesses last); then the remaining
|
|
1042
1080
|
* requirement's title and `via` are clipped. A verdict keeps its status when
|
|
@@ -1084,6 +1122,21 @@ export function fitSearchAnswer(answer, maxBytes = SEARCH_ANSWER_LIMITS.maxBytes
|
|
|
1084
1122
|
rationale[index] = withoutExcerpt(rationale[index]);
|
|
1085
1123
|
current = { ...current, rationale };
|
|
1086
1124
|
}
|
|
1125
|
+
// A requirement's second scenario or test matters less than another
|
|
1126
|
+
// governing requirement: keep one of each, last requirement first, before
|
|
1127
|
+
// dropping a requirement.
|
|
1128
|
+
for (let index = current.governing.length - 1; index >= 0 && over(); index -= 1) {
|
|
1129
|
+
const governing = [...current.governing];
|
|
1130
|
+
const req = governing[index];
|
|
1131
|
+
if (req.scenarios.length <= 1 && req.tests.length <= 1)
|
|
1132
|
+
continue;
|
|
1133
|
+
governing[index] = {
|
|
1134
|
+
...req,
|
|
1135
|
+
scenarios: req.scenarios.slice(0, 1),
|
|
1136
|
+
tests: req.tests.slice(0, 1),
|
|
1137
|
+
};
|
|
1138
|
+
current = { ...current, governing };
|
|
1139
|
+
}
|
|
1087
1140
|
while (over() && current.governing.length > 1)
|
|
1088
1141
|
current = { ...current, governing: current.governing.slice(0, -1) };
|
|
1089
1142
|
while (over()) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"impact-knowledge.d.ts","sourceRoot":"","sources":["../../src/traceability/impact-knowledge.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAElE,OAAO,EACL,KAAK,WAAW,EAIjB,MAAM,oBAAoB,CAAC;AAI5B,4EAA4E;AAE5E,MAAM,MAAM,SAAS,GAAG,QAAQ,CAAC;IAC/B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,WAAW,CAAC;IACzB,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"impact-knowledge.d.ts","sourceRoot":"","sources":["../../src/traceability/impact-knowledge.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAElE,OAAO,EACL,KAAK,WAAW,EAIjB,MAAM,oBAAoB,CAAC;AAI5B,4EAA4E;AAE5E,MAAM,MAAM,SAAS,GAAG,QAAQ,CAAC;IAC/B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,WAAW,CAAC;IACzB,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB,CAAC,CAAC;AAuFH,wBAAgB,UAAU,CACxB,QAAQ,EAAE,iBAAiB,EAC3B,IAAI,EAAE,MAAM,EACZ,SAAS,yDAAoE,GAC5E,GAAG,CAAC,MAAM,EAAE,SAAS,CAAC,CAyCxB;AAGD,wBAAgB,uBAAuB,CACrC,QAAQ,EAAE,iBAAiB,EAC3B,IAAI,EAAE,MAAM,GACX,WAAW,CAiBb;AAGD,wBAAgB,4BAA4B,CAC1C,IAAI,EAAE,WAAW,CAAC,MAAM,EAAE,SAAS,CAAC,GACnC,WAAW,CAoBb;AAGD,wBAAgB,gBAAgB,CAC9B,IAAI,EAAE,WAAW,CAAC,MAAM,EAAE,SAAS,CAAC,EACpC,cAAc,EAAE,SAAS,MAAM,EAAE,GAChC,MAAM,EAAE,CAsBV;AAeD,wBAAgB,2BAA2B,CACzC,QAAQ,EAAE,iBAAiB,EAC3B,IAAI,EAAE,MAAM,GACX,GAAG,CAAC,MAAM,EAAE,SAAS,CAAC,CAiBxB"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"temp-kb.d.ts","sourceRoot":"","sources":["../../src/traceability/temp-kb.ts"],"names":[],"mappings":"AAMA,wBAAgB,wBAAwB,CACtC,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,MAAM,GACZ,OAAO,CAET;AACD,OAAO,KAAK,EAGV,gBAAgB,EACjB,MAAM,2BAA2B,CAAC;AACnC,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAE7C,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAExD,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,aAAa,CAAC;CACvB;AAMD;;;GAGG;AACH,wBAAgB,gBAAgB,IAAI,IAAI,CASvC;AAQD;;;GAGG;AACH,wBAAgB,iBAAiB,CAE/B,OAAO,EAAE,CAAC,IAAI,EAAE;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,KAAK,CAAA;CAAE,KAAK,aAAa,GACpE,IAAI,CAEN;
|
|
1
|
+
{"version":3,"file":"temp-kb.d.ts","sourceRoot":"","sources":["../../src/traceability/temp-kb.ts"],"names":[],"mappings":"AAMA,wBAAgB,wBAAwB,CACtC,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,MAAM,GACZ,OAAO,CAET;AACD,OAAO,KAAK,EAGV,gBAAgB,EACjB,MAAM,2BAA2B,CAAC;AACnC,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAE7C,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAExD,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,aAAa,CAAC;CACvB;AAMD;;;GAGG;AACH,wBAAgB,gBAAgB,IAAI,IAAI,CASvC;AAQD;;;GAGG;AACH,wBAAgB,iBAAiB,CAE/B,OAAO,EAAE,CAAC,IAAI,EAAE;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,KAAK,CAAA;CAAE,KAAK,aAAa,GACpE,IAAI,CAEN;AAySD,iBAAe,cAAc,CAAC,GAAG,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CAgB/D;AAED,OAAO,EAAE,cAAc,EAAE,CAAC;AAe1B,wBAAsB,qBAAqB,CACzC,MAAM,EAAE,aAAa,EACrB,OAAO,EAAE,gBAAgB,EAAE,GAC1B,OAAO,CAAC,IAAI,CAAC,CA4Df;AAED,wBAAsB,YAAY,CAChC,UAAU,CAAC,EAAE,MAAM,GAClB,OAAO,CAAC,aAAa,CAAC,CA+CxB;AAGD,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,eAAe,EAAE,GAAG,MAAM,CAkBrE;AAED,wBAAsB,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CA2BlE"}
|
|
@@ -55,6 +55,10 @@ const FACT_STRING_FIELDS = new Set([
|
|
|
55
55
|
"canonical_key",
|
|
56
56
|
"claim_key",
|
|
57
57
|
"claim_text",
|
|
58
|
+
"dimension_waiver",
|
|
59
|
+
"dimension_waiver_approved_by",
|
|
60
|
+
"case_waiver",
|
|
61
|
+
"case_waiver_approved_by",
|
|
58
62
|
"predicate_name",
|
|
59
63
|
"predicate_namespace",
|
|
60
64
|
"rule_hash",
|
|
@@ -187,7 +191,13 @@ function buildEntityAssertionGoal(entity, sourceFile) {
|
|
|
187
191
|
if (entity.type === "req" && entity.semantic_inventory) {
|
|
188
192
|
props.push(`semantic_inventory=${toPrologString(JSON.stringify(entity.semantic_inventory))}`);
|
|
189
193
|
}
|
|
190
|
-
for (const field of [
|
|
194
|
+
for (const field of [
|
|
195
|
+
"approved_by",
|
|
196
|
+
"approval_ref",
|
|
197
|
+
"failure_side_waiver",
|
|
198
|
+
"failure_side_waiver_approved_by",
|
|
199
|
+
"rationale",
|
|
200
|
+
]) {
|
|
191
201
|
const value = entity.type === "req" ? entity[field] : undefined;
|
|
192
202
|
if (value !== undefined)
|
|
193
203
|
props.push(`${field}=${toPrologString(value)}`);
|
package/dist/types/entities.d.ts
CHANGED
|
@@ -37,6 +37,14 @@ export interface FactFields {
|
|
|
37
37
|
canonical_key?: string;
|
|
38
38
|
claim_key?: string;
|
|
39
39
|
claim_text?: string;
|
|
40
|
+
/** Why a quantifier word in claim_text ranges over nothing. */
|
|
41
|
+
dimension_waiver?: string;
|
|
42
|
+
/** The person who accepted the dimension waiver. */
|
|
43
|
+
dimension_waiver_approved_by?: string;
|
|
44
|
+
/** Why the fact's derived edge cases are covered some other way. */
|
|
45
|
+
case_waiver?: string;
|
|
46
|
+
/** The person who accepted the case waiver. */
|
|
47
|
+
case_waiver_approved_by?: string;
|
|
40
48
|
predicate_name?: string;
|
|
41
49
|
predicate_namespace?: string;
|
|
42
50
|
predicate_arity?: number;
|
|
@@ -66,6 +74,10 @@ export type Requirement = BaseEntity & {
|
|
|
66
74
|
approved_by?: string;
|
|
67
75
|
/** Optional reference to the approval decision record. */
|
|
68
76
|
approval_ref?: string;
|
|
77
|
+
/** Why the requirement has no failure side to test. */
|
|
78
|
+
failure_side_waiver?: string;
|
|
79
|
+
/** The person who accepted the failure-side waiver. */
|
|
80
|
+
failure_side_waiver_approved_by?: string;
|
|
69
81
|
/** Why the requirement exists; explanation, not checked meaning. */
|
|
70
82
|
rationale?: string;
|
|
71
83
|
/** How firmly it was decided; absent reads as `default` when an agent wrote it, else `firm`. */
|