kibi-cli 2.30.0 → 2.31.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 (56) hide show
  1. package/dist/cli-operation-metadata.d.ts +1 -1
  2. package/dist/cli-operation-metadata.js +1 -1
  3. package/dist/cli-register-reporting.d.ts.map +1 -1
  4. package/dist/cli-register-reporting.js +23 -2
  5. package/dist/commands/check-certificates.d.ts +52 -0
  6. package/dist/commands/check-certificates.d.ts.map +1 -0
  7. package/dist/commands/check-certificates.js +163 -0
  8. package/dist/commands/discovery-table.d.ts.map +1 -1
  9. package/dist/commands/discovery-table.js +14 -2
  10. package/dist/commands/report.js +3 -3
  11. package/dist/commands/signoff.d.ts.map +1 -1
  12. package/dist/commands/signoff.js +3 -0
  13. package/dist/operations/planning/apply-plan.js +5 -5
  14. package/dist/operations/proof/baseline-diff.d.ts +1 -1
  15. package/dist/operations/proof/baseline-diff.js +1 -1
  16. package/dist/operations/proof/impact.d.ts +10 -4
  17. package/dist/operations/proof/impact.d.ts.map +1 -1
  18. package/dist/operations/proof/impact.js +27 -7
  19. package/dist/public/diagnostic-usage.js +2 -2
  20. package/dist/public/operations/catalog.d.ts +4 -4
  21. package/dist/public/operations/specs/check-rules.generated.d.ts +1 -1
  22. package/dist/public/operations/specs/check-rules.generated.d.ts.map +1 -1
  23. package/dist/public/operations/specs/check-rules.generated.js +3 -1
  24. package/dist/public/operations/specs/check.d.ts +1 -1
  25. package/dist/public/operations/specs/reporting.d.ts +4 -4
  26. package/dist/public/operations/specs/reporting.js +7 -7
  27. package/dist/public/skills/kibi-freshness/SKILL.md +2 -2
  28. package/dist/public/skills/kibi-usage/SKILL.md +2 -2
  29. package/dist/public/skills/kibi-usage/resources/proof.md +36 -4
  30. package/dist/public/skills/kibi-usage/resources/workflows.md +1 -1
  31. package/dist/report/html-report.css +11 -4
  32. package/dist/report/html-report.d.ts +2 -2
  33. package/dist/report/html-report.d.ts.map +1 -1
  34. package/dist/report/html-report.js +27 -21
  35. package/dist/report/report-view.d.ts +2 -2
  36. package/dist/report/report-view.js +2 -2
  37. package/dist/signoff/collect.d.ts.map +1 -1
  38. package/dist/signoff/collect.js +5 -1
  39. package/dist/signoff/html.js +3 -3
  40. package/dist/signoff/model.d.ts +7 -2
  41. package/dist/signoff/model.d.ts.map +1 -1
  42. package/dist/signoff/model.js +6 -2
  43. package/dist/traceability/staged-consistency.d.ts.map +1 -1
  44. package/dist/traceability/staged-consistency.js +3 -1
  45. package/dist/utils/rule-registry.generated.d.ts +10 -0
  46. package/dist/utils/rule-registry.generated.d.ts.map +1 -1
  47. package/dist/utils/rule-registry.generated.js +12 -0
  48. package/package.json +2 -2
  49. package/src/public/diagnostic-usage.ts +3 -3
  50. package/src/public/operations/specs/check-rules.generated.ts +3 -1
  51. package/src/public/operations/specs/reporting.ts +7 -7
  52. package/src/public/skills/kibi-freshness/SKILL.md +2 -2
  53. package/src/public/skills/kibi-usage/SKILL.md +2 -2
  54. package/src/public/skills/kibi-usage/resources/proof.md +36 -4
  55. package/src/public/skills/kibi-usage/resources/workflows.md +1 -1
  56. package/templates/github/kibi-badge.yml +1 -1
@@ -4,7 +4,8 @@ import { readSnapshotKnowledge } from "./snapshot-knowledge.js";
4
4
  import { cleanupTempKb, createTempKb, projectStagedEntities, } from "./temp-kb.js";
