mirai-graph 1.4.0 → 2.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (561) hide show
  1. package/cli.js +6 -0
  2. package/index.js +1 -0
  3. package/package.json +9 -122
  4. package/.github/workflows/ci.yml +0 -48
  5. package/.github/workflows/mirai-graph-validate.yml +0 -30
  6. package/CHANGELOG.md +0 -724
  7. package/CITATION.cff +0 -21
  8. package/LICENSE +0 -21
  9. package/LICENSE-DOCS +0 -26
  10. package/README.md +0 -368
  11. package/ROADMAP.md +0 -241
  12. package/benchmarks/protocols/measure-convert-optimize.md +0 -131
  13. package/benchmarks/synthetic-context-reduction-v0/README.md +0 -70
  14. package/benchmarks/synthetic-context-reduction-v0/RESULT.md +0 -52
  15. package/benchmarks/synthetic-context-reduction-v0/expected/context-pack-compact.md +0 -31
  16. package/benchmarks/synthetic-context-reduction-v0/gates/results.json +0 -12
  17. package/benchmarks/synthetic-context-reduction-v0/graph/objects.json +0 -114
  18. package/benchmarks/synthetic-context-reduction-v0/graph/relations.json +0 -74
  19. package/benchmarks/synthetic-context-reduction-v0/graph.json +0 -37
  20. package/benchmarks/synthetic-context-reduction-v0/metrics/example-metrics.json +0 -22
  21. package/benchmarks/synthetic-context-reduction-v0/results/baseline-comparison-result.json +0 -42
  22. package/benchmarks/synthetic-context-reduction-v0/results/context-pack.json +0 -181
  23. package/benchmarks/synthetic-context-reduction-v0/results/context-reduction-result.json +0 -8
  24. package/benchmarks/synthetic-context-reduction-v0/results/profile-conformance-result.json +0 -28
  25. package/benchmarks/synthetic-context-reduction-v0/results/readiness-score.json +0 -24
  26. package/benchmarks/synthetic-context-reduction-v0/reviews/semantic-completeness-review.json +0 -78
  27. package/benchmarks/synthetic-context-reduction-v0/scripts/calculate-context-reduction.js +0 -42
  28. package/benchmarks/synthetic-context-reduction-v0/source-corpus/audit-events.md +0 -8
  29. package/benchmarks/synthetic-context-reduction-v0/source-corpus/content-workflow.md +0 -8
  30. package/benchmarks/synthetic-context-reduction-v0/source-corpus/identity-access.md +0 -8
  31. package/benchmarks/synthetic-context-reduction-v0/source-corpus/notification-delivery.md +0 -8
  32. package/benchmarks/synthetic-context-reduction-v0/tasks/tasks.json +0 -31
  33. package/docs/README.md +0 -130
  34. package/docs/adoption/adopter-kit.md +0 -187
  35. package/docs/adoption/ai-employee-graph.md +0 -151
  36. package/docs/adoption/character-layer.md +0 -196
  37. package/docs/adoption/choose-profile.md +0 -106
  38. package/docs/adoption/cli.md +0 -134
  39. package/docs/adoption/connect-project-15-minutes.md +0 -122
  40. package/docs/adoption/developer-integration-guide.md +0 -122
  41. package/docs/adoption/end-to-end-control-loop.md +0 -168
  42. package/docs/adoption/for-developers.md +0 -210
  43. package/docs/adoption/getting-started.md +0 -192
  44. package/docs/adoption/mirai-graph-transition.md +0 -67
  45. package/docs/adoption/profile-conformance-fixtures.md +0 -112
  46. package/docs/adoption/seed-to-validated-package.md +0 -121
  47. package/docs/concept.md +0 -109
  48. package/docs/repository-purpose.md +0 -422
  49. package/docs/research/ai-work-field-instrumentation-bridge.md +0 -126
  50. package/docs/research/baseline-comparison-protocol.md +0 -79
  51. package/docs/research/evidence-package-v0.1.md +0 -99
  52. package/docs/research/evidence-package-v0.2.md +0 -150
  53. package/docs/research/evidence-package-v0.3.md +0 -256
  54. package/docs/research/independent-implementation-pilot-plan.md +0 -74
  55. package/docs/research/limitations-and-threats.md +0 -40
  56. package/docs/research/practice-science-program.md +0 -232
  57. package/docs/research/scientific-evidence-package.md +0 -188
  58. package/docs/research/semantic-completeness-review-protocol.md +0 -70
  59. package/docs/terminology.md +0 -119
  60. package/docs/transfer/ai-employee-profile-proposal.md +0 -119
  61. package/docs/transfer/federation-routing-control-loop-2026-05-31.md +0 -28
  62. package/docs/transfer/graph-capability-map-2026-05-29.md +0 -126
  63. package/docs/transfer/graph-skill-to-mirai-graph.md +0 -128
  64. package/docs/transfer/project-management-standard-harvest-2026-06-02.md +0 -322
  65. package/docs/transfer/skill-graph-standard-harvest-2026-05-31.md +0 -113
  66. package/docs/transfer/standard-gap-report-2026-05-28.md +0 -208
  67. package/examples/ai-employee-minimal/README.md +0 -53
  68. package/examples/ai-employee-minimal/gates/results.json +0 -35
  69. package/examples/ai-employee-minimal/graph/objects.json +0 -187
  70. package/examples/ai-employee-minimal/graph/relations.json +0 -167
  71. package/examples/ai-employee-minimal/graph.json +0 -37
  72. package/examples/ai-employee-minimal/results/profile-conformance-result.json +0 -28
  73. package/examples/character-layer-integration-minimal/README.md +0 -25
  74. package/examples/character-layer-integration-minimal/results/character-layer-integration.json +0 -53
  75. package/examples/character-layer-minimal/README.md +0 -29
  76. package/examples/character-layer-minimal/gates/results.json +0 -57
  77. package/examples/character-layer-minimal/graph/objects.json +0 -165
  78. package/examples/character-layer-minimal/graph/relations.json +0 -178
  79. package/examples/character-layer-minimal/graph.json +0 -37
  80. package/examples/character-layer-readiness-1-0/README.md +0 -27
  81. package/examples/character-layer-readiness-1-0/results/character-layer-readiness.json +0 -90
  82. package/examples/dynamic-episode-minimal/README.md +0 -34
  83. package/examples/dynamic-episode-minimal/gates/results.json +0 -12
  84. package/examples/dynamic-episode-minimal/graph/objects.json +0 -92
  85. package/examples/dynamic-episode-minimal/graph/relations.json +0 -29
  86. package/examples/dynamic-episode-minimal/graph.json +0 -47
  87. package/examples/dynamic-episode-minimal/invalid-canonical-write-allowed.json +0 -40
  88. package/examples/dynamic-episode-minimal/invalid-evidence-as-authorization.json +0 -46
  89. package/examples/dynamic-episode-minimal/invalid-missing-event.json +0 -35
  90. package/examples/dynamic-episode-minimal/invalid-missing-selected-path.json +0 -40
  91. package/examples/dynamic-episode-minimal/invalid-unclassified-finding.json +0 -50
  92. package/examples/dynamic-episode-minimal/results/dynamic-episode-trace.json +0 -149
  93. package/examples/executable-technology-course/README.md +0 -16
  94. package/examples/executable-technology-course/technology.json +0 -99
  95. package/examples/federation-routing-smoke/README.md +0 -19
  96. package/examples/federation-routing-smoke/federation-health-dashboard.json +0 -42
  97. package/examples/federation-routing-smoke/route-explanation.json +0 -32
  98. package/examples/federation-routing-smoke/route-regression-result.json +0 -35
  99. package/examples/federation-routing-smoke/routes/production-deploy-execution-evidence.json +0 -17
  100. package/examples/federation-routing-smoke/routes/production-deploy-route-result.json +0 -12
  101. package/examples/federation-routing-smoke/routes/production-deploy-runtime-preflight.json +0 -8
  102. package/examples/federation-routing-smoke/routes/production-deploy-stderr.txt +0 -1
  103. package/examples/federation-routing-smoke/routes/production-deploy-stdout.txt +0 -1
  104. package/examples/federation-routing-smoke/routes/search-page-execution-evidence.json +0 -17
  105. package/examples/federation-routing-smoke/routes/search-page-route-result.json +0 -12
  106. package/examples/federation-routing-smoke/routes/search-page-stderr.txt +0 -1
  107. package/examples/federation-routing-smoke/routes/search-page-stdout.txt +0 -1
  108. package/examples/federation-routing-smoke/routing-fixture-run.json +0 -66
  109. package/examples/federation-routing-smoke/routing-fixtures.json +0 -44
  110. package/examples/goal-vector-quality-control-minimal/README.md +0 -22
  111. package/examples/goal-vector-quality-control-minimal/gates/results.json +0 -22
  112. package/examples/goal-vector-quality-control-minimal/graph/objects.json +0 -56
  113. package/examples/goal-vector-quality-control-minimal/graph/relations.json +0 -29
  114. package/examples/goal-vector-quality-control-minimal/graph.json +0 -41
  115. package/examples/goal-vector-quality-control-minimal/invalid-complete-without-evidence.json +0 -77
  116. package/examples/goal-vector-quality-control-minimal/invalid-correction-without-route.json +0 -86
  117. package/examples/goal-vector-quality-control-minimal/invalid-missing-reverse-audit.json +0 -77
  118. package/examples/goal-vector-quality-control-minimal/invalid-missing-vector-link.json +0 -62
  119. package/examples/goal-vector-quality-control-minimal/invalid-tests-as-acceptance.json +0 -72
  120. package/examples/goal-vector-quality-control-minimal/results/goal-vector-quality-control.json +0 -130
  121. package/examples/graph-dna-alignment-minimal/README.md +0 -16
  122. package/examples/graph-dna-alignment-minimal/graph/objects.json +0 -38
  123. package/examples/graph-dna-alignment-minimal/graph/relations.json +0 -20
  124. package/examples/graph-dna-alignment-minimal/graph.json +0 -37
  125. package/examples/graph-dna-alignment-minimal/results/graph-dna-alignment.json +0 -32
  126. package/examples/graph-seed-minimal/README.md +0 -9
  127. package/examples/graph-seed-minimal/graph-embryo.json +0 -63
  128. package/examples/graph-seed-minimal/graph-seed.json +0 -60
  129. package/examples/implementation-control-cycles/README.md +0 -47
  130. package/examples/implementation-control-cycles/gates/results.json +0 -22
  131. package/examples/implementation-control-cycles/graph/objects.json +0 -119
  132. package/examples/implementation-control-cycles/graph/relations.json +0 -200
  133. package/examples/implementation-control-cycles/graph.json +0 -37
  134. package/examples/implementation-control-cycles/results/implementation-control-cycles.json +0 -456
  135. package/examples/implementation-control-minimal/README.md +0 -39
  136. package/examples/implementation-control-minimal/gates/results.json +0 -42
  137. package/examples/implementation-control-minimal/graph/objects.json +0 -128
  138. package/examples/implementation-control-minimal/graph/relations.json +0 -128
  139. package/examples/implementation-control-minimal/graph.json +0 -37
  140. package/examples/implementation-control-minimal/results/implementation-control-loop.json +0 -21
  141. package/examples/instrumentation-layer-minimal/README.md +0 -32
  142. package/examples/instrumentation-layer-minimal/gates/results.json +0 -11
  143. package/examples/instrumentation-layer-minimal/graph/objects.json +0 -74
  144. package/examples/instrumentation-layer-minimal/graph/relations.json +0 -56
  145. package/examples/instrumentation-layer-minimal/graph.json +0 -37
  146. package/examples/instrumentation-layer-minimal/invalid-cockpit-missing-gates.json +0 -40
  147. package/examples/instrumentation-layer-minimal/invalid-feedback-accepted-with-blocking.json +0 -38
  148. package/examples/instrumentation-layer-minimal/invalid-feedback-process-improvement-without-kaizen.json +0 -38
  149. package/examples/instrumentation-layer-minimal/invalid-traceability-missing-evidence.json +0 -43
  150. package/examples/instrumentation-layer-minimal/results/development-cockpit.json +0 -68
  151. package/examples/instrumentation-layer-minimal/results/feature-implementation-traceability.json +0 -56
  152. package/examples/instrumentation-layer-minimal/results/multi-source-quality-feedback.json +0 -72
  153. package/examples/invalid-character-layer-context-authorization/graph/objects.json +0 -22
  154. package/examples/invalid-character-layer-context-authorization/graph/relations.json +0 -1
  155. package/examples/invalid-character-layer-context-authorization/graph.json +0 -35
  156. package/examples/invalid-character-layer-correction-loop-no-review/graph/objects.json +0 -22
  157. package/examples/invalid-character-layer-correction-loop-no-review/graph/relations.json +0 -1
  158. package/examples/invalid-character-layer-correction-loop-no-review/graph.json +0 -35
  159. package/examples/invalid-character-layer-feedback-auto-update/graph/objects.json +0 -22
  160. package/examples/invalid-character-layer-feedback-auto-update/graph/relations.json +0 -1
  161. package/examples/invalid-character-layer-feedback-auto-update/graph.json +0 -35
  162. package/examples/invalid-character-layer-object-kind/graph/objects.json +0 -22
  163. package/examples/invalid-character-layer-object-kind/graph/relations.json +0 -1
  164. package/examples/invalid-character-layer-object-kind/graph.json +0 -35
  165. package/examples/invalid-character-layer-relation-direction/graph/objects.json +0 -33
  166. package/examples/invalid-character-layer-relation-direction/graph/relations.json +0 -13
  167. package/examples/invalid-character-layer-relation-direction/graph.json +0 -35
  168. package/examples/invalid-character-layer-relation-type/graph/objects.json +0 -33
  169. package/examples/invalid-character-layer-relation-type/graph/relations.json +0 -13
  170. package/examples/invalid-character-layer-relation-type/graph.json +0 -35
  171. package/examples/invalid-character-layer-role-permission/graph/objects.json +0 -22
  172. package/examples/invalid-character-layer-role-permission/graph/relations.json +0 -1
  173. package/examples/invalid-character-layer-role-permission/graph.json +0 -35
  174. package/examples/invalid-context-pack-missing-explanation/context-pack.json +0 -25
  175. package/examples/invalid-missing-relation-target/graph/objects.json +0 -11
  176. package/examples/invalid-missing-relation-target/graph/relations.json +0 -11
  177. package/examples/invalid-missing-relation-target/graph.json +0 -32
  178. package/examples/invalid-profile-object-kind/graph/objects.json +0 -20
  179. package/examples/invalid-profile-object-kind/graph/relations.json +0 -1
  180. package/examples/invalid-profile-object-kind/graph.json +0 -32
  181. package/examples/invalid-profile-relation-type/graph/objects.json +0 -29
  182. package/examples/invalid-profile-relation-type/graph/relations.json +0 -11
  183. package/examples/invalid-profile-relation-type/graph.json +0 -32
  184. package/examples/invalid-relation-id-mismatch/graph/objects.json +0 -29
  185. package/examples/invalid-relation-id-mismatch/graph/relations.json +0 -11
  186. package/examples/invalid-relation-id-mismatch/graph.json +0 -32
  187. package/examples/invalid-seed-unsafe-write/graph-seed.json +0 -27
  188. package/examples/invalid-societal-governance-auto-learning-update/graph/objects.json +0 -29
  189. package/examples/invalid-societal-governance-auto-learning-update/graph/relations.json +0 -11
  190. package/examples/invalid-societal-governance-auto-learning-update/graph.json +0 -35
  191. package/examples/invalid-societal-governance-avatar-no-consent/graph/objects.json +0 -29
  192. package/examples/invalid-societal-governance-avatar-no-consent/graph/relations.json +0 -11
  193. package/examples/invalid-societal-governance-avatar-no-consent/graph.json +0 -35
  194. package/examples/invalid-societal-governance-generated-context-authorization/graph/objects.json +0 -38
  195. package/examples/invalid-societal-governance-generated-context-authorization/graph/relations.json +0 -20
  196. package/examples/invalid-societal-governance-generated-context-authorization/graph.json +0 -35
  197. package/examples/invalid-societal-governance-missing-appeal-path/graph/objects.json +0 -29
  198. package/examples/invalid-societal-governance-missing-appeal-path/graph/relations.json +0 -11
  199. package/examples/invalid-societal-governance-missing-appeal-path/graph.json +0 -35
  200. package/examples/invalid-societal-governance-private-trace-exposed/graph/objects.json +0 -29
  201. package/examples/invalid-societal-governance-private-trace-exposed/graph/relations.json +0 -11
  202. package/examples/invalid-societal-governance-private-trace-exposed/graph.json +0 -35
  203. package/examples/invalid-societal-governance-rights-overridden/graph/objects.json +0 -29
  204. package/examples/invalid-societal-governance-rights-overridden/graph/relations.json +0 -11
  205. package/examples/invalid-societal-governance-rights-overridden/graph.json +0 -35
  206. package/examples/launch-record-minimal/README.md +0 -29
  207. package/examples/launch-record-minimal/gates/results.json +0 -12
  208. package/examples/launch-record-minimal/graph/objects.json +0 -47
  209. package/examples/launch-record-minimal/graph/relations.json +0 -38
  210. package/examples/launch-record-minimal/graph.json +0 -34
  211. package/examples/launch-record-minimal/results/launch-record.json +0 -51
  212. package/examples/managed-project-control-loop/README.md +0 -43
  213. package/examples/managed-project-control-loop/gates/results.json +0 -22
  214. package/examples/managed-project-control-loop/graph/objects.json +0 -119
  215. package/examples/managed-project-control-loop/graph/relations.json +0 -110
  216. package/examples/managed-project-control-loop/graph.json +0 -37
  217. package/examples/managed-project-control-loop/results/managed-loop-result.json +0 -21
  218. package/examples/minimal-graph/README.md +0 -15
  219. package/examples/minimal-graph/gates/results.json +0 -12
  220. package/examples/minimal-graph/graph/objects.json +0 -24
  221. package/examples/minimal-graph/graph/relations.json +0 -11
  222. package/examples/minimal-graph/graph.json +0 -37
  223. package/examples/minimal-graph/results/profile-conformance-result.json +0 -26
  224. package/examples/model-portability-minimal/README.md +0 -15
  225. package/examples/model-portability-minimal/results/model-portability-evidence.json +0 -55
  226. package/examples/organization-governance-minimal/README.md +0 -29
  227. package/examples/organization-governance-minimal/gates/results.json +0 -21
  228. package/examples/organization-governance-minimal/graph/objects.json +0 -147
  229. package/examples/organization-governance-minimal/graph/relations.json +0 -147
  230. package/examples/organization-governance-minimal/graph.json +0 -37
  231. package/examples/organization-governance-minimal/results/profile-conformance-result.json +0 -31
  232. package/examples/process-control-contract-minimal/README.md +0 -19
  233. package/examples/process-control-contract-minimal/graph/objects.json +0 -38
  234. package/examples/process-control-contract-minimal/graph/relations.json +0 -29
  235. package/examples/process-control-contract-minimal/graph.json +0 -34
  236. package/examples/process-control-contract-minimal/results/process-control-contract.json +0 -58
  237. package/examples/process-transition-minimal/README.md +0 -25
  238. package/examples/process-transition-minimal/invalid-missing-launch-record.json +0 -14
  239. package/examples/process-transition-minimal/invalid-ready-to-written.json +0 -14
  240. package/examples/process-transition-minimal/invalid-release-missing-evidence.json +0 -14
  241. package/examples/process-transition-minimal/invalid-sync-to-update.json +0 -14
  242. package/examples/process-transition-minimal/invalid-terminal-missing-kaizen.json +0 -14
  243. package/examples/process-transition-minimal/invalid-tests-to-approved.json +0 -14
  244. package/examples/process-transition-minimal/results/transition-explanation-invalid-ready-to-written.json +0 -35
  245. package/examples/process-transition-minimal/results/transition-explanation-valid.json +0 -34
  246. package/examples/process-transition-minimal/state-machine.json +0 -79
  247. package/examples/process-transition-minimal/transition-request-skip-kaizen.json +0 -14
  248. package/examples/process-transition-minimal/transition-request.json +0 -14
  249. package/examples/project-technology-context-traversal/README.md +0 -17
  250. package/examples/project-technology-context-traversal/graph/objects.json +0 -78
  251. package/examples/project-technology-context-traversal/graph/relations.json +0 -47
  252. package/examples/project-technology-context-traversal/graph.json +0 -30
  253. package/examples/project-technology-context-traversal/selection.example.json +0 -29
  254. package/examples/project-technology-context-traversal/sources/announcement.md +0 -3
  255. package/examples/project-technology-context-traversal/sources/release-guide.md +0 -3
  256. package/examples/project-technology-context-traversal/sources/release-smoke.md +0 -3
  257. package/examples/project-technology-context-traversal/sources/rollback-policy.md +0 -3
  258. package/examples/risk-and-coordination-minimal/README.md +0 -16
  259. package/examples/risk-and-coordination-minimal/graph/objects.json +0 -47
  260. package/examples/risk-and-coordination-minimal/graph/relations.json +0 -29
  261. package/examples/risk-and-coordination-minimal/graph.json +0 -37
  262. package/examples/risk-and-coordination-minimal/results/multi-agent-coordination.json +0 -25
  263. package/examples/risk-and-coordination-minimal/results/risk-control-matrix.json +0 -34
  264. package/examples/self-service-onboarding/bootstrap-proposal/bootstrap-proposal.json +0 -20
  265. package/examples/self-service-onboarding/existing-graph/README.md +0 -4
  266. package/examples/self-service-onboarding/existing-graph/gates/results.json +0 -11
  267. package/examples/self-service-onboarding/existing-graph/graph/objects.json +0 -11
  268. package/examples/self-service-onboarding/existing-graph/graph/relations.json +0 -1
  269. package/examples/self-service-onboarding/existing-graph/graph.json +0 -36
  270. package/examples/self-service-onboarding/no-graph/README.md +0 -6
  271. package/examples/self-service-onboarding/no-graph/package.json +0 -6
  272. package/examples/self-service-onboarding/no-graph/src/index.js +0 -3
  273. package/examples/self-service-onboarding/stale-graph/README.md +0 -4
  274. package/examples/self-service-onboarding/stale-graph/graph.json +0 -36
  275. package/examples/semantic-intent-resolution-minimal/README.md +0 -13
  276. package/examples/semantic-intent-resolution-minimal/invalid-low-confidence-executes.json +0 -26
  277. package/examples/semantic-intent-resolution-minimal/invalid-proposal-canonical-update.json +0 -27
  278. package/examples/semantic-intent-resolution-minimal/results/semantic-intent-resolution.json +0 -45
  279. package/examples/skill-runtime-minimal/README.md +0 -29
  280. package/examples/skill-runtime-minimal/gates/results.json +0 -35
  281. package/examples/skill-runtime-minimal/graph/objects.json +0 -209
  282. package/examples/skill-runtime-minimal/graph/relations.json +0 -178
  283. package/examples/skill-runtime-minimal/graph.json +0 -37
  284. package/examples/skill-runtime-minimal/results/profile-conformance-result.json +0 -27
  285. package/examples/societal-governance-minimal/README.md +0 -37
  286. package/examples/societal-governance-minimal/graph/objects.json +0 -218
  287. package/examples/societal-governance-minimal/graph/relations.json +0 -209
  288. package/examples/societal-governance-minimal/graph.json +0 -37
  289. package/examples/source-boundary-minimal/README.md +0 -16
  290. package/examples/source-boundary-minimal/graph/objects.json +0 -38
  291. package/examples/source-boundary-minimal/graph/relations.json +0 -20
  292. package/examples/source-boundary-minimal/graph.json +0 -37
  293. package/examples/source-boundary-minimal/results/source-boundary-contract.json +0 -37
  294. package/examples/technology-quality-feedback-minimal/README.md +0 -33
  295. package/examples/technology-quality-feedback-minimal/graph/objects.json +0 -56
  296. package/examples/technology-quality-feedback-minimal/graph/relations.json +0 -47
  297. package/examples/technology-quality-feedback-minimal/graph.json +0 -34
  298. package/examples/technology-quality-feedback-minimal/invalid-accepted-with-blocking.json +0 -33
  299. package/examples/technology-quality-feedback-minimal/invalid-evidence-as-authorization.json +0 -22
  300. package/examples/technology-quality-feedback-minimal/invalid-missing-required-step.json +0 -22
  301. package/examples/technology-quality-feedback-minimal/invalid-process-improvement-without-kaizen.json +0 -33
  302. package/examples/technology-quality-feedback-minimal/invalid-spec-gap-without-route.json +0 -33
  303. package/examples/technology-quality-feedback-minimal/invalid-unclassified-finding.json +0 -33
  304. package/examples/technology-quality-feedback-minimal/results/technology-quality-feedback.json +0 -80
  305. package/examples/work-recovery-minimal/README.md +0 -15
  306. package/examples/work-recovery-minimal/graph/objects.json +0 -47
  307. package/examples/work-recovery-minimal/graph/relations.json +0 -20
  308. package/examples/work-recovery-minimal/graph.json +0 -37
  309. package/examples/work-recovery-minimal/results/recovery-resume-record.json +0 -17
  310. package/examples/work-recovery-minimal/results/work-state-machine.json +0 -21
  311. package/packages/cli/adopter-workflow.js +0 -228
  312. package/packages/cli/context-pack.js +0 -269
  313. package/packages/cli/graph-manifest.js +0 -367
  314. package/packages/cli/instrumentation-report.js +0 -97
  315. package/packages/cli/migrate-graph-manifest.js +0 -33
  316. package/packages/cli/mirai-graph.js +0 -154
  317. package/packages/cli/mirai_graph.js +0 -3
  318. package/packages/cli/playground-demo.js +0 -114
  319. package/packages/cli/project-technology.js +0 -141
  320. package/packages/cli/readiness-score.js +0 -164
  321. package/packages/cli/release-state.js +0 -329
  322. package/packages/cli/seed-preview.js +0 -78
  323. package/packages/cli/self-service-onboarding.js +0 -386
  324. package/packages/cli/validate-adopter-workflow.js +0 -63
  325. package/packages/cli/validate-artifact-releases.js +0 -282
  326. package/packages/cli/validate-baseline-comparison.js +0 -105
  327. package/packages/cli/validate-context-traversal.js +0 -292
  328. package/packages/cli/validate-graph-manifest-migration.js +0 -64
  329. package/packages/cli/validate-mirai-graph.js +0 -3245
  330. package/packages/cli/validate-process-transition-report.js +0 -105
  331. package/packages/cli/validate-profile-results.js +0 -64
  332. package/packages/cli/validate-project-continuity.js +0 -173
  333. package/packages/cli/validate-project-technology.js +0 -296
  334. package/packages/cli/validate-release-state.js +0 -100
  335. package/packages/cli/validate-routing-control-examples.js +0 -79
  336. package/packages/cli/validate-self-service-onboarding.js +0 -159
  337. package/packages/cli/validate-technology-course.js +0 -81
  338. package/packages/project-technology/artifact-release.js +0 -738
  339. package/packages/project-technology/context-traversal.js +0 -684
  340. package/packages/project-technology/continuity.js +0 -414
  341. package/packages/project-technology/index.js +0 -841
  342. package/packages/project-technology/technology-course.js +0 -282
  343. package/pilots/independent-implementation-001-conference-planning/README.md +0 -40
  344. package/pilots/independent-implementation-001-conference-planning/gates/results.json +0 -12
  345. package/pilots/independent-implementation-001-conference-planning/graph/objects.json +0 -74
  346. package/pilots/independent-implementation-001-conference-planning/graph/relations.json +0 -56
  347. package/pilots/independent-implementation-001-conference-planning/graph-seed.json +0 -65
  348. package/pilots/independent-implementation-001-conference-planning/graph.json +0 -37
  349. package/pilots/independent-implementation-001-conference-planning/reports/pilot-report.md +0 -120
  350. package/pilots/independent-implementation-001-conference-planning/results/context-pack.json +0 -35
  351. package/pilots/independent-implementation-001-conference-planning/results/graph-embryo.json +0 -81
  352. package/pilots/independent-implementation-001-conference-planning/results/package-validation.json +0 -7
  353. package/pilots/independent-implementation-001-conference-planning/results/profile-conformance-result.json +0 -28
  354. package/pilots/independent-implementation-001-conference-planning/results/readiness-score.json +0 -26
  355. package/pilots/independent-implementation-001-conference-planning/results/seed-validation.json +0 -7
  356. package/pilots/independent-implementation-002-software-specification/README.md +0 -40
  357. package/pilots/independent-implementation-002-software-specification/gates/results.json +0 -22
  358. package/pilots/independent-implementation-002-software-specification/graph/objects.json +0 -101
  359. package/pilots/independent-implementation-002-software-specification/graph/relations.json +0 -92
  360. package/pilots/independent-implementation-002-software-specification/graph-seed.json +0 -72
  361. package/pilots/independent-implementation-002-software-specification/graph.json +0 -37
  362. package/pilots/independent-implementation-002-software-specification/reports/pilot-report.md +0 -142
  363. package/pilots/independent-implementation-002-software-specification/results/context-pack.json +0 -184
  364. package/pilots/independent-implementation-002-software-specification/results/graph-embryo.json +0 -90
  365. package/pilots/independent-implementation-002-software-specification/results/package-validation.json +0 -7
  366. package/pilots/independent-implementation-002-software-specification/results/profile-conformance-result.json +0 -28
  367. package/pilots/independent-implementation-002-software-specification/results/readiness-score.json +0 -26
  368. package/pilots/independent-implementation-002-software-specification/results/seed-validation.json +0 -7
  369. package/pilots/independent-implementation-002-software-specification/reviews/semantic-completeness-review.json +0 -81
  370. package/pilots/independent-implementation-003-ai-employee-workflow/README.md +0 -42
  371. package/pilots/independent-implementation-003-ai-employee-workflow/gates/results.json +0 -30
  372. package/pilots/independent-implementation-003-ai-employee-workflow/graph/objects.json +0 -156
  373. package/pilots/independent-implementation-003-ai-employee-workflow/graph/relations.json +0 -147
  374. package/pilots/independent-implementation-003-ai-employee-workflow/graph-seed.json +0 -90
  375. package/pilots/independent-implementation-003-ai-employee-workflow/graph.json +0 -37
  376. package/pilots/independent-implementation-003-ai-employee-workflow/reports/pilot-report.md +0 -49
  377. package/pilots/independent-implementation-003-ai-employee-workflow/results/profile-conformance-result.json +0 -30
  378. package/pilots/independent-implementation-004-research-program/README.md +0 -41
  379. package/pilots/independent-implementation-004-research-program/gates/results.json +0 -21
  380. package/pilots/independent-implementation-004-research-program/graph/objects.json +0 -102
  381. package/pilots/independent-implementation-004-research-program/graph/relations.json +0 -84
  382. package/pilots/independent-implementation-004-research-program/graph-seed.json +0 -76
  383. package/pilots/independent-implementation-004-research-program/graph.json +0 -37
  384. package/pilots/independent-implementation-004-research-program/reports/pilot-report.md +0 -50
  385. package/pilots/independent-implementation-004-research-program/results/profile-conformance-result.json +0 -30
  386. package/pilots/independent-implementation-005-organization-governance/README.md +0 -42
  387. package/pilots/independent-implementation-005-organization-governance/gates/results.json +0 -20
  388. package/pilots/independent-implementation-005-organization-governance/graph/objects.json +0 -137
  389. package/pilots/independent-implementation-005-organization-governance/graph/relations.json +0 -110
  390. package/pilots/independent-implementation-005-organization-governance/graph-seed.json +0 -97
  391. package/pilots/independent-implementation-005-organization-governance/graph.json +0 -37
  392. package/pilots/independent-implementation-005-organization-governance/reports/pilot-report.md +0 -47
  393. package/pilots/independent-implementation-005-organization-governance/results/profile-conformance-result.json +0 -29
  394. package/playground/README.md +0 -78
  395. package/playground/demo-report.md +0 -84
  396. package/profiles/README.md +0 -28
  397. package/profiles/ai-employee/README.md +0 -132
  398. package/profiles/ai-employee/profile.json +0 -58
  399. package/profiles/character-layer/README.md +0 -143
  400. package/profiles/character-layer/profile.json +0 -46
  401. package/profiles/implementation-control/README.md +0 -174
  402. package/profiles/implementation-control/profile.json +0 -108
  403. package/profiles/organization-governance/README.md +0 -60
  404. package/profiles/organization-governance/profile.json +0 -56
  405. package/profiles/project-management/README.md +0 -119
  406. package/profiles/project-management/profile.json +0 -38
  407. package/profiles/skill-runtime/README.md +0 -99
  408. package/profiles/skill-runtime/profile.json +0 -58
  409. package/profiles/societal-governance/README.md +0 -129
  410. package/profiles/societal-governance/profile.json +0 -121
  411. package/profiles/software-specification/README.md +0 -142
  412. package/profiles/software-specification/profile.json +0 -31
  413. package/publications/README.md +0 -39
  414. package/publications/observable-self-correcting-ai-workflows/README.md +0 -105
  415. package/publications/preprint-note.md +0 -11
  416. package/publications/preprint-outline.md +0 -45
  417. package/publications/semantic-intent-goal-vector-control/README.md +0 -99
  418. package/releases/0.1.0-alpha.0.md +0 -45
  419. package/releases/0.1.0-alpha.1.md +0 -63
  420. package/releases/0.1.0-alpha.10.md +0 -93
  421. package/releases/0.1.0-alpha.11.md +0 -114
  422. package/releases/0.1.0-alpha.2.md +0 -37
  423. package/releases/0.1.0-alpha.3.md +0 -61
  424. package/releases/0.1.0-alpha.4.md +0 -53
  425. package/releases/0.1.0-alpha.5.md +0 -48
  426. package/releases/0.1.0-alpha.6.md +0 -96
  427. package/releases/0.1.0-alpha.7.md +0 -114
  428. package/releases/0.1.0-alpha.8.md +0 -92
  429. package/releases/0.1.0-alpha.9.md +0 -80
  430. package/releases/1.0.0-rc.1.md +0 -121
  431. package/releases/1.0.0-rc.10.md +0 -14
  432. package/releases/1.0.0-rc.11.md +0 -14
  433. package/releases/1.0.0-rc.2.md +0 -79
  434. package/releases/1.0.0-rc.3.md +0 -51
  435. package/releases/1.0.0-rc.4.md +0 -70
  436. package/releases/1.0.0-rc.5.md +0 -88
  437. package/releases/1.0.0-rc.6.md +0 -76
  438. package/releases/1.0.0-rc.8.md +0 -17
  439. package/releases/1.0.0-rc.9.md +0 -14
  440. package/releases/1.0.0.md +0 -23
  441. package/releases/1.1.0.md +0 -36
  442. package/releases/1.1.1.md +0 -25
  443. package/releases/1.2.0.md +0 -19
  444. package/releases/1.3.0.md +0 -16
  445. package/releases/README.md +0 -135
  446. package/releases/societal-governance-profile-proposal.md +0 -45
  447. package/schemas/baseline-comparison-result.schema.json +0 -87
  448. package/schemas/character-layer-integration.schema.json +0 -112
  449. package/schemas/character-layer-readiness.schema.json +0 -73
  450. package/schemas/context-pack.schema.json +0 -190
  451. package/schemas/context-traversal-receipt.schema.json +0 -64
  452. package/schemas/development-cockpit.schema.json +0 -74
  453. package/schemas/dynamic-episode-trace.schema.json +0 -153
  454. package/schemas/executable-technology.schema.json +0 -70
  455. package/schemas/feature-implementation-traceability.schema.json +0 -80
  456. package/schemas/federation-health-dashboard.schema.json +0 -47
  457. package/schemas/gate-result.schema.json +0 -44
  458. package/schemas/goal-vector-quality-control.schema.json +0 -131
  459. package/schemas/graph-dna-alignment.schema.json +0 -49
  460. package/schemas/graph-embryo.schema.json +0 -51
  461. package/schemas/graph-lock.schema.json +0 -28
  462. package/schemas/graph-manifest.schema.json +0 -154
  463. package/schemas/graph-seed.schema.json +0 -137
  464. package/schemas/implementation-control-cycle.schema.json +0 -265
  465. package/schemas/implementation-control-loop.schema.json +0 -84
  466. package/schemas/launch-record.schema.json +0 -78
  467. package/schemas/model-portability-evidence.schema.json +0 -93
  468. package/schemas/multi-agent-coordination.schema.json +0 -35
  469. package/schemas/multi-source-quality-feedback.schema.json +0 -54
  470. package/schemas/object.schema.json +0 -49
  471. package/schemas/package-manifest.schema.json +0 -53
  472. package/schemas/process-control-contract.schema.json +0 -100
  473. package/schemas/process-transition-request.schema.json +0 -41
  474. package/schemas/profile.schema.json +0 -56
  475. package/schemas/project-technology-extension.schema.json +0 -15
  476. package/schemas/project-technology-target-export.schema.json +0 -35
  477. package/schemas/readiness-score.schema.json +0 -43
  478. package/schemas/recovery-resume-record.schema.json +0 -25
  479. package/schemas/relation.schema.json +0 -43
  480. package/schemas/risk-control-matrix.schema.json +0 -36
  481. package/schemas/route-explanation.schema.json +0 -51
  482. package/schemas/route-regression-result.schema.json +0 -33
  483. package/schemas/routing-fixture-run.schema.json +0 -45
  484. package/schemas/routing-fixtures.schema.json +0 -59
  485. package/schemas/semantic-intent-resolution.schema.json +0 -151
  486. package/schemas/source-boundary-contract.schema.json +0 -31
  487. package/schemas/technology-course-pack.schema.json +0 -57
  488. package/schemas/technology-quality-feedback.schema.json +0 -116
  489. package/schemas/work-state-machine.schema.json +0 -34
  490. package/standard/action-runtime-boundary.md +0 -99
  491. package/standard/adoption-levels.md +0 -69
  492. package/standard/conformance-levels.md +0 -133
  493. package/standard/context-pack-generation.md +0 -184
  494. package/standard/development-cockpit.md +0 -67
  495. package/standard/dynamic-episode-layer.md +0 -113
  496. package/standard/dynamic-layer-code-generation.md +0 -87
  497. package/standard/episode-trace.md +0 -97
  498. package/standard/evidence-provenance.md +0 -128
  499. package/standard/feature-implementation-traceability.md +0 -68
  500. package/standard/federation-health.md +0 -42
  501. package/standard/feedback-learning-gate.md +0 -101
  502. package/standard/goal-vector-quality-control.md +0 -128
  503. package/standard/governance.md +0 -137
  504. package/standard/graph-as-ai-brain.md +0 -81
  505. package/standard/graph-dna-alignment.md +0 -50
  506. package/standard/graph-dna.md +0 -70
  507. package/standard/graph-embryo.md +0 -69
  508. package/standard/graph-seed.md +0 -122
  509. package/standard/hybrid-source-of-truth.md +0 -91
  510. package/standard/implementation-control-cycles.md +0 -194
  511. package/standard/implementation-control.md +0 -102
  512. package/standard/launch-record.md +0 -53
  513. package/standard/lifecycle-readiness.md +0 -159
  514. package/standard/multi-agent-coordination.md +0 -50
  515. package/standard/multi-source-quality-feedback.md +0 -71
  516. package/standard/object-model.md +0 -167
  517. package/standard/organization-governance.md +0 -83
  518. package/standard/process-control-contract.md +0 -53
  519. package/standard/profile-boundaries.md +0 -225
  520. package/standard/profiles.md +0 -253
  521. package/standard/project-technology.md +0 -215
  522. package/standard/projection-views.md +0 -69
  523. package/standard/recovery-resume.md +0 -49
  524. package/standard/relation-model.md +0 -149
  525. package/standard/risk-control-matrix.md +0 -53
  526. package/standard/route-explanation.md +0 -35
  527. package/standard/route-regression.md +0 -33
  528. package/standard/routing-fixtures.md +0 -54
  529. package/standard/runtime-enablement.md +0 -85
  530. package/standard/semantic-intent-resolution.md +0 -91
  531. package/standard/source-boundary-contract.md +0 -49
  532. package/standard/standard-v0.1.md +0 -132
  533. package/standard/technology-quality-feedback.md +0 -97
  534. package/standard/test-suite.md +0 -159
  535. package/standard/work-state-machine.md +0 -62
  536. package/templates/README.md +0 -77
  537. package/templates/ai-employee-starter/README.md +0 -9
  538. package/templates/ai-employee-starter/gates/results.json +0 -12
  539. package/templates/ai-employee-starter/graph/objects.json +0 -90
  540. package/templates/ai-employee-starter/graph/relations.json +0 -47
  541. package/templates/ai-employee-starter/graph.json +0 -37
  542. package/templates/character-layer-starter/README.md +0 -39
  543. package/templates/character-layer-starter/gates/results.json +0 -20
  544. package/templates/character-layer-starter/graph/objects.json +0 -308
  545. package/templates/character-layer-starter/graph/relations.json +0 -344
  546. package/templates/character-layer-starter/graph.json +0 -37
  547. package/templates/organization-governance-starter/README.md +0 -9
  548. package/templates/organization-governance-starter/gates/results.json +0 -12
  549. package/templates/organization-governance-starter/graph/objects.json +0 -112
  550. package/templates/organization-governance-starter/graph/relations.json +0 -65
  551. package/templates/organization-governance-starter/graph.json +0 -37
  552. package/templates/research-program-starter/README.md +0 -9
  553. package/templates/research-program-starter/gates/results.json +0 -12
  554. package/templates/research-program-starter/graph/objects.json +0 -79
  555. package/templates/research-program-starter/graph/relations.json +0 -47
  556. package/templates/research-program-starter/graph.json +0 -37
  557. package/templates/software-project-starter/README.md +0 -9
  558. package/templates/software-project-starter/gates/results.json +0 -12
  559. package/templates/software-project-starter/graph/objects.json +0 -79
  560. package/templates/software-project-starter/graph/relations.json +0 -47
  561. package/templates/software-project-starter/graph.json +0 -37
