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.
Files changed (540) hide show
  1. package/README.md +236 -53
  2. package/dist/_shared/graph/types.d.ts +67 -3
  3. package/dist/_shared/graph/types.d.ts.map +1 -1
  4. package/dist/_shared/index.d.ts +1 -0
  5. package/dist/_shared/index.d.ts.map +1 -1
  6. package/dist/_shared/index.js.map +1 -1
  7. package/dist/_shared/integrations/resilient-fetch.d.ts +3 -1
  8. package/dist/_shared/integrations/resilient-fetch.d.ts.map +1 -1
  9. package/dist/_shared/integrations/resilient-fetch.js +4 -3
  10. package/dist/_shared/integrations/resilient-fetch.js.map +1 -1
  11. package/dist/_shared/language-detection.d.ts.map +1 -1
  12. package/dist/_shared/language-detection.js +2 -0
  13. package/dist/_shared/language-detection.js.map +1 -1
  14. package/dist/_shared/languages.d.ts +2 -0
  15. package/dist/_shared/languages.d.ts.map +1 -1
  16. package/dist/_shared/languages.js +2 -0
  17. package/dist/_shared/languages.js.map +1 -1
  18. package/dist/_shared/lbug/schema-constants.d.ts +2 -2
  19. package/dist/_shared/lbug/schema-constants.d.ts.map +1 -1
  20. package/dist/_shared/lbug/schema-constants.js +8 -0
  21. package/dist/_shared/lbug/schema-constants.js.map +1 -1
  22. package/dist/_shared/pipeline.d.ts +1 -1
  23. package/dist/_shared/pipeline.d.ts.map +1 -1
  24. package/dist/_shared/scope-resolution/callable-flow-site.d.ts +110 -0
  25. package/dist/_shared/scope-resolution/callable-flow-site.d.ts.map +1 -0
  26. package/dist/_shared/scope-resolution/callable-flow-site.js +11 -0
  27. package/dist/_shared/scope-resolution/callable-flow-site.js.map +1 -0
  28. package/dist/_shared/scope-resolution/finalize-algorithm.d.ts +1 -1
  29. package/dist/_shared/scope-resolution/finalize-algorithm.d.ts.map +1 -1
  30. package/dist/_shared/scope-resolution/finalize-algorithm.js +1 -1
  31. package/dist/_shared/scope-resolution/finalize-algorithm.js.map +1 -1
  32. package/dist/_shared/scope-resolution/language-classification.d.ts.map +1 -1
  33. package/dist/_shared/scope-resolution/language-classification.js +1 -0
  34. package/dist/_shared/scope-resolution/language-classification.js.map +1 -1
  35. package/dist/_shared/scope-resolution/parsed-file.d.ts +7 -0
  36. package/dist/_shared/scope-resolution/parsed-file.d.ts.map +1 -1
  37. package/dist/_shared/scope-resolution/reference-site.d.ts +9 -1
  38. package/dist/_shared/scope-resolution/reference-site.d.ts.map +1 -1
  39. package/dist/_shared/scope-resolution/types.d.ts +20 -3
  40. package/dist/_shared/scope-resolution/types.d.ts.map +1 -1
  41. package/dist/cli/ai-context.d.ts +1 -1
  42. package/dist/cli/ai-context.js +25 -44
  43. package/dist/cli/analyze.d.ts +5 -2
  44. package/dist/cli/analyze.js +205 -11
  45. package/dist/cli/clean.js +17 -3
  46. package/dist/cli/cli-message.d.ts +1 -1
  47. package/dist/cli/doctor.d.ts +18 -0
  48. package/dist/cli/doctor.js +96 -5
  49. package/dist/cli/editor-targets.d.ts +17 -2
  50. package/dist/cli/editor-targets.js +44 -0
  51. package/dist/cli/embeddings.d.ts +12 -0
  52. package/dist/cli/embeddings.js +49 -0
  53. package/dist/cli/eval-server.d.ts +23 -1
  54. package/dist/cli/eval-server.js +126 -8
  55. package/dist/cli/help-i18n.js +6 -0
  56. package/dist/cli/i18n/en.d.ts +18 -8
  57. package/dist/cli/i18n/en.js +18 -8
  58. package/dist/cli/i18n/resources.d.ts +28 -8
  59. package/dist/cli/i18n/zh-CN.d.ts +10 -0
  60. package/dist/cli/i18n/zh-CN.js +18 -8
  61. package/dist/cli/index.js +21 -7
  62. package/dist/cli/lazy-action.d.ts +7 -0
  63. package/dist/cli/lazy-action.js +27 -0
  64. package/dist/cli/mcp.js +6 -3
  65. package/dist/cli/move-availability.d.ts +5 -0
  66. package/dist/cli/move-availability.js +11 -0
  67. package/dist/cli/setup.d.ts +8 -0
  68. package/dist/cli/setup.js +230 -32
  69. package/dist/cli/skill-gen.js +38 -18
  70. package/dist/cli/standard-skills.d.ts +76 -0
  71. package/dist/cli/standard-skills.js +45 -0
  72. package/dist/cli/status.d.ts +4 -1
  73. package/dist/cli/status.js +57 -4
  74. package/dist/cli/tool.js +11 -0
  75. package/dist/cli/uninstall.js +77 -18
  76. package/dist/cli/wiki.d.ts +1 -0
  77. package/dist/cli/wiki.js +7 -1
  78. package/dist/config/ignore-service.d.ts +2 -0
  79. package/dist/config/ignore-service.js +27 -0
  80. package/dist/core/analysis-features.d.ts +21 -0
  81. package/dist/core/analysis-features.js +59 -0
  82. package/dist/core/analyzer-identity.d.ts +74 -0
  83. package/dist/core/analyzer-identity.js +1820 -0
  84. package/dist/core/augmentation/engine.js +13 -8
  85. package/dist/core/embeddings/embedder.d.ts +3 -2
  86. package/dist/core/embeddings/embedder.js +24 -7
  87. package/dist/core/embeddings/embedding-identity.d.ts +11 -0
  88. package/dist/core/embeddings/embedding-identity.js +24 -0
  89. package/dist/core/embeddings/embedding-pipeline.d.ts +36 -1
  90. package/dist/core/embeddings/embedding-pipeline.js +100 -9
  91. package/dist/core/embeddings/http-client.d.ts +33 -3
  92. package/dist/core/embeddings/http-client.js +237 -25
  93. package/dist/core/embeddings/node-module-compat.d.ts +25 -0
  94. package/dist/core/embeddings/node-module-compat.js +25 -0
  95. package/dist/core/embeddings/onnxruntime-common-resolver.js +8 -5
  96. package/dist/core/embeddings/onnxruntime-node-resolver.js +33 -7
  97. package/dist/core/embeddings/runtime-install.d.ts +119 -0
  98. package/dist/core/embeddings/runtime-install.js +372 -0
  99. package/dist/core/embeddings/runtime-support.d.ts +48 -17
  100. package/dist/core/embeddings/runtime-support.js +96 -0
  101. package/dist/core/git-staleness.js +1 -1
  102. package/dist/core/group/bridge-db.js +2 -0
  103. package/dist/core/group/extractors/http-patterns/python.js +246 -108
  104. package/dist/core/group/extractors/manifest-extractor.js +4 -0
  105. package/dist/core/incremental/escalation-gate.d.ts +38 -0
  106. package/dist/core/incremental/escalation-gate.js +48 -0
  107. package/dist/core/incremental/shadow-candidates.d.ts +3 -3
  108. package/dist/core/incremental/shadow-candidates.js +3 -3
  109. package/dist/core/incremental/subgraph-extract.d.ts +2 -2
  110. package/dist/core/incremental/subgraph-extract.js +2 -2
  111. package/dist/core/index-freshness.d.ts +5 -0
  112. package/dist/core/index-freshness.js +13 -0
  113. package/dist/core/ingestion/class-extractors/configs/jvm.js +29 -0
  114. package/dist/core/ingestion/cobol/cobol-preprocessor.js +1 -1
  115. package/dist/core/ingestion/cobol/jcl-processor.js +9 -8
  116. package/dist/core/ingestion/cobol-processor.js +27 -26
  117. package/dist/core/ingestion/community-processor.d.ts +51 -1
  118. package/dist/core/ingestion/community-processor.js +323 -64
  119. package/dist/core/ingestion/emit-references.js +7 -2
  120. package/dist/core/ingestion/filesystem-walker.js +4 -0
  121. package/dist/core/ingestion/frameworks/spring/analysis-features.d.ts +3 -0
  122. package/dist/core/ingestion/frameworks/spring/analysis-features.js +7 -0
  123. package/dist/core/ingestion/frameworks/spring/bean-candidates.d.ts +30 -0
  124. package/dist/core/ingestion/frameworks/spring/bean-candidates.js +182 -0
  125. package/dist/core/ingestion/frameworks/spring/bean-catalog.d.ts +12 -0
  126. package/dist/core/ingestion/frameworks/spring/bean-catalog.js +26 -0
  127. package/dist/core/ingestion/frameworks/spring/config-bindings.d.ts +24 -0
  128. package/dist/core/ingestion/frameworks/spring/config-bindings.js +115 -0
  129. package/dist/core/ingestion/languages/c/captures.js +56 -0
  130. package/dist/core/ingestion/languages/c/query.js +17 -0
  131. package/dist/core/ingestion/languages/c/scope-resolver.js +6 -0
  132. package/dist/core/ingestion/languages/cobol/captures.js +93 -0
  133. package/dist/core/ingestion/languages/cobol/scope-resolver.js +7 -0
  134. package/dist/core/ingestion/languages/cpp/captures.js +365 -75
  135. package/dist/core/ingestion/languages/cpp/scope-resolver.js +14 -0
  136. package/dist/core/ingestion/languages/csharp/captures.js +25 -0
  137. package/dist/core/ingestion/languages/dart/captures.js +90 -2
  138. package/dist/core/ingestion/languages/dart/extension-type-preprocess.d.ts +7 -0
  139. package/dist/core/ingestion/languages/dart/extension-type-preprocess.js +30 -0
  140. package/dist/core/ingestion/languages/dart.js +2 -0
  141. package/dist/core/ingestion/languages/go/captures.js +34 -0
  142. package/dist/core/ingestion/languages/index.d.ts +1 -0
  143. package/dist/core/ingestion/languages/index.js +2 -0
  144. package/dist/core/ingestion/languages/java/analysis-features.d.ts +3 -0
  145. package/dist/core/ingestion/languages/java/analysis-features.js +13 -0
  146. package/dist/core/ingestion/languages/java/capture-side-channel.d.ts +22 -0
  147. package/dist/core/ingestion/languages/java/capture-side-channel.js +58 -0
  148. package/dist/core/ingestion/languages/java/captures.d.ts +4 -3
  149. package/dist/core/ingestion/languages/java/captures.js +193 -17
  150. package/dist/core/ingestion/languages/java/package-facts.d.ts +5 -0
  151. package/dist/core/ingestion/languages/java/package-facts.js +9 -0
  152. package/dist/core/ingestion/languages/java/package-siblings.d.ts +3 -16
  153. package/dist/core/ingestion/languages/java/package-siblings.js +8 -147
  154. package/dist/core/ingestion/languages/java/query.js +23 -0
  155. package/dist/core/ingestion/languages/java/scope-resolver.js +23 -0
  156. package/dist/core/ingestion/languages/java/spring-bean-metadata.d.ts +2 -0
  157. package/dist/core/ingestion/languages/java/spring-bean-metadata.js +8 -0
  158. package/dist/core/ingestion/languages/java/spring-config-bindings.d.ts +23 -0
  159. package/dist/core/ingestion/languages/java/spring-config-bindings.js +215 -0
  160. package/dist/core/ingestion/languages/java.js +3 -0
  161. package/dist/core/ingestion/languages/javascript/captures.js +16 -0
  162. package/dist/core/ingestion/languages/javascript/query.js +21 -0
  163. package/dist/core/ingestion/languages/jvm/package-facts.d.ts +35 -0
  164. package/dist/core/ingestion/languages/jvm/package-facts.js +40 -0
  165. package/dist/core/ingestion/languages/jvm/package-siblings.d.ts +14 -0
  166. package/dist/core/ingestion/languages/jvm/package-siblings.js +129 -0
  167. package/dist/core/ingestion/languages/kotlin/capture-side-channel.d.ts +17 -3
  168. package/dist/core/ingestion/languages/kotlin/capture-side-channel.js +42 -8
  169. package/dist/core/ingestion/languages/kotlin/captures.js +59 -0
  170. package/dist/core/ingestion/languages/kotlin/package-facts.d.ts +5 -0
  171. package/dist/core/ingestion/languages/kotlin/package-facts.js +9 -0
  172. package/dist/core/ingestion/languages/kotlin/package-siblings.d.ts +4 -0
  173. package/dist/core/ingestion/languages/kotlin/package-siblings.js +8 -0
  174. package/dist/core/ingestion/languages/kotlin/query.js +19 -0
  175. package/dist/core/ingestion/languages/kotlin/scope-resolver.js +9 -1
  176. package/dist/core/ingestion/languages/kotlin/spring-bean-metadata.d.ts +2 -0
  177. package/dist/core/ingestion/languages/kotlin/spring-bean-metadata.js +8 -0
  178. package/dist/core/ingestion/languages/kotlin.js +5 -6
  179. package/dist/core/ingestion/languages/move.d.ts +1 -0
  180. package/dist/core/ingestion/languages/move.js +27 -0
  181. package/dist/core/ingestion/languages/php/captures.js +40 -0
  182. package/dist/core/ingestion/languages/php/import-decomposer.js +12 -0
  183. package/dist/core/ingestion/languages/php/import-target.d.ts +2 -1
  184. package/dist/core/ingestion/languages/php/import-target.js +110 -2
  185. package/dist/core/ingestion/languages/php/interpret.js +10 -0
  186. package/dist/core/ingestion/languages/php/scope-resolver.js +1 -1
  187. package/dist/core/ingestion/languages/python/captures.d.ts +3 -4
  188. package/dist/core/ingestion/languages/python/captures.js +24 -5
  189. package/dist/core/ingestion/languages/python/interpret.js +4 -0
  190. package/dist/core/ingestion/languages/python/receiver-binding.d.ts +15 -2
  191. package/dist/core/ingestion/languages/python/receiver-binding.js +96 -2
  192. package/dist/core/ingestion/languages/python/simple-hooks.d.ts +5 -5
  193. package/dist/core/ingestion/languages/python/simple-hooks.js +15 -5
  194. package/dist/core/ingestion/languages/ruby/captures.js +42 -0
  195. package/dist/core/ingestion/languages/rust/captures.js +13 -0
  196. package/dist/core/ingestion/languages/rust/interpret.js +18 -0
  197. package/dist/core/ingestion/languages/rust/query.js +9 -0
  198. package/dist/core/ingestion/languages/rust/range-binding.js +6 -2
  199. package/dist/core/ingestion/languages/swift/captures.js +12 -0
  200. package/dist/core/ingestion/languages/typescript/captures.js +21 -0
  201. package/dist/core/ingestion/languages/typescript/nuxt-auto-imports.js +2 -1
  202. package/dist/core/ingestion/languages/typescript/query.js +37 -0
  203. package/dist/core/ingestion/markdown-processor.js +3 -2
  204. package/dist/core/ingestion/model/registration-table.js +1 -0
  205. package/dist/core/ingestion/parsing-processor.d.ts +3 -1
  206. package/dist/core/ingestion/parsing-processor.js +36 -1
  207. package/dist/core/ingestion/pipeline-phases/index.d.ts +2 -0
  208. package/dist/core/ingestion/pipeline-phases/index.js +2 -0
  209. package/dist/core/ingestion/pipeline-phases/parse-impl.js +56 -2
  210. package/dist/core/ingestion/pipeline-phases/parse.d.ts +0 -2
  211. package/dist/core/ingestion/pipeline-phases/parse.js +12 -3
  212. package/dist/core/ingestion/pipeline-phases/processes.d.ts +8 -0
  213. package/dist/core/ingestion/pipeline-phases/processes.js +11 -1
  214. package/dist/core/ingestion/pipeline-phases/spring-config.d.ts +37 -0
  215. package/dist/core/ingestion/pipeline-phases/spring-config.js +433 -0
  216. package/dist/core/ingestion/pipeline-phases/standalone-ingest.d.ts +16 -0
  217. package/dist/core/ingestion/pipeline-phases/standalone-ingest.js +6 -0
  218. package/dist/core/ingestion/pipeline.d.ts +4 -2
  219. package/dist/core/ingestion/pipeline.js +14 -2
  220. package/dist/core/ingestion/resolve-references.js +12 -0
  221. package/dist/core/ingestion/route-extractors/constant-resolver.d.ts +83 -0
  222. package/dist/core/ingestion/route-extractors/constant-resolver.js +131 -0
  223. package/dist/core/ingestion/route-extractors/python-const-resolver.d.ts +75 -0
  224. package/dist/core/ingestion/route-extractors/python-const-resolver.js +299 -0
  225. package/dist/core/ingestion/scope-extractor.js +306 -43
  226. package/dist/core/ingestion/scope-resolution/contract/scope-resolver.d.ts +71 -2
  227. package/dist/core/ingestion/scope-resolution/graph-bridge/callee-id-sink.d.ts +7 -7
  228. package/dist/core/ingestion/scope-resolution/graph-bridge/callee-id-sink.js +8 -7
  229. package/dist/core/ingestion/scope-resolution/graph-bridge/edges.d.ts +3 -1
  230. package/dist/core/ingestion/scope-resolution/graph-bridge/edges.js +6 -0
  231. package/dist/core/ingestion/scope-resolution/graph-bridge/ids.js +1 -0
  232. package/dist/core/ingestion/scope-resolution/graph-bridge/node-lookup.js +4 -1
  233. package/dist/core/ingestion/scope-resolution/graph-bridge/references-to-edges.js +7 -2
  234. package/dist/core/ingestion/scope-resolution/passes/callable-value-flow.d.ts +47 -0
  235. package/dist/core/ingestion/scope-resolution/passes/callable-value-flow.js +1138 -0
  236. package/dist/core/ingestion/scope-resolution/passes/free-call-fallback.d.ts +16 -4
  237. package/dist/core/ingestion/scope-resolution/passes/free-call-fallback.js +97 -1
  238. package/dist/core/ingestion/scope-resolution/passes/property-dispatch.d.ts +60 -0
  239. package/dist/core/ingestion/scope-resolution/passes/property-dispatch.js +111 -0
  240. package/dist/core/ingestion/scope-resolution/passes/receiver-bound-calls.d.ts +4 -3
  241. package/dist/core/ingestion/scope-resolution/pipeline/phase.d.ts +5 -0
  242. package/dist/core/ingestion/scope-resolution/pipeline/phase.js +25 -38
  243. package/dist/core/ingestion/scope-resolution/pipeline/run.d.ts +6 -0
  244. package/dist/core/ingestion/scope-resolution/pipeline/run.js +147 -35
  245. package/dist/core/ingestion/scope-resolution/resolution-outcome.d.ts +1 -1
  246. package/dist/core/ingestion/scope-resolution/scope/walkers.js +73 -44
  247. package/dist/core/ingestion/taint/typescript-model.js +34 -2
  248. package/dist/core/ingestion/tree-sitter-queries.d.ts +2 -2
  249. package/dist/core/ingestion/tree-sitter-queries.js +23 -2
  250. package/dist/core/ingestion/type-extractors/jvm.js +17 -2
  251. package/dist/core/ingestion/utils/ast-helpers.d.ts +1 -0
  252. package/dist/core/ingestion/utils/ast-helpers.js +153 -2
  253. package/dist/core/ingestion/utils/callable-flow-captures.d.ts +94 -0
  254. package/dist/core/ingestion/utils/callable-flow-captures.js +878 -0
  255. package/dist/core/ingestion/utils/line-base.d.ts +20 -0
  256. package/dist/core/ingestion/utils/line-base.js +20 -0
  257. package/dist/core/ingestion/utils/symbol-labels.d.ts +21 -0
  258. package/dist/core/ingestion/utils/symbol-labels.js +45 -0
  259. package/dist/core/ingestion/workers/parse-worker.d.ts +34 -0
  260. package/dist/core/ingestion/workers/parse-worker.js +40 -5
  261. package/dist/core/ingestion/workers/result-merge.js +4 -0
  262. package/dist/core/ingestion/workers/worker-pool.d.ts +28 -0
  263. package/dist/core/ingestion/workers/worker-pool.js +128 -28
  264. package/dist/core/lbug/csv-generator.d.ts +15 -0
  265. package/dist/core/lbug/csv-generator.js +124 -27
  266. package/dist/core/lbug/cypher-escape.d.ts +20 -0
  267. package/dist/core/lbug/cypher-escape.js +20 -0
  268. package/dist/core/lbug/extension-load-error.d.ts +67 -0
  269. package/dist/core/lbug/extension-load-error.js +326 -0
  270. package/dist/core/lbug/extension-loader.d.ts +17 -2
  271. package/dist/core/lbug/extension-loader.js +38 -13
  272. package/dist/core/lbug/lbug-adapter.d.ts +203 -2
  273. package/dist/core/lbug/lbug-adapter.js +527 -86
  274. package/dist/core/lbug/lbug-config.d.ts +56 -2
  275. package/dist/core/lbug/lbug-config.js +267 -7
  276. package/dist/core/lbug/move-columns.d.ts +7 -0
  277. package/dist/core/lbug/move-columns.js +86 -0
  278. package/dist/core/lbug/native-check.d.ts +40 -0
  279. package/dist/core/lbug/native-check.js +90 -0
  280. package/dist/core/lbug/node-table-layout.d.ts +29 -0
  281. package/dist/core/lbug/node-table-layout.js +119 -0
  282. package/dist/core/lbug/pool-adapter.d.ts +23 -1
  283. package/dist/core/lbug/pool-adapter.js +115 -8
  284. package/dist/core/lbug/schema.d.ts +4 -3
  285. package/dist/core/lbug/schema.js +16 -16
  286. package/dist/core/lbug/sidecar-recovery.d.ts +172 -0
  287. package/dist/core/lbug/sidecar-recovery.js +418 -16
  288. package/dist/core/lbug/wal-checkpoint-driver.js +3 -0
  289. package/dist/core/move/artifact-download.d.ts +19 -0
  290. package/dist/core/move/artifact-download.js +179 -0
  291. package/dist/core/move/compiler-facts.d.ts +120 -0
  292. package/dist/core/move/compiler-facts.js +9 -0
  293. package/dist/core/move/consistency.d.ts +74 -0
  294. package/dist/core/move/consistency.js +182 -0
  295. package/dist/core/move/constants.d.ts +98 -0
  296. package/dist/core/move/constants.js +136 -0
  297. package/dist/core/move/discovery.d.ts +10 -0
  298. package/dist/core/move/discovery.js +22 -0
  299. package/dist/core/move/entry-points.d.ts +14 -0
  300. package/dist/core/move/entry-points.js +40 -0
  301. package/dist/core/move/facts-mapper.d.ts +75 -0
  302. package/dist/core/move/facts-mapper.js +534 -0
  303. package/dist/core/move/install-lock.d.ts +14 -0
  304. package/dist/core/move/install-lock.js +102 -0
  305. package/dist/core/move/install.d.ts +39 -0
  306. package/dist/core/move/install.js +391 -0
  307. package/dist/core/move/mcp-client.d.ts +115 -0
  308. package/dist/core/move/mcp-client.js +436 -0
  309. package/dist/core/move/move-ingest.d.ts +52 -0
  310. package/dist/core/move/move-ingest.js +403 -0
  311. package/dist/core/move/provision.d.ts +19 -0
  312. package/dist/core/move/provision.js +91 -0
  313. package/dist/core/move/release.d.ts +6 -0
  314. package/dist/core/move/release.js +10 -0
  315. package/dist/core/move/symbol-id.d.ts +35 -0
  316. package/dist/core/move/symbol-id.js +65 -0
  317. package/dist/core/move/type-parser.d.ts +11 -0
  318. package/dist/core/move/type-parser.js +38 -0
  319. package/dist/core/platform/capabilities.d.ts +0 -1
  320. package/dist/core/platform/capabilities.js +39 -8
  321. package/dist/core/run-analyze.d.ts +9 -3
  322. package/dist/core/run-analyze.js +1002 -184
  323. package/dist/core/search/fts-indexes.d.ts +31 -0
  324. package/dist/core/search/fts-indexes.js +73 -0
  325. package/dist/core/search/fts-schema.js +2 -0
  326. package/dist/core/tree-sitter/safe-parse.d.ts +8 -3
  327. package/dist/core/tree-sitter/safe-parse.js +21 -7
  328. package/dist/core/wiki/graph-queries.js +6 -5
  329. package/dist/core/wiki/llm-client.d.ts +8 -2
  330. package/dist/core/wiki/llm-client.js +41 -5
  331. package/dist/mcp/core/embedder.js +16 -2
  332. package/dist/mcp/http-transport.d.ts +5 -0
  333. package/dist/mcp/http-transport.js +19 -5
  334. package/dist/mcp/local/bean-metadata.d.ts +2 -0
  335. package/dist/mcp/local/bean-metadata.js +25 -0
  336. package/dist/mcp/local/line-display.d.ts +22 -0
  337. package/dist/mcp/local/line-display.js +3 -0
  338. package/dist/mcp/local/local-backend.d.ts +19 -1
  339. package/dist/mcp/local/local-backend.js +402 -155
  340. package/dist/mcp/local/pdg-impact.d.ts +5 -3
  341. package/dist/mcp/local/pdg-impact.js +5 -2
  342. package/dist/mcp/output-budget.d.ts +5 -0
  343. package/dist/mcp/output-budget.js +52 -0
  344. package/dist/mcp/read-only-policy.d.ts +12 -0
  345. package/dist/mcp/read-only-policy.js +102 -0
  346. package/dist/mcp/repository-policy.d.ts +34 -0
  347. package/dist/mcp/repository-policy.js +328 -0
  348. package/dist/mcp/resources.js +32 -5
  349. package/dist/mcp/server.d.ts +5 -2
  350. package/dist/mcp/server.js +29 -9
  351. package/dist/mcp/tools.d.ts +0 -8
  352. package/dist/mcp/tools.js +102 -5
  353. package/dist/server/analyze-job.d.ts +3 -0
  354. package/dist/server/analyze-job.js +17 -0
  355. package/dist/server/analyze-launch.d.ts +6 -0
  356. package/dist/server/analyze-launch.js +82 -6
  357. package/dist/server/analyze-worker-core.d.ts +2 -1
  358. package/dist/server/analyze-worker-core.js +5 -2
  359. package/dist/server/analyze-worker.js +29 -6
  360. package/dist/server/api.d.ts +30 -0
  361. package/dist/server/api.js +120 -34
  362. package/dist/server/mcp-http.d.ts +1 -1
  363. package/dist/server/mcp-http.js +4 -2
  364. package/dist/server/upload-ingest.js +2 -1
  365. package/dist/server/validation.js +2 -1
  366. package/dist/storage/git.d.ts +31 -0
  367. package/dist/storage/git.js +111 -1
  368. package/dist/storage/parse-cache.js +7 -1
  369. package/dist/storage/parsedfile-store.d.ts +8 -0
  370. package/dist/storage/parsedfile-store.js +165 -1
  371. package/dist/storage/repo-manager.d.ts +194 -2
  372. package/dist/storage/repo-manager.js +56 -1
  373. package/dist/types/pipeline.d.ts +7 -0
  374. package/hooks/antigravity/gitnexus-antigravity-hook.cjs +50 -3
  375. package/hooks/claude/gitnexus-hook.cjs +59 -9
  376. package/hooks/claude/pre-tool-use.sh +0 -0
  377. package/hooks/claude/session-start.sh +0 -0
  378. package/package.json +21 -15
  379. package/scripts/cross-platform-tests.ts +56 -0
  380. package/scripts/ensure-fts.ts +43 -0
  381. package/scripts/install-duckdb-extension.mjs +85 -24
  382. package/scripts/run-cross-platform.ts +61 -6
  383. package/scripts/shard-arg.ts +30 -0
  384. package/scripts/sync-plugin-manifests.mjs +192 -0
  385. package/skills/gitnexus-lfg/README.md +55 -0
  386. package/skills/gitnexus-lfg/SKILL.md +86 -0
  387. package/skills/gitnexus-plan/README.md +142 -0
  388. package/skills/gitnexus-plan/SKILL.md +348 -0
  389. package/skills/gitnexus-plan/references/context-ledger.md +137 -0
  390. package/skills/gitnexus-plan/references/context-pack.md +126 -0
  391. package/skills/gitnexus-plan/references/evidence-provenance.md +272 -0
  392. package/skills/gitnexus-plan/references/pdg-slice.md +109 -0
  393. package/skills/gitnexus-plan/references/plan-template.md +201 -0
  394. package/skills/gitnexus-plan/scripts/evidence-provenance.mjs +2084 -0
  395. package/skills/gitnexus-review/SKILL.md +273 -0
  396. package/skills/gitnexus-review/ci-personas/ci-adversarial-lens.md +42 -0
  397. package/skills/gitnexus-review/ci-personas/ci-blast-radius-lens.md +39 -0
  398. package/skills/gitnexus-review/ci-personas/ci-correctness-lens.md +37 -0
  399. package/skills/gitnexus-review/ci-personas/ci-coverage-lens.md +40 -0
  400. package/skills/gitnexus-review/ci-personas/ci-critic-lens.md +42 -0
  401. package/skills/gitnexus-review/ci-personas/ci-security-lens.md +39 -0
  402. package/skills/gitnexus-work/README.md +71 -0
  403. package/skills/gitnexus-work/SKILL.md +269 -0
  404. package/skills/gitnexus-work/references/evidence-provenance.md +272 -0
  405. package/skills/gitnexus-work/scripts/evidence-provenance.mjs +2084 -0
  406. package/web/assets/ProcessFlowModal-B_bfBySy.js +22 -0
  407. package/web/assets/__vite-browser-external-bMKyYQkO.js +1 -0
  408. package/web/assets/agent-Bqxn-abU.js +626 -0
  409. package/web/assets/architecture-7EHR7CIX-6QZW5X65-BVWFvYz2.js +1 -0
  410. package/web/assets/architectureDiagram-UL44E2DR-CmG3uPWf.js +36 -0
  411. package/web/assets/{blockDiagram-7IZFK4PR-BkWhpzWB.js → blockDiagram-7IZFK4PR-DBefcjof.js} +7 -7
  412. package/web/assets/{c4Diagram-Y2BXMSZH-DtBvpzWD.js → c4Diagram-Y2BXMSZH-EjWnjEJl.js} +6 -6
  413. package/web/assets/chunk-2T2R6R2M-Bb6Sy3_j.js +4 -0
  414. package/web/assets/chunk-2UTLFMKG-CXlhF3Pt.js +1 -0
  415. package/web/assets/chunk-3SSMPTDK-rPsRM1x0.js +321 -0
  416. package/web/assets/chunk-4R4BOZG6-Be_F0JoX.js +159 -0
  417. package/web/assets/{chunk-6764PJDD-DpIS7hxD.js → chunk-6764PJDD-C7xxk063.js} +1 -1
  418. package/web/assets/chunk-67TQ5CYL-CA7OhIEf.js +124 -0
  419. package/web/assets/chunk-7FYTHRHK-CsmYIswB.js +32 -0
  420. package/web/assets/chunk-7J6CGLKN-BlKwgXKs.js +10 -0
  421. package/web/assets/chunk-7W6UQGC5-pyKGssV3.js +1 -0
  422. package/web/assets/chunk-C62D2QBJ-3gdL8EKc.js +1 -0
  423. package/web/assets/chunk-CEXFNPSA-CjwtMDkc.js +1 -0
  424. package/web/assets/{chunk-INKRHTLW-Nu4ri9P-.js → chunk-INKRHTLW-Ckl3_KkO.js} +13 -13
  425. package/web/assets/chunk-J5EP6P6S-L19oz55R.js +1 -0
  426. package/web/assets/{chunk-KGFNY3KK-JGMJvKCK.js → chunk-KGFNY3KK-BZeP-55u.js} +17 -17
  427. package/web/assets/chunk-KGYTTC2M-zm6n242I.js +1 -0
  428. package/web/assets/{chunk-KRXBNO2N-BW5o0KUN.js → chunk-KRXBNO2N-C-UNuKKf.js} +1 -1
  429. package/web/assets/{chunk-LCXTWHL2-CfLLCywY.js → chunk-LCXTWHL2-C162wE5z.js} +5 -5
  430. package/web/assets/chunk-LII3EMHJ-BL6lKJ_P.js +1 -0
  431. package/web/assets/chunk-LRIF4GLE-n59lhprL.js +1 -0
  432. package/web/assets/chunk-QA3QBVWF-DVXPOIxe.js +2 -0
  433. package/web/assets/chunk-RERM46MO-B5dAdWpP.js +1 -0
  434. package/web/assets/chunk-RG4AUYOV-ZNgyLFq6.js +206 -0
  435. package/web/assets/chunk-RKZBBQEN-MyIQbGgD.js +1 -0
  436. package/web/assets/chunk-RLI5ZMPA-CkXZ0y0U.js +1 -0
  437. package/web/assets/chunk-T2UQINTJ-BEyXhZWe.js +1 -0
  438. package/web/assets/chunk-UP6H54XL-BG-n7qDp.js +1 -0
  439. package/web/assets/chunk-UXSXWOXI-CW1_r5cS.js +1 -0
  440. package/web/assets/chunk-UY5QBCOK-ByqTVLvh.js +1 -0
  441. package/web/assets/chunk-VU6ZFW4Y-BLeasdkU.js +2 -0
  442. package/web/assets/{chunk-W44A43WB-JqMLIpR0.js → chunk-W44A43WB-BN8EQc_u.js} +1 -1
  443. package/web/assets/chunk-ZXARS5L4-C3v-4Fsw.js +1 -0
  444. package/web/assets/classDiagram-KGZ6W3CR-olpO3fMe.js +1 -0
  445. package/web/assets/classDiagram-v2-72OJOZXJ-olpO3fMe.js +1 -0
  446. package/web/assets/cose-bilkent-UX7MHV2Q-BmnZ7Mvj.js +1 -0
  447. package/web/assets/dagre-ND4H6XIP-CY4iIF7v.js +4 -0
  448. package/web/assets/diagram-3NCE3AQN-CO6QpzEE.js +43 -0
  449. package/web/assets/diagram-GF46GFSD-B2atbzmU.js +24 -0
  450. package/web/assets/diagram-HNR7UZ2L-DVRltWbL.js +3 -0
  451. package/web/assets/diagram-QXG6HAR7-DR6AHD2h.js +24 -0
  452. package/web/assets/diagram-WEQXMOUZ-DkpoMwTL.js +10 -0
  453. package/web/assets/erDiagram-L5TCEMPS-n8g_90bc.js +85 -0
  454. package/web/assets/eventmodeling-FCH6USID-MREXMVOE-CgFBM7e-.js +1 -0
  455. package/web/assets/flowDiagram-H6V6AXG4-SGMDiCkB.js +162 -0
  456. package/web/assets/ganttDiagram-JCBTUEKG-Cb3UBqRS.js +292 -0
  457. package/web/assets/gitGraph-WXDBUCRP-R675I2BI-DCJv7SII.js +1 -0
  458. package/web/assets/gitGraphDiagram-S2ZK5IYY-Bs9CR7tq.js +106 -0
  459. package/web/assets/index-CX_fADmQ.css +2 -0
  460. package/web/assets/index-D1Z3dGGz.js +575 -0
  461. package/web/assets/info-J43DQDTF-KCYPFFUO-BfNy-9Nd.js +1 -0
  462. package/web/assets/infoDiagram-3YFTVSEB-T368on4D.js +2 -0
  463. package/web/assets/{ishikawaDiagram-BNXS4ZKH-DfYpxnE5.js → ishikawaDiagram-BNXS4ZKH-XpjJRU9h.js} +6 -6
  464. package/web/assets/journeyDiagram-M6C3CM3L-C6wjooas.js +139 -0
  465. package/web/assets/kanban-definition-75IXJCU3-5_UVY79g.js +89 -0
  466. package/web/assets/{katex-K3KEBU37-CTc5BslQ.js → katex-K3KEBU37-qRQBy-EZ.js} +2 -2
  467. package/web/assets/{mindmap-definition-2TDM6QVE-DypvbOMQ.js → mindmap-definition-2TDM6QVE-8xDLzk2e.js} +29 -29
  468. package/web/assets/node-Ct_zna8U.js +8 -0
  469. package/web/assets/packet-YPE3B663-LP52Z2RK-D4qkeG9k.js +1 -0
  470. package/web/assets/pie-LRSECV5Y-TCRJHUBD-B_yMKyQa.js +1 -0
  471. package/web/assets/pieDiagram-CU6KROY3-Bv4LpAbr.js +30 -0
  472. package/web/assets/preload-helper-Czpn1I53.js +1 -0
  473. package/web/assets/{quadrantDiagram-VICAPDV7-yXSZ2lLz.js → quadrantDiagram-VICAPDV7-DR54jOeR.js} +6 -6
  474. package/web/assets/radar-GUYGQ44K-RDLRG3WG-DeD6yN_0.js +1 -0
  475. package/web/assets/requirementDiagram-JXO7QTGE-PEkg7sKC.js +84 -0
  476. package/web/assets/rolldown-runtime-QTnfLwEv.js +1 -0
  477. package/web/assets/sankeyDiagram-URQDO5SZ-DDWEtjcs.js +40 -0
  478. package/web/assets/sdk-CzHHH8tD.js +37 -0
  479. package/web/assets/sequenceDiagram-VS2MUI6T-Bv-uwANx.js +162 -0
  480. package/web/assets/src-JV30wyV8.js +1 -0
  481. package/web/assets/stateDiagram-7D4R322I-DVNjmkEq.js +1 -0
  482. package/web/assets/stateDiagram-v2-36443NZ5-CyN4Fh7_.js +1 -0
  483. package/web/assets/timeline-definition-O6YCAMPW-Qmsuo7qS.js +120 -0
  484. package/web/assets/treeView-BLDUP644-QA4HXRO3-CDuSYnd4.js +1 -0
  485. package/web/assets/treemap-LRROVOQU-LLAWBHMP-imazucyJ.js +1 -0
  486. package/web/assets/vennDiagram-MWXL3ELB-BD1iK1SX.js +34 -0
  487. package/web/assets/wardley-L42UT6IY-5TKZOOLJ-DqrT9tB8.js +1 -0
  488. package/web/assets/wardleyDiagram-CUQ6CDDI-D6TzLVob.js +78 -0
  489. package/web/assets/{xychartDiagram-N2JHSOCM-BOLm0eNm.js → xychartDiagram-N2JHSOCM-CoZ_Tits.js} +6 -6
  490. package/web/index.html +18 -10
  491. package/skills/gitnexus-pr-review.md +0 -163
  492. package/web/assets/agent-Dli_x7bU.js +0 -660
  493. package/web/assets/architecture-7EHR7CIX-6QZW5X65-DxJw65fT.js +0 -1
  494. package/web/assets/architectureDiagram-UL44E2DR-dEkqUZN9.js +0 -36
  495. package/web/assets/chunk-3SSMPTDK-B4_etUhr.js +0 -321
  496. package/web/assets/chunk-67TQ5CYL-4sNPJU1q.js +0 -124
  497. package/web/assets/chunk-7W6UQGC5-KyEG0HQg.js +0 -1
  498. package/web/assets/chunk-KGYTTC2M-CWC_c3H9.js +0 -161
  499. package/web/assets/chunk-LII3EMHJ-D-jm-dLa.js +0 -1
  500. package/web/assets/chunk-QA3QBVWF-BgRW3SXd.js +0 -2
  501. package/web/assets/chunk-RG4AUYOV-CqWzWsV3.js +0 -206
  502. package/web/assets/chunk-T2UQINTJ-DSBqkzH7.js +0 -1
  503. package/web/assets/chunk-UY5QBCOK-DyF0vyGd.js +0 -1
  504. package/web/assets/chunk-ZXARS5L4-CxN8oiwI.js +0 -1
  505. package/web/assets/classDiagram-KGZ6W3CR-CMne4tG9.js +0 -1
  506. package/web/assets/classDiagram-v2-72OJOZXJ-CMne4tG9.js +0 -1
  507. package/web/assets/cose-bilkent-UX7MHV2Q-D71wNYRJ.js +0 -1
  508. package/web/assets/dagre-ND4H6XIP-Co5rRx9X.js +0 -4
  509. package/web/assets/diagram-3NCE3AQN-DBp4O00j.js +0 -43
  510. package/web/assets/diagram-GF46GFSD-6N_8yS0i.js +0 -24
  511. package/web/assets/diagram-HNR7UZ2L-DFCfd5LI.js +0 -3
  512. package/web/assets/diagram-QXG6HAR7-Di093rFg.js +0 -24
  513. package/web/assets/diagram-WEQXMOUZ-DZWi4SUN.js +0 -10
  514. package/web/assets/erDiagram-L5TCEMPS-8X1y6R4Y.js +0 -85
  515. package/web/assets/eventmodeling-FCH6USID-MREXMVOE-BQm9QzEa.js +0 -1
  516. package/web/assets/flowDiagram-H6V6AXG4-CMpY8Ufn.js +0 -162
  517. package/web/assets/ganttDiagram-JCBTUEKG-D3iL2Aet.js +0 -292
  518. package/web/assets/gitGraph-WXDBUCRP-R675I2BI-Cr_Bm2Nb.js +0 -1
  519. package/web/assets/gitGraphDiagram-S2ZK5IYY-CPIDgxGm.js +0 -106
  520. package/web/assets/index-KctnI3Vq.js +0 -635
  521. package/web/assets/index-_lgn7hs5.css +0 -2
  522. package/web/assets/info-J43DQDTF-KCYPFFUO-Cs4p2oyk.js +0 -1
  523. package/web/assets/infoDiagram-3YFTVSEB-BaLMZkUg.js +0 -2
  524. package/web/assets/journeyDiagram-M6C3CM3L-CvArszLo.js +0 -139
  525. package/web/assets/kanban-definition-75IXJCU3-CpfVLLf9.js +0 -89
  526. package/web/assets/packet-YPE3B663-LP52Z2RK-CKCrztD2.js +0 -1
  527. package/web/assets/pie-LRSECV5Y-TCRJHUBD-BB7pHqoD.js +0 -1
  528. package/web/assets/pieDiagram-CU6KROY3-s27EFWgP.js +0 -30
  529. package/web/assets/radar-GUYGQ44K-RDLRG3WG-DhoTOcuK.js +0 -1
  530. package/web/assets/requirementDiagram-JXO7QTGE-CWhqInuf.js +0 -84
  531. package/web/assets/sankeyDiagram-URQDO5SZ-1qEjlFIB.js +0 -40
  532. package/web/assets/sequenceDiagram-VS2MUI6T-RyTlZ5cR.js +0 -162
  533. package/web/assets/stateDiagram-7D4R322I-DTjVfX4A.js +0 -1
  534. package/web/assets/stateDiagram-v2-36443NZ5-xY9_k9_Q.js +0 -1
  535. package/web/assets/timeline-definition-O6YCAMPW-DrrqLYAf.js +0 -120
  536. package/web/assets/treeView-BLDUP644-QA4HXRO3-ODehyGKL.js +0 -1
  537. package/web/assets/treemap-LRROVOQU-LLAWBHMP-BfpgC-7o.js +0 -1
  538. package/web/assets/vennDiagram-MWXL3ELB-B0RkWAim.js +0 -34
  539. package/web/assets/wardley-L42UT6IY-5TKZOOLJ-CNeL6VHE.js +0 -1
  540. package/web/assets/wardleyDiagram-CUQ6CDDI-boUxiQ5F.js +0 -78
