kibi-cli 2.1.0 → 2.2.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-protocol.d.ts.map +1 -1
- package/dist/cli-protocol.js +3 -2
- package/dist/commands/aggregated-checks.d.ts +7 -0
- package/dist/commands/aggregated-checks.d.ts.map +1 -1
- package/dist/commands/aggregated-checks.js +25 -1
- package/dist/commands/check.d.ts.map +1 -1
- package/dist/commands/check.js +21 -13
- package/dist/commands/doctor.d.ts.map +1 -1
- package/dist/commands/doctor.js +105 -24
- package/dist/commands/github-init.d.ts +1 -1
- package/dist/commands/github-init.d.ts.map +1 -1
- package/dist/commands/github-init.js +1 -1
- package/dist/commands/init-helpers.d.ts +17 -2
- package/dist/commands/init-helpers.d.ts.map +1 -1
- package/dist/commands/init-helpers.js +123 -23
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +110 -15
- package/dist/commands/prove.d.ts.map +1 -1
- package/dist/commands/prove.js +10 -18
- package/dist/commands/sync/cache.d.ts +20 -1
- package/dist/commands/sync/cache.d.ts.map +1 -1
- package/dist/commands/sync/cache.js +51 -2
- package/dist/commands/sync/discovery.d.ts.map +1 -1
- package/dist/commands/sync/discovery.js +1 -1
- package/dist/commands/sync/persistence.d.ts.map +1 -1
- package/dist/commands/sync/persistence.js +8 -0
- package/dist/commands/sync.d.ts.map +1 -1
- package/dist/commands/sync.js +11 -3
- package/dist/engine.d.ts +26 -0
- package/dist/engine.d.ts.map +1 -1
- package/dist/engine.js +126 -29
- package/dist/extractors/manifest.d.ts.map +1 -1
- package/dist/extractors/manifest.js +66 -28
- package/dist/extractors/markdown.d.ts +2 -0
- package/dist/extractors/markdown.d.ts.map +1 -1
- package/dist/extractors/markdown.js +14 -3
- package/dist/extractors/relationships.d.ts.map +1 -1
- package/dist/extractors/relationships.js +1 -0
- package/dist/intent-search.d.ts.map +1 -1
- package/dist/intent-search.js +68 -29
- package/dist/operations/bootstrap/generate.d.ts.map +1 -1
- package/dist/operations/bootstrap/generate.js +4 -3
- package/dist/operations/modeling/model-requirement.d.ts +1 -1
- package/dist/operations/modeling/model-requirement.d.ts.map +1 -1
- package/dist/operations/modeling/model-requirement.js +176 -10
- package/dist/operations/modeling/predicate-applyplan.d.ts.map +1 -1
- package/dist/operations/modeling/predicate-applyplan.js +14 -2
- package/dist/operations/modeling/predicate-loader.d.ts.map +1 -1
- package/dist/operations/modeling/predicate-loader.js +24 -0
- package/dist/operations/modeling/predicate-types.d.ts +4 -0
- package/dist/operations/modeling/predicate-types.d.ts.map +1 -1
- package/dist/operations/modeling/predicate-vocabulary.d.ts +54 -0
- package/dist/operations/modeling/predicate-vocabulary.d.ts.map +1 -0
- package/dist/operations/modeling/predicate-vocabulary.js +169 -0
- package/dist/operations/modeling/requirement-types.d.ts +5 -0
- package/dist/operations/modeling/requirement-types.d.ts.map +1 -1
- package/dist/operations/modeling/vocabulary-alignment.d.ts +60 -0
- package/dist/operations/modeling/vocabulary-alignment.d.ts.map +1 -0
- package/dist/operations/modeling/vocabulary-alignment.js +178 -0
- package/dist/operations/mutation/contradictions.d.ts +3 -0
- package/dist/operations/mutation/contradictions.d.ts.map +1 -1
- package/dist/operations/mutation/contradictions.js +29 -0
- package/dist/operations/mutation/delete.d.ts.map +1 -1
- package/dist/operations/mutation/delete.js +33 -1
- package/dist/operations/mutation/predicate-vocabulary-guard.d.ts +8 -0
- package/dist/operations/mutation/predicate-vocabulary-guard.d.ts.map +1 -0
- package/dist/operations/mutation/predicate-vocabulary-guard.js +64 -0
- package/dist/operations/mutation/relationships.d.ts +1 -1
- package/dist/operations/mutation/relationships.d.ts.map +1 -1
- package/dist/operations/mutation/relationships.js +1 -0
- package/dist/operations/mutation/saga.d.ts +5 -0
- package/dist/operations/mutation/saga.d.ts.map +1 -1
- package/dist/operations/mutation/saga.js +10 -0
- package/dist/operations/mutation/serialization.d.ts.map +1 -1
- package/dist/operations/mutation/serialization.js +2 -0
- package/dist/operations/mutation/source-authoring.d.ts +6 -0
- package/dist/operations/mutation/source-authoring.d.ts.map +1 -1
- package/dist/operations/mutation/source-authoring.js +65 -26
- package/dist/operations/mutation/strict-fact.d.ts.map +1 -1
- package/dist/operations/mutation/strict-fact.js +5 -0
- package/dist/operations/mutation/types.d.ts +17 -0
- package/dist/operations/mutation/types.d.ts.map +1 -1
- package/dist/operations/mutation/upsert.d.ts +6 -0
- package/dist/operations/mutation/upsert.d.ts.map +1 -1
- package/dist/operations/mutation/upsert.js +72 -4
- package/dist/operations/mutation/validate-upsert.d.ts.map +1 -1
- package/dist/operations/mutation/validate-upsert.js +24 -1
- package/dist/operations/mutation/validation.d.ts.map +1 -1
- package/dist/operations/mutation/validation.js +16 -3
- package/dist/operations/planning/apply-plan.d.ts.map +1 -1
- package/dist/operations/planning/apply-plan.js +61 -17
- package/dist/operations/planning/compile-intent.d.ts.map +1 -1
- package/dist/operations/planning/compile-intent.js +3 -1
- package/dist/operations/proof/code-scope.d.ts +17 -0
- package/dist/operations/proof/code-scope.d.ts.map +1 -0
- package/dist/operations/proof/code-scope.js +60 -0
- package/dist/operations/proof/ingest-proof.d.ts +4 -2
- package/dist/operations/proof/ingest-proof.d.ts.map +1 -1
- package/dist/operations/proof/ingest-proof.js +207 -74
- package/dist/operations/proof/migrate-legacy-receipts.d.ts.map +1 -1
- package/dist/operations/proof/migrate-legacy-receipts.js +7 -5
- package/dist/operations/proof/prune-receipts.d.ts.map +1 -1
- package/dist/operations/proof/prune-receipts.js +7 -5
- package/dist/plugins/compose-semantic-classifier.d.ts +6 -1
- package/dist/plugins/compose-semantic-classifier.d.ts.map +1 -1
- package/dist/plugins/compose-semantic-classifier.js +8 -3
- package/dist/plugins/compose-vocabulary-alignment.d.ts +23 -0
- package/dist/plugins/compose-vocabulary-alignment.d.ts.map +1 -0
- package/dist/plugins/compose-vocabulary-alignment.js +141 -0
- package/dist/plugins/external-allowlist.d.ts +7 -0
- package/dist/plugins/external-allowlist.d.ts.map +1 -1
- package/dist/plugins/external-allowlist.js +13 -0
- package/dist/plugins/index.d.ts +2 -0
- package/dist/plugins/index.d.ts.map +1 -1
- package/dist/plugins/index.js +4 -0
- package/dist/plugins/registry.d.ts +2 -1
- package/dist/plugins/registry.d.ts.map +1 -1
- package/dist/plugins/registry.js +22 -1
- package/dist/prolog/codec.d.ts.map +1 -1
- package/dist/prolog/codec.js +2 -0
- package/dist/prolog.d.ts +36 -0
- package/dist/prolog.d.ts.map +1 -1
- package/dist/prolog.js +78 -9
- package/dist/public/diagnostic-usage.d.ts.map +1 -1
- package/dist/public/diagnostic-usage.js +7 -25
- package/dist/public/impact/full-kb-quality.d.ts.map +1 -1
- package/dist/public/impact/full-kb-quality.js +4 -12
- package/dist/public/operations/catalog.d.ts +36 -7
- package/dist/public/operations/catalog.d.ts.map +1 -1
- package/dist/public/operations/check-executor.d.ts.map +1 -1
- package/dist/public/operations/check-executor.js +10 -2
- package/dist/public/operations/check-helpers.d.ts +6 -0
- package/dist/public/operations/check-helpers.d.ts.map +1 -1
- package/dist/public/operations/check-helpers.js +21 -1
- package/dist/public/operations/contracts.d.ts.map +1 -1
- package/dist/public/operations/contracts.js +16 -0
- package/dist/public/operations/discovery-entities.d.ts +42 -2
- package/dist/public/operations/discovery-entities.d.ts.map +1 -1
- package/dist/public/operations/discovery-entities.js +195 -22
- package/dist/public/operations/discovery-executors.d.ts +1 -0
- package/dist/public/operations/discovery-executors.d.ts.map +1 -1
- package/dist/public/operations/discovery-executors.js +75 -46
- package/dist/public/operations/migration-plan.d.ts +2 -0
- package/dist/public/operations/migration-plan.d.ts.map +1 -1
- package/dist/public/operations/migration-plan.js +50 -0
- package/dist/public/operations/predicate-schema-conformance.d.ts +41 -0
- package/dist/public/operations/predicate-schema-conformance.d.ts.map +1 -0
- package/dist/public/operations/predicate-schema-conformance.js +242 -0
- package/dist/public/operations/prolog-json.d.ts.map +1 -1
- package/dist/public/operations/prolog-json.js +9 -3
- package/dist/public/operations/result-envelope.d.ts +34 -1
- package/dist/public/operations/result-envelope.d.ts.map +1 -1
- package/dist/public/operations/result-envelope.js +78 -2
- package/dist/public/operations/runtime-types.d.ts +1 -1
- package/dist/public/operations/runtime-types.d.ts.map +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 +8 -1
- package/dist/public/operations/specs/check.d.ts +1 -1
- package/dist/public/operations/specs/discovery.d.ts +7 -1
- package/dist/public/operations/specs/discovery.d.ts.map +1 -1
- package/dist/public/operations/specs/discovery.js +7 -1
- package/dist/public/operations/specs/mutation-schemas.d.ts +27 -4
- package/dist/public/operations/specs/mutation-schemas.d.ts.map +1 -1
- package/dist/public/operations/specs/mutation-schemas.js +21 -3
- package/dist/public/operations/specs/reporting.d.ts +8 -0
- package/dist/public/operations/specs/reporting.d.ts.map +1 -1
- package/dist/public/operations/specs/reporting.js +46 -15
- package/dist/public/operations/specs/upsert.d.ts +28 -5
- package/dist/public/operations/specs/upsert.d.ts.map +1 -1
- package/dist/public/operations/specs/upsert.js +1 -1
- package/dist/public/operations/symbol-repair-plan.d.ts.map +1 -1
- package/dist/public/operations/symbol-repair-plan.js +8 -3
- package/dist/public/schemas/entity.d.ts.map +1 -1
- package/dist/public/schemas/entity.js +22 -0
- package/dist/public/schemas/relationship.d.ts.map +1 -1
- package/dist/public/schemas/relationship.js +1 -0
- package/dist/public/skills/kibi-usage/SKILL.md +7 -3
- package/dist/public/skills/kibi-usage/resources/fact-lanes.md +4 -0
- package/dist/public/skills/kibi-usage/resources/relationship-directions.md +35 -17
- package/dist/public/skills/kibi-usage/resources/source-authoring.md +36 -0
- package/dist/public/skills/kibi-usage/resources/workflows.md +52 -1
- package/dist/public/telemetry-acceptance.d.ts.map +1 -1
- package/dist/public/telemetry-acceptance.js +21 -5
- package/dist/relationships/shards.d.ts +6 -0
- package/dist/relationships/shards.d.ts.map +1 -1
- package/dist/relationships/shards.js +26 -19
- package/dist/schemas/entity.schema.json +32 -0
- package/dist/traceability/staged-diagnostics.d.ts +1 -1
- package/dist/traceability/staged-diagnostics.d.ts.map +1 -1
- package/dist/traceability/staged-entity-id-style.d.ts +12 -0
- package/dist/traceability/staged-entity-id-style.d.ts.map +1 -0
- package/dist/traceability/staged-entity-id-style.js +68 -0
- package/dist/traceability/temp-kb.d.ts.map +1 -1
- package/dist/traceability/temp-kb.js +8 -0
- package/dist/traceability/validate.js +1 -1
- package/dist/types/entities.d.ts +2 -0
- package/dist/types/entities.d.ts.map +1 -1
- package/dist/types/relationships.d.ts +1 -1
- package/dist/types/relationships.d.ts.map +1 -1
- package/dist/utils/entity-id-style.d.ts +27 -0
- package/dist/utils/entity-id-style.d.ts.map +1 -0
- package/dist/utils/entity-id-style.js +81 -0
- package/dist/utils/git-repository-context.d.ts +50 -0
- package/dist/utils/git-repository-context.d.ts.map +1 -0
- package/dist/utils/git-repository-context.js +259 -0
- package/dist/utils/rule-registry.d.ts +5 -0
- package/dist/utils/rule-registry.d.ts.map +1 -1
- package/dist/utils/rule-registry.generated.d.ts +37 -0
- package/dist/utils/rule-registry.generated.d.ts.map +1 -1
- package/dist/utils/rule-registry.generated.js +44 -0
- package/dist/utils/strict-modeling.d.ts +7 -0
- package/dist/utils/strict-modeling.d.ts.map +1 -1
- package/dist/utils/strict-modeling.js +11 -0
- package/package.json +4 -4
- package/schema/entities.pl +60 -1
- package/schema/relationships.pl +17 -4
- package/schema/validation.pl +118 -20
- package/src/public/diagnostic-usage.ts +16 -24
- package/src/public/impact/full-kb-quality.ts +4 -16
- package/src/public/operations/check-executor.ts +12 -1
- package/src/public/operations/check-helpers.ts +27 -1
- package/src/public/operations/contracts.ts +19 -0
- package/src/public/operations/discovery-entities.ts +292 -23
- package/src/public/operations/discovery-executors.ts +91 -55
- package/src/public/operations/migration-plan.ts +57 -0
- package/src/public/operations/predicate-schema-conformance.ts +362 -0
- package/src/public/operations/prolog-json.ts +9 -3
- package/src/public/operations/result-envelope.ts +114 -2
- package/src/public/operations/runtime-types.ts +1 -1
- package/src/public/operations/specs/check-rules.generated.ts +8 -1
- package/src/public/operations/specs/discovery.ts +8 -1
- package/src/public/operations/specs/mutation-schemas.ts +23 -3
- package/src/public/operations/specs/reporting.ts +69 -22
- package/src/public/operations/specs/upsert.ts +1 -1
- package/src/public/operations/symbol-repair-plan.ts +13 -3
- package/src/public/schemas/entity.ts +22 -0
- package/src/public/schemas/relationship.ts +1 -0
- package/src/public/skills/kibi-usage/SKILL.md +7 -3
- package/src/public/skills/kibi-usage/resources/fact-lanes.md +4 -0
- package/src/public/skills/kibi-usage/resources/relationship-directions.md +35 -17
- package/src/public/skills/kibi-usage/resources/source-authoring.md +36 -0
- package/src/public/skills/kibi-usage/resources/workflows.md +52 -1
- package/src/public/telemetry-acceptance.ts +37 -6
- package/src/schemas/entity.schema.json +32 -0
- package/src/schemas/relationship.schema.json +1 -0
|
@@ -5,14 +5,15 @@ import { OperationError } from "../../cli-errors.js";
|
|
|
5
5
|
import { branchEnsureCommand, branchMigrateCommand, branchRecoverCommand, } from "../../commands/branch.js";
|
|
6
6
|
import { migrateCommand } from "../../commands/migrate.js";
|
|
7
7
|
import { syncCommand } from "../../commands/sync.js";
|
|
8
|
+
import { loadEntities } from "../../public/operations/discovery-entities.js";
|
|
8
9
|
import { executeStatus } from "../../public/operations/discovery-executors.js";
|
|
9
|
-
import { migrationPlanHash, } from "../../public/operations/migration-plan.js";
|
|
10
|
+
import { PREDICATE_SCHEMA_ALIGNMENT_CODE, migrationPlanHash, } from "../../public/operations/migration-plan.js";
|
|
10
11
|
import { readMigrationConfigStatus } from "../../public/operations/migration-plan.js";
|
|
11
12
|
import { readWorkspaceSnapshot } from "../../public/operations/workspace-snapshot.js";
|
|
12
13
|
import { isDerivedKbPath } from "../../utils/kb-paths.js";
|
|
13
14
|
import { bootstrapEmptyKbSnapshotId, bootstrapPlanHash, } from "../bootstrap/types.js";
|
|
14
15
|
import { executeDelete } from "../mutation/delete.js";
|
|
15
|
-
import { writePendingSourceReceipt } from "../mutation/source-authoring.js";
|
|
16
|
+
import { retirePendingSourceReceipt, writePendingSourceReceipt, } from "../mutation/source-authoring.js";
|
|
16
17
|
import { executeUpsert } from "../mutation/upsert.js";
|
|
17
18
|
import { acquireWorkspaceMutationLock, releaseWorkspaceMutationLock, } from "../mutation/workspace-mutation-lock.js";
|
|
18
19
|
import { compilePlanHash, } from "./compile-intent.js";
|
|
@@ -37,6 +38,21 @@ function isRecord(value) {
|
|
|
37
38
|
function digest(value) {
|
|
38
39
|
return createHash("sha256").update(value).digest("hex");
|
|
39
40
|
}
|
|
41
|
+
/**
|
|
42
|
+
* Reconcile pending-source receipts with committed source writes: a written
|
|
43
|
+
* file is bound to its exact bytes until Git tracks it, and a deleted file
|
|
44
|
+
* must not leave a receipt that later syncs would report as missing.
|
|
45
|
+
*/
|
|
46
|
+
function reconcilePendingSourceReceipts(workspaceRoot, writes) {
|
|
47
|
+
for (const write of writes) {
|
|
48
|
+
if ((write.mode ?? "write") === "delete") {
|
|
49
|
+
retirePendingSourceReceipt(workspaceRoot, write.path);
|
|
50
|
+
}
|
|
51
|
+
else if (write.afterHash !== null) {
|
|
52
|
+
writePendingSourceReceipt(workspaceRoot, write.path, write.afterHash);
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
}
|
|
40
56
|
function relationships(step) {
|
|
41
57
|
if (!Array.isArray(step.relationships))
|
|
42
58
|
return [];
|
|
@@ -356,11 +372,7 @@ async function applySourceWrites(context, writes, planHash, allowReplay = false,
|
|
|
356
372
|
throw new Error(`MUTATION_ALREADY_COMMITTED: source plan ${planHash} already crossed the authoritative commit boundary; use kb_apply_plan recoveryJournalId=${journalId} instead of retrying the original mutation`);
|
|
357
373
|
}
|
|
358
374
|
onCommitted();
|
|
359
|
-
|
|
360
|
-
if (entry.mode === "write" && entry.afterHash !== null) {
|
|
361
|
-
writePendingSourceReceipt(context.workspaceRoot, entry.path, entry.afterHash);
|
|
362
|
-
}
|
|
363
|
-
}
|
|
375
|
+
reconcilePendingSourceReceipts(context.workspaceRoot, prior.entries);
|
|
364
376
|
return { paths: priorPaths, rollback: async () => undefined, journalId };
|
|
365
377
|
}
|
|
366
378
|
}
|
|
@@ -518,11 +530,7 @@ async function applySourceWrites(context, writes, planHash, allowReplay = false,
|
|
|
518
530
|
// A newly authored file is intentionally excluded from ordinary Git
|
|
519
531
|
// discovery until the operator stages it. The receipt binds that pending
|
|
520
532
|
// input to the exact bytes committed by this plan.
|
|
521
|
-
|
|
522
|
-
if ((write.mode ?? "write") === "write" && write.afterHash !== null) {
|
|
523
|
-
writePendingSourceReceipt(context.workspaceRoot, write.path, write.afterHash);
|
|
524
|
-
}
|
|
525
|
-
}
|
|
533
|
+
reconcilePendingSourceReceipts(context.workspaceRoot, writes);
|
|
526
534
|
}
|
|
527
535
|
catch (error) {
|
|
528
536
|
if (sourceCommitted) {
|
|
@@ -609,11 +617,7 @@ async function executeSourceRecovery(args, context, onCommitted = () => undefine
|
|
|
609
617
|
});
|
|
610
618
|
}
|
|
611
619
|
const sourceWrites = await applySourceWrites(context, writes, journal.planHash, true, onCommitted);
|
|
612
|
-
|
|
613
|
-
if (write.mode === "write" && write.afterHash !== null) {
|
|
614
|
-
writePendingSourceReceipt(context.workspaceRoot, write.path, write.afterHash);
|
|
615
|
-
}
|
|
616
|
-
}
|
|
620
|
+
reconcilePendingSourceReceipts(context.workspaceRoot, writes);
|
|
617
621
|
const sync = await syncCommand({
|
|
618
622
|
workspaceRoot: context.workspaceRoot,
|
|
619
623
|
rebuild: true,
|
|
@@ -1272,6 +1276,7 @@ async function executeApplyPlanUnlocked(args, context, onCommitted = () => undef
|
|
|
1272
1276
|
structuredContent: payload,
|
|
1273
1277
|
};
|
|
1274
1278
|
}
|
|
1279
|
+
// implements REQ-agent-guided-migration-orchestration, REQ-cli-canonical-runtime, REQ-KIBI-BOOTSTRAP-PLAN, REQ-kibi-change-to-proof-plan-compiler, REQ-kibi-predicate-vocabulary-migration
|
|
1275
1280
|
export async function executeApplyPlan(args, context) {
|
|
1276
1281
|
if (!context.fs || context.sourceMutationLockHeld === true)
|
|
1277
1282
|
return executeApplyPlanUnlocked(args, context);
|
|
@@ -1508,7 +1513,46 @@ async function applyMigrationAction(action, context) {
|
|
|
1508
1513
|
throw new Error("Coordinate refresh did not complete successfully.");
|
|
1509
1514
|
return;
|
|
1510
1515
|
}
|
|
1516
|
+
case PREDICATE_SCHEMA_ALIGNMENT_CODE:
|
|
1517
|
+
await applyPredicateSchemaAlignment(action, context);
|
|
1518
|
+
return;
|
|
1511
1519
|
default:
|
|
1512
1520
|
throw new Error(`Migration action '${action.code}' has no automatic executor.`);
|
|
1513
1521
|
}
|
|
1514
1522
|
}
|
|
1523
|
+
/**
|
|
1524
|
+
* Replay the planned kb_upsert for one predicate fact after confirming the
|
|
1525
|
+
* fact still has the namespace and alias spellings the plan was built from.
|
|
1526
|
+
*/
|
|
1527
|
+
// implements REQ-kibi-predicate-vocabulary-migration
|
|
1528
|
+
async function applyPredicateSchemaAlignment(action, context) {
|
|
1529
|
+
const invocation = action.invocation;
|
|
1530
|
+
if (invocation.kind !== "operation" || invocation.name !== "kb_upsert")
|
|
1531
|
+
throw new Error("Predicate schema alignment requires its planned kb_upsert invocation.");
|
|
1532
|
+
const input = asUpsert(invocation.input);
|
|
1533
|
+
if (input.type !== "fact")
|
|
1534
|
+
throw new Error("Predicate schema alignment only rewrites fact entities.");
|
|
1535
|
+
const prolog = context.prolog ?? (await context.ensureProlog?.());
|
|
1536
|
+
if (!prolog)
|
|
1537
|
+
throw new Error("Predicate schema alignment requires a Prolog runtime.");
|
|
1538
|
+
const operationContext = { ...context, prolog, sourceFirst: true };
|
|
1539
|
+
const [current] = await loadEntities(prolog, { type: "fact", id: input.id });
|
|
1540
|
+
const evidence = action.evidence;
|
|
1541
|
+
const currentNamespace = typeof current?.predicate_namespace === "string" &&
|
|
1542
|
+
current.predicate_namespace !== ""
|
|
1543
|
+
? current.predicate_namespace
|
|
1544
|
+
: "default";
|
|
1545
|
+
const currentArgs = Array.isArray(current?.predicate_args)
|
|
1546
|
+
? current.predicate_args
|
|
1547
|
+
: [];
|
|
1548
|
+
const rewrites = Array.isArray(evidence.rewrites) ? evidence.rewrites : [];
|
|
1549
|
+
const unchanged = current !== undefined &&
|
|
1550
|
+
current.fact_kind === "predicate" &&
|
|
1551
|
+
currentNamespace === evidence.namespace &&
|
|
1552
|
+
rewrites.every((rewrite) => isRecord(rewrite) &&
|
|
1553
|
+
typeof rewrite.index === "number" &&
|
|
1554
|
+
currentArgs[rewrite.index] === rewrite.from);
|
|
1555
|
+
if (!unchanged)
|
|
1556
|
+
throw new Error(`Predicate fact ${input.id} changed since planning; rerun kibi check and approve the new plan.`);
|
|
1557
|
+
await executeUpsert(input, operationContext);
|
|
1558
|
+
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"compile-intent.d.ts","sourceRoot":"","sources":["../../../src/operations/planning/compile-intent.ts"],"names":[],"mappings":"AAIA,OAAO,EACL,KAAK,kBAAkB,EACvB,KAAK,iBAAiB,EACtB,KAAK,cAAc,EAEpB,MAAM,wBAAwB,CAAC;AAKhC,OAAO,KAAK,EACV,gBAAgB,EAEjB,MAAM,0CAA0C,CAAC;AAIlD,OAAO,KAAK,EAEV,2BAA2B,EAE5B,MAAM,8BAA8B,CAAC;AAGtC,eAAO,MAAM,oBAAoB,EAAG,sBAA+B,CAAC;AAGpE,MAAM,MAAM,iBAAiB,GAAG,QAAQ,CAAC;IACvC,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,QAAQ,GAAG,QAAQ,CAAC;IAC1B,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,eAAe,CAAC,EAAE,SAAS,cAAc,EAAE,CAAC;IAC5C,cAAc,CAAC,EAAE,kBAAkB,CAAC;IACpC,OAAO,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAC5B,eAAe,CAAC,EAAE,SAAS,2BAA2B,EAAE,CAAC;IACzD,cAAc,CAAC,EAAE,SAAS,aAAa,EAAE,CAAC;IAC1C,UAAU,CAAC,EAAE,SAAS,SAAS,EAAE,CAAC;IAClC,iBAAiB,CAAC,EAAE,SAAS,gBAAgB,EAAE,CAAC;CACjD,CAAC,CAAC;AAGH,MAAM,MAAM,aAAa,GAAG,QAAQ,CAAC;IACnC,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;CACd,CAAC,CAAC;AAGH,MAAM,MAAM,SAAS,GAAG,QAAQ,CAAC;IAC/B,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,iEAAiE;IACjE,WAAW,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAChC,iBAAiB,CAAC,EAAE,MAAM,GAAG,aAAa,GAAG,YAAY,CAAC;IAC1D,uBAAuB,CAAC,EAAE,UAAU,GAAG,UAAU,CAAC;CACnD,CAAC,CAAC;AAGH,MAAM,MAAM,gBAAgB,GAAG,QAAQ,CAAC;IACtC,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,QAAQ,GAAG,QAAQ,CAAC;CAC/B,CAAC,CAAC;AAGH,MAAM,MAAM,oBAAoB,GAAG,QAAQ,CAAC;IAC1C,YAAY,EAAE,SAAS,MAAM,EAAE,CAAC;IAChC,MAAM,EAAE,MAAM,CAAC;CAChB,CAAC,CAAC;AAGH,MAAM,MAAM,oBAAoB,GAAG,QAAQ,CAAC;IAC1C,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,MAAM,CAAC;IACtB,YAAY,EAAE,QAAQ,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACnE,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,SAAS,MAAM,EAAE,CAAC;IAC5B,QAAQ,EAAE,SAAS,GAAG,QAAQ,GAAG,QAAQ,CAAC;CAC3C,CAAC,CAAC;AAGH,MAAM,MAAM,QAAQ,GAAG,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;AAGzD,wBAAgB,eAAe,CAC7B,IAAI,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,GACtC,MAAM,CAGR;AAGD,MAAM,MAAM,aAAa,GAAG,QAAQ,CAAC;IACnC,OAAO,EAAE,OAAO,oBAAoB,CAAC;IACrC,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,OAAO,GAAG,kBAAkB,GAAG,SAAS,CAAC;IACjD,QAAQ,EAAE;QACR,MAAM,EAAE,MAAM,CAAC;QACf,YAAY,EAAE,MAAM,CAAC;QACrB,iBAAiB,EAAE,MAAM,CAAC;QAC1B,YAAY,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC,CAAC,CAAC;KACvD,CAAC;IACF,MAAM,EAAE;QACN,IAAI,EAAE,QAAQ,GAAG,QAAQ,CAAC;QAC1B,aAAa,EAAE,MAAM,CAAC;QACtB,eAAe,EAAE,MAAM,CAAC;KACzB,CAAC;IACF,SAAS,EAAE;QACT,UAAU,EAAE,SAAS,iBAAiB,EAAE,CAAC;QACzC,SAAS,EAAE,OAAO,CAAC;KACpB,CAAC;IACF,YAAY,EAAE,SAAS;QACrB,QAAQ,EAAE,MAAM,CAAC;QACjB,IAAI,EAAE,MAAM,CAAC;QACb,IAAI,EAAE;YAAE,KAAK,EAAE,MAAM,CAAC;YAAC,GAAG,EAAE,MAAM,CAAA;SAAE,CAAC;QACrC,WAAW,EACP,iBAAiB,GACjB,WAAW,GACX,MAAM,GACN,aAAa,GACb,YAAY,CAAC;QACjB,MAAM,EAAE,SAAS,GAAG,WAAW,GAAG,cAAc,GAAG,YAAY,CAAC;QAChE,MAAM,EAAE,MAAM,GAAG,eAAe,CAAC;KAClC,EAAE,CAAC;IACJ,qBAAqB,EAAE;QACrB,OAAO,EAAE,aAAa,GAAG,UAAU,GAAG,YAAY,CAAC;QACnD,SAAS,EAAE,SAAS,oBAAoB,EAAE,CAAC;KAC5C,CAAC;IACF,SAAS,EAAE,SAAS,oBAAoB,EAAE,CAAC;IAC3C,KAAK,EAAE,SAAS,QAAQ,EAAE,CAAC;IAC3B,YAAY,EAAE,SAAS,eAAe,EAAE,CAAC;IACzC,WAAW,EAAE,SAAS,MAAM,EAAE,CAAC;IAC/B,gFAAgF;IAChF,iBAAiB,CAAC,EAAE,QAAQ,CAAC;QAC3B,MAAM,EAAE,SAAS;YACf,QAAQ,EAAE,MAAM,CAAC;YACjB,aAAa,EAAE,MAAM,CAAC;YACtB,UAAU,EAAE,MAAM,CAAC;YACnB,IAAI,EAAE,MAAM,CAAC;YACb,QAAQ,EAAE,OAAO,CAAC;YAClB,OAAO,EAAE,OAAO,CAAC;YACjB,OAAO,EAAE,OAAO,CAAC;YACjB,YAAY,CAAC,EAAE,OAAO,CAAC;YACvB,KAAK,CAAC,EAAE,MAAM,CAAC;SAChB,EAAE,CAAC;QACJ,cAAc,EAAE,QAAQ,CAAC;YACvB,YAAY,EAAE,OAAO,CAAC;YACtB,SAAS,EAAE,SAAS;gBAClB,QAAQ,EAAE,MAAM,CAAC;gBACjB,IAAI,EAAE,MAAM,CAAC;gBACb,UAAU,EAAE,MAAM,CAAC;aACpB,EAAE,CAAC;YACJ,iBAAiB,EAAE,SAAS;gBAC1B,QAAQ,EAAE,MAAM,CAAC;gBACjB,aAAa,EAAE,MAAM,CAAC;gBACtB,UAAU,EAAE,MAAM,CAAC;gBACnB,IAAI,EAAE,MAAM,CAAC;gBACb,QAAQ,EAAE,OAAO,CAAC;gBAClB,OAAO,EAAE,OAAO,CAAC;gBACjB,OAAO,EAAE,OAAO,CAAC;gBACjB,YAAY,CAAC,EAAE,OAAO,CAAC;gBACvB,KAAK,CAAC,EAAE,MAAM,CAAC;gBACf,SAAS,EAAE,SAAS;oBAClB,QAAQ,EAAE,MAAM,CAAC;oBACjB,IAAI,EAAE,MAAM,CAAC;oBACb,UAAU,EAAE,MAAM,CAAC;iBACpB,EAAE,CAAC;aACL,EAAE,CAAC;SACL,CAAC,GAAG,IAAI,CAAC;QACV,QAAQ,EAAE,QAAQ,CAAC;YACjB,QAAQ,EAAE,OAAO,CAAC;YAClB,UAAU,EAAE,MAAM,CAAC;YACnB,gBAAgB,EAAE,MAAM,CAAC;YACzB,aAAa,EAAE,SAAS;gBACtB,MAAM,EAAE,MAAM,CAAC;gBACf,QAAQ,EAAE,MAAM,CAAC;gBACjB,aAAa,EAAE,MAAM,CAAC;gBACtB,UAAU,EAAE,MAAM,CAAC;aACpB,EAAE,CAAC;SACL,CAAC,CAAC;KACJ,CAAC,CAAC;CACJ,CAAC,CAAC;AAEH,MAAM,MAAM,eAAe,GAAG,QAAQ,CAAC;IACrC,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,OAAO,GAAG,QAAQ,CAAC;IACzB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf,CAAC,CAAC;AA0eH,wBAAsB,oBAAoB,CACxC,IAAI,EAAE,iBAAiB,EACvB,OAAO,EAAE,gBAAgB,GACxB,OAAO,CAAC;IACT,OAAO,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC/C,iBAAiB,EAAE,aAAa,CAAC;CAClC,CAAC,
|
|
1
|
+
{"version":3,"file":"compile-intent.d.ts","sourceRoot":"","sources":["../../../src/operations/planning/compile-intent.ts"],"names":[],"mappings":"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"}
|
|
@@ -446,7 +446,9 @@ export async function executeCompileIntent(args, context) {
|
|
|
446
446
|
diagnostics.push("Update target is unresolved: supply requirementId or improve the top candidate score and margin.");
|
|
447
447
|
}
|
|
448
448
|
}
|
|
449
|
-
|
|
449
|
+
// A caller-chosen ID names the requirement by what it governs and wins;
|
|
450
|
+
// the content-hash ID is only a fallback when none is supplied.
|
|
451
|
+
if (args.mode === "create" && !explicitId)
|
|
450
452
|
requirementId = generatedRequirementId(intent);
|
|
451
453
|
if (!requirementId)
|
|
452
454
|
throw new Error("Compile intent failed: could not determine requirementId");
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { PrologPort } from "../../public/operations/runtime-types.js";
|
|
2
|
+
/**
|
|
3
|
+
* Which symbols a proof receipt's per-contract binding covers. Receipt ingest
|
|
4
|
+
* (which writes `binding_hash`) and coverage (which checks it) must derive
|
|
5
|
+
* the same set, so both go through this module:
|
|
6
|
+
*
|
|
7
|
+
* - the contract's required proof symbols (the test's own executable code),
|
|
8
|
+
* - any symbols the test declares in `proof_bindings`,
|
|
9
|
+
* - every production symbol linked `covered_by` this test.
|
|
10
|
+
*
|
|
11
|
+
* Editing any of those symbols' source files changes the binding hash, so the
|
|
12
|
+
* receipt goes stale until the test is proven again on the new code.
|
|
13
|
+
*/
|
|
14
|
+
export declare function receiptCodeScopeSymbolIds(contract: unknown, bindings: unknown, coveredBySymbols: readonly string[]): string[];
|
|
15
|
+
/** Map each test id to the symbols linked `covered_by` it, in one query. */
|
|
16
|
+
export declare function loadCoveredBySymbolsByTest(prolog: Pick<PrologPort, "query">): Promise<ReadonlyMap<string, readonly string[]>>;
|
|
17
|
+
//# sourceMappingURL=code-scope.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"code-scope.d.ts","sourceRoot":"","sources":["../../../src/operations/proof/code-scope.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,0CAA0C,CAAC;AAE3E;;;;;;;;;;;GAWG;AAEH,wBAAgB,yBAAyB,CACvC,QAAQ,EAAE,OAAO,EACjB,QAAQ,EAAE,OAAO,EACjB,gBAAgB,EAAE,SAAS,MAAM,EAAE,GAClC,MAAM,EAAE,CAoBV;AAED,4EAA4E;AAE5E,wBAAsB,0BAA0B,CAC9C,MAAM,EAAE,IAAI,CAAC,UAAU,EAAE,OAAO,CAAC,GAChC,OAAO,CAAC,WAAW,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,CAAC,CAAC,CAiBjD"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
/*
|
|
2
|
+
Kibi — repo-local, per-branch, queryable long-term memory for software projects
|
|
3
|
+
Copyright (C) 2026 Piotr Franczyk
|
|
4
|
+
|
|
5
|
+
This program is free software: you can redistribute it and/or modify
|
|
6
|
+
it under the terms of the GNU Affero General Public License as published by
|
|
7
|
+
the Free Software Foundation, either version 3 of the License, or
|
|
8
|
+
(at your option) any later version.
|
|
9
|
+
*/
|
|
10
|
+
import { normalizeEntityId, parseTriples } from "../../prolog/codec.js";
|
|
11
|
+
/**
|
|
12
|
+
* Which symbols a proof receipt's per-contract binding covers. Receipt ingest
|
|
13
|
+
* (which writes `binding_hash`) and coverage (which checks it) must derive
|
|
14
|
+
* the same set, so both go through this module:
|
|
15
|
+
*
|
|
16
|
+
* - the contract's required proof symbols (the test's own executable code),
|
|
17
|
+
* - any symbols the test declares in `proof_bindings`,
|
|
18
|
+
* - every production symbol linked `covered_by` this test.
|
|
19
|
+
*
|
|
20
|
+
* Editing any of those symbols' source files changes the binding hash, so the
|
|
21
|
+
* receipt goes stale until the test is proven again on the new code.
|
|
22
|
+
*/
|
|
23
|
+
// implements REQ-kibi-verification-evidence-contract
|
|
24
|
+
export function receiptCodeScopeSymbolIds(contract, bindings, coveredBySymbols) {
|
|
25
|
+
const ids = new Set();
|
|
26
|
+
const requiredProofs = contract !== null &&
|
|
27
|
+
typeof contract === "object" &&
|
|
28
|
+
Array.isArray(contract.required_proofs)
|
|
29
|
+
? contract.required_proofs
|
|
30
|
+
: [];
|
|
31
|
+
for (const entry of [
|
|
32
|
+
...requiredProofs,
|
|
33
|
+
...(Array.isArray(bindings) ? bindings : []),
|
|
34
|
+
]) {
|
|
35
|
+
const symbolId = entry !== null && typeof entry === "object"
|
|
36
|
+
? entry.symbol_id
|
|
37
|
+
: undefined;
|
|
38
|
+
if (typeof symbolId === "string" && symbolId !== "")
|
|
39
|
+
ids.add(symbolId);
|
|
40
|
+
}
|
|
41
|
+
for (const symbolId of coveredBySymbols)
|
|
42
|
+
ids.add(symbolId);
|
|
43
|
+
return [...ids].sort();
|
|
44
|
+
}
|
|
45
|
+
/** Map each test id to the symbols linked `covered_by` it, in one query. */
|
|
46
|
+
// implements REQ-kibi-verification-evidence-contract
|
|
47
|
+
export async function loadCoveredBySymbolsByTest(prolog) {
|
|
48
|
+
const result = await prolog.query("findall([From,To,'covered_by'], kb_relationship(covered_by, From, To), Rels)");
|
|
49
|
+
if (!result.success) {
|
|
50
|
+
throw new Error(`covered_by relationship query failed: ${result.error ?? "Unknown error"}`);
|
|
51
|
+
}
|
|
52
|
+
const byTest = new Map();
|
|
53
|
+
for (const [rawFrom, rawTo] of parseTriples(result.bindings.Rels ?? "[]")) {
|
|
54
|
+
const testId = normalizeEntityId(rawTo);
|
|
55
|
+
const symbols = byTest.get(testId) ?? [];
|
|
56
|
+
symbols.push(normalizeEntityId(rawFrom));
|
|
57
|
+
byTest.set(testId, symbols);
|
|
58
|
+
}
|
|
59
|
+
return byTest;
|
|
60
|
+
}
|
|
@@ -24,11 +24,13 @@ export type IngestProofResult = Readonly<{
|
|
|
24
24
|
unchanged: number;
|
|
25
25
|
results: readonly IngestProofTestResult[];
|
|
26
26
|
}>;
|
|
27
|
-
|
|
27
|
+
type IngestProofOutput = {
|
|
28
28
|
content: Array<{
|
|
29
29
|
type: "text";
|
|
30
30
|
text: string;
|
|
31
31
|
}>;
|
|
32
32
|
structuredContent: IngestProofResult;
|
|
33
|
-
}
|
|
33
|
+
};
|
|
34
|
+
export declare function executeIngestProof(args: IngestProofArgs, context: OperationContext): Promise<IngestProofOutput>;
|
|
35
|
+
export {};
|
|
34
36
|
//# sourceMappingURL=ingest-proof.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ingest-proof.d.ts","sourceRoot":"","sources":["../../../src/operations/proof/ingest-proof.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"ingest-proof.d.ts","sourceRoot":"","sources":["../../../src/operations/proof/ingest-proof.ts"],"names":[],"mappings":"AAMA,OAAO,EACL,KAAK,QAAQ,EAEd,MAAM,yBAAyB,CAAC;AAOjC,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,0CAA0C,CAAC;AAkBjF,OAAO,EAEL,KAAK,YAAY,EAGlB,MAAM,+BAA+B,CAAC;AAqBvC,MAAM,MAAM,eAAe,GAAG,QAAQ,CAAC;IACrC,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;IAC5C,OAAO,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;CAC7B,CAAC,CAAC;AAEH,MAAM,MAAM,qBAAqB,GAAG,QAAQ,CAAC;IAC3C,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,YAAY,CAAC,SAAS,CAAC,CAAC;IACjC,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,OAAO,CAAC;IACjB,SAAS,EAAE,OAAO,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,IAAI,EAAE,SAAS,QAAQ,EAAE,CAAC;CAC3B,CAAC,CAAC;AAGH,MAAM,MAAM,iBAAiB,GAAG,QAAQ,CAAC;IACvC,cAAc,EAAE,MAAM,CAAC;IACvB,eAAe,EAAE,MAAM,CAAC;IACxB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,SAAS,qBAAqB,EAAE,CAAC;CAC3C,CAAC,CAAC;AAEH,KAAK,iBAAiB,GAAG;IACvB,OAAO,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC/C,iBAAiB,EAAE,iBAAiB,CAAC;CACtC,CAAC;AAokBF,wBAAsB,kBAAkB,CACtC,IAAI,EAAE,eAAe,EACrB,OAAO,EAAE,gBAAgB,GACxB,OAAO,CAAC,iBAAiB,CAAC,CAuC5B"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { join } from "node:path";
|
|
2
2
|
import { resolveBoundSymbolScope } from "../../extractors/manifest.js";
|
|
3
|
+
import { loadCoveredBySymbolsByTest, receiptCodeScopeSymbolIds, } from "./code-scope.js";
|
|
3
4
|
import { evaluateContractAgainstRun, } from "../../proof/evaluate.js";
|
|
4
5
|
import { loadProofIntegrations, resolveIntegration, toExecution, } from "../../proof/integrations.js";
|
|
5
6
|
import { loadEntities } from "../../public/operations/discovery-entities.js";
|
|
@@ -9,8 +10,32 @@ import { PROOF_CONTRACT_VERSION, PROOF_RECEIPT_VERSION, proofBindingsErrors, pro
|
|
|
9
10
|
import { MAX_PROOF_RECEIPTS, proofReceiptCurrentBindingErrors, proofReceiptHistoryErrors, } from "../../public/proof-receipt.js";
|
|
10
11
|
import { projectEntityProperties } from "../mutation/entity-projection.js";
|
|
11
12
|
import { resolveContainedSourcePath } from "../mutation/source-authoring.js";
|
|
13
|
+
import { buildUpsertBatchCommitGoal, parseUpsertChangeKinds, } from "../mutation/contradictions.js";
|
|
12
14
|
import { executeUpsert } from "../mutation/upsert.js";
|
|
15
|
+
import { acquireWorkspaceMutationLock, releaseWorkspaceMutationLock, } from "../mutation/workspace-mutation-lock.js";
|
|
16
|
+
import { MutationRollbackFailureError } from "../mutation/saga.js";
|
|
13
17
|
import { patchReceiptsIntoDocument, removeFrontmatterBlock, } from "./receipt-document.js";
|
|
18
|
+
async function rollbackUncommittedReceipts(pending, originalError, lifecycle) {
|
|
19
|
+
const failures = [];
|
|
20
|
+
for (const entry of pending) {
|
|
21
|
+
if (entry.deferred.state === "committed")
|
|
22
|
+
continue;
|
|
23
|
+
try {
|
|
24
|
+
const rollbackFailures = await entry.deferred.rollback();
|
|
25
|
+
for (const failure of rollbackFailures) {
|
|
26
|
+
failures.push({ testId: entry.testId, ...failure });
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
catch (error) {
|
|
30
|
+
failures.push({ testId: entry.testId, step: "rollback", error });
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
if (failures.length > 0) {
|
|
34
|
+
lifecycle?.onRollbackFailure?.();
|
|
35
|
+
throw new AggregateError([originalError, ...failures.map((failure) => failure.error)], `Proof ingest failed and could not restore every uncommitted receipt source; the source mutation lock remains held for recovery (${failures.map(({ testId, step }) => `${testId}:${step}`).join(", ")})`);
|
|
36
|
+
}
|
|
37
|
+
throw originalError;
|
|
38
|
+
}
|
|
14
39
|
function text(value) {
|
|
15
40
|
return typeof value === "string" ? value.trim() : "";
|
|
16
41
|
}
|
|
@@ -120,7 +145,7 @@ function existingReceipts(test) {
|
|
|
120
145
|
: [];
|
|
121
146
|
}
|
|
122
147
|
// implements REQ-kibi-verification-evidence-contract
|
|
123
|
-
|
|
148
|
+
async function executeIngestProofUnlocked(args, context, lifecycle) {
|
|
124
149
|
if (!context.prolog)
|
|
125
150
|
throw new Error("Proof ingest requires a Prolog runtime");
|
|
126
151
|
const snapshot = requiredString(args.snapshot, "snapshot");
|
|
@@ -162,18 +187,37 @@ export async function executeIngestProof(args, context) {
|
|
|
162
187
|
}
|
|
163
188
|
}
|
|
164
189
|
else {
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
190
|
+
// Select candidates from the paged contract projection (no receipt
|
|
191
|
+
// histories), then load each matching test in full: the append-only
|
|
192
|
+
// receipt update needs that test's existing history, but never every
|
|
193
|
+
// test's history in a single Prolog answer.
|
|
194
|
+
const candidates = await loadEntities(context.prolog, {
|
|
195
|
+
type: "test",
|
|
196
|
+
projection: "proof_contract",
|
|
197
|
+
});
|
|
198
|
+
for (const candidate of candidates) {
|
|
199
|
+
const contract = record(candidate.proof_contract);
|
|
200
|
+
if (!contract ||
|
|
201
|
+
contract.version !== PROOF_CONTRACT_VERSION ||
|
|
202
|
+
text(contract.integration) !== integrationId) {
|
|
203
|
+
continue;
|
|
172
204
|
}
|
|
205
|
+
const testId = String(candidate.id);
|
|
206
|
+
const found = await loadEntities(context.prolog, {
|
|
207
|
+
id: testId,
|
|
208
|
+
type: "test",
|
|
209
|
+
});
|
|
210
|
+
const test = found[0];
|
|
211
|
+
if (!test)
|
|
212
|
+
throw new Error(`Proof ingest failed: test ${testId} was not found`);
|
|
213
|
+
tests.push(test);
|
|
173
214
|
}
|
|
174
215
|
if (tests.length === 0)
|
|
175
216
|
throw new Error(`Proof ingest failed: no tests declare proof_contract.integration '${integrationId}'`);
|
|
176
217
|
}
|
|
218
|
+
// Loaded outside the per-test binding try/catch: an engine failure must fail
|
|
219
|
+
// the ingest, not silently write receipts without a binding hash.
|
|
220
|
+
const coveredBy = await loadCoveredBySymbolsByTest(context.prolog);
|
|
177
221
|
const prepared = [];
|
|
178
222
|
for (const test of tests) {
|
|
179
223
|
const testId = String(test.id);
|
|
@@ -207,7 +251,7 @@ export async function executeIngestProof(args, context) {
|
|
|
207
251
|
const absolute = resolveContainedSourcePath(context.workspaceRoot, source);
|
|
208
252
|
const authored = await context.fs.readFile(absolute);
|
|
209
253
|
const stripped = removeFrontmatterBlock(authored, "proof_receipts");
|
|
210
|
-
const codeScope = resolveBoundSymbolScope(join(context.workspaceRoot, ".kb", "symbols.yaml"), bindings.
|
|
254
|
+
const codeScope = resolveBoundSymbolScope(join(context.workspaceRoot, ".kb", "symbols.yaml"), receiptCodeScopeSymbolIds(contract, bindings, coveredBy.get(testId) ?? []));
|
|
211
255
|
bindingHash = receiptBindingHash(contract, stripped ?? authored, codeScope);
|
|
212
256
|
}
|
|
213
257
|
catch {
|
|
@@ -253,82 +297,138 @@ export async function executeIngestProof(args, context) {
|
|
|
253
297
|
});
|
|
254
298
|
}
|
|
255
299
|
const results = [];
|
|
300
|
+
const pendingCommits = [];
|
|
256
301
|
let passed = 0;
|
|
257
302
|
let failed = 0;
|
|
258
303
|
let unchanged = 0;
|
|
259
|
-
|
|
260
|
-
const
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
304
|
+
try {
|
|
305
|
+
for (const entry of prepared) {
|
|
306
|
+
const { testId, test, contract, evaluation, receipt, existing } = entry;
|
|
307
|
+
// Idempotent re-ingestion: the same artifact against the same effective
|
|
308
|
+
// contract+fingerprint derives the same receipt id and must not re-append.
|
|
309
|
+
if (existing.some((row) => row.receipt_id === receipt.receipt_id)) {
|
|
310
|
+
unchanged += 1;
|
|
311
|
+
if (receipt.outcome === "passed")
|
|
312
|
+
passed += 1;
|
|
313
|
+
else
|
|
314
|
+
failed += 1;
|
|
315
|
+
results.push({
|
|
316
|
+
testId,
|
|
317
|
+
outcome: receipt.outcome,
|
|
318
|
+
receiptId: receipt.receipt_id,
|
|
319
|
+
applied: false,
|
|
320
|
+
duplicate: true,
|
|
321
|
+
receiptCount: existing.length,
|
|
322
|
+
gaps: evaluation.gaps,
|
|
323
|
+
});
|
|
324
|
+
continue;
|
|
325
|
+
}
|
|
326
|
+
const nextReceipts = [
|
|
327
|
+
...existing,
|
|
328
|
+
receipt,
|
|
329
|
+
].slice(-MAX_PROOF_RECEIPTS);
|
|
330
|
+
const historyErrors = proofReceiptHistoryErrors(testId, test.verification_scope, nextReceipts);
|
|
331
|
+
const bindingErrors = proofReceiptCurrentBindingErrors(testId, test.verification_scope, receipt, contract, receipt.fingerprint);
|
|
332
|
+
const receiptErrors = [...historyErrors, ...bindingErrors];
|
|
333
|
+
if (receiptErrors.length > 0)
|
|
334
|
+
throw new Error(`Proof ingest failed for ${testId}: ${receiptErrors.join("; ")}`);
|
|
335
|
+
const properties = projectEntityProperties(test);
|
|
336
|
+
properties.proof_receipts = undefined;
|
|
337
|
+
// Surgical receipt append: splice only the proof_receipts block into the
|
|
338
|
+
// authored document so unrelated frontmatter keeps its authored form.
|
|
339
|
+
// Canonical re-rendering here would change non-receipt bytes, shift the
|
|
340
|
+
// workspace snapshot hash mid-campaign, and make later integrations in
|
|
341
|
+
// the same `kibi prove --all` refuse with "changed the tracked
|
|
342
|
+
// workspace". Falls back to the canonical render when the document is
|
|
343
|
+
// not a patchable markdown file.
|
|
344
|
+
let sourceDocumentOverride;
|
|
345
|
+
const source = typeof test.source === "string" ? test.source : "";
|
|
346
|
+
if (context.fs && source !== "" && /\.(md|mdx)$/i.test(source)) {
|
|
347
|
+
try {
|
|
348
|
+
const absolute = resolveContainedSourcePath(context.workspaceRoot, source);
|
|
349
|
+
const before = await context.fs.readFile(absolute);
|
|
350
|
+
sourceDocumentOverride =
|
|
351
|
+
patchReceiptsIntoDocument(before, nextReceipts) ?? undefined;
|
|
352
|
+
}
|
|
353
|
+
catch {
|
|
354
|
+
sourceDocumentOverride = undefined;
|
|
355
|
+
}
|
|
356
|
+
}
|
|
357
|
+
// exactOptionalPropertyTypes: only pass the override when one exists.
|
|
358
|
+
const upsertOptions = {
|
|
359
|
+
deferCompiledCommit: true,
|
|
360
|
+
...(sourceDocumentOverride === undefined
|
|
361
|
+
? {}
|
|
362
|
+
: { sourceDocumentOverride }),
|
|
363
|
+
};
|
|
364
|
+
const upsert = await executeUpsert({
|
|
365
|
+
type: "test",
|
|
366
|
+
id: testId,
|
|
367
|
+
properties: { ...properties, proof_receipts: nextReceipts },
|
|
368
|
+
}, context, upsertOptions);
|
|
369
|
+
const deferred = upsert.structuredContent?.deferredCommit;
|
|
370
|
+
if (!deferred) {
|
|
371
|
+
throw new Error(`Proof ingest failed for ${testId}: receipt commit was not prepared`);
|
|
372
|
+
}
|
|
373
|
+
pendingCommits.push({
|
|
270
374
|
testId,
|
|
271
375
|
outcome: receipt.outcome,
|
|
272
376
|
receiptId: receipt.receipt_id,
|
|
273
|
-
|
|
274
|
-
duplicate: true,
|
|
275
|
-
receiptCount: existing.length,
|
|
377
|
+
receiptCount: nextReceipts.length,
|
|
276
378
|
gaps: evaluation.gaps,
|
|
379
|
+
deferred,
|
|
277
380
|
});
|
|
278
|
-
continue;
|
|
279
381
|
}
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
const absolute = resolveContainedSourcePath(context.workspaceRoot, source);
|
|
303
|
-
const before = await context.fs.readFile(absolute);
|
|
304
|
-
sourceDocumentOverride =
|
|
305
|
-
patchReceiptsIntoDocument(before, nextReceipts) ?? undefined;
|
|
306
|
-
}
|
|
307
|
-
catch {
|
|
308
|
-
sourceDocumentOverride = undefined;
|
|
382
|
+
}
|
|
383
|
+
catch (error) {
|
|
384
|
+
if (error instanceof MutationRollbackFailureError) {
|
|
385
|
+
lifecycle?.onRollbackFailure?.();
|
|
386
|
+
}
|
|
387
|
+
await rollbackUncommittedReceipts(pendingCommits, error, lifecycle);
|
|
388
|
+
}
|
|
389
|
+
const prolog = context.prolog;
|
|
390
|
+
if (!prolog)
|
|
391
|
+
throw new Error("Proof ingest failed: Prolog runtime is unavailable");
|
|
392
|
+
const batchSize = 25;
|
|
393
|
+
for (let offset = 0; offset < pendingCommits.length; offset += batchSize) {
|
|
394
|
+
const batch = pendingCommits.slice(offset, offset + batchSize);
|
|
395
|
+
let written;
|
|
396
|
+
try {
|
|
397
|
+
written = await prolog.query(buildUpsertBatchCommitGoal(batch.map((entry) => ({
|
|
398
|
+
entity: entry.deferred.entity,
|
|
399
|
+
relationships: entry.deferred.relationships,
|
|
400
|
+
skipContradictionCheck: entry.deferred.skipContradictionCheck,
|
|
401
|
+
}))));
|
|
402
|
+
if (!written.success) {
|
|
403
|
+
throw new Error(written.error || "batch commit failed");
|
|
309
404
|
}
|
|
405
|
+
// Prolog success is the irreversible commit boundary. Finalize this
|
|
406
|
+
// batch before parsing auxiliary metadata or doing more work, so later
|
|
407
|
+
// failures can only roll back still-prepared source writes.
|
|
408
|
+
for (const entry of batch)
|
|
409
|
+
entry.deferred.finalize();
|
|
410
|
+
lifecycle?.onBatchCommitted?.();
|
|
411
|
+
prolog.invalidateCache?.();
|
|
412
|
+
parseUpsertChangeKinds(written.bindings, batch.length);
|
|
413
|
+
}
|
|
414
|
+
catch (error) {
|
|
415
|
+
await rollbackUncommittedReceipts(pendingCommits, error, lifecycle);
|
|
416
|
+
}
|
|
417
|
+
for (const entry of batch) {
|
|
418
|
+
if (entry.outcome === "passed")
|
|
419
|
+
passed += 1;
|
|
420
|
+
else
|
|
421
|
+
failed += 1;
|
|
422
|
+
results.push({
|
|
423
|
+
testId: entry.testId,
|
|
424
|
+
outcome: entry.outcome,
|
|
425
|
+
receiptId: entry.receiptId,
|
|
426
|
+
applied: true,
|
|
427
|
+
duplicate: false,
|
|
428
|
+
receiptCount: entry.receiptCount,
|
|
429
|
+
gaps: entry.gaps,
|
|
430
|
+
});
|
|
310
431
|
}
|
|
311
|
-
// exactOptionalPropertyTypes: only pass the override when one exists.
|
|
312
|
-
const upsertOptions = sourceDocumentOverride === undefined ? {} : { sourceDocumentOverride };
|
|
313
|
-
const upsert = await executeUpsert({
|
|
314
|
-
type: "test",
|
|
315
|
-
id: testId,
|
|
316
|
-
properties: { ...properties, proof_receipts: nextReceipts },
|
|
317
|
-
}, context, upsertOptions);
|
|
318
|
-
void upsert;
|
|
319
|
-
if (receipt.outcome === "passed")
|
|
320
|
-
passed += 1;
|
|
321
|
-
else
|
|
322
|
-
failed += 1;
|
|
323
|
-
results.push({
|
|
324
|
-
testId,
|
|
325
|
-
outcome: receipt.outcome,
|
|
326
|
-
receiptId: receipt.receipt_id,
|
|
327
|
-
applied: true,
|
|
328
|
-
duplicate: false,
|
|
329
|
-
receiptCount: nextReceipts.length,
|
|
330
|
-
gaps: evaluation.gaps,
|
|
331
|
-
});
|
|
332
432
|
}
|
|
333
433
|
const summary = passed > 0
|
|
334
434
|
? `Proved ${passed} test(s)${failed > 0 ? `, ${failed} failed` : ""}${unchanged > 0 ? `, ${unchanged} unchanged` : ""}.`
|
|
@@ -346,3 +446,36 @@ export async function executeIngestProof(args, context) {
|
|
|
346
446
|
},
|
|
347
447
|
};
|
|
348
448
|
}
|
|
449
|
+
export async function executeIngestProof(args, context) {
|
|
450
|
+
if (!context.fs ||
|
|
451
|
+
context.sourceFirst === false ||
|
|
452
|
+
context.sourceMutationLockHeld === true) {
|
|
453
|
+
return executeIngestProofUnlocked(args, context);
|
|
454
|
+
}
|
|
455
|
+
const lock = await acquireWorkspaceMutationLock(context.workspaceRoot);
|
|
456
|
+
let operationFailure;
|
|
457
|
+
let committed = false;
|
|
458
|
+
let releaseSafe = true;
|
|
459
|
+
try {
|
|
460
|
+
return await executeIngestProofUnlocked(args, { ...context, sourceMutationLockHeld: true }, {
|
|
461
|
+
onBatchCommitted: () => {
|
|
462
|
+
committed = true;
|
|
463
|
+
},
|
|
464
|
+
onRollbackFailure: () => {
|
|
465
|
+
releaseSafe = false;
|
|
466
|
+
},
|
|
467
|
+
});
|
|
468
|
+
}
|
|
469
|
+
catch (error) {
|
|
470
|
+
operationFailure = { error };
|
|
471
|
+
throw error;
|
|
472
|
+
}
|
|
473
|
+
finally {
|
|
474
|
+
// A failed compensation must leave the cooperative lock fail-closed. The
|
|
475
|
+
// next writer will require verified recovery rather than observing a
|
|
476
|
+
// partially restored set of receipt documents.
|
|
477
|
+
if (releaseSafe) {
|
|
478
|
+
releaseWorkspaceMutationLock(lock, operationFailure, committed);
|
|
479
|
+
}
|
|
480
|
+
}
|
|
481
|
+
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"migrate-legacy-receipts.d.ts","sourceRoot":"","sources":["../../../src/operations/proof/migrate-legacy-receipts.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"migrate-legacy-receipts.d.ts","sourceRoot":"","sources":["../../../src/operations/proof/migrate-legacy-receipts.ts"],"names":[],"mappings":"AAsBA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,0CAA0C,CAAC;AAOjF,MAAM,MAAM,yBAAyB,GAAG,QAAQ,CAAC;IAC/C,yCAAyC;IAEzC,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,CAAC,CAAC;AAGH,MAAM,MAAM,2BAA2B,GAAG,QAAQ,CAAC;IAEjD,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,SAAS;QAAE,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;CAC/C,CAAC,CAAC;AAEH;;;;;;;;;;GAUG;AAEH,wBAAsB,4BAA4B,CAChD,IAAI,EAAE,yBAAyB,EAC/B,OAAO,EAAE,gBAAgB,GACxB,OAAO,CAAC;IACT,OAAO,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC/C,iBAAiB,EAAE,2BAA2B,CAAC;CAChD,CAAC,CAqFD"}
|