gitnexus 1.6.9 → 1.6.10-aptos.1
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/README.md +236 -53
- package/dist/_shared/graph/types.d.ts +67 -3
- package/dist/_shared/graph/types.d.ts.map +1 -1
- package/dist/_shared/index.d.ts +1 -0
- package/dist/_shared/index.d.ts.map +1 -1
- package/dist/_shared/index.js.map +1 -1
- package/dist/_shared/integrations/resilient-fetch.d.ts +3 -1
- package/dist/_shared/integrations/resilient-fetch.d.ts.map +1 -1
- package/dist/_shared/integrations/resilient-fetch.js +4 -3
- package/dist/_shared/integrations/resilient-fetch.js.map +1 -1
- package/dist/_shared/language-detection.d.ts.map +1 -1
- package/dist/_shared/language-detection.js +2 -0
- package/dist/_shared/language-detection.js.map +1 -1
- package/dist/_shared/languages.d.ts +2 -0
- package/dist/_shared/languages.d.ts.map +1 -1
- package/dist/_shared/languages.js +2 -0
- package/dist/_shared/languages.js.map +1 -1
- package/dist/_shared/lbug/schema-constants.d.ts +2 -2
- package/dist/_shared/lbug/schema-constants.d.ts.map +1 -1
- package/dist/_shared/lbug/schema-constants.js +8 -0
- package/dist/_shared/lbug/schema-constants.js.map +1 -1
- package/dist/_shared/pipeline.d.ts +1 -1
- package/dist/_shared/pipeline.d.ts.map +1 -1
- package/dist/_shared/scope-resolution/callable-flow-site.d.ts +110 -0
- package/dist/_shared/scope-resolution/callable-flow-site.d.ts.map +1 -0
- package/dist/_shared/scope-resolution/callable-flow-site.js +11 -0
- package/dist/_shared/scope-resolution/callable-flow-site.js.map +1 -0
- package/dist/_shared/scope-resolution/finalize-algorithm.d.ts +1 -1
- package/dist/_shared/scope-resolution/finalize-algorithm.d.ts.map +1 -1
- package/dist/_shared/scope-resolution/finalize-algorithm.js +1 -1
- package/dist/_shared/scope-resolution/finalize-algorithm.js.map +1 -1
- package/dist/_shared/scope-resolution/language-classification.d.ts.map +1 -1
- package/dist/_shared/scope-resolution/language-classification.js +1 -0
- package/dist/_shared/scope-resolution/language-classification.js.map +1 -1
- package/dist/_shared/scope-resolution/parsed-file.d.ts +7 -0
- package/dist/_shared/scope-resolution/parsed-file.d.ts.map +1 -1
- package/dist/_shared/scope-resolution/reference-site.d.ts +9 -1
- package/dist/_shared/scope-resolution/reference-site.d.ts.map +1 -1
- package/dist/_shared/scope-resolution/types.d.ts +20 -3
- package/dist/_shared/scope-resolution/types.d.ts.map +1 -1
- package/dist/cli/ai-context.d.ts +1 -1
- package/dist/cli/ai-context.js +25 -44
- package/dist/cli/analyze.d.ts +5 -2
- package/dist/cli/analyze.js +205 -11
- package/dist/cli/clean.js +17 -3
- package/dist/cli/cli-message.d.ts +1 -1
- package/dist/cli/doctor.d.ts +18 -0
- package/dist/cli/doctor.js +96 -5
- package/dist/cli/editor-targets.d.ts +17 -2
- package/dist/cli/editor-targets.js +44 -0
- package/dist/cli/embeddings.d.ts +12 -0
- package/dist/cli/embeddings.js +49 -0
- package/dist/cli/eval-server.d.ts +23 -1
- package/dist/cli/eval-server.js +126 -8
- package/dist/cli/help-i18n.js +6 -0
- package/dist/cli/i18n/en.d.ts +18 -8
- package/dist/cli/i18n/en.js +18 -8
- package/dist/cli/i18n/resources.d.ts +28 -8
- package/dist/cli/i18n/zh-CN.d.ts +10 -0
- package/dist/cli/i18n/zh-CN.js +18 -8
- package/dist/cli/index.js +21 -7
- package/dist/cli/lazy-action.d.ts +7 -0
- package/dist/cli/lazy-action.js +27 -0
- package/dist/cli/mcp.js +6 -3
- package/dist/cli/move-availability.d.ts +5 -0
- package/dist/cli/move-availability.js +11 -0
- package/dist/cli/setup.d.ts +8 -0
- package/dist/cli/setup.js +230 -32
- package/dist/cli/skill-gen.js +38 -18
- package/dist/cli/standard-skills.d.ts +76 -0
- package/dist/cli/standard-skills.js +45 -0
- package/dist/cli/status.d.ts +4 -1
- package/dist/cli/status.js +57 -4
- package/dist/cli/tool.js +11 -0
- package/dist/cli/uninstall.js +77 -18
- package/dist/cli/wiki.d.ts +1 -0
- package/dist/cli/wiki.js +7 -1
- package/dist/config/ignore-service.d.ts +2 -0
- package/dist/config/ignore-service.js +27 -0
- package/dist/core/analysis-features.d.ts +21 -0
- package/dist/core/analysis-features.js +59 -0
- package/dist/core/analyzer-identity.d.ts +74 -0
- package/dist/core/analyzer-identity.js +1820 -0
- package/dist/core/augmentation/engine.js +13 -8
- package/dist/core/embeddings/embedder.d.ts +3 -2
- package/dist/core/embeddings/embedder.js +24 -7
- package/dist/core/embeddings/embedding-identity.d.ts +11 -0
- package/dist/core/embeddings/embedding-identity.js +24 -0
- package/dist/core/embeddings/embedding-pipeline.d.ts +36 -1
- package/dist/core/embeddings/embedding-pipeline.js +100 -9
- package/dist/core/embeddings/http-client.d.ts +33 -3
- package/dist/core/embeddings/http-client.js +237 -25
- package/dist/core/embeddings/node-module-compat.d.ts +25 -0
- package/dist/core/embeddings/node-module-compat.js +25 -0
- package/dist/core/embeddings/onnxruntime-common-resolver.js +8 -5
- package/dist/core/embeddings/onnxruntime-node-resolver.js +33 -7
- package/dist/core/embeddings/runtime-install.d.ts +119 -0
- package/dist/core/embeddings/runtime-install.js +372 -0
- package/dist/core/embeddings/runtime-support.d.ts +48 -17
- package/dist/core/embeddings/runtime-support.js +96 -0
- package/dist/core/git-staleness.js +1 -1
- package/dist/core/group/bridge-db.js +2 -0
- package/dist/core/group/extractors/http-patterns/python.js +246 -108
- package/dist/core/group/extractors/manifest-extractor.js +4 -0
- package/dist/core/incremental/escalation-gate.d.ts +38 -0
- package/dist/core/incremental/escalation-gate.js +48 -0
- package/dist/core/incremental/shadow-candidates.d.ts +3 -3
- package/dist/core/incremental/shadow-candidates.js +3 -3
- package/dist/core/incremental/subgraph-extract.d.ts +2 -2
- package/dist/core/incremental/subgraph-extract.js +2 -2
- package/dist/core/index-freshness.d.ts +5 -0
- package/dist/core/index-freshness.js +13 -0
- package/dist/core/ingestion/class-extractors/configs/jvm.js +29 -0
- package/dist/core/ingestion/cobol/cobol-preprocessor.js +1 -1
- package/dist/core/ingestion/cobol/jcl-processor.js +9 -8
- package/dist/core/ingestion/cobol-processor.js +27 -26
- package/dist/core/ingestion/community-processor.d.ts +51 -1
- package/dist/core/ingestion/community-processor.js +323 -64
- package/dist/core/ingestion/emit-references.js +7 -2
- package/dist/core/ingestion/filesystem-walker.js +4 -0
- package/dist/core/ingestion/frameworks/spring/analysis-features.d.ts +3 -0
- package/dist/core/ingestion/frameworks/spring/analysis-features.js +7 -0
- package/dist/core/ingestion/frameworks/spring/bean-candidates.d.ts +30 -0
- package/dist/core/ingestion/frameworks/spring/bean-candidates.js +182 -0
- package/dist/core/ingestion/frameworks/spring/bean-catalog.d.ts +12 -0
- package/dist/core/ingestion/frameworks/spring/bean-catalog.js +26 -0
- package/dist/core/ingestion/frameworks/spring/config-bindings.d.ts +24 -0
- package/dist/core/ingestion/frameworks/spring/config-bindings.js +115 -0
- package/dist/core/ingestion/languages/c/captures.js +56 -0
- package/dist/core/ingestion/languages/c/query.js +17 -0
- package/dist/core/ingestion/languages/c/scope-resolver.js +6 -0
- package/dist/core/ingestion/languages/cobol/captures.js +93 -0
- package/dist/core/ingestion/languages/cobol/scope-resolver.js +7 -0
- package/dist/core/ingestion/languages/cpp/captures.js +365 -75
- package/dist/core/ingestion/languages/cpp/scope-resolver.js +14 -0
- package/dist/core/ingestion/languages/csharp/captures.js +25 -0
- package/dist/core/ingestion/languages/dart/captures.js +90 -2
- package/dist/core/ingestion/languages/dart/extension-type-preprocess.d.ts +7 -0
- package/dist/core/ingestion/languages/dart/extension-type-preprocess.js +30 -0
- package/dist/core/ingestion/languages/dart.js +2 -0
- package/dist/core/ingestion/languages/go/captures.js +34 -0
- package/dist/core/ingestion/languages/index.d.ts +1 -0
- package/dist/core/ingestion/languages/index.js +2 -0
- package/dist/core/ingestion/languages/java/analysis-features.d.ts +3 -0
- package/dist/core/ingestion/languages/java/analysis-features.js +13 -0
- package/dist/core/ingestion/languages/java/capture-side-channel.d.ts +22 -0
- package/dist/core/ingestion/languages/java/capture-side-channel.js +58 -0
- package/dist/core/ingestion/languages/java/captures.d.ts +4 -3
- package/dist/core/ingestion/languages/java/captures.js +193 -17
- package/dist/core/ingestion/languages/java/package-facts.d.ts +5 -0
- package/dist/core/ingestion/languages/java/package-facts.js +9 -0
- package/dist/core/ingestion/languages/java/package-siblings.d.ts +3 -16
- package/dist/core/ingestion/languages/java/package-siblings.js +8 -147
- package/dist/core/ingestion/languages/java/query.js +23 -0
- package/dist/core/ingestion/languages/java/scope-resolver.js +23 -0
- package/dist/core/ingestion/languages/java/spring-bean-metadata.d.ts +2 -0
- package/dist/core/ingestion/languages/java/spring-bean-metadata.js +8 -0
- package/dist/core/ingestion/languages/java/spring-config-bindings.d.ts +23 -0
- package/dist/core/ingestion/languages/java/spring-config-bindings.js +215 -0
- package/dist/core/ingestion/languages/java.js +3 -0
- package/dist/core/ingestion/languages/javascript/captures.js +16 -0
- package/dist/core/ingestion/languages/javascript/query.js +21 -0
- package/dist/core/ingestion/languages/jvm/package-facts.d.ts +35 -0
- package/dist/core/ingestion/languages/jvm/package-facts.js +40 -0
- package/dist/core/ingestion/languages/jvm/package-siblings.d.ts +14 -0
- package/dist/core/ingestion/languages/jvm/package-siblings.js +129 -0
- package/dist/core/ingestion/languages/kotlin/capture-side-channel.d.ts +17 -3
- package/dist/core/ingestion/languages/kotlin/capture-side-channel.js +42 -8
- package/dist/core/ingestion/languages/kotlin/captures.js +59 -0
- package/dist/core/ingestion/languages/kotlin/package-facts.d.ts +5 -0
- package/dist/core/ingestion/languages/kotlin/package-facts.js +9 -0
- package/dist/core/ingestion/languages/kotlin/package-siblings.d.ts +4 -0
- package/dist/core/ingestion/languages/kotlin/package-siblings.js +8 -0
- package/dist/core/ingestion/languages/kotlin/query.js +19 -0
- package/dist/core/ingestion/languages/kotlin/scope-resolver.js +9 -1
- package/dist/core/ingestion/languages/kotlin/spring-bean-metadata.d.ts +2 -0
- package/dist/core/ingestion/languages/kotlin/spring-bean-metadata.js +8 -0
- package/dist/core/ingestion/languages/kotlin.js +5 -6
- package/dist/core/ingestion/languages/move.d.ts +1 -0
- package/dist/core/ingestion/languages/move.js +27 -0
- package/dist/core/ingestion/languages/php/captures.js +40 -0
- package/dist/core/ingestion/languages/php/import-decomposer.js +12 -0
- package/dist/core/ingestion/languages/php/import-target.d.ts +2 -1
- package/dist/core/ingestion/languages/php/import-target.js +110 -2
- package/dist/core/ingestion/languages/php/interpret.js +10 -0
- package/dist/core/ingestion/languages/php/scope-resolver.js +1 -1
- package/dist/core/ingestion/languages/python/captures.d.ts +3 -4
- package/dist/core/ingestion/languages/python/captures.js +24 -5
- package/dist/core/ingestion/languages/python/interpret.js +4 -0
- package/dist/core/ingestion/languages/python/receiver-binding.d.ts +15 -2
- package/dist/core/ingestion/languages/python/receiver-binding.js +96 -2
- package/dist/core/ingestion/languages/python/simple-hooks.d.ts +5 -5
- package/dist/core/ingestion/languages/python/simple-hooks.js +15 -5
- package/dist/core/ingestion/languages/ruby/captures.js +42 -0
- package/dist/core/ingestion/languages/rust/captures.js +13 -0
- package/dist/core/ingestion/languages/rust/interpret.js +18 -0
- package/dist/core/ingestion/languages/rust/query.js +9 -0
- package/dist/core/ingestion/languages/rust/range-binding.js +6 -2
- package/dist/core/ingestion/languages/swift/captures.js +12 -0
- package/dist/core/ingestion/languages/typescript/captures.js +21 -0
- package/dist/core/ingestion/languages/typescript/nuxt-auto-imports.js +2 -1
- package/dist/core/ingestion/languages/typescript/query.js +37 -0
- package/dist/core/ingestion/markdown-processor.js +3 -2
- package/dist/core/ingestion/model/registration-table.js +1 -0
- package/dist/core/ingestion/parsing-processor.d.ts +3 -1
- package/dist/core/ingestion/parsing-processor.js +36 -1
- package/dist/core/ingestion/pipeline-phases/index.d.ts +2 -0
- package/dist/core/ingestion/pipeline-phases/index.js +2 -0
- package/dist/core/ingestion/pipeline-phases/parse-impl.js +56 -2
- package/dist/core/ingestion/pipeline-phases/parse.d.ts +0 -2
- package/dist/core/ingestion/pipeline-phases/parse.js +12 -3
- package/dist/core/ingestion/pipeline-phases/processes.d.ts +8 -0
- package/dist/core/ingestion/pipeline-phases/processes.js +11 -1
- package/dist/core/ingestion/pipeline-phases/spring-config.d.ts +37 -0
- package/dist/core/ingestion/pipeline-phases/spring-config.js +433 -0
- package/dist/core/ingestion/pipeline-phases/standalone-ingest.d.ts +16 -0
- package/dist/core/ingestion/pipeline-phases/standalone-ingest.js +6 -0
- package/dist/core/ingestion/pipeline.d.ts +4 -2
- package/dist/core/ingestion/pipeline.js +14 -2
- package/dist/core/ingestion/resolve-references.js +12 -0
- package/dist/core/ingestion/route-extractors/constant-resolver.d.ts +83 -0
- package/dist/core/ingestion/route-extractors/constant-resolver.js +131 -0
- package/dist/core/ingestion/route-extractors/python-const-resolver.d.ts +75 -0
- package/dist/core/ingestion/route-extractors/python-const-resolver.js +299 -0
- package/dist/core/ingestion/scope-extractor.js +306 -43
- package/dist/core/ingestion/scope-resolution/contract/scope-resolver.d.ts +71 -2
- package/dist/core/ingestion/scope-resolution/graph-bridge/callee-id-sink.d.ts +7 -7
- package/dist/core/ingestion/scope-resolution/graph-bridge/callee-id-sink.js +8 -7
- package/dist/core/ingestion/scope-resolution/graph-bridge/edges.d.ts +3 -1
- package/dist/core/ingestion/scope-resolution/graph-bridge/edges.js +6 -0
- package/dist/core/ingestion/scope-resolution/graph-bridge/ids.js +1 -0
- package/dist/core/ingestion/scope-resolution/graph-bridge/node-lookup.js +4 -1
- package/dist/core/ingestion/scope-resolution/graph-bridge/references-to-edges.js +7 -2
- package/dist/core/ingestion/scope-resolution/passes/callable-value-flow.d.ts +47 -0
- package/dist/core/ingestion/scope-resolution/passes/callable-value-flow.js +1138 -0
- package/dist/core/ingestion/scope-resolution/passes/free-call-fallback.d.ts +16 -4
- package/dist/core/ingestion/scope-resolution/passes/free-call-fallback.js +97 -1
- package/dist/core/ingestion/scope-resolution/passes/property-dispatch.d.ts +60 -0
- package/dist/core/ingestion/scope-resolution/passes/property-dispatch.js +111 -0
- package/dist/core/ingestion/scope-resolution/passes/receiver-bound-calls.d.ts +4 -3
- package/dist/core/ingestion/scope-resolution/pipeline/phase.d.ts +5 -0
- package/dist/core/ingestion/scope-resolution/pipeline/phase.js +25 -38
- package/dist/core/ingestion/scope-resolution/pipeline/run.d.ts +6 -0
- package/dist/core/ingestion/scope-resolution/pipeline/run.js +147 -35
- package/dist/core/ingestion/scope-resolution/resolution-outcome.d.ts +1 -1
- package/dist/core/ingestion/scope-resolution/scope/walkers.js +73 -44
- package/dist/core/ingestion/taint/typescript-model.js +34 -2
- package/dist/core/ingestion/tree-sitter-queries.d.ts +2 -2
- package/dist/core/ingestion/tree-sitter-queries.js +23 -2
- package/dist/core/ingestion/type-extractors/jvm.js +17 -2
- package/dist/core/ingestion/utils/ast-helpers.d.ts +1 -0
- package/dist/core/ingestion/utils/ast-helpers.js +153 -2
- package/dist/core/ingestion/utils/callable-flow-captures.d.ts +94 -0
- package/dist/core/ingestion/utils/callable-flow-captures.js +878 -0
- package/dist/core/ingestion/utils/line-base.d.ts +20 -0
- package/dist/core/ingestion/utils/line-base.js +20 -0
- package/dist/core/ingestion/utils/symbol-labels.d.ts +21 -0
- package/dist/core/ingestion/utils/symbol-labels.js +45 -0
- package/dist/core/ingestion/workers/parse-worker.d.ts +34 -0
- package/dist/core/ingestion/workers/parse-worker.js +40 -5
- package/dist/core/ingestion/workers/result-merge.js +4 -0
- package/dist/core/ingestion/workers/worker-pool.d.ts +28 -0
- package/dist/core/ingestion/workers/worker-pool.js +128 -28
- package/dist/core/lbug/csv-generator.d.ts +15 -0
- package/dist/core/lbug/csv-generator.js +124 -27
- package/dist/core/lbug/cypher-escape.d.ts +20 -0
- package/dist/core/lbug/cypher-escape.js +20 -0
- package/dist/core/lbug/extension-load-error.d.ts +67 -0
- package/dist/core/lbug/extension-load-error.js +326 -0
- package/dist/core/lbug/extension-loader.d.ts +17 -2
- package/dist/core/lbug/extension-loader.js +38 -13
- package/dist/core/lbug/lbug-adapter.d.ts +203 -2
- package/dist/core/lbug/lbug-adapter.js +527 -86
- package/dist/core/lbug/lbug-config.d.ts +56 -2
- package/dist/core/lbug/lbug-config.js +267 -7
- package/dist/core/lbug/move-columns.d.ts +7 -0
- package/dist/core/lbug/move-columns.js +86 -0
- package/dist/core/lbug/native-check.d.ts +40 -0
- package/dist/core/lbug/native-check.js +90 -0
- package/dist/core/lbug/node-table-layout.d.ts +29 -0
- package/dist/core/lbug/node-table-layout.js +119 -0
- package/dist/core/lbug/pool-adapter.d.ts +23 -1
- package/dist/core/lbug/pool-adapter.js +115 -8
- package/dist/core/lbug/schema.d.ts +4 -3
- package/dist/core/lbug/schema.js +16 -16
- package/dist/core/lbug/sidecar-recovery.d.ts +172 -0
- package/dist/core/lbug/sidecar-recovery.js +418 -16
- package/dist/core/lbug/wal-checkpoint-driver.js +3 -0
- package/dist/core/move/artifact-download.d.ts +19 -0
- package/dist/core/move/artifact-download.js +179 -0
- package/dist/core/move/compiler-facts.d.ts +120 -0
- package/dist/core/move/compiler-facts.js +9 -0
- package/dist/core/move/consistency.d.ts +74 -0
- package/dist/core/move/consistency.js +182 -0
- package/dist/core/move/constants.d.ts +98 -0
- package/dist/core/move/constants.js +136 -0
- package/dist/core/move/discovery.d.ts +10 -0
- package/dist/core/move/discovery.js +22 -0
- package/dist/core/move/entry-points.d.ts +14 -0
- package/dist/core/move/entry-points.js +40 -0
- package/dist/core/move/facts-mapper.d.ts +75 -0
- package/dist/core/move/facts-mapper.js +534 -0
- package/dist/core/move/install-lock.d.ts +14 -0
- package/dist/core/move/install-lock.js +102 -0
- package/dist/core/move/install.d.ts +39 -0
- package/dist/core/move/install.js +391 -0
- package/dist/core/move/mcp-client.d.ts +115 -0
- package/dist/core/move/mcp-client.js +436 -0
- package/dist/core/move/move-ingest.d.ts +52 -0
- package/dist/core/move/move-ingest.js +403 -0
- package/dist/core/move/provision.d.ts +19 -0
- package/dist/core/move/provision.js +91 -0
- package/dist/core/move/release.d.ts +6 -0
- package/dist/core/move/release.js +10 -0
- package/dist/core/move/symbol-id.d.ts +35 -0
- package/dist/core/move/symbol-id.js +65 -0
- package/dist/core/move/type-parser.d.ts +11 -0
- package/dist/core/move/type-parser.js +38 -0
- package/dist/core/platform/capabilities.d.ts +0 -1
- package/dist/core/platform/capabilities.js +39 -8
- package/dist/core/run-analyze.d.ts +9 -3
- package/dist/core/run-analyze.js +1002 -184
- package/dist/core/search/fts-indexes.d.ts +31 -0
- package/dist/core/search/fts-indexes.js +73 -0
- package/dist/core/search/fts-schema.js +2 -0
- package/dist/core/tree-sitter/safe-parse.d.ts +8 -3
- package/dist/core/tree-sitter/safe-parse.js +21 -7
- package/dist/core/wiki/graph-queries.js +6 -5
- package/dist/core/wiki/llm-client.d.ts +8 -2
- package/dist/core/wiki/llm-client.js +41 -5
- package/dist/mcp/core/embedder.js +16 -2
- package/dist/mcp/http-transport.d.ts +5 -0
- package/dist/mcp/http-transport.js +19 -5
- package/dist/mcp/local/bean-metadata.d.ts +2 -0
- package/dist/mcp/local/bean-metadata.js +25 -0
- package/dist/mcp/local/line-display.d.ts +22 -0
- package/dist/mcp/local/line-display.js +3 -0
- package/dist/mcp/local/local-backend.d.ts +19 -1
- package/dist/mcp/local/local-backend.js +402 -155
- package/dist/mcp/local/pdg-impact.d.ts +5 -3
- package/dist/mcp/local/pdg-impact.js +5 -2
- package/dist/mcp/output-budget.d.ts +5 -0
- package/dist/mcp/output-budget.js +52 -0
- package/dist/mcp/read-only-policy.d.ts +12 -0
- package/dist/mcp/read-only-policy.js +102 -0
- package/dist/mcp/repository-policy.d.ts +34 -0
- package/dist/mcp/repository-policy.js +328 -0
- package/dist/mcp/resources.js +32 -5
- package/dist/mcp/server.d.ts +5 -2
- package/dist/mcp/server.js +29 -9
- package/dist/mcp/tools.d.ts +0 -8
- package/dist/mcp/tools.js +102 -5
- package/dist/server/analyze-job.d.ts +3 -0
- package/dist/server/analyze-job.js +17 -0
- package/dist/server/analyze-launch.d.ts +6 -0
- package/dist/server/analyze-launch.js +82 -6
- package/dist/server/analyze-worker-core.d.ts +2 -1
- package/dist/server/analyze-worker-core.js +5 -2
- package/dist/server/analyze-worker.js +29 -6
- package/dist/server/api.d.ts +30 -0
- package/dist/server/api.js +120 -34
- package/dist/server/mcp-http.d.ts +1 -1
- package/dist/server/mcp-http.js +4 -2
- package/dist/server/upload-ingest.js +2 -1
- package/dist/server/validation.js +2 -1
- package/dist/storage/git.d.ts +31 -0
- package/dist/storage/git.js +111 -1
- package/dist/storage/parse-cache.js +7 -1
- package/dist/storage/parsedfile-store.d.ts +8 -0
- package/dist/storage/parsedfile-store.js +165 -1
- package/dist/storage/repo-manager.d.ts +194 -2
- package/dist/storage/repo-manager.js +56 -1
- package/dist/types/pipeline.d.ts +7 -0
- package/hooks/antigravity/gitnexus-antigravity-hook.cjs +50 -3
- package/hooks/claude/gitnexus-hook.cjs +59 -9
- package/hooks/claude/pre-tool-use.sh +0 -0
- package/hooks/claude/session-start.sh +0 -0
- package/package.json +21 -15
- package/scripts/cross-platform-tests.ts +56 -0
- package/scripts/ensure-fts.ts +43 -0
- package/scripts/install-duckdb-extension.mjs +85 -24
- package/scripts/run-cross-platform.ts +61 -6
- package/scripts/shard-arg.ts +30 -0
- package/scripts/sync-plugin-manifests.mjs +192 -0
- package/skills/gitnexus-lfg/README.md +55 -0
- package/skills/gitnexus-lfg/SKILL.md +86 -0
- package/skills/gitnexus-plan/README.md +142 -0
- package/skills/gitnexus-plan/SKILL.md +348 -0
- package/skills/gitnexus-plan/references/context-ledger.md +137 -0
- package/skills/gitnexus-plan/references/context-pack.md +126 -0
- package/skills/gitnexus-plan/references/evidence-provenance.md +272 -0
- package/skills/gitnexus-plan/references/pdg-slice.md +109 -0
- package/skills/gitnexus-plan/references/plan-template.md +201 -0
- package/skills/gitnexus-plan/scripts/evidence-provenance.mjs +2084 -0
- package/skills/gitnexus-review/SKILL.md +273 -0
- package/skills/gitnexus-review/ci-personas/ci-adversarial-lens.md +42 -0
- package/skills/gitnexus-review/ci-personas/ci-blast-radius-lens.md +39 -0
- package/skills/gitnexus-review/ci-personas/ci-correctness-lens.md +37 -0
- package/skills/gitnexus-review/ci-personas/ci-coverage-lens.md +40 -0
- package/skills/gitnexus-review/ci-personas/ci-critic-lens.md +42 -0
- package/skills/gitnexus-review/ci-personas/ci-security-lens.md +39 -0
- package/skills/gitnexus-work/README.md +71 -0
- package/skills/gitnexus-work/SKILL.md +269 -0
- package/skills/gitnexus-work/references/evidence-provenance.md +272 -0
- package/skills/gitnexus-work/scripts/evidence-provenance.mjs +2084 -0
- package/web/assets/ProcessFlowModal-B_bfBySy.js +22 -0
- package/web/assets/__vite-browser-external-bMKyYQkO.js +1 -0
- package/web/assets/agent-Bqxn-abU.js +626 -0
- package/web/assets/architecture-7EHR7CIX-6QZW5X65-BVWFvYz2.js +1 -0
- package/web/assets/architectureDiagram-UL44E2DR-CmG3uPWf.js +36 -0
- package/web/assets/{blockDiagram-7IZFK4PR-BkWhpzWB.js → blockDiagram-7IZFK4PR-DBefcjof.js} +7 -7
- package/web/assets/{c4Diagram-Y2BXMSZH-DtBvpzWD.js → c4Diagram-Y2BXMSZH-EjWnjEJl.js} +6 -6
- package/web/assets/chunk-2T2R6R2M-Bb6Sy3_j.js +4 -0
- package/web/assets/chunk-2UTLFMKG-CXlhF3Pt.js +1 -0
- package/web/assets/chunk-3SSMPTDK-rPsRM1x0.js +321 -0
- package/web/assets/chunk-4R4BOZG6-Be_F0JoX.js +159 -0
- package/web/assets/{chunk-6764PJDD-DpIS7hxD.js → chunk-6764PJDD-C7xxk063.js} +1 -1
- package/web/assets/chunk-67TQ5CYL-CA7OhIEf.js +124 -0
- package/web/assets/chunk-7FYTHRHK-CsmYIswB.js +32 -0
- package/web/assets/chunk-7J6CGLKN-BlKwgXKs.js +10 -0
- package/web/assets/chunk-7W6UQGC5-pyKGssV3.js +1 -0
- package/web/assets/chunk-C62D2QBJ-3gdL8EKc.js +1 -0
- package/web/assets/chunk-CEXFNPSA-CjwtMDkc.js +1 -0
- package/web/assets/{chunk-INKRHTLW-Nu4ri9P-.js → chunk-INKRHTLW-Ckl3_KkO.js} +13 -13
- package/web/assets/chunk-J5EP6P6S-L19oz55R.js +1 -0
- package/web/assets/{chunk-KGFNY3KK-JGMJvKCK.js → chunk-KGFNY3KK-BZeP-55u.js} +17 -17
- package/web/assets/chunk-KGYTTC2M-zm6n242I.js +1 -0
- package/web/assets/{chunk-KRXBNO2N-BW5o0KUN.js → chunk-KRXBNO2N-C-UNuKKf.js} +1 -1
- package/web/assets/{chunk-LCXTWHL2-CfLLCywY.js → chunk-LCXTWHL2-C162wE5z.js} +5 -5
- package/web/assets/chunk-LII3EMHJ-BL6lKJ_P.js +1 -0
- package/web/assets/chunk-LRIF4GLE-n59lhprL.js +1 -0
- package/web/assets/chunk-QA3QBVWF-DVXPOIxe.js +2 -0
- package/web/assets/chunk-RERM46MO-B5dAdWpP.js +1 -0
- package/web/assets/chunk-RG4AUYOV-ZNgyLFq6.js +206 -0
- package/web/assets/chunk-RKZBBQEN-MyIQbGgD.js +1 -0
- package/web/assets/chunk-RLI5ZMPA-CkXZ0y0U.js +1 -0
- package/web/assets/chunk-T2UQINTJ-BEyXhZWe.js +1 -0
- package/web/assets/chunk-UP6H54XL-BG-n7qDp.js +1 -0
- package/web/assets/chunk-UXSXWOXI-CW1_r5cS.js +1 -0
- package/web/assets/chunk-UY5QBCOK-ByqTVLvh.js +1 -0
- package/web/assets/chunk-VU6ZFW4Y-BLeasdkU.js +2 -0
- package/web/assets/{chunk-W44A43WB-JqMLIpR0.js → chunk-W44A43WB-BN8EQc_u.js} +1 -1
- package/web/assets/chunk-ZXARS5L4-C3v-4Fsw.js +1 -0
- package/web/assets/classDiagram-KGZ6W3CR-olpO3fMe.js +1 -0
- package/web/assets/classDiagram-v2-72OJOZXJ-olpO3fMe.js +1 -0
- package/web/assets/cose-bilkent-UX7MHV2Q-BmnZ7Mvj.js +1 -0
- package/web/assets/dagre-ND4H6XIP-CY4iIF7v.js +4 -0
- package/web/assets/diagram-3NCE3AQN-CO6QpzEE.js +43 -0
- package/web/assets/diagram-GF46GFSD-B2atbzmU.js +24 -0
- package/web/assets/diagram-HNR7UZ2L-DVRltWbL.js +3 -0
- package/web/assets/diagram-QXG6HAR7-DR6AHD2h.js +24 -0
- package/web/assets/diagram-WEQXMOUZ-DkpoMwTL.js +10 -0
- package/web/assets/erDiagram-L5TCEMPS-n8g_90bc.js +85 -0
- package/web/assets/eventmodeling-FCH6USID-MREXMVOE-CgFBM7e-.js +1 -0
- package/web/assets/flowDiagram-H6V6AXG4-SGMDiCkB.js +162 -0
- package/web/assets/ganttDiagram-JCBTUEKG-Cb3UBqRS.js +292 -0
- package/web/assets/gitGraph-WXDBUCRP-R675I2BI-DCJv7SII.js +1 -0
- package/web/assets/gitGraphDiagram-S2ZK5IYY-Bs9CR7tq.js +106 -0
- package/web/assets/index-CX_fADmQ.css +2 -0
- package/web/assets/index-D1Z3dGGz.js +575 -0
- package/web/assets/info-J43DQDTF-KCYPFFUO-BfNy-9Nd.js +1 -0
- package/web/assets/infoDiagram-3YFTVSEB-T368on4D.js +2 -0
- package/web/assets/{ishikawaDiagram-BNXS4ZKH-DfYpxnE5.js → ishikawaDiagram-BNXS4ZKH-XpjJRU9h.js} +6 -6
- package/web/assets/journeyDiagram-M6C3CM3L-C6wjooas.js +139 -0
- package/web/assets/kanban-definition-75IXJCU3-5_UVY79g.js +89 -0
- package/web/assets/{katex-K3KEBU37-CTc5BslQ.js → katex-K3KEBU37-qRQBy-EZ.js} +2 -2
- package/web/assets/{mindmap-definition-2TDM6QVE-DypvbOMQ.js → mindmap-definition-2TDM6QVE-8xDLzk2e.js} +29 -29
- package/web/assets/node-Ct_zna8U.js +8 -0
- package/web/assets/packet-YPE3B663-LP52Z2RK-D4qkeG9k.js +1 -0
- package/web/assets/pie-LRSECV5Y-TCRJHUBD-B_yMKyQa.js +1 -0
- package/web/assets/pieDiagram-CU6KROY3-Bv4LpAbr.js +30 -0
- package/web/assets/preload-helper-Czpn1I53.js +1 -0
- package/web/assets/{quadrantDiagram-VICAPDV7-yXSZ2lLz.js → quadrantDiagram-VICAPDV7-DR54jOeR.js} +6 -6
- package/web/assets/radar-GUYGQ44K-RDLRG3WG-DeD6yN_0.js +1 -0
- package/web/assets/requirementDiagram-JXO7QTGE-PEkg7sKC.js +84 -0
- package/web/assets/rolldown-runtime-QTnfLwEv.js +1 -0
- package/web/assets/sankeyDiagram-URQDO5SZ-DDWEtjcs.js +40 -0
- package/web/assets/sdk-CzHHH8tD.js +37 -0
- package/web/assets/sequenceDiagram-VS2MUI6T-Bv-uwANx.js +162 -0
- package/web/assets/src-JV30wyV8.js +1 -0
- package/web/assets/stateDiagram-7D4R322I-DVNjmkEq.js +1 -0
- package/web/assets/stateDiagram-v2-36443NZ5-CyN4Fh7_.js +1 -0
- package/web/assets/timeline-definition-O6YCAMPW-Qmsuo7qS.js +120 -0
- package/web/assets/treeView-BLDUP644-QA4HXRO3-CDuSYnd4.js +1 -0
- package/web/assets/treemap-LRROVOQU-LLAWBHMP-imazucyJ.js +1 -0
- package/web/assets/vennDiagram-MWXL3ELB-BD1iK1SX.js +34 -0
- package/web/assets/wardley-L42UT6IY-5TKZOOLJ-DqrT9tB8.js +1 -0
- package/web/assets/wardleyDiagram-CUQ6CDDI-D6TzLVob.js +78 -0
- package/web/assets/{xychartDiagram-N2JHSOCM-BOLm0eNm.js → xychartDiagram-N2JHSOCM-CoZ_Tits.js} +6 -6
- package/web/index.html +18 -10
- package/skills/gitnexus-pr-review.md +0 -163
- package/web/assets/agent-Dli_x7bU.js +0 -660
- package/web/assets/architecture-7EHR7CIX-6QZW5X65-DxJw65fT.js +0 -1
- package/web/assets/architectureDiagram-UL44E2DR-dEkqUZN9.js +0 -36
- package/web/assets/chunk-3SSMPTDK-B4_etUhr.js +0 -321
- package/web/assets/chunk-67TQ5CYL-4sNPJU1q.js +0 -124
- package/web/assets/chunk-7W6UQGC5-KyEG0HQg.js +0 -1
- package/web/assets/chunk-KGYTTC2M-CWC_c3H9.js +0 -161
- package/web/assets/chunk-LII3EMHJ-D-jm-dLa.js +0 -1
- package/web/assets/chunk-QA3QBVWF-BgRW3SXd.js +0 -2
- package/web/assets/chunk-RG4AUYOV-CqWzWsV3.js +0 -206
- package/web/assets/chunk-T2UQINTJ-DSBqkzH7.js +0 -1
- package/web/assets/chunk-UY5QBCOK-DyF0vyGd.js +0 -1
- package/web/assets/chunk-ZXARS5L4-CxN8oiwI.js +0 -1
- package/web/assets/classDiagram-KGZ6W3CR-CMne4tG9.js +0 -1
- package/web/assets/classDiagram-v2-72OJOZXJ-CMne4tG9.js +0 -1
- package/web/assets/cose-bilkent-UX7MHV2Q-D71wNYRJ.js +0 -1
- package/web/assets/dagre-ND4H6XIP-Co5rRx9X.js +0 -4
- package/web/assets/diagram-3NCE3AQN-DBp4O00j.js +0 -43
- package/web/assets/diagram-GF46GFSD-6N_8yS0i.js +0 -24
- package/web/assets/diagram-HNR7UZ2L-DFCfd5LI.js +0 -3
- package/web/assets/diagram-QXG6HAR7-Di093rFg.js +0 -24
- package/web/assets/diagram-WEQXMOUZ-DZWi4SUN.js +0 -10
- package/web/assets/erDiagram-L5TCEMPS-8X1y6R4Y.js +0 -85
- package/web/assets/eventmodeling-FCH6USID-MREXMVOE-BQm9QzEa.js +0 -1
- package/web/assets/flowDiagram-H6V6AXG4-CMpY8Ufn.js +0 -162
- package/web/assets/ganttDiagram-JCBTUEKG-D3iL2Aet.js +0 -292
- package/web/assets/gitGraph-WXDBUCRP-R675I2BI-Cr_Bm2Nb.js +0 -1
- package/web/assets/gitGraphDiagram-S2ZK5IYY-CPIDgxGm.js +0 -106
- package/web/assets/index-KctnI3Vq.js +0 -635
- package/web/assets/index-_lgn7hs5.css +0 -2
- package/web/assets/info-J43DQDTF-KCYPFFUO-Cs4p2oyk.js +0 -1
- package/web/assets/infoDiagram-3YFTVSEB-BaLMZkUg.js +0 -2
- package/web/assets/journeyDiagram-M6C3CM3L-CvArszLo.js +0 -139
- package/web/assets/kanban-definition-75IXJCU3-CpfVLLf9.js +0 -89
- package/web/assets/packet-YPE3B663-LP52Z2RK-CKCrztD2.js +0 -1
- package/web/assets/pie-LRSECV5Y-TCRJHUBD-BB7pHqoD.js +0 -1
- package/web/assets/pieDiagram-CU6KROY3-s27EFWgP.js +0 -30
- package/web/assets/radar-GUYGQ44K-RDLRG3WG-DhoTOcuK.js +0 -1
- package/web/assets/requirementDiagram-JXO7QTGE-CWhqInuf.js +0 -84
- package/web/assets/sankeyDiagram-URQDO5SZ-1qEjlFIB.js +0 -40
- package/web/assets/sequenceDiagram-VS2MUI6T-RyTlZ5cR.js +0 -162
- package/web/assets/stateDiagram-7D4R322I-DTjVfX4A.js +0 -1
- package/web/assets/stateDiagram-v2-36443NZ5-xY9_k9_Q.js +0 -1
- package/web/assets/timeline-definition-O6YCAMPW-DrrqLYAf.js +0 -120
- package/web/assets/treeView-BLDUP644-QA4HXRO3-ODehyGKL.js +0 -1
- package/web/assets/treemap-LRROVOQU-LLAWBHMP-BfpgC-7o.js +0 -1
- package/web/assets/vennDiagram-MWXL3ELB-B0RkWAim.js +0 -34
- package/web/assets/wardley-L42UT6IY-5TKZOOLJ-CNeL6VHE.js +0 -1
- package/web/assets/wardleyDiagram-CUQ6CDDI-boUxiQ5F.js +0 -78
|
@@ -0,0 +1,272 @@
|
|
|
1
|
+
# Evidence provenance serializer v2 and safe plan writer
|
|
2
|
+
|
|
3
|
+
This file is the normative byte contract for `evidence_provenance` schema 2.
|
|
4
|
+
The adjacent `scripts/evidence-provenance.mjs` is its executable definition.
|
|
5
|
+
`gitnexus-plan` and `gitnexus-work` carry byte-identical copies so either skill
|
|
6
|
+
can produce the same snapshot without relying on the other skill's install.
|
|
7
|
+
It is also the only supported write boundary for a generated plan. Never
|
|
8
|
+
recreate the digest with an ad-hoc shell pipeline or write the plan destination
|
|
9
|
+
directly.
|
|
10
|
+
|
|
11
|
+
## Invocation
|
|
12
|
+
|
|
13
|
+
From the target repository root, run the helper belonging to the active skill:
|
|
14
|
+
|
|
15
|
+
```bash
|
|
16
|
+
node <skill-dir>/scripts/evidence-provenance.mjs read-plan \
|
|
17
|
+
--repo "$PWD" \
|
|
18
|
+
--generated-plan docs/plans/YYYY-MM-DD-gitnexus-plan-example-change-plan.md
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
`read-plan` is the only supported way to load an existing plan for Deepen or
|
|
22
|
+
execution. It emits a JSON receipt with the canonical `generated_plan_path`,
|
|
23
|
+
`bytes_read`, exact `plan_bytes_base64`, and `plan_digest` (`sha256:<hex>`).
|
|
24
|
+
Decode and consume those exact bytes; do not reopen the lexical path. Retain
|
|
25
|
+
the canonical path and digest together for the complete Deepen session; a
|
|
26
|
+
receipt for one path never authorizes another, even when their bytes match.
|
|
27
|
+
|
|
28
|
+
```bash
|
|
29
|
+
node <skill-dir>/scripts/evidence-provenance.mjs snapshot \
|
|
30
|
+
--repo "$PWD" \
|
|
31
|
+
--schema-version 2 \
|
|
32
|
+
--generated-plan docs/plans/YYYY-MM-DD-gitnexus-plan-example-change-plan.md \
|
|
33
|
+
--cited src/one.ts \
|
|
34
|
+
--cited test/one.test.ts
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
Pass one `--cited` argument for every cited path. The helper emits the complete
|
|
38
|
+
JSON value for `evidence_provenance`; copy that value without rewriting fields.
|
|
39
|
+
`gitnexus-work` passes the plan's `schema_version`, `generated_plan_path`, and
|
|
40
|
+
every path in `cited_path_manifest`. Schema 1 is legacy and deliberately
|
|
41
|
+
rejected, so the executor must conservatively re-anchor it under schema 2.
|
|
42
|
+
|
|
43
|
+
After the snapshot is in the fully composed document, publish its exact UTF-8
|
|
44
|
+
bytes through the same helper:
|
|
45
|
+
|
|
46
|
+
```bash
|
|
47
|
+
node <skill-dir>/scripts/evidence-provenance.mjs write-plan \
|
|
48
|
+
--repo "$PWD" \
|
|
49
|
+
--generated-plan docs/plans/YYYY-MM-DD-gitnexus-plan-example-change-plan.md \
|
|
50
|
+
< /path/to/outside-repo-scratch-plan.md
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
For Deepen only:
|
|
54
|
+
|
|
55
|
+
```bash
|
|
56
|
+
node <skill-dir>/scripts/evidence-provenance.mjs write-plan \
|
|
57
|
+
--repo "$PWD" \
|
|
58
|
+
--generated-plan docs/plans/YYYY-MM-DD-gitnexus-plan-example-change-plan.md \
|
|
59
|
+
--replace \
|
|
60
|
+
--expected-plan-path docs/plans/YYYY-MM-DD-gitnexus-plan-example-change-plan.md \
|
|
61
|
+
--expected-plan-digest 'sha256:<digest-from-read-plan>' \
|
|
62
|
+
< /path/to/outside-repo-scratch-plan.md
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
Initial planning never passes `--replace`; an existing destination is an
|
|
66
|
+
error. Deepen mode rewrites the same path by adding `--replace`,
|
|
67
|
+
`--expected-plan-path <generated_plan_path-from-read-plan>`, and
|
|
68
|
+
`--expected-plan-digest <plan_digest-from-that-same-receipt>`. Standard input must be
|
|
69
|
+
valid UTF-8 and at most 16 MiB. A successful write prints a JSON receipt with
|
|
70
|
+
the normalized `generated_plan_path` and `bytes_written`. A successful Deepen
|
|
71
|
+
write also returns `prior_plan_backup_git_path`, a durable Git-admin path for
|
|
72
|
+
the displaced plan. The CLI rejects every option that does not apply to its
|
|
73
|
+
selected command; the direct API likewise requires literal booleans and exact
|
|
74
|
+
digest strings rather than truthy coercion.
|
|
75
|
+
|
|
76
|
+
## Path contract
|
|
77
|
+
|
|
78
|
+
Every Git path and CLI path must be valid UTF-8, already normalized to Unicode
|
|
79
|
+
NFC, and a nonempty POSIX repo-relative path. NUL, backslash, absolute/drive
|
|
80
|
+
paths, empty components, and `.` or `..` components are rejected. The helper
|
|
81
|
+
does not silently repair or alias them. Invalid UTF-8 from Git, non-NFC names,
|
|
82
|
+
unmerged index stages, unsupported Git modes, sockets/devices/FIFOs, unreadable
|
|
83
|
+
objects, symlink traversal in a parent path component, or a repository mutation
|
|
84
|
+
observed during the snapshot fail closed.
|
|
85
|
+
|
|
86
|
+
The generated-plan path is always repo-relative under schema 2. Snapshot
|
|
87
|
+
exclusion and writing require exactly
|
|
88
|
+
`docs/plans/YYYY-MM-DD-gitnexus-plan-<3-5-word-kebab-slug>.md`, including a
|
|
89
|
+
valid calendar date; they cannot target `.git`, source, configuration, or an
|
|
90
|
+
arbitrary repo file. For compatibility with documented and legacy plans,
|
|
91
|
+
`read-plan` accepts normalized files matching `docs/plans/*gitnexus-plan*.md`,
|
|
92
|
+
while retaining the same descriptor-anchored containment checks. That read
|
|
93
|
+
compatibility does not widen the writer. External output has no schema-2
|
|
94
|
+
representation. The snapshot exclusion is one exact normalized path
|
|
95
|
+
comparison. No glob, directory, basename, or `docs/plans/`-wide exclusion is
|
|
96
|
+
permitted. If the exact path is a rename endpoint, only that endpoint record is
|
|
97
|
+
excluded.
|
|
98
|
+
|
|
99
|
+
## Safe existing-plan read contract
|
|
100
|
+
|
|
101
|
+
`read-plan` fails closed unless Linux `/proc/self/fd`, `O_DIRECTORY`, and
|
|
102
|
+
`O_NOFOLLOW` are available. It resolves the exact Git top-level, opens the
|
|
103
|
+
repository root and every plan parent as held no-follow directory descriptors,
|
|
104
|
+
rejects missing, symlink, non-directory, and escaping parents, and opens the
|
|
105
|
+
leaf with `O_NOFOLLOW`. It reads at most 16 MiB from that held file descriptor,
|
|
106
|
+
requires valid UTF-8, hashes the exact bytes, then proves both the parent chain
|
|
107
|
+
and lexical leaf still name the same held objects before returning its receipt.
|
|
108
|
+
Neither Deepen nor work may parse bytes obtained before or outside this receipt.
|
|
109
|
+
|
|
110
|
+
## Safe generated-plan write contract
|
|
111
|
+
|
|
112
|
+
The writer fails closed unless Linux `/proc/self/fd`, `O_DIRECTORY`,
|
|
113
|
+
`O_NOFOLLOW`, and Python 3 with libc `renameat2(RENAME_NOREPLACE)` support are
|
|
114
|
+
available. Python may live in `/usr/local`, a Nix profile, or another absolute
|
|
115
|
+
PATH directory, but the helper accepts only a resolved executable and
|
|
116
|
+
containing directory owned by root or the current user and not writable by
|
|
117
|
+
group/other. The resolved executable is opened without following links and
|
|
118
|
+
invoked through that held descriptor. Relative PATH entries are ignored. The plan parent and the
|
|
119
|
+
repository's Git-admin directory must also share a filesystem. It resolves
|
|
120
|
+
the target repository's exact Git top-level, opens that root and every
|
|
121
|
+
destination parent as held no-follow directory descriptors, creates missing
|
|
122
|
+
parents relative to those descriptors, and proves the descriptor and lexical
|
|
123
|
+
chains still identify the same directories at the write boundary. A symlink
|
|
124
|
+
or non-directory parent, an escaping resolved path, a symlink/non-regular final
|
|
125
|
+
target, or a parent swap is an error.
|
|
126
|
+
|
|
127
|
+
The writer creates a random exclusive temporary file relative to the held final
|
|
128
|
+
parent descriptor and keeps its no-follow descriptor open. It writes and
|
|
129
|
+
flushes the bytes, binds the temporary name to the opened inode, and hashes the
|
|
130
|
+
open file before publication. Immediately before publication it revalidates
|
|
131
|
+
the parent and the temporary path, inode, size, and digest. Publication uses an
|
|
132
|
+
atomic no-replace move relative to the held directory descriptor. Initial mode
|
|
133
|
+
therefore cannot overwrite a destination that appears after the absent check.
|
|
134
|
+
The writer then flushes the directory and revalidates the committed path by
|
|
135
|
+
opening it with `O_NOFOLLOW`, hashing both the original temporary fd and the
|
|
136
|
+
path-bound fd, and performing a second descriptor-anchored path identity check
|
|
137
|
+
after hashing. A detected mutation or replacement aborts instead of accepting
|
|
138
|
+
mixed-era output.
|
|
139
|
+
|
|
140
|
+
`--replace` accepts only a pre-existing regular file and is reserved for
|
|
141
|
+
Deepen; without it, accidental overwrite is rejected. It also requires the
|
|
142
|
+
exact canonical `generated_plan_path` and `plan_digest` from the same session's
|
|
143
|
+
`read-plan` receipt. The expected path must exactly equal the write
|
|
144
|
+
destination, so identical bytes from one plan cannot authorize another plan.
|
|
145
|
+
Immediately before
|
|
146
|
+
preservation, the writer hashes the still-held prior-plan fd and rejects any
|
|
147
|
+
digest, inode, or path mismatch, including same-inode edits and changes between
|
|
148
|
+
read and write. It then atomically moves the current destination without
|
|
149
|
+
replacement to a random `gitnexus-plan-backups/` file under the resolved
|
|
150
|
+
Git-admin directory and verifies the moved inode and digest against that held
|
|
151
|
+
fd. Only then does it publish the new plan with the same atomic no-replace
|
|
152
|
+
primitive. A destination that reappears at either boundary is left untouched.
|
|
153
|
+
|
|
154
|
+
Every newly created plan or vault directory is fsynced and then fsynced into
|
|
155
|
+
its containing directory. Every cross-directory preservation move fsyncs both
|
|
156
|
+
its source and destination directories before success or a recovery path is
|
|
157
|
+
reported. After temporary bytes exist, a failed publication or verification preserves
|
|
158
|
+
every available prior, displaced, unpublished, or intended plan in that
|
|
159
|
+
Git-admin vault before reporting failure. Each reported recovery is reopened
|
|
160
|
+
from a freshly resolved Git root and verified before the error names it as
|
|
161
|
+
`git-path:gitnexus-plan-backups/<random-name>`. Resolve that value with
|
|
162
|
+
`git rev-parse --git-path gitnexus-plan-backups/<random-name>`; never interpret
|
|
163
|
+
it as a repo-relative working-tree path. This remains valid if the held plan
|
|
164
|
+
parent was renamed after publication. The writer never reports recovery
|
|
165
|
+
through a stale lexical parent and never performs an identity-check-then-unlink
|
|
166
|
+
rollback that could delete a racer's replacement. Read-only or unsupported
|
|
167
|
+
checkouts produce a blocking error. Callers must not bypass the helper,
|
|
168
|
+
redirect to an external path, or weaken these checks.
|
|
169
|
+
|
|
170
|
+
## Canonical bytes
|
|
171
|
+
|
|
172
|
+
The `global_dirty_digest.value` is lowercase SHA-256 (without a `sha256:`
|
|
173
|
+
prefix) over this byte stream. All textual values are their exact UTF-8 bytes.
|
|
174
|
+
`NUL` below is one `0x00` byte.
|
|
175
|
+
|
|
176
|
+
1. Prefix fields, each followed by NUL, then one additional NUL:
|
|
177
|
+
`gitnexus-evidence-provenance`, `schema_version`, `2`.
|
|
178
|
+
2. Zero or more records sorted by unsigned lexicographic comparison of the
|
|
179
|
+
normalized path's UTF-8 bytes. Locale and filesystem order are forbidden.
|
|
180
|
+
3. Each record is `record` + NUL, then the following fixed-order sequence of
|
|
181
|
+
`field-name` + NUL + `field-value` + NUL pairs, then one additional NUL:
|
|
182
|
+
`path`, `state`, `head_kind`, `index_kind`, `worktree_kind`,
|
|
183
|
+
`untracked_kind`, `rename_from`, `rename_to`, `head_digest`,
|
|
184
|
+
`index_digest`, `worktree_digest`, `untracked_digest`.
|
|
185
|
+
4. The literal `absent` represents every unavailable rename endpoint, object
|
|
186
|
+
kind, and layer digest in canonical bytes. It is never an empty string.
|
|
187
|
+
|
|
188
|
+
The schema's canonicalization literal is exactly
|
|
189
|
+
`gitnexus-evidence-provenance-v2 NUL-framed UTF-8 records`. The fixed field
|
|
190
|
+
count plus the extra NUL after prefix/record makes framing unambiguous; values
|
|
191
|
+
cannot contain NUL. Duplicate normalized paths are rejected.
|
|
192
|
+
|
|
193
|
+
## Records, renames, and states
|
|
194
|
+
|
|
195
|
+
The raw dirty set comes from Git porcelain v2 with NUL termination, all
|
|
196
|
+
untracked files, submodule inspection enabled, a fixed 50% rename threshold,
|
|
197
|
+
and both `diff.renameLimit=0` and `status.renameLimit=0`, so repository config
|
|
198
|
+
cannot cap rename candidates. Raw porcelain facts that share a path are merged
|
|
199
|
+
into one canonical record. A rename contributes two endpoint facts:
|
|
200
|
+
|
|
201
|
+
- old endpoint: `path=<old>`, `rename_from=absent`, `rename_to=<new>`;
|
|
202
|
+
- new endpoint: `path=<new>`, `rename_from=<old>`, `rename_to=absent`.
|
|
203
|
+
|
|
204
|
+
Both normally have state `renamed`; record sorting, not old/new role,
|
|
205
|
+
determines order. A worktree-dirty rename destination or any endpoint that also
|
|
206
|
+
has another fact is `mixed`, with rename metadata retained. When either endpoint
|
|
207
|
+
is cited, the cited manifest expands to include both.
|
|
208
|
+
|
|
209
|
+
Ordinary `XY` status maps to `mixed` when index and worktree columns are both
|
|
210
|
+
dirty, otherwise `deleted` for a deletion, `staged` for index-only change, and
|
|
211
|
+
`unstaged` for worktree-only change. `?` is `untracked`. Multiple distinct
|
|
212
|
+
facts for the same path become `mixed`; a staged deletion plus a recreated file
|
|
213
|
+
therefore retains HEAD/index facts while the filesystem object is recorded in
|
|
214
|
+
the untracked layer. `? child/` is Git's embedded-directory marker: the trailing
|
|
215
|
+
slash is removed before path normalization and `child` is materialized as one
|
|
216
|
+
bounded directory object. A cited path outside the dirty set is `clean`,
|
|
217
|
+
`untracked` when it exists only outside Git layers, or `absent` when no layer
|
|
218
|
+
exists.
|
|
219
|
+
|
|
220
|
+
## Object and digest rules
|
|
221
|
+
|
|
222
|
+
Every present layer digest is `sha256:<lowercase-hex>`:
|
|
223
|
+
|
|
224
|
+
- HEAD regular/symlink: SHA-256 of the exact Git blob bytes. HEAD directory:
|
|
225
|
+
SHA-256 of the exact raw Git tree bytes. HEAD gitlink: SHA-256 of the ASCII
|
|
226
|
+
object ID stored by the tree.
|
|
227
|
+
- Index regular/symlink: SHA-256 of the stage-0 Git blob bytes. Index gitlink:
|
|
228
|
+
SHA-256 of its ASCII object ID. The index has no directory layer. Any
|
|
229
|
+
non-stage-0 entry is rejected.
|
|
230
|
+
- Tracked worktree regular: raw file bytes, opened without following symlinks.
|
|
231
|
+
Symlink: raw link-target bytes. Gitlink: ASCII object ID at the checked-out
|
|
232
|
+
nested HEAD, but only after `rev-parse --show-toplevel` proves that the
|
|
233
|
+
directory itself is the nested repository root, `HEAD` resolves there, and
|
|
234
|
+
porcelain v2 reports no staged, unstaged, untracked, or ignored nested changes. The
|
|
235
|
+
same root, HEAD, and clean-status proof is repeated by the mutation guard. A
|
|
236
|
+
dirty, empty, uninitialized, or parent-falling-through gitlink fails closed.
|
|
237
|
+
Directory: the v1 directory stream described below.
|
|
238
|
+
- A path absent from both HEAD and index places the filesystem object in the
|
|
239
|
+
`untracked` layer and marks `worktree` absent. A Git-backed path places it in
|
|
240
|
+
`worktree` and marks `untracked` absent. A missing layer uses literal
|
|
241
|
+
`absent` for both kind and digest; an empty file is the SHA-256 of zero bytes.
|
|
242
|
+
|
|
243
|
+
Filesystem directory bytes use prefix fields
|
|
244
|
+
`gitnexus-evidence-directory`, `schema_version`, `1`, the same NUL framing,
|
|
245
|
+
and recursive entries sorted by unsigned UTF-8 relative-path bytes. Each entry
|
|
246
|
+
has fixed fields `path`, `kind`, `digest`. A single bottom-up filesystem walk
|
|
247
|
+
visits each node once and returns each child digest plus the flattened subtree
|
|
248
|
+
needed to preserve those canonical bytes; links are never followed. When the
|
|
249
|
+
directory is proven to be an exact nested Git top-level, only its administrative
|
|
250
|
+
`.git` entry is excluded. Every other child, including working files and nested
|
|
251
|
+
directories, remains evidence.
|
|
252
|
+
|
|
253
|
+
Each directory object is bounded to 10,000 visited entries, depth 256, and 256
|
|
254
|
+
MiB of regular-file content. Exceeding a bound fails closed. These bounds apply
|
|
255
|
+
independently to each top-level directory object materialized by a record.
|
|
256
|
+
|
|
257
|
+
HEAD objects are read only from the full object ID captured at snapshot start;
|
|
258
|
+
the symbolic `HEAD` name is never re-resolved for layers. Index layers are
|
|
259
|
+
parsed from one captured stage-0 listing. The helper guards the corresponding
|
|
260
|
+
HEAD/ref/reflog controls and raw index file, compares the captured listing at
|
|
261
|
+
the end, and rejects ordinary A-to-B-to-A mutations instead of accepting
|
|
262
|
+
mixed-era layers.
|
|
263
|
+
|
|
264
|
+
Regular files are read through an `O_NOFOLLOW` descriptor with before/after
|
|
265
|
+
identity checks. Symlinks use lstat/readlink/lstat; directories record identity
|
|
266
|
+
before and after their inventory. The helper also compares raw porcelain-v2
|
|
267
|
+
status and HEAD at the start and end, then rechecks filesystem guards. An
|
|
268
|
+
absent cited path holds a no-follow descriptor for the nearest existing parent
|
|
269
|
+
and records the first missing component or leaf; that anchored absence is
|
|
270
|
+
checked both before and after the final Git status pass, so a newly created
|
|
271
|
+
ignored path cannot evade porcelain. Any observed race rejects the snapshot
|
|
272
|
+
rather than emitting mixed-era evidence.
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
# Building the PDG context slice
|
|
2
|
+
|
|
3
|
+
Statement-level evidence for the 1–3 functions most central to the change.
|
|
4
|
+
Goal: a compact slice the planning LLM can hold, never a graph dump.
|
|
5
|
+
|
|
6
|
+
## Tools (all verified against `gitnexus/src/mcp/tools.ts`)
|
|
7
|
+
|
|
8
|
+
| Question | Call |
|
|
9
|
+
| --- | --- |
|
|
10
|
+
| Under what condition does X run? Guards? | `pdg_query {mode: "controls", target}` |
|
|
11
|
+
| Where does variable Y flow inside the function? | `pdg_query {mode: "flows", target, variable}` |
|
|
12
|
+
| What depends on the statement at line N? | `impact {mode: "pdg", target, direction: "upstream", line: N}` |
|
|
13
|
+
| Source→sink taint paths (security mode) | `explain {target}` |
|
|
14
|
+
|
|
15
|
+
Contract caveats that shape interpretation:
|
|
16
|
+
|
|
17
|
+
- `impact` requires `direction` in every mode, `mode: "pdg"` included —
|
|
18
|
+
`"upstream"` for "what depends on this statement", `"downstream"` for what
|
|
19
|
+
it depends on. Omitting it fails schema validation.
|
|
20
|
+
- CDG branch sense is `'T'`/`'F'` in the result's `label` field; a guard's
|
|
21
|
+
sense depends on its predicate (`if (!ok) return;` rides `'T'`) — never
|
|
22
|
+
filter guards by a fixed label. Early return/throw edges carry `guard:
|
|
23
|
+
true`. (The raw edge stores the sense in `reason`, visible only via
|
|
24
|
+
`cypher`.)
|
|
25
|
+
- `pdg_query` is intra-procedural and always anchored. Cross-function flow is
|
|
26
|
+
taint's domain (`explain`) or `impact {mode:"pdg"}`'s inter-procedural reach.
|
|
27
|
+
- Every `switch` case arm is `'T'` (per-case conditions not distinguished).
|
|
28
|
+
- No `--pdg` layer → the tools return a "no PDG layer" note, not an error.
|
|
29
|
+
The note is repo-wide: one probe settles it — do not re-probe per function.
|
|
30
|
+
Under `freshness: strict` (default), run `analyze --index-only --pdg` via
|
|
31
|
+
the runner resolved in SKILL.md Phase 1 — this is the one `--pdg` upgrade
|
|
32
|
+
Phase 1's refresh budget allows (skip it if Phase 1 already refreshed
|
|
33
|
+
with `--pdg`; apply the runner build check first) — then re-probe. If the refresh failed, is impractical, or `freshness: accept` was
|
|
34
|
+
passed: record "PDG unavailable" in the ledger, skip the slice, say so in
|
|
35
|
+
plan §5, and recommend the command. Never reconstruct edges from source by
|
|
36
|
+
hand.
|
|
37
|
+
|
|
38
|
+
## Inclusion criteria
|
|
39
|
+
|
|
40
|
+
A statement enters the slice only if it is at least one of:
|
|
41
|
+
|
|
42
|
+
- directly matched to the task;
|
|
43
|
+
- a data-flow predecessor or successor of a relevant statement (within
|
|
44
|
+
`pdg_data_depth`, default 2);
|
|
45
|
+
- a control dependency of a relevant statement (within `pdg_control_depth`,
|
|
46
|
+
default 2);
|
|
47
|
+
- a state mutation affecting the requested behavior;
|
|
48
|
+
- an external call on the execution path;
|
|
49
|
+
- an error-handling or fallback branch;
|
|
50
|
+
- part of an affected return value;
|
|
51
|
+
- required to explain a test assertion.
|
|
52
|
+
|
|
53
|
+
Everything else is cut. If the slice exceeds ~15 statements per function,
|
|
54
|
+
tighten relevance rather than raising depth.
|
|
55
|
+
|
|
56
|
+
## Slice representation
|
|
57
|
+
|
|
58
|
+
Working-memory material: keep the full slice in working context while
|
|
59
|
+
planning, summarize it into the ledger's one-line `pdg_slices` entries, and
|
|
60
|
+
distill it into plan §5.
|
|
61
|
+
|
|
62
|
+
```yaml
|
|
63
|
+
pdg_context:
|
|
64
|
+
entry_symbol: "processFileGroup"
|
|
65
|
+
source: { file: "gitnexus/src/core/ingestion/worker.ts", start_line: 120, end_line: 188 }
|
|
66
|
+
relevant_statements:
|
|
67
|
+
- id: "stmt-12" # stable id or "<file>:<line>"
|
|
68
|
+
lines: "128-130"
|
|
69
|
+
type: "condition | call | mutation | return | throw"
|
|
70
|
+
code: "if (request.retryable) {"
|
|
71
|
+
relevance: "Controls whether retry scheduling is entered"
|
|
72
|
+
defines: []
|
|
73
|
+
uses: ["request.retryable"]
|
|
74
|
+
control_dependencies: ["stmt-4"]
|
|
75
|
+
data_dependencies: []
|
|
76
|
+
execution_flow: # ordered, prose steps
|
|
77
|
+
- "Validate request"
|
|
78
|
+
- "Schedule retry"
|
|
79
|
+
critical_dependencies:
|
|
80
|
+
- { from: "stmt-7", to: "stmt-18", type: "data", explanation: "Validated request becomes scheduler input" }
|
|
81
|
+
behavioural_observations:
|
|
82
|
+
- "Persistence occurs before scheduler invocation"
|
|
83
|
+
planning_implications:
|
|
84
|
+
- "Changes to scheduling must account for partial failure"
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
Adapt field names to what the tools actually returned; keep it
|
|
88
|
+
machine-readable and short. `behavioural_observations` are confirmed facts;
|
|
89
|
+
`planning_implications` are inferences — keep the distinction.
|
|
90
|
+
|
|
91
|
+
## Security mode (task category: security)
|
|
92
|
+
|
|
93
|
+
Additionally identify and record: untrusted inputs, validation points,
|
|
94
|
+
sanitisation points, authn/authz checks, privilege boundaries, sensitive data,
|
|
95
|
+
persistence operations, network calls, dangerous sinks, and error paths that
|
|
96
|
+
bypass validation. Run `explain {target}` for persisted source→sink taint
|
|
97
|
+
paths (intra-procedural TAINTED edges and cross-function TAINT_PATH flows)
|
|
98
|
+
and include the hop paths for findings relevant to the task. Absence of a
|
|
99
|
+
taint finding is **not** proof of safety — closure/callback flows,
|
|
100
|
+
property/field flows, and implicit flows are not modeled, and guard-style
|
|
101
|
+
sanitizers may be missed — say so when it matters.
|
|
102
|
+
|
|
103
|
+
## Performance mode (task category: performance)
|
|
104
|
+
|
|
105
|
+
Additionally scan the slice for: loops, repeated calls, blocking operations,
|
|
106
|
+
network calls, database calls, allocation-heavy paths, caching boundaries,
|
|
107
|
+
concurrency, fan-out, repeated data transformations. State likely hot-path
|
|
108
|
+
implications as inferences; never claim measured improvements without
|
|
109
|
+
benchmark evidence.
|
|
@@ -0,0 +1,201 @@
|
|
|
1
|
+
# Plan document template
|
|
2
|
+
|
|
3
|
+
Two forms, chosen by the Phase 0 category (`form` knob overrides): **compact**
|
|
4
|
+
for narrow/default work, **full** for deep work. Repo-relative paths for all
|
|
5
|
+
repo artifacts in both.
|
|
6
|
+
|
|
7
|
+
## Compact form
|
|
8
|
+
|
|
9
|
+
Same evidence header, then only the load-bearing sections — keep the §
|
|
10
|
+
numbers in the headings so `gitnexus-work`'s § references resolve:
|
|
11
|
+
|
|
12
|
+
```markdown
|
|
13
|
+
# GitNexus Engineering Plan
|
|
14
|
+
|
|
15
|
+
> Task: <one line>
|
|
16
|
+
> Evidence verified at commit <sha>; GitNexus index <...>.
|
|
17
|
+
> Evidence provenance schema 2; global dirty digest <sha256>; cited-path manifest <count> sorted entries; exact generated plan path excluded.
|
|
18
|
+
|
|
19
|
+
## Objective (§1)
|
|
20
|
+
|
|
21
|
+
## Current Behaviour (§2–3) — ≤10 lines, architecture folded in
|
|
22
|
+
|
|
23
|
+
## Findings (§4–5) — only load-bearing, each tagged + tool-named
|
|
24
|
+
|
|
25
|
+
## Proposed Changes (§6)
|
|
26
|
+
|
|
27
|
+
## Implementation Sequence (§7) — risks inline as step notes
|
|
28
|
+
|
|
29
|
+
## Test Strategy (§8)
|
|
30
|
+
|
|
31
|
+
## Implementation Context (§11) — the mini-pack (see context-pack.md)
|
|
32
|
+
|
|
33
|
+
## Assumptions and Open Questions (§12)
|
|
34
|
+
|
|
35
|
+
## Definition of Done (§13)
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
Hard cap: **80 lines excluding the §11 pack**. Anything cut that still
|
|
39
|
+
matters becomes one line in §12 — never padded prose. A compact plan that
|
|
40
|
+
outgrows the cap is a signal the task was misclassified: reclassify to full
|
|
41
|
+
rather than overflowing.
|
|
42
|
+
|
|
43
|
+
## Full form
|
|
44
|
+
|
|
45
|
+
Fill every section below. If a section is genuinely empty for this task
|
|
46
|
+
(e.g. no PDG layer indexed), keep the heading and state why in one line —
|
|
47
|
+
never silently drop it.
|
|
48
|
+
|
|
49
|
+
**Claim tagging.** Tag every load-bearing claim with its evidence class:
|
|
50
|
+
`[verified]` (source-read at the pinned commit), `[graph]` (GitNexus/PDG
|
|
51
|
+
output, not source-confirmed), `[inferred]` (evidence-backed reasoning),
|
|
52
|
+
`[assumed]` (unverified — must also appear in §12). Untagged prose is
|
|
53
|
+
narrative, not evidence.
|
|
54
|
+
|
|
55
|
+
```markdown
|
|
56
|
+
# GitNexus Engineering Plan
|
|
57
|
+
|
|
58
|
+
> Task: <one line>
|
|
59
|
+
> Evidence verified at commit <HEAD sha>; GitNexus index <fresh | refreshed this session (--index-only [--pdg]) | N commits behind, refresh skipped: <reason> | not used>.
|
|
60
|
+
> Evidence provenance schema 2; global dirty digest <sha256>; cited-path manifest <count> sorted entries; exact generated plan path excluded.
|
|
61
|
+
|
|
62
|
+
## 1. Objective
|
|
63
|
+
|
|
64
|
+
A concise description of the requested outcome.
|
|
65
|
+
|
|
66
|
+
## 2. Current Behaviour
|
|
67
|
+
|
|
68
|
+
Describe the current implementation and execution path.
|
|
69
|
+
|
|
70
|
+
Include the most relevant symbols, files, and statement-level observations.
|
|
71
|
+
|
|
72
|
+
## 3. Relevant Architecture
|
|
73
|
+
|
|
74
|
+
Explain the involved modules, boundaries, dependencies, and established patterns.
|
|
75
|
+
|
|
76
|
+
## 4. GitNexus Findings
|
|
77
|
+
|
|
78
|
+
Summarise:
|
|
79
|
+
|
|
80
|
+
- primary symbols;
|
|
81
|
+
- callers and callees;
|
|
82
|
+
- impact radius;
|
|
83
|
+
- related implementations;
|
|
84
|
+
- related tests;
|
|
85
|
+
- important cross-module relationships.
|
|
86
|
+
|
|
87
|
+
## 5. Statement-Level PDG Findings
|
|
88
|
+
|
|
89
|
+
For each critical symbol, explain:
|
|
90
|
+
|
|
91
|
+
- relevant statements;
|
|
92
|
+
- control dependencies;
|
|
93
|
+
- data dependencies;
|
|
94
|
+
- state mutations;
|
|
95
|
+
- error branches;
|
|
96
|
+
- side effects;
|
|
97
|
+
- ordering constraints;
|
|
98
|
+
- planning implications.
|
|
99
|
+
|
|
100
|
+
Do not paste an unfiltered graph dump.
|
|
101
|
+
|
|
102
|
+
## 6. Proposed Changes
|
|
103
|
+
|
|
104
|
+
For every proposed change include:
|
|
105
|
+
|
|
106
|
+
- file;
|
|
107
|
+
- symbol;
|
|
108
|
+
- exact responsibility;
|
|
109
|
+
- intended behavioural change;
|
|
110
|
+
- dependencies;
|
|
111
|
+
- constraints;
|
|
112
|
+
- implementation notes.
|
|
113
|
+
|
|
114
|
+
## 7. Implementation Sequence
|
|
115
|
+
|
|
116
|
+
Provide an ordered sequence of implementation steps.
|
|
117
|
+
|
|
118
|
+
Each step must be independently actionable.
|
|
119
|
+
|
|
120
|
+
## 8. Test Strategy
|
|
121
|
+
|
|
122
|
+
Describe:
|
|
123
|
+
|
|
124
|
+
- tests to add;
|
|
125
|
+
- tests to update;
|
|
126
|
+
- edge cases;
|
|
127
|
+
- failure paths;
|
|
128
|
+
- regression coverage;
|
|
129
|
+
- integration boundaries;
|
|
130
|
+
- relevant verification commands.
|
|
131
|
+
|
|
132
|
+
## 9. Risk and Impact Analysis
|
|
133
|
+
|
|
134
|
+
Include:
|
|
135
|
+
|
|
136
|
+
- high-risk symbols;
|
|
137
|
+
- downstream consumers;
|
|
138
|
+
- compatibility concerns;
|
|
139
|
+
- performance concerns;
|
|
140
|
+
- concurrency or transaction risks;
|
|
141
|
+
- migration risks;
|
|
142
|
+
- observability requirements.
|
|
143
|
+
|
|
144
|
+
## 10. Files Expected to Change
|
|
145
|
+
|
|
146
|
+
| File | Symbols | Reason |
|
|
147
|
+
| ---- | ------- | ------ |
|
|
148
|
+
|
|
149
|
+
## 11. Reusable Implementation Context
|
|
150
|
+
|
|
151
|
+
The machine-readable context pack — see `context-pack.md`. Its mandatory
|
|
152
|
+
`evidence_provenance` field carries the full pinned commit, canonical
|
|
153
|
+
repository-wide dirty digest, and sorted cited-path manifest.
|
|
154
|
+
|
|
155
|
+
## 12. Assumptions and Open Questions
|
|
156
|
+
|
|
157
|
+
Clearly separate assumptions from confirmed facts. Explicitly-deferred
|
|
158
|
+
follow-up suggestions (adjacent work the task didn't ask for) land here too.
|
|
159
|
+
|
|
160
|
+
## 13. Definition of Done
|
|
161
|
+
|
|
162
|
+
Concrete, testable completion criteria.
|
|
163
|
+
```
|
|
164
|
+
|
|
165
|
+
Composition notes:
|
|
166
|
+
|
|
167
|
+
- Immediately before composition, emit `evidence_provenance.schema_version`,
|
|
168
|
+
the full HEAD commit, the canonical `global_dirty_digest`, and the
|
|
169
|
+
`cited_path_manifest` sorted by normalized repo-relative path. Include
|
|
170
|
+
object kinds, rename endpoints, and HEAD/index/worktree/untracked layer
|
|
171
|
+
digests. Exclude only the generated plan path from the global digest.
|
|
172
|
+
- Invoke `scripts/evidence-provenance.mjs` per `evidence-provenance.md` and
|
|
173
|
+
copy its schema-2 JSON; never recreate canonical records in prose or shell.
|
|
174
|
+
- Publish the fully composed UTF-8 plan only with that helper's `write-plan`
|
|
175
|
+
command. Initial planning must not replace an existing file; Deepen rewrites
|
|
176
|
+
the same repo-relative path with `write-plan --replace
|
|
177
|
+
--expected-plan-path <path-from-read-plan>
|
|
178
|
+
--expected-plan-digest <digest-from-read-plan>`, which preserves the prior
|
|
179
|
+
plan in the receipt's `prior_plan_backup_git_path`. Both expected values must
|
|
180
|
+
come from the same receipt. Deepen must load and bind that canonical path and
|
|
181
|
+
those original bytes through `read-plan` first. Snapshot, read, and
|
|
182
|
+
publication must pass the same strict generated-plan filename/date validator.
|
|
183
|
+
- §2/§5 quote source excerpts at most `max_snippet_lines` (30) lines each, and
|
|
184
|
+
only when the excerpt carries the argument.
|
|
185
|
+
- §4 findings each name the tool call they came from (tool + key args), plus a
|
|
186
|
+
one-line quote of the result when the plan leans on it — that is what makes
|
|
187
|
+
a tool claim auditable later. Stale-index or fallback-mode findings are
|
|
188
|
+
labelled as such.
|
|
189
|
+
- §6 changes may only name symbols the ledger marks `source_verified`.
|
|
190
|
+
- §7 steps are ordered by dependency and independently actionable — an
|
|
191
|
+
executor can stop after any step with the tree still coherent. Steps that
|
|
192
|
+
change output guarded by fingerprints, goldens, or recorded baselines
|
|
193
|
+
regenerate those artifacts ONCE, in the final step of the sequence — CI
|
|
194
|
+
judges only the tip, and per-step refreshes churn every intermediate
|
|
195
|
+
commit and re-drift as later steps land.
|
|
196
|
+
- §8 names real, located test files for updates; new tests get concrete
|
|
197
|
+
scenario lists (input → action → expected outcome). Verification commands
|
|
198
|
+
must exist AND be runnable: prefer the npm/CI script form that carries its
|
|
199
|
+
prerequisites (pre-hooks, builds) over invoking underlying binaries directly.
|
|
200
|
+
- §9 must account for every direct (depth-1) dependent the impact pass
|
|
201
|
+
reported.
|