@@ -0,0 +1,269 @@
1
+ ---
2
+ name: gitnexus-work
3
+ description: 'Use when executing an engineering plan produced by gitnexus-plan (or a small bounded task directly) — implements step by step with GitNexus impact checks before every symbol edit, tests from the plan''s scenarios, and detect_changes gating every commit. Examples: "/gitnexus-work docs/plans/2026-07-11-gitnexus-plan-ingestion-retry.md", "/gitnexus-work" (latest plan), "execute the plan".'
4
+ ---
5
+
6
+ # gitnexus-work — execute a gitnexus-plan
7
+
8
+ Execute an implementation plan produced by `gitnexus-plan`, shipping it as a
9
+ sequence of verified, atomic commits. The plan's section 11
10
+ (`implementation_context` pack) is the primary machine-readable input; the
11
+ prose sections are its rationale. This skill **does** edit code — it is the
12
+ executor counterpart to the planning-only `gitnexus-plan`.
13
+
14
+ ```
15
+ /gitnexus-work <plan path> # execute this plan
16
+ /gitnexus-work # newest docs/plans/*gitnexus-plan*.md here
17
+ /gitnexus-work <small task text> # direct mode, see Input triage
18
+ ```
19
+
20
+ ## Input triage
21
+
22
+ - **Plan path** (or blank → the newest `docs/plans/*gitnexus-plan*.md` under
23
+ the current repo root): the normal mode; continue to Phase 1. Schema-2
24
+ plans have a normalized repo-relative
25
+ `docs/plans/YYYY-MM-DD-gitnexus-plan-<3-5-word-slug>.md`
26
+ `generated_plan_path`. Resolve only a lexical candidate, then invoke
27
+ `scripts/evidence-provenance.mjs read-plan --repo <root> --generated-plan
28
+ <candidate>` and load only the exact bytes in its descriptor-anchored
29
+ receipt. Require the receipt's canonical repo-relative path to equal the
30
+ document's `generated_plan_path` byte-for-byte;
31
+ reject an external, escaping, differently scoped, or mismatched value. A
32
+ plan in another target repo may still be passed by explicit path. If Phase 1's
33
+ pre-completed check finds every §7 step of the newest plan already landed,
34
+ stop and ask instead of re-executing it.
35
+ - **Bare task text**: trivial and bounded (1–2 files, no architectural
36
+ decisions) → implement directly with the same discipline: `impact` before
37
+ every symbol edit, minimal change, tests when behavior changes,
38
+ verification commands taken from the repo's own scripts (package.json /
39
+ CI), `detect_changes` before every commit, and the shared
40
+ Build-current/index-current procedure before graph-dependent impact and
41
+ final verification. Anything larger → recommend running
42
+ `/gitnexus-plan` first; honor the user's choice if they decline.
43
+
44
+ ## Phase 1 — Load and re-anchor the plan
45
+
46
+ 1. Resolve the target repo and normalized plan candidate, then invoke this
47
+ skill's descriptor-anchored `scripts/evidence-provenance.mjs read-plan`
48
+ command exactly as
49
+ specified in `references/evidence-provenance.md`. Reject a missing,
50
+ external, escaping, symlinked, or differently scoped path. Decode and read
51
+ the receipt's exact `plan_bytes_base64` completely; never read or reopen the
52
+ lexical path directly. It is a decision artifact, not a script: scope
53
+ boundaries and `avoid` entries bind you; exact code is yours to write.
54
+ Retain the receipt's canonical `generated_plan_path` and `plan_digest` in
55
+ session state. Never edit the plan body.
56
+ 2. Parse the §11 `implementation_context` pack: `acceptance_criteria`,
57
+ `evidence_provenance`, `primary_symbols`, `related_symbols`,
58
+ `files_to_modify`, `execution_path`, `pdg_constraints`,
59
+ `architectural_patterns`, `tests`, `verification_commands`, `risks`,
60
+ `assumptions`, `open_questions`, `avoid`. Compact plans carry the
61
+ mini-pack subset — absent optional fields are empty, not errors.
62
+ `evidence_provenance` is mandatory: absence or schema 1 means a legacy
63
+ plan, not a clean tree. Before relying on it, require exact byte-for-byte
64
+ equality between the read-plan receipt's canonical `generated_plan_path`
65
+ and `evidence_provenance.generated_plan_path`.
66
+ 3. **Two-layer drift check — always recompute.** Even when current HEAD is the
67
+ same HEAD as the plan pin, recompute both the canonical global dirty digest
68
+ and the sorted cited-path manifest. Read
69
+ `references/evidence-provenance.md`, then invoke this skill's
70
+ `scripts/evidence-provenance.mjs` with the plan's exact
71
+ `generated_plan_path`, every cited manifest path, and schema version 2.
72
+ Never recreate its bytes in shell or prose. Schema 1 cannot be recomputed
73
+ unambiguously and requires conservative re-anchoring. Include
74
+ object kind plus HEAD/index/worktree/untracked layer digests, and classify
75
+ `staged`, `unstaged`, `untracked`, `deleted`, `renamed`, `mixed`,
76
+ and `absent` evidence. Honor the generated-plan exclusion exactly; do not
77
+ exclude all plans.
78
+ 4. **Re-anchor on either mismatch.** Missing or legacy provenance, a HEAD
79
+ mismatch, or a global dirty digest mismatch requires a conservative
80
+ re-anchor before work:
81
+ - Diff every cited-path manifest entry. Changed cited paths — including
82
+ staged-only, unstaged-only, deleted, both rename endpoints, mixed
83
+ staged+unstaged, and disappeared untracked paths — get their cited ranges
84
+ re-read before reliance.
85
+ - Compare the current whole-tree dirty set with the pinned global digest.
86
+ New uncited dirty paths get a scope assessment: determine whether they
87
+ overlap the plan, requirements, tests, or a key technical decision; do not
88
+ silently ignore them merely because they are uncited.
89
+ - Unreadable or unclassifiable cited evidence blocks every dependent step
90
+ until it can be restored, read, or resolved with the user. Never substitute
91
+ an invented digest or treat absence as an empty file.
92
+ - Keep the re-anchor result in session state; never mutate the plan body.
93
+ Use Deepen only if reconciliation invalidates scope, requirements, a key
94
+ technical decision (KTD), or the planned implementation seam. Ordinary
95
+ byte drift that leaves those decisions valid is re-verified locally.
96
+ 5. **Re-verify `assumptions` cheaply** (each one names what to check).
97
+ A failed assumption is a stop-and-replan signal for the steps that
98
+ depend on it, not something to code around silently.
99
+ 6. Note `open_questions` — if one blocks a step and the answer materially
100
+ changes the work, ask the user before that step, not after.
101
+ 7. **Pre-completed check.** If commits for this plan already exist on the
102
+ branch (a prior partial run, or a post-route-back Deepen cycle), verify
103
+ which §7 steps have landed at HEAD: those are skipped and reported as
104
+ pre-completed, and execution resumes at the first unlanded step. All
105
+ steps landed → report that and stop.
106
+
107
+ ## Phase 2 — Environment
108
+
109
+ - On the default branch → create a feature branch named from the plan slug.
110
+ On a feature branch already → stay only if it is meaningful _for this
111
+ plan_ (name matches the plan slug, or the user confirms); otherwise
112
+ branch from here with the slug name.
113
+ - If the plan document is not yet committed, commit it now
114
+ (`docs(plans): add <slug> plan`) — the plan travels with the work it
115
+ drives, and the final review diff then includes it.
116
+ - Confirm the `verification_commands` from the pack actually run in this
117
+ checkout (dependencies installed, builds present) before starting, not
118
+ after the last step.
119
+
120
+ ### Build-current/index-current procedure
121
+
122
+ This is the single graph-freshness procedure owned by `gitnexus-work`; it
123
+ applies in plan mode and direct mode. Before every graph-dependent `impact`
124
+ query, run the Build-current/index-current procedure. Before final graph
125
+ verification, run the same Build-current/index-current procedure again.
126
+
127
+ 1. Capture current HEAD and working-tree provenance. Read
128
+ `gitnexus://repo/<name>/context` and use its typed `index.commit` and
129
+ `index.runner_identity` receipt — never infer analyzer identity from prose,
130
+ timestamps, or a path alone. Compare `index.commit` with current HEAD. A
131
+ current receipt has `schemaVersion: 4`, resolved runtime path/version, CLI
132
+ version, invoked-artifact path/digest, build
133
+ kind/root/canonicalization/digest, and dependency-runtime
134
+ manifest/lockfile/canonicalization/package-count/artifact-count/digest. Its
135
+ dependency canonicalization is
136
+ `gitnexus-analyzer-dependency-runtime-v4`. The dependency-runtime digest
137
+ covers resolved package metadata and complete loadable package payloads,
138
+ including JavaScript, JSON, native, Wasm, and parser artifacts; schema-1,
139
+ schema-2, and schema-3 receipts are legacy/stale (the MCP context labels
140
+ them `runner_identity_schema_status: legacy-or-unknown`). Require MCP
141
+ `index.incomplete_reasons: []`. Run the exact candidate CLI's
142
+ `status --json` command and require `index.runnerIdentityStatus: current`,
143
+ `index.incompleteReasons: []`, and top-level `status: up-to-date`. The
144
+ status comparator checks every semantic field while deliberately excluding
145
+ only diagnostic `invokedArtifact`; a worker-authored persisted receipt and
146
+ the CLI's live receipt may therefore differ in that field without becoming
147
+ stale. Missing, malformed, differently versioned, semantically unequal, or
148
+ incomplete receipts are unknown/stale, not a match.
149
+ 2. Relationship-affecting committed and uncommitted edits invalidate
150
+ freshness after the last successful procedure run. This includes staged,
151
+ unstaged, untracked, deleted, or renamed analyzer/source/config changes
152
+ that can alter symbols or edges. Any such edit between steps requires an
153
+ inter-step refresh before the next graph query, even when HEAD did not move.
154
+ 3. If the typed runner receipt is stale or unknown in an analyzer-source
155
+ checkout, build current local source using the verified package script. In
156
+ this repo: `cd gitnexus && npm run build`. Resolve the package's `bin`
157
+ target and run that exact artifact's `status --json` command to capture its
158
+ current receipt. Source/build timestamps are a conservative rebuild
159
+ trigger, not proof that an artifact is current.
160
+ 4. Invoke that exact freshly built local CLI from the target repo root with
161
+ PDG layers enabled. In this repo:
162
+ `node gitnexus/dist/cli/index.js analyze --index-only --pdg`.
163
+ Add `--force` when the persisted receipt was absent, malformed,
164
+ differently versioned, or unequal so an already-up-to-date fast path cannot
165
+ leave legacy/stale provenance in place. The usual project-runner form,
166
+ `node .gitnexus/run.cjs analyze`, is acceptable only when its proven runner
167
+ identity resolves to that same freshly built artifact. Do not fall back to
168
+ an older project runner, global install, or package download after
169
+ resolving/building the local artifact.
170
+ 5. Re-read index context, rerun the exact invoked CLI's `status --json`, and
171
+ prove the post-refresh `index.commit` equals current HEAD, MCP
172
+ `index.incomplete_reasons` is empty, and its complete
173
+ `index.runner_identity` equals status `index.runnerIdentity` (the persisted
174
+ receipt). Require status `index.runnerIdentityStatus: current`, empty
175
+ `index.incompleteReasons`, and top-level `status: up-to-date`; do not require
176
+ raw equality with `current.runnerIdentity` because `invokedArtifact` is a
177
+ diagnostic entrypoint deliberately excluded from semantic freshness.
178
+ Record the dirty-state digest indexed in this procedure so same-HEAD
179
+ uncommitted edits can invalidate it later.
180
+ 6. Any build, refresh, metadata-read, or identity-verification failure blocks
181
+ graph-dependent impact work and final completion. Report the failing
182
+ command and evidence; do not continue on an older graph.
183
+
184
+ ## Phase 3 — Execute the Implementation Sequence
185
+
186
+ Work through plan §7 step by step, in order. For each step:
187
+
188
+ 1. **Fresh impact before editing.** Run the Build-current/index-current
189
+ procedure immediately before every graph-dependent
190
+ `impact {target, direction: "upstream"}` query. Then account for every
191
+ direct (d=1) dependent. HIGH or CRITICAL risk → surface it to the user
192
+ with the blast radius before proceeding (repo mandate — see AGENTS.md
193
+ GitNexus rules).
194
+ 2. **Honor the constraints.** `pdg_constraints` entries state ordering and
195
+ dependence facts the change must preserve; `avoid` entries are hard
196
+ prohibitions; `architectural_patterns` name the shape to mirror (read the
197
+ example location before inventing one).
198
+ 3. **Implement minimally.** The smallest change that completes the step,
199
+ following the surrounding code's conventions.
200
+ 4. **Test from the plan's scenarios.** Each `tests[]` scenario (input →
201
+ action → expected outcome) becomes a real test in the named file. Add
202
+ coverage the plan missed if the step's behavior demands it; never delete
203
+ or weaken an assertion to make a step pass. Prove a new regression test
204
+ discriminates: when the failure mode is subtle, run it once against the
205
+ pre-fix tree (write the test before the fix, or stash the fix) and watch
206
+ it fail — a test that passes both ways pins nothing.
207
+ 5. **Verify.** Run the step-relevant `verification_commands` (they carry
208
+ their build prerequisites; use them as written). If any part of the
209
+ change executes from build output — worker entrypoints, dist-shipped
210
+ CLIs, bundled assets — rebuild that output before every verification
211
+ run: a pass or fail against outdated build output is noise, and "the
212
+ fix doesn't work" is more often "the fix never loaded".
213
+ 6. **Commit atomically.** `detect_changes {scope: "staged"}` before every
214
+ commit to confirm only the expected symbols and flows are affected
215
+ (repo mandate); then one conventional commit per step. Run stage →
216
+ `detect_changes` → commit as one unbroken sequence from the repository
217
+ root — interleaving other work between the gate and the commit is how
218
+ the gate gets skipped. Unexpected
219
+ affected flows → investigate before committing, not after.
220
+
221
+ A relationship-affecting implementation edit or commit invalidates the
222
+ procedure's prior proof. The next step must perform the required inter-step
223
+ refresh before its impact query; final verification refreshes again after the
224
+ last edit.
225
+
226
+ Steps are independently actionable: after any commit the tree is coherent.
227
+ If a step reveals the plan is wrong, stop that step, re-verify the affected
228
+ claims at HEAD, and either adapt (small, in-scope deviation — record it in
229
+ the commit message and final summary) or route back to `gitnexus-plan`
230
+ Deepen mode (structural miss) — with a one-line ask to the user when the
231
+ choice isn't obvious.
232
+
233
+ ## Phase 4 — Finish
234
+
235
+ 1. Run the full `verification_commands` suite once, at the end, even if
236
+ every step already passed individually.
237
+ 2. Walk plan §13 (Definition of Done) and the pack's `acceptance_criteria`
238
+ item by item; anything unmet is either finished now or reported as
239
+ explicitly unmet — never silently dropped.
240
+ 3. **Verify the final knowledge graph.** Before final graph verification, run
241
+ the same Build-current/index-current procedure after the last edit, even
242
+ when no commit landed or HEAD still equals the original pin. Then run
243
+ `detect_changes {scope: "all"}` (or the repo's equivalent final graph
244
+ check) against that proven-current index and account for every unexpected
245
+ symbol or flow. A procedure failure blocks completion.
246
+ 4. Report: steps completed, commits made, deviations from the plan (with
247
+ why), assumptions that failed re-verification, DoD status, final indexed
248
+ commit and runner identity, and anything deferred. Test failures are
249
+ reported with their output, not smoothed over.
250
+
251
+ ## Never
252
+
253
+ - Skip the Phase 3 gates: no symbol edit without `impact`, no commit without
254
+ `detect_changes`.
255
+ - Expand scope beyond the plan — §12's deferred follow-ups stay deferred.
256
+ - Mutate the plan body (committing the file verbatim in Phase 2 is not
257
+ mutation), weaken failing tests, or present unverified work as verified.
258
+
259
+ ## Skill feedback (GitNexus repo only)
260
+
261
+ If this run exposed friction in this skill's own instructions — wrong or
262
+ missing guidance, a wasted tool budget, a phase that misrouted — and the repo
263
+ carries `eval/workflow_bench/`, append one JSON line to
264
+ `eval/workflow_bench/learnings.jsonl` (create the file if absent):
265
+ `{"skill": "gitnexus-work", "date": "YYYY-MM-DD", "task": "<one line>", "friction": "<one line>", "suggestion": "<one line>"}`.
266
+ Never edit this skill file itself from a live task: improvements go through
267
+ the offline candidate loop (`eval/workflow_bench/README.md` § Prompt and
268
+ skill evolution loop), where a candidate must beat the incumbent on the
269
+ paired benchmark before a human merges it.
@@ -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.