kibi-cli 2.3.0 → 2.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cli-json-command.d.ts +6 -0
- package/dist/cli-json-command.d.ts.map +1 -1
- package/dist/cli-json-command.js +39 -11
- package/dist/cli-operation-loader.d.ts.map +1 -1
- package/dist/cli-operation-loader.js +7 -0
- package/dist/cli-operation-metadata.d.ts +13 -5
- package/dist/cli-operation-metadata.d.ts.map +1 -1
- package/dist/cli-operation-metadata.js +15 -5
- package/dist/cli-protocol.d.ts +14 -0
- package/dist/cli-protocol.d.ts.map +1 -1
- package/dist/cli-protocol.js +31 -2
- package/dist/cli-register-maintenance.d.ts.map +1 -1
- package/dist/cli-register-maintenance.js +7 -0
- package/dist/cli-register-proof.d.ts.map +1 -1
- package/dist/cli-register-proof.js +13 -0
- package/dist/commands/check.d.ts.map +1 -1
- package/dist/commands/check.js +11 -2
- package/dist/commands/discovery-shared.d.ts.map +1 -1
- package/dist/commands/discovery-shared.js +8 -2
- package/dist/commands/engine.d.ts.map +1 -1
- package/dist/commands/engine.js +4 -2
- package/dist/commands/gc.d.ts.map +1 -1
- package/dist/commands/gc.js +7 -0
- package/dist/commands/init-helpers.d.ts.map +1 -1
- package/dist/commands/init-helpers.js +0 -1
- package/dist/commands/merge-driver.d.ts +31 -0
- package/dist/commands/merge-driver.d.ts.map +1 -0
- package/dist/commands/merge-driver.js +268 -0
- package/dist/commands/migrate.d.ts.map +1 -1
- package/dist/commands/migrate.js +281 -14
- package/dist/commands/proof-compact.d.ts +9 -0
- package/dist/commands/proof-compact.d.ts.map +1 -0
- package/dist/commands/proof-compact.js +58 -0
- package/dist/commands/prove.d.ts +38 -0
- package/dist/commands/prove.d.ts.map +1 -1
- package/dist/commands/prove.js +222 -47
- package/dist/commands/sync/persistence.d.ts.map +1 -1
- package/dist/commands/sync/persistence.js +61 -16
- package/dist/commands/sync.d.ts +8 -0
- package/dist/commands/sync.d.ts.map +1 -1
- package/dist/commands/sync.js +42 -16
- package/dist/diagnostics.js +1 -1
- package/dist/engine-limits.d.ts +74 -0
- package/dist/engine-limits.d.ts.map +1 -0
- package/dist/engine-limits.js +201 -0
- package/dist/engine.d.ts +10 -0
- package/dist/engine.d.ts.map +1 -1
- package/dist/engine.js +57 -9
- package/dist/extractors/manifest.d.ts +8 -0
- package/dist/extractors/manifest.d.ts.map +1 -1
- package/dist/extractors/manifest.js +34 -5
- package/dist/extractors/markdown.d.ts +8 -0
- package/dist/extractors/markdown.d.ts.map +1 -1
- package/dist/extractors/markdown.js +57 -0
- package/dist/extractors/relationships.d.ts.map +1 -1
- package/dist/extractors/relationships.js +2 -0
- package/dist/intent-search.d.ts +4 -1
- package/dist/intent-search.d.ts.map +1 -1
- package/dist/intent-search.js +186 -33
- package/dist/operations/bootstrap/candidate-helpers.d.ts.map +1 -1
- package/dist/operations/bootstrap/candidate-helpers.js +8 -1
- package/dist/operations/bootstrap/candidates.d.ts.map +1 -1
- package/dist/operations/bootstrap/candidates.js +55 -39
- package/dist/operations/bootstrap/discovery.js +1 -1
- package/dist/operations/bootstrap/generate.d.ts +2 -0
- package/dist/operations/bootstrap/generate.d.ts.map +1 -1
- package/dist/operations/bootstrap/generate.js +107 -37
- package/dist/operations/bootstrap/guidance-actions.d.ts.map +1 -1
- package/dist/operations/bootstrap/guidance-actions.js +3 -0
- package/dist/operations/bootstrap/guidance.d.ts.map +1 -1
- package/dist/operations/bootstrap/guidance.js +7 -1
- package/dist/operations/bootstrap/intent-claims.d.ts +17 -0
- package/dist/operations/bootstrap/intent-claims.d.ts.map +1 -0
- package/dist/operations/bootstrap/intent-claims.js +103 -0
- package/dist/operations/bootstrap/markdown-candidates.d.ts +2 -0
- package/dist/operations/bootstrap/markdown-candidates.d.ts.map +1 -1
- package/dist/operations/bootstrap/markdown-candidates.js +32 -10
- package/dist/operations/bootstrap/presentation.d.ts +2 -0
- package/dist/operations/bootstrap/presentation.d.ts.map +1 -1
- package/dist/operations/bootstrap/presentation.js +66 -3
- package/dist/operations/bootstrap/requirement-claims.d.ts +1 -0
- package/dist/operations/bootstrap/requirement-claims.d.ts.map +1 -1
- package/dist/operations/bootstrap/requirement-claims.js +13 -1
- package/dist/operations/bootstrap/types.d.ts +28 -0
- package/dist/operations/bootstrap/types.d.ts.map +1 -1
- package/dist/operations/bootstrap/types.js +16 -0
- package/dist/operations/bootstrap/validation.d.ts +4 -0
- package/dist/operations/bootstrap/validation.d.ts.map +1 -0
- package/dist/operations/bootstrap/validation.js +20 -0
- package/dist/operations/migration/inventory-rederive.d.ts +81 -0
- package/dist/operations/migration/inventory-rederive.d.ts.map +1 -0
- package/dist/operations/migration/inventory-rederive.js +484 -0
- package/dist/operations/migration/kb-sources.d.ts +53 -0
- package/dist/operations/migration/kb-sources.d.ts.map +1 -0
- package/dist/operations/migration/kb-sources.js +233 -0
- package/dist/operations/migration/origin-backfill.d.ts +39 -0
- package/dist/operations/migration/origin-backfill.d.ts.map +1 -0
- package/dist/operations/migration/origin-backfill.js +164 -0
- package/dist/operations/migration/polarity-values.d.ts +10 -0
- package/dist/operations/migration/polarity-values.d.ts.map +1 -0
- package/dist/operations/migration/polarity-values.js +60 -0
- package/dist/operations/migration/schema6.d.ts +59 -0
- package/dist/operations/migration/schema6.d.ts.map +1 -0
- package/dist/operations/migration/schema6.js +379 -0
- package/dist/operations/migration/source-paths.d.ts +131 -0
- package/dist/operations/migration/source-paths.d.ts.map +1 -0
- package/dist/operations/migration/source-paths.js +308 -0
- package/dist/operations/migration/superseded-closure.d.ts +54 -0
- package/dist/operations/migration/superseded-closure.d.ts.map +1 -0
- package/dist/operations/migration/superseded-closure.js +187 -0
- package/dist/operations/modeling/logic-modeling.d.ts.map +1 -1
- package/dist/operations/modeling/logic-modeling.js +3 -5
- package/dist/operations/modeling/model-requirement.d.ts.map +1 -1
- package/dist/operations/modeling/model-requirement.js +225 -67
- package/dist/operations/mutation/contradictions.d.ts +16 -0
- package/dist/operations/mutation/contradictions.d.ts.map +1 -1
- package/dist/operations/mutation/contradictions.js +32 -0
- package/dist/operations/mutation/delete.d.ts.map +1 -1
- package/dist/operations/mutation/delete.js +15 -7
- package/dist/operations/mutation/origin.d.ts +21 -0
- package/dist/operations/mutation/origin.d.ts.map +1 -0
- package/dist/operations/mutation/origin.js +78 -0
- package/dist/operations/mutation/plan-apply-journal.d.ts +182 -0
- package/dist/operations/mutation/plan-apply-journal.d.ts.map +1 -0
- package/dist/operations/mutation/plan-apply-journal.js +613 -0
- package/dist/operations/mutation/predicate-vocabulary-guard.d.ts +3 -1
- package/dist/operations/mutation/predicate-vocabulary-guard.d.ts.map +1 -1
- package/dist/operations/mutation/predicate-vocabulary-guard.js +13 -2
- package/dist/operations/mutation/relationships.d.ts +5 -5
- package/dist/operations/mutation/relationships.d.ts.map +1 -1
- package/dist/operations/mutation/relationships.js +31 -11
- package/dist/operations/mutation/serialization.d.ts.map +1 -1
- package/dist/operations/mutation/serialization.js +3 -1
- 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 +7 -1
- package/dist/operations/mutation/symbol-refresh.d.ts.map +1 -1
- package/dist/operations/mutation/symbol-refresh.js +4 -1
- package/dist/operations/mutation/types.d.ts +14 -0
- package/dist/operations/mutation/types.d.ts.map +1 -1
- package/dist/operations/mutation/upsert.d.ts +30 -3
- package/dist/operations/mutation/upsert.d.ts.map +1 -1
- package/dist/operations/mutation/upsert.js +105 -35
- package/dist/operations/mutation/validate-upsert.d.ts +6 -0
- package/dist/operations/mutation/validate-upsert.d.ts.map +1 -1
- package/dist/operations/mutation/validate-upsert.js +34 -30
- package/dist/operations/planning/apply-plan.d.ts.map +1 -1
- package/dist/operations/planning/apply-plan.js +751 -144
- package/dist/operations/planning/compile-intent.d.ts +34 -1
- package/dist/operations/planning/compile-intent.d.ts.map +1 -1
- package/dist/operations/planning/compile-intent.js +314 -98
- package/dist/operations/proof/code-scope.d.ts +28 -0
- package/dist/operations/proof/code-scope.d.ts.map +1 -1
- package/dist/operations/proof/code-scope.js +72 -0
- package/dist/operations/proof/compact-receipts.d.ts +49 -0
- package/dist/operations/proof/compact-receipts.d.ts.map +1 -0
- package/dist/operations/proof/compact-receipts.js +160 -0
- package/dist/operations/proof/ingest-proof.d.ts +2 -0
- package/dist/operations/proof/ingest-proof.d.ts.map +1 -1
- package/dist/operations/proof/ingest-proof.js +44 -23
- package/dist/operations/proof/prune-receipts.d.ts.map +1 -1
- package/dist/operations/proof/prune-receipts.js +5 -9
- package/dist/operations/proof/receipt-compaction.d.ts +48 -0
- package/dist/operations/proof/receipt-compaction.d.ts.map +1 -0
- package/dist/operations/proof/receipt-compaction.js +121 -0
- package/dist/operations/semantic-advisor/analysis-receipt.d.ts.map +1 -1
- package/dist/operations/semantic-advisor/analysis-receipt.js +12 -1
- package/dist/operations/semantic-advisor/analyze-prose.d.ts +2 -1
- package/dist/operations/semantic-advisor/analyze-prose.d.ts.map +1 -1
- package/dist/operations/semantic-advisor/analyze-prose.js +51 -5
- package/dist/operations/semantic-advisor/clauses.d.ts +1 -0
- package/dist/operations/semantic-advisor/clauses.d.ts.map +1 -1
- package/dist/operations/semantic-advisor/clauses.js +11 -1
- package/dist/operations/semantic-advisor/conditional-rules.d.ts +33 -0
- package/dist/operations/semantic-advisor/conditional-rules.d.ts.map +1 -0
- package/dist/operations/semantic-advisor/conditional-rules.js +262 -0
- package/dist/operations/semantic-advisor/ingestion-boundary.d.ts +3 -1
- package/dist/operations/semantic-advisor/ingestion-boundary.d.ts.map +1 -1
- package/dist/operations/semantic-advisor/ingestion-boundary.js +14 -6
- package/dist/operations/semantic-advisor/plugin-orchestration.js +1 -1
- package/dist/prolog/codec.d.ts.map +1 -1
- package/dist/prolog/codec.js +2 -1
- package/dist/prolog.d.ts +9 -0
- package/dist/prolog.d.ts.map +1 -1
- package/dist/prolog.js +56 -10
- package/dist/proof/command-test-report.d.ts +74 -0
- package/dist/proof/command-test-report.d.ts.map +1 -0
- package/dist/proof/command-test-report.js +206 -0
- package/dist/public/branch-resolver.d.ts +1 -0
- package/dist/public/branch-resolver.d.ts.map +1 -1
- package/dist/public/branch-resolver.js +1 -0
- package/dist/public/diagnostic-usage.d.ts +14 -0
- package/dist/public/diagnostic-usage.d.ts.map +1 -1
- package/dist/public/diagnostic-usage.js +55 -1
- package/dist/public/entity-origin.d.ts +69 -0
- package/dist/public/entity-origin.d.ts.map +1 -0
- package/dist/public/entity-origin.js +142 -0
- package/dist/public/impact/full-kb-quality.d.ts.map +1 -1
- package/dist/public/impact/full-kb-quality.js +1 -0
- package/dist/public/impact/requirement-quality.js +1 -1
- package/dist/public/operations/catalog.d.ts +203 -20
- package/dist/public/operations/catalog.d.ts.map +1 -1
- package/dist/public/operations/catalog.js +3 -0
- package/dist/public/operations/check-executor.d.ts.map +1 -1
- package/dist/public/operations/check-executor.js +8 -0
- package/dist/public/operations/contracts.d.ts +0 -5
- package/dist/public/operations/contracts.d.ts.map +1 -1
- package/dist/public/operations/contracts.js +63 -14
- package/dist/public/operations/discovery-entities.d.ts +15 -0
- package/dist/public/operations/discovery-entities.d.ts.map +1 -1
- package/dist/public/operations/discovery-entities.js +59 -0
- package/dist/public/operations/discovery-executors.d.ts +6 -1
- package/dist/public/operations/discovery-executors.d.ts.map +1 -1
- package/dist/public/operations/discovery-executors.js +65 -6
- package/dist/public/operations/index.d.ts +1 -0
- package/dist/public/operations/index.d.ts.map +1 -1
- package/dist/public/operations/index.js +1 -0
- package/dist/public/operations/migration-plan.d.ts +5 -0
- package/dist/public/operations/migration-plan.d.ts.map +1 -1
- package/dist/public/operations/migration-plan.js +26 -1
- package/dist/public/operations/node-ports.d.ts.map +1 -1
- package/dist/public/operations/node-ports.js +24 -3
- package/dist/public/operations/origin-review.d.ts +51 -0
- package/dist/public/operations/origin-review.d.ts.map +1 -0
- package/dist/public/operations/origin-review.js +307 -0
- package/dist/public/operations/predicate-schema-conformance.js +1 -1
- package/dist/public/operations/repair-plan.d.ts.map +1 -1
- package/dist/public/operations/repair-plan.js +4 -0
- package/dist/public/operations/result-envelope.d.ts.map +1 -1
- package/dist/public/operations/result-envelope.js +17 -5
- package/dist/public/operations/runtime-types.d.ts +9 -0
- package/dist/public/operations/runtime-types.d.ts.map +1 -1
- package/dist/public/operations/schema6-check-actions.d.ts +127 -0
- package/dist/public/operations/schema6-check-actions.d.ts.map +1 -0
- package/dist/public/operations/schema6-check-actions.js +575 -0
- package/dist/public/operations/source-path-dangling.d.ts +17 -0
- package/dist/public/operations/source-path-dangling.d.ts.map +1 -0
- package/dist/public/operations/source-path-dangling.js +66 -0
- package/dist/public/operations/specs/bootstrap.d.ts +73 -1
- package/dist/public/operations/specs/bootstrap.d.ts.map +1 -1
- package/dist/public/operations/specs/bootstrap.js +66 -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 +15 -1
- package/dist/public/operations/specs/check.d.ts +2 -2
- package/dist/public/operations/specs/check.js +1 -1
- package/dist/public/operations/specs/composite.d.ts +351 -0
- package/dist/public/operations/specs/composite.d.ts.map +1 -0
- package/dist/public/operations/specs/composite.js +96 -0
- package/dist/public/operations/specs/discovery.d.ts +8 -3
- package/dist/public/operations/specs/discovery.d.ts.map +1 -1
- package/dist/public/operations/specs/discovery.js +8 -3
- package/dist/public/operations/specs/modeling.d.ts +2 -2
- package/dist/public/operations/specs/modeling.js +2 -2
- package/dist/public/operations/specs/mutation-schemas.d.ts +73 -8
- package/dist/public/operations/specs/mutation-schemas.d.ts.map +1 -1
- package/dist/public/operations/specs/mutation-schemas.js +43 -7
- package/dist/public/operations/specs/mutation.d.ts +1 -1
- package/dist/public/operations/specs/mutation.js +1 -1
- package/dist/public/operations/specs/planning.d.ts +2 -2
- package/dist/public/operations/specs/planning.js +4 -4
- package/dist/public/operations/specs/reporting.d.ts.map +1 -1
- package/dist/public/operations/specs/reporting.js +13 -26
- package/dist/public/operations/specs/upsert.d.ts +79 -9
- package/dist/public/operations/specs/upsert.d.ts.map +1 -1
- package/dist/public/operations/specs/upsert.js +6 -1
- package/dist/public/operations/symbol-repair-plan.d.ts.map +1 -1
- package/dist/public/operations/symbol-repair-plan.js +3 -1
- package/dist/public/operations/types.d.ts +1 -1
- package/dist/public/operations/types.d.ts.map +1 -1
- package/dist/public/proof-receipt.d.ts +1 -0
- package/dist/public/proof-receipt.d.ts.map +1 -1
- package/dist/public/schemas/entity.d.ts.map +1 -1
- package/dist/public/schemas/entity.js +52 -0
- package/dist/public/schemas/relationship.d.ts.map +1 -1
- package/dist/public/schemas/relationship.js +2 -0
- package/dist/public/skills/kibi-bootstrap/SKILL.md +52 -11
- package/dist/public/skills/kibi-bootstrap/resources/bootstrap.md +12 -1
- package/dist/public/skills/kibi-usage/SKILL.md +82 -18
- package/dist/public/skills/kibi-usage/resources/fact-lanes.md +5 -5
- package/dist/public/skills/kibi-usage/resources/kb-improvement.md +1 -1
- package/dist/public/skills/kibi-usage/resources/logic-ir.md +2 -2
- package/dist/public/skills/kibi-usage/resources/operation-access.md +29 -1
- package/dist/public/skills/kibi-usage/resources/ui-requirements.md +4 -4
- package/dist/public/skills/kibi-usage/resources/workflows.md +42 -25
- package/dist/public/telemetry-acceptance.d.ts +64 -0
- package/dist/public/telemetry-acceptance.d.ts.map +1 -1
- package/dist/public/telemetry-acceptance.js +143 -7
- package/dist/public/telemetry-remediation.d.ts.map +1 -1
- package/dist/public/telemetry-remediation.js +26 -10
- package/dist/relationships/shards.d.ts +13 -0
- package/dist/relationships/shards.d.ts.map +1 -1
- package/dist/relationships/shards.js +54 -28
- package/dist/runtime/cli-runtime.d.ts.map +1 -1
- package/dist/runtime/cli-runtime.js +44 -3
- package/dist/runtime/detached-snapshot.d.ts +38 -0
- package/dist/runtime/detached-snapshot.d.ts.map +1 -0
- package/dist/runtime/detached-snapshot.js +92 -0
- package/dist/schemas/entity.schema.json +122 -0
- package/dist/search-answer.d.ts +157 -0
- package/dist/search-answer.d.ts.map +1 -0
- package/dist/search-answer.js +846 -0
- package/dist/traceability/impact-knowledge.d.ts.map +1 -1
- package/dist/traceability/impact-knowledge.js +7 -0
- package/dist/traceability/symbol-extract.js +3 -3
- package/dist/traceability/temp-kb.d.ts.map +1 -1
- package/dist/traceability/temp-kb.js +12 -0
- package/dist/types/entities.d.ts +13 -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/branch-resolver.d.ts +37 -1
- package/dist/utils/branch-resolver.d.ts.map +1 -1
- package/dist/utils/branch-resolver.js +130 -3
- package/dist/utils/repo-relative-path.d.ts +18 -0
- package/dist/utils/repo-relative-path.d.ts.map +1 -0
- package/dist/utils/repo-relative-path.js +58 -0
- package/dist/utils/rule-registry.generated.d.ts +75 -3
- package/dist/utils/rule-registry.generated.d.ts.map +1 -1
- package/dist/utils/rule-registry.generated.js +89 -3
- package/dist/utils/schema-version.d.ts +1 -1
- package/dist/utils/schema-version.d.ts.map +1 -1
- package/dist/utils/schema-version.js +4 -3
- package/dist/utils/strict-modeling.d.ts +1 -1
- package/dist/utils/strict-modeling.d.ts.map +1 -1
- package/dist/utils/strict-modeling.js +23 -3
- package/package.json +3 -3
- package/schema/entities.pl +22 -0
- package/schema/relationships.pl +14 -0
- package/schema/validation.pl +45 -1
- package/src/public/branch-resolver.ts +1 -0
- package/src/public/diagnostic-usage.ts +59 -1
- package/src/public/entity-origin.ts +175 -0
- package/src/public/impact/full-kb-quality.ts +1 -0
- package/src/public/impact/requirement-quality.ts +1 -1
- package/src/public/operations/catalog.ts +3 -0
- package/src/public/operations/check-executor.ts +15 -0
- package/src/public/operations/contracts.ts +75 -15
- package/src/public/operations/discovery-entities.ts +74 -0
- package/src/public/operations/discovery-executors.ts +88 -10
- package/src/public/operations/index.ts +1 -0
- package/src/public/operations/migration-plan.ts +30 -1
- package/src/public/operations/node-ports.ts +24 -3
- package/src/public/operations/origin-review.ts +375 -0
- package/src/public/operations/predicate-schema-conformance.ts +1 -1
- package/src/public/operations/repair-plan.ts +4 -0
- package/src/public/operations/result-envelope.ts +18 -6
- package/src/public/operations/runtime-types.ts +9 -0
- package/src/public/operations/schema6-check-actions.ts +699 -0
- package/src/public/operations/source-path-dangling.ts +81 -0
- package/src/public/operations/specs/bootstrap.ts +78 -4
- package/src/public/operations/specs/check-rules.generated.ts +15 -1
- package/src/public/operations/specs/check.ts +1 -1
- package/src/public/operations/specs/composite.ts +141 -0
- package/src/public/operations/specs/discovery.ts +9 -3
- package/src/public/operations/specs/modeling.ts +2 -2
- package/src/public/operations/specs/mutation-schemas.ts +49 -7
- package/src/public/operations/specs/mutation.ts +1 -1
- package/src/public/operations/specs/planning.ts +4 -4
- package/src/public/operations/specs/reporting.ts +13 -38
- package/src/public/operations/specs/upsert.ts +7 -1
- package/src/public/operations/symbol-repair-plan.ts +3 -1
- package/src/public/operations/types.ts +2 -0
- package/src/public/proof-receipt.ts +1 -0
- package/src/public/schemas/entity.ts +57 -0
- package/src/public/schemas/relationship.ts +2 -0
- package/src/public/skills/kibi-bootstrap/SKILL.md +52 -11
- package/src/public/skills/kibi-bootstrap/resources/bootstrap.md +12 -1
- package/src/public/skills/kibi-usage/SKILL.md +82 -18
- package/src/public/skills/kibi-usage/resources/fact-lanes.md +5 -5
- package/src/public/skills/kibi-usage/resources/kb-improvement.md +1 -1
- package/src/public/skills/kibi-usage/resources/logic-ir.md +2 -2
- package/src/public/skills/kibi-usage/resources/operation-access.md +29 -1
- package/src/public/skills/kibi-usage/resources/ui-requirements.md +4 -4
- package/src/public/skills/kibi-usage/resources/workflows.md +42 -25
- package/src/public/telemetry-acceptance-types.d.ts +4 -1
- package/src/public/telemetry-acceptance.ts +210 -7
- package/src/public/telemetry-remediation.ts +39 -10
- package/src/schemas/entity.schema.json +122 -0
- package/src/schemas/relationship.schema.json +2 -0
|
@@ -4,11 +4,12 @@ Generated from the public `OperationSpec` catalog. CLI JSON and MCP structured
|
|
|
4
4
|
content use the same `KibiResult` envelope (protocol 1); result data is versioned
|
|
5
5
|
per operation. Effects are authoritative for mutability and adapter annotations.
|
|
6
6
|
|
|
7
|
-
|
|
|
7
|
+
| Operation | CLI route | Input mode | Mutability | Requires Prolog | Effects | Interface | Result version | Destructive | Retry safety | Open-world | Output schema |
|
|
8
8
|
|---|---|---|---|---|---|---|---|---|---|---|---|
|
|
9
9
|
| `kb_skills_list` | `skills-list` | --input JSON | read | no | local-read | peer; capability-selected | kibi.kb_skills_list.v1 | no | safe | no | yes |
|
|
10
10
|
| `kb_skills_load` | `skills-load` | --input JSON | read | no | local-read | peer; capability-selected | kibi.kb_skills_load.v1 | no | safe | no | yes |
|
|
11
11
|
| `kb_skills_read` | `skills-read` | --input JSON | read | no | local-read | peer; capability-selected | kibi.kb_skills_read.v1 | no | safe | no | yes |
|
|
12
|
+
| `kb_skills` | `skill` | --input JSON | read | no | local-read | peer; capability-selected | kibi.kb_skills.v1 | no | safe | no | yes |
|
|
12
13
|
| `kb_query` | `query` | --input JSON or flags | read | yes | kb-read | peer; capability-selected | kibi.kb_query.v1 | no | safe | no | yes |
|
|
13
14
|
| `kb_search` | `search` | --input JSON or flags | read | yes | kb-read | peer; capability-selected | kibi.kb_search.v1 | no | safe | no | yes |
|
|
14
15
|
| `kb_status` | `status` | --input JSON or flags | read | no | kb-read, workspace-read | peer; capability-selected | kibi.kb_status.v1 | no | safe | no | yes |
|
|
@@ -18,6 +19,7 @@ per operation. Effects are authoritative for mutability and adapter annotations.
|
|
|
18
19
|
| `kb_semantic_advisor` | `semantic-advisor` | --input JSON | read | no | local-read | peer; capability-selected | kibi.kb_semantic_advisor.v1 | no | safe | no | yes |
|
|
19
20
|
| `kb_model_requirement` | `model-requirement` | --input JSON | read | yes | kb-read | peer; capability-selected | kibi.kb_model_requirement.v1 | no | safe | no | yes |
|
|
20
21
|
| `kb_suggest_predicates` | `suggest-predicates` | --input JSON | read | yes | kb-read | peer; capability-selected | kibi.kb_suggest_predicates.v1 | no | safe | no | yes |
|
|
22
|
+
| `kb_model` | `model` | --input JSON | read | yes | kb-read | peer; capability-selected | kibi.kb_model.v1 | no | safe | no | yes |
|
|
21
23
|
| `kb_plan_bootstrap` | `plan-bootstrap` | --input JSON | read | no | workspace-read | peer; capability-selected | kibi.kb_plan_bootstrap.v1 | no | safe | no | yes |
|
|
22
24
|
| `kb_validate_upsert` | `validate-upsert` | --input JSON | read | yes | kb-read | peer; capability-selected | kibi.kb_validate_upsert.v1 | no | safe | no | yes |
|
|
23
25
|
| `kb_upsert` | `upsert` | --input JSON | write | yes | kb-write, workspace-write | peer; capability-selected | kibi.kb_upsert.v1 | yes | unsafe | no | yes |
|
|
@@ -29,6 +31,28 @@ per operation. Effects are authoritative for mutability and adapter annotations.
|
|
|
29
31
|
| `kb_apply_plan` | `apply-plan` | --input JSON | write | yes | kb-read, kb-write, workspace-read, workspace-write | peer; capability-selected | kibi.kb_apply_plan.v1 | yes | unsafe | no | yes |
|
|
30
32
|
| `kb_ingest_proof` | `ingest-proof` | --input JSON | write | yes | kb-read, kb-write, workspace-read | peer; capability-selected | kibi.kb_ingest_proof.v1 | yes | unsafe | no | yes |
|
|
31
33
|
|
|
34
|
+
## MCP tools versus catalog operations
|
|
35
|
+
|
|
36
|
+
The MCP server registers 16 tools. Most carry their catalog operation name; the
|
|
37
|
+
operations below are reached through a consolidated MCP call instead, while the
|
|
38
|
+
CLI keeps their dedicated routes. Result payloads (for example
|
|
39
|
+
`recommended_tools`, `suggested_next_tool`, or repair-plan steps) still name
|
|
40
|
+
catalog operations, so translate them with this list.
|
|
41
|
+
|
|
42
|
+
- `kb_skills_list`: MCP `kb_skills` with `action: "list"`; CLI `kibi skills list` (`skills-list`)
|
|
43
|
+
- `kb_skills_load`: MCP `kb_skills` with `action: "load"`; CLI `kibi skills load` (`skills-load`)
|
|
44
|
+
- `kb_skills_read`: MCP `kb_skills` with `action: "read"`; CLI `kibi skills read` (`skills-read`)
|
|
45
|
+
- `kb_semantic_advisor`: MCP `kb_model` with `mode: "analyze"`; CLI `kibi semantic-advisor` (`semantic-advisor`)
|
|
46
|
+
- `kb_model_requirement`: MCP `kb_model` with `mode: "requirement"`; CLI `kibi model-requirement` (`model-requirement`)
|
|
47
|
+
- `kb_suggest_predicates`: MCP `kb_model` with `mode: "predicates"`; CLI `kibi suggest-predicates` (`suggest-predicates`)
|
|
48
|
+
- `kb_validate_upsert`: MCP `kb_upsert` with `dryRun: true`; CLI `kibi validate-upsert` (`validate-upsert`)
|
|
49
|
+
- `kb_sparql_remote`: MCP `kb_sparql_remote`, registered only when `KIBI_MCP_OPTIONAL_TOOLS` names it; CLI `kibi sparql-remote` (`sparql-remote`)
|
|
50
|
+
|
|
51
|
+
The consolidated tools also have their own CLI routes: `kibi skill` for
|
|
52
|
+
`kb_skills` and `kibi model` for `kb_model`. `kb_job_status` is likewise
|
|
53
|
+
opt-in through `KIBI_MCP_OPTIONAL_TOOLS`; without it, `kb_check` with
|
|
54
|
+
`async: true` runs synchronously.
|
|
55
|
+
|
|
32
56
|
## JSON execution recipe
|
|
33
57
|
|
|
34
58
|
Use a trusted project-local, non-installing runner. Stdin contains one UTF-8 JSON
|
|
@@ -41,3 +65,7 @@ printf '%s\n' '{"query":"authentication","limit":10}' | npx --no-install kibi se
|
|
|
41
65
|
`_diagnostic_telemetry` is adapter metadata, not business input. Never copy it
|
|
42
66
|
into entity properties. On `committed_with_repairs`, follow typed required
|
|
43
67
|
`nextActions` and do not retry the original mutation.
|
|
68
|
+
|
|
69
|
+
`workspaceRoot` is an MCP-only routing argument naming the directory a call is
|
|
70
|
+
about (see the kibi-usage skill). The CLI JSON routes do not accept it; they
|
|
71
|
+
always run in the current directory.
|
|
@@ -82,14 +82,14 @@ diagnostics (`symbol_semantic_review_needed`).
|
|
|
82
82
|
|
|
83
83
|
## Workflow
|
|
84
84
|
|
|
85
|
-
1. `
|
|
86
|
-
2. Relational clauses: `
|
|
85
|
+
1. `kb_model` (`mode: "analyze"`) on the full description; audit or supply `clauses`.
|
|
86
|
+
2. Relational clauses: `kb_model` (`mode: "predicates"`), apply the predicate plan and
|
|
87
87
|
`requires_predicate`.
|
|
88
|
-
3. Scalar placement/alignment/order clauses: `
|
|
88
|
+
3. Scalar placement/alignment/order clauses: `kb_model` (`mode: "requirement"`), apply the strict
|
|
89
89
|
subject/property plan and `constrains` / `requires_property`.
|
|
90
90
|
4. Preserve `claim_key` / `claim_text`; merge every key into the requirement
|
|
91
91
|
`logic_claims` manifest.
|
|
92
|
-
5. `
|
|
92
|
+
5. `kb_upsert` with `dryRun: true`, create endpoints first, then sequential `kb_upsert`.
|
|
93
93
|
6. `kb_check` with `logic-coverage`, `predicate-verifiability`, `domain-contradictions`,
|
|
94
94
|
then a final unfiltered `kb_check`.
|
|
95
95
|
|
|
@@ -35,21 +35,22 @@ edits dependency configuration.
|
|
|
35
35
|
|
|
36
36
|
## Choosing a discovery mode
|
|
37
37
|
|
|
38
|
-
`kb_search`
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
decide
|
|
38
|
+
`kb_search` defaults to deterministic intent ranking (`rankingMode:
|
|
39
|
+
"intent-v1"`), so a natural-language question is a valid query. Pass
|
|
40
|
+
`rankingMode: "legacy"` for the older lexical ranking. The inputs, not the tool
|
|
41
|
+
name, decide how results are ranked.
|
|
42
42
|
|
|
43
43
|
- **Exact identity** — you already know the ID. Use `kb_query`, not search.
|
|
44
44
|
- **Literal token** — a symbol, file, or error string that appears verbatim.
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
45
|
+
Keep the query close to the literal text; `rankingMode: "legacy"` ranks it
|
|
46
|
+
lexically.
|
|
47
|
+
- **Question or behavior** — "what governs how checkout handles a declined
|
|
48
|
+
card?". Ask it directly, and ground it with facets from what you actually
|
|
49
|
+
know:
|
|
48
50
|
|
|
49
51
|
```json
|
|
50
52
|
{
|
|
51
|
-
"query": "declined card during checkout",
|
|
52
|
-
"rankingMode": "intent-v1",
|
|
53
|
+
"query": "what governs a declined card during checkout?",
|
|
53
54
|
"semanticFacets": {
|
|
54
55
|
"actors": ["shopper"],
|
|
55
56
|
"actions": ["pay"],
|
|
@@ -66,7 +67,6 @@ decide the path.
|
|
|
66
67
|
```json
|
|
67
68
|
{
|
|
68
69
|
"query": "checkout total rounding",
|
|
69
|
-
"rankingMode": "intent-v1",
|
|
70
70
|
"sourceLocations": [{ "path": "src/checkout.ts", "symbol": "computeTotal" }]
|
|
71
71
|
}
|
|
72
72
|
```
|
|
@@ -75,8 +75,25 @@ Supply facets only from the request, the code, or prior results. Inventing
|
|
|
75
75
|
facets fabricates evidence and biases ranking. Intent mode abstains below
|
|
76
76
|
`minScore` instead of returning weak matches; an abstention is an explicit
|
|
77
77
|
no-answer, so widen the query or drop to lexical search rather than treating it
|
|
78
|
-
as "nothing exists".
|
|
79
|
-
|
|
78
|
+
as "nothing exists". A literal identifier lookup is still best served
|
|
79
|
+
lexically.
|
|
80
|
+
|
|
81
|
+
On the first page, intent mode also returns an answer layer in `data.answer`
|
|
82
|
+
(`kibi.search-answer.v1`; turn it off with `answer: false`):
|
|
83
|
+
|
|
84
|
+
- `governing` — current requirements matched by the query or linked to a
|
|
85
|
+
matched entity, each with `via` (how it was reached) and its linked `facts`,
|
|
86
|
+
`scenarios`, `tests`, and `adrs`.
|
|
87
|
+
- `rationale` — ADRs that explain the decisions.
|
|
88
|
+
- `notGoverning` — superseded or deprecated requirements, with `supersededBy`
|
|
89
|
+
when known. Never read these as current policy; superseded entities are also
|
|
90
|
+
demoted in the ranked results.
|
|
91
|
+
- `observations` — observation/meta facts, which are notes, not rules.
|
|
92
|
+
- `truncated` and `note` — the layer is size-bounded; an empty `governing`
|
|
93
|
+
list is not evidence that nothing governs the change.
|
|
94
|
+
|
|
95
|
+
The answer layer is graph traversal: discovery, not proof. Use `kb_check` and
|
|
96
|
+
`kb_coverage` for consistency and proof status.
|
|
80
97
|
|
|
81
98
|
Results are summaries by default: identifying metadata, score, reasons, and a
|
|
82
99
|
snippet. Read them to pick candidates, then `kb_query` those IDs for full
|
|
@@ -88,12 +105,12 @@ planning a behavior change; a search receipt is not comprehension.
|
|
|
88
105
|
|
|
89
106
|
The canonical workflow for any KB operation follows this pattern:
|
|
90
107
|
|
|
91
|
-
1. **Discover**: `kb_search` with focused probes; pick the mode above
|
|
108
|
+
1. **Discover**: `kb_search` with focused probes or a direct question; read `data.answer`, and pick the mode above
|
|
92
109
|
2. **Confirm**: `kb_query` for exact IDs and state
|
|
93
110
|
3. **Inspect**: `kb_status` when freshness matters
|
|
94
|
-
4. **Decompose**: `
|
|
95
|
-
5. **Choose per-clause lanes**: strict facts for scalar claims; `
|
|
96
|
-
6. **Preflight**: `
|
|
111
|
+
4. **Decompose**: `kb_model` (`mode: "analyze"`) on the complete normative prose; verify or supply every atomic clause
|
|
112
|
+
5. **Choose per-clause lanes**: strict facts for scalar claims; `kb_model` `mode: "predicates"` for approved ground ontology relations; `kb_model` `mode: "requirement"` with `kibi.logic.v1` for conditions, exceptions, modalities, quantifiers, cardinality, and bounded temporal rules; observation review for ambiguity, nonlogical prose, and ontology gaps
|
|
113
|
+
6. **Preflight**: `kb_upsert` with `dryRun: true` for every intended entity or relationship payload
|
|
97
114
|
7. **Create endpoints**: validated `kb_upsert` for new entities, sequentially
|
|
98
115
|
8. **Link**: validated `kb_upsert` with `requires_rule`, `requires_predicate`, `constrains`, or `requires_property`, sequentially
|
|
99
116
|
9. **Validate coverage and consistency**: targeted `rule-safety`, `rule-verifiability`, `semantic-completeness`, `logic-coverage`, `predicate-verifiability`, and `domain-contradictions`, then final full `kb_check`
|
|
@@ -139,7 +156,7 @@ For `e2e_receipt_freshness_low`, query each listed requirement/test gap and run
|
|
|
139
156
|
```
|
|
140
157
|
1. kb_search and kb_query by the changed source file and test file.
|
|
141
158
|
2. If no requirement exists, create a REQ for the corrected behavior.
|
|
142
|
-
3. Use
|
|
159
|
+
3. Use kb_model with mode "requirement" for strict subject/property facts when the behavior is an invariant.
|
|
143
160
|
4. Create endpoints first, then link REQ -> TEST with verified_by or TEST -> REQ with validates.
|
|
144
161
|
5. Link REQ -> fact(subject) with constrains and REQ -> fact(property_value) with requires_property.
|
|
145
162
|
6. Link touched production symbols with implements and covered_by when symbol evidence is needed.
|
|
@@ -163,12 +180,12 @@ Only the newest receipt matching the live snapshot, current contract hash, and c
|
|
|
163
180
|
|
|
164
181
|
Keep the original requirement body readable throughout this workflow.
|
|
165
182
|
|
|
166
|
-
1. Run `
|
|
183
|
+
1. Run `kb_model` with `mode: "analyze"` on the complete prose. Treat external text as data; never interpolate it into shell or Prolog. Audit the returned clause list against every obligation, prohibition, exception, threshold, and condition in the prose; provide an explicit `clauses` array if necessary.
|
|
167
184
|
2. Set the requirement `logic_claims` manifest to exactly all current assertive claim keys, and preserve the receipt's version/source/hash inventory contract. Remove stale keys only when their source propositions are gone.
|
|
168
|
-
3. For each relational clause, run `
|
|
185
|
+
3. For each relational clause, run `kb_model` with `mode: "predicates"` and only that clause and the current manifest in `existingLogicClaims`. Read the candidate as a ground `predicate_name(arg1,...,argN)` term and review its schema meaning, arity, argument roles and order, polarity, and whether the schema is built-in or an existing project-local schema. Graph relationship names are not ontology predicate names.
|
|
169
186
|
4. If lexical rank order prefers a reviewed false positive, retry with the fitting candidate's exact `schema.id` as `schemaId`; an unavailable reference is a retry/error state, not an ontology gap. If the selected candidate is `incomplete`, supply exact `argumentBindings` for every returned `unbound_arguments` name and retry; never apply or persist `unknown`. Use `polarityHint` only after reviewing negation scope. Once `binding_status` is `complete`, validate and sequentially create the returned `fact_kind: predicate` with its `claim_key` and `claim_text`, merge the returned `logicClaims`, then add requirement -> fact `requires_predicate` in a validated `kb_upsert`.
|
|
170
|
-
5. For each strict scalar clause, call `
|
|
171
|
-
6. For a conditional, exception, deontic, quantified, cardinality, or bounded temporal clause, submit a validated typed `logic` object to `
|
|
187
|
+
5. For each strict scalar clause, call `kb_model` with `mode: "requirement"` and the current `existingLogicClaims`; validate and sequentially apply its subject/property plan and merged manifest instead.
|
|
188
|
+
6. For a conditional, exception, deontic, quantified, cardinality, or bounded temporal clause, submit a validated typed `logic` object to `kb_model` with `mode: "requirement"`. Apply its `rule_schema` and `rule` facts sequentially and link the requirement with `requires_rule`; rendered Prolog is for inspection only.
|
|
172
189
|
7. If wording is ambiguous, a candidate is only a lexical false positive, or no schema/IR interpretation fits, create the advised observation review artifact and apply its returned `relates_to` review anchor when present; report that claim key as unresolved. Use `review:ambiguity` for unresolved interpretation, `review:keyword-false-positive` for a vocabulary match that is not a domain assertion, and `review:ontology-gap` only for a true catalog gap. Define a new `predicate_schema` only when the task explicitly authorizes ontology extension and provides a stable signature.
|
|
173
190
|
8. Read back the requirement, proposition ledger, and all facts. Confirm every manifest key occurs on exactly one intended ground fact/rule, no punctuation variant minted a second claim, and no two claim keys encode the same logical term. Exact query output may represent repeated relationship types as arrays, so inspect every target. Then run `kb_check` with `rule-safety`, `rule-verifiability`, `semantic-completeness`, `logic-coverage`, `predicate-verifiability`, and `domain-contradictions`. Finish with an unfiltered `kb_check`.
|
|
174
191
|
|
|
@@ -183,12 +200,12 @@ On resume after interruption, repeat `kb_query` for exact endpoints and apply on
|
|
|
183
200
|
Optional per-project workflow for recording what the screen should look like. Non-UI projects skip this lane entirely.
|
|
184
201
|
|
|
185
202
|
1. Create a prose `req` holding the full visual description; it is the searchable anchor agents discover before touching a UI file.
|
|
186
|
-
2. Run `
|
|
187
|
-
3. For relational layout clauses ("X must remain visually aligned with Y"), call `
|
|
188
|
-
4. For scalar placement, alignment, and ordering clauses, call `
|
|
203
|
+
2. Run `kb_model` with `mode: "analyze"` on the description; audit or supply `clauses`.
|
|
204
|
+
3. For relational layout clauses ("X must remain visually aligned with Y"), call `kb_model` with `mode: "predicates"`, apply the returned `fact_kind: predicate` plan with `predicate_name: visual_layout_rule` and `requires_predicate`.
|
|
205
|
+
4. For scalar placement, alignment, and ordering clauses, call `kb_model` with `mode: "requirement"` and apply strict `fact_kind: subject` / `fact_kind: property_value` facts linked with `constrains` / `requires_property`. Model header order as indexed property keys (`nav_order_1`, `nav_order_2`, ...) against one subject region.
|
|
189
206
|
5. Preserve `claim_key` / `claim_text` on every ground fact and merge every key into the requirement `logic_claims` manifest.
|
|
190
207
|
6. Model UI components as `symbol` entities with `sourceFile` and `symbol_role: behavioral`, linked `implements` to the requirement.
|
|
191
|
-
7. `
|
|
208
|
+
7. `kb_upsert` with `dryRun: true`, create endpoints first, then sequential `kb_upsert`. Run `kb_check` with `logic-coverage`, `predicate-verifiability`, and `domain-contradictions`, then a final unfiltered `kb_check`.
|
|
192
209
|
|
|
193
210
|
Incompatible values on the same subject/property from two current requirements are rejected on write; change an intentional value via a replacement requirement linked with `supersedes`. Full payloads are in `resources/ui-requirements.md`.
|
|
194
211
|
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
// implements REQ-kibi-telemetry-acceptance-gate
|
|
1
|
+
// implements REQ-kibi-telemetry-acceptance-gate-v2
|
|
2
2
|
export type TelemetryMetricStatus =
|
|
3
3
|
| "passed"
|
|
4
4
|
| "failed"
|
|
@@ -14,6 +14,7 @@ export type TelemetryMetricId =
|
|
|
14
14
|
| "telemetry_completeness"
|
|
15
15
|
| "advisor_before_requirement_write"
|
|
16
16
|
| "validation_before_upsert"
|
|
17
|
+
| "lookup_before_first_edit"
|
|
17
18
|
| "source_lookup_zero_result_rate"
|
|
18
19
|
| "proof_gap_recovery"
|
|
19
20
|
| "e2e_receipt_freshness"
|
|
@@ -59,6 +60,8 @@ export interface TelemetryAcceptancePolicy {
|
|
|
59
60
|
readonly telemetryCompletenessMinimum: number;
|
|
60
61
|
readonly validationBeforeUpsertMinimum: number;
|
|
61
62
|
readonly advisorBeforeRequirementWriteMinimum: number;
|
|
63
|
+
/** Share of host sessions that ran kb_search or kb_query before their first requirement-linked edit. */
|
|
64
|
+
readonly lookupBeforeFirstEditMinimum: number;
|
|
62
65
|
readonly sourceLookupZeroResultMaximum: number;
|
|
63
66
|
readonly preflightMaxAgeSeconds: number;
|
|
64
67
|
readonly advisorMaxAgeSeconds: number;
|
|
@@ -30,6 +30,7 @@ export const DEFAULT_TELEMETRY_ACCEPTANCE_POLICY = {
|
|
|
30
30
|
telemetryCompletenessMinimum: 0.95,
|
|
31
31
|
validationBeforeUpsertMinimum: 1,
|
|
32
32
|
advisorBeforeRequirementWriteMinimum: 1,
|
|
33
|
+
lookupBeforeFirstEditMinimum: 1,
|
|
33
34
|
sourceLookupZeroResultMaximum: 0.2,
|
|
34
35
|
preflightMaxAgeSeconds: 60 * 60,
|
|
35
36
|
advisorMaxAgeSeconds: 24 * 60 * 60,
|
|
@@ -50,10 +51,67 @@ function isRecord(value: unknown): value is Record<string, unknown> {
|
|
|
50
51
|
return Boolean(value) && typeof value === "object" && !Array.isArray(value);
|
|
51
52
|
}
|
|
52
53
|
|
|
54
|
+
// implements REQ-kibi-telemetry-acceptance-gate-v2, REQ-claude-hook-usage-telemetry-v2
|
|
55
|
+
/**
|
|
56
|
+
* A row written by a host plugin hook (`interface: "hook"`). Hooks record
|
|
57
|
+
* agent activity around Kibi calls: which Kibi operation a tool call ran
|
|
58
|
+
* (`hook_action: "kb_usage"`) and which files an edit tool changed, with the
|
|
59
|
+
* requirements those files' symbols implement (`hook_action: "edited"`).
|
|
60
|
+
*/
|
|
61
|
+
export interface TelemetryHookEvent extends TelemetryUsageEvent {
|
|
62
|
+
readonly interface?: string;
|
|
63
|
+
readonly host?: string;
|
|
64
|
+
readonly hook_action?: string;
|
|
65
|
+
readonly path?: string | null;
|
|
66
|
+
readonly requirement_ids?: readonly string[];
|
|
67
|
+
readonly kb_operation?: string | null;
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
// implements REQ-kibi-telemetry-acceptance-gate-v2, REQ-claude-hook-usage-telemetry-v2
|
|
71
|
+
/** A host hook row and where it sits relative to the operation events. */
|
|
72
|
+
export interface TelemetryHookRow {
|
|
73
|
+
readonly event: TelemetryHookEvent;
|
|
74
|
+
/** 1-based `.kb/usage.log` line (array position for in-memory events). */
|
|
75
|
+
readonly logLine: number;
|
|
76
|
+
/** Operation events that precede this row in the log. */
|
|
77
|
+
readonly operationsBefore: number;
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
// implements REQ-kibi-telemetry-acceptance-gate-v2, REQ-claude-hook-usage-telemetry-v2
|
|
81
|
+
/** Operation events and host hook rows of one usage log, kept apart. */
|
|
82
|
+
export interface TelemetryUsagePartition {
|
|
83
|
+
readonly operations: readonly TelemetryUsageEvent[];
|
|
84
|
+
/** 1-based `.kb/usage.log` line of each operation event. */
|
|
85
|
+
readonly operationLines: readonly number[];
|
|
86
|
+
readonly hookRows: readonly TelemetryHookRow[];
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
/**
|
|
90
|
+
* Hook rows and line numbers of every array `parseTelemetryUsageLog`
|
|
91
|
+
* returned. The array itself keeps its operation-only shape, so callers that
|
|
92
|
+
* pass it straight to the analyzers need no change.
|
|
93
|
+
*/
|
|
94
|
+
const parsedUsageLogs = new WeakMap<
|
|
95
|
+
readonly TelemetryUsageEvent[],
|
|
96
|
+
Omit<TelemetryUsagePartition, "operations">
|
|
97
|
+
>();
|
|
98
|
+
|
|
99
|
+
/**
|
|
100
|
+
* Parse Kibi operation events from `.kb/usage.log`.
|
|
101
|
+
*
|
|
102
|
+
* Host plugin hooks share the log and tag their rows `interface: "hook"`.
|
|
103
|
+
* Those rows describe agent activity around Kibi calls, not Kibi operations,
|
|
104
|
+
* so they are left out of the returned array: otherwise a busy editing
|
|
105
|
+
* session would push every operation out of the bounded acceptance window.
|
|
106
|
+
* They stay attached to the array for `partitionTelemetryUsage`, which is how
|
|
107
|
+
* the `lookup_before_first_edit` metric reads them.
|
|
108
|
+
*/
|
|
53
109
|
export function parseTelemetryUsageLog(
|
|
54
110
|
contents: string,
|
|
55
111
|
): TelemetryUsageEvent[] {
|
|
56
112
|
const events: TelemetryUsageEvent[] = [];
|
|
113
|
+
const operationLines: number[] = [];
|
|
114
|
+
const hookRows: TelemetryHookRow[] = [];
|
|
57
115
|
for (const [index, line] of contents.split(/\r?\n/).entries()) {
|
|
58
116
|
const trimmed = line.trim();
|
|
59
117
|
if (!trimmed) continue;
|
|
@@ -71,11 +129,50 @@ export function parseTelemetryUsageLog(
|
|
|
71
129
|
`Failed to parse .kb/usage.log line ${index + 1}: expected object`,
|
|
72
130
|
);
|
|
73
131
|
}
|
|
132
|
+
if (parsed.interface === "hook") {
|
|
133
|
+
hookRows.push({
|
|
134
|
+
event: parsed as TelemetryHookEvent,
|
|
135
|
+
logLine: index + 1,
|
|
136
|
+
operationsBefore: events.length,
|
|
137
|
+
});
|
|
138
|
+
continue;
|
|
139
|
+
}
|
|
74
140
|
events.push(parsed as TelemetryUsageEvent);
|
|
141
|
+
operationLines.push(index + 1);
|
|
75
142
|
}
|
|
143
|
+
parsedUsageLogs.set(events, { operationLines, hookRows });
|
|
76
144
|
return events;
|
|
77
145
|
}
|
|
78
146
|
|
|
147
|
+
// implements REQ-kibi-telemetry-acceptance-gate-v2, REQ-claude-hook-usage-telemetry-v2
|
|
148
|
+
/**
|
|
149
|
+
* Split events into Kibi operations and host hook rows. Arrays from
|
|
150
|
+
* `parseTelemetryUsageLog` carry their hook rows and log lines; any other
|
|
151
|
+
* array is split on `interface: "hook"`, with positions as line numbers.
|
|
152
|
+
*/
|
|
153
|
+
export function partitionTelemetryUsage(
|
|
154
|
+
events: readonly TelemetryUsageEvent[],
|
|
155
|
+
): TelemetryUsagePartition {
|
|
156
|
+
const parsed = parsedUsageLogs.get(events);
|
|
157
|
+
if (parsed !== undefined) return { operations: events, ...parsed };
|
|
158
|
+
const operations: TelemetryUsageEvent[] = [];
|
|
159
|
+
const operationLines: number[] = [];
|
|
160
|
+
const hookRows: TelemetryHookRow[] = [];
|
|
161
|
+
for (const [index, event] of events.entries()) {
|
|
162
|
+
if ((event as TelemetryHookEvent).interface === "hook") {
|
|
163
|
+
hookRows.push({
|
|
164
|
+
event: event as TelemetryHookEvent,
|
|
165
|
+
logLine: index + 1,
|
|
166
|
+
operationsBefore: operations.length,
|
|
167
|
+
});
|
|
168
|
+
} else {
|
|
169
|
+
operations.push(event);
|
|
170
|
+
operationLines.push(index + 1);
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
return { operations, operationLines, hookRows };
|
|
174
|
+
}
|
|
175
|
+
|
|
79
176
|
function eventArgs(
|
|
80
177
|
event: TelemetryUsageEvent,
|
|
81
178
|
): Readonly<Record<string, unknown>> {
|
|
@@ -363,6 +460,103 @@ function advisorBeforeRequirementWriteMetric(
|
|
|
363
460
|
};
|
|
364
461
|
}
|
|
365
462
|
|
|
463
|
+
// implements REQ-kibi-telemetry-acceptance-gate-v2
|
|
464
|
+
/** Kibi operations that count as looking up requirements before an edit. */
|
|
465
|
+
export const LOOKUP_BEFORE_EDIT_OPERATIONS = ["kb_query", "kb_search"] as const;
|
|
466
|
+
|
|
467
|
+
// implements REQ-kibi-telemetry-acceptance-gate-v2
|
|
468
|
+
/** The first requirement-linked edit of one host session. */
|
|
469
|
+
export interface FirstLinkedEdit {
|
|
470
|
+
/** `<host>:<session_id>` of the session. */
|
|
471
|
+
readonly session: string;
|
|
472
|
+
readonly edit: TelemetryHookRow;
|
|
473
|
+
/** True when kb_search or kb_query ran earlier in the same session. */
|
|
474
|
+
readonly lookedUp: boolean;
|
|
475
|
+
}
|
|
476
|
+
|
|
477
|
+
function hookSession(event: TelemetryHookEvent): string | undefined {
|
|
478
|
+
const sessionId = event.session_id;
|
|
479
|
+
if (typeof sessionId !== "string" || sessionId.length === 0) return undefined;
|
|
480
|
+
return `${event.host ?? "unknown"}:${sessionId}`;
|
|
481
|
+
}
|
|
482
|
+
|
|
483
|
+
// implements REQ-kibi-telemetry-acceptance-gate-v2, REQ-claude-hook-usage-telemetry-v2
|
|
484
|
+
/**
|
|
485
|
+
* For each host session, its first edit of a file whose symbols implement a
|
|
486
|
+
* requirement and whether a Kibi lookup (MCP or CLI) preceded it. Rows
|
|
487
|
+
* without a session id cannot be ordered within a session and are skipped;
|
|
488
|
+
* sessions whose first linked edit predates the evaluated window are left
|
|
489
|
+
* out.
|
|
490
|
+
*/
|
|
491
|
+
export function firstLinkedEdits(
|
|
492
|
+
hookRows: readonly TelemetryHookRow[],
|
|
493
|
+
recentStart: number,
|
|
494
|
+
): FirstLinkedEdit[] {
|
|
495
|
+
const lookedUp = new Set<string>();
|
|
496
|
+
const edited = new Set<string>();
|
|
497
|
+
const firstEdits: FirstLinkedEdit[] = [];
|
|
498
|
+
for (const row of hookRows) {
|
|
499
|
+
const session = hookSession(row.event);
|
|
500
|
+
if (session === undefined) continue;
|
|
501
|
+
const { hook_action: action, kb_operation: operation } = row.event;
|
|
502
|
+
if (
|
|
503
|
+
action === "kb_usage" &&
|
|
504
|
+
LOOKUP_BEFORE_EDIT_OPERATIONS.some((candidate) => candidate === operation)
|
|
505
|
+
) {
|
|
506
|
+
lookedUp.add(session);
|
|
507
|
+
continue;
|
|
508
|
+
}
|
|
509
|
+
if (
|
|
510
|
+
action !== "edited" ||
|
|
511
|
+
edited.has(session) ||
|
|
512
|
+
!Array.isArray(row.event.requirement_ids) ||
|
|
513
|
+
row.event.requirement_ids.length === 0
|
|
514
|
+
) {
|
|
515
|
+
continue;
|
|
516
|
+
}
|
|
517
|
+
edited.add(session);
|
|
518
|
+
if (row.operationsBefore < recentStart) continue;
|
|
519
|
+
firstEdits.push({ session, edit: row, lookedUp: lookedUp.has(session) });
|
|
520
|
+
}
|
|
521
|
+
return firstEdits;
|
|
522
|
+
}
|
|
523
|
+
|
|
524
|
+
function lookupBeforeFirstEditMetric(
|
|
525
|
+
hookRows: readonly TelemetryHookRow[],
|
|
526
|
+
recentStart: number,
|
|
527
|
+
policy: TelemetryAcceptancePolicy,
|
|
528
|
+
): MutableMetric {
|
|
529
|
+
const firstEdits = firstLinkedEdits(hookRows, recentStart);
|
|
530
|
+
const attempts = firstEdits.length;
|
|
531
|
+
const guided = firstEdits.filter((entry) => entry.lookedUp).length;
|
|
532
|
+
const unguidedEditPaths = new Set(
|
|
533
|
+
firstEdits
|
|
534
|
+
.filter((entry) => !entry.lookedUp)
|
|
535
|
+
.map((entry) => entry.edit.event.path ?? "unknown path"),
|
|
536
|
+
);
|
|
537
|
+
|
|
538
|
+
const actual = rate(guided, attempts);
|
|
539
|
+
return {
|
|
540
|
+
id: "lookup_before_first_edit",
|
|
541
|
+
status: thresholdStatus(actual, ">=", policy.lookupBeforeFirstEditMinimum),
|
|
542
|
+
numerator: guided,
|
|
543
|
+
denominator: attempts,
|
|
544
|
+
...(actual !== undefined ? { rate: actual } : {}),
|
|
545
|
+
threshold: {
|
|
546
|
+
operator: ">=",
|
|
547
|
+
value: policy.lookupBeforeFirstEditMinimum,
|
|
548
|
+
},
|
|
549
|
+
message:
|
|
550
|
+
attempts === 0
|
|
551
|
+
? "No host hook recorded an edit of a requirement-linked file in the evaluated window."
|
|
552
|
+
: `${guided}/${attempts} sessions ran kb_search or kb_query before their first edit of a requirement-linked file.`,
|
|
553
|
+
evidence: {
|
|
554
|
+
unguidedEditPaths: [...unguidedEditPaths].sort().slice(0, 20),
|
|
555
|
+
lookupOperations: [...LOOKUP_BEFORE_EDIT_OPERATIONS],
|
|
556
|
+
},
|
|
557
|
+
};
|
|
558
|
+
}
|
|
559
|
+
|
|
366
560
|
function sourceLookupMessage(
|
|
367
561
|
zeroResults: number,
|
|
368
562
|
lookups: number,
|
|
@@ -620,7 +814,8 @@ export function analyzeTelemetryAcceptance(
|
|
|
620
814
|
now: Date = new Date(),
|
|
621
815
|
policy: TelemetryAcceptancePolicy = DEFAULT_TELEMETRY_ACCEPTANCE_POLICY,
|
|
622
816
|
): TelemetryAcceptanceReport {
|
|
623
|
-
const
|
|
817
|
+
const { operations, hookRows } = partitionTelemetryUsage(events);
|
|
818
|
+
const all = operations.map((event, index) => ({
|
|
624
819
|
event,
|
|
625
820
|
index,
|
|
626
821
|
time: timestampMillis(event.timestamp),
|
|
@@ -644,14 +839,15 @@ export function analyzeTelemetryAcceptance(
|
|
|
644
839
|
telemetryCompletenessMetric(recent, policy),
|
|
645
840
|
advisorBeforeRequirementWriteMetric(all, recentStart, policy),
|
|
646
841
|
validationBeforeUpsertMetric(all, recentStart, policy),
|
|
842
|
+
lookupBeforeFirstEditMetric(hookRows, recentStart, policy),
|
|
647
843
|
sourceLookupMetric(recent, policy),
|
|
648
844
|
proofGapRecoveryMetric(recent),
|
|
649
845
|
receiptFreshnessMetric(recent),
|
|
650
846
|
repeatedMutationFailuresMetric(recent, policy),
|
|
651
847
|
];
|
|
652
848
|
const diagnostics: string[] = [];
|
|
653
|
-
if (
|
|
654
|
-
if (lastTime === null &&
|
|
849
|
+
if (operations.length === 0) diagnostics.push("usage_log_empty");
|
|
850
|
+
if (lastTime === null && operations.length > 0) {
|
|
655
851
|
diagnostics.push("usage_log_timestamps_unavailable");
|
|
656
852
|
} else if (!fresh) {
|
|
657
853
|
diagnostics.push(
|
|
@@ -667,9 +863,9 @@ export function analyzeTelemetryAcceptance(
|
|
|
667
863
|
evaluatedAt: now.toISOString(),
|
|
668
864
|
policy,
|
|
669
865
|
scope: {
|
|
670
|
-
totalEvents:
|
|
866
|
+
totalEvents: operations.length,
|
|
671
867
|
evaluatedEvents: recent.length,
|
|
672
|
-
truncated:
|
|
868
|
+
truncated: operations.length > recent.length,
|
|
673
869
|
firstTimestamp:
|
|
674
870
|
firstTime === null ? null : new Date(firstTime).toISOString(),
|
|
675
871
|
lastTimestamp:
|
|
@@ -704,14 +900,21 @@ const METRIC_DIAGNOSTICS: Readonly<
|
|
|
704
900
|
severity: "warning",
|
|
705
901
|
rank: 30,
|
|
706
902
|
suggestion:
|
|
707
|
-
"Run
|
|
903
|
+
"Run kb_model with mode analyze (CLI: semantic-advisor) on the complete current requirement prose before its next upsert, preserve the returned source hash, and recheck telemetry.",
|
|
708
904
|
},
|
|
709
905
|
validation_before_upsert: {
|
|
710
906
|
id: "mutation_validation_bypassed",
|
|
711
907
|
severity: "warning",
|
|
712
908
|
rank: 20,
|
|
713
909
|
suggestion:
|
|
714
|
-
"Run
|
|
910
|
+
"Run kb_upsert with dryRun true (CLI: validate-upsert) for the exact payload no more than one hour before each sequential kb_upsert attempt.",
|
|
911
|
+
},
|
|
912
|
+
lookup_before_first_edit: {
|
|
913
|
+
id: "lookup_before_first_edit_bypassed",
|
|
914
|
+
severity: "warning",
|
|
915
|
+
rank: 35,
|
|
916
|
+
suggestion:
|
|
917
|
+
"Before a session's first edit of a requirement-linked file, run kb_search for the change (or kb_query with sourceFile for the file) and read the requirements it names; host hook rows in diagnostic mode record the order.",
|
|
715
918
|
},
|
|
716
919
|
source_lookup_zero_result_rate: {
|
|
717
920
|
id: "source_lookup_zero_result_rate_high",
|
|
@@ -6,6 +6,8 @@ import {
|
|
|
6
6
|
type TelemetryMetricId,
|
|
7
7
|
type TelemetryUsageEvent,
|
|
8
8
|
analyzeTelemetryAcceptance,
|
|
9
|
+
firstLinkedEdits,
|
|
10
|
+
partitionTelemetryUsage,
|
|
9
11
|
} from "./telemetry-acceptance.js";
|
|
10
12
|
|
|
11
13
|
export const TELEMETRY_REMEDIATION_VERSION =
|
|
@@ -46,6 +48,8 @@ export interface TelemetryRemediationReport {
|
|
|
46
48
|
type IndexedEvent = {
|
|
47
49
|
readonly event: TelemetryUsageEvent;
|
|
48
50
|
readonly index: number;
|
|
51
|
+
/** 1-based `.kb/usage.log` line, counting host hook rows and blank lines. */
|
|
52
|
+
readonly logLine: number;
|
|
49
53
|
readonly time: number | null;
|
|
50
54
|
};
|
|
51
55
|
|
|
@@ -55,6 +59,7 @@ const RANKS: Readonly<
|
|
|
55
59
|
repeated_mutation_failures: 10,
|
|
56
60
|
validation_before_upsert: 20,
|
|
57
61
|
advisor_before_requirement_write: 30,
|
|
62
|
+
lookup_before_first_edit: 35,
|
|
58
63
|
e2e_receipt_freshness: 40,
|
|
59
64
|
proof_gap_recovery: 50,
|
|
60
65
|
source_lookup_zero_result_rate: 60,
|
|
@@ -138,7 +143,7 @@ function target(event: TelemetryUsageEvent): string {
|
|
|
138
143
|
|
|
139
144
|
function reference(entry: IndexedEvent): TelemetryRemediationEventReference {
|
|
140
145
|
return {
|
|
141
|
-
logLine: entry.
|
|
146
|
+
logLine: entry.logLine,
|
|
142
147
|
requestId: entry.event.request_id ?? null,
|
|
143
148
|
timestamp: entry.event.timestamp ?? null,
|
|
144
149
|
tool: entry.event.tool ?? null,
|
|
@@ -155,7 +160,7 @@ function eventItem(
|
|
|
155
160
|
action: string,
|
|
156
161
|
): TelemetryRemediationItem {
|
|
157
162
|
return {
|
|
158
|
-
id: `${metric}:line-${entry.
|
|
163
|
+
id: `${metric}:line-${entry.logLine}:${itemTarget}`,
|
|
159
164
|
rank: RANKS[metric],
|
|
160
165
|
metric,
|
|
161
166
|
scope: "event",
|
|
@@ -200,14 +205,18 @@ export function buildTelemetryRemediationReport(
|
|
|
200
205
|
policy: TelemetryAcceptancePolicy = DEFAULT_TELEMETRY_ACCEPTANCE_POLICY,
|
|
201
206
|
): TelemetryRemediationReport {
|
|
202
207
|
const acceptance = analyzeTelemetryAcceptance(events, now, policy);
|
|
203
|
-
const
|
|
208
|
+
const { operations, operationLines, hookRows } =
|
|
209
|
+
partitionTelemetryUsage(events);
|
|
210
|
+
const timeOf = (event: TelemetryUsageEvent): number | null =>
|
|
211
|
+
event.timestamp === undefined ||
|
|
212
|
+
!Number.isFinite(Date.parse(event.timestamp))
|
|
213
|
+
? null
|
|
214
|
+
: Date.parse(event.timestamp);
|
|
215
|
+
const all: IndexedEvent[] = operations.map((event, index) => ({
|
|
204
216
|
event,
|
|
205
217
|
index,
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
!Number.isFinite(Date.parse(event.timestamp))
|
|
209
|
-
? null
|
|
210
|
-
: Date.parse(event.timestamp),
|
|
218
|
+
logLine: operationLines[index] ?? index + 1,
|
|
219
|
+
time: timeOf(event),
|
|
211
220
|
}));
|
|
212
221
|
const recentStart = Math.max(0, all.length - policy.eventLimit);
|
|
213
222
|
const recent = all.slice(recentStart);
|
|
@@ -277,7 +286,7 @@ export function buildTelemetryRemediationReport(
|
|
|
277
286
|
entry,
|
|
278
287
|
target(entry.event),
|
|
279
288
|
"No recent successful preflight matches this exact payload and correlation context.",
|
|
280
|
-
"Run
|
|
289
|
+
"Run kb_upsert with dryRun true (CLI: validate-upsert) for this exact payload in the same session/actor context before retrying once.",
|
|
281
290
|
),
|
|
282
291
|
);
|
|
283
292
|
}
|
|
@@ -328,13 +337,33 @@ export function buildTelemetryRemediationReport(
|
|
|
328
337
|
entry,
|
|
329
338
|
requirementId,
|
|
330
339
|
"No recent semantic-advisor event matches this requirement, source hash, and correlation context.",
|
|
331
|
-
"Run
|
|
340
|
+
"Run kb_model with mode analyze (CLI: semantic-advisor) on the complete prose in the same session/actor context before the next upsert.",
|
|
332
341
|
),
|
|
333
342
|
);
|
|
334
343
|
}
|
|
335
344
|
}
|
|
336
345
|
}
|
|
337
346
|
|
|
347
|
+
if (isActionable(acceptance, "lookup_before_first_edit")) {
|
|
348
|
+
for (const { edit, lookedUp } of firstLinkedEdits(hookRows, recentStart)) {
|
|
349
|
+
if (lookedUp) continue;
|
|
350
|
+
items.push(
|
|
351
|
+
eventItem(
|
|
352
|
+
"lookup_before_first_edit",
|
|
353
|
+
{
|
|
354
|
+
event: edit.event,
|
|
355
|
+
index: edit.operationsBefore,
|
|
356
|
+
logLine: edit.logLine,
|
|
357
|
+
time: timeOf(edit.event),
|
|
358
|
+
},
|
|
359
|
+
edit.event.path ?? "unknown path",
|
|
360
|
+
"This session edited a requirement-linked file before any kb_search or kb_query.",
|
|
361
|
+
"Before the next edit of this file, run kb_search for the change or kb_query with this sourceFile, and read the requirements it names.",
|
|
362
|
+
),
|
|
363
|
+
);
|
|
364
|
+
}
|
|
365
|
+
}
|
|
366
|
+
|
|
338
367
|
if (isActionable(acceptance, "source_lookup_zero_result_rate")) {
|
|
339
368
|
for (const entry of recent) {
|
|
340
369
|
const sourceFile = args(entry.event).sourceFile;
|