agentera 3.0.0-dev.8 → 3.0.0-dev.80

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 (724) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +252 -22
  3. package/bundle/.agentera-build-source.json +8 -0
  4. package/bundle/CHANGELOG.md +1387 -0
  5. package/bundle/DESIGN.md +229 -0
  6. package/bundle/LICENSE +201 -0
  7. package/bundle/README.md +143 -0
  8. package/bundle/UPGRADE.md +271 -0
  9. package/bundle/extract-corpus-parity.json +2 -4
  10. package/bundle/fixtures/routing/hybrid-corpus.yaml +154 -0
  11. package/bundle/references/adapters/package-publication.json +484 -0
  12. package/bundle/references/adapters/package-registry.yaml +443 -188
  13. package/bundle/references/adapters/package-surface-characterization.md +68 -34
  14. package/bundle/references/adapters/product-v1-reset.yaml +101 -0
  15. package/bundle/references/adapters/runtime-lifecycle-adapters.yaml +74 -0
  16. package/bundle/references/adapters/runtime-lifecycle-authority.yaml +62 -0
  17. package/bundle/references/adapters/runtime-lifecycle-operation-contract.yaml +84 -0
  18. package/bundle/references/adapters/runtime-retired-resources.yaml +333 -0
  19. package/bundle/references/analysis/evidence-tier-authority.yaml +559 -0
  20. package/bundle/references/analysis/personal-glossary-evaluation-authority.yaml +175 -0
  21. package/bundle/references/analysis/personal-glossary-evaluation-corpus.yaml +291 -0
  22. package/bundle/references/analysis/personal-glossary-holdout.yaml +192 -0
  23. package/bundle/references/analysis/verification-policy.yaml +261 -0
  24. package/bundle/references/artifacts/artifact-registry-interface-model.yaml +17 -8
  25. package/bundle/references/artifacts/glossary-entry-contract.yaml +2906 -0
  26. package/bundle/references/artifacts/state-storage-authority.yaml +3065 -0
  27. package/bundle/references/artifacts/verbosity-budget-authority.yaml +42 -0
  28. package/bundle/references/cli/app-lifecycle-vocabulary.yaml +3 -4
  29. package/bundle/references/cli/capability-instruction-contract.yaml +11 -14
  30. package/bundle/references/cli/hybrid-route-contract.yaml +438 -0
  31. package/bundle/references/cli/routing-model.md +152 -93
  32. package/bundle/references/cli/trigger-schema-enrichment.md +57 -46
  33. package/bundle/references/cli/update-channels.yaml +7 -5
  34. package/bundle/references/cli/vocabulary-index.yaml +7 -9
  35. package/bundle/references/cli/vocabulary.md +54 -97
  36. package/bundle/references/meta/retained-reference-authority.yaml +171 -0
  37. package/bundle/skills/agentera/SKILL.md +183 -63
  38. package/bundle/skills/agentera/capabilities/audit/schemas/artifacts.yaml +27 -19
  39. package/bundle/skills/agentera/capabilities/audit/schemas/exit.yaml +2 -2
  40. package/bundle/skills/agentera/capabilities/audit/schemas/triggers.yaml +13 -35
  41. package/bundle/skills/agentera/capabilities/audit/schemas/validation.yaml +30 -11
  42. package/bundle/skills/agentera/capabilities/build/schemas/artifacts.yaml +44 -21
  43. package/bundle/skills/agentera/capabilities/build/schemas/exit.yaml +8 -6
  44. package/bundle/skills/agentera/capabilities/build/schemas/triggers.yaml +14 -36
  45. package/bundle/skills/agentera/capabilities/build/schemas/validation.yaml +95 -21
  46. package/bundle/skills/agentera/capabilities/design/schemas/artifacts.yaml +6 -6
  47. package/bundle/skills/agentera/capabilities/design/schemas/exit.yaml +5 -5
  48. package/bundle/skills/agentera/capabilities/design/schemas/triggers.yaml +5 -34
  49. package/bundle/skills/agentera/capabilities/design/schemas/validation.yaml +2 -2
  50. package/bundle/skills/agentera/capabilities/discuss/schemas/artifacts.yaml +17 -13
  51. package/bundle/skills/agentera/capabilities/discuss/schemas/exit.yaml +2 -2
  52. package/bundle/skills/agentera/capabilities/discuss/schemas/triggers.yaml +6 -40
  53. package/bundle/skills/agentera/capabilities/discuss/schemas/validation.yaml +72 -5
  54. package/bundle/skills/agentera/capabilities/document/schemas/artifacts.yaml +24 -17
  55. package/bundle/skills/agentera/capabilities/document/schemas/triggers.yaml +5 -35
  56. package/bundle/skills/agentera/capabilities/document/schemas/validation.yaml +13 -13
  57. package/bundle/skills/agentera/capabilities/optimize/schemas/artifacts.yaml +10 -10
  58. package/bundle/skills/agentera/capabilities/optimize/schemas/exit.yaml +2 -2
  59. package/bundle/skills/agentera/capabilities/optimize/schemas/triggers.yaml +4 -35
  60. package/bundle/skills/agentera/capabilities/optimize/schemas/validation.yaml +3 -3
  61. package/bundle/skills/agentera/capabilities/orchestrate/schemas/artifacts.yaml +34 -22
  62. package/bundle/skills/agentera/capabilities/orchestrate/schemas/exit.yaml +9 -7
  63. package/bundle/skills/agentera/capabilities/orchestrate/schemas/triggers.yaml +5 -37
  64. package/bundle/skills/agentera/capabilities/orchestrate/schemas/validation.yaml +38 -37
  65. package/bundle/skills/agentera/capabilities/plan/schemas/artifacts.yaml +20 -16
  66. package/bundle/skills/agentera/capabilities/plan/schemas/triggers.yaml +8 -31
  67. package/bundle/skills/agentera/capabilities/plan/schemas/validation.yaml +66 -6
  68. package/bundle/skills/agentera/capabilities/profile/schemas/artifacts.yaml +13 -4
  69. package/bundle/skills/agentera/capabilities/profile/schemas/exit.yaml +8 -5
  70. package/bundle/skills/agentera/capabilities/profile/schemas/triggers.yaml +8 -37
  71. package/bundle/skills/agentera/capabilities/profile/schemas/validation.yaml +67 -3
  72. package/bundle/skills/agentera/capabilities/research/schemas/artifacts.yaml +6 -6
  73. package/bundle/skills/agentera/capabilities/research/schemas/triggers.yaml +5 -29
  74. package/bundle/skills/agentera/capabilities/status/schemas/artifacts.yaml +13 -12
  75. package/bundle/skills/agentera/capabilities/status/schemas/triggers.yaml +7 -49
  76. package/bundle/skills/agentera/capabilities/vision/schemas/artifacts.yaml +8 -8
  77. package/bundle/skills/agentera/capabilities/vision/schemas/exit.yaml +7 -6
  78. package/bundle/skills/agentera/capabilities/vision/schemas/triggers.yaml +7 -39
  79. package/bundle/skills/agentera/capabilities/vision/schemas/validation.yaml +14 -16
  80. package/bundle/skills/agentera/capability_schema_contract.yaml +32 -32
  81. package/bundle/skills/agentera/protocol.yaml +4 -4
  82. package/bundle/skills/agentera/route-phrases.yaml +81 -0
  83. package/bundle/skills/agentera/schemas/artifacts/changelog.yaml +1 -0
  84. package/bundle/skills/agentera/schemas/artifacts/decisions.yaml +29 -30
  85. package/bundle/skills/agentera/schemas/artifacts/design.yaml +1 -0
  86. package/bundle/skills/agentera/schemas/artifacts/docs.yaml +7 -43
  87. package/bundle/skills/agentera/schemas/artifacts/experiments.yaml +140 -34
  88. package/bundle/skills/agentera/schemas/artifacts/glossary.yaml +87 -0
  89. package/bundle/skills/agentera/schemas/artifacts/health.yaml +53 -51
  90. package/bundle/skills/agentera/schemas/artifacts/objective.yaml +18 -35
  91. package/bundle/skills/agentera/schemas/artifacts/plan.yaml +453 -55
  92. package/bundle/skills/agentera/schemas/artifacts/progress.yaml +128 -39
  93. package/bundle/skills/agentera/schemas/artifacts/todo.yaml +305 -7
  94. package/bundle/skills/agentera/schemas/artifacts/vision.yaml +0 -19
  95. package/dist/.agentera-build-source.json +8 -0
  96. package/dist/analytics/extractCorpus/cli.js +52 -11
  97. package/dist/analytics/extractCorpus/copilotSessions.js +19 -8
  98. package/dist/analytics/extractCorpus/core.js +262 -14
  99. package/dist/analytics/extractCorpus/corpus.js +57 -18
  100. package/dist/analytics/extractCorpus/coverageAudit.js +44 -45
  101. package/dist/analytics/extractCorpus/cursorSessions.js +28 -8
  102. package/dist/analytics/extractCorpus/evidenceTiers.js +709 -0
  103. package/dist/analytics/extractCorpus/extractCorpusParity.js +4 -4
  104. package/dist/analytics/extractCorpus/filesystemSources.js +5 -5
  105. package/dist/analytics/extractCorpus/index.js +4 -2
  106. package/dist/analytics/extractCorpus/jsonlSessions.js +76 -8
  107. package/dist/analytics/extractCorpus/sqliteCaps.js +0 -1
  108. package/dist/analytics/extractCorpus/sqliteSessions.js +12 -4
  109. package/dist/analytics/extractCorpus/tierReader.js +108 -0
  110. package/dist/analytics/extractCorpus.js +0 -1
  111. package/dist/analytics/glossaryAdviceResolution.js +166 -0
  112. package/dist/analytics/glossaryInputAcquisition.js +319 -0
  113. package/dist/analytics/personalGlossaryAdmission.js +113 -0
  114. package/dist/analytics/personalGlossaryCandidateProjection.js +788 -0
  115. package/dist/analytics/personalGlossaryCandidateProjectionExcerpts.js +144 -0
  116. package/dist/analytics/personalGlossaryCandidateProjectionModel.js +1 -0
  117. package/dist/analytics/personalGlossaryCandidateReadView.js +23 -0
  118. package/dist/analytics/personalGlossaryCurrentGeneration.js +25 -0
  119. package/dist/analytics/personalGlossaryDecision.js +203 -0
  120. package/dist/analytics/personalGlossaryExplicit.js +788 -0
  121. package/dist/analytics/personalGlossaryExplicitMining.js +285 -0
  122. package/dist/analytics/personalGlossaryExplicitScope.js +41 -0
  123. package/dist/analytics/personalGlossaryExplicitSegments.js +418 -0
  124. package/dist/analytics/personalGlossaryExplicitTypes.js +26 -0
  125. package/dist/analytics/personalGlossaryLexicalClassifier.js +175 -0
  126. package/dist/analytics/personalGlossaryProfile.js +229 -0
  127. package/dist/analytics/personalGlossaryRecurrence.js +618 -0
  128. package/dist/analytics/personalGlossaryRefreshProjection.js +351 -0
  129. package/dist/analytics/personalGlossaryReviewRecordStorage.js +428 -0
  130. package/dist/analytics/personalGlossaryReviewRecords.js +332 -0
  131. package/dist/analytics/profileSignals.js +211 -0
  132. package/dist/analytics/usageStats.js +150 -23
  133. package/dist/audit/terminologyDrift.js +281 -0
  134. package/dist/bin/agentera.js +3 -2
  135. package/dist/capabilities/audit/instructions.js +16 -6
  136. package/dist/capabilities/build/instructions.js +59 -6
  137. package/dist/capabilities/design/instructions.js +3 -4
  138. package/dist/capabilities/discuss/instructions.js +29 -6
  139. package/dist/capabilities/document/instructions.js +11 -6
  140. package/dist/capabilities/index.js +20 -14
  141. package/dist/capabilities/optimize/instructions.js +14 -6
  142. package/dist/capabilities/orchestrate/instructions.js +42 -6
  143. package/dist/capabilities/plan/instructions.js +30 -3
  144. package/dist/capabilities/profile/instructions.js +104 -5
  145. package/dist/capabilities/research/instructions.js +4 -5
  146. package/dist/capabilities/status/instructions.js +15 -6
  147. package/dist/capabilities/status/startupInstructions.js +34 -0
  148. package/dist/capabilities/vision/instructions.js +3 -5
  149. package/dist/cli/appContext.js +14 -7
  150. package/dist/cli/argvalidate.js +0 -1
  151. package/dist/cli/capabilityContext/benchmark.js +5 -4
  152. package/dist/cli/capabilityContext/bespoke.js +14 -6
  153. package/dist/cli/capabilityContext/build.js +116 -42
  154. package/dist/cli/capabilityContext/closeout.js +30 -27
  155. package/dist/cli/capabilityContext/contract.js +18 -27
  156. package/dist/cli/capabilityContext/evidence.js +84 -77
  157. package/dist/cli/capabilityContext/index.js +0 -1
  158. package/dist/cli/capabilityContext/orchestration.js +42 -18
  159. package/dist/cli/capabilityContext/planState.js +89 -96
  160. package/dist/cli/capabilityContext/progress.js +52 -12
  161. package/dist/cli/capabilityContext/projectVerification.js +409 -0
  162. package/dist/cli/capabilityContext/shared.js +9 -20
  163. package/dist/cli/capabilityContext/slim.js +52 -8
  164. package/dist/cli/capabilityContext/startup.js +51 -114
  165. package/dist/cli/capabilityContext/startupAggregation.js +68 -0
  166. package/dist/cli/capabilityContext/types.js +26 -10
  167. package/dist/cli/capabilityContext.js +0 -1
  168. package/dist/cli/commands/appHome.js +0 -1
  169. package/dist/cli/commands/capability.js +2 -2
  170. package/dist/cli/commands/compact.js +163 -13
  171. package/dist/cli/commands/doctor.js +118 -11
  172. package/dist/cli/commands/durability.js +81 -0
  173. package/dist/cli/commands/glossaryAdvice.js +138 -0
  174. package/dist/cli/commands/lint.js +22 -8
  175. package/dist/cli/commands/personalGlossaryCandidateReads.js +755 -0
  176. package/dist/cli/commands/personalGlossaryDecision.js +349 -0
  177. package/dist/cli/commands/personalGlossaryPublish.js +484 -0
  178. package/dist/cli/commands/personalGlossaryReviewRecordReads.js +209 -0
  179. package/dist/cli/commands/personalGlossaryReviewRecords.js +623 -0
  180. package/dist/cli/commands/prime/briefOrientation.js +845 -0
  181. package/dist/cli/commands/prime/buildExecutionRequest.js +165 -0
  182. package/dist/cli/commands/prime/bundleStatus.js +54 -4
  183. package/dist/cli/commands/prime/collectEntityOrientation.js +338 -0
  184. package/dist/cli/commands/prime/collectOrientationState.js +124 -68
  185. package/dist/cli/commands/prime/orientationOutput.js +271 -59
  186. package/dist/cli/commands/prime/types.js +0 -1
  187. package/dist/cli/commands/prime.js +89 -11
  188. package/dist/cli/commands/profileGrounding.js +55 -0
  189. package/dist/cli/commands/query.js +74 -52
  190. package/dist/cli/commands/report.js +187 -27
  191. package/dist/cli/commands/route.js +142 -0
  192. package/dist/cli/commands/schema.js +436 -138
  193. package/dist/cli/commands/state/decisions.js +40 -56
  194. package/dist/cli/commands/state/docs.js +58 -85
  195. package/dist/cli/commands/state/experimentRecords.js +151 -0
  196. package/dist/cli/commands/state/experiments.js +11 -65
  197. package/dist/cli/commands/state/get.js +129 -0
  198. package/dist/cli/commands/state/health.js +11 -113
  199. package/dist/cli/commands/state/index.js +6 -41
  200. package/dist/cli/commands/state/list.js +194 -0
  201. package/dist/cli/commands/state/objective.js +21 -65
  202. package/dist/cli/commands/state/plan.js +11 -170
  203. package/dist/cli/commands/state/planTasks.js +154 -0
  204. package/dist/cli/commands/state/plans.js +154 -0
  205. package/dist/cli/commands/state/progress.js +11 -45
  206. package/dist/cli/commands/state/shared.js +0 -1
  207. package/dist/cli/commands/state/todo.js +28 -107
  208. package/dist/cli/commands/state/write.js +459 -0
  209. package/dist/cli/commands/upgrade.js +176 -5
  210. package/dist/cli/commands/upgradeVerify.js +118 -0
  211. package/dist/cli/commands/validate.js +235 -136
  212. package/dist/cli/commands/verify.js +73 -16
  213. package/dist/cli/contracts/bundleStatus.js +0 -1
  214. package/dist/cli/contracts/orientationState.js +0 -1
  215. package/dist/cli/dispatch/argvParser.js +0 -1
  216. package/dist/cli/dispatch/check.js +84 -40
  217. package/dist/cli/dispatch/commands.js +3 -3
  218. package/dist/cli/dispatch/index.js +84 -52
  219. package/dist/cli/dispatch/lifecycle.js +182 -62
  220. package/dist/cli/dispatch/prime.js +37 -2
  221. package/dist/cli/dispatch/projections.js +17 -0
  222. package/dist/cli/dispatch/shared.js +1 -2
  223. package/dist/cli/dispatch/state.js +62 -66
  224. package/dist/cli/dispatch.js +0 -1
  225. package/dist/cli/errors.js +16 -17
  226. package/dist/cli/help.js +419 -41
  227. package/dist/cli/migrationRequired.js +125 -0
  228. package/dist/cli/orientation/attention.js +19 -22
  229. package/dist/cli/orientation/corpusCoverage.js +32 -1
  230. package/dist/cli/orientation.js +346 -129
  231. package/dist/cli/planArtifacts.js +350 -0
  232. package/dist/cli/planEvidence.js +157 -0
  233. package/dist/cli/planLifecycleState.js +36 -0
  234. package/dist/cli/planTaskIndex.js +11 -0
  235. package/dist/cli/preCutoverCommand.js +32 -0
  236. package/dist/cli/prime-blob.js +71 -3
  237. package/dist/cli/productV1Eol.js +55 -0
  238. package/dist/cli/profileAcquisition.js +167 -0
  239. package/dist/cli/startupCompletenessContract.js +11 -9
  240. package/dist/cli/stateQuery.js +47 -12
  241. package/dist/cli/structured.js +0 -1
  242. package/dist/cli/todoMarkdown.js +25 -12
  243. package/dist/cli/todoReadinessSelection.js +192 -0
  244. package/dist/cli/todoSeverity.js +0 -1
  245. package/dist/core/atomicWriter.js +23 -0
  246. package/dist/core/developmentChannel.js +1 -0
  247. package/dist/core/developmentInvocation.js +377 -0
  248. package/dist/core/difflib.js +0 -1
  249. package/dist/core/envPaths.js +0 -1
  250. package/dist/core/jsonValue.js +0 -1
  251. package/dist/core/paths.js +0 -1
  252. package/dist/core/pyjson.js +0 -1
  253. package/dist/core/shell.js +4 -0
  254. package/dist/core/skillIdentity.js +23 -0
  255. package/dist/core/sourceRoot.js +9 -12
  256. package/dist/core/text.js +10 -0
  257. package/dist/core/toml.js +0 -1
  258. package/dist/core/yaml.js +61 -2
  259. package/dist/eval/evalSkills.js +13 -14
  260. package/dist/eval/glossaryEvaluation.js +751 -0
  261. package/dist/eval/glossaryEvaluationProcess.js +29 -0
  262. package/dist/eval/glossaryEvaluationRunner.js +571 -0
  263. package/dist/eval/glossaryEvaluationSuccessReport.js +297 -0
  264. package/dist/eval/hybridRouteEvaluation.js +155 -0
  265. package/dist/eval/semanticEval.js +0 -1
  266. package/dist/eval/semanticFixtures.js +0 -1
  267. package/dist/hooks/common.js +3 -56
  268. package/dist/hooks/compaction/apply.js +224 -47
  269. package/dist/hooks/compaction/dryRun.js +2 -1
  270. package/dist/hooks/compaction/index.js +5 -6
  271. package/dist/hooks/compaction/parse.js +73 -6
  272. package/dist/hooks/compaction/retention.js +28 -25
  273. package/dist/hooks/compaction/status.js +145 -26
  274. package/dist/hooks/compaction/types.js +0 -1
  275. package/dist/hooks/validateArtifact/agentFacing.js +0 -1
  276. package/dist/hooks/validateArtifact/index.js +6 -65
  277. package/dist/hooks/validateArtifact/markdown.js +9 -10
  278. package/dist/hooks/validateArtifact/schema.js +96 -9
  279. package/dist/hooks/validateArtifact/traversal.js +12 -11
  280. package/dist/hooks/validateArtifact/violations.js +5 -3
  281. package/dist/migrate/v2HandoffManifest.js +8 -3
  282. package/dist/registries/activationContract.js +2 -0
  283. package/dist/registries/activationTuples.js +145 -0
  284. package/dist/registries/artifactProtocolIds.js +2 -1
  285. package/dist/registries/artifactRegistry.js +207 -60
  286. package/dist/registries/artifactSchemaProjection.js +45 -0
  287. package/dist/registries/capabilityContract.js +5 -21
  288. package/dist/registries/evaluatorHandoffContract.js +0 -1
  289. package/dist/registries/evidenceTierContract.js +375 -0
  290. package/dist/registries/explicitSegmentGrammarContract.js +619 -0
  291. package/dist/registries/glossaryAdviceContract.js +79 -0
  292. package/dist/registries/glossaryCandidateContractPaths.js +6 -0
  293. package/dist/registries/glossaryCandidateContracts.js +820 -0
  294. package/dist/registries/glossaryCandidateDecisionAuthority.js +119 -0
  295. package/dist/registries/glossaryCandidateDecisionContract.js +62 -0
  296. package/dist/registries/glossaryCandidateProjectionAuthority.js +345 -0
  297. package/dist/registries/glossaryCandidateProjectionContract.js +108 -0
  298. package/dist/registries/glossaryCaveatContract.js +67 -0
  299. package/dist/registries/glossaryConsumerContractValidation.js +787 -0
  300. package/dist/registries/glossaryEntryContract.js +759 -0
  301. package/dist/registries/glossaryEntryTemporal.js +12 -0
  302. package/dist/registries/glossaryMiningAuthority.js +764 -0
  303. package/dist/registries/glossaryProfileFullContract.js +24 -0
  304. package/dist/registries/glossaryReviewRecordsAuthority.js +426 -0
  305. package/dist/registries/glossaryReviewRecordsContract.js +129 -0
  306. package/dist/registries/glossaryTermIdentity.js +139 -0
  307. package/dist/registries/glossaryTermOccurrence.js +20 -0
  308. package/dist/registries/hybridRoute.js +274 -0
  309. package/dist/registries/hybridRouteReceipt.js +221 -0
  310. package/dist/registries/packagePublication.js +273 -0
  311. package/dist/registries/packageRegistry.js +184 -209
  312. package/dist/registries/personalGlossaryContracts.js +1 -0
  313. package/dist/registries/todoReadinessContract.js +448 -0
  314. package/dist/registries/triggerLoader.js +7 -44
  315. package/dist/registries/verbosityBudgetContract.js +205 -0
  316. package/dist/release/releaseMetadata.js +168 -11
  317. package/dist/runtime/lifecycleAdapterContract.js +457 -0
  318. package/dist/runtime/lifecycleAdapters.js +777 -0
  319. package/dist/runtime/lifecycleAuthority.js +453 -0
  320. package/dist/runtime/lifecycleOperationContract.js +123 -0
  321. package/dist/runtime/lifecycleOperations.js +634 -0
  322. package/dist/runtime/lifecycleOwnershipJournal.js +622 -0
  323. package/dist/runtime/lifecyclePublication.js +415 -0
  324. package/dist/runtime/lifecycleSnapshot.js +438 -0
  325. package/dist/runtime/nativeResourceCleanup.js +503 -0
  326. package/dist/setup/opencode.js +20 -13
  327. package/dist/setup/opencodeConstants.js +1 -0
  328. package/dist/setup/sharedSkill.js +45 -0
  329. package/dist/setup/smokeChecks.js +14 -75
  330. package/dist/state/archiveDiscovery.js +580 -0
  331. package/dist/state/archivePublication.js +225 -0
  332. package/dist/state/archiveRecovery.js +237 -0
  333. package/dist/state/archiveReplay.js +53 -0
  334. package/dist/state/canonicalMigrationRecord.js +36 -0
  335. package/dist/state/changelog.js +221 -0
  336. package/dist/state/decisionEntities.js +367 -0
  337. package/dist/state/decisionLegacyValidation.js +215 -0
  338. package/dist/state/decisionMigrationProvenance.js +199 -0
  339. package/dist/state/decisionOverlay.js +254 -0
  340. package/dist/state/decisionRevision.js +256 -0
  341. package/dist/state/decisionRevisionMigration.js +89 -0
  342. package/dist/state/directRetrieval.js +323 -0
  343. package/dist/state/durability.js +324 -0
  344. package/dist/state/entityCutover.js +459 -0
  345. package/dist/state/entityCutoverGit.js +127 -0
  346. package/dist/state/entityGlossaryAuthority.js +13 -0
  347. package/dist/state/entityListProjection.js +187 -0
  348. package/dist/state/entityListRuntimeRegistry.js +85 -0
  349. package/dist/state/entityMigrationCausality.js +97 -0
  350. package/dist/state/entityMigrationIdentity.js +5 -0
  351. package/dist/state/entityMigrationPreview.js +840 -0
  352. package/dist/state/entityMigrationTodo.js +133 -0
  353. package/dist/state/entityPublicationContext.js +859 -0
  354. package/dist/state/entityRetrievalHelp.js +506 -0
  355. package/dist/state/entityStorage.js +899 -0
  356. package/dist/state/exactReplacementRecovery.js +18 -0
  357. package/dist/state/experimentArchive.js +63 -0
  358. package/dist/state/experimentIdentity.js +202 -0
  359. package/dist/state/healthEntities.js +262 -0
  360. package/dist/state/healthEntityValidation.js +18 -0
  361. package/dist/state/healthRepair.js +69 -0
  362. package/dist/state/installRoot.js +15 -7
  363. package/dist/state/legacyEntityCutoverEvidence.js +65 -0
  364. package/dist/state/legacyIdentity.js +47 -0
  365. package/dist/state/legacySummaryRecord.js +6 -0
  366. package/dist/state/listAccounting.js +54 -0
  367. package/dist/state/listClassification.js +17 -0
  368. package/dist/state/listCursor.js +42 -0
  369. package/dist/state/listRetrieval.js +781 -0
  370. package/dist/state/migrationSourceBinding.js +30 -0
  371. package/dist/state/objectiveExperimentEntities.js +322 -0
  372. package/dist/state/planEntities.js +1027 -0
  373. package/dist/state/planIdentity.js +47 -0
  374. package/dist/state/planLineageValidation.js +52 -0
  375. package/dist/state/planReplacementTransaction.js +475 -0
  376. package/dist/state/planRetrieval.js +313 -0
  377. package/dist/state/planTaskRetrieval.js +294 -0
  378. package/dist/state/progressEntities.js +512 -0
  379. package/dist/state/progressGlossaryCaveat.js +168 -0
  380. package/dist/state/progressPublicationOrder.js +19 -0
  381. package/dist/state/progressWritePolicy.js +33 -0
  382. package/dist/state/projectRoot.js +62 -0
  383. package/dist/state/projectionPolicy.js +190 -0
  384. package/dist/state/retrievalAuthority.js +156 -0
  385. package/dist/state/safeProjectFile.js +155 -0
  386. package/dist/state/startupAnalysis/benchmark.js +70 -9
  387. package/dist/state/startupAnalysis/contract.js +44 -10
  388. package/dist/state/startupAnalysis/helpers.js +1 -2
  389. package/dist/state/startupAnalysis/index.js +0 -1
  390. package/dist/state/startupAnalysis/metrics.js +0 -1
  391. package/dist/state/startupAnalysis/records.js +0 -1
  392. package/dist/state/startupAnalysis/report.js +0 -1
  393. package/dist/state/startupAnalysis/threshold.js +13 -1
  394. package/dist/state/startupAnalysis.js +0 -1
  395. package/dist/state/startupProjection.js +499 -0
  396. package/dist/state/stateMode.js +222 -0
  397. package/dist/state/stateStorageAuthority.js +47 -0
  398. package/dist/state/summaryEntityRead.js +25 -0
  399. package/dist/state/summaryMigrationProvenance.js +66 -0
  400. package/dist/state/summarySourceRowAuthority.js +36 -0
  401. package/dist/state/todoActivationSafety.js +58 -0
  402. package/dist/state/todoCreateBatch.js +69 -0
  403. package/dist/state/todoDocsEntities.js +1339 -0
  404. package/dist/state/todoDocsEntityValidation.js +158 -0
  405. package/dist/state/todoMarkdownProjection.js +63 -0
  406. package/dist/state/todoReconciliationActivation.js +182 -0
  407. package/dist/state/todoReconciliationInspection.js +184 -0
  408. package/dist/state/todoReconciliationRepair.js +320 -0
  409. package/dist/state/todoReconciliationTransaction.js +628 -0
  410. package/dist/state/todoSeverityHeadings.js +71 -0
  411. package/dist/state/todoTransitionBatch.js +65 -0
  412. package/dist/state/todoUpdateBatch.js +50 -0
  413. package/dist/state/write/assign.js +20 -0
  414. package/dist/state/write/candidateMutation.js +269 -0
  415. package/dist/state/write/errors.js +11 -0
  416. package/dist/state/write/experimentPublication.js +192 -0
  417. package/dist/state/write/explain.js +380 -0
  418. package/dist/state/write/fields.js +61 -0
  419. package/dist/state/write/glossaryPublication.js +263 -0
  420. package/dist/state/write/grammar.js +285 -0
  421. package/dist/state/write/helpers.js +29 -0
  422. package/dist/state/write/index.js +12 -0
  423. package/dist/state/write/input.js +391 -0
  424. package/dist/state/write/lock.js +837 -0
  425. package/dist/state/write/mutation.js +234 -0
  426. package/dist/state/write/operations.js +170 -0
  427. package/dist/state/write/planEvaluation.js +128 -0
  428. package/dist/state/write/planPublication.js +179 -0
  429. package/dist/state/write/runtimeOperations.js +146 -0
  430. package/dist/state/write/serialize.js +1 -0
  431. package/dist/state/write/transaction.js +57 -0
  432. package/dist/state/write/validate.js +7 -0
  433. package/dist/upgrade/appContentRefresh.js +77 -36
  434. package/dist/upgrade/appModel.js +0 -1
  435. package/dist/upgrade/atomicWriter.js +1 -0
  436. package/dist/upgrade/bundleEvidence.js +0 -1
  437. package/dist/upgrade/channels.js +6 -9
  438. package/dist/upgrade/compatibility.js +43 -17
  439. package/dist/upgrade/doctor.js +55 -32
  440. package/dist/upgrade/doctorClassifier.js +11 -1
  441. package/dist/upgrade/installedHooksRetirement.js +46 -40
  442. package/dist/upgrade/legacyAgentCleanup.js +133 -34
  443. package/dist/upgrade/lifecycleUpgrade.js +113 -0
  444. package/dist/upgrade/migrateArtifactsV2ToV3.js +325 -82
  445. package/dist/upgrade/migrationPublication.js +122 -0
  446. package/dist/upgrade/nextMajorDoctor.js +0 -22
  447. package/dist/upgrade/npxPlatformStatus.js +2 -2
  448. package/dist/upgrade/productV1Reset.js +515 -0
  449. package/dist/upgrade/productV1ResetAuthority.js +139 -0
  450. package/dist/upgrade/projectIntegration.js +126 -134
  451. package/dist/upgrade/projectIntegrationDecision.js +21 -13
  452. package/dist/upgrade/retiredResourceDiagnostics.js +117 -0
  453. package/dist/upgrade/runtimeMigration.js +210 -430
  454. package/dist/upgrade/upgradeCommands.js +14 -1
  455. package/dist/upgrade/upgradeLock.js +85 -0
  456. package/dist/upgrade/upgradeOrchestrator.js +253 -48
  457. package/dist/upgrade/v3CapabilitySurface.js +2 -3
  458. package/dist/upgrade/versionResolution.js +0 -1
  459. package/dist/validate/activationArtifactEvidence.js +866 -0
  460. package/dist/validate/activationArtifactEvidenceTypes.js +12 -0
  461. package/dist/validate/activationConjunction.js +816 -0
  462. package/dist/validate/activationEvidenceManifest.js +610 -0
  463. package/dist/validate/activationPackageSemantics.js +29 -0
  464. package/dist/validate/appHomeContract.js +1 -7
  465. package/dist/validate/bootstrapAuthority.js +44 -0
  466. package/dist/validate/capability.js +11 -3
  467. package/dist/validate/crossCapability.js +14 -9
  468. package/dist/validate/glossaryVariantGuard.js +96 -0
  469. package/dist/validate/retainedReferenceAuthority.js +879 -0
  470. package/dist/validate/selfAudit.js +39 -45
  471. package/dist/validate/vocabularyAuthority.js +8 -8
  472. package/package.json +39 -13
  473. package/bundle/references/adapters/cursor.md +0 -214
  474. package/bundle/references/adapters/opencode.md +0 -530
  475. package/bundle/references/adapters/package-manifest-interface-model.yaml +0 -337
  476. package/bundle/references/adapters/runtime-adapter-characterization.md +0 -79
  477. package/bundle/references/adapters/runtime-adapter-interface-model.yaml +0 -200
  478. package/bundle/references/adapters/runtime-adapter-registry.yaml +0 -554
  479. package/bundle/references/adapters/runtime-feature-parity.md +0 -189
  480. package/bundle/references/analysis/benchmark.md +0 -267
  481. package/bundle/references/analysis/startup-measurement-contract.yaml +0 -424
  482. package/bundle/references/cli/agent-ready-state-contract.yaml +0 -953
  483. package/bundle/references/cli/audience-namespace-cli-migration.yaml +0 -369
  484. package/bundle/references/cli/bundle-skill-vocabulary.yaml +0 -250
  485. package/bundle/references/cli/capability-tool-classification.yaml +0 -53
  486. package/bundle/references/cli/coexistence-probe.yaml +0 -13
  487. package/bundle/references/cli/parity-expected-actual-template.md +0 -30
  488. package/bundle/references/cli/routing-execution-vocabulary.yaml +0 -281
  489. package/bundle/references/cli/single-name-protocol.yaml +0 -42
  490. package/bundle/references/cli/upgrade-repair-wording.md +0 -45
  491. package/bundle/references/cli/v3-handoff-manifest.schema.yaml +0 -98
  492. package/bundle/references/meta/documentation-inventory.md +0 -49
  493. package/bundle/skills/agentera/.claude-plugin/plugin.json +0 -27
  494. package/bundle/skills/agentera/agents/audit.toml +0 -6
  495. package/bundle/skills/agentera/agents/build.toml +0 -6
  496. package/bundle/skills/agentera/agents/design.toml +0 -6
  497. package/bundle/skills/agentera/agents/discuss.toml +0 -6
  498. package/bundle/skills/agentera/agents/document.toml +0 -6
  499. package/bundle/skills/agentera/agents/optimize.toml +0 -6
  500. package/bundle/skills/agentera/agents/orchestrate.toml +0 -6
  501. package/bundle/skills/agentera/agents/plan.toml +0 -6
  502. package/bundle/skills/agentera/agents/profile.toml +0 -6
  503. package/bundle/skills/agentera/agents/research.toml +0 -6
  504. package/bundle/skills/agentera/agents/status.toml +0 -6
  505. package/bundle/skills/agentera/agents/vision.toml +0 -6
  506. package/bundle/skills/agentera/references/contract.md +0 -1048
  507. package/dist/analytics/extractCorpus/cli.js.map +0 -1
  508. package/dist/analytics/extractCorpus/copilotSessions.js.map +0 -1
  509. package/dist/analytics/extractCorpus/core.js.map +0 -1
  510. package/dist/analytics/extractCorpus/corpus.js.map +0 -1
  511. package/dist/analytics/extractCorpus/coverageAudit.js.map +0 -1
  512. package/dist/analytics/extractCorpus/cursorSessions.js.map +0 -1
  513. package/dist/analytics/extractCorpus/extractCorpusParity.js.map +0 -1
  514. package/dist/analytics/extractCorpus/filesystemSources.js.map +0 -1
  515. package/dist/analytics/extractCorpus/index.js.map +0 -1
  516. package/dist/analytics/extractCorpus/jsonlSessions.js.map +0 -1
  517. package/dist/analytics/extractCorpus/sqliteCaps.js.map +0 -1
  518. package/dist/analytics/extractCorpus/sqliteSessions.js.map +0 -1
  519. package/dist/analytics/extractCorpus.js.map +0 -1
  520. package/dist/analytics/usageStats.js.map +0 -1
  521. package/dist/bin/agentera.js.map +0 -1
  522. package/dist/capabilities/audit/instructions.js.map +0 -1
  523. package/dist/capabilities/build/instructions.js.map +0 -1
  524. package/dist/capabilities/design/instructions.js.map +0 -1
  525. package/dist/capabilities/discuss/instructions.js.map +0 -1
  526. package/dist/capabilities/document/instructions.js.map +0 -1
  527. package/dist/capabilities/index.js.map +0 -1
  528. package/dist/capabilities/optimize/instructions.js.map +0 -1
  529. package/dist/capabilities/orchestrate/instructions.js.map +0 -1
  530. package/dist/capabilities/plan/instructions.js.map +0 -1
  531. package/dist/capabilities/profile/instructions.js.map +0 -1
  532. package/dist/capabilities/research/instructions.js.map +0 -1
  533. package/dist/capabilities/status/instructions.js.map +0 -1
  534. package/dist/capabilities/vision/instructions.js.map +0 -1
  535. package/dist/cli/appContext.js.map +0 -1
  536. package/dist/cli/argvalidate.js.map +0 -1
  537. package/dist/cli/capabilityContext/benchmark.js.map +0 -1
  538. package/dist/cli/capabilityContext/bespoke.js.map +0 -1
  539. package/dist/cli/capabilityContext/build.js.map +0 -1
  540. package/dist/cli/capabilityContext/closeout.js.map +0 -1
  541. package/dist/cli/capabilityContext/contract.js.map +0 -1
  542. package/dist/cli/capabilityContext/evidence.js.map +0 -1
  543. package/dist/cli/capabilityContext/index.js.map +0 -1
  544. package/dist/cli/capabilityContext/orchestration.js.map +0 -1
  545. package/dist/cli/capabilityContext/planState.js.map +0 -1
  546. package/dist/cli/capabilityContext/progress.js.map +0 -1
  547. package/dist/cli/capabilityContext/shared.js.map +0 -1
  548. package/dist/cli/capabilityContext/slim.js.map +0 -1
  549. package/dist/cli/capabilityContext/startup.js.map +0 -1
  550. package/dist/cli/capabilityContext/types.js.map +0 -1
  551. package/dist/cli/capabilityContext.js.map +0 -1
  552. package/dist/cli/commands/appHome.js.map +0 -1
  553. package/dist/cli/commands/capability.js.map +0 -1
  554. package/dist/cli/commands/compact.js.map +0 -1
  555. package/dist/cli/commands/doctor.js.map +0 -1
  556. package/dist/cli/commands/lint.js.map +0 -1
  557. package/dist/cli/commands/prime/bundleStatus.js.map +0 -1
  558. package/dist/cli/commands/prime/collectOrientationState.js.map +0 -1
  559. package/dist/cli/commands/prime/orientationOutput.js.map +0 -1
  560. package/dist/cli/commands/prime/types.js.map +0 -1
  561. package/dist/cli/commands/prime/v1Migration.js +0 -39
  562. package/dist/cli/commands/prime/v1Migration.js.map +0 -1
  563. package/dist/cli/commands/prime.js.map +0 -1
  564. package/dist/cli/commands/query.js.map +0 -1
  565. package/dist/cli/commands/report.js.map +0 -1
  566. package/dist/cli/commands/schema.js.map +0 -1
  567. package/dist/cli/commands/state/decisions.js.map +0 -1
  568. package/dist/cli/commands/state/docs.js.map +0 -1
  569. package/dist/cli/commands/state/experiments.js.map +0 -1
  570. package/dist/cli/commands/state/health.js.map +0 -1
  571. package/dist/cli/commands/state/index.js.map +0 -1
  572. package/dist/cli/commands/state/objective.js.map +0 -1
  573. package/dist/cli/commands/state/plan.js.map +0 -1
  574. package/dist/cli/commands/state/progress.js.map +0 -1
  575. package/dist/cli/commands/state/shared.js.map +0 -1
  576. package/dist/cli/commands/state/todo.js.map +0 -1
  577. package/dist/cli/commands/upgrade.js.map +0 -1
  578. package/dist/cli/commands/validate.js.map +0 -1
  579. package/dist/cli/commands/verify.js.map +0 -1
  580. package/dist/cli/contracts/bundleStatus.js.map +0 -1
  581. package/dist/cli/contracts/orientationState.js.map +0 -1
  582. package/dist/cli/dispatch/argvParser.js.map +0 -1
  583. package/dist/cli/dispatch/check.js.map +0 -1
  584. package/dist/cli/dispatch/commands.js.map +0 -1
  585. package/dist/cli/dispatch/index.js.map +0 -1
  586. package/dist/cli/dispatch/lifecycle.js.map +0 -1
  587. package/dist/cli/dispatch/prime.js.map +0 -1
  588. package/dist/cli/dispatch/shared.js.map +0 -1
  589. package/dist/cli/dispatch/state.js.map +0 -1
  590. package/dist/cli/dispatch.js.map +0 -1
  591. package/dist/cli/errors.js.map +0 -1
  592. package/dist/cli/help.js.map +0 -1
  593. package/dist/cli/orientation/attention.js.map +0 -1
  594. package/dist/cli/orientation/corpusCoverage.js.map +0 -1
  595. package/dist/cli/orientation.js.map +0 -1
  596. package/dist/cli/prime-blob.js.map +0 -1
  597. package/dist/cli/startupCompletenessContract.js.map +0 -1
  598. package/dist/cli/stateQuery.js.map +0 -1
  599. package/dist/cli/structured.js.map +0 -1
  600. package/dist/cli/todoMarkdown.js.map +0 -1
  601. package/dist/cli/todoSeverity.js.map +0 -1
  602. package/dist/core/difflib.js.map +0 -1
  603. package/dist/core/envPaths.js.map +0 -1
  604. package/dist/core/jsonValue.js.map +0 -1
  605. package/dist/core/paths.js.map +0 -1
  606. package/dist/core/pyjson.js.map +0 -1
  607. package/dist/core/sourceRoot.js.map +0 -1
  608. package/dist/core/toml.js.map +0 -1
  609. package/dist/core/yaml.js.map +0 -1
  610. package/dist/eval/evalSkills.js.map +0 -1
  611. package/dist/eval/semanticEval.js.map +0 -1
  612. package/dist/eval/semanticFixtures.js.map +0 -1
  613. package/dist/hooks/common.js.map +0 -1
  614. package/dist/hooks/compaction/apply.js.map +0 -1
  615. package/dist/hooks/compaction/dryRun.js.map +0 -1
  616. package/dist/hooks/compaction/index.js.map +0 -1
  617. package/dist/hooks/compaction/parse.js.map +0 -1
  618. package/dist/hooks/compaction/retention.js.map +0 -1
  619. package/dist/hooks/compaction/status.js.map +0 -1
  620. package/dist/hooks/compaction/types.js.map +0 -1
  621. package/dist/hooks/cursorPreToolUse.js +0 -19
  622. package/dist/hooks/cursorPreToolUse.js.map +0 -1
  623. package/dist/hooks/cursorSessionStart.js +0 -79
  624. package/dist/hooks/cursorSessionStart.js.map +0 -1
  625. package/dist/hooks/sessionStart.js +0 -216
  626. package/dist/hooks/sessionStart.js.map +0 -1
  627. package/dist/hooks/sessionStop.js +0 -206
  628. package/dist/hooks/sessionStop.js.map +0 -1
  629. package/dist/hooks/validateArtifact/agentFacing.js.map +0 -1
  630. package/dist/hooks/validateArtifact/index.js.map +0 -1
  631. package/dist/hooks/validateArtifact/markdown.js.map +0 -1
  632. package/dist/hooks/validateArtifact/runtime.js +0 -86
  633. package/dist/hooks/validateArtifact/runtime.js.map +0 -1
  634. package/dist/hooks/validateArtifact/schema.js.map +0 -1
  635. package/dist/hooks/validateArtifact/traversal.js.map +0 -1
  636. package/dist/hooks/validateArtifact/violations.js.map +0 -1
  637. package/dist/migrate/v2HandoffManifest.js.map +0 -1
  638. package/dist/registries/artifactProtocolIds.js.map +0 -1
  639. package/dist/registries/artifactRegistry.js.map +0 -1
  640. package/dist/registries/capabilityContract.js.map +0 -1
  641. package/dist/registries/evaluatorHandoffContract.js.map +0 -1
  642. package/dist/registries/packageRegistry.js.map +0 -1
  643. package/dist/registries/runtimeAdapterRegistry.js +0 -316
  644. package/dist/registries/runtimeAdapterRegistry.js.map +0 -1
  645. package/dist/registries/triggerLoader.js.map +0 -1
  646. package/dist/release/releaseMetadata.js.map +0 -1
  647. package/dist/setup/codex/agents.js +0 -96
  648. package/dist/setup/codex/agents.js.map +0 -1
  649. package/dist/setup/codex/cli.js +0 -161
  650. package/dist/setup/codex/cli.js.map +0 -1
  651. package/dist/setup/codex/configToml.js +0 -639
  652. package/dist/setup/codex/configToml.js.map +0 -1
  653. package/dist/setup/codex/constants.js +0 -29
  654. package/dist/setup/codex/constants.js.map +0 -1
  655. package/dist/setup/codex/installRoot.js +0 -64
  656. package/dist/setup/codex/installRoot.js.map +0 -1
  657. package/dist/setup/codex/state.js +0 -270
  658. package/dist/setup/codex/state.js.map +0 -1
  659. package/dist/setup/codex.js +0 -12
  660. package/dist/setup/codex.js.map +0 -1
  661. package/dist/setup/copilot.js +0 -227
  662. package/dist/setup/copilot.js.map +0 -1
  663. package/dist/setup/cursor.js +0 -129
  664. package/dist/setup/cursor.js.map +0 -1
  665. package/dist/setup/cursorSurfaces.js +0 -67
  666. package/dist/setup/cursorSurfaces.js.map +0 -1
  667. package/dist/setup/doctor/core.js +0 -300
  668. package/dist/setup/doctor/core.js.map +0 -1
  669. package/dist/setup/doctor/diagnostics.js +0 -240
  670. package/dist/setup/doctor/diagnostics.js.map +0 -1
  671. package/dist/setup/doctor/opencode.js +0 -313
  672. package/dist/setup/doctor/opencode.js.map +0 -1
  673. package/dist/setup/doctor/report.js +0 -425
  674. package/dist/setup/doctor/report.js.map +0 -1
  675. package/dist/setup/doctor.js +0 -10
  676. package/dist/setup/doctor.js.map +0 -1
  677. package/dist/setup/opencode.js.map +0 -1
  678. package/dist/setup/smokeChecks.js.map +0 -1
  679. package/dist/state/installRoot.js.map +0 -1
  680. package/dist/state/startupAnalysis/benchmark.js.map +0 -1
  681. package/dist/state/startupAnalysis/contract.js.map +0 -1
  682. package/dist/state/startupAnalysis/helpers.js.map +0 -1
  683. package/dist/state/startupAnalysis/index.js.map +0 -1
  684. package/dist/state/startupAnalysis/metrics.js.map +0 -1
  685. package/dist/state/startupAnalysis/records.js.map +0 -1
  686. package/dist/state/startupAnalysis/report.js.map +0 -1
  687. package/dist/state/startupAnalysis/threshold.js.map +0 -1
  688. package/dist/state/startupAnalysis.js.map +0 -1
  689. package/dist/upgrade/appContentRefresh.js.map +0 -1
  690. package/dist/upgrade/appModel.js.map +0 -1
  691. package/dist/upgrade/bundleEvidence.js.map +0 -1
  692. package/dist/upgrade/channels.js.map +0 -1
  693. package/dist/upgrade/coexistenceProbe.js +0 -107
  694. package/dist/upgrade/coexistenceProbe.js.map +0 -1
  695. package/dist/upgrade/compatibility.js.map +0 -1
  696. package/dist/upgrade/doctor.js.map +0 -1
  697. package/dist/upgrade/doctorClassifier.js.map +0 -1
  698. package/dist/upgrade/installedHooksRetirement.js.map +0 -1
  699. package/dist/upgrade/legacyAgentCleanup.js.map +0 -1
  700. package/dist/upgrade/migrateArtifactsV1ToV2.js +0 -570
  701. package/dist/upgrade/migrateArtifactsV1ToV2.js.map +0 -1
  702. package/dist/upgrade/migrateArtifactsV2ToV3.js.map +0 -1
  703. package/dist/upgrade/nextMajorDoctor.js.map +0 -1
  704. package/dist/upgrade/npxPlatformStatus.js.map +0 -1
  705. package/dist/upgrade/projectIntegration.js.map +0 -1
  706. package/dist/upgrade/projectIntegrationDecision.js.map +0 -1
  707. package/dist/upgrade/runtimeMigration.js.map +0 -1
  708. package/dist/upgrade/upgradeCommands.js.map +0 -1
  709. package/dist/upgrade/upgradeOrchestrator.js.map +0 -1
  710. package/dist/upgrade/v3CapabilitySurface.js.map +0 -1
  711. package/dist/upgrade/versionResolution.js.map +0 -1
  712. package/dist/validate/appHomeContract.js.map +0 -1
  713. package/dist/validate/capability.js.map +0 -1
  714. package/dist/validate/crossCapability.js.map +0 -1
  715. package/dist/validate/lifecycleAdapters/legacyPythonParity.js +0 -93
  716. package/dist/validate/lifecycleAdapters/legacyPythonParity.js.map +0 -1
  717. package/dist/validate/lifecycleAdapters/nodeFormChecks.js +0 -488
  718. package/dist/validate/lifecycleAdapters/nodeFormChecks.js.map +0 -1
  719. package/dist/validate/lifecycleAdapters/shared.js +0 -198
  720. package/dist/validate/lifecycleAdapters/shared.js.map +0 -1
  721. package/dist/validate/lifecycleAdapters.js +0 -62
  722. package/dist/validate/lifecycleAdapters.js.map +0 -1
  723. package/dist/validate/selfAudit.js.map +0 -1
  724. package/dist/validate/vocabularyAuthority.js.map +0 -1
