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.
Files changed (91) hide show
  1. package/dist/cli-json-command.d.ts.map +1 -1
  2. package/dist/cli-json-command.js +4 -0
  3. package/dist/cli-register-reporting.d.ts.map +1 -1
  4. package/dist/cli-register-reporting.js +1 -0
  5. package/dist/cli.d.ts.map +1 -1
  6. package/dist/cli.js +3 -0
  7. package/dist/commands/coverage.d.ts +1 -0
  8. package/dist/commands/coverage.d.ts.map +1 -1
  9. package/dist/commands/coverage.js +40 -0
  10. package/dist/commands/doctor.d.ts +5 -0
  11. package/dist/commands/doctor.d.ts.map +1 -1
  12. package/dist/commands/doctor.js +14 -0
  13. package/dist/commands/migrate.d.ts.map +1 -1
  14. package/dist/commands/migrate.js +9 -3
  15. package/dist/commands/sync/persistence.d.ts.map +1 -1
  16. package/dist/commands/sync/persistence.js +6 -0
  17. package/dist/extractors/markdown.d.ts +6 -0
  18. package/dist/extractors/markdown.d.ts.map +1 -1
  19. package/dist/extractors/markdown.js +21 -0
  20. package/dist/operations/bootstrap/discovery-evidence.d.ts.map +1 -1
  21. package/dist/operations/bootstrap/discovery-evidence.js +44 -2
  22. package/dist/operations/bootstrap/discovery.d.ts.map +1 -1
  23. package/dist/operations/bootstrap/discovery.js +1 -0
  24. package/dist/operations/proof/explain.d.ts +63 -0
  25. package/dist/operations/proof/explain.d.ts.map +1 -1
  26. package/dist/operations/proof/explain.js +162 -0
  27. package/dist/operations/semantic-advisor/analyze-prose.d.ts +9 -1
  28. package/dist/operations/semantic-advisor/analyze-prose.d.ts.map +1 -1
  29. package/dist/operations/semantic-advisor/analyze-prose.js +21 -0
  30. package/dist/operations/semantic-advisor/case-preview.d.ts +24 -0
  31. package/dist/operations/semantic-advisor/case-preview.d.ts.map +1 -0
  32. package/dist/operations/semantic-advisor/case-preview.js +216 -0
  33. package/dist/operations/semantic-advisor/shared.d.ts.map +1 -1
  34. package/dist/operations/semantic-advisor/shared.js +3 -0
  35. package/dist/operations/semantic-advisor/types.d.ts +23 -0
  36. package/dist/operations/semantic-advisor/types.d.ts.map +1 -1
  37. package/dist/plugins/approved-source-analyzers.generated.d.ts +11 -8
  38. package/dist/plugins/approved-source-analyzers.generated.d.ts.map +1 -1
  39. package/dist/plugins/approved-source-analyzers.generated.js +11 -8
  40. package/dist/plugins/source-classification.d.ts +2 -2
  41. package/dist/plugins/source-classification.d.ts.map +1 -1
  42. package/dist/plugins/source-classification.js +25 -1
  43. package/dist/public/operations/catalog.d.ts +31 -1
  44. package/dist/public/operations/catalog.d.ts.map +1 -1
  45. package/dist/public/operations/repair-plan.d.ts +46 -0
  46. package/dist/public/operations/repair-plan.d.ts.map +1 -1
  47. package/dist/public/operations/repair-plan.js +110 -1
  48. package/dist/public/operations/schema6-check-actions.js +1 -1
  49. package/dist/public/operations/specs/check-rules.generated.d.ts +1 -1
  50. package/dist/public/operations/specs/check-rules.generated.d.ts.map +1 -1
  51. package/dist/public/operations/specs/check-rules.generated.js +2 -1
  52. package/dist/public/operations/specs/check.d.ts +1 -1
  53. package/dist/public/operations/specs/mutation-schemas.d.ts +30 -0
  54. package/dist/public/operations/specs/mutation-schemas.d.ts.map +1 -1
  55. package/dist/public/operations/specs/mutation-schemas.js +30 -0
  56. package/dist/public/operations/specs/upsert.d.ts +30 -0
  57. package/dist/public/operations/specs/upsert.d.ts.map +1 -1
  58. package/dist/public/schemas/entity.d.ts.map +1 -1
  59. package/dist/public/schemas/entity.js +59 -0
  60. package/dist/public/skills/kibi-commit-review/SKILL.md +6 -2
  61. package/dist/public/skills/kibi-decisions/SKILL.md +7 -2
  62. package/dist/public/skills/kibi-decisions/resources/signoff-views.md +3 -1
  63. package/dist/public/skills/kibi-usage/SKILL.md +9 -1
  64. package/dist/schemas/entity.schema.json +92 -0
  65. package/dist/search-answer.d.ts +3 -2
  66. package/dist/search-answer.d.ts.map +1 -1
  67. package/dist/search-answer.js +56 -3
  68. package/dist/traceability/impact-knowledge.d.ts.map +1 -1
  69. package/dist/traceability/impact-knowledge.js +2 -0
  70. package/dist/traceability/temp-kb.d.ts.map +1 -1
  71. package/dist/traceability/temp-kb.js +11 -1
  72. package/dist/types/entities.d.ts +12 -0
  73. package/dist/types/entities.d.ts.map +1 -1
  74. package/dist/usage-telemetry.d.ts +9 -0
  75. package/dist/usage-telemetry.d.ts.map +1 -1
  76. package/dist/usage-telemetry.js +50 -4
  77. package/dist/utils/rule-registry.generated.d.ts +5 -0
  78. package/dist/utils/rule-registry.generated.d.ts.map +1 -1
  79. package/dist/utils/rule-registry.generated.js +6 -0
  80. package/package.json +3 -3
  81. package/schema/entities.pl +12 -0
  82. package/src/public/operations/repair-plan.ts +152 -1
  83. package/src/public/operations/schema6-check-actions.ts +1 -1
  84. package/src/public/operations/specs/check-rules.generated.ts +2 -1
  85. package/src/public/operations/specs/mutation-schemas.ts +34 -0
  86. package/src/public/schemas/entity.ts +65 -0
  87. package/src/public/skills/kibi-commit-review/SKILL.md +6 -2
  88. package/src/public/skills/kibi-decisions/SKILL.md +7 -2
  89. package/src/public/skills/kibi-decisions/resources/signoff-views.md +3 -1
  90. package/src/public/skills/kibi-usage/SKILL.md +9 -1
  91. 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;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAmZ3B,CAAC;AAEX,eAAO,MAAM,oBAAoB;;;;;;;;;;;;;;;;;;;;;;CA8CvB,CAAC"}
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;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA0DuC,CAAC"}
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,CA6czC,CAAC;AAEF,eAAe,YAAY,CAAC"}
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.3.0
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.4.0
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`. Payload shapes,
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.36.0
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"
@@ -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; the least relevant
222
- * governing requirements are dropped;
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":"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"}
@@ -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(testTargets.flatMap((test) => test.targets));
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; the least relevant
1039
- * governing requirements are dropped;
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;AAqFH,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
+ {"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"}
@@ -39,6 +39,8 @@ function semanticEntityFingerprint(result) {
39
39
  "required_evidence",
40
40
  "approved_by",
41
41
  "approval_ref",
42
+ "failure_side_waiver",
43
+ "failure_side_waiver_approved_by",
42
44
  "exempts_claims",
43
45
  "proof_contract",
44
46
  "proof_bindings",
@@ -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;AA+RD,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"}
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 ["approved_by", "approval_ref", "rationale"]) {
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)}`);
@@ -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`. */