@@ -1,841 +0,0 @@
1
- "use strict";
2
-
3
- const crypto = require("crypto");
4
- const fs = require("fs");
5
- const os = require("os");
6
- const path = require("path");
7
- const { spawnSync } = require("child_process");
8
- const {
9
- FORMAT,
10
- SCHEMA_ID,
11
- SCHEMA_VERSION,
12
- jsonBytes,
13
- readJson,
14
- validateManifest,
15
- } = require("../cli/graph-manifest");
16
- const traversal = require("./context-traversal");
17
- const continuity = require("./continuity");
18
- const artifacts = require("./artifact-release");
19
- const technologyCourse = require("./technology-course");
20
-
21
- const CONTRACT_VERSION = "1.0.0";
22
- const EXTENSION_KEY = "mirai.project_technology";
23
- const LEGACY_EXTENSION_KEY = "simai.project_technology";
24
- const LOCAL_DIR = path.join(".mirai-graph", "project-technology");
25
- const LEGACY_LOCAL_DIR = path.join(".simai", "project-technology");
26
- const INVENTORY_FILE = "inventory.json";
27
- const BINDING_FILE = "target-provider-binding.json";
28
- const IMPORT_DIR = "provider-exports";
29
- const EXPORT_FILE = path.join("graph", "generated", "project-technology", "target-provider-export.json");
30
- const TARGET_DIGEST_RE = /^sha256:[0-9a-f]{64}$/;
31
- const REVISION_RE = /^[0-9a-f]{40}$/;
32
- const REF_RE = /^[A-Za-z0-9][A-Za-z0-9._:/@?=+*-]{1,255}$/;
33
- const ACCEPTED_LIFECYCLES = new Set(["accepted", "implemented", "validated", "operating", "evolving"]);
34
- const ACTIONS = new Set(["create", "modify", "delete", "rename", "migrate", "test", "document"]);
35
- const TARGET_EXPORT_KEYS = new Set([
36
- "schema_version", "target_id", "semantic_digest", "provider_revision",
37
- "decision_refs", "goal_binding", "requirement_bindings", "constraint_ids",
38
- "non_goal_ids", "deferred_boundary_ids", "allowed_change_scope",
39
- "architecture_contract", "execution_contract_digest",
40
- ]);
41
- const SECRET_PARTS = [".env", "credential", "secret", "token", "password", "private-key", "id_rsa", ".pem", ".p12"];
42
- const EXCLUDED_PARTS = new Set([".git", ".mirai-graph", ".simai", "node_modules", "vendor", "dist", "build", "coverage", "generated"]);
43
-
44
- function sortValue(value) {
45
- if (Array.isArray(value)) return value.map(sortValue);
46
- if (!value || typeof value !== "object") return value;
47
- return Object.fromEntries(Object.keys(value).sort().map((key) => [key, sortValue(value[key])]));
48
- }
49
-
50
- function canonicalBytes(value) {
51
- return `${JSON.stringify(sortValue(value), null, 2)}\n`;
52
- }
53
-
54
- function sha256(value, prefix = false) {
55
- const digest = crypto.createHash("sha256").update(Buffer.isBuffer(value) ? value : Buffer.from(String(value))).digest("hex");
56
- return prefix ? `sha256:${digest}` : digest;
57
- }
58
-
59
- function atomicWrite(filePath, content) {
60
- const bytes = Buffer.isBuffer(content) ? content : Buffer.from(String(content));
61
- if (fs.existsSync(filePath) && fs.readFileSync(filePath).equals(bytes)) return false;
62
- fs.mkdirSync(path.dirname(filePath), { recursive: true });
63
- const temp = path.join(path.dirname(filePath), `.${path.basename(filePath)}.${process.pid}.${crypto.randomBytes(4).toString("hex")}`);
64
- fs.writeFileSync(temp, bytes);
65
- fs.renameSync(temp, filePath);
66
- return true;
67
- }
68
-
69
- function result(operation, operationMode, status, extra = {}) {
70
- return {
71
- schema_version: "1.0.0",
72
- operation_id: `mirai.project_technology.${operation}`,
73
- operation_mode: operationMode,
74
- status,
75
- changed: false,
76
- blockers: [],
77
- warnings: [],
78
- next_action: "none",
79
- ...extra,
80
- };
81
- }
82
-
83
- function git(repo, ...args) {
84
- const completed = spawnSync("git", args, {
85
- cwd: repo,
86
- encoding: "utf8",
87
- maxBuffer: 64 * 1024 * 1024,
88
- });
89
- return completed.status === 0 ? completed.stdout.trim() : "";
90
- }
91
-
92
- function normalizeRepo(repo) {
93
- return path.resolve(repo || ".");
94
- }
95
-
96
- function runtimeRoot(repo, manifest = null, options = {}) {
97
- return continuity.stateRoot(repo, manifest || readManifest(repo).manifest, options);
98
- }
99
-
100
- function legacyRuntimeState(repo) {
101
- const root = path.join(repo, LOCAL_DIR);
102
- return {
103
- root,
104
- present: fs.existsSync(root),
105
- inventory: path.join(root, INVENTORY_FILE),
106
- binding: path.join(root, BINDING_FILE),
107
- };
108
- }
109
-
110
- function migrateProjectLocalRuntime(repo, manifest, root) {
111
- const legacy = legacyRuntimeState(repo);
112
- if (!legacy.present) return { changed: false, blockers: [], migration_ref: null };
113
- const blockers = [];
114
- let changed = false;
115
- if (fs.existsSync(legacy.binding)) {
116
- const binding = readJson(legacy.binding);
117
- const identity = bindingValues(binding); blockers.push(...identity.blockers);
118
- const ref = String(binding.provider_export_ref || "");
119
- const exportPath = ref && !path.isAbsolute(ref) ? path.resolve(repo, ref) : null;
120
- const exported = exportPath ? readExport(exportPath) : { export: {}, blockers: ["legacy_provider_export_missing"] };
121
- blockers.push(...exported.blockers);
122
- for (const key of Object.keys(identity.values)) if (exported.export[key] !== identity.values[key]) blockers.push(`legacy_${key}_mismatch`);
123
- if (!blockers.length) {
124
- const exportBytes = canonicalBytes(exported.export);
125
- const exportSha = sha256(exportBytes);
126
- changed = atomicWrite(path.join(root, IMPORT_DIR, `${exportSha}.json`), exportBytes) || changed;
127
- changed = atomicWrite(path.join(root, BINDING_FILE), canonicalBytes({
128
- schema_version: "1.0.0", ...identity.values,
129
- provider_export_ref: `host-local://${IMPORT_DIR}/${exportSha}.json`,
130
- provider_export_sha256: exportSha,
131
- })) || changed;
132
- }
133
- }
134
- if (blockers.length) return { changed: false, blockers: [...new Set(blockers)].sort(), migration_ref: null };
135
- const receipt = {
136
- schema_version: "1.0.0",
137
- status: "migrated",
138
- repository_id: manifest.id,
139
- source: LOCAL_DIR,
140
- source_preserved: true,
141
- active_runtime: "host-local",
142
- };
143
- const receiptName = `project-local-runtime-${sha256(canonicalBytes(receipt)).slice(0, 16)}.json`;
144
- changed = atomicWrite(path.join(root, "migrations", receiptName), canonicalBytes(receipt)) || changed;
145
- return { changed, blockers: [], migration_ref: `host-local://migrations/${receiptName}` };
146
- }
147
-
148
- function readManifest(repo) {
149
- const manifestPath = path.join(repo, "graph.json");
150
- if (!fs.existsSync(manifestPath)) return { manifest: null, blockers: ["graph_manifest_missing"] };
151
- if (fs.lstatSync(manifestPath).isSymbolicLink()) return { manifest: null, blockers: ["graph_manifest_symlink_unsafe"] };
152
- let manifest;
153
- try { manifest = readJson(manifestPath); } catch (_) { return { manifest: null, blockers: ["graph_manifest_invalid"] }; }
154
- const blockers = validateManifest(manifest, repo);
155
- return { manifest, blockers };
156
- }
157
-
158
- function extensionContract() {
159
- return {
160
- contract_version: CONTRACT_VERSION,
161
- enabled: true,
162
- context_policy: "task_scoped",
163
- source_boundary: "hybrid_sot",
164
- continuity_policy: "task_boundary",
165
- };
166
- }
167
-
168
- function extensionState(manifest) {
169
- const extensions = manifest && manifest.extensions && typeof manifest.extensions === "object" ? manifest.extensions : {};
170
- const current = extensions[EXTENSION_KEY];
171
- const legacy = extensions[LEGACY_EXTENSION_KEY];
172
- if (current && typeof current === "object") {
173
- const blockers = [];
174
- if (current.contract_version !== CONTRACT_VERSION) blockers.push("project_technology_contract_version_mismatch");
175
- if (current.context_policy !== "task_scoped") blockers.push("project_technology_context_policy_mismatch");
176
- if (current.source_boundary !== "hybrid_sot") blockers.push("project_technology_source_boundary_mismatch");
177
- return { contract: current, legacy: false, blockers };
178
- }
179
- if (legacy && typeof legacy === "object") return { contract: legacy, legacy: true, blockers: ["project_technology_migration_required"] };
180
- return { contract: null, legacy: false, blockers: ["project_technology_not_configured"] };
181
- }
182
-
183
- function boundedRefs(value, field, blockers, options = {}) {
184
- const required = options.required !== false;
185
- if (!Array.isArray(value) || (required && value.length === 0)) {
186
- blockers.push(`provider_contract_${field}_empty`);
187
- return [];
188
- }
189
- const output = [];
190
- for (const item of value) {
191
- if (typeof item !== "string" || !REF_RE.test(item) || (!options.allowGlob && /[*]/.test(item))) {
192
- blockers.push(`provider_contract_${field}_unsafe`);
193
- continue;
194
- }
195
- output.push(item);
196
- }
197
- return [...new Set(output)].sort();
198
- }
199
-
200
- function dependencyCycle(relations) {
201
- const edges = new Map();
202
- for (const relation of relations) {
203
- const parts = relation.split("->");
204
- if (parts.length !== 2 || !parts[0] || !parts[1]) return true;
205
- if (!edges.has(parts[0])) edges.set(parts[0], new Set());
206
- edges.get(parts[0]).add(parts[1]);
207
- }
208
- const visited = new Set();
209
- const visiting = new Set();
210
- function visit(node) {
211
- if (visiting.has(node)) return true;
212
- if (visited.has(node)) return false;
213
- visiting.add(node);
214
- for (const child of edges.get(node) || []) if (visit(child)) return true;
215
- visiting.delete(node); visited.add(node); return false;
216
- }
217
- return [...edges.keys()].some(visit);
218
- }
219
-
220
- function boundedRelations(value, field, blockers) {
221
- if (!Array.isArray(value)) {
222
- blockers.push(`provider_contract_${field}_empty`);
223
- return [];
224
- }
225
- const output = [];
226
- for (const relation of value) {
227
- if (typeof relation !== "string") { blockers.push(`provider_contract_${field}_unsafe`); continue; }
228
- const parts = relation.split("->");
229
- if (parts.length !== 2 || parts.some((part) => !REF_RE.test(part))) {
230
- blockers.push(`provider_contract_${field}_unsafe`); continue;
231
- }
232
- output.push(`${parts[0]}->${parts[1]}`);
233
- }
234
- return [...new Set(output)].sort();
235
- }
236
-
237
- function normalizeExecutionContract(value) {
238
- const blockers = [];
239
- if (!value || typeof value !== "object" || Array.isArray(value)) return { contract: {}, blockers: ["provider_execution_contract_missing"] };
240
- const allowed = new Set(["decision_refs", "goal_binding", "requirement_bindings", "constraint_ids", "non_goal_ids", "deferred_boundary_ids", "allowed_change_scope", "architecture_contract"]);
241
- if (Object.keys(value).some((key) => !allowed.has(key))) blockers.push("provider_execution_contract_not_bounded");
242
-
243
- const decisionRefs = boundedRefs(value.decision_refs, "decision_refs", blockers);
244
- const goal = value.goal_binding && typeof value.goal_binding === "object" && !Array.isArray(value.goal_binding) ? value.goal_binding : {};
245
- if (Object.keys(goal).some((key) => !["goal_id", "done_when_ids"].includes(key))) blockers.push("provider_contract_goal_binding_not_bounded");
246
- const goalId = String(goal.goal_id || "").trim();
247
- if (!REF_RE.test(goalId)) blockers.push("provider_contract_goal_id_missing_or_unsafe");
248
- const doneWhenIds = boundedRefs(goal.done_when_ids, "done_when_ids", blockers);
249
-
250
- const requirementBindings = [];
251
- if (!Array.isArray(value.requirement_bindings) || value.requirement_bindings.length === 0) blockers.push("provider_contract_requirement_bindings_empty");
252
- else {
253
- const seen = new Set();
254
- for (const item of value.requirement_bindings) {
255
- if (!item || typeof item !== "object" || Array.isArray(item) || Object.keys(item).some((key) => !["requirement_id", "acceptance_ids", "done_when_ids"].includes(key))) {
256
- blockers.push("provider_contract_requirement_binding_invalid"); continue;
257
- }
258
- const requirementId = String(item.requirement_id || "").trim();
259
- if (!REF_RE.test(requirementId) || seen.has(requirementId)) { blockers.push("provider_contract_requirement_id_missing_duplicate_or_unsafe"); continue; }
260
- seen.add(requirementId);
261
- const acceptanceIds = boundedRefs(item.acceptance_ids, "acceptance_ids", blockers);
262
- const linkedDoneWhen = boundedRefs(item.done_when_ids, "requirement_done_when_ids", blockers);
263
- if (linkedDoneWhen.some((id) => !doneWhenIds.includes(id))) blockers.push("provider_contract_requirement_done_when_outside_goal");
264
- requirementBindings.push({ requirement_id: requirementId, acceptance_ids: acceptanceIds, done_when_ids: linkedDoneWhen });
265
- }
266
- }
267
- requirementBindings.sort((a, b) => a.requirement_id.localeCompare(b.requirement_id));
268
-
269
- const constraintIds = boundedRefs(value.constraint_ids, "constraint_ids", blockers);
270
- const nonGoalIds = boundedRefs(value.non_goal_ids, "non_goal_ids", blockers);
271
- const deferredIds = boundedRefs(value.deferred_boundary_ids, "deferred_boundary_ids", blockers);
272
- const scopes = [];
273
- if (!Array.isArray(value.allowed_change_scope) || value.allowed_change_scope.length === 0) blockers.push("provider_contract_allowed_change_scope_empty");
274
- else for (const item of value.allowed_change_scope) {
275
- if (!item || typeof item !== "object" || Array.isArray(item) || Object.keys(item).some((key) => !["repository_id", "owner_id", "package_id", "file_patterns", "actions"].includes(key))) {
276
- blockers.push("provider_contract_allowed_change_scope_invalid"); continue;
277
- }
278
- const ids = Object.fromEntries(["repository_id", "owner_id", "package_id"].map((key) => [key, String(item[key] || "").trim()]));
279
- if (Object.values(ids).some((id) => !REF_RE.test(id))) { blockers.push("provider_contract_scope_identity_missing_or_unsafe"); continue; }
280
- const patterns = boundedRefs(item.file_patterns, "scope_file_patterns", blockers, { allowGlob: true });
281
- if (patterns.some((entry) => path.isAbsolute(entry) || entry.split(/[\\/]+/).includes("..") || entry.split(/[\\/]+/)[0] === "source")) blockers.push("provider_contract_scope_file_pattern_unsafe");
282
- const actions = boundedRefs(item.actions, "scope_actions", blockers);
283
- if (actions.some((action) => !ACTIONS.has(action))) blockers.push("provider_contract_scope_action_unsupported");
284
- scopes.push({ ...ids, file_patterns: patterns, actions });
285
- }
286
- scopes.sort((a, b) => canonicalBytes(a).localeCompare(canonicalBytes(b)));
287
-
288
- const architecture = value.architecture_contract && typeof value.architecture_contract === "object" && !Array.isArray(value.architecture_contract) ? value.architecture_contract : {};
289
- const architectureAllowed = new Set([
290
- "contract_ref", "acceptance_ref", "architecture_owner_id", "lifecycle", "owner_ids", "component_ids",
291
- "package_ids", "capability_ids", "ownership_boundaries", "required_relations",
292
- "allowed_relations", "forbidden_relations", "required_dependencies", "forbidden_dependencies",
293
- ]);
294
- if (Object.keys(architecture).some((key) => !architectureAllowed.has(key))) blockers.push("provider_architecture_contract_not_bounded");
295
- const contractRef = String(architecture.contract_ref || "").trim();
296
- const acceptanceRef = String(architecture.acceptance_ref || "").trim();
297
- const architectureOwnerId = String(architecture.architecture_owner_id || "").trim();
298
- const lifecycle = String(architecture.lifecycle || "").trim();
299
- if (!REF_RE.test(contractRef)) blockers.push("provider_architecture_contract_ref_missing_or_unsafe");
300
- if (!REF_RE.test(acceptanceRef)) blockers.push("provider_architecture_acceptance_ref_missing_or_unsafe");
301
- if (!REF_RE.test(architectureOwnerId)) blockers.push("provider_architecture_owner_missing_or_unsafe");
302
- if (!ACCEPTED_LIFECYCLES.has(lifecycle)) blockers.push("provider_architecture_not_accepted");
303
- const ownerIds = boundedRefs(architecture.owner_ids, "architecture_owner_ids", blockers);
304
- const componentIds = boundedRefs(architecture.component_ids, "architecture_component_ids", blockers);
305
- const packageIds = boundedRefs(architecture.package_ids, "architecture_package_ids", blockers);
306
- const capabilityIds = boundedRefs(architecture.capability_ids, "architecture_capability_ids", blockers);
307
- const ownershipBoundaries = [];
308
- if (!Array.isArray(architecture.ownership_boundaries) || architecture.ownership_boundaries.length === 0) blockers.push("provider_architecture_ownership_boundaries_empty");
309
- else for (const boundary of architecture.ownership_boundaries) {
310
- const keys = ["subject_ref", "data_owner", "access_owner", "lifecycle_owner", "interface_owner", "runtime_owner"];
311
- if (!boundary || typeof boundary !== "object" || Array.isArray(boundary) || Object.keys(boundary).some((key) => !keys.includes(key))) {
312
- blockers.push("provider_architecture_ownership_boundary_invalid"); continue;
313
- }
314
- const normalizedBoundary = Object.fromEntries(keys.map((key) => [key, String(boundary[key] || "").trim()]));
315
- if (Object.values(normalizedBoundary).some((id) => !REF_RE.test(id))) {
316
- blockers.push("provider_architecture_ownership_boundary_unsafe"); continue;
317
- }
318
- if (![...componentIds, ...packageIds, ...capabilityIds].includes(normalizedBoundary.subject_ref)) blockers.push("provider_architecture_ownership_subject_unknown");
319
- if (["data_owner", "access_owner", "lifecycle_owner", "interface_owner", "runtime_owner"].some((key) => !ownerIds.includes(normalizedBoundary[key]))) blockers.push("provider_architecture_boundary_owner_unapproved");
320
- ownershipBoundaries.push(normalizedBoundary);
321
- }
322
- ownershipBoundaries.sort((a, b) => canonicalBytes(a).localeCompare(canonicalBytes(b)));
323
- const requiredRelations = boundedRelations(architecture.required_relations, "architecture_required_relations", blockers);
324
- const allowedRelations = boundedRelations(architecture.allowed_relations, "architecture_allowed_relations", blockers);
325
- const forbiddenRelations = boundedRelations(architecture.forbidden_relations, "architecture_forbidden_relations", blockers);
326
- if (requiredRelations.some((item) => forbiddenRelations.includes(item))) blockers.push("provider_architecture_forbidden_relation");
327
- const requiredDependencies = boundedRelations(architecture.required_dependencies, "required_dependencies", blockers);
328
- const forbiddenDependencies = boundedRelations(architecture.forbidden_dependencies, "forbidden_dependencies", blockers);
329
- if (requiredDependencies.some((item) => forbiddenDependencies.includes(item))) blockers.push("provider_architecture_forbidden_dependency");
330
- if (dependencyCycle(requiredDependencies)) blockers.push("provider_architecture_dependency_cycle");
331
- if (scopes.some((scope) => !ownerIds.includes(scope.owner_id))) blockers.push("provider_contract_scope_owner_unapproved");
332
- if (scopes.some((scope) => !packageIds.includes(scope.package_id))) blockers.push("provider_contract_scope_package_unapproved");
333
-
334
- const contract = {
335
- decision_refs: decisionRefs,
336
- goal_binding: { goal_id: goalId, done_when_ids: doneWhenIds },
337
- requirement_bindings: requirementBindings,
338
- constraint_ids: constraintIds,
339
- non_goal_ids: nonGoalIds,
340
- deferred_boundary_ids: deferredIds,
341
- allowed_change_scope: scopes,
342
- architecture_contract: {
343
- contract_ref: contractRef,
344
- acceptance_ref: acceptanceRef,
345
- architecture_owner_id: architectureOwnerId,
346
- lifecycle,
347
- owner_ids: ownerIds,
348
- component_ids: componentIds,
349
- package_ids: packageIds,
350
- capability_ids: capabilityIds,
351
- ownership_boundaries: ownershipBoundaries,
352
- required_relations: requiredRelations,
353
- allowed_relations: allowedRelations,
354
- forbidden_relations: forbiddenRelations,
355
- required_dependencies: requiredDependencies,
356
- forbidden_dependencies: forbiddenDependencies,
357
- },
358
- };
359
- return { contract, blockers: [...new Set(blockers)].sort() };
360
- }
361
-
362
- function specObjectFiles(repo, manifest) {
363
- const found = [];
364
- const indexCandidates = [path.join(repo, "graph", "specs", "index.json")];
365
- if (manifest && manifest.graph) for (const item of manifest.graph.objects || []) if (item.endsWith("index.json")) indexCandidates.push(path.join(repo, item));
366
- for (const indexPath of [...new Set(indexCandidates)]) {
367
- if (!fs.existsSync(indexPath)) continue;
368
- if (fs.lstatSync(indexPath).isSymbolicLink()) continue;
369
- try {
370
- const index = readJson(indexPath);
371
- for (const ref of [...(index.object_files || []), ...(index.objects || [])]) {
372
- const absolute = path.isAbsolute(ref) ? ref : ref.startsWith("graph/specs/") ? path.join(repo, ref) : path.join(path.dirname(indexPath), ref);
373
- if (fs.existsSync(absolute) && !fs.lstatSync(absolute).isSymbolicLink() && fs.statSync(absolute).isFile()) found.push(absolute);
374
- }
375
- } catch (_) { /* reported by caller if no usable objects */ }
376
- }
377
- if (found.length === 0) {
378
- const objectsDir = path.join(repo, "graph", "specs", "objects");
379
- if (fs.existsSync(objectsDir)) for (const name of fs.readdirSync(objectsDir).sort()) {
380
- const candidate = path.join(objectsDir, name);
381
- if (name.endsWith(".json") && !fs.lstatSync(candidate).isSymbolicLink()) found.push(candidate);
382
- }
383
- }
384
- return [...new Set(found)];
385
- }
386
-
387
- function targetContract(repo, targetId, semanticDigest, manifest) {
388
- const blockers = [];
389
- const matches = [];
390
- for (const file of specObjectFiles(repo, manifest)) {
391
- try { const object = readJson(file); if (object.id === targetId) matches.push({ object, file }); } catch (_) { blockers.push("provider_target_object_invalid"); }
392
- }
393
- if (matches.length !== 1) return { contract: {}, blockers: [...blockers, "provider_target_object_count_invalid"] };
394
- const target = matches[0].object;
395
- const relative = path.relative(repo, matches[0].file).split(path.sep).join("/");
396
- if (!trackedFiles(repo).includes(relative)) blockers.push("provider_target_object_not_revision_bound");
397
- const clean = spawnSync("git", ["diff", "--quiet", "HEAD", "--", relative], { cwd: repo });
398
- if (clean.status !== 0) blockers.push("provider_target_object_not_revision_bound");
399
- if (!["system", "contract"].includes(target.tz_role)) blockers.push("provider_target_role_not_canonical");
400
- if (!ACCEPTED_LIFECYCLES.has(target.lifecycle)) blockers.push("provider_target_not_accepted");
401
- if (String(target.semantic_digest || "").toLowerCase() !== semanticDigest) blockers.push("provider_target_semantic_digest_mismatch");
402
- const normalized = normalizeExecutionContract(target.provider_execution_contract);
403
- return { contract: normalized.contract, blockers: [...new Set([...blockers, ...normalized.blockers])].sort() };
404
- }
405
-
406
- function bindingValues(options) {
407
- const values = {
408
- target_id: String(options.target_id || options.targetId || "").trim(),
409
- semantic_digest: String(options.semantic_digest || options.semanticDigest || "").trim().toLowerCase(),
410
- provider_revision: String(options.provider_revision || options.providerRevision || "").trim().toLowerCase(),
411
- };
412
- const blockers = [];
413
- if (!REF_RE.test(values.target_id)) blockers.push("target_id_invalid");
414
- if (!TARGET_DIGEST_RE.test(values.semantic_digest)) blockers.push("semantic_digest_invalid");
415
- if (!REVISION_RE.test(values.provider_revision)) blockers.push("provider_revision_invalid");
416
- return { values, blockers };
417
- }
418
-
419
- function readExport(filePath) {
420
- const blockers = [];
421
- if (!filePath || !fs.existsSync(filePath) || fs.lstatSync(filePath).isSymbolicLink()) return { export: {}, blockers: ["provider_export_missing_or_unsafe"] };
422
- const bytes = fs.readFileSync(filePath);
423
- if (bytes.length > 64 * 1024) return { export: {}, blockers: ["provider_export_too_large"] };
424
- let payload;
425
- try { payload = JSON.parse(bytes.toString("utf8").replace(/^\uFEFF/, "")); } catch (_) { return { export: {}, blockers: ["provider_export_invalid"] }; }
426
- if (!payload || typeof payload !== "object" || Array.isArray(payload)) return { export: {}, blockers: ["provider_export_invalid"] };
427
- if (Object.keys(payload).some((key) => !TARGET_EXPORT_KEYS.has(key))) blockers.push("provider_export_not_bounded");
428
- const identity = bindingValues(payload); blockers.push(...identity.blockers);
429
- const executionFields = [
430
- "decision_refs", "goal_binding", "requirement_bindings", "constraint_ids",
431
- "non_goal_ids", "deferred_boundary_ids", "allowed_change_scope", "architecture_contract",
432
- ];
433
- const normalized = normalizeExecutionContract(Object.fromEntries(executionFields.map((key) => [key, payload[key]])));
434
- blockers.push(...normalized.blockers);
435
- const digest = sha256(canonicalBytes(normalized.contract));
436
- if (!payload.execution_contract_digest) blockers.push("provider_execution_contract_digest_missing");
437
- else if (payload.execution_contract_digest !== digest) blockers.push("provider_execution_contract_digest_mismatch");
438
- return { export: { schema_version: "1.0.0", ...identity.values, ...normalized.contract, execution_contract_digest: digest }, blockers: [...new Set(blockers)].sort(), raw_sha256: sha256(bytes) };
439
- }
440
-
441
- function trackedFiles(repo) {
442
- const tracked = git(repo, "ls-files", "-z");
443
- return tracked ? tracked.split("\0").filter(Boolean) : [];
444
- }
445
-
446
- function safeTrackedFile(relative) {
447
- const lowered = relative.toLowerCase();
448
- const parts = relative.split(/[\\/]+/);
449
- if (parts.some((part) => EXCLUDED_PARTS.has(part))) return false;
450
- if (parts[0] === "source" && parts[1] === "private") return false;
451
- return !SECRET_PARTS.some((part) => lowered.includes(part));
452
- }
453
-
454
- function inventory(repo) {
455
- const entries = [];
456
- for (const relative of trackedFiles(repo).filter(safeTrackedFile).sort()) {
457
- const absolute = path.join(repo, relative);
458
- if (!fs.existsSync(absolute) || fs.lstatSync(absolute).isSymbolicLink() || !fs.statSync(absolute).isFile()) continue;
459
- const bytes = fs.readFileSync(absolute);
460
- entries.push({ path: relative.split(path.sep).join("/"), bytes: bytes.length, sha256: sha256(bytes) });
461
- }
462
- const payload = {
463
- schema_version: "1.0.0",
464
- repository_id: readManifest(repo).manifest?.id || path.basename(repo),
465
- revision: git(repo, "rev-parse", "HEAD") || null,
466
- files: entries,
467
- };
468
- payload.inventory_digest = sha256(canonicalBytes(payload), true);
469
- return payload;
470
- }
471
-
472
- function context(repoArg, options = {}) {
473
- if (options.phase === "expand") return traversal.expandContext(repoArg, options.traversalReceipt, options.selectedIds, options);
474
- if (options.phase === "compile") return traversal.compileContext(repoArg, options.traversalReceipt, options.selection, options);
475
- if (options.phase === "verify") return traversal.verifyContext(repoArg, options.contextPack, options.usageEvidence, options);
476
- if (options.phase === "discover") return traversal.discoverContext(repoArg, options.task, options);
477
- const discovered = traversal.discoverContext(repoArg, options.task, options);
478
- const nodes = new Map((discovered.traversal_receipt?.nodes || []).map((node) => [node.id, node]));
479
- return {
480
- ...discovered,
481
- operation_id: "mirai.project_technology.context",
482
- task: discovered.traversal_receipt?.task?.text || "",
483
- included_objects: (discovered.traversal_receipt?.candidates || []).map((candidate) => ({
484
- object_id: candidate.id,
485
- score: candidate.score,
486
- title: nodes.get(candidate.id)?.title || null,
487
- summary: nodes.get(candidate.id)?.summary || null,
488
- source_refs: (nodes.get(candidate.id)?.source_refs || []).map((source) => source.ref),
489
- })),
490
- runtime_contract: { graph_first_scope: "routing/capability/policy orientation", raw_source_authoritative: true, canonical_write_allowed: false },
491
- continuity: continuity.status(normalizeRepo(repoArg), readManifest(normalizeRepo(repoArg)).manifest, options),
492
- };
493
- }
494
-
495
- function targetBindingStatus(repo, options = {}) {
496
- const manifest = readManifest(repo).manifest;
497
- const root = runtimeRoot(repo, manifest, options);
498
- const bindingPath = path.join(root, BINDING_FILE);
499
- if (!fs.existsSync(bindingPath)) return { status: "not_configured", enabled: false, blockers: [], next_action: "connect an exact target provider binding" };
500
- let binding;
501
- try { binding = readJson(bindingPath); } catch (_) { return { status: "blocked", enabled: true, blockers: ["target_binding_invalid"] }; }
502
- const identity = bindingValues(binding);
503
- const exportRef = String(binding.provider_export_ref || "");
504
- const hostPrefix = "host-local://";
505
- const exportPath = exportRef.startsWith(hostPrefix) ? path.join(root, exportRef.slice(hostPrefix.length)) : null;
506
- const blockers = [...identity.blockers];
507
- if (!exportPath || !exportPath.startsWith(`${root}${path.sep}`)) blockers.push("provider_export_outside_host_state");
508
- const exported = exportPath ? readExport(exportPath) : { export: {}, blockers: ["provider_export_missing"] };
509
- blockers.push(...exported.blockers);
510
- for (const key of Object.keys(identity.values)) if (exported.export[key] !== identity.values[key]) blockers.push(`${key}_mismatch`);
511
- if (!binding.provider_export_sha256 || binding.provider_export_sha256 !== exported.raw_sha256) blockers.push("provider_export_digest_mismatch");
512
- const repositoryId = readManifest(repo).manifest?.id || path.basename(repo);
513
- if (Array.isArray(exported.export.allowed_change_scope) && !exported.export.allowed_change_scope.some((scope) => scope.repository_id === repositoryId)) {
514
- blockers.push("provider_contract_repository_scope_unapproved");
515
- }
516
- return {
517
- status: blockers.length ? "blocked" : "ready",
518
- enabled: true,
519
- ...identity.values,
520
- provider_export_ref: exportRef || null,
521
- provider_export_sha256: binding.provider_export_sha256 || null,
522
- execution_contract: Object.fromEntries(["decision_refs", "goal_binding", "requirement_bindings", "constraint_ids", "non_goal_ids", "deferred_boundary_ids", "allowed_change_scope", "architecture_contract"].map((key) => [key, exported.export[key]])),
523
- execution_contract_digest: exported.export.execution_contract_digest || null,
524
- blockers: [...new Set(blockers)].sort(),
525
- next_action: blockers.length ? "refresh or repair the exact provider binding" : "none",
526
- };
527
- }
528
-
529
- function status(repoArg, options = {}) {
530
- const repo = normalizeRepo(repoArg);
531
- const manifestState = readManifest(repo);
532
- const ext = extensionState(manifestState.manifest);
533
- let stored = null;
534
- const root = runtimeRoot(repo, manifestState.manifest, options);
535
- try { if (fs.existsSync(path.join(root, INVENTORY_FILE))) stored = readJson(path.join(root, INVENTORY_FILE)); } catch (_) { /* stale */ }
536
- const current = inventory(repo);
537
- const freshness = stored && stored.inventory_digest === current.inventory_digest ? "current" : stored ? "stale" : "missing";
538
- const blockers = [...manifestState.blockers, ...ext.blockers];
539
- if (!stored && legacyRuntimeState(repo).present) blockers.push("project_technology_host_state_migration_required");
540
- if (ext.contract && ext.contract.enabled === false) blockers.push("project_technology_disabled");
541
- if (freshness !== "current") blockers.push(`project_technology_inventory_${freshness}`);
542
- const binding = targetBindingStatus(repo, options);
543
- if (binding.status === "blocked") blockers.push(...binding.blockers);
544
- return result("status", "read_only", blockers.length ? "blocked" : "success", {
545
- repository_id: manifestState.manifest?.id || path.basename(repo),
546
- enabled: Boolean(ext.contract && ext.contract.enabled && !ext.legacy),
547
- manifest_status: manifestState.blockers.length ? "blocked" : "current",
548
- technology_freshness: freshness,
549
- technology_digest: current.inventory_digest,
550
- target_binding: binding,
551
- continuity: continuity.status(repo, manifestState.manifest, {}),
552
- blockers: [...new Set(blockers)].sort(),
553
- next_action: ext.legacy ? "run enable --apply to migrate the legacy contract" : blockers.length ? "run plan, then the required transactional operation" : "none",
554
- });
555
- }
556
-
557
- function explain(repoArg) {
558
- return result("explain", "read_only", "success", {
559
- repository_id: readManifest(normalizeRepo(repoArg)).manifest?.id || path.basename(normalizeRepo(repoArg)),
560
- explanation: "Project Technology uses one Mirai Graph manifest to build bounded task context, bind accepted targets and verify repository technology without replacing raw owner sources.",
561
- });
562
- }
563
-
564
- function plan(repoArg) {
565
- const state = status(repoArg);
566
- return result("plan", "read_only", "success", {
567
- current_status: state.status,
568
- planned_changes: ["validate_graph_manifest", "migrate_legacy_extension_if_present", "migrate_project_local_runtime_to_host_state", "enable_public_contract", "build_safe_inventory", "verify_target_binding"],
569
- blockers: state.blockers.filter((item) => !["project_technology_not_configured", "project_technology_migration_required", "project_technology_inventory_missing", "project_technology_inventory_stale"].includes(item)),
570
- next_action: "rerun the selected operation with --apply",
571
- });
572
- }
573
-
574
- function preview(operation, repoArg, options = {}) {
575
- const state = status(repoArg, options);
576
- return result(operation, "preview", "preview", { apply_required: true, current_status: state.status, blockers: state.blockers.filter((item) => item.startsWith("graph_manifest_")), next_action: `${operation} --apply` });
577
- }
578
-
579
- function enable(repoArg, options = {}) {
580
- const repo = normalizeRepo(repoArg);
581
- const manifestState = readManifest(repo);
582
- if (!manifestState.manifest || manifestState.blockers.length) return result("enable", "transactional", "fail", { blockers: manifestState.blockers, next_action: "repair graph.json" });
583
- const manifest = structuredClone(manifestState.manifest);
584
- const extensions = { ...(manifest.extensions || {}) };
585
- const legacy = extensions[LEGACY_EXTENSION_KEY];
586
- delete extensions[LEGACY_EXTENSION_KEY];
587
- extensions[EXTENSION_KEY] = extensionContract();
588
- manifest.extensions = extensions;
589
- const root = runtimeRoot(repo, manifest, options);
590
- const runtimeMigration = migrateProjectLocalRuntime(repo, manifest, root);
591
- if (runtimeMigration.blockers.length) return result("enable", "transactional", "fail", {
592
- blockers: runtimeMigration.blockers,
593
- next_action: "repair the project-local runtime before host-state migration",
594
- });
595
- const migrationRoot = path.join(root, "migrations", sha256(canonicalBytes({ legacy: legacy || null, head: git(repo, "rev-parse", "HEAD") })).slice(0, 16));
596
- fs.mkdirSync(migrationRoot, { recursive: true });
597
- atomicWrite(path.join(migrationRoot, "graph.json.before"), fs.readFileSync(path.join(repo, "graph.json")));
598
- if (legacy) atomicWrite(path.join(migrationRoot, "legacy-extension.json"), canonicalBytes(legacy));
599
- const legacyLocal = path.join(repo, LEGACY_LOCAL_DIR);
600
- if (fs.existsSync(legacyLocal)) atomicWrite(path.join(migrationRoot, "legacy-local-state.json"), canonicalBytes({ status: "preserved_for_rollback", path: LEGACY_LOCAL_DIR }));
601
- const manifestChanged = atomicWrite(path.join(repo, "graph.json"), canonicalBytes(manifest));
602
- const inv = inventory(repo);
603
- const inventoryChanged = atomicWrite(path.join(root, INVENTORY_FILE), canonicalBytes(inv));
604
- const verified = readManifest(repo);
605
- if (verified.blockers.length || extensionState(verified.manifest).blockers.length) {
606
- fs.copyFileSync(path.join(migrationRoot, "graph.json.before"), path.join(repo, "graph.json"));
607
- return result("enable", "transactional", "fail", { blockers: ["project_technology_enable_rolled_back", ...verified.blockers], next_action: "inspect the rollback receipt" });
608
- }
609
- return result("enable", "transactional", "success", {
610
- changed: manifestChanged || inventoryChanged || runtimeMigration.changed,
611
- migration_ref: runtimeMigration.migration_ref || `host-local://migrations/${path.basename(migrationRoot)}`,
612
- technology_digest: inv.inventory_digest,
613
- });
614
- }
615
-
616
- function sync(repoArg, options = {}) {
617
- const repo = normalizeRepo(repoArg);
618
- const manifestState = readManifest(repo);
619
- const ext = extensionState(manifestState.manifest);
620
- const blockers = [...manifestState.blockers, ...ext.blockers];
621
- const hostRoot = runtimeRoot(repo, manifestState.manifest, options);
622
- if (legacyRuntimeState(repo).present && !fs.existsSync(path.join(hostRoot, INVENTORY_FILE))) blockers.push("project_technology_host_state_migration_required");
623
- if (!ext.contract || ext.legacy || ext.contract.enabled !== true) blockers.push("project_technology_not_enabled");
624
- if (blockers.length) return result("sync", "transactional", "fail", { blockers: [...new Set(blockers)].sort(), next_action: "enable or repair Project Technology" });
625
- let continuityResult = null;
626
- if (options.boundary) {
627
- continuityResult = continuity.sync(repo, manifestState.manifest, options.boundary, options.continuityEvidence, options);
628
- if (continuityResult.status !== "success") return result("sync", "transactional", continuityResult.status, {
629
- blockers: continuityResult.blockers,
630
- continuity: continuityResult.continuity || null,
631
- next_action: "repair the continuity evidence or reconcile the graph state",
632
- });
633
- if (options.boundary === "task_start") return result("sync", "read_only", "success", {
634
- changed: false,
635
- technology_digest: inventory(repo).inventory_digest,
636
- target_binding: targetBindingStatus(repo, options),
637
- continuity: continuityResult.continuity,
638
- });
639
- }
640
- const inv = inventory(repo);
641
- const currentManifest = readManifest(repo).manifest;
642
- const changed = atomicWrite(path.join(runtimeRoot(repo, currentManifest || manifestState.manifest, options), INVENTORY_FILE), canonicalBytes(inv));
643
- return result("sync", "transactional", "success", {
644
- changed: changed || Boolean(continuityResult?.changed),
645
- technology_digest: inv.inventory_digest,
646
- target_binding: targetBindingStatus(repo, options),
647
- continuity: continuityResult?.continuity || continuity.status(repo, currentManifest, options),
648
- });
649
- }
650
-
651
- function provide(repoArg, options = {}) {
652
- const repo = normalizeRepo(repoArg);
653
- const identity = bindingValues(options);
654
- const manifestState = readManifest(repo);
655
- const ext = extensionState(manifestState.manifest);
656
- const blockers = [...identity.blockers, ...manifestState.blockers, ...ext.blockers];
657
- if (!ext.contract || ext.legacy || ext.contract.enabled !== true) blockers.push("project_technology_not_enabled");
658
- const head = git(repo, "rev-parse", "HEAD").toLowerCase();
659
- if (head !== identity.values.provider_revision) blockers.push("provider_revision_does_not_match_head");
660
- const target = targetContract(repo, identity.values.target_id, identity.values.semantic_digest, manifestState.manifest);
661
- blockers.push(...target.blockers);
662
- if (blockers.length) return result("provide", "transactional", "fail", { blockers: [...new Set(blockers)].sort(), next_action: "repair the accepted target contract" });
663
- const executionContractDigest = sha256(canonicalBytes(target.contract));
664
- const payload = { schema_version: "1.0.0", ...identity.values, ...target.contract, execution_contract_digest: executionContractDigest };
665
- const changed = atomicWrite(path.join(repo, EXPORT_FILE), canonicalBytes(payload));
666
- return result("provide", "transactional", "success", { changed, export_ref: EXPORT_FILE, target_binding: payload });
667
- }
668
-
669
- function providerRootFor(exportPath) {
670
- const completed = spawnSync("git", ["-C", path.dirname(exportPath), "rev-parse", "--show-toplevel"], { encoding: "utf8" });
671
- return completed.status === 0 ? completed.stdout.trim() : null;
672
- }
673
-
674
- function connect(repoArg, options = {}) {
675
- const repo = normalizeRepo(repoArg);
676
- const source = path.resolve(String(options.source || ""));
677
- const identity = bindingValues(options);
678
- const read = readExport(source);
679
- const manifestState = readManifest(repo);
680
- const ext = extensionState(manifestState.manifest);
681
- const blockers = [...identity.blockers, ...read.blockers, ...manifestState.blockers, ...ext.blockers];
682
- if (!ext.contract || ext.legacy || ext.contract.enabled !== true) blockers.push("project_technology_not_enabled");
683
- for (const key of Object.keys(identity.values)) if (read.export[key] !== identity.values[key]) blockers.push(`${key}_mismatch`);
684
- const providerRoot = providerRootFor(source);
685
- if (!providerRoot) blockers.push("provider_revision_order_unverifiable");
686
- else if (git(providerRoot, "rev-parse", "HEAD").toLowerCase() !== identity.values.provider_revision) blockers.push("provider_revision_does_not_match_head");
687
- const root = runtimeRoot(repo, manifestState.manifest, options);
688
- const currentPath = path.join(root, BINDING_FILE);
689
- let current = null;
690
- try { if (fs.existsSync(currentPath)) current = readJson(currentPath); } catch (_) { blockers.push("current_target_binding_invalid"); }
691
- if (current) {
692
- if (!options.refreshBinding) {
693
- const same = Object.keys(identity.values).every((key) => current[key] === identity.values[key]);
694
- if (!same) blockers.push("target_provider_conflict", "target_provider_refresh_required");
695
- else {
696
- const currentState = targetBindingStatus(repo, options);
697
- if (currentState.status !== "ready") blockers.push(...currentState.blockers);
698
- if (currentState.execution_contract_digest !== read.export.execution_contract_digest) blockers.push("target_provider_conflict", "provider_execution_contract_mismatch");
699
- }
700
- } else {
701
- if (current.target_id !== identity.values.target_id) blockers.push("target_provider_target_mismatch");
702
- if (current.semantic_digest !== identity.values.semantic_digest) blockers.push("target_provider_semantic_mismatch");
703
- const currentState = targetBindingStatus(repo, options);
704
- if (currentState.status !== "ready") blockers.push(...currentState.blockers);
705
- if (currentState.execution_contract_digest !== read.export.execution_contract_digest) blockers.push("provider_execution_contract_refresh_mismatch");
706
- if (!providerRoot) blockers.push("provider_revision_order_unverifiable");
707
- else {
708
- if (current.provider_revision !== identity.values.provider_revision) {
709
- const ancestry = spawnSync("git", ["-C", providerRoot, "merge-base", "--is-ancestor", current.provider_revision, identity.values.provider_revision]);
710
- if (ancestry.status !== 0) blockers.push("provider_revision_not_forward");
711
- }
712
- }
713
- }
714
- } else if (options.refreshBinding) blockers.push("target_provider_binding_missing_for_refresh");
715
- if (blockers.length) return result("connect", "transactional", "fail", { blockers: [...new Set(blockers)].sort(), next_action: "repair the provider export or request an explicit accepted target change" });
716
- const exportBytes = canonicalBytes(read.export);
717
- const exportSha = sha256(exportBytes);
718
- const imported = path.join(root, IMPORT_DIR, `${exportSha}.json`);
719
- const binding = { schema_version: "1.0.0", ...identity.values, provider_export_ref: `host-local://${IMPORT_DIR}/${exportSha}.json`, provider_export_sha256: exportSha };
720
- const transaction = fs.mkdtempSync(path.join(os.tmpdir(), "mirai-project-technology-"));
721
- const bindingBefore = fs.existsSync(currentPath) ? fs.readFileSync(currentPath) : null;
722
- const importBefore = fs.existsSync(imported) ? fs.readFileSync(imported) : null;
723
- try {
724
- const exportChanged = atomicWrite(imported, exportBytes);
725
- const bindingChanged = atomicWrite(currentPath, canonicalBytes(binding));
726
- fs.rmSync(transaction, { recursive: true, force: true });
727
- return result("connect", "transactional", "success", { changed: exportChanged || bindingChanged, refresh_binding: Boolean(options.refreshBinding), target_binding: targetBindingStatus(repo, options) });
728
- } catch (_) {
729
- if (bindingBefore) atomicWrite(currentPath, bindingBefore); else if (fs.existsSync(currentPath)) fs.unlinkSync(currentPath);
730
- if (importBefore) atomicWrite(imported, importBefore); else if (fs.existsSync(imported)) fs.unlinkSync(imported);
731
- fs.rmSync(transaction, { recursive: true, force: true });
732
- return result("connect", "transactional", "fail", { blockers: ["target_provider_transaction_failed", "target_provider_rollback_applied"], next_action: "inspect filesystem permissions and retry" });
733
- }
734
- }
735
-
736
- function disconnect(repoArg, options = {}) {
737
- const repo = normalizeRepo(repoArg);
738
- const root = runtimeRoot(repo, readManifest(repo).manifest, options);
739
- const bindingPath = path.join(root, BINDING_FILE);
740
- if (!fs.existsSync(bindingPath)) return result("disconnect", "transactional", "success");
741
- const backup = path.join(root, "rollback", `binding-${sha256(fs.readFileSync(bindingPath)).slice(0, 16)}.json`);
742
- atomicWrite(backup, fs.readFileSync(bindingPath));
743
- fs.unlinkSync(bindingPath);
744
- return result("disconnect", "transactional", "success", { changed: true, rollback_ref: `host-local://rollback/${path.basename(backup)}` });
745
- }
746
-
747
- function disable(repoArg) {
748
- const repo = normalizeRepo(repoArg);
749
- const manifestState = readManifest(repo);
750
- if (!manifestState.manifest || manifestState.blockers.length) return result("disable", "transactional", "fail", { blockers: manifestState.blockers });
751
- const manifest = structuredClone(manifestState.manifest);
752
- const current = extensionState(manifest);
753
- if (!current.contract || current.legacy) return result("disable", "transactional", "fail", { blockers: current.blockers });
754
- manifest.extensions[EXTENSION_KEY] = { ...current.contract, enabled: false };
755
- const changed = atomicWrite(path.join(repo, "graph.json"), canonicalBytes(manifest));
756
- return result("disable", "transactional", "success", { changed });
757
- }
758
-
759
- function repair(repoArg, options = {}) {
760
- const repo = normalizeRepo(repoArg);
761
- const manifestState = readManifest(repo);
762
- if (!manifestState.manifest || manifestState.blockers.length) return result("repair", "transactional", "fail", { blockers: manifestState.blockers, next_action: "repair graph.json before Project Technology" });
763
- const ext = extensionState(manifestState.manifest);
764
- if (!ext.contract || ext.legacy) return enable(repo, options);
765
- if (ext.blockers.length) return enable(repo, options);
766
- const root = runtimeRoot(repo, manifestState.manifest, options);
767
- if (legacyRuntimeState(repo).present && !fs.existsSync(path.join(root, INVENTORY_FILE))) return enable(repo, options);
768
- return sync(repo, options);
769
- }
770
-
771
- function verify(repoArg, options = {}) {
772
- const state = status(repoArg, options);
773
- const blockers = [...state.blockers];
774
- const repo = normalizeRepo(repoArg);
775
- const manifest = readManifest(repo).manifest;
776
- const continuityResult = continuity.verify(repo, manifest, options);
777
- if (continuity.continuityPolicy(manifest) === "task_boundary" || options.receiptDigest || options.significantWork) blockers.push(...continuityResult.blockers);
778
- if (options.significantWork && state.target_binding.status !== "ready") blockers.push("accepted_target_binding_required_for_significant_work");
779
- return result("verify", "read_only", blockers.length ? "blocked" : "success", {
780
- repository_id: state.repository_id,
781
- enabled: state.enabled,
782
- manifest_status: state.manifest_status,
783
- technology_freshness: state.technology_freshness,
784
- technology_digest: state.technology_digest,
785
- target_binding: state.target_binding,
786
- continuity: continuityResult.continuity,
787
- blockers: [...new Set(blockers)].sort(),
788
- next_action: blockers.length ? "repair the listed Project Technology blockers" : "none",
789
- });
790
- }
791
-
792
- function execute(operation, repoArg, options = {}) {
793
- if (operation === "artifact") return artifacts.executeArtifact(repoArg, options);
794
- if (operation === "course") return technologyCourse.executeCourse(repoArg, options);
795
- const readOnly = { explain, status, plan, verify, context };
796
- if (readOnly[operation]) return readOnly[operation](repoArg, options);
797
- const transactional = { enable, sync, connect, disconnect, provide, disable, repair };
798
- if (!transactional[operation]) return result(operation, "read_only", "fail", { blockers: ["unsupported_project_technology_operation"] });
799
- if (!options.apply) return preview(operation, repoArg, options);
800
- return transactional[operation](repoArg, options);
801
- }
802
-
803
- module.exports = {
804
- CONTRACT_VERSION,
805
- EXTENSION_KEY,
806
- LOCAL_DIR,
807
- bindingValues,
808
- canonicalBytes,
809
- compareArtifactReleases: artifacts.compareArtifactReleases,
810
- connect,
811
- compileContext: traversal.compileContext,
812
- compileTechnologyCourse: technologyCourse.compileTechnologyCourse,
813
- context,
814
- createArtifactRelease: artifacts.createArtifactRelease,
815
- discoverContext: traversal.discoverContext,
816
- disable,
817
- disconnect,
818
- enable,
819
- execute,
820
- expandContext: traversal.expandContext,
821
- explain,
822
- extensionContract,
823
- inventory,
824
- inspectArtifactBundle: artifacts.inspectArtifactBundle,
825
- normalizeExecutionContract,
826
- normalizeTechnology: technologyCourse.normalizeTechnology,
827
- continuity,
828
- plan,
829
- provide,
830
- readExport,
831
- reconcileTechnologyCourse: technologyCourse.reconcileTechnologyCourse,
832
- repair,
833
- sha256,
834
- status,
835
- sync,
836
- targetBindingStatus,
837
- verify,
838
- verifyArtifactRelease: artifacts.verifyArtifactRelease,
839
- verifyTechnologyCourse: technologyCourse.verifyTechnologyCourse,
840
- verifyContext: traversal.verifyContext,
841
- };