5
5
  /**
6
6
  * Canonical rules that decide whether the staged knowledge is consistent:
7
- * requirement contradictions, success scenarios a current requirement
7
+ * requirement contradictions (pairwise, and joint ones whose certificate the
8
+ * independent checker re-verifies), success scenarios a current requirement
8
9
  * forbids, and exceptions that name claims they cannot waive. They read only
9
10
  * authored knowledge, so the staged tree alone decides them.
10
11
  */
@@ -13,6 +14,7 @@ const STAGED_CONSISTENCY_RULES = [
13
14
  "domain-contradictions",
14
15
  "scenario-feasibility",
15
16
  "exception-claim-keys",
17
+ "kb-consistency",
16
18
  ];
17
19
  /**
18
20
  * True when the staged change set touches entity documents or relationship
@@ -269,5 +269,15 @@ export declare const GENERATED_RULES: readonly [{
269
269
  readonly description: "When a plugin activated for kibi.check-policy.v1 declares marker rules, every file implementing a requirement grounded in the rule's pattern predicate (with its declared sibling files) must contain each marker the KB declares for that pattern";
270
270
  readonly enforcementClass: "canonical";
271
271
  readonly category: "traceability";
272
+ }, {
273
+ readonly name: "kb-consistency";
274
+ readonly description: "The facts current requirements name must hold together, jointly and not only pairwise: every property context needs a value that satisfies all its facts, every atom and decision key one truth value, and stored rules a stratification. Each finding is a contradiction certificate (an irreducible core, two disagreeing facts or a negation cycle) re-verified by the independent checker, or a certificate that checker rejects";
275
+ readonly enforcementClass: "canonical";
276
+ readonly category: "integrity";
277
+ }, {
278
+ readonly name: "kb-consistency-unresolved";
279
+ readonly description: "Advisory: a property context, atom or decision key whose facts the consistency checker cannot compare (mixed value types or units, an unsupported operator or polarity, or a contradiction whose validity windows never overlap); it never counts as consistent";
280
+ readonly enforcementClass: "advisory";
281
+ readonly category: "integrity";
272
282
  }];
273
283
  //# sourceMappingURL=rule-registry.generated.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"rule-registry.generated.d.ts","sourceRoot":"","sources":["../../src/utils/rule-registry.generated.ts"],"names":[],"mappings":"AAUA,eAAO,MAAM,eAAe;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAuXlB,CAAC"}
1
+ {"version":3,"file":"rule-registry.generated.d.ts","sourceRoot":"","sources":["../../src/utils/rule-registry.generated.ts"],"names":[],"mappings":"AAUA,eAAO,MAAM,eAAe;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAqYlB,CAAC"}
@@ -332,4 +332,16 @@ export const GENERATED_RULES = [
332
332
  enforcementClass: "canonical",
333
333
  category: "traceability",
334
334
  },
335
+ {
336
+ name: "kb-consistency",
337
+ description: "The facts current requirements name must hold together, jointly and not only pairwise: every property context needs a value that satisfies all its facts, every atom and decision key one truth value, and stored rules a stratification. Each finding is a contradiction certificate (an irreducible core, two disagreeing facts or a negation cycle) re-verified by the independent checker, or a certificate that checker rejects",
338
+ enforcementClass: "canonical",
339
+ category: "integrity",
340
+ },
341
+ {
342
+ name: "kb-consistency-unresolved",
343
+ description: "Advisory: a property context, atom or decision key whose facts the consistency checker cannot compare (mixed value types or units, an unsupported operator or polarity, or a contradiction whose validity windows never overlap); it never counts as consistent",
344
+ enforcementClass: "advisory",
345
+ category: "integrity",
346
+ },
335
347
  ];
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "kibi-cli",
3
- "version": "2.30.0",
3
+ "version": "2.31.0",
4
4
  "type": "module",
5
5
  "description": "Kibi CLI for knowledge base management",
6
6
  "engines": {
@@ -235,7 +235,7 @@
235
235
  "fast-glob": "^3.2.12",
236
236
  "gray-matter": "^4.0.3",
237
237
  "js-yaml": "^4.1.0",
238
- "kibi-core": "^0.22.5",
238
+ "kibi-core": "^0.23.0",
239
239
  "kibi-plugin-builtin": "^0.5.3",
240
240
  "kibi-plugin-sdk": "^0.5.0",
241
241
  "kibi-swipl": "^1.0.1",
@@ -147,7 +147,7 @@ function appendCoverageFields(
147
147
  const scope = isRecord(repairPlan?.scope) ? repairPlan.scope : undefined;
148
148
  fields.coverage_by = typeof args.by === "string" ? args.by : "req";
149
149
  fields.coverage_requirement_count = Number(summary.total ?? rows.length);
150
- fields.coverage_proven_count = Number(summary.proofProven ?? 0);
150
+ fields.coverage_tested_count = Number(summary.proofTested ?? 0);
151
151
  fields.coverage_proof_missing_count = Number(summary.proofMissing ?? 0);
152
152
  fields.coverage_proof_gap_count = gapCodes.length;
153
153
  fields.coverage_gap_codes = [...new Set(gapCodes)].sort();
@@ -223,8 +223,8 @@ export function deriveDiagnosticUsageFields(
223
223
  if (tool === "kb_coverage" && structured) {
224
224
  appendCoverageFields(fields, args, structured);
225
225
  fields.result_summary = `${String(
226
- fields.coverage_proven_count,
227
- )} proven; ${String(fields.coverage_proof_gap_count)} proof gaps`;
226
+ fields.coverage_tested_count,
227
+ )} tested; ${String(fields.coverage_proof_gap_count)} proof gaps`;
228
228
  }
229
229
  if (tool === "kb_semantic_advisor" && structured) {
230
230
  appendSemanticFields(fields, structured.receipt);
@@ -63,9 +63,11 @@ export const SELECTABLE_RULE_NAMES: readonly string[] = [
63
63
  "supersedes-reason-acknowledged",
64
64
  "policy-ownership",
65
65
  "policy-markers",
66
+ "kb-consistency",
67
+ "kb-consistency-unresolved",
66
68
  ];
67
69
 
68
70
  // implements REQ-006
69
71
  /** Comma-separated "Allowed:" fragment for the kb_check rules description. */