@@ -0,0 +1,709 @@
1
+ import fs from "node:fs";
2
+ import path from "node:path";
3
+ import { pyJsonIndentSorted } from "../../core/pyjson.js";
4
+ import { writeFileAtomic } from "../../core/atomicWriter.js";
5
+ import { assessProvenance, stableId, defaultProfileDir, } from "./core.js";
6
+ import { evidenceTierBounds, loadEvidenceTierContract } from "../../registries/evidenceTierContract.js";
7
+ /**
8
+ * Bounded tier publication and direct retrieval (plan Task 2).
9
+ *
10
+ * Task 1 fixed the authoritative tier model in
11
+ * `references/analysis/evidence-tier-authority.yaml`; this module implements
12
+ * the publication writer and the direct retrieval behavior that run against it.
13
+ * It projects the contract's families and bounds from the loader rather than
14
+ * re-declaring them, and reuses the extraction adapters' record shape so no
15
+ * source family, adapter, or evidence identity is changed.
16
+ *
17
+ * It does not migrate usage/report/prime/startup-analysis consumers (plan
18
+ * Task 3) or implement profile synthesis (plan Task 4). The smallest retrieval
19
+ * API those later consumers need is exposed here.
20
+ */
21
+ export const TIER_SCHEMA_VERSION = "agentera.evidenceTiers.v1";
22
+ export const CURRENT_POINTER_VERSION = "agentera.evidenceTiers.current.v1";
23
+ export const FILESYSTEM_FAMILY = "filesystem";
24
+ const SIGNAL_SOURCE_KINDS = new Set([
25
+ "instruction_document",
26
+ "project_config_signal",
27
+ "conversation_turn",
28
+ "tool_call",
29
+ "history_prompt",
30
+ ]);
31
+ const CLASSIFIED_SIGNAL_TYPES = new Set(["decision", "question", "correction"]);
32
+ /** Default tier directory co-located with the legacy corpus path. */
33
+ export function defaultTiersDir(env = process.env, platform = process.platform) {
34
+ return path.join(defaultProfileDir(env, platform), "intermediate", "tiers");
35
+ }
36
+ /** product -> source family, projected from the contract (single source). */
37
+ function productFamilyIndex(contractPath) {
38
+ const model = loadEvidenceTierContract(contractPath);
39
+ const index = new Map();
40
+ for (const [familyId, def] of model.families) {
41
+ for (const product of def.source_product)
42
+ index.set(product, familyId);
43
+ }
44
+ return index;
45
+ }
46
+ /** Map a full record to its source family for sharding. */
47
+ export function familyOf(record, productFamily) {
48
+ const product = typeof record.source_product === "string" ? record.source_product : "";
49
+ if (product === FILESYSTEM_FAMILY)
50
+ return FILESYSTEM_FAMILY;
51
+ return productFamily.get(product) ?? "unknown";
52
+ }
53
+ function asStringField(record, key) {
54
+ const v = record[key];
55
+ return typeof v === "string" ? v : "";
56
+ }
57
+ /**
58
+ * Pure derivation of bounded signal records from full evidence. One signal
59
+ * record per full record; `signal_type` carries the classified semantic
60
+ * (decision/question/correction/instruction/configuration) or `record_identity`
61
+ * as the base citable-identity semantic. The signal's `source_id` equals its
62
+ * `evidence_anchor` so no signal invents an identity that does not resolve to a
63
+ * retained full-evidence shard.
64
+ */
65
+ export function deriveSignalRecords(fullRecords) {
66
+ const out = [];
67
+ for (const r of fullRecords) {
68
+ const sourceKind = asStringField(r, "source_kind");
69
+ if (!SIGNAL_SOURCE_KINDS.has(sourceKind))
70
+ continue;
71
+ const data = r.data && typeof r.data === "object" && !Array.isArray(r.data) ? r.data : {};
72
+ let signalType = "record_identity";
73
+ if (sourceKind === "instruction_document")
74
+ signalType = "instruction";
75
+ else if (sourceKind === "project_config_signal")
76
+ signalType = "configuration";
77
+ else if (sourceKind === "conversation_turn") {
78
+ const classified = typeof data.signal_type === "string" ? data.signal_type : "";
79
+ signalType = CLASSIFIED_SIGNAL_TYPES.has(classified) ? classified : "record_identity";
80
+ }
81
+ const sourceId = asStringField(r, "source_id");
82
+ const rec = {
83
+ source_id: sourceId,
84
+ source_kind: sourceKind,
85
+ signal_type: signalType,
86
+ timestamp: asStringField(r, "timestamp"),
87
+ project_id: asStringField(r, "project_id"),
88
+ runtime: typeof r.runtime === "string" ? r.runtime : null,
89
+ source_product: asStringField(r, "source_product"),
90
+ source_class: asStringField(r, "source_class"),
91
+ evidence_anchor: sourceId,
92
+ active_runtime: r.active_runtime === true,
93
+ };
94
+ if (typeof r.origin_id === "string")
95
+ rec.origin_id = r.origin_id;
96
+ if (typeof r.content_fingerprint === "string")
97
+ rec.content_fingerprint = r.content_fingerprint;
98
+ if (typeof r.author_class === "string")
99
+ rec.author_class = r.author_class;
100
+ if (typeof r.conversation_key === "string")
101
+ rec.conversation_key = r.conversation_key;
102
+ if (typeof r.session_id === "string")
103
+ rec.session_id = r.session_id;
104
+ out.push(rec);
105
+ }
106
+ return out;
107
+ }
108
+ /** Deterministic sort key for records and signals: (timestamp, source_id). */
109
+ function tierSortKey(a, b) {
110
+ const get = (o, key) => {
111
+ const v = o[key];
112
+ return typeof v === "string" ? v : "";
113
+ };
114
+ const at = get(a, "timestamp");
115
+ const bt = get(b, "timestamp");
116
+ const ai = get(a, "source_id");
117
+ const bi = get(b, "source_id");
118
+ if (at !== bt)
119
+ return at < bt ? -1 : 1;
120
+ if (ai !== bi)
121
+ return ai < bi ? -1 : 1;
122
+ return 0;
123
+ }
124
+ function encodeSorted(value) {
125
+ return pyJsonIndentSorted(value);
126
+ }
127
+ function byteSize(text) {
128
+ return Buffer.byteLength(text, "utf-8");
129
+ }
130
+ /**
131
+ * Split full evidence into family shards, each no larger than `shardByteCap`.
132
+ * A family whose records exceed the cap is split into numbered sub-shards; no
133
+ * record is dropped to fit a shard.
134
+ */
135
+ export function shardFullEvidence(records, shardByteCap, productFamily) {
136
+ const byFamily = new Map();
137
+ for (const r of records) {
138
+ const family = familyOf(r, productFamily);
139
+ const list = byFamily.get(family) ?? [];
140
+ list.push(r);
141
+ byFamily.set(family, list);
142
+ }
143
+ const shards = [];
144
+ for (const family of [...byFamily.keys()].sort()) {
145
+ const familyRecords = byFamily.get(family).slice().sort(tierSortKey);
146
+ let current = [];
147
+ let currentIds = [];
148
+ let currentBytes = 0;
149
+ let index = 0;
150
+ const flush = () => {
151
+ if (current.length === 0)
152
+ return;
153
+ const encoded = encodeSorted({ records: current });
154
+ shards.push({ family, index, records: current, sourceIds: currentIds, bytes: byteSize(encoded) });
155
+ current = [];
156
+ currentIds = [];
157
+ currentBytes = 0;
158
+ index++;
159
+ };
160
+ for (const r of familyRecords) {
161
+ const id = asStringField(r, "source_id");
162
+ const recordByte = byteSize(encodeSorted(r));
163
+ // If a single record exceeds the cap, it forms its own (oversized) shard
164
+ // so the rest of the tier stays loadable; the oversized shard is reported
165
+ // via the compatibility state rather than silently dropped.
166
+ if (current.length > 0 && currentBytes + recordByte > shardByteCap) {
167
+ flush();
168
+ }
169
+ current.push(r);
170
+ currentIds.push(id);
171
+ currentBytes += recordByte;
172
+ }
173
+ flush();
174
+ }
175
+ return shards;
176
+ }
177
+ /**
178
+ * Deterministic signal selection applied only when the derived tier would
179
+ * exceed `signalByteCap`. Allocates a per-family record quota proportional to
180
+ * each family's share of the total (minimum one per family), keeps the most
181
+ * recent within each family, and reassembles in the stable tier order.
182
+ */
183
+ export function selectSignalsForBound(signals, signalByteCap) {
184
+ const sorted = signals.slice().sort(tierSortKey);
185
+ const allEncoded = encodeSorted({ records: sorted });
186
+ const totalBytes = byteSize(allEncoded);
187
+ const perFamily = new Map();
188
+ for (const s of sorted) {
189
+ const list = perFamily.get(s.source_product) ?? [];
190
+ list.push(s);
191
+ perFamily.set(s.source_product, list);
192
+ }
193
+ const familyReport = [];
194
+ for (const family of [...perFamily.keys()].sort()) {
195
+ familyReport.push({ family, total: perFamily.get(family).length, retained: perFamily.get(family).length });
196
+ }
197
+ if (totalBytes <= signalByteCap) {
198
+ const selection = {
199
+ total: sorted.length,
200
+ retained: sorted.length,
201
+ capped: false,
202
+ per_family: familyReport,
203
+ };
204
+ return { records: sorted, selection };
205
+ }
206
+ // Per-record average from the encoded payload drives the record budget.
207
+ const avg = totalBytes / Math.max(sorted.length, 1);
208
+ const recordBudget = Math.max(1, Math.floor(signalByteCap / avg));
209
+ const families = [...perFamily.keys()].sort();
210
+ const totalFamilyRecords = sorted.length;
211
+ const retained = [];
212
+ const updatedFamilyReport = [];
213
+ let allocated = 0;
214
+ for (const family of families) {
215
+ const list = perFamily.get(family);
216
+ const quota = Math.max(1, Math.floor((recordBudget * list.length) / Math.max(totalFamilyRecords, 1)));
217
+ updatedFamilyReport.push({ family, total: list.length, retained: Math.min(quota, list.length) });
218
+ // Most recent first: timestamp desc, then source_id asc.
219
+ const kept = list
220
+ .slice()
221
+ .sort((a, b) => (a.timestamp !== b.timestamp ? (a.timestamp < b.timestamp ? 1 : -1) : a.source_id < b.source_id ? -1 : 1))
222
+ .slice(0, quota);
223
+ retained.push(...kept);
224
+ allocated += kept.length;
225
+ }
226
+ // If proportional allocation under-fills (rounding), top up most-recent
227
+ // across families until the budget is reached without exceeding the cap.
228
+ if (allocated < recordBudget) {
229
+ const have = new Set(retained.map((s) => s.source_id));
230
+ const pool = sorted
231
+ .filter((s) => !have.has(s.source_id))
232
+ .sort((a, b) => (a.timestamp !== b.timestamp ? (a.timestamp < b.timestamp ? 1 : -1) : a.source_id < b.source_id ? -1 : 1));
233
+ for (const s of pool) {
234
+ const candidate = encodeSorted({ records: [...retained, s] });
235
+ if (byteSize(candidate) > signalByteCap)
236
+ break;
237
+ retained.push(s);
238
+ allocated++;
239
+ if (allocated >= recordBudget)
240
+ break;
241
+ }
242
+ }
243
+ retained.sort(tierSortKey);
244
+ const finalFamilyReport = updatedFamilyReport.map((f) => {
245
+ const count = retained.filter((s) => s.source_product === f.family).length;
246
+ return { ...f, retained: count };
247
+ });
248
+ const selection = {
249
+ total: sorted.length,
250
+ retained: retained.length,
251
+ capped: true,
252
+ per_family: finalFamilyReport,
253
+ };
254
+ return { records: retained, selection };
255
+ }
256
+ /** Deterministic, content-addressable generation identity. */
257
+ export function generationId(fullRecords, adapterVersion, shardByteCap, signalByteCap) {
258
+ const ids = fullRecords
259
+ .map((r) => asStringField(r, "source_id"))
260
+ .filter((id) => id)
261
+ .sort();
262
+ return stableId("evidenceTiers", adapterVersion, shardByteCap, signalByteCap, ids.join("\n"));
263
+ }
264
+ function coverageFromStatuses(runtimeStatuses) {
265
+ const families = [];
266
+ const available = [];
267
+ const selected = [];
268
+ const skipped = [];
269
+ // Post-extraction statuses use "ok" for a cleanly extracted source; discovery
270
+ // statuses use "available". Both mean the source was discovered and extracted,
271
+ // so a bounded consumer treats them as available. Sparse/missing/skipped/degraded
272
+ // are coverage gaps (the contract's incomplete state), so they surface in skipped
273
+ // rather than being silently absent from coverage.
274
+ const AVAILABLE = new Set(["ok", "available"]);
275
+ const GAP = new Set(["skipped", "sparse", "missing", "degraded"]);
276
+ for (const s of runtimeStatuses ?? []) {
277
+ const runtime = typeof s.runtime === "string" ? s.runtime : null;
278
+ const product = typeof s.source_product === "string" ? s.source_product : (runtime ?? "unknown");
279
+ const status = typeof s.status === "string" ? s.status : "";
280
+ const reason = typeof s.reason === "string" ? s.reason : "";
281
+ if (product && !families.includes(product))
282
+ families.push(product);
283
+ const isActiveRuntime = s.source_class === "active_runtime" && s.active_runtime !== false;
284
+ if (AVAILABLE.has(status)) {
285
+ available.push(product);
286
+ if (isActiveRuntime)
287
+ selected.push(product);
288
+ }
289
+ if (GAP.has(status)) {
290
+ const entry = { runtime, reason: reason || status };
291
+ if (Array.isArray(s.provenance_missing_fields) && s.provenance_missing_fields.length > 0) {
292
+ entry.reason += ` (missing provenance: ${s.provenance_missing_fields.join(",")})`;
293
+ }
294
+ if (typeof s.store_path === "string")
295
+ entry.store_path = s.store_path;
296
+ skipped.push(entry);
297
+ }
298
+ }
299
+ return { families: [...families].sort(), available: [...available].sort(), selected: [...selected].sort(), skipped };
300
+ }
301
+ /**
302
+ * Publish bounded full-evidence shards and a bounded signal tier atomically. The
303
+ * whole generation is staged in a temp directory and revealed only by an atomic
304
+ * swap of the `current` pointer, so no consumer can observe a partially
305
+ * published generation. Returns the publication result.
306
+ */
307
+ export function publishEvidenceTiers(records, opts, contractPath) {
308
+ const bounds = evidenceTierBounds(contractPath);
309
+ const productFamily = productFamilyIndex(contractPath);
310
+ const sortedRecords = records.slice().sort(tierSortKey);
311
+ const provenance = assessProvenance(sortedRecords);
312
+ const runtimeStatuses = [...(opts.runtimeStatuses ?? [])];
313
+ if (!provenance.complete) {
314
+ const gapProducts = new Map();
315
+ for (const record of sortedRecords) {
316
+ if (Object.keys(record).length === 0)
317
+ continue;
318
+ if (assessProvenance([record]).complete)
319
+ continue;
320
+ const product = typeof record.source_product === "string" ? record.source_product : "unknown";
321
+ if (!gapProducts.has(product)) {
322
+ gapProducts.set(product, {
323
+ runtime: typeof record.runtime === "string" ? record.runtime : null,
324
+ source_product: product,
325
+ source_class: typeof record.source_class === "string" ? record.source_class : "unknown",
326
+ active_runtime: record.active_runtime === true,
327
+ status: "degraded",
328
+ reason: "provenance_missing",
329
+ provenance_missing_fields: provenance.missingFields,
330
+ provenance_missing_records: provenance.missingRecords,
331
+ });
332
+ }
333
+ }
334
+ runtimeStatuses.push(...gapProducts.values());
335
+ }
336
+ const signals = deriveSignalRecords(sortedRecords);
337
+ const { records: selectedSignals, selection } = selectSignalsForBound(signals, bounds.signalByteCap);
338
+ const shards = shardFullEvidence(sortedRecords, bounds.shardByteCap, productFamily);
339
+ const gen = generationId(sortedRecords, opts.adapterVersion, bounds.shardByteCap, bounds.signalByteCap);
340
+ const publishedAt = opts.publishedAt ?? new Date().toISOString();
341
+ const generationsDir = path.join(opts.tiersDir, "generations");
342
+ const finalDir = path.join(generationsDir, gen);
343
+ const stageDir = path.join(opts.tiersDir, ".staging", `${gen}.${process.pid}.${Date.now()}`);
344
+ fs.mkdirSync(path.join(stageDir, "full-evidence"), { recursive: true });
345
+ fs.mkdirSync(generationsDir, { recursive: true });
346
+ const shardDescriptors = [];
347
+ const familiesAgg = {};
348
+ for (const shard of shards) {
349
+ const file = `${shard.family}-${String(shard.index).padStart(3, "0")}.json`;
350
+ const relPath = path.join("full-evidence", file);
351
+ const absPath = path.join(stageDir, relPath);
352
+ const encoded = encodeSorted({ records: shard.records });
353
+ writeFileAtomic(absPath, encoded + "\n");
354
+ shardDescriptors.push({
355
+ family: shard.family,
356
+ index: shard.index,
357
+ path: relPath,
358
+ record_count: shard.records.length,
359
+ bytes: byteSize(encoded),
360
+ source_ids: shard.sourceIds,
361
+ });
362
+ const agg = familiesAgg[shard.family] ?? { shards: 0, records: 0 };
363
+ agg.shards += 1;
364
+ agg.records += shard.records.length;
365
+ familiesAgg[shard.family] = agg;
366
+ }
367
+ const signalRel = "signal.json";
368
+ const signalEncoded = encodeSorted({ records: selectedSignals });
369
+ const signalBytes = byteSize(signalEncoded);
370
+ writeFileAtomic(path.join(stageDir, signalRel), signalEncoded + "\n");
371
+ const manifest = {
372
+ schema_version: TIER_SCHEMA_VERSION,
373
+ generation: gen,
374
+ adapter_version: opts.adapterVersion,
375
+ published_at: publishedAt,
376
+ bounds: { shard_byte_cap: bounds.shardByteCap, signal_byte_cap: bounds.signalByteCap },
377
+ total_records: sortedRecords.length,
378
+ families: familiesAgg,
379
+ shards: shardDescriptors,
380
+ signal: { path: signalRel, record_count: selectedSignals.length, bytes: signalBytes, selection },
381
+ coverage: coverageFromStatuses(runtimeStatuses),
382
+ corpus_metadata: opts.corpusMetadata,
383
+ };
384
+ writeFileAtomic(path.join(stageDir, "manifest.json"), encodeSorted(manifest) + "\n");
385
+ // Reveal: rename staged dir onto the final generation dir, then atomically
386
+ // swap the current pointer. If interrupted before this point, the prior
387
+ // generation (or none) remains current.
388
+ const priorCurrent = readCurrentPointer(opts.tiersDir);
389
+ if (!fs.existsSync(finalDir)) {
390
+ fs.renameSync(stageDir, finalDir);
391
+ }
392
+ else {
393
+ // Idempotent: identical content already published. Replace staging copy.
394
+ try {
395
+ fs.rmSync(stageDir, { recursive: true, force: true });
396
+ }
397
+ catch {
398
+ /* best-effort cleanup */
399
+ }
400
+ }
401
+ const currentPath = path.join(opts.tiersDir, "current.json");
402
+ writeFileAtomic(currentPath, encodeSorted({
403
+ schema_version: CURRENT_POINTER_VERSION,
404
+ generation: gen,
405
+ published_at: publishedAt,
406
+ adapter_version: opts.adapterVersion,
407
+ }) + "\n");
408
+ return {
409
+ tiers_dir: opts.tiersDir,
410
+ generation: gen,
411
+ manifest_path: path.join("generations", gen, "manifest.json"),
412
+ total_records: sortedRecords.length,
413
+ shard_count: shardDescriptors.length,
414
+ signal_count: selectedSignals.length,
415
+ signal_bytes: signalBytes,
416
+ signal_selection: selection,
417
+ families: familiesAgg,
418
+ superseded_generation: priorCurrent?.generation ?? null,
419
+ };
420
+ }
421
+ /** Read the current generation pointer, or null when no tiers are published. */
422
+ export function readCurrentPointer(tiersDir) {
423
+ const p = path.join(tiersDir, "current.json");
424
+ if (!fs.existsSync(p))
425
+ return null;
426
+ try {
427
+ const data = JSON.parse(fs.readFileSync(p, "utf-8"));
428
+ if (data && typeof data === "object" && !Array.isArray(data)) {
429
+ const obj = data;
430
+ if (typeof obj.generation === "string" && typeof obj.schema_version === "string") {
431
+ return {
432
+ schema_version: obj.schema_version,
433
+ generation: obj.generation,
434
+ published_at: typeof obj.published_at === "string" ? obj.published_at : "",
435
+ adapter_version: typeof obj.adapter_version === "string" ? obj.adapter_version : "",
436
+ };
437
+ }
438
+ }
439
+ }
440
+ catch {
441
+ return null;
442
+ }
443
+ return null;
444
+ }
445
+ function isMapping(value) {
446
+ return value !== null && typeof value === "object" && !Array.isArray(value);
447
+ }
448
+ function isEvidenceTierManifest(value) {
449
+ if (!isMapping(value))
450
+ return false;
451
+ const bounds = value.bounds;
452
+ const signal = value.signal;
453
+ const coverage = value.coverage;
454
+ if (value.schema_version !== TIER_SCHEMA_VERSION ||
455
+ !isMapping(bounds) ||
456
+ typeof bounds.shard_byte_cap !== "number" ||
457
+ typeof bounds.signal_byte_cap !== "number" ||
458
+ !isMapping(signal) ||
459
+ typeof signal.path !== "string" ||
460
+ typeof signal.bytes !== "number" ||
461
+ !isMapping(coverage) ||
462
+ !Array.isArray(coverage.skipped) ||
463
+ !Array.isArray(value.shards)) {
464
+ return false;
465
+ }
466
+ return value.shards.every((shard) => isMapping(shard) &&
467
+ typeof shard.path === "string" &&
468
+ typeof shard.bytes === "number" &&
469
+ Array.isArray(shard.source_ids) &&
470
+ shard.source_ids.every((sourceId) => typeof sourceId === "string"));
471
+ }
472
+ function lowerSha256(value) {
473
+ return typeof value === "string" && /^[a-f0-9]{64}$/.test(value);
474
+ }
475
+ /** Validate bounded signal provenance without reading any full-evidence shard. */
476
+ export function missingSignalProvenanceFields(record) {
477
+ const missing = [];
478
+ const required = [
479
+ ["source_id", typeof record.source_id === "string" && record.source_id.length > 0],
480
+ ["source_kind", typeof record.source_kind === "string" && record.source_kind.length > 0],
481
+ ["signal_type", typeof record.signal_type === "string" && record.signal_type.length > 0],
482
+ ["timestamp", typeof record.timestamp === "string" && record.timestamp.length > 0],
483
+ ["project_id", typeof record.project_id === "string" && record.project_id.length > 0],
484
+ ["source_product", typeof record.source_product === "string" && record.source_product.length > 0],
485
+ ["active_runtime", typeof record.active_runtime === "boolean"],
486
+ ["source_class", typeof record.source_class === "string" && record.source_class.length > 0],
487
+ ["evidence_anchor", record.evidence_anchor === record.source_id && record.evidence_anchor.length > 0],
488
+ ];
489
+ for (const [field, present] of required)
490
+ if (!present)
491
+ missing.push(field);
492
+ if (CONVERSATION_SIGNAL_SOURCE_KINDS.has(record.source_kind)) {
493
+ if (!lowerSha256(record.origin_id))
494
+ missing.push("origin_id");
495
+ if (!lowerSha256(record.content_fingerprint))
496
+ missing.push("content_fingerprint");
497
+ if (typeof record.author_class !== "string" || record.author_class.length === 0)
498
+ missing.push("author_class");
499
+ if (typeof record.session_id !== "string" || record.session_id.length === 0)
500
+ missing.push("session_id");
501
+ }
502
+ return [...new Set(missing)];
503
+ }
504
+ const CONVERSATION_SIGNAL_SOURCE_KINDS = new Set(["conversation_turn", "history_prompt"]);
505
+ function signalProvenanceGaps(records) {
506
+ const gaps = new Set();
507
+ for (const record of records) {
508
+ if (!isMapping(record)) {
509
+ gaps.add("record");
510
+ continue;
511
+ }
512
+ for (const field of missingSignalProvenanceFields(record))
513
+ gaps.add(field);
514
+ }
515
+ return [...gaps].sort();
516
+ }
517
+ function readSignalPayload(gen) {
518
+ const signalPath = path.join(gen.dir, gen.manifest.signal.path);
519
+ if (!fs.existsSync(signalPath))
520
+ return null;
521
+ try {
522
+ const bytes = fs.statSync(signalPath).size;
523
+ if (bytes > evidenceTierBounds().signalByteCap)
524
+ return null;
525
+ const data = JSON.parse(fs.readFileSync(signalPath, "utf-8"));
526
+ if (!data || !Array.isArray(data.records))
527
+ return null;
528
+ return { records: data.records, bytes };
529
+ }
530
+ catch {
531
+ return null;
532
+ }
533
+ }
534
+ /** Resolve the current generation directory and manifest, or null. */
535
+ export function readCurrentGeneration(tiersDir) {
536
+ const pointer = readCurrentPointer(tiersDir);
537
+ if (!pointer)
538
+ return null;
539
+ const dir = path.join(tiersDir, "generations", pointer.generation);
540
+ const manifestPath = path.join(dir, "manifest.json");
541
+ if (!fs.existsSync(manifestPath))
542
+ return null;
543
+ try {
544
+ const manifest = JSON.parse(fs.readFileSync(manifestPath, "utf-8"));
545
+ if (!isEvidenceTierManifest(manifest))
546
+ return null;
547
+ return { pointer, dir, manifest };
548
+ }
549
+ catch {
550
+ return null;
551
+ }
552
+ }
553
+ /** Read the bounded signal tier records for the current generation. */
554
+ export function readSignalTier(tiersDir, options = {}) {
555
+ const gen = readCurrentGeneration(tiersDir);
556
+ if (!gen)
557
+ return null;
558
+ const payload = readSignalPayload(gen);
559
+ if (!payload)
560
+ return null;
561
+ if (!options.allowProvenanceGaps && signalProvenanceGaps(payload.records).length > 0)
562
+ return null;
563
+ return { ...payload, manifest: gen.manifest };
564
+ }
565
+ /** Resolve a bounded signal's identity (evidence_anchor) to its full record. */
566
+ export function resolveEvidenceAnchor(anchor, tiersDir) {
567
+ return getFullRecord(anchor, tiersDir);
568
+ }
569
+ /**
570
+ * Retrieve exactly one full-evidence record by `source_id`. Locates the owning
571
+ * shard via the manifest index, loads only that shard, and returns the record.
572
+ */
573
+ export function getFullRecord(sourceId, tiersDir) {
574
+ if (!sourceId)
575
+ return null;
576
+ const gen = readCurrentGeneration(tiersDir);
577
+ if (!gen)
578
+ return null;
579
+ for (const shard of gen.manifest.shards) {
580
+ if (!shard.source_ids.includes(sourceId))
581
+ continue;
582
+ const shardPath = path.join(gen.dir, shard.path);
583
+ if (!fs.existsSync(shardPath))
584
+ return null;
585
+ try {
586
+ const data = JSON.parse(fs.readFileSync(shardPath, "utf-8"));
587
+ if (!data || !Array.isArray(data.records))
588
+ return null;
589
+ return data.records.find((r) => r && typeof r === "object" && asStringField(r, "source_id") === sourceId) ?? null;
590
+ }
591
+ catch {
592
+ return null;
593
+ }
594
+ }
595
+ return null;
596
+ }
597
+ /**
598
+ * Direct-retrieval compatibility state, mirroring the contract's deterministic
599
+ * states. Callers report the matching recovery guidance from the authority.
600
+ */
601
+ export function evidenceTierCompatibility(tiersDir, corpusPath) {
602
+ const pointer = readCurrentPointer(tiersDir);
603
+ if (!pointer) {
604
+ if (corpusPath && fs.existsSync(corpusPath)) {
605
+ return { state: "legacy", reason: "legacy_monolithic_state" };
606
+ }
607
+ return { state: "missing", reason: "no_evidence" };
608
+ }
609
+ const gen = readCurrentGeneration(tiersDir);
610
+ if (!gen) {
611
+ return { state: "corrupt", reason: "unreadable_or_schema_divergent" };
612
+ }
613
+ const signalPath = path.join(gen.dir, gen.manifest.signal.path);
614
+ let actualSignalBytes;
615
+ try {
616
+ actualSignalBytes = fs.statSync(signalPath).size;
617
+ }
618
+ catch {
619
+ return { state: "corrupt", reason: "unreadable_or_schema_divergent" };
620
+ }
621
+ if (actualSignalBytes > evidenceTierBounds().signalByteCap) {
622
+ return { state: "oversized", reason: "oversized", artifact: gen.manifest.signal.path };
623
+ }
624
+ // Oversized: any shard or the signal tier exceeds its declared cap.
625
+ for (const shard of gen.manifest.shards) {
626
+ if (shard.bytes > gen.manifest.bounds.shard_byte_cap) {
627
+ return { state: "oversized", reason: "oversized", artifact: shard.path };
628
+ }
629
+ }
630
+ if (gen.manifest.signal.bytes > gen.manifest.bounds.signal_byte_cap ||
631
+ gen.manifest.signal.bytes > evidenceTierBounds().signalByteCap) {
632
+ return { state: "oversized", reason: "oversized", artifact: gen.manifest.signal.path };
633
+ }
634
+ let signalPayload;
635
+ try {
636
+ const data = JSON.parse(fs.readFileSync(signalPath, "utf-8"));
637
+ signalPayload = data && Array.isArray(data.records) ? { records: data.records, bytes: actualSignalBytes } : null;
638
+ }
639
+ catch {
640
+ signalPayload = null;
641
+ }
642
+ if (!signalPayload)
643
+ return { state: "corrupt", reason: "unreadable_or_schema_divergent" };
644
+ const provenanceGaps = signalProvenanceGaps(signalPayload.records);
645
+ if (provenanceGaps.length > 0) {
646
+ return {
647
+ state: "incomplete",
648
+ reason: "provenance_missing",
649
+ detail: provenanceGaps.map((field) => `signal: missing ${field}`),
650
+ };
651
+ }
652
+ // Incomplete: a supported source family is skipped/sparse/missing.
653
+ const skipped = gen.manifest.coverage.skipped;
654
+ if (skipped.length > 0) {
655
+ return {
656
+ state: "incomplete",
657
+ reason: "coverage_gap_or_sparse",
658
+ detail: skipped.map((s) => `${s.runtime ?? "unknown"}: ${s.reason}`),
659
+ };
660
+ }
661
+ return { state: "current", generation: pointer.generation };
662
+ }
663
+ /**
664
+ * Yield every full-evidence record across the current generation, reading one
665
+ * bounded shard at a time. No consumer observes a partially published generation
666
+ * (the atomic pointer swap already guarantees this), and no single read exceeds
667
+ * `shard_byte_cap` for a current/incomplete tier. Used by full-record consumers
668
+ * (usage analytics, startup analysis) so they analyze real scale without
669
+ * materializing the monolithic corpus envelope. Returns `null` when no current
670
+ * generation exists; callers then report the matching compatibility state.
671
+ */
672
+ export function* iterTierRecords(tiersDir) {
673
+ const gen = readCurrentGeneration(tiersDir);
674
+ if (!gen)
675
+ return;
676
+ for (const shard of gen.manifest.shards) {
677
+ const shardPath = path.join(gen.dir, shard.path);
678
+ if (!fs.existsSync(shardPath))
679
+ continue;
680
+ let data;
681
+ try {
682
+ data = JSON.parse(fs.readFileSync(shardPath, "utf-8"));
683
+ }
684
+ catch {
685
+ // A single corrupt shard cannot crash the whole tier read; the
686
+ // compatibility surface flags it separately. Skip the unreadable shard.
687
+ continue;
688
+ }
689
+ if (!data || !Array.isArray(data.records))
690
+ continue;
691
+ for (const record of data.records) {
692
+ if (record && typeof record === "object" && !Array.isArray(record)) {
693
+ yield record;
694
+ }
695
+ }
696
+ }
697
+ }
698
+ /**
699
+ * Read the retained corpus metadata block for bounded metadata consumers
700
+ * (report status, prime coverage). Returns `null` when no current generation
701
+ * exists or the manifest predates the metadata block; callers fall back to the
702
+ * compatibility state and the signal tier.
703
+ */
704
+ export function readTierCorpusMetadata(tiersDir) {
705
+ const gen = readCurrentGeneration(tiersDir);
706
+ if (!gen)
707
+ return null;
708
+ return gen.manifest.corpus_metadata ?? null;
709
+ }