agentera 3.0.0-dev.6 → 3.0.0-dev.69

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