agentera 3.0.0-dev.5 → 3.0.0-dev.51

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 (598) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +119 -22
  3. package/bundle/CHANGELOG.md +1351 -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 +236 -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 +437 -0
  11. package/bundle/references/adapters/package-registry.yaml +435 -189
  12. package/bundle/references/adapters/package-surface-characterization.md +66 -35
  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 +191 -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 +3022 -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 -1
  29. package/bundle/references/cli/vocabulary-index.yaml +20 -17
  30. package/bundle/references/cli/vocabulary.md +326 -361
  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 +224 -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 +102 -0
  39. package/bundle/skills/agentera/capabilities/{realisera → build}/schemas/exit.yaml +6 -5
  40. package/bundle/skills/agentera/capabilities/build/schemas/triggers.yaml +27 -0
  41. package/bundle/skills/agentera/capabilities/build/schemas/validation.yaml +176 -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 +458 -36
  91. package/bundle/skills/agentera/schemas/artifacts/progress.yaml +128 -17
  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 +190 -0
  95. package/dist/analytics/extractCorpus/copilotSessions.js +275 -0
  96. package/dist/analytics/extractCorpus/core.js +392 -0
  97. package/dist/analytics/extractCorpus/corpus.js +167 -0
  98. package/dist/analytics/extractCorpus/coverageAudit.js +260 -0
  99. package/dist/analytics/extractCorpus/cursorSessions.js +425 -0
  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 +118 -0
  103. package/dist/analytics/extractCorpus/index.js +14 -0
  104. package/dist/analytics/extractCorpus/jsonlSessions.js +204 -0
  105. package/dist/analytics/extractCorpus/sqliteCaps.js +43 -0
  106. package/dist/analytics/extractCorpus/sqliteSessions.js +367 -0
  107. package/dist/analytics/extractCorpus/tierReader.js +108 -0
  108. package/dist/analytics/extractCorpus.js +2 -1791
  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 +56 -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 +565 -0
  134. package/dist/cli/capabilityContext/bespoke.js +44 -0
  135. package/dist/cli/capabilityContext/build.js +242 -0
  136. package/dist/cli/capabilityContext/closeout.js +233 -0
  137. package/dist/cli/capabilityContext/contract.js +179 -0
  138. package/dist/cli/capabilityContext/evidence.js +463 -0
  139. package/dist/cli/capabilityContext/index.js +3 -0
  140. package/dist/cli/capabilityContext/orchestration.js +131 -0
  141. package/dist/cli/capabilityContext/planState.js +260 -0
  142. package/dist/cli/capabilityContext/progress.js +142 -0
  143. package/dist/cli/capabilityContext/projectVerification.js +409 -0
  144. package/dist/cli/capabilityContext/shared.js +83 -0
  145. package/dist/cli/capabilityContext/slim.js +152 -0
  146. package/dist/cli/capabilityContext/startup.js +150 -0
  147. package/dist/cli/capabilityContext/startupAggregation.js +68 -0
  148. package/dist/cli/capabilityContext/types.js +56 -0
  149. package/dist/cli/capabilityContext.js +1 -2487
  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 +164 -14
  153. package/dist/cli/commands/doctor.js +122 -97
  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 +26 -44
  157. package/dist/cli/commands/personalGlossary.js +176 -0
  158. package/dist/cli/commands/prime/briefOrientation.js +747 -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 +212 -0
  163. package/dist/cli/commands/prime/orientationOutput.js +399 -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 +78 -53
  169. package/dist/cli/commands/report.js +96 -25
  170. package/dist/cli/commands/route.js +142 -0
  171. package/dist/cli/commands/schema.js +266 -143
  172. package/dist/cli/commands/state/decisions.js +387 -0
  173. package/dist/cli/commands/state/docs.js +70 -0
  174. package/dist/cli/commands/state/experimentRecords.js +151 -0
  175. package/dist/cli/commands/state/experiments.js +14 -0
  176. package/dist/cli/commands/state/get.js +129 -0
  177. package/dist/cli/commands/state/health.js +14 -0
  178. package/dist/cli/commands/state/index.js +16 -0
  179. package/dist/cli/commands/state/list.js +194 -0
  180. package/dist/cli/commands/state/objective.js +25 -0
  181. package/dist/cli/commands/state/plan.js +14 -0
  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 +13 -0
  185. package/dist/cli/commands/state/shared.js +14 -0
  186. package/dist/cli/commands/state/todo.js +42 -0
  187. package/dist/cli/commands/state/write.js +430 -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 +272 -223
  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 +372 -0
  196. package/dist/cli/dispatch/commands.js +27 -0
  197. package/dist/cli/dispatch/index.js +207 -0
  198. package/dist/cli/dispatch/lifecycle.js +652 -0
  199. package/dist/cli/dispatch/prime.js +139 -0
  200. package/dist/cli/dispatch/projections.js +17 -0
  201. package/dist/cli/dispatch/shared.js +63 -0
  202. package/dist/cli/dispatch/state.js +140 -0
  203. package/dist/cli/dispatch.js +1 -1294
  204. package/dist/cli/errors.js +16 -17
  205. package/dist/cli/help.js +394 -43
  206. package/dist/cli/migrationRequired.js +87 -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 +11 -79
  242. package/dist/hooks/compaction/apply.js +446 -0
  243. package/dist/hooks/compaction/dryRun.js +184 -0
  244. package/dist/hooks/compaction/index.js +22 -0
  245. package/dist/hooks/compaction/parse.js +325 -0
  246. package/dist/hooks/compaction/retention.js +202 -0
  247. package/dist/hooks/compaction/status.js +360 -0
  248. package/dist/hooks/compaction/types.js +5 -0
  249. package/dist/hooks/validateArtifact/agentFacing.js +9 -0
  250. package/dist/hooks/validateArtifact/index.js +92 -0
  251. package/dist/hooks/validateArtifact/markdown.js +145 -0
  252. package/dist/hooks/validateArtifact/schema.js +546 -0
  253. package/dist/hooks/validateArtifact/traversal.js +107 -0
  254. package/dist/hooks/validateArtifact/violations.js +107 -0
  255. package/dist/migrate/v2HandoffManifest.js +452 -0
  256. package/dist/registries/activationContract.js +2 -0
  257. package/dist/registries/activationTuples.js +107 -0
  258. package/dist/registries/artifactProtocolIds.js +78 -0
  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 +229 -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 +385 -0
  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 -0
  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 +846 -0
  313. package/dist/state/entityMigrationTodo.js +133 -0
  314. package/dist/state/entityPublicationContext.js +806 -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 +982 -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/projectRoot.js +62 -0
  343. package/dist/state/projectionPolicy.js +190 -0
  344. package/dist/state/retrievalAuthority.js +156 -0
  345. package/dist/state/safeProjectFile.js +155 -0
  346. package/dist/state/startupAnalysis/benchmark.js +432 -0
  347. package/dist/state/startupAnalysis/contract.js +160 -0
  348. package/dist/state/startupAnalysis/helpers.js +286 -0
  349. package/dist/state/startupAnalysis/index.js +6 -0
  350. package/dist/state/startupAnalysis/metrics.js +340 -0
  351. package/dist/state/startupAnalysis/records.js +198 -0
  352. package/dist/state/startupAnalysis/report.js +111 -0
  353. package/dist/state/startupAnalysis/threshold.js +512 -0
  354. package/dist/state/startupAnalysis.js +2 -1953
  355. package/dist/state/startupProjection.js +499 -0
  356. package/dist/state/stateMode.js +85 -0
  357. package/dist/state/stateStorageAuthority.js +47 -0
  358. package/dist/state/summaryEntityRead.js +25 -0
  359. package/dist/state/summaryMigrationProvenance.js +66 -0
  360. package/dist/state/summarySourceRowAuthority.js +36 -0
  361. package/dist/state/todoActivationSafety.js +58 -0
  362. package/dist/state/todoDocsEntities.js +1069 -0
  363. package/dist/state/todoDocsEntityValidation.js +158 -0
  364. package/dist/state/todoMarkdownProjection.js +51 -0
  365. package/dist/state/todoReconciliationActivation.js +140 -0
  366. package/dist/state/todoReconciliationInspection.js +169 -0
  367. package/dist/state/todoReconciliationRepair.js +170 -0
  368. package/dist/state/todoReconciliationTransaction.js +582 -0
  369. package/dist/state/write/assign.js +20 -0
  370. package/dist/state/write/candidateMutation.js +269 -0
  371. package/dist/state/write/errors.js +11 -0
  372. package/dist/state/write/experimentPublication.js +192 -0
  373. package/dist/state/write/explain.js +363 -0
  374. package/dist/state/write/fields.js +61 -0
  375. package/dist/state/write/glossaryPublication.js +263 -0
  376. package/dist/state/write/grammar.js +285 -0
  377. package/dist/state/write/helpers.js +29 -0
  378. package/dist/state/write/index.js +12 -0
  379. package/dist/state/write/input.js +367 -0
  380. package/dist/state/write/lock.js +837 -0
  381. package/dist/state/write/mutation.js +234 -0
  382. package/dist/state/write/operations.js +170 -0
  383. package/dist/state/write/planEvaluation.js +128 -0
  384. package/dist/state/write/planPublication.js +179 -0
  385. package/dist/state/write/runtimeOperations.js +144 -0
  386. package/dist/state/write/serialize.js +1 -0
  387. package/dist/state/write/transaction.js +52 -0
  388. package/dist/state/write/validate.js +7 -0
  389. package/dist/upgrade/appContentRefresh.js +383 -0
  390. package/dist/upgrade/appModel.js +8 -7
  391. package/dist/upgrade/atomicWriter.js +1 -0
  392. package/dist/upgrade/bundleEvidence.js +33 -0
  393. package/dist/upgrade/channels.js +12 -8
  394. package/dist/upgrade/compatibility.js +56 -21
  395. package/dist/upgrade/doctor.js +197 -192
  396. package/dist/upgrade/doctorClassifier.js +187 -0
  397. package/dist/upgrade/installedHooksRetirement.js +196 -0
  398. package/dist/upgrade/legacyAgentCleanup.js +282 -0
  399. package/dist/upgrade/lifecycleUpgrade.js +113 -0
  400. package/dist/upgrade/migrateArtifactsV2ToV3.js +367 -149
  401. package/dist/upgrade/migrationPublication.js +122 -0
  402. package/dist/upgrade/nextMajorDoctor.js +42 -8
  403. package/dist/upgrade/npxPlatformStatus.js +22 -0
  404. package/dist/upgrade/projectIntegration.js +145 -187
  405. package/dist/upgrade/projectIntegrationDecision.js +50 -0
  406. package/dist/upgrade/retiredResourceDiagnostics.js +117 -0
  407. package/dist/upgrade/runtimeMigration.js +273 -363
  408. package/dist/upgrade/upgradeCommands.js +14 -1
  409. package/dist/upgrade/upgradeLock.js +85 -0
  410. package/dist/upgrade/upgradeOrchestrator.js +263 -59
  411. package/dist/upgrade/v3CapabilitySurface.js +14 -0
  412. package/dist/upgrade/versionResolution.js +8 -1
  413. package/dist/validate/activationArtifactEvidence.js +844 -0
  414. package/dist/validate/activationConjunction.js +816 -0
  415. package/dist/validate/activationEvidenceManifest.js +515 -0
  416. package/dist/validate/activationPackageSemantics.js +29 -0
  417. package/dist/validate/appHomeContract.js +5 -11
  418. package/dist/validate/bootstrapAuthority.js +44 -0
  419. package/dist/validate/capability.js +133 -12
  420. package/dist/validate/crossCapability.js +15 -10
  421. package/dist/validate/retainedReferenceAuthority.js +879 -0
  422. package/dist/validate/selfAudit.js +73 -37
  423. package/dist/validate/v1LegacyCruft.js +131 -0
  424. package/dist/validate/vocabularyAuthority.js +303 -0
  425. package/package.json +53 -27
  426. package/bundle/references/adapters/cursor.md +0 -213
  427. package/bundle/references/adapters/opencode.md +0 -530
  428. package/bundle/references/adapters/package-manifest-interface-model.yaml +0 -337
  429. package/bundle/references/adapters/runtime-adapter-characterization.md +0 -79
  430. package/bundle/references/adapters/runtime-adapter-interface-model.yaml +0 -200
  431. package/bundle/references/adapters/runtime-adapter-registry.yaml +0 -548
  432. package/bundle/references/adapters/runtime-feature-parity.md +0 -189
  433. package/bundle/references/analysis/benchmark.md +0 -267
  434. package/bundle/references/analysis/startup-measurement-contract.yaml +0 -424
  435. package/bundle/references/cli/agent-ready-state-contract.yaml +0 -953
  436. package/bundle/references/cli/audience-namespace-cli-migration.yaml +0 -355
  437. package/bundle/references/cli/bundle-skill-vocabulary.yaml +0 -278
  438. package/bundle/references/cli/capability-tool-classification.yaml +0 -53
  439. package/bundle/references/cli/routing-execution-vocabulary.yaml +0 -281
  440. package/bundle/references/meta/documentation-inventory.md +0 -43
  441. package/bundle/references/v1-section-mapping.md +0 -47
  442. package/bundle/skills/agentera/.claude-plugin/plugin.json +0 -27
  443. package/bundle/skills/agentera/agents/dokumentera.toml +0 -6
  444. package/bundle/skills/agentera/agents/hej.toml +0 -6
  445. package/bundle/skills/agentera/agents/inspektera.toml +0 -6
  446. package/bundle/skills/agentera/agents/inspirera.toml +0 -6
  447. package/bundle/skills/agentera/agents/optimera.toml +0 -6
  448. package/bundle/skills/agentera/agents/orkestrera.toml +0 -6
  449. package/bundle/skills/agentera/agents/planera.toml +0 -6
  450. package/bundle/skills/agentera/agents/profilera.toml +0 -6
  451. package/bundle/skills/agentera/agents/realisera.toml +0 -6
  452. package/bundle/skills/agentera/agents/resonera.toml +0 -6
  453. package/bundle/skills/agentera/agents/visionera.toml +0 -6
  454. package/bundle/skills/agentera/agents/visualisera.toml +0 -6
  455. package/bundle/skills/agentera/capabilities/dokumentera/schemas/artifacts.yaml +0 -73
  456. package/bundle/skills/agentera/capabilities/dokumentera/schemas/triggers.yaml +0 -35
  457. package/bundle/skills/agentera/capabilities/hej/schemas/artifacts.yaml +0 -69
  458. package/bundle/skills/agentera/capabilities/hej/schemas/triggers.yaml +0 -58
  459. package/bundle/skills/agentera/capabilities/inspektera/schemas/artifacts.yaml +0 -76
  460. package/bundle/skills/agentera/capabilities/inspektera/schemas/triggers.yaml +0 -38
  461. package/bundle/skills/agentera/capabilities/inspirera/schemas/artifacts.yaml +0 -24
  462. package/bundle/skills/agentera/capabilities/inspirera/schemas/triggers.yaml +0 -34
  463. package/bundle/skills/agentera/capabilities/optimera/schemas/triggers.yaml +0 -39
  464. package/bundle/skills/agentera/capabilities/orkestrera/schemas/artifacts.yaml +0 -64
  465. package/bundle/skills/agentera/capabilities/orkestrera/schemas/triggers.yaml +0 -42
  466. package/bundle/skills/agentera/capabilities/orkestrera/schemas/validation.yaml +0 -120
  467. package/bundle/skills/agentera/capabilities/planera/schemas/artifacts.yaml +0 -62
  468. package/bundle/skills/agentera/capabilities/planera/schemas/triggers.yaml +0 -34
  469. package/bundle/skills/agentera/capabilities/planera/schemas/validation.yaml +0 -61
  470. package/bundle/skills/agentera/capabilities/profilera/schemas/artifacts.yaml +0 -18
  471. package/bundle/skills/agentera/capabilities/profilera/schemas/triggers.yaml +0 -45
  472. package/bundle/skills/agentera/capabilities/profilera/schemas/validation.yaml +0 -57
  473. package/bundle/skills/agentera/capabilities/realisera/schemas/artifacts.yaml +0 -80
  474. package/bundle/skills/agentera/capabilities/realisera/schemas/triggers.yaml +0 -39
  475. package/bundle/skills/agentera/capabilities/realisera/schemas/validation.yaml +0 -110
  476. package/bundle/skills/agentera/capabilities/resonera/schemas/artifacts.yaml +0 -47
  477. package/bundle/skills/agentera/capabilities/resonera/schemas/triggers.yaml +0 -46
  478. package/bundle/skills/agentera/capabilities/resonera/schemas/validation.yaml +0 -77
  479. package/bundle/skills/agentera/capabilities/visionera/schemas/triggers.yaml +0 -41
  480. package/bundle/skills/agentera/capabilities/visualisera/schemas/triggers.yaml +0 -33
  481. package/bundle/skills/agentera/references/contract.md +0 -1039
  482. package/bundle/skills/hej/.claude-plugin/plugin.json +0 -6
  483. package/bundle/skills/hej/SKILL.md +0 -69
  484. package/bundle/skills/hej/agents/hej.toml +0 -11
  485. package/bundle/skills/hej/agents/openai.yaml +0 -8
  486. package/dist/analytics/extractCorpus.js.map +0 -1
  487. package/dist/analytics/usageStats.js.map +0 -1
  488. package/dist/bin/agentera.js.map +0 -1
  489. package/dist/capabilities/dokumentera/instructions.js +0 -6
  490. package/dist/capabilities/dokumentera/instructions.js.map +0 -1
  491. package/dist/capabilities/hej/instructions.js +0 -6
  492. package/dist/capabilities/hej/instructions.js.map +0 -1
  493. package/dist/capabilities/index.js.map +0 -1
  494. package/dist/capabilities/inspektera/instructions.js +0 -6
  495. package/dist/capabilities/inspektera/instructions.js.map +0 -1
  496. package/dist/capabilities/inspirera/instructions.js +0 -6
  497. package/dist/capabilities/inspirera/instructions.js.map +0 -1
  498. package/dist/capabilities/optimera/instructions.js +0 -6
  499. package/dist/capabilities/optimera/instructions.js.map +0 -1
  500. package/dist/capabilities/orkestrera/instructions.js +0 -6
  501. package/dist/capabilities/orkestrera/instructions.js.map +0 -1
  502. package/dist/capabilities/planera/instructions.js +0 -6
  503. package/dist/capabilities/planera/instructions.js.map +0 -1
  504. package/dist/capabilities/profilera/instructions.js +0 -6
  505. package/dist/capabilities/profilera/instructions.js.map +0 -1
  506. package/dist/capabilities/realisera/instructions.js +0 -6
  507. package/dist/capabilities/realisera/instructions.js.map +0 -1
  508. package/dist/capabilities/resonera/instructions.js +0 -6
  509. package/dist/capabilities/resonera/instructions.js.map +0 -1
  510. package/dist/capabilities/visionera/instructions.js +0 -6
  511. package/dist/capabilities/visionera/instructions.js.map +0 -1
  512. package/dist/capabilities/visualisera/instructions.js +0 -6
  513. package/dist/capabilities/visualisera/instructions.js.map +0 -1
  514. package/dist/cli/appContext.js.map +0 -1
  515. package/dist/cli/argvalidate.js.map +0 -1
  516. package/dist/cli/capabilityContext.js.map +0 -1
  517. package/dist/cli/commands/capability.js.map +0 -1
  518. package/dist/cli/commands/compact.js.map +0 -1
  519. package/dist/cli/commands/doctor.js.map +0 -1
  520. package/dist/cli/commands/lint.js.map +0 -1
  521. package/dist/cli/commands/prime.js.map +0 -1
  522. package/dist/cli/commands/query.js.map +0 -1
  523. package/dist/cli/commands/report.js.map +0 -1
  524. package/dist/cli/commands/schema.js.map +0 -1
  525. package/dist/cli/commands/state.js +0 -1023
  526. package/dist/cli/commands/state.js.map +0 -1
  527. package/dist/cli/commands/upgrade.js.map +0 -1
  528. package/dist/cli/commands/validate.js.map +0 -1
  529. package/dist/cli/commands/verify.js.map +0 -1
  530. package/dist/cli/dispatch.js.map +0 -1
  531. package/dist/cli/errors.js.map +0 -1
  532. package/dist/cli/help.js.map +0 -1
  533. package/dist/cli/orientation.js.map +0 -1
  534. package/dist/cli/prime-blob.js.map +0 -1
  535. package/dist/cli/stateQuery.js.map +0 -1
  536. package/dist/cli/structured.js.map +0 -1
  537. package/dist/cli/todoMarkdown.js.map +0 -1
  538. package/dist/core/difflib.js.map +0 -1
  539. package/dist/core/paths.js.map +0 -1
  540. package/dist/core/pyjson.js.map +0 -1
  541. package/dist/core/sourceRoot.js.map +0 -1
  542. package/dist/core/toml.js.map +0 -1
  543. package/dist/core/yaml.js.map +0 -1
  544. package/dist/eval/evalSkills.js.map +0 -1
  545. package/dist/eval/semanticEval.js.map +0 -1
  546. package/dist/eval/semanticFixtures.js.map +0 -1
  547. package/dist/hooks/common.js.map +0 -1
  548. package/dist/hooks/compaction.js +0 -935
  549. package/dist/hooks/compaction.js.map +0 -1
  550. package/dist/hooks/cursorPreToolUse.js +0 -19
  551. package/dist/hooks/cursorPreToolUse.js.map +0 -1
  552. package/dist/hooks/cursorSessionStart.js +0 -71
  553. package/dist/hooks/cursorSessionStart.js.map +0 -1
  554. package/dist/hooks/sessionStart.js +0 -209
  555. package/dist/hooks/sessionStart.js.map +0 -1
  556. package/dist/hooks/sessionStop.js +0 -212
  557. package/dist/hooks/sessionStop.js.map +0 -1
  558. package/dist/hooks/validateArtifact.js +0 -935
  559. package/dist/hooks/validateArtifact.js.map +0 -1
  560. package/dist/registries/artifactRegistry.js.map +0 -1
  561. package/dist/registries/capabilityContract.js.map +0 -1
  562. package/dist/registries/evaluatorHandoffContract.js.map +0 -1
  563. package/dist/registries/packageRegistry.js.map +0 -1
  564. package/dist/registries/runtimeAdapterRegistry.js +0 -315
  565. package/dist/registries/runtimeAdapterRegistry.js.map +0 -1
  566. package/dist/setup/codex.js +0 -1197
  567. package/dist/setup/codex.js.map +0 -1
  568. package/dist/setup/copilot.js +0 -227
  569. package/dist/setup/copilot.js.map +0 -1
  570. package/dist/setup/cursor.js +0 -127
  571. package/dist/setup/cursor.js.map +0 -1
  572. package/dist/setup/doctor.js +0 -1297
  573. package/dist/setup/doctor.js.map +0 -1
  574. package/dist/setup/smokeChecks.js.map +0 -1
  575. package/dist/state/installRoot.js.map +0 -1
  576. package/dist/state/startupAnalysis.js.map +0 -1
  577. package/dist/upgrade/appModel.js.map +0 -1
  578. package/dist/upgrade/channels.js.map +0 -1
  579. package/dist/upgrade/compatibility.js.map +0 -1
  580. package/dist/upgrade/doctor.js.map +0 -1
  581. package/dist/upgrade/migrateArtifactsV1ToV2.js +0 -570
  582. package/dist/upgrade/migrateArtifactsV1ToV2.js.map +0 -1
  583. package/dist/upgrade/migrateArtifactsV2ToV3.js.map +0 -1
  584. package/dist/upgrade/nextMajorDoctor.js.map +0 -1
  585. package/dist/upgrade/projectIntegration.js.map +0 -1
  586. package/dist/upgrade/runtimeMigration.js.map +0 -1
  587. package/dist/upgrade/upgradeCommands.js.map +0 -1
  588. package/dist/upgrade/upgradeOrchestrator.js.map +0 -1
  589. package/dist/upgrade/versionResolution.js.map +0 -1
  590. package/dist/validate/appHomeContract.js.map +0 -1
  591. package/dist/validate/capability.js.map +0 -1
  592. package/dist/validate/crossCapability.js.map +0 -1
  593. package/dist/validate/lifecycleAdapters.js +0 -772
  594. package/dist/validate/lifecycleAdapters.js.map +0 -1
  595. package/dist/validate/selfAudit.js.map +0 -1
  596. /package/bundle/skills/agentera/capabilities/{dokumentera → document}/schemas/exit.yaml +0 -0
  597. /package/bundle/skills/agentera/capabilities/{inspirera → research}/schemas/exit.yaml +0 -0
  598. /package/bundle/skills/agentera/capabilities/{hej → status}/schemas/exit.yaml +0 -0