70
72
  export const SELECTABLE_RULES_ALLOWED =
71
- "must-priority-coverage, symbol-coverage, symbol-traceability, symbol-granularity, no-dangling-refs, source-relationship-parity, branch-store-not-compiled, source-path-dangling, no-cycles, required-fields, deprecated-adr-no-successor, superseded-requirement-open, scenario-feasibility, scenario-feasibility-unknown, exception-claim-keys, numeric-string-value, rule-key-arguments-missing, domain-contradictions, logic-coverage, rule-safety, rule-verifiability, query-plan-safety, req-status-vocabulary, strict-fact-shape, strict-req-fact-pairing, predicate-verifiability, strict-readiness, semantic-completeness, related-requirement-unmodeled, proof-contract-symbols, entity-id-style, domain-redundancy, domain-implication, subject-key-identity, subject-key-shape, ontology-quality, exception-unapproved, exception-approval-self-attested, agent-requirement-unapproved, requirement-rationale-missing, symbol-owner-superseded, adr-unlinked, adr-proposed, predicate-schema-conformance, entity-context-missing, entity-context-acknowledged, decision-firm-unreferenced, decision-firm-superseded, decision-firm-edited, supersedes-reason-missing, supersedes-reason-acknowledged, policy-ownership, policy-markers";
73
+ "must-priority-coverage, symbol-coverage, symbol-traceability, symbol-granularity, no-dangling-refs, source-relationship-parity, branch-store-not-compiled, source-path-dangling, no-cycles, required-fields, deprecated-adr-no-successor, superseded-requirement-open, scenario-feasibility, scenario-feasibility-unknown, exception-claim-keys, numeric-string-value, rule-key-arguments-missing, domain-contradictions, logic-coverage, rule-safety, rule-verifiability, query-plan-safety, req-status-vocabulary, strict-fact-shape, strict-req-fact-pairing, predicate-verifiability, strict-readiness, semantic-completeness, related-requirement-unmodeled, proof-contract-symbols, entity-id-style, domain-redundancy, domain-implication, subject-key-identity, subject-key-shape, ontology-quality, exception-unapproved, exception-approval-self-attested, agent-requirement-unapproved, requirement-rationale-missing, symbol-owner-superseded, adr-unlinked, adr-proposed, predicate-schema-conformance, entity-context-missing, entity-context-acknowledged, decision-firm-unreferenced, decision-firm-superseded, decision-firm-edited, supersedes-reason-missing, supersedes-reason-acknowledged, policy-ownership, policy-markers, kb-consistency, kb-consistency-unresolved";
@@ -118,7 +118,7 @@ function validateEntityType(type?: string): void {
118
118
  }
