agentera 3.0.0-dev.4 → 3.0.0-dev.46

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 (585) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +108 -22
  3. package/bundle/.agentera-npx-bundle.json +1 -1
  4. package/bundle/CHANGELOG.md +1351 -0
  5. package/bundle/DESIGN.md +229 -0
  6. package/bundle/LICENSE +201 -0
  7. package/bundle/README.md +143 -0
  8. package/bundle/UPGRADE.md +236 -0
  9. package/bundle/extract-corpus-parity.json +21 -0
  10. package/bundle/fixtures/routing/hybrid-corpus.yaml +154 -0
  11. package/bundle/references/adapters/package-publication.json +437 -0
  12. package/bundle/references/adapters/package-registry.yaml +434 -189
  13. package/bundle/references/adapters/package-surface-characterization.md +66 -35
  14. package/bundle/references/adapters/runtime-lifecycle-adapters.yaml +74 -0
  15. package/bundle/references/adapters/runtime-lifecycle-authority.yaml +62 -0
  16. package/bundle/references/adapters/runtime-lifecycle-operation-contract.yaml +84 -0
  17. package/bundle/references/adapters/runtime-retired-resources.yaml +333 -0
  18. package/bundle/references/analysis/evidence-tier-authority.yaml +518 -0
  19. package/bundle/references/analysis/verification-policy.yaml +191 -0
  20. package/bundle/references/artifacts/artifact-registry-interface-model.yaml +20 -10
  21. package/bundle/references/artifacts/glossary-entry-contract.yaml +1254 -0
  22. package/bundle/references/artifacts/state-storage-authority.yaml +2982 -0
  23. package/bundle/references/artifacts/verbosity-budget-authority.yaml +42 -0
  24. package/bundle/references/cli/app-lifecycle-vocabulary.yaml +7 -8
  25. package/bundle/references/cli/capability-instruction-contract.yaml +97 -59
  26. package/bundle/references/cli/hybrid-route-contract.yaml +438 -0
  27. package/bundle/references/cli/routing-model.md +155 -0
  28. package/bundle/references/cli/trigger-schema-enrichment.md +147 -0
  29. package/bundle/references/cli/update-channels.yaml +35 -2
  30. package/bundle/references/cli/vocabulary-index.yaml +23 -20
  31. package/bundle/references/cli/vocabulary.md +337 -366
  32. package/bundle/references/meta/retained-reference-authority.yaml +151 -0
  33. package/bundle/registry.json +14 -14
  34. package/bundle/skills/agentera/SKILL.md +218 -408
  35. package/bundle/skills/agentera/capabilities/audit/schemas/artifacts.yaml +84 -0
  36. package/bundle/skills/agentera/capabilities/{inspektera → audit}/schemas/exit.yaml +2 -2
  37. package/bundle/skills/agentera/capabilities/audit/schemas/triggers.yaml +25 -0
  38. package/bundle/skills/agentera/capabilities/{inspektera → audit}/schemas/validation.yaml +37 -18
  39. package/bundle/skills/agentera/capabilities/build/schemas/artifacts.yaml +102 -0
  40. package/bundle/skills/agentera/capabilities/{realisera → build}/schemas/exit.yaml +6 -5
  41. package/bundle/skills/agentera/capabilities/build/schemas/triggers.yaml +27 -0
  42. package/bundle/skills/agentera/capabilities/build/schemas/validation.yaml +176 -0
  43. package/bundle/skills/agentera/capabilities/{visualisera → design}/schemas/artifacts.yaml +12 -12
  44. package/bundle/skills/agentera/capabilities/{visualisera → design}/schemas/exit.yaml +5 -5
  45. package/bundle/skills/agentera/capabilities/design/schemas/triggers.yaml +16 -0
  46. package/bundle/skills/agentera/capabilities/{visualisera → design}/schemas/validation.yaml +7 -7
  47. package/bundle/skills/agentera/capabilities/discuss/schemas/artifacts.yaml +51 -0
  48. package/bundle/skills/agentera/capabilities/{resonera → discuss}/schemas/exit.yaml +2 -2
  49. package/bundle/skills/agentera/capabilities/discuss/schemas/triggers.yaml +20 -0
  50. package/bundle/skills/agentera/capabilities/discuss/schemas/validation.yaml +144 -0
  51. package/bundle/skills/agentera/capabilities/document/schemas/artifacts.yaml +80 -0
  52. package/bundle/skills/agentera/capabilities/document/schemas/triggers.yaml +16 -0
  53. package/bundle/skills/agentera/capabilities/{dokumentera → document}/schemas/validation.yaml +18 -18
  54. package/bundle/skills/agentera/capabilities/{optimera → optimize}/schemas/artifacts.yaml +18 -18
  55. package/bundle/skills/agentera/capabilities/{optimera → optimize}/schemas/exit.yaml +2 -2
  56. package/bundle/skills/agentera/capabilities/optimize/schemas/triggers.yaml +16 -0
  57. package/bundle/skills/agentera/capabilities/{optimera → optimize}/schemas/validation.yaml +9 -9
  58. package/bundle/skills/agentera/capabilities/orchestrate/schemas/artifacts.yaml +76 -0
  59. package/bundle/skills/agentera/capabilities/{orkestrera → orchestrate}/schemas/exit.yaml +9 -7
  60. package/bundle/skills/agentera/capabilities/orchestrate/schemas/triggers.yaml +23 -0
  61. package/bundle/skills/agentera/capabilities/orchestrate/schemas/validation.yaml +121 -0
  62. package/bundle/skills/agentera/capabilities/plan/schemas/artifacts.yaml +66 -0
  63. package/bundle/skills/agentera/capabilities/{planera → plan}/schemas/exit.yaml +2 -2
  64. package/bundle/skills/agentera/capabilities/plan/schemas/triggers.yaml +23 -0
  65. package/bundle/skills/agentera/capabilities/plan/schemas/validation.yaml +121 -0
  66. package/bundle/skills/agentera/capabilities/profile/schemas/artifacts.yaml +23 -0
  67. package/bundle/skills/agentera/capabilities/{profilera → profile}/schemas/exit.yaml +6 -5
  68. package/bundle/skills/agentera/capabilities/profile/schemas/triggers.yaml +20 -0
  69. package/bundle/skills/agentera/capabilities/profile/schemas/validation.yaml +115 -0
  70. package/bundle/skills/agentera/capabilities/research/schemas/artifacts.yaml +24 -0
  71. package/bundle/skills/agentera/capabilities/research/schemas/triggers.yaml +16 -0
  72. package/bundle/skills/agentera/capabilities/{inspirera → research}/schemas/validation.yaml +2 -2
  73. package/bundle/skills/agentera/capabilities/status/schemas/artifacts.yaml +73 -0
  74. package/bundle/skills/agentera/capabilities/status/schemas/triggers.yaml +22 -0
  75. package/bundle/skills/agentera/capabilities/{hej → status}/schemas/validation.yaml +5 -5
  76. package/bundle/skills/agentera/capabilities/{visionera → vision}/schemas/artifacts.yaml +16 -16
  77. package/bundle/skills/agentera/capabilities/{visionera → vision}/schemas/exit.yaml +7 -6
  78. package/bundle/skills/agentera/capabilities/vision/schemas/triggers.yaml +23 -0
  79. package/bundle/skills/agentera/capabilities/{visionera → vision}/schemas/validation.yaml +18 -20
  80. package/bundle/skills/agentera/capability_schema_contract.yaml +200 -37
  81. package/bundle/skills/agentera/protocol.yaml +31 -31
  82. package/bundle/skills/agentera/route-phrases.yaml +81 -0
  83. package/bundle/skills/agentera/schemas/artifacts/changelog.yaml +5 -4
  84. package/bundle/skills/agentera/schemas/artifacts/decisions.yaml +40 -22
  85. package/bundle/skills/agentera/schemas/artifacts/design.yaml +5 -4
  86. package/bundle/skills/agentera/schemas/artifacts/docs.yaml +15 -19
  87. package/bundle/skills/agentera/schemas/artifacts/experiments.yaml +145 -14
  88. package/bundle/skills/agentera/schemas/artifacts/glossary.yaml +82 -0
  89. package/bundle/skills/agentera/schemas/artifacts/health.yaml +58 -21
  90. package/bundle/skills/agentera/schemas/artifacts/objective.yaml +22 -8
  91. package/bundle/skills/agentera/schemas/artifacts/plan.yaml +421 -33
  92. package/bundle/skills/agentera/schemas/artifacts/progress.yaml +143 -53
  93. package/bundle/skills/agentera/schemas/artifacts/todo.yaml +345 -31
  94. package/bundle/skills/agentera/schemas/artifacts/vision.yaml +3 -3
  95. package/dist/analytics/extractCorpus/cli.js +190 -0
  96. package/dist/analytics/extractCorpus/copilotSessions.js +275 -0
  97. package/dist/analytics/extractCorpus/core.js +392 -0
  98. package/dist/analytics/extractCorpus/corpus.js +167 -0
  99. package/dist/analytics/extractCorpus/coverageAudit.js +260 -0
  100. package/dist/analytics/extractCorpus/cursorSessions.js +425 -0
  101. package/dist/analytics/extractCorpus/evidenceTiers.js +603 -0
  102. package/dist/analytics/extractCorpus/extractCorpusParity.js +105 -0
  103. package/dist/analytics/extractCorpus/filesystemSources.js +118 -0
  104. package/dist/analytics/extractCorpus/index.js +14 -0
  105. package/dist/analytics/extractCorpus/jsonlSessions.js +204 -0
  106. package/dist/analytics/extractCorpus/sqliteCaps.js +43 -0
  107. package/dist/analytics/extractCorpus/sqliteSessions.js +367 -0
  108. package/dist/analytics/extractCorpus/tierReader.js +108 -0
  109. package/dist/analytics/extractCorpus.js +2 -1791
  110. package/dist/analytics/glossaryAdviceResolution.js +166 -0
  111. package/dist/analytics/glossaryInputAcquisition.js +319 -0
  112. package/dist/analytics/personalGlossaryAdmission.js +133 -0
  113. package/dist/analytics/personalGlossaryProfile.js +219 -0
  114. package/dist/analytics/profileSignals.js +211 -0
  115. package/dist/analytics/usageStats.js +169 -42
  116. package/dist/audit/terminologyDrift.js +281 -0
  117. package/dist/bin/agentera.js +3 -2
  118. package/dist/capabilities/audit/instructions.js +16 -0
  119. package/dist/capabilities/build/instructions.js +56 -0
  120. package/dist/capabilities/design/instructions.js +4 -0
  121. package/dist/capabilities/discuss/instructions.js +29 -0
  122. package/dist/capabilities/document/instructions.js +11 -0
  123. package/dist/capabilities/index.js +40 -0
  124. package/dist/capabilities/optimize/instructions.js +14 -0
  125. package/dist/capabilities/orchestrate/instructions.js +40 -0
  126. package/dist/capabilities/plan/instructions.js +32 -0
  127. package/dist/capabilities/profile/instructions.js +70 -0
  128. package/dist/capabilities/research/instructions.js +5 -0
  129. package/dist/capabilities/status/instructions.js +11 -0
  130. package/dist/capabilities/status/startupInstructions.js +34 -0
  131. package/dist/capabilities/vision/instructions.js +4 -0
  132. package/dist/cli/appContext.js +30 -24
  133. package/dist/cli/argvalidate.js +0 -1
  134. package/dist/cli/capabilityContext/benchmark.js +565 -0
  135. package/dist/cli/capabilityContext/bespoke.js +44 -0
  136. package/dist/cli/capabilityContext/build.js +242 -0
  137. package/dist/cli/capabilityContext/closeout.js +233 -0
  138. package/dist/cli/capabilityContext/contract.js +179 -0
  139. package/dist/cli/capabilityContext/evidence.js +463 -0
  140. package/dist/cli/capabilityContext/index.js +3 -0
  141. package/dist/cli/capabilityContext/orchestration.js +131 -0
  142. package/dist/cli/capabilityContext/planState.js +260 -0
  143. package/dist/cli/capabilityContext/progress.js +142 -0
  144. package/dist/cli/capabilityContext/projectVerification.js +409 -0
  145. package/dist/cli/capabilityContext/shared.js +83 -0
  146. package/dist/cli/capabilityContext/slim.js +152 -0
  147. package/dist/cli/capabilityContext/startup.js +150 -0
  148. package/dist/cli/capabilityContext/startupAggregation.js +68 -0
  149. package/dist/cli/capabilityContext/types.js +56 -0
  150. package/dist/cli/capabilityContext.js +1 -2421
  151. package/dist/cli/commands/appHome.js +22 -0
  152. package/dist/cli/commands/capability.js +5 -12
  153. package/dist/cli/commands/compact.js +41 -13
  154. package/dist/cli/commands/doctor.js +127 -97
  155. package/dist/cli/commands/durability.js +81 -0
  156. package/dist/cli/commands/glossaryAdvice.js +138 -0
  157. package/dist/cli/commands/lint.js +26 -44
  158. package/dist/cli/commands/personalGlossary.js +176 -0
  159. package/dist/cli/commands/prime/briefOrientation.js +747 -0
  160. package/dist/cli/commands/prime/buildExecutionRequest.js +165 -0
  161. package/dist/cli/commands/prime/bundleStatus.js +190 -0
  162. package/dist/cli/commands/prime/collectEntityOrientation.js +311 -0
  163. package/dist/cli/commands/prime/collectOrientationState.js +212 -0
  164. package/dist/cli/commands/prime/orientationOutput.js +397 -0
  165. package/dist/cli/commands/prime/types.js +1 -0
  166. package/dist/cli/commands/prime/v1Migration.js +38 -0
  167. package/dist/cli/commands/prime.js +80 -558
  168. package/dist/cli/commands/profileGrounding.js +55 -0
  169. package/dist/cli/commands/query.js +78 -53
  170. package/dist/cli/commands/report.js +96 -25
  171. package/dist/cli/commands/route.js +142 -0
  172. package/dist/cli/commands/schema.js +266 -143
  173. package/dist/cli/commands/state/decisions.js +387 -0
  174. package/dist/cli/commands/state/docs.js +70 -0
  175. package/dist/cli/commands/state/experimentRecords.js +151 -0
  176. package/dist/cli/commands/state/experiments.js +14 -0
  177. package/dist/cli/commands/state/get.js +129 -0
  178. package/dist/cli/commands/state/health.js +14 -0
  179. package/dist/cli/commands/state/index.js +16 -0
  180. package/dist/cli/commands/state/list.js +194 -0
  181. package/dist/cli/commands/state/objective.js +25 -0
  182. package/dist/cli/commands/state/plan.js +14 -0
  183. package/dist/cli/commands/state/planTasks.js +154 -0
  184. package/dist/cli/commands/state/plans.js +154 -0
  185. package/dist/cli/commands/state/progress.js +13 -0
  186. package/dist/cli/commands/state/shared.js +14 -0
  187. package/dist/cli/commands/state/todo.js +42 -0
  188. package/dist/cli/commands/state/write.js +434 -0
  189. package/dist/cli/commands/upgrade.js +146 -5
  190. package/dist/cli/commands/upgradeVerify.js +118 -0
  191. package/dist/cli/commands/validate.js +272 -213
  192. package/dist/cli/commands/verify.js +24 -9
  193. package/dist/cli/contracts/bundleStatus.js +1 -0
  194. package/dist/cli/contracts/orientationState.js +1 -0
  195. package/dist/cli/dispatch/argvParser.js +32 -0
  196. package/dist/cli/dispatch/check.js +372 -0
  197. package/dist/cli/dispatch/commands.js +27 -0
  198. package/dist/cli/dispatch/index.js +207 -0
  199. package/dist/cli/dispatch/lifecycle.js +652 -0
  200. package/dist/cli/dispatch/prime.js +139 -0
  201. package/dist/cli/dispatch/projections.js +17 -0
  202. package/dist/cli/dispatch/shared.js +63 -0
  203. package/dist/cli/dispatch/state.js +140 -0
  204. package/dist/cli/dispatch.js +1 -996
  205. package/dist/cli/errors.js +52 -0
  206. package/dist/cli/help.js +390 -43
  207. package/dist/cli/migrationRequired.js +87 -0
  208. package/dist/cli/orientation/attention.js +59 -0
  209. package/dist/cli/orientation/corpusCoverage.js +102 -0
  210. package/dist/cli/orientation.js +444 -173
  211. package/dist/cli/planArtifacts.js +350 -0
  212. package/dist/cli/planEvidence.js +157 -0
  213. package/dist/cli/planLifecycleState.js +36 -0
  214. package/dist/cli/planTaskIndex.js +11 -0
  215. package/dist/cli/preCutoverCommand.js +32 -0
  216. package/dist/cli/prime-blob.js +71 -3
  217. package/dist/cli/profileAcquisition.js +167 -0
  218. package/dist/cli/startupCompletenessContract.js +59 -0
  219. package/dist/cli/stateQuery.js +63 -14
  220. package/dist/cli/structured.js +0 -1
  221. package/dist/cli/todoMarkdown.js +46 -0
  222. package/dist/cli/todoReadinessSelection.js +192 -0
  223. package/dist/cli/todoSeverity.js +18 -0
  224. package/dist/core/atomicWriter.js +20 -0
  225. package/dist/core/developmentChannel.js +1 -0
  226. package/dist/core/developmentInvocation.js +374 -0
  227. package/dist/core/difflib.js +0 -1
  228. package/dist/core/envPaths.js +20 -0
  229. package/dist/core/jsonValue.js +5 -0
  230. package/dist/core/paths.js +0 -1
  231. package/dist/core/pyjson.js +67 -3
  232. package/dist/core/shell.js +4 -0
  233. package/dist/core/skillIdentity.js +23 -0
  234. package/dist/core/sourceRoot.js +9 -12
  235. package/dist/core/text.js +10 -0
  236. package/dist/core/toml.js +0 -1
  237. package/dist/core/yaml.js +8 -1
  238. package/dist/eval/evalSkills.js +30 -26
  239. package/dist/eval/hybridRouteEvaluation.js +155 -0
  240. package/dist/eval/semanticEval.js +43 -20
  241. package/dist/eval/semanticFixtures.js +16 -5
  242. package/dist/hooks/common.js +11 -81
  243. package/dist/hooks/compaction/apply.js +446 -0
  244. package/dist/hooks/compaction/dryRun.js +184 -0
  245. package/dist/hooks/compaction/index.js +22 -0
  246. package/dist/hooks/compaction/parse.js +325 -0
  247. package/dist/hooks/compaction/retention.js +202 -0
  248. package/dist/hooks/compaction/status.js +360 -0
  249. package/dist/hooks/compaction/types.js +5 -0
  250. package/dist/hooks/validateArtifact/agentFacing.js +9 -0
  251. package/dist/hooks/validateArtifact/index.js +92 -0
  252. package/dist/hooks/validateArtifact/markdown.js +145 -0
  253. package/dist/hooks/validateArtifact/schema.js +546 -0
  254. package/dist/hooks/validateArtifact/traversal.js +107 -0
  255. package/dist/hooks/validateArtifact/violations.js +107 -0
  256. package/dist/migrate/v2HandoffManifest.js +452 -0
  257. package/dist/registries/activationContract.js +2 -0
  258. package/dist/registries/activationTuples.js +106 -0
  259. package/dist/registries/artifactProtocolIds.js +78 -0
  260. package/dist/registries/artifactRegistry.js +224 -63
  261. package/dist/registries/artifactSchemaProjection.js +45 -0
  262. package/dist/registries/capabilityContract.js +141 -13
  263. package/dist/registries/evaluatorHandoffContract.js +170 -0
  264. package/dist/registries/evidenceTierContract.js +371 -0
  265. package/dist/registries/glossaryAdviceContract.js +79 -0
  266. package/dist/registries/glossaryCaveatContract.js +67 -0
  267. package/dist/registries/glossaryConsumerContractValidation.js +787 -0
  268. package/dist/registries/glossaryEntryContract.js +757 -0
  269. package/dist/registries/glossaryTermIdentity.js +17 -0
  270. package/dist/registries/glossaryTermOccurrence.js +20 -0
  271. package/dist/registries/hybridRoute.js +274 -0
  272. package/dist/registries/hybridRouteReceipt.js +221 -0
  273. package/dist/registries/packagePublication.js +229 -0
  274. package/dist/registries/packageRegistry.js +187 -211
  275. package/dist/registries/todoReadinessContract.js +448 -0
  276. package/dist/registries/triggerLoader.js +174 -0
  277. package/dist/registries/verbosityBudgetContract.js +205 -0
  278. package/dist/release/releaseMetadata.js +385 -0
  279. package/dist/runtime/lifecycleAdapterContract.js +457 -0
  280. package/dist/runtime/lifecycleAdapters.js +777 -0
  281. package/dist/runtime/lifecycleAuthority.js +453 -0
  282. package/dist/runtime/lifecycleOperationContract.js +123 -0
  283. package/dist/runtime/lifecycleOperations.js +634 -0
  284. package/dist/runtime/lifecycleOwnershipJournal.js +622 -0
  285. package/dist/runtime/lifecyclePublication.js +415 -0
  286. package/dist/runtime/lifecycleSnapshot.js +438 -0
  287. package/dist/runtime/nativeResourceCleanup.js +502 -0
  288. package/dist/setup/opencode.js +20 -0
  289. package/dist/setup/opencodeConstants.js +1 -0
  290. package/dist/setup/sharedSkill.js +45 -0
  291. package/dist/setup/smokeChecks.js +21 -82
  292. package/dist/state/archiveDiscovery.js +580 -0
  293. package/dist/state/archivePublication.js +225 -0
  294. package/dist/state/archiveRecovery.js +237 -0
  295. package/dist/state/archiveReplay.js +53 -0
  296. package/dist/state/canonicalMigrationRecord.js +36 -0
  297. package/dist/state/changelog.js +221 -0
  298. package/dist/state/decisionEntities.js +367 -0
  299. package/dist/state/decisionLegacyValidation.js +215 -0
  300. package/dist/state/decisionMigrationProvenance.js +199 -0
  301. package/dist/state/decisionOverlay.js +254 -0
  302. package/dist/state/decisionRevision.js +256 -0
  303. package/dist/state/decisionRevisionMigration.js +89 -0
  304. package/dist/state/directRetrieval.js +323 -0
  305. package/dist/state/durability.js +324 -0
  306. package/dist/state/entityCutover.js +459 -0
  307. package/dist/state/entityCutoverGit.js +127 -0
  308. package/dist/state/entityGlossaryAuthority.js +13 -0
  309. package/dist/state/entityListProjection.js +187 -0
  310. package/dist/state/entityListRuntimeRegistry.js +85 -0
  311. package/dist/state/entityMigrationCausality.js +97 -0
  312. package/dist/state/entityMigrationIdentity.js +5 -0
  313. package/dist/state/entityMigrationPreview.js +846 -0
  314. package/dist/state/entityMigrationTodo.js +133 -0
  315. package/dist/state/entityPublicationContext.js +806 -0
  316. package/dist/state/entityRetrievalHelp.js +506 -0
  317. package/dist/state/entityStorage.js +896 -0
  318. package/dist/state/exactReplacementRecovery.js +18 -0
  319. package/dist/state/experimentArchive.js +63 -0
  320. package/dist/state/experimentIdentity.js +202 -0
  321. package/dist/state/healthEntities.js +262 -0
  322. package/dist/state/healthEntityValidation.js +18 -0
  323. package/dist/state/healthRepair.js +69 -0
  324. package/dist/state/installRoot.js +64 -25
  325. package/dist/state/legacyEntityCutoverEvidence.js +65 -0
  326. package/dist/state/legacyIdentity.js +47 -0
  327. package/dist/state/legacySummaryRecord.js +6 -0
  328. package/dist/state/listAccounting.js +54 -0
  329. package/dist/state/listClassification.js +17 -0
  330. package/dist/state/listCursor.js +42 -0
  331. package/dist/state/listRetrieval.js +781 -0
  332. package/dist/state/migrationSourceBinding.js +30 -0
  333. package/dist/state/objectiveExperimentEntities.js +322 -0
  334. package/dist/state/planEntities.js +530 -0
  335. package/dist/state/planIdentity.js +47 -0
  336. package/dist/state/planRetrieval.js +313 -0
  337. package/dist/state/planTaskRetrieval.js +294 -0
  338. package/dist/state/progressEntities.js +512 -0
  339. package/dist/state/progressGlossaryCaveat.js +168 -0
  340. package/dist/state/progressPublicationOrder.js +19 -0
  341. package/dist/state/projectRoot.js +62 -0
  342. package/dist/state/projectionPolicy.js +190 -0
  343. package/dist/state/retrievalAuthority.js +156 -0
  344. package/dist/state/safeProjectFile.js +155 -0
  345. package/dist/state/startupAnalysis/benchmark.js +432 -0
  346. package/dist/state/startupAnalysis/contract.js +160 -0
  347. package/dist/state/startupAnalysis/helpers.js +286 -0
  348. package/dist/state/startupAnalysis/index.js +6 -0
  349. package/dist/state/startupAnalysis/metrics.js +340 -0
  350. package/dist/state/startupAnalysis/records.js +198 -0
  351. package/dist/state/startupAnalysis/report.js +111 -0
  352. package/dist/state/startupAnalysis/threshold.js +512 -0
  353. package/dist/state/startupAnalysis.js +2 -1953
  354. package/dist/state/startupProjection.js +499 -0
  355. package/dist/state/stateMode.js +85 -0
  356. package/dist/state/stateStorageAuthority.js +47 -0
  357. package/dist/state/summaryEntityRead.js +25 -0
  358. package/dist/state/summaryMigrationProvenance.js +66 -0
  359. package/dist/state/summarySourceRowAuthority.js +36 -0
  360. package/dist/state/todoDocsEntities.js +1064 -0
  361. package/dist/state/todoDocsEntityValidation.js +158 -0
  362. package/dist/state/todoMarkdownProjection.js +51 -0
  363. package/dist/state/todoReconciliationActivation.js +132 -0
  364. package/dist/state/todoReconciliationInspection.js +173 -0
  365. package/dist/state/todoReconciliationRepair.js +170 -0
  366. package/dist/state/todoReconciliationTransaction.js +582 -0
  367. package/dist/state/write/assign.js +20 -0
  368. package/dist/state/write/candidateMutation.js +269 -0
  369. package/dist/state/write/errors.js +11 -0
  370. package/dist/state/write/experimentPublication.js +192 -0
  371. package/dist/state/write/explain.js +332 -0
  372. package/dist/state/write/fields.js +61 -0
  373. package/dist/state/write/glossaryPublication.js +263 -0
  374. package/dist/state/write/grammar.js +280 -0
  375. package/dist/state/write/helpers.js +29 -0
  376. package/dist/state/write/index.js +12 -0
  377. package/dist/state/write/input.js +367 -0
  378. package/dist/state/write/lock.js +837 -0
  379. package/dist/state/write/mutation.js +234 -0
  380. package/dist/state/write/operations.js +169 -0
  381. package/dist/state/write/planEvaluation.js +128 -0
  382. package/dist/state/write/planPublication.js +179 -0
  383. package/dist/state/write/runtimeOperations.js +142 -0
  384. package/dist/state/write/serialize.js +1 -0
  385. package/dist/state/write/transaction.js +52 -0
  386. package/dist/state/write/validate.js +7 -0
  387. package/dist/upgrade/appContentRefresh.js +383 -0
  388. package/dist/upgrade/appModel.js +8 -7
  389. package/dist/upgrade/atomicWriter.js +1 -0
  390. package/dist/upgrade/bundleEvidence.js +33 -0
  391. package/dist/upgrade/channels.js +12 -8
  392. package/dist/upgrade/compatibility.js +56 -21
  393. package/dist/upgrade/doctor.js +197 -192
  394. package/dist/upgrade/doctorClassifier.js +187 -0
  395. package/dist/upgrade/installedHooksRetirement.js +196 -0
  396. package/dist/upgrade/legacyAgentCleanup.js +282 -0
  397. package/dist/upgrade/lifecycleUpgrade.js +113 -0
  398. package/dist/upgrade/migrateArtifactsV2ToV3.js +367 -149
  399. package/dist/upgrade/migrationPublication.js +122 -0
  400. package/dist/upgrade/nextMajorDoctor.js +155 -0
  401. package/dist/upgrade/npxPlatformStatus.js +22 -0
  402. package/dist/upgrade/projectIntegration.js +145 -187
  403. package/dist/upgrade/projectIntegrationDecision.js +50 -0
  404. package/dist/upgrade/retiredResourceDiagnostics.js +117 -0
  405. package/dist/upgrade/runtimeMigration.js +278 -352
  406. package/dist/upgrade/upgradeCommands.js +14 -1
  407. package/dist/upgrade/upgradeLock.js +85 -0
  408. package/dist/upgrade/upgradeOrchestrator.js +263 -59
  409. package/dist/upgrade/v3CapabilitySurface.js +14 -0
  410. package/dist/upgrade/versionResolution.js +12 -5
  411. package/dist/validate/activationArtifactEvidence.js +844 -0
  412. package/dist/validate/activationConjunction.js +816 -0
  413. package/dist/validate/activationEvidenceManifest.js +515 -0
  414. package/dist/validate/activationPackageSemantics.js +29 -0
  415. package/dist/validate/appHomeContract.js +5 -11
  416. package/dist/validate/bootstrapAuthority.js +44 -0
  417. package/dist/validate/capability.js +144 -15
  418. package/dist/validate/crossCapability.js +15 -10
  419. package/dist/validate/retainedReferenceAuthority.js +879 -0
  420. package/dist/validate/selfAudit.js +73 -37
  421. package/dist/validate/v1LegacyCruft.js +131 -0
  422. package/dist/validate/vocabularyAuthority.js +303 -0
  423. package/package.json +53 -27
  424. package/bundle/references/adapters/cursor.md +0 -213
  425. package/bundle/references/adapters/opencode.md +0 -530
  426. package/bundle/references/adapters/package-manifest-interface-model.yaml +0 -337
  427. package/bundle/references/adapters/runtime-adapter-characterization.md +0 -79
  428. package/bundle/references/adapters/runtime-adapter-interface-model.yaml +0 -200
  429. package/bundle/references/adapters/runtime-adapter-registry.yaml +0 -548
  430. package/bundle/references/adapters/runtime-feature-parity.md +0 -189
  431. package/bundle/references/analysis/benchmark.md +0 -267
  432. package/bundle/references/analysis/startup-measurement-contract.yaml +0 -424
  433. package/bundle/references/cli/agent-ready-state-contract.yaml +0 -953
  434. package/bundle/references/cli/audience-namespace-cli-migration.yaml +0 -355
  435. package/bundle/references/cli/bundle-skill-vocabulary.yaml +0 -278
  436. package/bundle/references/cli/capability-tool-classification.yaml +0 -53
  437. package/bundle/references/cli/routing-execution-vocabulary.yaml +0 -281
  438. package/bundle/references/meta/documentation-inventory.md +0 -43
  439. package/bundle/references/v1-section-mapping.md +0 -47
  440. package/bundle/skills/agentera/.claude-plugin/plugin.json +0 -27
  441. package/bundle/skills/agentera/agents/dokumentera.toml +0 -6
  442. package/bundle/skills/agentera/agents/hej.toml +0 -6
  443. package/bundle/skills/agentera/agents/inspektera.toml +0 -6
  444. package/bundle/skills/agentera/agents/inspirera.toml +0 -6
  445. package/bundle/skills/agentera/agents/optimera.toml +0 -6
  446. package/bundle/skills/agentera/agents/orkestrera.toml +0 -6
  447. package/bundle/skills/agentera/agents/planera.toml +0 -6
  448. package/bundle/skills/agentera/agents/profilera.toml +0 -6
  449. package/bundle/skills/agentera/agents/realisera.toml +0 -6
  450. package/bundle/skills/agentera/agents/resonera.toml +0 -6
  451. package/bundle/skills/agentera/agents/visionera.toml +0 -6
  452. package/bundle/skills/agentera/agents/visualisera.toml +0 -6
  453. package/bundle/skills/agentera/capabilities/dokumentera/instructions.md +0 -428
  454. package/bundle/skills/agentera/capabilities/dokumentera/schemas/artifacts.yaml +0 -73
  455. package/bundle/skills/agentera/capabilities/dokumentera/schemas/triggers.yaml +0 -35
  456. package/bundle/skills/agentera/capabilities/hej/instructions.md +0 -331
  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/instructions.md +0 -514
  460. package/bundle/skills/agentera/capabilities/inspektera/schemas/artifacts.yaml +0 -76
  461. package/bundle/skills/agentera/capabilities/inspektera/schemas/triggers.yaml +0 -38
  462. package/bundle/skills/agentera/capabilities/inspirera/instructions.md +0 -280
  463. package/bundle/skills/agentera/capabilities/inspirera/schemas/artifacts.yaml +0 -24
  464. package/bundle/skills/agentera/capabilities/inspirera/schemas/triggers.yaml +0 -34
  465. package/bundle/skills/agentera/capabilities/optimera/instructions.md +0 -437
  466. package/bundle/skills/agentera/capabilities/optimera/schemas/triggers.yaml +0 -39
  467. package/bundle/skills/agentera/capabilities/orkestrera/instructions.md +0 -433
  468. package/bundle/skills/agentera/capabilities/orkestrera/schemas/artifacts.yaml +0 -64
  469. package/bundle/skills/agentera/capabilities/orkestrera/schemas/triggers.yaml +0 -42
  470. package/bundle/skills/agentera/capabilities/orkestrera/schemas/validation.yaml +0 -107
  471. package/bundle/skills/agentera/capabilities/planera/instructions.md +0 -368
  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/instructions.md +0 -419
  476. package/bundle/skills/agentera/capabilities/profilera/schemas/artifacts.yaml +0 -18
  477. package/bundle/skills/agentera/capabilities/profilera/schemas/triggers.yaml +0 -45
  478. package/bundle/skills/agentera/capabilities/profilera/schemas/validation.yaml +0 -57
  479. package/bundle/skills/agentera/capabilities/realisera/instructions.md +0 -403
  480. package/bundle/skills/agentera/capabilities/realisera/schemas/artifacts.yaml +0 -80
  481. package/bundle/skills/agentera/capabilities/realisera/schemas/triggers.yaml +0 -39
  482. package/bundle/skills/agentera/capabilities/realisera/schemas/validation.yaml +0 -110
  483. package/bundle/skills/agentera/capabilities/resonera/instructions.md +0 -329
  484. package/bundle/skills/agentera/capabilities/resonera/schemas/artifacts.yaml +0 -47
  485. package/bundle/skills/agentera/capabilities/resonera/schemas/triggers.yaml +0 -46
  486. package/bundle/skills/agentera/capabilities/resonera/schemas/validation.yaml +0 -77
  487. package/bundle/skills/agentera/capabilities/visionera/instructions.md +0 -309
  488. package/bundle/skills/agentera/capabilities/visionera/schemas/triggers.yaml +0 -41
  489. package/bundle/skills/agentera/capabilities/visualisera/instructions.md +0 -400
  490. package/bundle/skills/agentera/capabilities/visualisera/schemas/triggers.yaml +0 -33
  491. package/bundle/skills/agentera/references/contract.md +0 -1039
  492. package/bundle/skills/hej/.claude-plugin/plugin.json +0 -6
  493. package/bundle/skills/hej/SKILL.md +0 -69
  494. package/bundle/skills/hej/agents/hej.toml +0 -11
  495. package/bundle/skills/hej/agents/openai.yaml +0 -8
  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/cli/appContext.js.map +0 -1
  500. package/dist/cli/argvalidate.js.map +0 -1
  501. package/dist/cli/capabilityContext.js.map +0 -1
  502. package/dist/cli/commands/backfill.js +0 -84
  503. package/dist/cli/commands/backfill.js.map +0 -1
  504. package/dist/cli/commands/capability.js.map +0 -1
  505. package/dist/cli/commands/compact.js.map +0 -1
  506. package/dist/cli/commands/doctor.js.map +0 -1
  507. package/dist/cli/commands/lint.js.map +0 -1
  508. package/dist/cli/commands/prime.js.map +0 -1
  509. package/dist/cli/commands/query.js.map +0 -1
  510. package/dist/cli/commands/report.js.map +0 -1
  511. package/dist/cli/commands/schema.js.map +0 -1
  512. package/dist/cli/commands/state.js +0 -1012
  513. package/dist/cli/commands/state.js.map +0 -1
  514. package/dist/cli/commands/upgrade.js.map +0 -1
  515. package/dist/cli/commands/validate.js.map +0 -1
  516. package/dist/cli/commands/verify.js.map +0 -1
  517. package/dist/cli/dispatch.js.map +0 -1
  518. package/dist/cli/help.js.map +0 -1
  519. package/dist/cli/orientation.js.map +0 -1
  520. package/dist/cli/prime-blob.js.map +0 -1
  521. package/dist/cli/stateQuery.js.map +0 -1
  522. package/dist/cli/structured.js.map +0 -1
  523. package/dist/core/difflib.js.map +0 -1
  524. package/dist/core/git.js +0 -43
  525. package/dist/core/git.js.map +0 -1
  526. package/dist/core/paths.js.map +0 -1
  527. package/dist/core/pyjson.js.map +0 -1
  528. package/dist/core/sourceRoot.js.map +0 -1
  529. package/dist/core/toml.js.map +0 -1
  530. package/dist/core/yaml.js.map +0 -1
  531. package/dist/eval/evalSkills.js.map +0 -1
  532. package/dist/eval/semanticEval.js.map +0 -1
  533. package/dist/eval/semanticFixtures.js.map +0 -1
  534. package/dist/hooks/common.js.map +0 -1
  535. package/dist/hooks/compaction.js +0 -935
  536. package/dist/hooks/compaction.js.map +0 -1
  537. package/dist/hooks/cursorPreToolUse.js +0 -19
  538. package/dist/hooks/cursorPreToolUse.js.map +0 -1
  539. package/dist/hooks/cursorSessionStart.js +0 -71
  540. package/dist/hooks/cursorSessionStart.js.map +0 -1
  541. package/dist/hooks/sessionStart.js +0 -209
  542. package/dist/hooks/sessionStart.js.map +0 -1
  543. package/dist/hooks/sessionStop.js +0 -212
  544. package/dist/hooks/sessionStop.js.map +0 -1
  545. package/dist/hooks/validateArtifact.js +0 -933
  546. package/dist/hooks/validateArtifact.js.map +0 -1
  547. package/dist/registries/artifactRegistry.js.map +0 -1
  548. package/dist/registries/capabilityContract.js.map +0 -1
  549. package/dist/registries/packageRegistry.js.map +0 -1
  550. package/dist/registries/runtimeAdapterRegistry.js +0 -315
  551. package/dist/registries/runtimeAdapterRegistry.js.map +0 -1
  552. package/dist/setup/codex.js +0 -1056
  553. package/dist/setup/codex.js.map +0 -1
  554. package/dist/setup/copilot.js +0 -227
  555. package/dist/setup/copilot.js.map +0 -1
  556. package/dist/setup/cursor.js +0 -127
  557. package/dist/setup/cursor.js.map +0 -1
  558. package/dist/setup/doctor.js +0 -1297
  559. package/dist/setup/doctor.js.map +0 -1
  560. package/dist/setup/smokeChecks.js.map +0 -1
  561. package/dist/state/installRoot.js.map +0 -1
  562. package/dist/state/progressCommit.js +0 -289
  563. package/dist/state/progressCommit.js.map +0 -1
  564. package/dist/state/startupAnalysis.js.map +0 -1
  565. package/dist/upgrade/appModel.js.map +0 -1
  566. package/dist/upgrade/channels.js.map +0 -1
  567. package/dist/upgrade/compatibility.js.map +0 -1
  568. package/dist/upgrade/doctor.js.map +0 -1
  569. package/dist/upgrade/migrateArtifactsV1ToV2.js +0 -571
  570. package/dist/upgrade/migrateArtifactsV1ToV2.js.map +0 -1
  571. package/dist/upgrade/migrateArtifactsV2ToV3.js.map +0 -1
  572. package/dist/upgrade/projectIntegration.js.map +0 -1
  573. package/dist/upgrade/runtimeMigration.js.map +0 -1
  574. package/dist/upgrade/upgradeCommands.js.map +0 -1
  575. package/dist/upgrade/upgradeOrchestrator.js.map +0 -1
  576. package/dist/upgrade/versionResolution.js.map +0 -1
  577. package/dist/validate/appHomeContract.js.map +0 -1
  578. package/dist/validate/capability.js.map +0 -1
  579. package/dist/validate/crossCapability.js.map +0 -1
  580. package/dist/validate/lifecycleAdapters.js +0 -772
  581. package/dist/validate/lifecycleAdapters.js.map +0 -1
  582. package/dist/validate/selfAudit.js.map +0 -1
  583. /package/bundle/skills/agentera/capabilities/{dokumentera → document}/schemas/exit.yaml +0 -0
  584. /package/bundle/skills/agentera/capabilities/{inspirera → research}/schemas/exit.yaml +0 -0
  585. /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
+ // ===========================================================================