@@ -0,0 +1,340 @@
1
+ import { inc, counterDict, nowIsoSeconds, flt, pyRound, safeInt, } from "./helpers.js";
2
+ import { boundedRuntimeStatus } from "./threshold.js";
3
+ export const STARTUP_METRICS_ENVELOPE = "startup_state_metrics_v1";
4
+ export const TOKEN_ESTIMATOR_VERSION = "approx_bytes_div_4_v1";
5
+ function mergeTokenEstimates(counter, value) {
6
+ if (!value || typeof value !== "object" || Array.isArray(value))
7
+ return;
8
+ for (const [label, estimate] of Object.entries(value)) {
9
+ if (typeof label === "string" && typeof estimate === "number" && Number.isInteger(estimate)) {
10
+ counter[label] = (counter[label] ?? 0) + estimate;
11
+ }
12
+ }
13
+ }
14
+ function sequenceCount(sequence, eventClass) {
15
+ const counts = sequence.counts;
16
+ if (counts && typeof counts === "object" && !Array.isArray(counts) && typeof counts[eventClass] === "number") {
17
+ return counts[eventClass];
18
+ }
19
+ const events = Array.isArray(sequence.events) ? sequence.events : [];
20
+ return events.filter((event) => Boolean(event && typeof event === "object" && !Array.isArray(event) && event.event_class === eventClass)).length;
21
+ }
22
+ function distribution(values) {
23
+ if (values.length === 0) {
24
+ return { count: 0, min: 0, max: 0, mean: 0, p50: 0, p75: 0, histogram: {} };
25
+ }
26
+ const ordered = [...values].sort((a, b) => a - b);
27
+ const percentile = (fraction) => {
28
+ const index = Math.min(ordered.length - 1, Math.ceil(ordered.length * fraction - 1));
29
+ return ordered[Math.max(index, 0)];
30
+ };
31
+ const histCounts = {};
32
+ for (const v of ordered)
33
+ histCounts[v] = (histCounts[v] ?? 0) + 1;
34
+ const histogram = {};
35
+ for (const key of Object.keys(histCounts).map(Number).sort((a, b) => a - b)) {
36
+ histogram[String(key)] = histCounts[key];
37
+ }
38
+ return {
39
+ count: ordered.length,
40
+ min: ordered[0],
41
+ max: ordered[ordered.length - 1],
42
+ mean: flt(pyRound(ordered.reduce((a, b) => a + b, 0) / ordered.length, 2)),
43
+ p50: percentile(0.5),
44
+ p75: percentile(0.75),
45
+ histogram,
46
+ };
47
+ }
48
+ function unionAll(map) {
49
+ const out = new Set();
50
+ for (const s of Object.values(map))
51
+ for (const v of s)
52
+ out.add(v);
53
+ return out;
54
+ }
55
+ function deriveStateThresholds(args) {
56
+ const capabilityCount = Object.keys(args.perCapability).length;
57
+ const credibleDistribution = args.totalSequences >= 3;
58
+ const rawDistribution = distribution(args.rawAfterCliPerSequence);
59
+ const redundantDistribution = distribution(args.redundantRawPerSequence);
60
+ const redundantArtifacts = {};
61
+ for (const label of Object.keys(args.redundantCounts).sort()) {
62
+ const count = args.redundantCounts[label];
63
+ if (count > 0) {
64
+ redundantArtifacts[label] = {
65
+ count,
66
+ capability_count: (args.redundantCapabilities[label] ?? new Set()).size,
67
+ };
68
+ }
69
+ }
70
+ const redundantSequenceCount = args.redundantRawPerSequence.filter((v) => v > 0).length;
71
+ const aggregateRedundantCapabilities = Object.keys(args.redundantCapabilities).length > 0 ? unionAll(args.redundantCapabilities) : new Set();
72
+ let redundantSequenceThreshold;
73
+ let thresholdReason;
74
+ if (credibleDistribution) {
75
+ redundantSequenceThreshold = Math.max(2, Math.ceil(args.totalSequences * 0.2));
76
+ thresholdReason =
77
+ "Selected from post-boundary state-gathering distribution: raw artifact " +
78
+ "access after CLI state must recur in at least 20% of measured sequences, " +
79
+ "with a floor of two sequences.";
80
+ }
81
+ else {
82
+ redundantSequenceThreshold = null;
83
+ thresholdReason = "No broad-envelope threshold: fewer than three state-gathering sequences were measured.";
84
+ }
85
+ let broadTrigger = null;
86
+ if (credibleDistribution) {
87
+ for (const [label, item] of Object.entries(redundantArtifacts)) {
88
+ if (safeInt(item.count) >= redundantSequenceThreshold && safeInt(item.capability_count) >= 2) {
89
+ broadTrigger = {
90
+ event_class: "raw_artifact_access",
91
+ artifact_label: label,
92
+ count: item.count,
93
+ capability_count: item.capability_count,
94
+ threshold: redundantSequenceThreshold,
95
+ };
96
+ break;
97
+ }
98
+ }
99
+ if (broadTrigger === null && redundantSequenceCount >= redundantSequenceThreshold) {
100
+ broadTrigger = {
101
+ event_class: "raw_artifact_access",
102
+ artifact_label: "multiple",
103
+ count: redundantSequenceCount,
104
+ capability_count: aggregateRedundantCapabilities.size,
105
+ threshold: redundantSequenceThreshold,
106
+ aggregate: true,
107
+ };
108
+ }
109
+ }
110
+ let recommendation;
111
+ if (broadTrigger !== null) {
112
+ const trigger = broadTrigger.aggregate
113
+ ? `redundant_raw_artifact_access in ${broadTrigger.count} of ${args.totalSequences} state sequences`
114
+ : `raw_artifact_access_after_cli:${broadTrigger.artifact_label} repeated ` +
115
+ `${broadTrigger.count} times across ${broadTrigger.capability_count} capabilities`;
116
+ recommendation = {
117
+ action: "plan_cli_startup_envelope",
118
+ measured_trigger: trigger,
119
+ rationale: "Raw artifact access after CLI state exceeded the broad startup-envelope threshold.",
120
+ };
121
+ }
122
+ else if (Object.keys(redundantArtifacts).length > 0) {
123
+ recommendation = {
124
+ action: "targeted_capability_guidance_fixes",
125
+ measured_trigger: "raw_artifact_access_after_cli_hotspot",
126
+ rationale: "Raw artifact access follows CLI state, but evidence is narrow or below the broad-envelope gate.",
127
+ };
128
+ }
129
+ else {
130
+ recommendation = {
131
+ action: "close_without_implementation",
132
+ measured_trigger: "none",
133
+ rationale: "No raw artifact access after overlapping CLI state was measured.",
134
+ };
135
+ }
136
+ if (args.confidenceCaveats.includes("insufficient_post_2_3_state_sequences")) {
137
+ recommendation = {
138
+ action: "close_without_implementation",
139
+ measured_trigger: "weak_evidence",
140
+ rationale: "No post-boundary Agentera state-gathering sequences were available.",
141
+ };
142
+ }
143
+ return {
144
+ measured_distribution: {
145
+ raw_after_cli_per_sequence: rawDistribution,
146
+ redundant_raw_after_cli_per_sequence: redundantDistribution,
147
+ redundant_sequence_count: redundantSequenceCount,
148
+ redundant_artifacts: redundantArtifacts,
149
+ capability_count: capabilityCount,
150
+ },
151
+ action_thresholds: {
152
+ startup_envelope: {
153
+ credible: credibleDistribution,
154
+ redundant_sequence_threshold: redundantSequenceThreshold,
155
+ selection_reason: thresholdReason,
156
+ },
157
+ targeted_guidance: {
158
+ credible: Object.keys(redundantArtifacts).length > 0,
159
+ selection_reason: "Selected when raw artifact access after CLI state is narrow or below the broad-envelope threshold.",
160
+ },
161
+ },
162
+ recommendation,
163
+ };
164
+ }
165
+ export function aggregateStartupMetrics(intermediateInput) {
166
+ const intermediate = intermediateInput && typeof intermediateInput === "object" && !Array.isArray(intermediateInput) ? intermediateInput : {};
167
+ const sequences = Array.isArray(intermediate.state_gathering_sequences) ? intermediate.state_gathering_sequences : [];
168
+ const degradations = Array.isArray(intermediate.degradations) ? intermediate.degradations : [];
169
+ const perCapability = {};
170
+ const cliCommandCounts = {};
171
+ const rawAfterCliCounts = {};
172
+ const redundantRawCounts = {};
173
+ const rawAfterCliTokenEstimates = {};
174
+ const redundantRawTokenEstimates = {};
175
+ const proseCounts = {};
176
+ const implementationCounts = {};
177
+ const degradationCounts = {};
178
+ const redundantCapabilities = {};
179
+ const rawAfterCliPerSequence = [];
180
+ const redundantRawPerSequence = [];
181
+ for (const item of degradations) {
182
+ if (item && typeof item === "object" && !Array.isArray(item)) {
183
+ const reason = item.reason;
184
+ if (typeof reason === "string")
185
+ inc(degradationCounts, reason);
186
+ }
187
+ }
188
+ for (const sequence of sequences) {
189
+ if (!sequence || typeof sequence !== "object" || Array.isArray(sequence))
190
+ continue;
191
+ let capability = sequence.capability;
192
+ if (typeof capability !== "string" || !capability)
193
+ capability = "unknown";
194
+ if (!(capability in perCapability)) {
195
+ perCapability[capability] = {
196
+ state_sequences: 0,
197
+ cli_state_call: 0,
198
+ raw_artifact_access_after_cli: 0,
199
+ redundant_raw_artifact_access: 0,
200
+ capability_prose_read: 0,
201
+ implementation_boundary: 0,
202
+ };
203
+ }
204
+ const cc = perCapability[capability];
205
+ cc.state_sequences += 1;
206
+ const cliCount = sequenceCount(sequence, "cli_state_call");
207
+ const rawList = Array.isArray(sequence.raw_artifact_labels_after_cli) ? sequence.raw_artifact_labels_after_cli : [];
208
+ const redundantList = Array.isArray(sequence.redundant_raw_artifact_labels) ? sequence.redundant_raw_artifact_labels : [];
209
+ const rawCount = rawList.length;
210
+ const redundantCount = redundantList.length;
211
+ const proseCount = sequenceCount(sequence, "capability_prose_read");
212
+ const implCount = sequenceCount(sequence, "implementation_boundary");
213
+ cc.cli_state_call += cliCount;
214
+ cc.raw_artifact_access_after_cli += rawCount;
215
+ cc.redundant_raw_artifact_access += redundantCount;
216
+ cc.capability_prose_read += proseCount;
217
+ cc.implementation_boundary += implCount;
218
+ proseCounts[capability] = (proseCounts[capability] ?? 0) + proseCount;
219
+ implementationCounts[capability] = (implementationCounts[capability] ?? 0) + implCount;
220
+ rawAfterCliPerSequence.push(rawCount);
221
+ redundantRawPerSequence.push(redundantCount);
222
+ mergeTokenEstimates(rawAfterCliTokenEstimates, sequence.estimated_raw_after_cli_tokens_by_artifact);
223
+ mergeTokenEstimates(redundantRawTokenEstimates, sequence.estimated_redundant_raw_tokens_by_artifact);
224
+ for (const event of Array.isArray(sequence.events) ? sequence.events : []) {
225
+ if (!event || typeof event !== "object" || Array.isArray(event))
226
+ continue;
227
+ const stateCommand = event.state_command;
228
+ if (event.event_class === "cli_state_call" && typeof stateCommand === "string") {
229
+ inc(cliCommandCounts, stateCommand);
230
+ }
231
+ const label = event.artifact_label;
232
+ if (event.event_class === "raw_artifact_access" && typeof label === "string") {
233
+ inc(rawAfterCliCounts, label);
234
+ if (event.redundant_with_cli === true) {
235
+ inc(redundantRawCounts, label);
236
+ if (!(label in redundantCapabilities))
237
+ redundantCapabilities[label] = new Set();
238
+ redundantCapabilities[label].add(capability);
239
+ }
240
+ }
241
+ }
242
+ for (const reason of Array.isArray(sequence.degradation_reasons) ? sequence.degradation_reasons : []) {
243
+ if (typeof reason === "string")
244
+ inc(degradationCounts, reason);
245
+ }
246
+ }
247
+ const totalSequences = sequences.filter((s) => Boolean(s && typeof s === "object" && !Array.isArray(s))).length;
248
+ const runtimeCoverage = (Array.isArray(intermediate.runtime_coverage) ? intermediate.runtime_coverage : [])
249
+ .filter((s) => Boolean(s && typeof s === "object" && !Array.isArray(s)))
250
+ .map((s) => boundedRuntimeStatus(s));
251
+ const runtimeStatusCounts = {};
252
+ for (const status of runtimeCoverage) {
253
+ const st = status.status;
254
+ if (typeof st === "string")
255
+ inc(runtimeStatusCounts, st);
256
+ }
257
+ const confidenceCaveats = [];
258
+ if (totalSequences === 0)
259
+ confidenceCaveats.push("insufficient_post_2_3_state_sequences");
260
+ if (runtimeCoverage.some((s) => typeof s.status === "string" && ["missing", "sparse", "degraded", "skipped"].includes(s.status))) {
261
+ confidenceCaveats.push("runtime_coverage_incomplete_or_degraded");
262
+ }
263
+ if (Object.keys(degradationCounts).length > 0)
264
+ confidenceCaveats.push("some_records_or_sequences_degraded");
265
+ const thresholdDerivation = deriveStateThresholds({
266
+ totalSequences,
267
+ perCapability,
268
+ rawAfterCliPerSequence,
269
+ redundantRawPerSequence,
270
+ redundantCounts: redundantRawCounts,
271
+ redundantCapabilities,
272
+ confidenceCaveats,
273
+ });
274
+ const sequencesWithRaw = rawAfterCliPerSequence.filter((v) => v > 0).length;
275
+ const sequencesWithRedundant = redundantRawPerSequence.filter((v) => v > 0).length;
276
+ const recommendation = thresholdDerivation.recommendation && typeof thresholdDerivation.recommendation === "object" && !Array.isArray(thresholdDerivation.recommendation)
277
+ ? thresholdDerivation.recommendation
278
+ : {};
279
+ const sortedPerCapability = {};
280
+ for (const key of Object.keys(perCapability).sort())
281
+ sortedPerCapability[key] = perCapability[key];
282
+ const sumValues = (o) => Object.values(o).reduce((a, b) => a + b, 0);
283
+ const result = {
284
+ output_envelope: STARTUP_METRICS_ENVELOPE,
285
+ input_envelope: intermediate.output_envelope ?? null,
286
+ contract_version: intermediate.contract_version ?? null,
287
+ generated_at: nowIsoSeconds(),
288
+ boundary_source: intermediate.boundary_source ?? null,
289
+ boundary_commit: intermediate.boundary_commit ?? null,
290
+ boundary_committed_at: intermediate.boundary_committed_at ?? null,
291
+ benchmark_mode: intermediate.benchmark_mode || "full_boundary_snapshot",
292
+ benchmark_previous_watermark_at: intermediate.benchmark_previous_watermark_at ?? null,
293
+ benchmark_window_started_after: intermediate.benchmark_window_started_after ?? null,
294
+ benchmark_watermark_at: intermediate.benchmark_watermark_at ?? null,
295
+ corpus_adapter_version: intermediate.corpus_adapter_version ?? null,
296
+ runtime_coverage: runtimeCoverage,
297
+ runtime_status_counts: counterDict(runtimeStatusCounts),
298
+ runtime_record_counts: intermediate.runtime_record_counts || {},
299
+ total_records: safeInt(intermediate.total_records_read),
300
+ total_state_sequences: totalSequences,
301
+ state_sequences_with_raw_after_cli: sequencesWithRaw,
302
+ state_sequences_with_redundant_raw_access: sequencesWithRedundant,
303
+ total_cli_state_calls: sumValues(cliCommandCounts),
304
+ total_raw_artifact_access_after_cli: sumValues(rawAfterCliCounts),
305
+ total_redundant_raw_artifact_accesses: sumValues(redundantRawCounts),
306
+ raw_after_cli_sequence_rate: totalSequences ? flt(pyRound(sequencesWithRaw / totalSequences, 4)) : 0,
307
+ redundant_raw_sequence_rate: totalSequences ? flt(pyRound(sequencesWithRedundant / totalSequences, 4)) : 0,
308
+ per_capability_state_counts: sortedPerCapability,
309
+ cli_state_command_counts: counterDict(cliCommandCounts),
310
+ raw_artifact_access_after_cli_counts: counterDict(rawAfterCliCounts),
311
+ redundant_raw_artifact_access_counts: counterDict(redundantRawCounts),
312
+ token_estimator_version: TOKEN_ESTIMATOR_VERSION,
313
+ estimated_raw_after_cli_tokens: sumValues(rawAfterCliTokenEstimates),
314
+ estimated_redundant_raw_tokens: sumValues(redundantRawTokenEstimates),
315
+ estimated_raw_after_cli_tokens_by_artifact: counterDict(rawAfterCliTokenEstimates),
316
+ estimated_redundant_raw_tokens_by_artifact: counterDict(redundantRawTokenEstimates),
317
+ estimated_tokens_saved_vs_previous: null,
318
+ estimated_tokens_saved_vs_previous_null_reason: "previous_row_missing",
319
+ capability_prose_read_counts: counterDict(proseCounts),
320
+ implementation_boundary_counts: counterDict(implementationCounts),
321
+ degradation_reason_counts: counterDict(degradationCounts),
322
+ privacy_redaction_summary: {
323
+ raw_transcript_text: "not_emitted",
324
+ full_local_paths: "not_emitted",
325
+ raw_store_paths: "not_emitted",
326
+ session_ids: "salted_or_not_emitted",
327
+ artifact_labels: "canonical_only",
328
+ },
329
+ confidence_caveats: confidenceCaveats,
330
+ insufficient_evidence_reason: totalSequences === 0 ? "no_post_2_3_state_sequences" : null,
331
+ threshold_derivation: thresholdDerivation,
332
+ startup_recommendation: recommendation,
333
+ implementation_recommended: recommendation.action === "plan_cli_startup_envelope",
334
+ compatibility_note: "Section 22 corpus records are read-only; aggregation consumes only startup_state_analysis_v1.",
335
+ };
336
+ if (totalSequences) {
337
+ result.recommendation_gate_input = thresholdDerivation.measured_distribution;
338
+ }
339
+ return result;
340
+ }
@@ -0,0 +1,198 @@
1
+ import { hashLabel, loadContract, parseTimestamp } from "./contract.js";
2
+ import { argumentsText, capabilityInvocation, extractText, introCapability, recordLabel, } from "./helpers.js";
3
+ import { BOUNDARY_DEGRADATION_REASONS, STATE_EVENT_CLASSES, classifyStartupEvent, startupConversationKey, } from "./threshold.js";
4
+ function hasTranscriptBearingField(record) {
5
+ if ("transcript" in record)
6
+ return true;
7
+ const data = record.data;
8
+ return Boolean(data && typeof data === "object" && !Array.isArray(data) && "transcript" in data);
9
+ }
10
+ function boundedReason(reason, contract) {
11
+ const reasons = Array.isArray(contract.degradation_reasons) ? contract.degradation_reasons : [];
12
+ const allowed = new Set([...reasons, ...BOUNDARY_DEGRADATION_REASONS]);
13
+ return allowed.has(reason) ? reason : "malformed_record";
14
+ }
15
+ function estimatedToolArgumentTokens(record) {
16
+ return Math.ceil(Buffer.byteLength(argumentsText(record), "utf8") / 4);
17
+ }
18
+ function timestampUtc(value) {
19
+ return parseTimestamp(value);
20
+ }
21
+ function newSequence(conversationKey, capability, salt) {
22
+ const counts = {};
23
+ for (const eventClass of [...STATE_EVENT_CLASSES].sort())
24
+ counts[eventClass] = 0;
25
+ return {
26
+ conversation: hashLabel("session", conversationKey, salt),
27
+ capability: capability || "unknown",
28
+ start_anchor: "first_cli_state_call_after_capability_invocation",
29
+ events: [],
30
+ counts,
31
+ cli_artifact_labels: [],
32
+ raw_artifact_labels_after_cli: [],
33
+ redundant_raw_artifact_labels: [],
34
+ estimated_raw_after_cli_tokens_by_artifact: {},
35
+ estimated_redundant_raw_tokens_by_artifact: {},
36
+ degradation_reasons: [],
37
+ };
38
+ }
39
+ function eventOutput(record, opts) {
40
+ const item = {
41
+ record: recordLabel(record, opts.salt),
42
+ event_class: STATE_EVENT_CLASSES.has(opts.eventClass) ? opts.eventClass : "non_state_context",
43
+ phase: opts.phase,
44
+ };
45
+ if (opts.artifactLabel)
46
+ item.artifact_label = opts.artifactLabel;
47
+ if (opts.stateCommand)
48
+ item.state_command = opts.stateCommand;
49
+ if (opts.redundantWithCli !== undefined && opts.redundantWithCli !== null) {
50
+ item.redundant_with_cli = opts.redundantWithCli;
51
+ }
52
+ return item;
53
+ }
54
+ export function classifyStartupRecords(corpus, opts) {
55
+ const salt = opts.salt;
56
+ const loaded = opts.contract ?? loadContract();
57
+ const boundaryInfo = loaded.boundary && typeof loaded.boundary === "object" && !Array.isArray(loaded.boundary) ? loaded.boundary : {};
58
+ const boundary = timestampUtc(boundaryInfo.committed_at);
59
+ const records = corpus && typeof corpus === "object" && !Array.isArray(corpus) ? (corpus.records ?? []) : [];
60
+ const degradations = [];
61
+ const groups = new Map();
62
+ for (const record of Array.isArray(records) ? records : []) {
63
+ if (!record || typeof record !== "object" || Array.isArray(record)) {
64
+ degradations.push({ reason: boundedReason("malformed_record", loaded) });
65
+ continue;
66
+ }
67
+ if (hasTranscriptBearingField(record)) {
68
+ degradations.push({ record: recordLabel(record, salt), reason: "privacy_redaction_required" });
69
+ continue;
70
+ }
71
+ const timestamp = timestampUtc(record.timestamp);
72
+ if (timestamp === null) {
73
+ degradations.push({ record: recordLabel(record, salt), reason: "missing_timestamp" });
74
+ continue;
75
+ }
76
+ if (boundary !== null && timestamp.getTime() <= boundary.getTime()) {
77
+ degradations.push({ record: recordLabel(record, salt), reason: "pre_boundary_record" });
78
+ continue;
79
+ }
80
+ const key = startupConversationKey(record);
81
+ if (key === null) {
82
+ degradations.push({ record: recordLabel(record, salt), reason: "missing_conversation_key" });
83
+ continue;
84
+ }
85
+ if (!groups.has(key))
86
+ groups.set(key, []);
87
+ groups.get(key).push(record);
88
+ }
89
+ const sequences = [];
90
+ for (const [conversationKey, items] of groups) {
91
+ items.sort((a, b) => {
92
+ const ta = String(a.timestamp ?? "");
93
+ const tb = String(b.timestamp ?? "");
94
+ return ta < tb ? -1 : ta > tb ? 1 : 0;
95
+ });
96
+ const state = {
97
+ active: null,
98
+ segmentCapability: null,
99
+ segmentOpen: false,
100
+ segmentHadStateSequence: false,
101
+ cliArtifactsSeen: new Set(),
102
+ };
103
+ const closeActive = () => {
104
+ if (state.active !== null) {
105
+ state.active.cli_artifact_labels = [...state.cliArtifactsSeen].sort();
106
+ sequences.push(state.active);
107
+ state.segmentHadStateSequence = true;
108
+ state.active = null;
109
+ state.cliArtifactsSeen = new Set();
110
+ }
111
+ };
112
+ for (const record of items) {
113
+ const text = extractText(record);
114
+ const data = record.data && typeof record.data === "object" && !Array.isArray(record.data) ? record.data : {};
115
+ const actor = data.actor;
116
+ if (actor === "user") {
117
+ closeActive();
118
+ if (state.segmentOpen && !state.segmentHadStateSequence) {
119
+ degradations.push({
120
+ conversation: hashLabel("session", conversationKey, salt),
121
+ reason: "no_agentera_state_sequence",
122
+ });
123
+ }
124
+ state.segmentCapability = capabilityInvocation(text);
125
+ state.segmentOpen = state.segmentCapability !== null;
126
+ state.segmentHadStateSequence = false;
127
+ continue;
128
+ }
129
+ if (!state.segmentOpen) {
130
+ const introCap = actor === "assistant" ? introCapability(text) : null;
131
+ if (introCap) {
132
+ state.segmentCapability = introCap;
133
+ state.segmentOpen = true;
134
+ }
135
+ else {
136
+ continue;
137
+ }
138
+ }
139
+ const [eventClass, artifactLabel, stateCommand, cliArtifactLabels] = classifyStartupEvent(record);
140
+ if (eventClass === "non_state_context")
141
+ continue;
142
+ if (eventClass === "cli_state_call" && state.active === null) {
143
+ state.active = newSequence(conversationKey, state.segmentCapability, salt);
144
+ }
145
+ if (state.active === null)
146
+ continue;
147
+ // cast: state.active is built by newSequence with typed array/counter/estimate fields
148
+ const active = state.active;
149
+ if (eventClass === "cli_state_call") {
150
+ for (const label of cliArtifactLabels)
151
+ state.cliArtifactsSeen.add(label);
152
+ }
153
+ const redundant = eventClass === "raw_artifact_access" && artifactLabel
154
+ ? state.cliArtifactsSeen.has(artifactLabel)
155
+ : null;
156
+ const phase = eventClass === "implementation_boundary" ? "implementation_boundary" : "state_gathering";
157
+ active.counts[eventClass] += 1;
158
+ active.events.push(eventOutput(record, {
159
+ eventClass,
160
+ phase,
161
+ salt,
162
+ artifactLabel,
163
+ stateCommand,
164
+ redundantWithCli: redundant,
165
+ }));
166
+ if (eventClass === "raw_artifact_access" && artifactLabel) {
167
+ active.raw_artifact_labels_after_cli.push(artifactLabel);
168
+ const estimatedTokens = estimatedToolArgumentTokens(record);
169
+ const rawEstimates = active.estimated_raw_after_cli_tokens_by_artifact;
170
+ rawEstimates[artifactLabel] = (rawEstimates[artifactLabel] ?? 0) + estimatedTokens;
171
+ if (redundant) {
172
+ active.redundant_raw_artifact_labels.push(artifactLabel);
173
+ const redundantEstimates = active.estimated_redundant_raw_tokens_by_artifact;
174
+ redundantEstimates[artifactLabel] = (redundantEstimates[artifactLabel] ?? 0) + estimatedTokens;
175
+ }
176
+ }
177
+ if (eventClass === "implementation_boundary") {
178
+ closeActive();
179
+ state.segmentOpen = false;
180
+ state.segmentCapability = null;
181
+ state.segmentHadStateSequence = false;
182
+ }
183
+ }
184
+ closeActive();
185
+ if (state.segmentOpen && !state.segmentHadStateSequence) {
186
+ degradations.push({
187
+ conversation: hashLabel("session", conversationKey, salt),
188
+ reason: "no_agentera_state_sequence",
189
+ });
190
+ }
191
+ }
192
+ return {
193
+ contract_version: loaded.version,
194
+ boundary_source: boundaryInfo.source,
195
+ state_gathering_sequences: sequences,
196
+ degradations,
197
+ };
198
+ }
@@ -0,0 +1,111 @@
1
+ import fs from "node:fs";
2
+ import path from "node:path";
3
+ import { pyJsonIndentSorted } from "../../core/pyjson.js";
4
+ import { Flt, formatFloat, pyFmt, pyJsonDumps } from "./helpers.js";
5
+ export const STARTUP_REPORT_MARKDOWN = "startup-overhead-report.md";
6
+ export const STARTUP_REPORT_JSON = "startup-overhead-report.json";
7
+ function startupJsonScalar(value) {
8
+ if (value instanceof Flt)
9
+ return formatFloat(value.v);
10
+ return undefined;
11
+ }
12
+ function pyJsonIndent(value, level = 0, indent = " ") {
13
+ return pyJsonIndentSorted(value, indent.length || 2, level, startupJsonScalar);
14
+ }
15
+ function markdownTable(headers, rows) {
16
+ const lines = [
17
+ "| " + headers.join(" | ") + " |",
18
+ "| " + headers.map(() => "---").join(" | ") + " |",
19
+ ];
20
+ if (rows.length === 0) {
21
+ return [...lines, "| " + headers.map(() => "none").join(" | ") + " |"];
22
+ }
23
+ return [...lines, ...rows.map((row) => "| " + row.map((v) => pyFmt(v)).join(" | ") + " |")];
24
+ }
25
+ export function renderStartupReport(metrics) {
26
+ const thresholdDerivation = metrics.threshold_derivation && typeof metrics.threshold_derivation === "object" && !Array.isArray(metrics.threshold_derivation)
27
+ ? metrics.threshold_derivation
28
+ : {};
29
+ const threshold = thresholdDerivation.action_thresholds && typeof thresholdDerivation.action_thresholds === "object" && !Array.isArray(thresholdDerivation.action_thresholds)
30
+ ? thresholdDerivation.action_thresholds
31
+ : {};
32
+ const envelopeThreshold = threshold.startup_envelope && typeof threshold.startup_envelope === "object" && !Array.isArray(threshold.startup_envelope) ? threshold.startup_envelope : {};
33
+ const guidanceThreshold = threshold.targeted_guidance && typeof threshold.targeted_guidance === "object" && !Array.isArray(threshold.targeted_guidance) ? threshold.targeted_guidance : {};
34
+ const recommendation = metrics.startup_recommendation && typeof metrics.startup_recommendation === "object" && !Array.isArray(metrics.startup_recommendation)
35
+ ? metrics.startup_recommendation
36
+ : {};
37
+ const measuredDistribution = thresholdDerivation.measured_distribution && typeof thresholdDerivation.measured_distribution === "object" && !Array.isArray(thresholdDerivation.measured_distribution)
38
+ ? thresholdDerivation.measured_distribution
39
+ : {};
40
+ const runtimeCoverage = Array.isArray(metrics.runtime_coverage) ? metrics.runtime_coverage : [];
41
+ const capabilityCounts = metrics.per_capability_state_counts && typeof metrics.per_capability_state_counts === "object" && !Array.isArray(metrics.per_capability_state_counts)
42
+ ? metrics.per_capability_state_counts
43
+ : {};
44
+ const lines = [
45
+ "# Agentera Startup State-Access Analysis",
46
+ "",
47
+ "This report is local-only and privacy-preserving. It measures raw Agentera artifact access after CLI state calls during capability startup/state gathering.",
48
+ "",
49
+ "## Boundary Source",
50
+ "",
51
+ `- Contract version: \`${pyFmt(metrics.contract_version)}\``,
52
+ `- Boundary source: \`${pyFmt(metrics.boundary_source)}\``,
53
+ `- Boundary commit: \`${pyFmt(metrics.boundary_commit)}\``,
54
+ `- Boundary timestamp: \`${pyFmt(metrics.boundary_committed_at)}\``,
55
+ `- Corpus adapter version: \`${pyFmt(metrics.corpus_adapter_version)}\``,
56
+ "",
57
+ "## Benchmark Window",
58
+ "",
59
+ `- Mode: \`${pyFmt(metrics.benchmark_mode)}\``,
60
+ `- Previous watermark: \`${pyFmt(metrics.benchmark_previous_watermark_at)}\``,
61
+ `- Window started after: \`${pyFmt(metrics.benchmark_window_started_after)}\``,
62
+ `- Watermark: \`${pyFmt(metrics.benchmark_watermark_at)}\``,
63
+ "",
64
+ "## Runtime Coverage",
65
+ "",
66
+ ];
67
+ const runtimeRows = [];
68
+ for (const status of runtimeCoverage) {
69
+ if (status && typeof status === "object" && !Array.isArray(status)) {
70
+ runtimeRows.push([
71
+ status.runtime ?? "unknown",
72
+ status.status ?? "unknown",
73
+ status.reason ?? "unknown",
74
+ status.record_count ?? 0,
75
+ status.file_count ?? 0,
76
+ status.error_count ?? 0,
77
+ ]);
78
+ }
79
+ }
80
+ lines.push(...markdownTable(["Runtime", "Status", "Reason", "Records", "Files", "Errors"], runtimeRows));
81
+ lines.push("", "## Metrics", "", `- Total state-gathering sequences: \`${pyFmt(metrics.total_state_sequences)}\``, `- Sequences with raw artifact access after CLI: \`${pyFmt(metrics.state_sequences_with_raw_after_cli)}\``, `- Sequences with redundant raw artifact access: \`${pyFmt(metrics.state_sequences_with_redundant_raw_access)}\``, `- Raw-after-CLI sequence rate: \`${pyFmt(metrics.raw_after_cli_sequence_rate)}\``, `- Redundant raw sequence rate: \`${pyFmt(metrics.redundant_raw_sequence_rate)}\``, `- CLI state command counts: \`${pyJsonDumps(metrics.cli_state_command_counts ?? {})}\``, `- Raw artifact access after CLI counts: \`${pyJsonDumps(metrics.raw_artifact_access_after_cli_counts ?? {})}\``, `- Redundant raw artifact access counts: \`${pyJsonDumps(metrics.redundant_raw_artifact_access_counts ?? {})}\``, "", "## Estimated Token Impact", "", `- Token estimator version: \`${pyFmt(metrics.token_estimator_version)}\``, `- Estimated raw-after-CLI tokens: \`${pyFmt(metrics.estimated_raw_after_cli_tokens)}\``, `- Estimated redundant raw tokens: \`${pyFmt(metrics.estimated_redundant_raw_tokens)}\``, `- Estimated raw-after-CLI tokens by artifact: \`${pyJsonDumps(metrics.estimated_raw_after_cli_tokens_by_artifact ?? {})}\``, `- Estimated redundant raw tokens by artifact: \`${pyJsonDumps(metrics.estimated_redundant_raw_tokens_by_artifact ?? {})}\``, `- Estimated tokens saved vs previous: \`${pyFmt(metrics.estimated_tokens_saved_vs_previous)}\``, `- Estimated tokens saved null reason: \`${pyFmt(metrics.estimated_tokens_saved_vs_previous_null_reason)}\``, "");
82
+ const capabilityRows = [];
83
+ for (const capability of Object.keys(capabilityCounts).sort()) {
84
+ const counts = capabilityCounts[capability];
85
+ if (counts && typeof counts === "object" && !Array.isArray(counts)) {
86
+ capabilityRows.push([
87
+ capability,
88
+ counts.state_sequences ?? 0,
89
+ counts.cli_state_call ?? 0,
90
+ counts.raw_artifact_access_after_cli ?? 0,
91
+ counts.redundant_raw_artifact_access ?? 0,
92
+ counts.capability_prose_read ?? 0,
93
+ ]);
94
+ }
95
+ }
96
+ lines.push(...markdownTable(["Capability", "Sequences", "CLI Calls", "Raw After CLI", "Redundant Raw", "Prose Reads"], capabilityRows));
97
+ lines.push("", "## Threshold Rationale", "", `- Startup envelope threshold credible: \`${pyFmt(envelopeThreshold.credible)}\``, `- Redundant-sequence threshold: \`${pyFmt(envelopeThreshold.redundant_sequence_threshold)}\``, `- Startup envelope selection reason: ${pyFmt(envelopeThreshold.selection_reason)}`, `- Targeted-guidance selection reason: ${pyFmt(guidanceThreshold.selection_reason)}`, `- Measured distribution: \`${pyJsonDumps(measuredDistribution)}\``, "", "## Recommendation", "", `- Action: \`${pyFmt(recommendation.action)}\``, `- Measured trigger: \`${pyFmt(recommendation.measured_trigger)}\``, `- Rationale: ${pyFmt(recommendation.rationale)}`, `- Implementation recommended: \`${pyFmt(metrics.implementation_recommended)}\``, "", "## Privacy Caveats", "", "- Raw transcript text is not emitted.", "- Full local paths and raw store paths are not emitted.", "- Session identifiers are salted or omitted.", "- Raw artifact accesses use canonical artifact_id labels such as `plan`, not filesystem paths.", "- Runtime coverage may be incomplete or degraded; inspect `confidence_caveats` before selecting follow-up work.", "");
98
+ return lines.join("\n");
99
+ }
100
+ export function writeStartupReports(metrics, outputDir) {
101
+ fs.mkdirSync(outputDir, { recursive: true });
102
+ const jsonPath = path.join(outputDir, STARTUP_REPORT_JSON);
103
+ const markdownPath = path.join(outputDir, STARTUP_REPORT_MARKDOWN);
104
+ fs.writeFileSync(jsonPath, pyJsonIndent(metrics) + "\n");
105
+ fs.writeFileSync(markdownPath, renderStartupReport(metrics));
106
+ return { structured: jsonPath, human_readable: markdownPath };
107
+ }
108
+ // ===========================================================================
109
+ // Slice 6: benchmark persistence + intermediate building + corpus-file extraction
110
+ // (extract_*_from_runtime_stores depends on extract_corpus and lands in Phase 10)
111
+ // ===========================================================================