119
119
 
120
120
  const COVERAGE_PROOF_STATUSES: ReadonlySet<string> = new Set([
121
- "proven",
121
+ "tested",
122
122
  "missing",
123
123
  "unresolved",
124
124
  "not_applicable",
@@ -227,7 +227,7 @@ export const findGapsSpec = {
227
227
  * + bound-symbol code scope) and hand the Prolog coverage stage a
228
228
  * TestId -> BindingHash dict. This is the default binding mode since slice 3;
229
229
  * KIBI_PROOF_BINDING_MODE=strict-snapshot opts out (receipts then match only
230
- * against the whole-workspace snapshot they were proven on).
230
+ * against the whole-workspace snapshot they were produced on).
231
231
  */
232
232
  // implements REQ-kibi-verification-evidence-contract
233
233
  export function currentProofBindingMode(): "per_contract" | "strict_snapshot" {
@@ -431,13 +431,13 @@ export async function executeCoverage(
431
431
  },
432
432
  };
433
433
  const fullyCovered = Number(enrichedPayload.summary?.fullyCovered ?? 0);
434
- const proofProven = Number(enrichedPayload.summary?.proofProven ?? 0);
434
+ const proofTested = Number(enrichedPayload.summary?.proofTested ?? 0);
435
435
  const total = Number(enrichedPayload.summary?.total ?? 0);
436
436
  return {
437
437
  content: [
438
438
  {
439
439
  type: "text",
440
- text: `Coverage summary: ${fullyCovered} structurally covered and ${proofProven} proven out of ${total}.`,
440
+ text: `Coverage summary: ${fullyCovered} structurally covered and ${proofTested} tested end to end out of ${total}.`,
441
441
  },
442
442
  ],
443
443
  structuredContent: enrichedPayload,
@@ -452,7 +452,7 @@ export const coverageSpec = {
452
452
  name: "kb_coverage",
453
453
  cliName: "coverage",
454
454
  description:
455
- "Generate curated structural coverage and conservative end-to-end requirement proof reports for requirements, symbols, or grouped types. Use it to ask which requirements are proven and what blocks the rest; use kb_find_gaps for a plain list of missing links and kb_check for rule violations. Reports include the compatible repair plan plus typed kibi.migration-plan.v2 actions; semantic and E2E actions remain review/execution work. Paginated plans identify incomplete scope and no mutation occurs.",
455
+ "Generate curated structural coverage and conservative end-to-end requirement proof reports for requirements, symbols, or grouped types. Use it to ask which requirements are tested end to end, how strong each requirement's evidence is (evidenceLevel: proved, tested, asserted or unverified), and what blocks the rest; use kb_find_gaps for a plain list of missing links and kb_check for rule violations. Reports include the compatible repair plan plus typed kibi.migration-plan.v2 actions; semantic and E2E actions remain review/execution work. Paginated plans identify incomplete scope and no mutation occurs.",
456
456
  businessInputSchema: {
457
457
  type: "object",
458
458
  properties: {
@@ -473,13 +473,13 @@ export const coverageSpec = {
473
473
  type: "boolean",
474
474
  default: false,
475
475
  description:
476
- "Also return rows that are already proven or not applicable. By default only rows that still need repair are returned.",
476
+ "Also return rows that are already tested or not applicable. By default only rows that still need repair are returned.",
477
477
  },
478
478
  statuses: {
479
479
  type: "array",
480
480
  items: {
481
481
  type: "string",
482
- enum: ["proven", "missing", "unresolved", "not_applicable"],
482
+ enum: ["tested", "missing", "unresolved", "not_applicable"],
483
483
  },
484
484
  description:
485
485
  "Requirement proof-status filter (req mode): include only rows whose proofStatus is listed. Selecting statuses implies include-passing; not_applicable rows carry their typed applicability reason in proofStages.applicability.reason. The summary always reflects the whole KB.",
@@ -2,7 +2,7 @@
2
2
  id: kibi-freshness
3
3
  name: kibi-freshness
4
4
  description: Check exact Git attachment, branch migration/quarantine, compiled-store freshness, source linkage, and repair state before decisions or writes.
5
- version: 2.0.0
5
+ version: 2.1.0
6
6
  kibiCompatibility: ">=1.0.0"
7
7
  tags:
8
8
  - kibi
@@ -53,7 +53,7 @@ echo '{}' | npx --no-install kibi status --input -
53
53
  `committed_with_repairs`, follow required typed `nextActions`; never retry the
54
54
  original operation.
55
55
 
56
- For every freshness, branch, or completion question, call `kb_status` first, then `kb_query` the entities and source files that status names, then `kb_check` as the last Kibi call before answering. Never skip the query step, even when status alone seems to answer the question. If another query or write follows a check, run `kb_check` again before answering. When asked whether requirements are consistent or proven, run `kb_query`, then `kb_check` with the domain-contradictions rule, then `kb_coverage`, and read whether the analysis was complete. Report any unmodeled or unknown clause as incomplete analysis, not as consistent. Only when every clause is fully modeled and compatible, state plainly that no conflict was found. For authorized knowledge changes, keep the exact supplied target and intended relationship edges, and discover and query those targets first. Validate the payload with `kb_upsert` and `dryRun: true`, then perform the authorized `kb_upsert` with that same payload and read the result back exactly before the final checks. A passing dry run is validation, not completion. Distinct authorized payloads may need several sequential writes, each validated and read back, but never retry a mutation that already committed. If a mutation returns `committed_with_repairs`, follow its typed `nextActions` instead of repeating the original operation.
56
+ For every freshness, branch, or completion question, call `kb_status` first, then `kb_query` the entities and source files that status names, then `kb_check` as the last Kibi call before answering. Never skip the query step, even when status alone seems to answer the question. If another query or write follows a check, run `kb_check` again before answering. When asked whether requirements are consistent or proven, run `kb_query`, then `kb_check` with the rules `domain-contradictions`, `kb-consistency` and `kb-consistency-unresolved`, then `kb_coverage`, and read whether the analysis was complete. `domain-contradictions` compares facts two at a time; `kb-consistency` checks every fact of a property together, so a clean pairwise result is not proof. Report a `kb-consistency` violation as a conflict, name every requirement it lists, and give superseding or changing one of them as the next step; never edit or delete facts to make the check pass. Report a context `kb-consistency-unresolved` names as unresolved, never as consistent, with the step that would make it comparable. Report any unmodeled or unknown clause as incomplete analysis, not as consistent. Only when every clause is fully modeled and compatible, state plainly that no conflict was found. For authorized knowledge changes, keep the exact supplied target and intended relationship edges, and discover and query those targets first. Validate the payload with `kb_upsert` and `dryRun: true`, then perform the authorized `kb_upsert` with that same payload and read the result back exactly before the final checks. A passing dry run is validation, not completion. Distinct authorized payloads may need several sequential writes, each validated and read back, but never retry a mutation that already committed. If a mutation returns `committed_with_repairs`, follow its typed `nextActions` instead of repeating the original operation.
57
57
 
58
58
  ## Guidance
59
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.22.0
5
+ version: 2.24.0
6
6
  kibiCompatibility: ">=1.0.0"
7
7
  tags:
8
8
  - kibi
@@ -168,7 +168,7 @@ End every task with these five independent fields:
168
168
  taskOutcome: complete | interim | blocked
169
169
  kbState: clean_fresh | stale | dirty | legacy_compat | not_evaluated
170
170
  verificationState: fresh | dirty | unavailable | not_evaluated
171
- proofState: proven | mixed | unresolved | not_evaluated
171
+ proofState: tested | mixed | unresolved | not_evaluated
172
172
  limitationDisposition: none | accepted | unaccepted | not_applicable
173
173
  ```
174
174
 
@@ -1,6 +1,6 @@
1
1
  # Proof and Verification Workflow
2
2
 
3
- Use this resource when a requirement must be proven before handoff, when
3
+ Use this resource when a requirement must be tested end to end before handoff, when
4
4
  wiring a proof-bearing test, or when `kb_ingest_proof` or `kibi prove`
5
5
  rejected evidence.
6
6
 
@@ -97,9 +97,9 @@ Cosmetic edits (descriptions, labels) never stale proof. Execution-relevant
97
97
  edits (command, artifact, targets, options, bindings, contract) change the
98
98
  effective fingerprint and do.
99
99
 
100
- ## What counts toward proofProven
100
+ ## What counts toward proofTested
101
101
 
102
- A requirement is proven only by its scenarios' tests, and a scenario test
102
+ A requirement reaches `proofStatus: tested` only through its scenarios' tests, and a scenario test
103
103
  counts only when it is an **end-to-end** test with a valid, fresh, passing
104
104
  receipt for the current snapshot.
105
105
 
@@ -109,7 +109,7 @@ receipt for the current snapshot.
109
109
  `source` path contains `e2e`) counts as end-to-end; anything else is
110
110
  `unknown` scope.
111
111
  - A `unit` or `integration` receipt is still recorded on the test entity, but
112
- it does not move `proofProven` for a behavioural requirement: the
112
+ it does not move `proofTested` for a behavioural requirement: the
113
113
  requirement keeps the `missing_passing_e2e` gap in `proofGaps`. The one
114
114
  exception is a scenario whose specifying requirements are all grounded only
115
115
  in component-scope UI predicates (`ui_pattern`, `same_pattern`,
@@ -120,6 +120,38 @@ receipt for the current snapshot.
120
120
  receipt does not change it, and a `passing` status without a fresh receipt
121
121
  proves nothing.
122
122
 
123
+ ## Evidence levels
124
+
125
+ Every requirement row also carries `evidenceLevel`, the strength of what backs
126
+ it, and `evidence`, the entries that earned it (each with `kind`, `scope` and
127
+ `level`):
128
+
129
+ - `proved`: a re-checkable certificate covers every case. No proof kind issues
130
+ certificates yet, so nothing reaches it today.
131
+ - `tested`: `proofStatus` is `tested`; fresh E2E receipts cover every linked
132
+ scenario.
133
+ - `asserted`: a person stands behind the statement (approved, or firm by
134
+ `firmness` or a non-agent origin) but nothing current checks it.
135
+ - `unverified`: an agent wrote it, no person approved it, nothing checks it.
136
+
137
+ Report the level as it is. Never call an `asserted` or `unverified`
138
+ requirement proven or tested, and never call `tested` proved. Firmness is a
139
+ separate axis: it says how sure the person is, not how strong the evidence is.
140
+
141
+ ## Knowledge-base certificates
142
+
143
+ `kb_check` (`kibi check`) proves facts about the KB itself in its
144
+ `kb-consistency` rule and re-checks each answer with an independent checker:
145
+ property facts are consistent (a model per subject, property and scope, or an
146
+ irreducible contradiction core), predicate facts and allow/deny decisions are
147
+ consistent, and stored rules are stratified. It catches facts that contradict
148
+ only together, which the pairwise `domain-contradictions` rule misses. A
149
+ `kb-consistency` violation names the core facts and the requirements behind
150
+ them: supersede or change one of those requirements; never edit the facts so
151
+ the check passes. Quote a `kb-consistency-unresolved` diagnostic as
152
+ unresolved, never as consistent. Opposing rule pairs and scenario
153
+ feasibility are not certified yet; their own rules still decide them.
154
+
123
155
  ## Attempt semantics (factual, never optimistic)
124
156
 
125
157
  - `attempts: {status: "complete", entries: [...]}` — known history; the
@@ -9,7 +9,7 @@ success flag):
9
9
  taskOutcome: complete | interim | blocked
10
10
  kbState: clean_fresh | stale | dirty | legacy_compat | not_evaluated
11
11
  verificationState: fresh | dirty | unavailable | not_evaluated
12
- proofState: proven | mixed | unresolved | not_evaluated
12
+ proofState: tested | mixed | unresolved | not_evaluated
13
13
  limitationDisposition: none | accepted | unaccepted | not_applicable
14
14
  ```
15
15
 
@@ -5,7 +5,7 @@
5
5
  # explicitly do not want to publish the HTML report.
6
6
  # Manual step: Settings → Pages → Source → GitHub Actions
7
7
  #
8
- # Pull requests still generate the report (same snapshot and % proven)
8
+ # Pull requests still generate the report (same snapshot and % tested)
9
9
  # and upload it as a workflow artifact. Only the repository default
10
10
  # branch (and manual workflow_dispatch) may deploy the canonical badge
11
11
  # to GitHub Pages. Use the unprivileged pull_request event so untrusted