agentera 3.0.0-dev.7 → 3.0.0-dev.74

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 (763) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +229 -22
  3. package/bundle/.agentera-build-source.json +8 -0
  4. package/bundle/CHANGELOG.md +1361 -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 +252 -0
  9. package/bundle/extract-corpus-parity.json +2 -4
  10. package/bundle/fixtures/routing/hybrid-corpus.yaml +154 -0
  11. package/bundle/references/adapters/package-publication.json +484 -0
  12. package/bundle/references/adapters/package-registry.yaml +439 -188
  13. package/bundle/references/adapters/package-surface-characterization.md +68 -34
  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 +559 -0
  19. package/bundle/references/analysis/personal-glossary-evaluation-authority.yaml +175 -0
  20. package/bundle/references/analysis/personal-glossary-evaluation-corpus.yaml +291 -0
  21. package/bundle/references/analysis/personal-glossary-holdout.yaml +192 -0
  22. package/bundle/references/analysis/verification-policy.yaml +266 -0
  23. package/bundle/references/artifacts/artifact-registry-interface-model.yaml +17 -8
  24. package/bundle/references/artifacts/glossary-entry-contract.yaml +2752 -0
  25. package/bundle/references/artifacts/state-storage-authority.yaml +3061 -0
  26. package/bundle/references/artifacts/verbosity-budget-authority.yaml +42 -0
  27. package/bundle/references/cli/app-lifecycle-vocabulary.yaml +3 -4
  28. package/bundle/references/cli/capability-instruction-contract.yaml +11 -14
  29. package/bundle/references/cli/hybrid-route-contract.yaml +438 -0
  30. package/bundle/references/cli/routing-model.md +152 -93
  31. package/bundle/references/cli/trigger-schema-enrichment.md +57 -46
  32. package/bundle/references/cli/update-channels.yaml +6 -4
  33. package/bundle/references/cli/vocabulary-index.yaml +5 -7
  34. package/bundle/references/cli/vocabulary.md +52 -94
  35. package/bundle/references/meta/retained-reference-authority.yaml +166 -0
  36. package/bundle/skills/agentera/SKILL.md +183 -63
  37. package/bundle/skills/agentera/capabilities/audit/schemas/artifacts.yaml +27 -19
  38. package/bundle/skills/agentera/capabilities/audit/schemas/exit.yaml +2 -2
  39. package/bundle/skills/agentera/capabilities/audit/schemas/triggers.yaml +13 -35
  40. package/bundle/skills/agentera/capabilities/audit/schemas/validation.yaml +30 -11
  41. package/bundle/skills/agentera/capabilities/build/schemas/artifacts.yaml +44 -21
  42. package/bundle/skills/agentera/capabilities/build/schemas/exit.yaml +8 -6
  43. package/bundle/skills/agentera/capabilities/build/schemas/triggers.yaml +14 -36
  44. package/bundle/skills/agentera/capabilities/build/schemas/validation.yaml +95 -21
  45. package/bundle/skills/agentera/capabilities/design/schemas/artifacts.yaml +6 -6
  46. package/bundle/skills/agentera/capabilities/design/schemas/exit.yaml +5 -5
  47. package/bundle/skills/agentera/capabilities/design/schemas/triggers.yaml +5 -34
  48. package/bundle/skills/agentera/capabilities/design/schemas/validation.yaml +2 -2
  49. package/bundle/skills/agentera/capabilities/discuss/schemas/artifacts.yaml +17 -13
  50. package/bundle/skills/agentera/capabilities/discuss/schemas/exit.yaml +2 -2
  51. package/bundle/skills/agentera/capabilities/discuss/schemas/triggers.yaml +6 -40
  52. package/bundle/skills/agentera/capabilities/discuss/schemas/validation.yaml +72 -5
  53. package/bundle/skills/agentera/capabilities/document/schemas/artifacts.yaml +24 -17
  54. package/bundle/skills/agentera/capabilities/document/schemas/triggers.yaml +5 -35
  55. package/bundle/skills/agentera/capabilities/document/schemas/validation.yaml +13 -13
  56. package/bundle/skills/agentera/capabilities/optimize/schemas/artifacts.yaml +10 -10
  57. package/bundle/skills/agentera/capabilities/optimize/schemas/exit.yaml +2 -2
  58. package/bundle/skills/agentera/capabilities/optimize/schemas/triggers.yaml +4 -35
  59. package/bundle/skills/agentera/capabilities/optimize/schemas/validation.yaml +3 -3
  60. package/bundle/skills/agentera/capabilities/orchestrate/schemas/artifacts.yaml +34 -22
  61. package/bundle/skills/agentera/capabilities/orchestrate/schemas/exit.yaml +9 -7
  62. package/bundle/skills/agentera/capabilities/orchestrate/schemas/triggers.yaml +5 -37
  63. package/bundle/skills/agentera/capabilities/orchestrate/schemas/validation.yaml +38 -37
  64. package/bundle/skills/agentera/capabilities/plan/schemas/artifacts.yaml +20 -16
  65. package/bundle/skills/agentera/capabilities/plan/schemas/triggers.yaml +8 -31
  66. package/bundle/skills/agentera/capabilities/plan/schemas/validation.yaml +66 -6
  67. package/bundle/skills/agentera/capabilities/profile/schemas/artifacts.yaml +13 -4
  68. package/bundle/skills/agentera/capabilities/profile/schemas/exit.yaml +8 -5
  69. package/bundle/skills/agentera/capabilities/profile/schemas/triggers.yaml +8 -37
  70. package/bundle/skills/agentera/capabilities/profile/schemas/validation.yaml +67 -3
  71. package/bundle/skills/agentera/capabilities/research/schemas/artifacts.yaml +6 -6
  72. package/bundle/skills/agentera/capabilities/research/schemas/triggers.yaml +5 -29
  73. package/bundle/skills/agentera/capabilities/status/schemas/artifacts.yaml +13 -12
  74. package/bundle/skills/agentera/capabilities/status/schemas/triggers.yaml +7 -49
  75. package/bundle/skills/agentera/capabilities/vision/schemas/artifacts.yaml +8 -8
  76. package/bundle/skills/agentera/capabilities/vision/schemas/exit.yaml +7 -6
  77. package/bundle/skills/agentera/capabilities/vision/schemas/triggers.yaml +7 -39
  78. package/bundle/skills/agentera/capabilities/vision/schemas/validation.yaml +14 -16
  79. package/bundle/skills/agentera/capability_schema_contract.yaml +32 -32
  80. package/bundle/skills/agentera/protocol.yaml +4 -4
  81. package/bundle/skills/agentera/route-phrases.yaml +81 -0
  82. package/bundle/skills/agentera/schemas/artifacts/changelog.yaml +1 -0
  83. package/bundle/skills/agentera/schemas/artifacts/decisions.yaml +30 -12
  84. package/bundle/skills/agentera/schemas/artifacts/design.yaml +1 -0
  85. package/bundle/skills/agentera/schemas/artifacts/docs.yaml +7 -12
  86. package/bundle/skills/agentera/schemas/artifacts/experiments.yaml +140 -9
  87. package/bundle/skills/agentera/schemas/artifacts/glossary.yaml +87 -0
  88. package/bundle/skills/agentera/schemas/artifacts/health.yaml +56 -19
  89. package/bundle/skills/agentera/schemas/artifacts/objective.yaml +18 -4
  90. package/bundle/skills/agentera/schemas/artifacts/plan.yaml +464 -32
  91. package/bundle/skills/agentera/schemas/artifacts/progress.yaml +131 -18
  92. package/bundle/skills/agentera/schemas/artifacts/todo.yaml +302 -7
  93. package/dist/.agentera-build-source.json +8 -0
  94. package/dist/analytics/extractCorpus/cli.js +52 -11
  95. package/dist/analytics/extractCorpus/copilotSessions.js +19 -8
  96. package/dist/analytics/extractCorpus/core.js +262 -14
  97. package/dist/analytics/extractCorpus/corpus.js +57 -18
  98. package/dist/analytics/extractCorpus/coverageAudit.js +44 -45
  99. package/dist/analytics/extractCorpus/cursorSessions.js +28 -8
  100. package/dist/analytics/extractCorpus/evidenceTiers.js +709 -0
  101. package/dist/analytics/extractCorpus/extractCorpusParity.js +4 -4
  102. package/dist/analytics/extractCorpus/filesystemSources.js +5 -5
  103. package/dist/analytics/extractCorpus/index.js +4 -2
  104. package/dist/analytics/extractCorpus/jsonlSessions.js +76 -8
  105. package/dist/analytics/extractCorpus/sqliteCaps.js +0 -1
  106. package/dist/analytics/extractCorpus/sqliteSessions.js +12 -4
  107. package/dist/analytics/extractCorpus/tierReader.js +108 -0
  108. package/dist/analytics/extractCorpus.js +0 -1
  109. package/dist/analytics/glossaryAdviceResolution.js +166 -0
  110. package/dist/analytics/glossaryInputAcquisition.js +319 -0
  111. package/dist/analytics/personalGlossaryAdmission.js +113 -0
  112. package/dist/analytics/personalGlossaryCandidateProjection.js +692 -0
  113. package/dist/analytics/personalGlossaryCandidateProjectionExcerpts.js +144 -0
  114. package/dist/analytics/personalGlossaryCandidateReadView.js +23 -0
  115. package/dist/analytics/personalGlossaryCurrentGeneration.js +25 -0
  116. package/dist/analytics/personalGlossaryDecision.js +203 -0
  117. package/dist/analytics/personalGlossaryExplicit.js +788 -0
  118. package/dist/analytics/personalGlossaryExplicitMining.js +285 -0
  119. package/dist/analytics/personalGlossaryExplicitScope.js +41 -0
  120. package/dist/analytics/personalGlossaryExplicitSegments.js +418 -0
  121. package/dist/analytics/personalGlossaryExplicitTypes.js +26 -0
  122. package/dist/analytics/personalGlossaryLexicalClassifier.js +175 -0
  123. package/dist/analytics/personalGlossaryProfile.js +229 -0
  124. package/dist/analytics/personalGlossaryRecurrence.js +618 -0
  125. package/dist/analytics/personalGlossaryReviewRecordStorage.js +428 -0
  126. package/dist/analytics/personalGlossaryReviewRecords.js +332 -0
  127. package/dist/analytics/profileSignals.js +211 -0
  128. package/dist/analytics/usageStats.js +150 -23
  129. package/dist/audit/terminologyDrift.js +281 -0
  130. package/dist/bin/agentera.js +3 -2
  131. package/dist/capabilities/audit/instructions.js +16 -6
  132. package/dist/capabilities/build/instructions.js +59 -6
  133. package/dist/capabilities/design/instructions.js +3 -4
  134. package/dist/capabilities/discuss/instructions.js +29 -6
  135. package/dist/capabilities/document/instructions.js +11 -6
  136. package/dist/capabilities/index.js +20 -14
  137. package/dist/capabilities/optimize/instructions.js +14 -6
  138. package/dist/capabilities/orchestrate/instructions.js +42 -6
  139. package/dist/capabilities/plan/instructions.js +30 -3
  140. package/dist/capabilities/profile/instructions.js +104 -5
  141. package/dist/capabilities/research/instructions.js +4 -5
  142. package/dist/capabilities/status/instructions.js +15 -6
  143. package/dist/capabilities/status/startupInstructions.js +34 -0
  144. package/dist/capabilities/vision/instructions.js +3 -5
  145. package/dist/cli/appContext.js +14 -7
  146. package/dist/cli/argvalidate.js +0 -1
  147. package/dist/cli/capabilityContext/benchmark.js +5 -4
  148. package/dist/cli/capabilityContext/bespoke.js +14 -6
  149. package/dist/cli/capabilityContext/build.js +116 -42
  150. package/dist/cli/capabilityContext/closeout.js +30 -27
  151. package/dist/cli/capabilityContext/contract.js +18 -27
  152. package/dist/cli/capabilityContext/evidence.js +84 -77
  153. package/dist/cli/capabilityContext/index.js +0 -1
  154. package/dist/cli/capabilityContext/orchestration.js +42 -18
  155. package/dist/cli/capabilityContext/planState.js +89 -96
  156. package/dist/cli/capabilityContext/progress.js +51 -12
  157. package/dist/cli/capabilityContext/projectVerification.js +409 -0
  158. package/dist/cli/capabilityContext/shared.js +9 -20
  159. package/dist/cli/capabilityContext/slim.js +52 -8
  160. package/dist/cli/capabilityContext/startup.js +51 -114
  161. package/dist/cli/capabilityContext/startupAggregation.js +68 -0
  162. package/dist/cli/capabilityContext/types.js +26 -10
  163. package/dist/cli/capabilityContext.js +0 -1
  164. package/dist/cli/commands/appHome.js +0 -1
  165. package/dist/cli/commands/capability.js +2 -2
  166. package/dist/cli/commands/compact.js +163 -13
  167. package/dist/cli/commands/doctor.js +117 -11
  168. package/dist/cli/commands/durability.js +81 -0
  169. package/dist/cli/commands/glossaryAdvice.js +138 -0
  170. package/dist/cli/commands/lint.js +22 -8
  171. package/dist/cli/commands/personalGlossaryCandidateReads.js +744 -0
  172. package/dist/cli/commands/personalGlossaryDecision.js +349 -0
  173. package/dist/cli/commands/personalGlossaryPublish.js +484 -0
  174. package/dist/cli/commands/personalGlossaryReviewRecordReads.js +209 -0
  175. package/dist/cli/commands/personalGlossaryReviewRecords.js +623 -0
  176. package/dist/cli/commands/prime/briefOrientation.js +845 -0
  177. package/dist/cli/commands/prime/buildExecutionRequest.js +165 -0
  178. package/dist/cli/commands/prime/bundleStatus.js +54 -4
  179. package/dist/cli/commands/prime/collectEntityOrientation.js +326 -0
  180. package/dist/cli/commands/prime/collectOrientationState.js +126 -63
  181. package/dist/cli/commands/prime/orientationOutput.js +267 -56
  182. package/dist/cli/commands/prime/types.js +0 -1
  183. package/dist/cli/commands/prime/v1Migration.js +0 -1
  184. package/dist/cli/commands/prime.js +76 -11
  185. package/dist/cli/commands/profileGrounding.js +55 -0
  186. package/dist/cli/commands/query.js +74 -52
  187. package/dist/cli/commands/report.js +91 -21
  188. package/dist/cli/commands/route.js +142 -0
  189. package/dist/cli/commands/schema.js +436 -138
  190. package/dist/cli/commands/state/decisions.js +40 -56
  191. package/dist/cli/commands/state/docs.js +58 -85
  192. package/dist/cli/commands/state/experimentRecords.js +151 -0
  193. package/dist/cli/commands/state/experiments.js +11 -65
  194. package/dist/cli/commands/state/get.js +129 -0
  195. package/dist/cli/commands/state/health.js +11 -113
  196. package/dist/cli/commands/state/index.js +6 -41
  197. package/dist/cli/commands/state/list.js +194 -0
  198. package/dist/cli/commands/state/objective.js +21 -65
  199. package/dist/cli/commands/state/plan.js +11 -170
  200. package/dist/cli/commands/state/planTasks.js +154 -0
  201. package/dist/cli/commands/state/plans.js +154 -0
  202. package/dist/cli/commands/state/progress.js +11 -45
  203. package/dist/cli/commands/state/shared.js +0 -1
  204. package/dist/cli/commands/state/todo.js +28 -107
  205. package/dist/cli/commands/state/write.js +433 -0
  206. package/dist/cli/commands/upgrade.js +146 -5
  207. package/dist/cli/commands/upgradeVerify.js +118 -0
  208. package/dist/cli/commands/validate.js +235 -136
  209. package/dist/cli/commands/verify.js +73 -16
  210. package/dist/cli/contracts/bundleStatus.js +0 -1
  211. package/dist/cli/contracts/orientationState.js +0 -1
  212. package/dist/cli/dispatch/argvParser.js +0 -1
  213. package/dist/cli/dispatch/check.js +84 -40
  214. package/dist/cli/dispatch/commands.js +3 -3
  215. package/dist/cli/dispatch/index.js +77 -52
  216. package/dist/cli/dispatch/lifecycle.js +162 -62
  217. package/dist/cli/dispatch/prime.js +37 -2
  218. package/dist/cli/dispatch/projections.js +17 -0
  219. package/dist/cli/dispatch/shared.js +1 -2
  220. package/dist/cli/dispatch/state.js +62 -66
  221. package/dist/cli/dispatch.js +0 -1
  222. package/dist/cli/errors.js +16 -17
  223. package/dist/cli/help.js +404 -39
  224. package/dist/cli/migrationRequired.js +125 -0
  225. package/dist/cli/orientation/attention.js +19 -19
  226. package/dist/cli/orientation/corpusCoverage.js +32 -1
  227. package/dist/cli/orientation.js +346 -129
  228. package/dist/cli/planArtifacts.js +350 -0
  229. package/dist/cli/planEvidence.js +157 -0
  230. package/dist/cli/planLifecycleState.js +36 -0
  231. package/dist/cli/planTaskIndex.js +11 -0
  232. package/dist/cli/preCutoverCommand.js +32 -0
  233. package/dist/cli/prime-blob.js +71 -3
  234. package/dist/cli/profileAcquisition.js +167 -0
  235. package/dist/cli/startupCompletenessContract.js +11 -8
  236. package/dist/cli/stateQuery.js +47 -12
  237. package/dist/cli/structured.js +0 -1
  238. package/dist/cli/todoMarkdown.js +25 -12
  239. package/dist/cli/todoReadinessSelection.js +192 -0
  240. package/dist/cli/todoSeverity.js +0 -1
  241. package/dist/core/atomicWriter.js +23 -0
  242. package/dist/core/developmentChannel.js +1 -0
  243. package/dist/core/developmentInvocation.js +377 -0
  244. package/dist/core/difflib.js +0 -1
  245. package/dist/core/envPaths.js +0 -1
  246. package/dist/core/jsonValue.js +0 -1
  247. package/dist/core/paths.js +0 -1
  248. package/dist/core/pyjson.js +0 -1
  249. package/dist/core/shell.js +4 -0
  250. package/dist/core/skillIdentity.js +23 -0
  251. package/dist/core/sourceRoot.js +9 -12
  252. package/dist/core/text.js +10 -0
  253. package/dist/core/toml.js +0 -1
  254. package/dist/core/yaml.js +61 -2
  255. package/dist/eval/evalSkills.js +13 -14
  256. package/dist/eval/glossaryEvaluation.js +751 -0
  257. package/dist/eval/glossaryEvaluationProcess.js +29 -0
  258. package/dist/eval/glossaryEvaluationRunner.js +571 -0
  259. package/dist/eval/glossaryEvaluationSuccessReport.js +297 -0
  260. package/dist/eval/hybridRouteEvaluation.js +155 -0
  261. package/dist/eval/semanticEval.js +0 -1
  262. package/dist/eval/semanticFixtures.js +0 -1
  263. package/dist/hooks/common.js +3 -56
  264. package/dist/hooks/compaction/apply.js +224 -47
  265. package/dist/hooks/compaction/dryRun.js +2 -1
  266. package/dist/hooks/compaction/index.js +5 -6
  267. package/dist/hooks/compaction/parse.js +73 -6
  268. package/dist/hooks/compaction/retention.js +28 -25
  269. package/dist/hooks/compaction/status.js +145 -26
  270. package/dist/hooks/compaction/types.js +0 -1
  271. package/dist/hooks/validateArtifact/agentFacing.js +0 -1
  272. package/dist/hooks/validateArtifact/index.js +6 -65
  273. package/dist/hooks/validateArtifact/markdown.js +9 -10
  274. package/dist/hooks/validateArtifact/schema.js +96 -9
  275. package/dist/hooks/validateArtifact/traversal.js +12 -11
  276. package/dist/hooks/validateArtifact/violations.js +5 -3
  277. package/dist/migrate/v2HandoffManifest.js +8 -3
  278. package/dist/registries/activationContract.js +2 -0
  279. package/dist/registries/activationTuples.js +136 -0
  280. package/dist/registries/artifactProtocolIds.js +2 -1
  281. package/dist/registries/artifactRegistry.js +207 -60
  282. package/dist/registries/artifactSchemaProjection.js +45 -0
  283. package/dist/registries/capabilityContract.js +5 -21
  284. package/dist/registries/evaluatorHandoffContract.js +0 -1
  285. package/dist/registries/evidenceTierContract.js +375 -0
  286. package/dist/registries/explicitSegmentGrammarContract.js +619 -0
  287. package/dist/registries/glossaryAdviceContract.js +79 -0
  288. package/dist/registries/glossaryCandidateContractPaths.js +6 -0
  289. package/dist/registries/glossaryCandidateContracts.js +820 -0
  290. package/dist/registries/glossaryCandidateDecisionAuthority.js +119 -0
  291. package/dist/registries/glossaryCandidateDecisionContract.js +62 -0
  292. package/dist/registries/glossaryCandidateProjectionAuthority.js +197 -0
  293. package/dist/registries/glossaryCandidateProjectionContract.js +104 -0
  294. package/dist/registries/glossaryCaveatContract.js +67 -0
  295. package/dist/registries/glossaryConsumerContractValidation.js +787 -0
  296. package/dist/registries/glossaryEntryContract.js +759 -0
  297. package/dist/registries/glossaryEntryTemporal.js +12 -0
  298. package/dist/registries/glossaryMiningAuthority.js +764 -0
  299. package/dist/registries/glossaryProfileFullContract.js +24 -0
  300. package/dist/registries/glossaryReviewRecordsAuthority.js +426 -0
  301. package/dist/registries/glossaryReviewRecordsContract.js +129 -0
  302. package/dist/registries/glossaryTermIdentity.js +139 -0
  303. package/dist/registries/glossaryTermOccurrence.js +20 -0
  304. package/dist/registries/hybridRoute.js +274 -0
  305. package/dist/registries/hybridRouteReceipt.js +221 -0
  306. package/dist/registries/packagePublication.js +273 -0
  307. package/dist/registries/packageRegistry.js +184 -209
  308. package/dist/registries/personalGlossaryContracts.js +1 -0
  309. package/dist/registries/todoReadinessContract.js +448 -0
  310. package/dist/registries/triggerLoader.js +7 -44
  311. package/dist/registries/verbosityBudgetContract.js +205 -0
  312. package/dist/release/releaseMetadata.js +167 -10
  313. package/dist/runtime/lifecycleAdapterContract.js +457 -0
  314. package/dist/runtime/lifecycleAdapters.js +777 -0
  315. package/dist/runtime/lifecycleAuthority.js +453 -0
  316. package/dist/runtime/lifecycleOperationContract.js +123 -0
  317. package/dist/runtime/lifecycleOperations.js +634 -0
  318. package/dist/runtime/lifecycleOwnershipJournal.js +622 -0
  319. package/dist/runtime/lifecyclePublication.js +415 -0
  320. package/dist/runtime/lifecycleSnapshot.js +438 -0
  321. package/dist/runtime/nativeResourceCleanup.js +502 -0
  322. package/dist/setup/opencode.js +20 -13
  323. package/dist/setup/opencodeConstants.js +1 -0
  324. package/dist/setup/sharedSkill.js +45 -0
  325. package/dist/setup/smokeChecks.js +14 -75
  326. package/dist/state/archiveDiscovery.js +580 -0
  327. package/dist/state/archivePublication.js +225 -0
  328. package/dist/state/archiveRecovery.js +237 -0
  329. package/dist/state/archiveReplay.js +53 -0
  330. package/dist/state/canonicalMigrationRecord.js +36 -0
  331. package/dist/state/changelog.js +221 -0
  332. package/dist/state/decisionEntities.js +367 -0
  333. package/dist/state/decisionLegacyValidation.js +215 -0
  334. package/dist/state/decisionMigrationProvenance.js +199 -0
  335. package/dist/state/decisionOverlay.js +254 -0
  336. package/dist/state/decisionRevision.js +256 -0
  337. package/dist/state/decisionRevisionMigration.js +89 -0
  338. package/dist/state/directRetrieval.js +323 -0
  339. package/dist/state/durability.js +324 -0
  340. package/dist/state/entityCutover.js +459 -0
  341. package/dist/state/entityCutoverGit.js +127 -0
  342. package/dist/state/entityGlossaryAuthority.js +13 -0
  343. package/dist/state/entityListProjection.js +187 -0
  344. package/dist/state/entityListRuntimeRegistry.js +85 -0
  345. package/dist/state/entityMigrationCausality.js +97 -0
  346. package/dist/state/entityMigrationIdentity.js +5 -0
  347. package/dist/state/entityMigrationPreview.js +840 -0
  348. package/dist/state/entityMigrationTodo.js +133 -0
  349. package/dist/state/entityPublicationContext.js +859 -0
  350. package/dist/state/entityRetrievalHelp.js +506 -0
  351. package/dist/state/entityStorage.js +899 -0
  352. package/dist/state/exactReplacementRecovery.js +18 -0
  353. package/dist/state/experimentArchive.js +63 -0
  354. package/dist/state/experimentIdentity.js +202 -0
  355. package/dist/state/healthEntities.js +262 -0
  356. package/dist/state/healthEntityValidation.js +18 -0
  357. package/dist/state/healthRepair.js +69 -0
  358. package/dist/state/installRoot.js +15 -7
  359. package/dist/state/legacyEntityCutoverEvidence.js +65 -0
  360. package/dist/state/legacyIdentity.js +47 -0
  361. package/dist/state/legacySummaryRecord.js +6 -0
  362. package/dist/state/listAccounting.js +54 -0
  363. package/dist/state/listClassification.js +17 -0
  364. package/dist/state/listCursor.js +42 -0
  365. package/dist/state/listRetrieval.js +781 -0
  366. package/dist/state/migrationSourceBinding.js +30 -0
  367. package/dist/state/objectiveExperimentEntities.js +322 -0
  368. package/dist/state/planEntities.js +1027 -0
  369. package/dist/state/planIdentity.js +47 -0
  370. package/dist/state/planLineageValidation.js +52 -0
  371. package/dist/state/planReplacementTransaction.js +475 -0
  372. package/dist/state/planRetrieval.js +313 -0
  373. package/dist/state/planTaskRetrieval.js +294 -0
  374. package/dist/state/progressEntities.js +512 -0
  375. package/dist/state/progressGlossaryCaveat.js +168 -0
  376. package/dist/state/progressPublicationOrder.js +19 -0
  377. package/dist/state/progressWritePolicy.js +33 -0
  378. package/dist/state/projectRoot.js +62 -0
  379. package/dist/state/projectionPolicy.js +190 -0
  380. package/dist/state/retrievalAuthority.js +156 -0
  381. package/dist/state/safeProjectFile.js +155 -0
  382. package/dist/state/startupAnalysis/benchmark.js +70 -9
  383. package/dist/state/startupAnalysis/contract.js +44 -10
  384. package/dist/state/startupAnalysis/helpers.js +1 -2
  385. package/dist/state/startupAnalysis/index.js +0 -1
  386. package/dist/state/startupAnalysis/metrics.js +0 -1
  387. package/dist/state/startupAnalysis/records.js +0 -1
  388. package/dist/state/startupAnalysis/report.js +0 -1
  389. package/dist/state/startupAnalysis/threshold.js +13 -1
  390. package/dist/state/startupAnalysis.js +0 -1
  391. package/dist/state/startupProjection.js +499 -0
  392. package/dist/state/stateMode.js +222 -0
  393. package/dist/state/stateStorageAuthority.js +47 -0
  394. package/dist/state/summaryEntityRead.js +25 -0
  395. package/dist/state/summaryMigrationProvenance.js +66 -0
  396. package/dist/state/summarySourceRowAuthority.js +36 -0
  397. package/dist/state/todoActivationSafety.js +58 -0
  398. package/dist/state/todoDocsEntities.js +1124 -0
  399. package/dist/state/todoDocsEntityValidation.js +158 -0
  400. package/dist/state/todoMarkdownProjection.js +51 -0
  401. package/dist/state/todoReconciliationActivation.js +182 -0
  402. package/dist/state/todoReconciliationInspection.js +171 -0
  403. package/dist/state/todoReconciliationRepair.js +318 -0
  404. package/dist/state/todoReconciliationTransaction.js +595 -0
  405. package/dist/state/write/assign.js +20 -0
  406. package/dist/state/write/candidateMutation.js +269 -0
  407. package/dist/state/write/errors.js +11 -0
  408. package/dist/state/write/experimentPublication.js +192 -0
  409. package/dist/state/write/explain.js +377 -0
  410. package/dist/state/write/fields.js +61 -0
  411. package/dist/state/write/glossaryPublication.js +263 -0
  412. package/dist/state/write/grammar.js +285 -0
  413. package/dist/state/write/helpers.js +29 -0
  414. package/dist/state/write/index.js +12 -0
  415. package/dist/state/write/input.js +391 -0
  416. package/dist/state/write/lock.js +837 -0
  417. package/dist/state/write/mutation.js +234 -0
  418. package/dist/state/write/operations.js +170 -0
  419. package/dist/state/write/planEvaluation.js +128 -0
  420. package/dist/state/write/planPublication.js +179 -0
  421. package/dist/state/write/runtimeOperations.js +146 -0
  422. package/dist/state/write/serialize.js +1 -0
  423. package/dist/state/write/transaction.js +57 -0
  424. package/dist/state/write/validate.js +7 -0
  425. package/dist/upgrade/appContentRefresh.js +77 -36
  426. package/dist/upgrade/appModel.js +0 -1
  427. package/dist/upgrade/atomicWriter.js +1 -0
  428. package/dist/upgrade/bundleEvidence.js +0 -1
  429. package/dist/upgrade/channels.js +6 -9
  430. package/dist/upgrade/compatibility.js +43 -17
  431. package/dist/upgrade/doctor.js +55 -32
  432. package/dist/upgrade/doctorClassifier.js +11 -1
  433. package/dist/upgrade/installedHooksRetirement.js +46 -40
  434. package/dist/upgrade/legacyAgentCleanup.js +187 -21
  435. package/dist/upgrade/lifecycleUpgrade.js +113 -0
  436. package/dist/upgrade/migrateArtifactsV2ToV3.js +334 -64
  437. package/dist/upgrade/migrationPublication.js +122 -0
  438. package/dist/upgrade/nextMajorDoctor.js +0 -1
  439. package/dist/upgrade/npxPlatformStatus.js +2 -2
  440. package/dist/upgrade/projectIntegration.js +128 -160
  441. package/dist/upgrade/projectIntegrationDecision.js +42 -85
  442. package/dist/upgrade/retiredResourceDiagnostics.js +117 -0
  443. package/dist/upgrade/runtimeMigration.js +262 -453
  444. package/dist/upgrade/upgradeCommands.js +14 -1
  445. package/dist/upgrade/upgradeLock.js +85 -0
  446. package/dist/upgrade/upgradeOrchestrator.js +263 -59
  447. package/dist/upgrade/v3CapabilitySurface.js +2 -3
  448. package/dist/upgrade/versionResolution.js +0 -1
  449. package/dist/validate/activationArtifactEvidence.js +866 -0
  450. package/dist/validate/activationArtifactEvidenceTypes.js +12 -0
  451. package/dist/validate/activationConjunction.js +816 -0
  452. package/dist/validate/activationEvidenceManifest.js +610 -0
  453. package/dist/validate/activationPackageSemantics.js +29 -0
  454. package/dist/validate/appHomeContract.js +1 -7
  455. package/dist/validate/bootstrapAuthority.js +44 -0
  456. package/dist/validate/capability.js +11 -3
  457. package/dist/validate/crossCapability.js +14 -9
  458. package/dist/validate/retainedReferenceAuthority.js +879 -0
  459. package/dist/validate/selfAudit.js +39 -45
  460. package/dist/validate/v1LegacyCruft.js +131 -0
  461. package/dist/validate/vocabularyAuthority.js +8 -8
  462. package/package.json +39 -13
  463. package/bundle/references/adapters/cursor.md +0 -214
  464. package/bundle/references/adapters/opencode.md +0 -530
  465. package/bundle/references/adapters/package-manifest-interface-model.yaml +0 -337
  466. package/bundle/references/adapters/runtime-adapter-characterization.md +0 -79
  467. package/bundle/references/adapters/runtime-adapter-interface-model.yaml +0 -200
  468. package/bundle/references/adapters/runtime-adapter-registry.yaml +0 -554
  469. package/bundle/references/adapters/runtime-feature-parity.md +0 -189
  470. package/bundle/references/analysis/benchmark.md +0 -267
  471. package/bundle/references/analysis/startup-measurement-contract.yaml +0 -424
  472. package/bundle/references/cli/agent-ready-state-contract.yaml +0 -953
  473. package/bundle/references/cli/audience-namespace-cli-migration.yaml +0 -369
  474. package/bundle/references/cli/bundle-skill-vocabulary.yaml +0 -250
  475. package/bundle/references/cli/capability-tool-classification.yaml +0 -53
  476. package/bundle/references/cli/coexistence-probe.yaml +0 -13
  477. package/bundle/references/cli/parity-expected-actual-template.md +0 -30
  478. package/bundle/references/cli/routing-execution-vocabulary.yaml +0 -281
  479. package/bundle/references/cli/single-name-protocol.yaml +0 -42
  480. package/bundle/references/cli/upgrade-repair-wording.md +0 -45
  481. package/bundle/references/cli/v3-handoff-manifest.schema.yaml +0 -98
  482. package/bundle/references/meta/documentation-inventory.md +0 -49
  483. package/bundle/skills/agentera/.claude-plugin/plugin.json +0 -27
  484. package/bundle/skills/agentera/agents/audit.toml +0 -6
  485. package/bundle/skills/agentera/agents/build.toml +0 -6
  486. package/bundle/skills/agentera/agents/design.toml +0 -6
  487. package/bundle/skills/agentera/agents/discuss.toml +0 -6
  488. package/bundle/skills/agentera/agents/document.toml +0 -6
  489. package/bundle/skills/agentera/agents/optimize.toml +0 -6
  490. package/bundle/skills/agentera/agents/orchestrate.toml +0 -6
  491. package/bundle/skills/agentera/agents/plan.toml +0 -6
  492. package/bundle/skills/agentera/agents/profile.toml +0 -6
  493. package/bundle/skills/agentera/agents/research.toml +0 -6
  494. package/bundle/skills/agentera/agents/status.toml +0 -6
  495. package/bundle/skills/agentera/agents/vision.toml +0 -6
  496. package/bundle/skills/agentera/references/contract.md +0 -1048
  497. package/dist/analytics/extractCorpus/cli.js.map +0 -1
  498. package/dist/analytics/extractCorpus/copilotSessions.js.map +0 -1
  499. package/dist/analytics/extractCorpus/core.js.map +0 -1
  500. package/dist/analytics/extractCorpus/corpus.js.map +0 -1
  501. package/dist/analytics/extractCorpus/coverageAudit.js.map +0 -1
  502. package/dist/analytics/extractCorpus/cursorSessions.js.map +0 -1
  503. package/dist/analytics/extractCorpus/extractCorpusParity.js.map +0 -1
  504. package/dist/analytics/extractCorpus/filesystemSources.js.map +0 -1
  505. package/dist/analytics/extractCorpus/index.js.map +0 -1
  506. package/dist/analytics/extractCorpus/jsonlSessions.js.map +0 -1
  507. package/dist/analytics/extractCorpus/sqliteCaps.js.map +0 -1
  508. package/dist/analytics/extractCorpus/sqliteSessions.js.map +0 -1
  509. package/dist/analytics/extractCorpus.js.map +0 -1
  510. package/dist/analytics/usageStats.js.map +0 -1
  511. package/dist/bin/agentera.js.map +0 -1
  512. package/dist/capabilities/audit/instructions.js.map +0 -1
  513. package/dist/capabilities/build/instructions.js.map +0 -1
  514. package/dist/capabilities/design/instructions.js.map +0 -1
  515. package/dist/capabilities/discuss/instructions.js.map +0 -1
  516. package/dist/capabilities/document/instructions.js.map +0 -1
  517. package/dist/capabilities/dokumentera/instructions.js +0 -6
  518. package/dist/capabilities/dokumentera/instructions.js.map +0 -1
  519. package/dist/capabilities/hej/instructions.js +0 -6
  520. package/dist/capabilities/hej/instructions.js.map +0 -1
  521. package/dist/capabilities/index.js.map +0 -1
  522. package/dist/capabilities/inspektera/instructions.js +0 -6
  523. package/dist/capabilities/inspektera/instructions.js.map +0 -1
  524. package/dist/capabilities/inspirera/instructions.js +0 -6
  525. package/dist/capabilities/inspirera/instructions.js.map +0 -1
  526. package/dist/capabilities/optimera/instructions.js +0 -6
  527. package/dist/capabilities/optimera/instructions.js.map +0 -1
  528. package/dist/capabilities/optimize/instructions.js.map +0 -1
  529. package/dist/capabilities/orchestrate/instructions.js.map +0 -1
  530. package/dist/capabilities/orkestrera/instructions.js +0 -6
  531. package/dist/capabilities/orkestrera/instructions.js.map +0 -1
  532. package/dist/capabilities/plan/instructions.js.map +0 -1
  533. package/dist/capabilities/planera/instructions.js +0 -6
  534. package/dist/capabilities/planera/instructions.js.map +0 -1
  535. package/dist/capabilities/profile/instructions.js.map +0 -1
  536. package/dist/capabilities/profilera/instructions.js +0 -6
  537. package/dist/capabilities/profilera/instructions.js.map +0 -1
  538. package/dist/capabilities/realisera/instructions.js +0 -6
  539. package/dist/capabilities/realisera/instructions.js.map +0 -1
  540. package/dist/capabilities/research/instructions.js.map +0 -1
  541. package/dist/capabilities/resonera/instructions.js +0 -6
  542. package/dist/capabilities/resonera/instructions.js.map +0 -1
  543. package/dist/capabilities/status/instructions.js.map +0 -1
  544. package/dist/capabilities/vision/instructions.js.map +0 -1
  545. package/dist/capabilities/visionera/instructions.js +0 -6
  546. package/dist/capabilities/visionera/instructions.js.map +0 -1
  547. package/dist/capabilities/visualisera/instructions.js +0 -5
  548. package/dist/capabilities/visualisera/instructions.js.map +0 -1
  549. package/dist/cli/appContext.js.map +0 -1
  550. package/dist/cli/argvalidate.js.map +0 -1
  551. package/dist/cli/capabilityContext/benchmark.js.map +0 -1
  552. package/dist/cli/capabilityContext/bespoke.js.map +0 -1
  553. package/dist/cli/capabilityContext/build.js.map +0 -1
  554. package/dist/cli/capabilityContext/closeout.js.map +0 -1
  555. package/dist/cli/capabilityContext/contract.js.map +0 -1
  556. package/dist/cli/capabilityContext/evidence.js.map +0 -1
  557. package/dist/cli/capabilityContext/index.js.map +0 -1
  558. package/dist/cli/capabilityContext/orchestration.js.map +0 -1
  559. package/dist/cli/capabilityContext/planState.js.map +0 -1
  560. package/dist/cli/capabilityContext/progress.js.map +0 -1
  561. package/dist/cli/capabilityContext/realisera.js +0 -174
  562. package/dist/cli/capabilityContext/realisera.js.map +0 -1
  563. package/dist/cli/capabilityContext/shared.js.map +0 -1
  564. package/dist/cli/capabilityContext/slim.js.map +0 -1
  565. package/dist/cli/capabilityContext/startup.js.map +0 -1
  566. package/dist/cli/capabilityContext/types.js.map +0 -1
  567. package/dist/cli/capabilityContext.js.map +0 -1
  568. package/dist/cli/commands/appHome.js.map +0 -1
  569. package/dist/cli/commands/backfill.js +0 -84
  570. package/dist/cli/commands/backfill.js.map +0 -1
  571. package/dist/cli/commands/capability.js.map +0 -1
  572. package/dist/cli/commands/compact.js.map +0 -1
  573. package/dist/cli/commands/doctor.js.map +0 -1
  574. package/dist/cli/commands/lint.js.map +0 -1
  575. package/dist/cli/commands/prime/bundleStatus.js.map +0 -1
  576. package/dist/cli/commands/prime/collectOrientationState.js.map +0 -1
  577. package/dist/cli/commands/prime/orientationOutput.js.map +0 -1
  578. package/dist/cli/commands/prime/routeOutput.js +0 -50
  579. package/dist/cli/commands/prime/routeOutput.js.map +0 -1
  580. package/dist/cli/commands/prime/types.js.map +0 -1
  581. package/dist/cli/commands/prime/v1Migration.js.map +0 -1
  582. package/dist/cli/commands/prime.js.map +0 -1
  583. package/dist/cli/commands/query.js.map +0 -1
  584. package/dist/cli/commands/report.js.map +0 -1
  585. package/dist/cli/commands/schema.js.map +0 -1
  586. package/dist/cli/commands/state/decisions.js.map +0 -1
  587. package/dist/cli/commands/state/docs.js.map +0 -1
  588. package/dist/cli/commands/state/experiments.js.map +0 -1
  589. package/dist/cli/commands/state/health.js.map +0 -1
  590. package/dist/cli/commands/state/index.js.map +0 -1
  591. package/dist/cli/commands/state/objective.js.map +0 -1
  592. package/dist/cli/commands/state/plan.js.map +0 -1
  593. package/dist/cli/commands/state/progress.js.map +0 -1
  594. package/dist/cli/commands/state/shared.js.map +0 -1
  595. package/dist/cli/commands/state/todo.js.map +0 -1
  596. package/dist/cli/commands/state.js +0 -1023
  597. package/dist/cli/commands/state.js.map +0 -1
  598. package/dist/cli/commands/upgrade.js.map +0 -1
  599. package/dist/cli/commands/validate.js.map +0 -1
  600. package/dist/cli/commands/verify.js.map +0 -1
  601. package/dist/cli/contracts/bundleStatus.js.map +0 -1
  602. package/dist/cli/contracts/orientationState.js.map +0 -1
  603. package/dist/cli/dispatch/argvParser.js.map +0 -1
  604. package/dist/cli/dispatch/check.js.map +0 -1
  605. package/dist/cli/dispatch/commands.js.map +0 -1
  606. package/dist/cli/dispatch/index.js.map +0 -1
  607. package/dist/cli/dispatch/lifecycle.js.map +0 -1
  608. package/dist/cli/dispatch/prime.js.map +0 -1
  609. package/dist/cli/dispatch/shared.js.map +0 -1
  610. package/dist/cli/dispatch/state.js.map +0 -1
  611. package/dist/cli/dispatch.js.map +0 -1
  612. package/dist/cli/errors.js.map +0 -1
  613. package/dist/cli/help.js.map +0 -1
  614. package/dist/cli/orientation/attention.js.map +0 -1
  615. package/dist/cli/orientation/corpusCoverage.js.map +0 -1
  616. package/dist/cli/orientation.js.map +0 -1
  617. package/dist/cli/prime-blob.js.map +0 -1
  618. package/dist/cli/startupCompletenessContract.js.map +0 -1
  619. package/dist/cli/stateQuery.js.map +0 -1
  620. package/dist/cli/structured.js.map +0 -1
  621. package/dist/cli/todoMarkdown.js.map +0 -1
  622. package/dist/cli/todoSeverity.js.map +0 -1
  623. package/dist/core/difflib.js.map +0 -1
  624. package/dist/core/envPaths.js.map +0 -1
  625. package/dist/core/git.js +0 -43
  626. package/dist/core/git.js.map +0 -1
  627. package/dist/core/jsonValue.js.map +0 -1
  628. package/dist/core/paths.js.map +0 -1
  629. package/dist/core/pyjson.js.map +0 -1
  630. package/dist/core/sourceRoot.js.map +0 -1
  631. package/dist/core/toml.js.map +0 -1
  632. package/dist/core/yaml.js.map +0 -1
  633. package/dist/eval/evalSkills.js.map +0 -1
  634. package/dist/eval/semanticEval.js.map +0 -1
  635. package/dist/eval/semanticFixtures.js.map +0 -1
  636. package/dist/hooks/common.js.map +0 -1
  637. package/dist/hooks/compaction/apply.js.map +0 -1
  638. package/dist/hooks/compaction/dryRun.js.map +0 -1
  639. package/dist/hooks/compaction/index.js.map +0 -1
  640. package/dist/hooks/compaction/parse.js.map +0 -1
  641. package/dist/hooks/compaction/retention.js.map +0 -1
  642. package/dist/hooks/compaction/status.js.map +0 -1
  643. package/dist/hooks/compaction/todoResolved.js +0 -137
  644. package/dist/hooks/compaction/todoResolved.js.map +0 -1
  645. package/dist/hooks/compaction/types.js.map +0 -1
  646. package/dist/hooks/compaction.js +0 -935
  647. package/dist/hooks/compaction.js.map +0 -1
  648. package/dist/hooks/cursorPreToolUse.js +0 -19
  649. package/dist/hooks/cursorPreToolUse.js.map +0 -1
  650. package/dist/hooks/cursorSessionStart.js +0 -79
  651. package/dist/hooks/cursorSessionStart.js.map +0 -1
  652. package/dist/hooks/sessionStart.js +0 -216
  653. package/dist/hooks/sessionStart.js.map +0 -1
  654. package/dist/hooks/sessionStop.js +0 -206
  655. package/dist/hooks/sessionStop.js.map +0 -1
  656. package/dist/hooks/todoLayout.js +0 -177
  657. package/dist/hooks/todoLayout.js.map +0 -1
  658. package/dist/hooks/validateArtifact/agentFacing.js.map +0 -1
  659. package/dist/hooks/validateArtifact/index.js.map +0 -1
  660. package/dist/hooks/validateArtifact/markdown.js.map +0 -1
  661. package/dist/hooks/validateArtifact/runtime.js +0 -86
  662. package/dist/hooks/validateArtifact/runtime.js.map +0 -1
  663. package/dist/hooks/validateArtifact/schema.js.map +0 -1
  664. package/dist/hooks/validateArtifact/traversal.js.map +0 -1
  665. package/dist/hooks/validateArtifact/violations.js.map +0 -1
  666. package/dist/hooks/validateArtifact.js +0 -924
  667. package/dist/hooks/validateArtifact.js.map +0 -1
  668. package/dist/migrate/v2HandoffManifest.js.map +0 -1
  669. package/dist/registries/artifactProtocolIds.js.map +0 -1
  670. package/dist/registries/artifactRegistry.js.map +0 -1
  671. package/dist/registries/capabilityContract.js.map +0 -1
  672. package/dist/registries/evaluatorHandoffContract.js.map +0 -1
  673. package/dist/registries/packageRegistry.js.map +0 -1
  674. package/dist/registries/runtimeAdapterRegistry.js +0 -316
  675. package/dist/registries/runtimeAdapterRegistry.js.map +0 -1
  676. package/dist/registries/triggerLoader.js.map +0 -1
  677. package/dist/release/releaseMetadata.js.map +0 -1
  678. package/dist/routing/index.js +0 -2
  679. package/dist/routing/index.js.map +0 -1
  680. package/dist/routing/routeEngine.js +0 -189
  681. package/dist/routing/routeEngine.js.map +0 -1
  682. package/dist/setup/codex/agents.js +0 -96
  683. package/dist/setup/codex/agents.js.map +0 -1
  684. package/dist/setup/codex/cli.js +0 -161
  685. package/dist/setup/codex/cli.js.map +0 -1
  686. package/dist/setup/codex/configToml.js +0 -639
  687. package/dist/setup/codex/configToml.js.map +0 -1
  688. package/dist/setup/codex/constants.js +0 -29
  689. package/dist/setup/codex/constants.js.map +0 -1
  690. package/dist/setup/codex/installRoot.js +0 -64
  691. package/dist/setup/codex/installRoot.js.map +0 -1
  692. package/dist/setup/codex/state.js +0 -270
  693. package/dist/setup/codex/state.js.map +0 -1
  694. package/dist/setup/codex.js +0 -12
  695. package/dist/setup/codex.js.map +0 -1
  696. package/dist/setup/copilot.js +0 -227
  697. package/dist/setup/copilot.js.map +0 -1
  698. package/dist/setup/cursor.js +0 -129
  699. package/dist/setup/cursor.js.map +0 -1
  700. package/dist/setup/cursorSurfaces.js +0 -67
  701. package/dist/setup/cursorSurfaces.js.map +0 -1
  702. package/dist/setup/doctor/core.js +0 -300
  703. package/dist/setup/doctor/core.js.map +0 -1
  704. package/dist/setup/doctor/diagnostics.js +0 -240
  705. package/dist/setup/doctor/diagnostics.js.map +0 -1
  706. package/dist/setup/doctor/opencode.js +0 -313
  707. package/dist/setup/doctor/opencode.js.map +0 -1
  708. package/dist/setup/doctor/report.js +0 -425
  709. package/dist/setup/doctor/report.js.map +0 -1
  710. package/dist/setup/doctor.js +0 -10
  711. package/dist/setup/doctor.js.map +0 -1
  712. package/dist/setup/opencode.js.map +0 -1
  713. package/dist/setup/smokeChecks.js.map +0 -1
  714. package/dist/state/installRoot.js.map +0 -1
  715. package/dist/state/progressCommit.js +0 -289
  716. package/dist/state/progressCommit.js.map +0 -1
  717. package/dist/state/startupAnalysis/benchmark.js.map +0 -1
  718. package/dist/state/startupAnalysis/contract.js.map +0 -1
  719. package/dist/state/startupAnalysis/helpers.js.map +0 -1
  720. package/dist/state/startupAnalysis/index.js.map +0 -1
  721. package/dist/state/startupAnalysis/metrics.js.map +0 -1
  722. package/dist/state/startupAnalysis/records.js.map +0 -1
  723. package/dist/state/startupAnalysis/report.js.map +0 -1
  724. package/dist/state/startupAnalysis/threshold.js.map +0 -1
  725. package/dist/state/startupAnalysis.js.map +0 -1
  726. package/dist/upgrade/appContentRefresh.js.map +0 -1
  727. package/dist/upgrade/appModel.js.map +0 -1
  728. package/dist/upgrade/bundleEvidence.js.map +0 -1
  729. package/dist/upgrade/channels.js.map +0 -1
  730. package/dist/upgrade/cliProbe.js +0 -22
  731. package/dist/upgrade/cliProbe.js.map +0 -1
  732. package/dist/upgrade/coexistenceProbe.js +0 -107
  733. package/dist/upgrade/coexistenceProbe.js.map +0 -1
  734. package/dist/upgrade/compatibility.js.map +0 -1
  735. package/dist/upgrade/doctor.js.map +0 -1
  736. package/dist/upgrade/doctorClassifier.js.map +0 -1
  737. package/dist/upgrade/installedHooksRetirement.js.map +0 -1
  738. package/dist/upgrade/legacyAgentCleanup.js.map +0 -1
  739. package/dist/upgrade/migrateArtifactsV1ToV2.js +0 -570
  740. package/dist/upgrade/migrateArtifactsV1ToV2.js.map +0 -1
  741. package/dist/upgrade/migrateArtifactsV2ToV3.js.map +0 -1
  742. package/dist/upgrade/nextMajorDoctor.js.map +0 -1
  743. package/dist/upgrade/npxPlatformStatus.js.map +0 -1
  744. package/dist/upgrade/projectIntegration.js.map +0 -1
  745. package/dist/upgrade/projectIntegrationDecision.js.map +0 -1
  746. package/dist/upgrade/runtimeMigration.js.map +0 -1
  747. package/dist/upgrade/upgradeCommands.js.map +0 -1
  748. package/dist/upgrade/upgradeOrchestrator.js.map +0 -1
  749. package/dist/upgrade/v3CapabilitySurface.js.map +0 -1
  750. package/dist/upgrade/versionResolution.js.map +0 -1
  751. package/dist/validate/appHomeContract.js.map +0 -1
  752. package/dist/validate/capability.js.map +0 -1
  753. package/dist/validate/crossCapability.js.map +0 -1
  754. package/dist/validate/lifecycleAdapters/legacyPythonParity.js +0 -93
  755. package/dist/validate/lifecycleAdapters/legacyPythonParity.js.map +0 -1
  756. package/dist/validate/lifecycleAdapters/nodeFormChecks.js +0 -488
  757. package/dist/validate/lifecycleAdapters/nodeFormChecks.js.map +0 -1
  758. package/dist/validate/lifecycleAdapters/shared.js +0 -198
  759. package/dist/validate/lifecycleAdapters/shared.js.map +0 -1
  760. package/dist/validate/lifecycleAdapters.js +0 -62
  761. package/dist/validate/lifecycleAdapters.js.map +0 -1
  762. package/dist/validate/selfAudit.js.map +0 -1
  763. package/dist/validate/vocabularyAuthority.js.map +0 -1
@@ -0,0 +1,2752 @@
1
+ schema_version: agentera.glossaryEntryContract.v1
2
+ status: active_authority
3
+ purpose: >-
4
+ Define glossary entry semantics once, specialize evidence ownership for
5
+ personal and project entries, and declare one consumer-semantics and caveat
6
+ lifecycle contract with bounded acquisition and shared advice resolution.
7
+ Build, Discuss, Plan, and prime consumption are active. Build alone owns
8
+ durable caveat publication; prime projects only bounded review attention.
9
+
10
+ authority:
11
+ source: references/artifacts/glossary-entry-contract.yaml
12
+ confidence: skills/agentera/protocol.yaml#CONFIDENCE_SCALE
13
+ personal_history: references/analysis/evidence-tier-authority.yaml
14
+ permanence_decay: packages/cli/src/capabilities/profile/instructions.ts#Profile-format
15
+ single_source_rule: >-
16
+ Producers and consumers derive entry shape from shared_primitive and must
17
+ not restate confidence bands, decay constants, or provenance variants.
18
+
19
+ shared_primitive:
20
+ required_fields: [term, meaning, confidence, permanence, temporal, provenance]
21
+ fields:
22
+ term:
23
+ type: non_empty_string
24
+ meaning:
25
+ type: non_empty_string
26
+ confidence:
27
+ type: integer
28
+ range_from: skills/agentera/protocol.yaml#CONFIDENCE_SCALE
29
+ permanence:
30
+ type: enum
31
+ values: [stable, durable, situational]
32
+ classification_rule: >-
33
+ Classify expected persistence independently from evidence strength.
34
+ Confidence changes never reclassify permanence.
35
+ temporal:
36
+ type: object
37
+ required_fields: [observed_at, last_confirmed_at]
38
+ field_type: iso_date
39
+ provenance:
40
+ type: discriminated_union
41
+ discriminator: kind
42
+ evidence_field: evidence
43
+ variants_from: provenance_variants
44
+
45
+ term_occurrence:
46
+ runtime: packages/cli/src/registries/glossaryTermOccurrence.ts#containsGlossaryTerm
47
+ consumers: [audit_evidence, project_publication_revalidation, confirmed_variant_guard]
48
+ comparison: exact_case_sensitive_literal
49
+ normalization: none
50
+ identifier_continuation: unicode_ID_Continue_plus_dollar_ZWNJ_ZWJ
51
+ rule: >-
52
+ Match one escaped literal without case folding or Unicode normalization.
53
+ When a term edge is an identifier-continuation character, reject an
54
+ occurrence adjacent to Unicode ID_Continue, dollar sign, U+200C ZERO WIDTH
55
+ NON-JOINER, or U+200D ZERO WIDTH JOINER. These are the ECMAScript identifier
56
+ continuation characters relevant to source-line terminology boundaries.
57
+ Literal escaping and fixed-width boundary assertions prevent regex syntax,
58
+ partial identifier matches, and input-dependent backtracking.
59
+
60
+ personal_mining_authority:
61
+ status: active_partial
62
+ implementation_boundary: >-
63
+ This section settles personal glossary mining identity, evidence provenance,
64
+ consent, privacy, lifecycle, bounded explicit-discovery, public receipt construction,
65
+ and deterministic decision authority. The runtime performs bounded discovery,
66
+ candidate projection, private candidate retrieval, deterministic CLI
67
+ validation of host semantic evidence, explicit authorized personal
68
+ publication, and Profile Full integration. It does not perform host
69
+ semantic classification, project or public-state candidate reads, or
70
+ project glossary integration.
71
+ preserved_decisions: [prmnztjytv, mcsmqqitnm, zyvgyvjnsv]
72
+ replacement:
73
+ shared_primitive: shared_primitive
74
+ personal_owner: ownership_contracts.personal
75
+ project_owner: ownership_contracts.project
76
+ consumer_precedence: consumer_boundary.primary_selection
77
+ project_publication: ownership_contracts.project.publication
78
+ allowed_effects: [personal_profile_output]
79
+ forbidden_effects:
80
+ - project_glossary_read
81
+ - project_glossary_mutation
82
+ - project_publication_replacement
83
+ - consumer_precedence_change
84
+ - personal_project_merge
85
+ rule: >-
86
+ Mining may replace only the user-owned personal profile glossary through
87
+ the existing personal profile output lifecycle. It never reads or writes
88
+ project glossary state, changes consumer precedence, or changes the
89
+ Build-owned digest-confirmed project publication operation.
90
+ explicit_discovery:
91
+ status: active
92
+ runtime: packages/cli/src/analytics/personalGlossaryExplicit.ts#discoverExplicitGlossaryCues
93
+ mining_runtime: packages/cli/src/analytics/personalGlossaryExplicitMining.ts#mineExplicitGlossaryCandidates
94
+ input: bounded_signal_tier_plus_direct_single_anchor_resolution
95
+ output: evidence_capsule_plus_exact_source_spans_only
96
+ scope_window: current_sentence_and_one_adjacent_sentence_each_side
97
+ scope_binding: explicit_scope_marker_must_contain_the_term_or_be_a_direct_qualifier
98
+ span_encoding: utf8_byte_offsets
99
+ strings: preserve_exact_source_bytes_without_unicode_normalization
100
+ adjacent_direct_reference_exclusion:
101
+ references:
102
+ - this_definition
103
+ - this_term
104
+ - this_meaning
105
+ - following_definition
106
+ - following_term
107
+ - following_meaning
108
+ qualifiers: [question, example, future, hypothetical]
109
+ binding:
110
+ preceding_sentence: following_reference_only
111
+ following_sentence: this_reference_only
112
+ exact_literal_term: either_direction
113
+ grammar:
114
+ forms:
115
+ - id: quoted_means
116
+ segment_class: explicit_cue_segment
117
+ entry: outside_approved_cue
118
+ termination: shared_bounded_termination
119
+ output: shared_cue_segment_output
120
+ syntax: quoted_or_code_delimited_term_means_meaning
121
+ term: one_balanced_supported_quote_or_backtick_delimited_span
122
+ - id: definition_list_colon
123
+ segment_class: explicit_cue_segment
124
+ entry: outside_approved_cue
125
+ termination: shared_bounded_termination
126
+ output: shared_cue_segment_output
127
+ syntax: standalone_safe_definition_list_term_colon_meaning
128
+ prefix: sentence_or_line_start_with_optional_markdown_list_bullet
129
+ unmarked_terms:
130
+ - quoted_or_code_delimited_term
131
+ - uppercase_acronym_with_exact_expansion_initials
132
+ markers: [definition, term]
133
+ marked_term: bounded_nonempty_term
134
+ bare_multiword_term_without_marker: reject
135
+ meaning_start: nonempty_same_physical_line
136
+ continuation: after_nonempty_inline_meaning_within_maximum_meaning_bound_only
137
+ empty_marker_structure: reject_immediately_following_colon_line
138
+ exclusions: yaml_config_labels_times_urls_headings_citations_and_labels
139
+ - id: acronym_stands_for
140
+ segment_class: explicit_cue_segment
141
+ entry: outside_approved_cue
142
+ termination: shared_bounded_termination
143
+ output: shared_cue_segment_output
144
+ syntax: bounded_acronym_stands_for_expansion
145
+ validation: expansion_initials_must_match_acronym_exactly
146
+ - id: acronym_parenthetical
147
+ segment_class: explicit_cue_segment
148
+ entry: outside_approved_cue
149
+ termination: shared_bounded_termination
150
+ output: shared_cue_segment_output
151
+ syntax: bounded_acronym_parenthesized_expansion_or_reverse
152
+ validation: expansion_initials_must_match_acronym_exactly
153
+ - id: by_i_mean
154
+ segment_class: explicit_cue_segment
155
+ entry: outside_approved_cue
156
+ termination: shared_bounded_termination
157
+ output: shared_cue_segment_output
158
+ syntax: by_term_i_mean_meaning
159
+ - id: use_for
160
+ segment_class: explicit_cue_segment
161
+ entry: outside_approved_cue
162
+ termination: shared_bounded_termination
163
+ output: shared_cue_segment_output
164
+ syntax: use_term_for_meaning
165
+ - id: use_to_mean
166
+ segment_class: explicit_cue_segment
167
+ entry: outside_approved_cue
168
+ termination: shared_bounded_termination
169
+ output: shared_cue_segment_output
170
+ syntax: use_term_to_mean_meaning
171
+ - id: refers_to
172
+ segment_class: explicit_cue_segment
173
+ entry: outside_approved_cue
174
+ termination: shared_bounded_termination
175
+ output: shared_cue_segment_output
176
+ syntax: term_refers_to_meaning
177
+ - id: clarification_prefer_to_mean
178
+ segment_class: explicit_cue_segment
179
+ entry: outside_approved_cue
180
+ termination: shared_bounded_termination
181
+ output: shared_cue_segment_output
182
+ syntax: to_clarify_i_prefer_term_to_mean_meaning
183
+ - id: correction_means
184
+ segment_class: explicit_cue_segment
185
+ entry: outside_approved_cue
186
+ termination: shared_bounded_termination
187
+ output: shared_cue_segment_output
188
+ syntax: approved_correction_prefix_quoted_or_code_term_means_meaning
189
+ prefixes: [actually, correction, not_quite, instead, rather]
190
+ bounds:
191
+ maximum_term_utf8_bytes: 256
192
+ maximum_meaning_utf8_bytes: 4096
193
+ maximum_acronym_utf8_bytes: 32
194
+ maximum_acronym_words: 32
195
+ segment_grammar:
196
+ schema_version: agentera.personalGlossarySegmentGrammar.v1
197
+ segment_class: explicit_cue_segment
198
+ states: [outside, cue, inline_meaning, continuation, structural_config, terminated, rejected]
199
+ input_classes:
200
+ - approved_cue
201
+ - non_empty_inline_meaning
202
+ - continuation_line
203
+ - blank_line
204
+ - next_cue
205
+ - structural_fragment
206
+ - comment
207
+ - list_boundary
208
+ - indentation
209
+ - nested_marker
210
+ - block_scalar
211
+ - prose
212
+ - unsupported
213
+ - eof
214
+ initial_state: outside
215
+ terminal_states: [terminated, rejected]
216
+ entry:
217
+ from: outside
218
+ input: approved_cue
219
+ to: cue
220
+ accepted_forms:
221
+ - quoted_means
222
+ - definition_list_colon
223
+ - acronym_stands_for
224
+ - acronym_parenthetical
225
+ - by_i_mean
226
+ - use_for
227
+ - use_to_mean
228
+ - refers_to
229
+ - clarification_prefer_to_mean
230
+ - correction_means
231
+ unsupported_reason: unsupported_transition
232
+ termination:
233
+ start_state: inline_meaning
234
+ continuation_state: continuation
235
+ terminal_state: terminated
236
+ required: non_empty_inline_meaning
237
+ boundary_inputs: [blank_line, next_cue, structural_fragment, comment, list_boundary]
238
+ maximum_meaning_utf8_bytes: 4096
239
+ limit: inclusive
240
+ over_limit_reason: meaning_bound_exceeded
241
+ output:
242
+ fields: [term, meaning, term_span, meaning_span]
243
+ span_encoding: utf8_byte_offsets
244
+ source_semantics: exact_source_bytes_without_unicode_normalization
245
+ continuation:
246
+ starts_after: non_empty_inline_meaning
247
+ preserves: exact_source_newlines_and_utf8_bytes
248
+ stops_on: [blank_line, next_cue, structural_fragment, comment, list_boundary]
249
+ maximum_utf8_bytes: 4096
250
+ limit: inclusive
251
+ over_limit: reject
252
+ over_limit_reason: meaning_bound_exceeded
253
+ structural_configuration:
254
+ state: structural_config
255
+ entry_inputs: [structural_fragment, list_boundary]
256
+ persist_inputs: [comment, blank_line, indentation, nested_marker, block_scalar, structural_fragment, list_boundary]
257
+ reject_inputs: [comment, blank_line, indentation, nested_marker, block_scalar, structural_fragment, list_boundary, approved_cue]
258
+ exit:
259
+ input: prose
260
+ condition: top_level_nonempty_noncomment_nonmarker_nonstructural_line
261
+ action: reject_fragment_then_exit
262
+ next_state: outside
263
+ definition_allowed: next_physical_line_only
264
+ reference_binding:
265
+ following: nearest_next_cue
266
+ this: nearest_previous_cue
267
+ exact_term: nearest_matching_cue
268
+ matching: unicode_caseless_exact_no_normalization
269
+ duplicate_target_reason: ambiguous_reference
270
+ missing_target_reason: ambiguous_reference
271
+ duplicate_target_outcome: exclude_bound_cue_only
272
+ missing_target_outcome: exclude_bound_cue_only
273
+ unrelated_cue_outcome: retain
274
+ deduplication:
275
+ identity: personal_mining_authority.term_identity.stable_term_identity
276
+ same_identity_same_meaning: retain_one_earliest_source_span
277
+ same_identity_different_meaning: reject_all_conflicting_meaning
278
+ unrelated_cue_outcome: retain
279
+ canonical_order:
280
+ fields: [term, meaning, term_span.start, meaning_span.start]
281
+ comparator: unicode_scalar_code_point_ascending
282
+ direction: ascending
283
+ transitions:
284
+ - {from: outside, input: approved_cue, to: cue, action: enter_cue_segment}
285
+ - {from: outside, input: structural_fragment, to: structural_config, action: enter_structural_config, reason: structural_fragment}
286
+ - {from: outside, input: list_boundary, to: structural_config, action: enter_structural_config, reason: structural_fragment}
287
+ - {from: outside, input: unsupported, to: rejected, action: reject, reason: unsupported_transition}
288
+ - {from: cue, input: non_empty_inline_meaning, to: inline_meaning, action: capture_inline_meaning}
289
+ - {from: cue, input: blank_line, to: rejected, action: reject, reason: empty_meaning}
290
+ - {from: cue, input: next_cue, to: rejected, action: reject, reason: empty_meaning}
291
+ - {from: cue, input: structural_fragment, to: rejected, action: reject, reason: empty_meaning}
292
+ - {from: cue, input: unsupported, to: rejected, action: reject, reason: unsupported_transition}
293
+ - {from: inline_meaning, input: continuation_line, to: continuation, action: append_original_newline}
294
+ - {from: inline_meaning, input: blank_line, to: terminated, action: finish_before_boundary}
295
+ - {from: inline_meaning, input: next_cue, to: terminated, action: finish_before_boundary}
296
+ - {from: inline_meaning, input: structural_fragment, to: terminated, action: finish_before_boundary}
297
+ - {from: inline_meaning, input: comment, to: terminated, action: finish_before_boundary}
298
+ - {from: inline_meaning, input: list_boundary, to: terminated, action: finish_before_boundary}
299
+ - {from: inline_meaning, input: prose, to: continuation, action: append_original_newline}
300
+ - {from: inline_meaning, input: eof, to: terminated, action: finish_at_eof}
301
+ - {from: inline_meaning, input: unsupported, to: rejected, action: reject, reason: unsupported_transition}
302
+ - {from: continuation, input: continuation_line, to: continuation, action: append_original_newline}
303
+ - {from: continuation, input: prose, to: continuation, action: append_original_newline}
304
+ - {from: continuation, input: blank_line, to: terminated, action: finish_before_boundary}
305
+ - {from: continuation, input: next_cue, to: terminated, action: finish_before_boundary}
306
+ - {from: continuation, input: structural_fragment, to: terminated, action: finish_before_boundary}
307
+ - {from: continuation, input: comment, to: terminated, action: finish_before_boundary}
308
+ - {from: continuation, input: list_boundary, to: terminated, action: finish_before_boundary}
309
+ - {from: continuation, input: eof, to: terminated, action: finish_at_eof}
310
+ - {from: continuation, input: unsupported, to: rejected, action: reject, reason: unsupported_transition}
311
+ - {from: structural_config, input: approved_cue, to: rejected, action: reject, reason: structural_fragment}
312
+ - {from: structural_config, input: structural_fragment, to: structural_config, action: reject_structural_fragment, reason: structural_fragment}
313
+ - {from: structural_config, input: comment, to: structural_config, action: reject_structural_fragment, reason: structural_fragment}
314
+ - {from: structural_config, input: blank_line, to: structural_config, action: reject_structural_fragment, reason: structural_fragment}
315
+ - {from: structural_config, input: indentation, to: structural_config, action: reject_structural_fragment, reason: structural_fragment}
316
+ - {from: structural_config, input: nested_marker, to: structural_config, action: reject_structural_fragment, reason: structural_fragment}
317
+ - {from: structural_config, input: block_scalar, to: structural_config, action: reject_structural_fragment, reason: structural_fragment}
318
+ - {from: structural_config, input: list_boundary, to: structural_config, action: reject_structural_fragment, reason: structural_fragment}
319
+ - {from: structural_config, input: prose, to: outside, action: reject_fragment_then_exit, reason: structural_fragment}
320
+ - {from: structural_config, input: unsupported, to: rejected, action: reject, reason: unsupported_transition}
321
+ - {from: structural_config, input: eof, to: rejected, action: reject, reason: structural_fragment}
322
+ - {from: terminated, input: unsupported, to: rejected, action: reject, reason: unsupported_transition}
323
+ - {from: rejected, input: unsupported, to: rejected, action: reject, reason: unsupported_transition}
324
+ fallback_transitions:
325
+ outside: {from: outside, input: unsupported, to: rejected, action: reject, reason: unsupported_transition}
326
+ cue: {from: cue, input: unsupported, to: rejected, action: reject, reason: unsupported_transition}
327
+ inline_meaning: {from: inline_meaning, input: unsupported, to: rejected, action: reject, reason: unsupported_transition}
328
+ continuation: {from: continuation, input: unsupported, to: rejected, action: reject, reason: unsupported_transition}
329
+ structural_config: {from: structural_config, input: unsupported, to: rejected, action: reject, reason: unsupported_transition}
330
+ terminated: {from: terminated, input: unsupported, to: rejected, action: reject, reason: unsupported_transition}
331
+ rejected: {from: rejected, input: unsupported, to: rejected, action: reject, reason: unsupported_transition}
332
+ reasons:
333
+ unsupported_transition: unsupported_transition
334
+ structural_fragment: structural_fragment
335
+ empty_meaning: empty_meaning
336
+ meaning_bound_exceeded: meaning_bound_exceeded
337
+ ambiguous_reference: ambiguous_reference
338
+ conflicting_meaning: conflicting_meaning
339
+ invalid_exit_boundary: invalid_exit_boundary
340
+ exclusions:
341
+ - examples
342
+ - mere_mentions
343
+ - direct_or_indirect_questions
344
+ - negations
345
+ - hypotheticals_conditionals
346
+ - future_language
347
+ - deterministic_sarcasm_markers
348
+ - quotations_attributed_to_others
349
+ - retractions_or_replacements_bound_to_the_same_term
350
+ - project_qualified_scope
351
+ - malformed_empty_or_oversized_spans
352
+ - incomplete_or_invalid_source_provenance
353
+ provenance:
354
+ required_source_fields:
355
+ - source_id
356
+ - evidence_anchor
357
+ - source_kind
358
+ - signal_type
359
+ - origin_id
360
+ - content_fingerprint
361
+ - author_class
362
+ - session_id
363
+ - project_id
364
+ allowed_source_kinds: [conversation_turn]
365
+ identity_fields_must_match_full_record: true
366
+ user_author_class: user
367
+ unresolved_or_invalid: stable_provenance_abstention
368
+ term_identity:
369
+ equality:
370
+ runtime: packages/cli/src/registries/glossaryTermIdentity.ts#unicodeCaselessExact
371
+ semantics: unicode_caseless_exact_no_normalization
372
+ rule: >-
373
+ Equality remains the existing locale-independent ECMAScript Unicode
374
+ caseless-exact matcher. Canonical, compatibility, accent, and locale
375
+ normalization are not added to equality.
376
+ stable_term_identity:
377
+ schema_version: agentera.personalGlossaryTermIdentity.v1
378
+ runtime: packages/cli/src/registries/glossaryTermIdentity.ts#stableGlossaryTermIdentity
379
+ algorithm: sha256
380
+ encoding: lowercase_hex
381
+ canonical_input: ecmascript_simple_case_fold_key
382
+ no_unicode_normalization: true
383
+ key_rule: >-
384
+ For each Unicode scalar, use its one-scalar locale-independent lowercase
385
+ mapping. Also derive the lowercase mapping of its one-scalar uppercase
386
+ mapping, but use that alternate only when unicodeCaselessExact confirms
387
+ the original scalar and alternate are equal. Concatenate those selected
388
+ scalars without normalization, then hash the resulting UTF-8 key with the
389
+ versioned schema name. This follows the exact matcher, including keeping
390
+ ASCII I and dotless ı distinct.
391
+ invariant: >-
392
+ Stable identity is an identifier for the existing equality class, not a
393
+ new comparison rule. It never lowercases, normalizes, trims, or changes
394
+ the term stored in a shared entry.
395
+ candidate_revision:
396
+ schema_version: agentera.personalGlossaryCandidateRevision.v1
397
+ runtime: packages/cli/src/registries/glossaryTermIdentity.ts#glossaryCandidateRevision
398
+ algorithm: sha256
399
+ encoding: lowercase_hex
400
+ canonicalization: >-
401
+ Hash canonical UTF-8 JSON with recursively code-point-sorted object keys,
402
+ preserved string bytes, and evidence records sorted by their canonical
403
+ JSON. The schema name, stable_term_identity, meaning, scope, complete
404
+ evidence identity set, policy_version, and generation are all included.
405
+ No field may be omitted, reordered semantically, normalized, or replaced
406
+ by a display label.
407
+ bound_fields:
408
+ - stable_term_identity
409
+ - meaning
410
+ - scope
411
+ - evidence
412
+ - policy_version
413
+ - generation
414
+ policy_version: agentera.personalGlossaryMiningPolicy.v1
415
+ generation: content_addressed_candidate_projection_generation
416
+ evidence: complete_source_id_anchor_identity_set
417
+ replay_rule: >-
418
+ A changed meaning, scope, evidence identity set, policy version, or
419
+ candidate generation creates a new revision. Identical canonical inputs
420
+ create the same revision and do not imply a second candidate.
421
+ provenance:
422
+ existing_inferred_variant: provenance_variants.personal_inferred_usage
423
+ conversation_variant: provenance_variants.personal_inferred_conversation
424
+ evolution:
425
+ status: explicit_append_only_extension
426
+ shared_primitive: unchanged
427
+ existing_variant_rule: >-
428
+ The firm two-independent-record instruction/configuration route remains
429
+ exactly two records with both anchors exposed.
430
+ conversation_rule: >-
431
+ Conversation inference uses the explicit conversation provenance variant
432
+ and retains every qualifying evidence record. It never projects a longer
433
+ evidence set into the two-record variant.
434
+ audit_rule: >-
435
+ The provenance kind, complete-evidence marker, source identities, anchors,
436
+ session identities, project identities, author class, and content
437
+ fingerprints remain inspectable by the later validator. Missing metadata,
438
+ unresolved anchors, or incomplete evidence fail closed.
439
+ consent_lifecycle:
440
+ authority: references/analysis/evidence-tier-authority.yaml
441
+ operation: Profile_Full
442
+ policy: reuse_existing_generation
443
+ refresh: forbidden_during_profile_full
444
+ reuse: >-
445
+ Profile Full may consume one existing local-history generation only when a
446
+ valid local-history consent binding and a readable current generation are
447
+ already present. Profile Full never refreshes, discovers, or rereads local
448
+ history to obtain consent.
449
+ discriminator:
450
+ inputs: [consent_status, generation_status, coverage_status, signal_tier_bounded]
451
+ order: [absent, stale, degraded, present]
452
+ values:
453
+ consent_status: [absent, valid, stale]
454
+ generation_status: [absent, current, stale]
455
+ coverage_status: [complete, cap_selected, truncated, flagged_incomplete]
456
+ signal_tier_bounded: [true, false]
457
+ predicates:
458
+ absent: consent_absent_or_generation_absent
459
+ stale: after_absent_consent_or_generation_stale
460
+ degraded: valid_current_actual_cap_truncation_or_flagged_incomplete
461
+ present: valid_current_complete_any_boundedness
462
+ exclusivity: >-
463
+ Evaluate the ordered predicates exactly once and select the first match.
464
+ Absent wins over stale, stale wins over degraded, and degraded wins over
465
+ present. No input tuple may select two states.
466
+ boundedness_rule: >-
467
+ A signal tier being inherently bounded does not make a generation
468
+ degraded. Degraded requires actual cap selection, truncation, or flagged
469
+ incomplete coverage.
470
+ states:
471
+ present:
472
+ condition: valid_current_complete_any_boundedness
473
+ action: reuse_generation_once_for_bounded_mining
474
+ result: mining_authorized
475
+ absent:
476
+ condition: consent_absent_or_generation_absent
477
+ action: skip_mining_without_read_or_refresh
478
+ result: degraded_consent_required
479
+ stale:
480
+ condition: after_absent_consent_or_generation_stale
481
+ action: reject_generation_for_new_mining_and_preserve_existing_entries
482
+ result: degraded_refresh_required
483
+ degraded:
484
+ condition: valid_current_actual_cap_truncation_or_flagged_incomplete
485
+ action: reuse_only_as_degraded_evidence_without_automatic_admission
486
+ result: degraded_coverage
487
+ recovery:
488
+ command: npx -y agentera@next report refresh --consent local-history
489
+ explicit_consent: required
490
+ after_refresh: retry_profile_full_with_the_new_generation
491
+ forbidden: [live_extraction_without_consent, silent_refresh, stale_generation_reuse]
492
+ rule: >-
493
+ Absent, stale, and degraded states expose the same explicit refresh
494
+ recovery without inspecting raw history. Recovery never changes project
495
+ state or project glossary publication.
496
+ profile_full:
497
+ status: active
498
+ entrypoint: Profile_Full
499
+ base_profile_order: write_base_profile_before_personal_glossary
500
+ existing_generation:
501
+ source: existing_consent_bound_user_local_candidate_projection
502
+ generation_count: 1
503
+ binding_fields: [generation, policy_version, candidate_projection_sha256]
504
+ list_limit: 20
505
+ continuation: forbidden
506
+ degraded: explicit_refresh_required_without_candidate_classification_or_publication
507
+ forbidden_effects:
508
+ - history_refresh
509
+ - history_collection
510
+ - candidate_discovery
511
+ - candidate_projection_write
512
+ - new_generation
513
+ - project_glossary_read
514
+ unavailable: preserve_base_profile_and_owned_section
515
+ deterministic_admission:
516
+ host_classification: semantic_evidence_not_admission_authority
517
+ command: candidate_contracts.layers.cli_decision
518
+ automatic: explicit_current_authorized_only
519
+ inferred: review_or_abstain
520
+ review:
521
+ queue_before_question: true
522
+ question_channel_maximum: 3
523
+ no_question_channel: durable_queue
524
+ output: bounded_review_cards_and_summary
525
+ publication:
526
+ command: ownership_contracts.personal.profile_output
527
+ automatic: explicit_current_authorized_only
528
+ no_decision_synthesis: true
529
+ failure: preserve_base_profile_and_owned_section
530
+ output:
531
+ profile_path: canonical_user_profile_authority
532
+ terminal: compact_bounded_summary
533
+ privacy:
534
+ owner: current_user
535
+ scope: user_local
536
+ storage:
537
+ root: $AGENTERA_PROFILE_DIR/intermediate/personal-glossary
538
+ project_storage: forbidden
539
+ records: [candidate_metadata, safe_excerpts, review_metadata, review_dispositions]
540
+ project_state: unchanged
541
+ filesystem:
542
+ authority: host_filesystem
543
+ configured_path: use_as_provided
544
+ outcomes: ordinary_permissions_and_io
545
+ same_user_path_manipulation: outside_agentera_threat_model
546
+ symlink_confinement: not_claimed
547
+ rule: >-
548
+ Agentera uses the configured profile path as provided. The host
549
+ filesystem owns permissions, symlink behavior, and same-user path
550
+ manipulation. Agentera does not add realpath or no-follow confinement.
551
+ rule: >-
552
+ Agentera deliberately selects only the configured user profile path for
553
+ mining records. It never selects .agentera, TODO.md, progress, the
554
+ project glossary, or another project path as projection storage. A user
555
+ configuration or same-user filesystem change does not become an
556
+ Agentera path-confinement claim.
557
+ content_exclusion:
558
+ owner: glossary_content_policy
559
+ classification: actual_secret_or_sensitive_value
560
+ conceptual_terminology: eligible
561
+ candidate_fields: [term, meaning]
562
+ candidate_action: reject_before_projection
563
+ candidate_reason: secret_content
564
+ excerpt_action: omit_complete_excerpt_before_projection
565
+ secret_classes:
566
+ - api_keys
567
+ - access_tokens
568
+ - passwords
569
+ - cookies
570
+ - private_keys
571
+ - authorization_headers
572
+ - personal_contact_data
573
+ - session_identifiers
574
+ - runtime_store_paths
575
+ rule: >-
576
+ A term or meaning containing an actual credential, session, or other
577
+ sensitive value is not a glossary candidate and is rejected with the
578
+ stable secret_content reason. Field names and ordinary conceptual
579
+ terminology remain eligible. If candidate-adjacent context contains an
580
+ actual secret or sensitive value, omit the complete excerpt. Never redact
581
+ and retain part of that excerpt.
582
+ excerpts:
583
+ purpose: bounded_review_context_only
584
+ max_utf8_bytes: 500
585
+ forbidden_content:
586
+ - raw_transcript
587
+ - raw_tool_arguments
588
+ - raw_runtime_store_paths
589
+ - raw_session_identifiers
590
+ - secret_or_sensitive_content
591
+ - unrelated_conversation
592
+ failure: omit_complete_excerpt_before_persistence
593
+ reviews:
594
+ owner: current_user
595
+ required_fields:
596
+ - candidate_id
597
+ - candidate_revision
598
+ - semantic_fingerprint
599
+ - generation
600
+ - policy_version
601
+ - disposition
602
+ - disposed_at
603
+ dispositions: [accept, correct, reject, defer]
604
+ trusted_disposition_authority: current_user
605
+ authentication:
606
+ receipt_schema_version: agentera.personalGlossaryReviewApproval.v1
607
+ issuer: agentera-local-host
608
+ subject: current_user
609
+ trusted_channel: agentera-local-host-ipc
610
+ required_fields:
611
+ - schema_version
612
+ - issuer
613
+ - subject
614
+ - trusted_channel
615
+ - review_id
616
+ - candidate_id
617
+ - candidate_revision
618
+ - candidate_projection_sha256
619
+ - semantic_fingerprint
620
+ - generation
621
+ - policy_version
622
+ - disposition
623
+ - corrected_meaning
624
+ - corrected_scope
625
+ - disposed_at
626
+ - expires_at
627
+ - nonce
628
+ - signature
629
+ proof: >-
630
+ The local host signs an explicit current-user action. The verifier
631
+ checks the trusted host public key before accepting the receipt; a
632
+ model, agent, imported transcript, or unbound text field cannot create
633
+ proof by asserting issuer or subject values.
634
+ binding_fields: [review_id, candidate_id, candidate_revision, candidate_projection_sha256, semantic_fingerprint, generation, policy_version, disposition, corrected_meaning, corrected_scope, disposed_at]
635
+ forbidden_principals: [agent, model, imported_record, generic_consent]
636
+ correction:
637
+ correct_fields: [corrected_meaning, corrected_scope]
638
+ non_correct_values: null
639
+ corrected_scope_values: [personal]
640
+ corrected_meaning_max_utf8_bytes: 4096
641
+ rule: >-
642
+ Only a signed correct action may carry a complete bounded corrected
643
+ meaning and the personal scope. Other dispositions carry null correction
644
+ fields. Corrected content remains user-local review metadata and must
645
+ pass the same secret and sensitive-content exclusion as a candidate.
646
+ signature:
647
+ algorithm: ed25519
648
+ encoding: base64url
649
+ key_source: user_local_trusted_host_key
650
+ signed_fields:
651
+ - schema_version
652
+ - issuer
653
+ - subject
654
+ - trusted_channel
655
+ - review_id
656
+ - candidate_id
657
+ - candidate_revision
658
+ - candidate_projection_sha256
659
+ - semantic_fingerprint
660
+ - generation
661
+ - policy_version
662
+ - disposition
663
+ - corrected_meaning
664
+ - corrected_scope
665
+ - disposed_at
666
+ - expires_at
667
+ - nonce
668
+ verification: trusted_host_public_key_signature_check
669
+ freshness:
670
+ max_age_seconds: 300
671
+ disposed_at: trusted_host_clock
672
+ expires_at_required: true
673
+ rule: disposed_at_must_not_be_future_and_expires_at_must_be_after_now
674
+ replay:
675
+ nonce: required_unique_receipt_nonce
676
+ index: user_local_consumed_receipt_digest_index
677
+ exact_replay: no_op_only_when_nonce_and_receipt_digest_match
678
+ conflicting_replay: reject_reused_nonce_with_changed_bindings_or_signature
679
+ terminal_disposition:
680
+ terminal: [accept, correct, reject]
681
+ pending: [defer]
682
+ retention:
683
+ pending_excerpt_days: 30
684
+ terminal_excerpt_days: 0
685
+ review_metadata_days_after_terminal: 90
686
+ accepted_entry: ownership_contracts.personal.retention_and_decay
687
+ pending_review_metadata: retained_until_terminal_or_purge
688
+ terminal_review_metadata: retained_for_90_days_after_disposition
689
+ rule: >-
690
+ Safe excerpts expire after 30 days and are removed immediately when a
691
+ review becomes terminal. Disposition metadata remains for 90 days after
692
+ a terminal disposition to suppress the same revision, then expires.
693
+ Accepted glossary entries follow the existing personal profile decay
694
+ authority and never retain an excerpt.
695
+ purge:
696
+ authority: current_user
697
+ trigger: explicit_authenticated_user_request_or_retention_expiry
698
+ removes: [candidate_metadata, safe_excerpts, review_metadata, review_dispositions]
699
+ behavior: atomic_remove_user_local_records_before_next_read
700
+ project_state: untouched
701
+ profile_entry: not_implicitly_deleted
702
+ boundaries:
703
+ pending: purge_removes_excerpt_and_metadata_immediately
704
+ terminal: purge_removes_excerpt_and_metadata_before_next_read
705
+ accepted_profile_entry: purge_does_not_implicitly_delete_profile_entry
706
+ recovery: >-
707
+ A purge is local and irreversible to the mining records. A later run
708
+ requires fresh consent-bound evidence and creates no project-side record.
709
+ candidate_projection:
710
+ status: active
711
+ runtime: packages/cli/src/analytics/personalGlossaryCandidateProjection.ts#projectPersonalGlossaryCandidates
712
+ schema_version: agentera.personalGlossaryCandidateProjection.v1
713
+ owner: deterministic_discovery_projection
714
+ input: validated_completed_explicit_and_recurring_capsules_with_transient_source_project_ids_and_candidate_adjacent_excerpts
715
+ output: bounded_user_local_candidate_projection_with_safe_excerpts_and_selection_report
716
+ implementation_boundary: >-
717
+ This runtime selects and persists only bounded candidate metadata and safe
718
+ review context. Candidate retrieval is the separate private
719
+ candidate_retrieval operation. It does not add project or public-state
720
+ candidate reads, host classification, CLI admission, review-disposition
721
+ writes, profile publication, project-glossary access, or project-state
722
+ effects.
723
+ selection:
724
+ candidates_max: 50
725
+ project_ids_max_per_candidate: 100
726
+ source_families:
727
+ explicit: [personal_explicit_definition]
728
+ recurring: [personal_inferred_usage, personal_inferred_conversation]
729
+ algorithm: least_retained_source_family_then_project_then_canonical_candidate
730
+ tie_break: candidate_id_then_candidate_revision_then_capsule_sha256
731
+ project_identity:
732
+ schema_version: agentera.personalGlossaryProjectionProjectIdentity.v1
733
+ algorithm: sha256
734
+ input: canonical_utf8_json_of_exact_transient_project_id
735
+ output: lowercase_hex
736
+ rule: >-
737
+ Projection-only project labels are used transiently to allocate
738
+ diversity. Persisted allocation fields and reports contain only this
739
+ exact-byte, no-normalization project identity. The validated capsule
740
+ keeps its separately authority-required provenance unchanged.
741
+ coverage: >-
742
+ Each selection round prefers the represented source family with the
743
+ fewest retained candidates, then the candidate whose represented project
744
+ has the fewest retained candidates. A capped or uncovered family or
745
+ project reports degraded coverage with retained and dropped counts.
746
+ excerpts:
747
+ source_max_utf8_bytes: 4096
748
+ max_per_candidate: 1
749
+ authority: personal_mining_authority.privacy.excerpts
750
+ input_rule: candidate_adjacent_text_must_contain_the_exact_candidate_term
751
+ output_fields: [text, expires_at, redacted]
752
+ compatibility:
753
+ redacted_field: retained_for_v1_consumers
754
+ new_projection_value: false
755
+ omission_reasons: [no_excerpt, unrelated_context, source_bound_exceeded, unsafe_tool_arguments, unsafe_content]
756
+ rule: >-
757
+ Sort transient excerpts canonically, retain at most one complete safe
758
+ excerpt, and omit secret-bearing, sensitive, unsafe, or unrelated text
759
+ without echoing it. The v1 redacted field remains for schema compatibility,
760
+ but new projections set it to false and never persist partial redactions.
761
+ retention:
762
+ authority: personal_mining_authority.privacy.retention
763
+ purge: personal_mining_authority.privacy.purge
764
+ rule: >-
765
+ Pending candidate excerpts expire after the authority's thirty-day
766
+ period. Retention maintenance may remove only expired safe excerpts;
767
+ a current-user-authorized purge removes the complete user-local
768
+ projection before the next read. Review-disposition persistence remains
769
+ outside this runtime.
770
+ persistence:
771
+ root: $AGENTERA_PROFILE_DIR/intermediate/personal-glossary
772
+ file: candidate-projection.json
773
+ canonicalization: candidate_contracts.canonicalization
774
+ fields: [schema_version, owner, generation, policy_version, retained_at, candidates, report, projection_sha256]
775
+ replay: byte_identical_projection_is_unchanged_replay
776
+ project_storage: forbidden
777
+ public_reads: forbidden
778
+ private_machine_reads: [candidate_retrieval, cli_decision]
779
+ review_disposition_writes: forbidden
780
+ rule: >-
781
+ Write one private canonical projection file at the configured user
782
+ profile path using ordinary filesystem I/O. The file contains validated
783
+ capsules, hashed project identities, safe excerpts, and a bounded report
784
+ only. Never serialize a raw project path, .agentera state, raw excerpt
785
+ source, or review disposition, and never deliberately select project
786
+ storage.
787
+ candidate_retrieval:
788
+ status: active
789
+ owner: private_user_local_candidate_retrieval
790
+ runtime: packages/cli/src/cli/commands/personalGlossaryCandidateReads.ts#runPersonalGlossaryCandidateReadsCommand
791
+ input: current_validated_user_local_candidate_projection_bound_to_current_tier_generation
792
+ current_generation:
793
+ source: current.json_readable_bounded_evidence_tier_generation
794
+ projection_generation: exact_match_required
795
+ unavailable_behavior: current_generation_unavailable
796
+ stale_projection_behavior: projection_stale
797
+ command:
798
+ canonical: npx -y agentera@next report personal-glossary-candidates
799
+ namespace: report
800
+ format: json
801
+ project_checkout: not_required
802
+ list:
803
+ schema_version: agentera.personalGlossaryCandidateRetrieval.v1
804
+ default_limit: 20
805
+ maximum_limit: 50
806
+ max_serialized_utf8_bytes: 32768
807
+ order: candidate_id_then_candidate_revision_then_capsule_sha256
808
+ projection_binding_field: candidate_projection_sha256
809
+ filters:
810
+ source_family: [explicit, recurring]
811
+ provenance_kind_from: candidate_projection.selection.source_families
812
+ scope: [personal, ambiguous]
813
+ cursor:
814
+ authority: references/artifacts/state-storage-authority.yaml#entity_target.public_retrieval.policy.cursor
815
+ vocabulary: opaque_snapshot_cursor
816
+ binding: [collection, generation, policy_version, filters, limit, order, snapshot]
817
+ invalid_behavior: cursor_invalid
818
+ unavailable_behavior: cursor_snapshot_unavailable
819
+ summaries: >-
820
+ List returns only bounded candidate summaries, projection-local selection
821
+ abstention counts, derived safe-context availability and omission or
822
+ expiry counts, and the current coverage report. It never returns a
823
+ meaning, project label, project key, raw evidence identity, excerpt text,
824
+ or a per-row expanded command.
825
+ abstentions: >-
826
+ Upstream mining abstentions are not retained in a candidate projection and
827
+ are never reconstructed. This read reports only bounded projection-local
828
+ candidate-selection and safe-context omission counts.
829
+ coverage: >-
830
+ Coverage remains the validated current projection report and is not
831
+ recomputed from a list filter or page.
832
+ safe_context_view:
833
+ authority: personal_mining_authority.privacy.retention
834
+ retention_days: 30
835
+ expiry: expires_at_lte_read_time_is_unavailable
836
+ mutation: forbidden
837
+ snapshot: effective_availability_bound_to_opaque_cursor_snapshot
838
+ rule: >-
839
+ Candidate retrieval derives current safe-context availability from the
840
+ persisted projection at read time. An excerpt at or after its expiry is
841
+ omitted from list and exact output without writing the projection. The
842
+ derived availability contributes to the opaque cursor snapshot, so a
843
+ continuation from a prior availability view is unavailable.
844
+ exact:
845
+ schema_version: agentera.personalGlossaryCandidateRetrieval.v1
846
+ required_bindings: [candidate_id, candidate_revision, generation, policy_version]
847
+ projection_binding_field: candidate_projection_sha256
848
+ occurrences_max: 100
849
+ safe_context_max_utf8_bytes: 500
850
+ max_serialized_utf8_bytes: 32768
851
+ occurrence:
852
+ schema_version: agentera.personalGlossaryCandidateOccurrence.v1
853
+ identity: opaque_sha256_of_validated_evidence_and_candidate_binding
854
+ allowed_fields: [occurrence_id, source_kind, signal_type, author_class]
855
+ rule: >-
856
+ Exact read first validates the readable current tier generation, the
857
+ projection's exact generation binding, and every requested candidate
858
+ binding. It returns only the bounded validated occurrence
859
+ projection, its candidate_projection_sha256 binding, and a currently
860
+ available validated safe excerpt context.
861
+ Raw source, anchor, session, project, fingerprint, project-key, and
862
+ filesystem values are never emitted.
863
+ rule: >-
864
+ Candidate retrieval is read-only, non-interactive, and user-local. It never
865
+ refreshes or purges evidence, acquires consent, records review state, reads
866
+ a project glossary, selects project storage, or changes the persisted
867
+ projection. It derives an expiry-aware safe-context read view, reuses the
868
+ canonical opaque snapshot cursor construction, and fails closed before
869
+ emitting candidate data when the current generation is unavailable, the
870
+ projection is stale, or a continuation or exact binding is malformed,
871
+ unavailable, or mismatched.
872
+ review_records:
873
+ status: active
874
+ owner: user_local_review_lifecycle
875
+ runtime: packages/cli/src/analytics/personalGlossaryReviewRecords.ts#queuePersonalGlossaryReviewRecord
876
+ input: current_validated_review_required_cli_decision_and_host_receipt
877
+ trusted_host_key:
878
+ root: $AGENTERA_PROFILE_DIR/intermediate/personal-glossary
879
+ file: trusted-local-host.json
880
+ schema_version: agentera.personalGlossaryTrustedLocalHost.v1
881
+ fields: [schema_version, owner, subject, public_key_spki_base64url]
882
+ owner: current_user
883
+ public_key_algorithm: ed25519
884
+ max_serialized_utf8_bytes: 4096
885
+ rule: >-
886
+ The configured user-local host key names the current-user subject and one
887
+ Ed25519 SPKI public key. It is read only to verify a local-host IPC receipt;
888
+ it is never accepted from command input, project state, agent text, or output.
889
+ persistence:
890
+ root: $AGENTERA_PROFILE_DIR/intermediate/personal-glossary
891
+ file: review-records.json
892
+ schema_version: agentera.personalGlossaryReviewStore.v2
893
+ record_schema_version: agentera.personalGlossaryReviewRecord.v2
894
+ owner: current_user
895
+ fields: [schema_version, owner, records, replay_index, store_sha256]
896
+ record_fields:
897
+ - schema_version
898
+ - owner
899
+ - review_id
900
+ - candidate_id
901
+ - candidate_revision
902
+ - candidate_capsule_sha256
903
+ - candidate_projection_sha256
904
+ - host_receipt_sha256
905
+ - cli_decision_sha256
906
+ - semantic_fingerprint
907
+ - generation
908
+ - policy_version
909
+ - scope
910
+ - reason
911
+ - status
912
+ - disposition
913
+ - review_record
914
+ - reopen_reason
915
+ - queued_at
916
+ - terminal_at
917
+ - expires_at
918
+ - record_sha256
919
+ records_max: 100
920
+ replay_index_fields: [nonce_sha256, receipt_sha256, expires_at]
921
+ replay_entries_max: 100
922
+ record_max_serialized_utf8_bytes: 8192
923
+ max_serialized_utf8_bytes: 1048576
924
+ canonicalization: candidate_contracts.canonicalization
925
+ order: review_id_asc
926
+ replay: exact_current_binding_is_unchanged_replay_and_exact_receipt_is_idempotent
927
+ conflict: changed_receipt_nonce_binding_or_signature_fails_before_effects
928
+ suppression_binding: [candidate_id, semantic_fingerprint, scope, policy_version]
929
+ suppression_dispositions: [reject, defer]
930
+ reopen_reasons: [policy_changed, scope_changed, meaning_changed]
931
+ project_storage: forbidden
932
+ forbidden_fields:
933
+ - term
934
+ - meaning
935
+ - excerpt
936
+ - raw_evidence
937
+ - source_id
938
+ - evidence_anchor
939
+ - session_id
940
+ - project_id
941
+ - source_path
942
+ - tool_content
943
+ - review_approval
944
+ - signature
945
+ - nonce
946
+ rule: >-
947
+ Persist only bounded current-user review metadata. Generation and policy
948
+ bindings must be non-secret, non-path metadata identifiers; the current
949
+ content-addressed tier generation is an allowed opaque digest. A record contains
950
+ opaque candidate and receipt bindings, a safe scope, deterministic review
951
+ reason, lifecycle status, disposition, optional canonical review record,
952
+ visible reopening reason, and canonical digests. Only a correct canonical
953
+ review record may retain its authority-approved corrected meaning. It never
954
+ persists a term, excerpt, raw evidence identity, host proof, profile content,
955
+ project identity, path, or tool content. The bounded replay index stores only
956
+ nonce and receipt digests until receipt expiry. Exact current queue replay or
957
+ exact receipt replay is idempotent; changed nonce content fails before a write.
958
+ compatibility:
959
+ accepted_store_schema_versions:
960
+ - agentera.personalGlossaryReviewStore.v1
961
+ - agentera.personalGlossaryReviewStore.v2
962
+ accepted_record_schema_versions:
963
+ - agentera.personalGlossaryPendingReviewRecord.v1
964
+ - agentera.personalGlossaryReviewRecord.v2
965
+ read_mutation: forbidden
966
+ migration_operation: disposition_only
967
+ scope_derivation: current_validated_host_receipt_only
968
+ invalid_behavior: fail_before_effects
969
+ preserved_bindings:
970
+ - review_id
971
+ - candidate_id
972
+ - candidate_revision
973
+ - candidate_capsule_sha256
974
+ - candidate_projection_sha256
975
+ - host_receipt_sha256
976
+ - cli_decision_sha256
977
+ - semantic_fingerprint
978
+ - generation
979
+ - policy_version
980
+ - reason
981
+ legacy_digest: validate_before_migration
982
+ migrated_digest: reseal_v2_lifecycle_record
983
+ rule: >-
984
+ Canonical v1 pending review stores remain readable without a write. Only
985
+ disposition may compat-decode one valid v1 record after it revalidates the
986
+ current receipt and projection. It derives the missing scope only from that
987
+ current validated receipt, preserves the listed immutable bindings and review
988
+ identity, and atomically writes the v2 store and replay state. Invalid or
989
+ ambiguous v1 input fails before effects. Untouched valid v1 records remain
990
+ byte-for-byte v1 records inside the v2 store until their own disposition.
991
+ queue:
992
+ command:
993
+ canonical: npx -y agentera@next report personal-glossary-reviews
994
+ namespace: report
995
+ input_flag: --input
996
+ stdin_value: '-'
997
+ format: json
998
+ project_checkout: not_required
999
+ request:
1000
+ schema_version: agentera.personalGlossaryReviewQueueRequest.v1
1001
+ required_fields: [schema_version, receipt]
1002
+ additional_fields: forbidden
1003
+ max_utf8_bytes: 16384
1004
+ decision_outcome: review_required
1005
+ current_bindings:
1006
+ - candidate_id
1007
+ - candidate_revision
1008
+ - candidate_capsule_sha256
1009
+ - candidate_projection_sha256
1010
+ - host_receipt_sha256
1011
+ - cli_decision_sha256
1012
+ - semantic_fingerprint
1013
+ - generation
1014
+ - policy_version
1015
+ - reason
1016
+ result:
1017
+ schema_version: agentera.personalGlossaryReviewQueueResult.v1
1018
+ statuses: [queued, unchanged_replay, suppressed, reopened]
1019
+ max_utf8_bytes: 4096
1020
+ no_question_channel: queue_without_prompt_or_disposition
1021
+ rule: >-
1022
+ Queue revalidates one bounded host receipt through the current deterministic
1023
+ CLI decision before a write. Only a current review_required decision may
1024
+ create pending metadata. The command does not prompt, accept a disposition,
1025
+ write a profile entry, read or change project state, or mutate the candidate
1026
+ projection.
1027
+ disposition:
1028
+ command:
1029
+ canonical: npx -y agentera@next report personal-glossary-reviews
1030
+ namespace: report
1031
+ input_flag: --input
1032
+ stdin_value: '-'
1033
+ format: json
1034
+ project_checkout: not_required
1035
+ request:
1036
+ schema_version: agentera.personalGlossaryReviewDispositionRequest.v1
1037
+ required_fields: [schema_version, review_id, receipt, approval]
1038
+ additional_fields: forbidden
1039
+ max_utf8_bytes: 16384
1040
+ result:
1041
+ schema_version: agentera.personalGlossaryReviewDispositionResult.v1
1042
+ statuses: [disposed, unchanged_replay]
1043
+ max_utf8_bytes: 4096
1044
+ publication_authorization:
1045
+ dispositions: [accept, correct]
1046
+ fields: [review_id, review_record_sha256]
1047
+ rule: >-
1048
+ Disposition accepts only a current queued review and a complete signed
1049
+ current-user local-host approval. It verifies the configured trusted public
1050
+ key, exact receipt fields and bindings, current clock freshness, replay index,
1051
+ current projection, policy, and semantic fingerprint before a user-local write.
1052
+ Accept and correct create an opaque authorization for the existing personal
1053
+ publish command. Reject and defer never publish. The operation does not read
1054
+ project state, mutate the candidate projection, or change PROFILE.md.
1055
+ retrieval:
1056
+ command:
1057
+ canonical: npx -y agentera@next report personal-glossary-reviews
1058
+ namespace: report
1059
+ format: json
1060
+ project_checkout: not_required
1061
+ owner: current_user
1062
+ schema_version: agentera.personalGlossaryReviewRetrieval.v1
1063
+ list:
1064
+ default_limit: 20
1065
+ maximum_limit: 50
1066
+ max_serialized_utf8_bytes: 32768
1067
+ order: queued_at_desc_then_review_id_asc
1068
+ filters:
1069
+ status: [pending, terminal]
1070
+ cursor:
1071
+ authority: references/artifacts/state-storage-authority.yaml#entity_target.public_retrieval.policy.cursor
1072
+ vocabulary: opaque_snapshot_cursor
1073
+ binding: [collection, owner, filters, limit, order, snapshot]
1074
+ invalid_behavior: cursor_invalid
1075
+ unavailable_behavior: cursor_snapshot_unavailable
1076
+ summaries: >-
1077
+ List returns only opaque identity and binding digests, stable reason,
1078
+ lifecycle status and dates, and bounded current, stale, or expired counts.
1079
+ It never returns candidate content, source identity, user identity, or
1080
+ approval material.
1081
+ exact:
1082
+ required_bindings: [review_id, candidate_id, candidate_revision, generation, policy_version]
1083
+ current_binding_field: candidate_projection_sha256
1084
+ max_serialized_utf8_bytes: 8192
1085
+ rule: >-
1086
+ Exact retrieval validates every selector, including a current
1087
+ content-addressed generation or non-secret, non-path generation and policy
1088
+ metadata bindings, the record digest, the current
1089
+ store owner, and the record's current candidate projection binding before
1090
+ emitting one private metadata record.
1091
+ rule: >-
1092
+ Reads are structured, non-interactive, private to the configured current-user
1093
+ profile, bounded, and mutation-free. They cannot select another owner or
1094
+ return stale, malformed, expired, or owner-mismatched metadata.
1095
+ maintenance:
1096
+ entrypoint: packages/cli/src/analytics/personalGlossaryReviewRecords.ts#maintainPersonalGlossaryReviewRecords
1097
+ exposure: authenticated_review_owner_only
1098
+ terminal_metadata_days: 90
1099
+ pending_metadata: retained_until_terminal_or_purge
1100
+ cache: replay_index_until_receipt_expiry
1101
+ purge: current_user_authorized_review_records_only
1102
+ forbidden_effects:
1103
+ - profile_entry
1104
+ - project_state
1105
+ - candidate_projection
1106
+ - publication
1107
+ rule: >-
1108
+ Separate maintenance removes only expired terminal review metadata and expired
1109
+ replay-index entries, or the complete review-record file after a
1110
+ current-user-authorized purge. It never creates a record during a read and
1111
+ never deletes or changes a profile entry, project state, candidate projection,
1112
+ or publication result.
1113
+ admission:
1114
+ inferred_automatic_admission: disabled
1115
+ inferred_review: allowed
1116
+ quality_threshold: references/analysis/personal-glossary-evaluation-authority.yaml#gates.release_authorizing_gate
1117
+ holdout: references/analysis/personal-glossary-evaluation-authority.yaml#holdout
1118
+ rule: >-
1119
+ The separate evaluation authority defines the frozen holdout, metric
1120
+ thresholds, and fail-closed release gate. Inferred meanings remain
1121
+ review-only, and no measured result enables inferred automatic admission.
1122
+
1123
+ candidate_contracts:
1124
+ schema_version: agentera.personalGlossaryCandidateContracts.v1
1125
+ status: active_partial
1126
+ implementation_boundary: receipt_validation_deterministic_decision_and_explicit_personal_publication_runtime
1127
+ purpose: >-
1128
+ Define five distinct, content-addressed boundaries for one personal glossary
1129
+ candidate. Discovery and projection own evidence, the semantic host owns only
1130
+ bounded classification, the CLI owns deterministic admission validation, the
1131
+ user owns review lifecycle, and one explicit personal publication operation
1132
+ owns the personal publication result. Candidate retrieval alone exposes
1133
+ private reads; personal publication alone changes the owned profile section.
1134
+ Neither replaces shared consumer or project publication contracts.
1135
+ canonicalization:
1136
+ algorithm: sha256
1137
+ encoding: lowercase_hex
1138
+ input: canonical_utf8_json
1139
+ object_keys: unicode_code_point_sorted
1140
+ evidence_records: canonical_json_sorted
1141
+ digest_field_rule: exclude_digest_field_from_body
1142
+ arrays: preserve_declared_order
1143
+ rule: >-
1144
+ Every digest hashes canonical UTF-8 JSON with recursively sorted object keys.
1145
+ Evidence records are sorted by their canonical JSON before capsule creation.
1146
+ A layer digest excludes only its own digest field. Strings are preserved
1147
+ exactly; no Unicode normalization or display-label substitution is allowed.
1148
+ identity:
1149
+ stable_term_identity: personal_mining_authority.term_identity.stable_term_identity
1150
+ candidate_revision: personal_mining_authority.term_identity.candidate_revision
1151
+ rule: >-
1152
+ candidate_id is the settled stable term identity. candidate_revision is
1153
+ produced only by the current revision helper, so meaning, evidence, policy,
1154
+ or generation changes produce a new revision while an unchanged equality
1155
+ class keeps the same stable identity.
1156
+ bounds:
1157
+ term_max_utf8_bytes: 256
1158
+ meaning_max_utf8_bytes: 4096
1159
+ binding_max_utf8_bytes: 256
1160
+ evidence_records_max: 100
1161
+ reason_max_utf8_bytes: 512
1162
+ corrected_meaning_max_utf8_bytes: 4096
1163
+ digest_bytes: 32
1164
+ rule: >-
1165
+ These limits apply before downstream effects. Candidate evidence remains a
1166
+ complete bounded projection, not a preview that can silently omit records.
1167
+ layers:
1168
+ evidence_capsule:
1169
+ owner: deterministic_discovery_projection
1170
+ schema_version: agentera.personalGlossaryCandidateCapsule.v1
1171
+ required_fields:
1172
+ - schema_version
1173
+ - owner
1174
+ - candidate_id
1175
+ - candidate_revision
1176
+ - term
1177
+ - meaning
1178
+ - scope
1179
+ - provenance_kind
1180
+ - evidence
1181
+ - evidence_complete
1182
+ - evidence_set_sha256
1183
+ - policy_version
1184
+ - generation
1185
+ - capsule_sha256
1186
+ additional_fields: forbidden
1187
+ binding_fields: [candidate_id, candidate_revision, generation, policy_version]
1188
+ body_digest: capsule_sha256
1189
+ evidence_owner: deterministic_discovery_projection
1190
+ evidence_source: personal_mining_authority.provenance
1191
+ evidence_required_fields: provenance_variant_required_fields
1192
+ evidence_complete: true
1193
+ forbidden_fields:
1194
+ - admission
1195
+ - decision
1196
+ - review
1197
+ - publication
1198
+ - mutation
1199
+ - trusted_publication_effect
1200
+ rule: >-
1201
+ The capsule contains only the bounded candidate projection and complete
1202
+ qualifying evidence identities. It has no host judgment, admission result,
1203
+ review disposition, or publication effect.
1204
+ host_classification_receipt:
1205
+ owner: semantic_host_classification
1206
+ schema_version: agentera.personalGlossaryHostClassificationReceipt.v1
1207
+ required_fields:
1208
+ - schema_version
1209
+ - owner
1210
+ - candidate_id
1211
+ - candidate_revision
1212
+ - candidate_capsule_sha256
1213
+ - candidate_projection_sha256
1214
+ - generation
1215
+ - policy_version
1216
+ - classification
1217
+ - semantic_fingerprint
1218
+ - receipt_sha256
1219
+ additional_fields: forbidden
1220
+ binding_fields:
1221
+ - candidate_id
1222
+ - candidate_revision
1223
+ - candidate_capsule_sha256
1224
+ - candidate_projection_sha256
1225
+ - generation
1226
+ - policy_version
1227
+ body_digest: receipt_sha256
1228
+ classification:
1229
+ fields: [term, meaning, scope, permanence, consistency, confidence]
1230
+ term: shared_primitive.fields.term
1231
+ meaning: shared_primitive.fields.meaning
1232
+ scope: packages/cli/src/registries/glossaryTermIdentity.ts#GlossaryCandidateScope
1233
+ permanence: shared_primitive.fields.permanence
1234
+ confidence: shared_primitive.fields.confidence
1235
+ consistency_values: [consistent, inconsistent, uncertain]
1236
+ forbidden_fields:
1237
+ - admission
1238
+ - decision
1239
+ - mutation
1240
+ - publication
1241
+ - review_bypass
1242
+ - trusted_publication_effect
1243
+ - project_glossary
1244
+ - project_publication
1245
+ rule: >-
1246
+ The host may classify only term, meaning, scope, permanence, consistency,
1247
+ and confidence. The receipt binds the exact capsule, current projection,
1248
+ revision, generation, and policy. It cannot choose admission, authorize
1249
+ mutation, bypass review, or supply a trusted publication effect.
1250
+ cli_decision:
1251
+ owner: deterministic_cli_admission_validation
1252
+ schema_version: agentera.personalGlossaryAdmissionDecision.v1
1253
+ required_fields:
1254
+ - schema_version
1255
+ - owner
1256
+ - candidate_id
1257
+ - candidate_revision
1258
+ - candidate_capsule_sha256
1259
+ - candidate_projection_sha256
1260
+ - host_receipt_sha256
1261
+ - classification_contract_version
1262
+ - semantic_fingerprint
1263
+ - generation
1264
+ - policy_version
1265
+ - outcome
1266
+ - reason
1267
+ - decision_sha256
1268
+ additional_fields: forbidden
1269
+ binding_fields:
1270
+ - candidate_id
1271
+ - candidate_revision
1272
+ - candidate_capsule_sha256
1273
+ - candidate_projection_sha256
1274
+ - host_receipt_sha256
1275
+ - classification_contract_version
1276
+ - semantic_fingerprint
1277
+ - generation
1278
+ - policy_version
1279
+ body_digest: decision_sha256
1280
+ outcomes: [automatic_admission, review_required, abstain]
1281
+ reason_codes:
1282
+ - explicit_current_authorized
1283
+ - inferred_requires_review
1284
+ - scope_ambiguous
1285
+ - classification_inconsistent
1286
+ - classification_changed
1287
+ - entry_conflict
1288
+ - evidence_retracted_or_conflicted
1289
+ - quality_gate_not_authorizing
1290
+ - scope_project
1291
+ - evidence_unavailable
1292
+ - evidence_changed
1293
+ reason_codes_by_outcome:
1294
+ automatic_admission: [explicit_current_authorized]
1295
+ review_required:
1296
+ - inferred_requires_review
1297
+ - scope_ambiguous
1298
+ - classification_inconsistent
1299
+ - classification_changed
1300
+ - entry_conflict
1301
+ - evidence_retracted_or_conflicted
1302
+ - quality_gate_not_authorizing
1303
+ abstain: [scope_project, evidence_unavailable, evidence_changed]
1304
+ automatic_admission:
1305
+ owner: deterministic_cli_admission_validation
1306
+ allowed_provenance: provenance_variants.personal_explicit_definition
1307
+ inferred_automatic_admission: disabled
1308
+ required_classification:
1309
+ scope: personal
1310
+ consistency: consistent
1311
+ term: exact_capsule_term
1312
+ meaning: exact_capsule_meaning
1313
+ current_evidence: required
1314
+ quality_gate: personal_mining_authority.admission.quality_threshold
1315
+ command:
1316
+ canonical: npx -y agentera@next report personal-glossary-decision
1317
+ namespace: report
1318
+ input_flag: --input
1319
+ stdin_value: '-'
1320
+ format: json
1321
+ project_checkout: not_required
1322
+ request:
1323
+ schema_version: agentera.personalGlossaryAdmissionRequest.v1
1324
+ required_fields: [schema_version, receipt]
1325
+ additional_fields: forbidden
1326
+ max_utf8_bytes: 16384
1327
+ result:
1328
+ schema_version: agentera.personalGlossaryAdmissionResult.v1
1329
+ fields: [schemaVersion, command, status, decision, reason, effects]
1330
+ statuses: [automatic_admission, review_required, abstain]
1331
+ max_utf8_bytes: 4096
1332
+ effects: []
1333
+ receipt_construction:
1334
+ schema_version: agentera.personalGlossaryAdmissionRequest.v2
1335
+ required_fields: [schema_version, candidate_id, candidate_revision, candidate_capsule_sha256, candidate_projection_sha256, generation, policy_version, classification]
1336
+ additional_fields: forbidden
1337
+ max_utf8_bytes: 16384
1338
+ result:
1339
+ schema_version: agentera.personalGlossaryAdmissionResult.v2
1340
+ fields: [schemaVersion, command, status, receipt, decision, reason, effects]
1341
+ statuses: [automatic_admission, review_required, abstain]
1342
+ max_utf8_bytes: 16384
1343
+ effects: []
1344
+ rule: >-
1345
+ The command accepts either one existing host receipt or one bounded host
1346
+ classification with every exact candidate binding through a structured
1347
+ file or stdin request. For the classification request, the CLI reads the
1348
+ current private projection, constructs the receipt including its semantic
1349
+ fingerprint and receipt digest, computes one deterministic outcome, and
1350
+ returns both receipt and decision. It emits JSON without changing a
1351
+ projection, review record, profile, project glossary, or project state.
1352
+ forbidden_fields: [host_authority, host_override, mutation, publication]
1353
+ rule: >-
1354
+ Only the deterministic CLI validator may emit an admission outcome. It
1355
+ validates the capsule and host receipt bindings before any later workflow;
1356
+ it does not itself write a profile, project glossary, or review record.
1357
+ review_record:
1358
+ owner: user_local_review_lifecycle
1359
+ schema_version: agentera.personalGlossaryReviewRecord.v1
1360
+ required_fields:
1361
+ - schema_version
1362
+ - owner
1363
+ - candidate_id
1364
+ - candidate_revision
1365
+ - candidate_capsule_sha256
1366
+ - host_receipt_sha256
1367
+ - cli_decision_sha256
1368
+ - semantic_fingerprint
1369
+ - generation
1370
+ - policy_version
1371
+ - disposition
1372
+ - corrected_meaning
1373
+ - corrected_scope
1374
+ - disposed_at
1375
+ - expires_at
1376
+ - record_sha256
1377
+ additional_fields: forbidden
1378
+ binding_fields:
1379
+ - candidate_id
1380
+ - candidate_revision
1381
+ - candidate_capsule_sha256
1382
+ - host_receipt_sha256
1383
+ - cli_decision_sha256
1384
+ - semantic_fingerprint
1385
+ - generation
1386
+ - policy_version
1387
+ body_digest: record_sha256
1388
+ storage: $AGENTERA_PROFILE_DIR/intermediate/personal-glossary
1389
+ dispositions_from: [personal_mining_authority.privacy.reviews.dispositions]
1390
+ authentication: personal_mining_authority.privacy.reviews.authentication
1391
+ forbidden_fields:
1392
+ - project_glossary
1393
+ - project_publication
1394
+ - profile_entry_mutation
1395
+ - trusted_host_authority
1396
+ rule: >-
1397
+ A review record is user-local lifecycle state bound to the exact candidate,
1398
+ semantic classification, generation, policy, and CLI decision. It is not a
1399
+ host classification receipt and cannot mutate project or profile state by
1400
+ itself.
1401
+ publication_result:
1402
+ owner: personal_profile_publication
1403
+ schema_version: agentera.personalGlossaryPublicationResult.v1
1404
+ required_fields:
1405
+ - schema_version
1406
+ - owner
1407
+ - candidate_id
1408
+ - candidate_revision
1409
+ - candidate_capsule_sha256
1410
+ - decision_sha256
1411
+ - review_record_sha256
1412
+ - generation
1413
+ - policy_version
1414
+ - status
1415
+ - profile_section_sha256
1416
+ - published_at
1417
+ - result_sha256
1418
+ additional_fields: forbidden
1419
+ binding_fields:
1420
+ - candidate_id
1421
+ - candidate_revision
1422
+ - candidate_capsule_sha256
1423
+ - decision_sha256
1424
+ - generation
1425
+ - policy_version
1426
+ body_digest: result_sha256
1427
+ command: ownership_contracts.personal.profile_output.command.canonical
1428
+ status_values_from: [ownership_contracts.personal.profile_output.command.output_statuses]
1429
+ forbidden_fields:
1430
+ - project_glossary
1431
+ - project_publication
1432
+ - consumer_precedence
1433
+ - review_authorization
1434
+ rule: >-
1435
+ This is the bounded result of explicit personal-profile publication only. It binds
1436
+ the validated decision and optional review record, reports the existing
1437
+ personal output status, and never changes Build-owned project publication.
1438
+ shared_invariance:
1439
+ shared_primitive: shared_primitive
1440
+ consumer_precedence: consumer_boundary.primary_selection
1441
+ project_publication: ownership_contracts.project.publication
1442
+ personal_project_isolation: ownership_contracts.personal.admission.isolation_rule
1443
+ rule: >-
1444
+ Candidate contracts add evidence and identity bindings without adding fields
1445
+ to the shared glossary entry. Consumers keep project precedence and Build
1446
+ publication unchanged; personal mining has no project glossary input.
1447
+ recovery:
1448
+ stale_or_mismatch: fail_closed_no_effects
1449
+ retry: >-
1450
+ Reject the layer before effects, reread the current bounded source contract,
1451
+ recompute the capsule and settled identities, and retry the downstream
1452
+ operation with all exact bindings. Never repair a stale receipt in place.
1453
+
1454
+ provenance_variants:
1455
+ personal_explicit_definition:
1456
+ owner: personal
1457
+ evidence_count: 1
1458
+ required_evidence_fields: [source_id, evidence_anchor, signal_type]
1459
+ additional_evidence_fields: forbidden
1460
+ source_provenance:
1461
+ required_fields: [source_id, evidence_anchor, source_kind, signal_type, origin_id, content_fingerprint, author_class, session_id, project_id]
1462
+ allowed_source_kinds: [conversation_turn]
1463
+ identity_fields_must_match_full_record: true
1464
+ allowed_signal_types: [correction, decision, instruction]
1465
+ resolution_rule: >-
1466
+ evidence_anchor resolves to source_id of exactly one retained
1467
+ full-evidence shard through the bounded signal tier. One such distinct
1468
+ retained record is sufficient; unanchored or unresolved evidence fails.
1469
+ personal_inferred_usage:
1470
+ owner: personal
1471
+ evidence_count: 2
1472
+ required_evidence_fields: [source_id, evidence_anchor, source_kind]
1473
+ additional_evidence_fields: forbidden
1474
+ distinctness:
1475
+ source_ids: 2
1476
+ evidence_anchors: 2
1477
+ allowed_source_kinds: [instruction_document, project_config_signal]
1478
+ resolution_rule: >-
1479
+ Each evidence_anchor resolves to its source_id in retained full evidence.
1480
+ Both source_id and evidence_anchor must be pairwise distinct, so two
1481
+ signals or anchors resolving to one retained record fail. Both anchors
1482
+ remain exposed on the entry.
1483
+ personal_inferred_conversation:
1484
+ owner: personal
1485
+ evidence_count: variable
1486
+ minimum_evidence_count: 3
1487
+ required_evidence_fields:
1488
+ - source_id
1489
+ - evidence_anchor
1490
+ - source_kind
1491
+ - signal_type
1492
+ - session_id
1493
+ - project_id
1494
+ - content_fingerprint
1495
+ - author_class
1496
+ additional_evidence_fields: forbidden
1497
+ allowed_signal_types: [correction, decision, question, instruction, configuration]
1498
+ allowed_source_kinds: [conversation_turn]
1499
+ allowed_author_classes: [user]
1500
+ distinctness:
1501
+ source_ids: 3
1502
+ evidence_anchors: 3
1503
+ session_ids: 2
1504
+ project_ids: 2
1505
+ content_fingerprints: 3
1506
+ completeness_field: provenance.evidence_complete
1507
+ completeness_value: true
1508
+ completeness_authority: expected_qualifying_anchor_set_exact_match
1509
+ expected_evidence:
1510
+ binding: generation_bound
1511
+ context_fields: [generation, qualifying_evidence_anchors, qualifying_evidence_set_sha256]
1512
+ exact_set: required
1513
+ set_digest:
1514
+ algorithm: sha256
1515
+ encoding: lowercase_hex
1516
+ canonicalization: >-
1517
+ Hash canonical UTF-8 JSON containing the schema name, generation, and
1518
+ lexicographically code-point-sorted qualifying evidence anchors. The
1519
+ expected set digest is authoritative; list order is not.
1520
+ duplicate_rule: >-
1521
+ Reject duplicate source_id, evidence_anchor, or content_fingerprint at
1522
+ every list length, even when the list still meets the minimum count.
1523
+ admission: review_only
1524
+ resolution_rule: >-
1525
+ Retain every qualifying user-authored conversation record. At least three
1526
+ pairwise-distinct source identities, anchors, and content fingerprints must
1527
+ span at least two sessions and two projects. Agent-authored text may
1528
+ corroborate a later review but cannot satisfy this variant. The evidence
1529
+ list is complete, not a bounded preview; any unresolved, duplicated, or
1530
+ missing identity fails.
1531
+ project_file:
1532
+ owner: project
1533
+ evidence_count: 1
1534
+ required_evidence_fields: [source_path, source_record_sha256]
1535
+ additional_evidence_fields: forbidden
1536
+ resolution_rule: >-
1537
+ source_path is a safe project-relative path and source_record_sha256 is
1538
+ the lowercase SHA-256 of the cited parsed source record. These reuse the
1539
+ repository source-path and record-digest provenance vocabulary from
1540
+ references/artifacts/state-storage-authority.yaml.
1541
+
1542
+ ownership_contracts:
1543
+ personal:
1544
+ scope: user
1545
+ implementation:
1546
+ status: active_partial
1547
+ active:
1548
+ - bounded_admission
1549
+ - bounded_explicit_discovery
1550
+ - bounded_candidate_projection
1551
+ - bounded_candidate_retrieval
1552
+ - public_receipt_construction
1553
+ - host_classification_receipt_validation
1554
+ - deterministic_cli_admission_decision
1555
+ - explicit_classification
1556
+ - inferred_evidence_check
1557
+ - authorized_personal_publication
1558
+ - profile_section_persistence
1559
+ inactive: [lookup]
1560
+ allowed_provenance:
1561
+ - personal_explicit_definition
1562
+ - personal_inferred_usage
1563
+ - personal_inferred_conversation
1564
+ input:
1565
+ tier: signal
1566
+ authority: references/analysis/evidence-tier-authority.yaml
1567
+ bounded_rule: >-
1568
+ Admit only bounded personal-history signals and resolve qualifying
1569
+ evidence one anchor at a time to retained full-evidence shards. Never
1570
+ scan unbounded history or load a monolithic corpus.
1571
+ excluded_categories:
1572
+ - project_glossary_artifact_identity
1573
+ - project_glossary_path
1574
+ - project_glossary_record
1575
+ - project_file_provenance
1576
+ admission:
1577
+ explicit:
1578
+ candidate_signal_types: [correction, decision]
1579
+ language_rule: >-
1580
+ The bounded explicit discovery grammar accepts only the ten forms in
1581
+ personal_mining_authority.explicit_discovery. Quoted or code-delimited
1582
+ means, standalone safe definition-list colons, exact acronym expansions,
1583
+ By X I mean Y, Use X for/to mean Y, To clarify X refers to Y, the
1584
+ clarification prefer form, and approved correction means forms are
1585
+ recognized. YAML/config labels, times, URLs, headings, citations,
1586
+ indirect questions, future language, and unbound prose are rejected.
1587
+ evidence_count: 1
1588
+ inferred:
1589
+ candidate_signal_types: [instruction, configuration]
1590
+ source_kinds: [instruction_document, project_config_signal]
1591
+ identity_rule: >-
1592
+ A requested term must occur as a complete case-insensitive token in
1593
+ two pairwise-distinct retained source identities and anchors. Duplicate
1594
+ identities or anchors fail and successful admission exposes both.
1595
+ evidence_count: 2
1596
+ read_rule: >-
1597
+ Read the bounded signal tier once, select only authority-declared signal
1598
+ types and source kinds, and resolve each selected evidence_anchor through
1599
+ direct single-shard retrieval. Never iterate full history or read legacy
1600
+ corpus.json. Missing, legacy, corrupt, or insufficient evidence returns
1601
+ deterministic recovery without a candidate.
1602
+ insufficient_recovery: >-
1603
+ Refresh bounded local-history evidence or provide another distinct
1604
+ qualifying record; no personal glossary candidate was admitted.
1605
+ isolation_rule: >-
1606
+ Admission accepts only the personal tiers directory and optional legacy
1607
+ corpus location. It has no project-glossary identity, path, or record
1608
+ input, and its result is invariant to project-glossary presence.
1609
+ retention_and_decay:
1610
+ retention: Retained entries decay rather than disappearing solely because evidence ages.
1611
+ confidence: Apply the existing profile permanence decay class to integer confidence.
1612
+ permanence: Remains independently classified and is not changed by evidence age or confidence decay.
1613
+ authority: packages/cli/src/capabilities/profile/instructions.ts#Profile-format
1614
+ profile_output:
1615
+ owner: personal_profile_publication
1616
+ lifecycle_callable: packages/cli/src/analytics/personalGlossaryProfile.ts#updatePersonalGlossaryProfile
1617
+ command:
1618
+ canonical: npx -y agentera@next report personal-glossary-publish
1619
+ namespace: report
1620
+ input_flag: --input
1621
+ stdin_value: "-"
1622
+ format: json
1623
+ dry_run_flag: --dry-run
1624
+ project_checkout: not_required
1625
+ request:
1626
+ schema_version: agentera.personalGlossaryPublishRequest.v1
1627
+ required_fields: [schema_version, receipt, decision, as_of]
1628
+ optional_fields: [review_authorization]
1629
+ additional_fields: forbidden
1630
+ max_utf8_bytes: 16384
1631
+ profile_path_rule: >-
1632
+ Resolve only $AGENTERA_PROFILE_DIR/PROFILE.md through the canonical
1633
+ user-profile authority. The request cannot select a path, project
1634
+ root, project glossary, or other artifact.
1635
+ current_decision_rule: >-
1636
+ Accept either a complete CLI-owned automatic_admission decision with
1637
+ explicit_current_authorized reason and no review authorization, or one
1638
+ current review_required decision with an exact stored accept or correct
1639
+ authorization. Before effects, revalidate the current projection,
1640
+ capsule, receipt, generation, policy, semantic fingerprint, current
1641
+ meaning and revision, scope, conflict, retraction, secret content, and
1642
+ the existing decision rules. A review authorization never skips current
1643
+ evidence validation and does not permit project scope.
1644
+ review_authorization:
1645
+ required_fields: [review_id, review_record_sha256]
1646
+ additional_fields: forbidden
1647
+ dispositions: [accept, correct]
1648
+ source: personal_mining_authority.review_records.disposition.publication_authorization
1649
+ rule: >-
1650
+ The command rereads one current user-local review record, validates its
1651
+ canonical record hash and all receipt, decision, projection, policy,
1652
+ semantic-fingerprint, and revision bindings, then uses its approved
1653
+ corrected meaning and personal scope only for correct. No direct review
1654
+ record, correction, key, nonce, signature, profile path, or project path
1655
+ is accepted from publication input.
1656
+ date_rule: >-
1657
+ as_of is one injected ISO calendar date. Use it for lifecycle
1658
+ rendering and derive published_at as UTC midnight of that exact date;
1659
+ never read the wall clock for publication content or replay.
1660
+ result:
1661
+ schema_version: agentera.personalGlossaryPublicationResult.v1
1662
+ fields: [schema_version, owner, candidate_id, candidate_revision, candidate_capsule_sha256, decision_sha256, review_record_sha256, generation, policy_version, status, profile_section_sha256, published_at, result_sha256]
1663
+ max_utf8_bytes: 4096
1664
+ output_statuses: [changed, unchanged_replay, dry_run_candidate]
1665
+ rule: >-
1666
+ The packaged headless command accepts only one bounded structured
1667
+ receipt and CLI decision, revalidates authorization immediately before
1668
+ effects, and invokes the lifecycle_callable without duplicating merge,
1669
+ decay, replacement, or persistence behavior. It changes only the owned
1670
+ PROFILE.md Glossary section. JSON output contains opaque bindings only;
1671
+ diagnostics use stable generic envelopes. Dry-run computes a candidate
1672
+ without writing PROFILE.md.
1673
+ section:
1674
+ heading: "## Glossary"
1675
+ start_marker: "<!-- agentera:personal-glossary:start -->"
1676
+ end_marker: "<!-- agentera:personal-glossary:end -->"
1677
+ encoding: deterministic_json_fence
1678
+ document_schema_version: agentera.personalGlossarySection.v1
1679
+ entry_shape: shared_primitive
1680
+ lifecycle_metadata: [as_of, confidence_basis]
1681
+ boundary_rule: >-
1682
+ Add one owned section when absent or replace exactly the bytes from its
1683
+ start marker through its end marker. Reject unmatched markers,
1684
+ duplicate owned sections, or an unowned Glossary heading before any
1685
+ write. Preserve every other profile byte exactly.
1686
+ merge_identity:
1687
+ normalization: unicode_caseless_exact_no_normalization
1688
+ rule: >-
1689
+ One locale-independent Unicode caseless-exact term identity may occur
1690
+ once. Identity performs no Unicode normalization, accent folding, or
1691
+ compatibility folding; canonically distinct strings remain distinct.
1692
+ Preserve the established spelling and observed_at date. Fresh
1693
+ qualifying evidence may refresh an entry only when meaning and
1694
+ provenance kind are unchanged; divergent meaning or provenance kind is
1695
+ a conflict rather than an implicit overwrite.
1696
+ refresh_rule: >-
1697
+ For matching fresh qualifying evidence, set confidence and its
1698
+ confidence_basis to the fresh evidence-based integer, replace only the
1699
+ same-kind personal evidence anchors, and set last_confirmed_at to the
1700
+ injected as_of date. Preserve observed_at and permanence. This rule is
1701
+ stable for identical input and as_of.
1702
+ decay_rule: >-
1703
+ Without matching fresh evidence, retain the entry and permanence. Derive
1704
+ confidence from its unchanged confidence_basis, its permanence-class
1705
+ lambda, and calendar days from last_confirmed_at to injected as_of using
1706
+ the Profile formula; round to the nearest integer after applying the
1707
+ existing floor. The section-level basis prevents same-date drift and
1708
+ repeated compounding from already-decayed confidence. Age alone never
1709
+ removes an entry.
1710
+ isolation_rule: >-
1711
+ The command accepts only one receipt, one CLI decision, and an injected
1712
+ ISO date. It resolves the canonical user PROFILE.md path itself and has
1713
+ no project root, project glossary parameter, artifact lookup, or project
1714
+ file read.
1715
+ filesystem:
1716
+ authority: host_filesystem
1717
+ configured_path: canonical_user_profile_authority
1718
+ outcomes: ordinary_permissions_and_io
1719
+ same_user_path_manipulation: outside_agentera_threat_model
1720
+ symlink_confinement: not_claimed
1721
+ rule: >-
1722
+ Profile storage uses ordinary current-user filesystem permissions and
1723
+ atomic replacement. This contract does not claim symlink confinement.
1724
+ project:
1725
+ scope: repository
1726
+ implementation:
1727
+ status: active
1728
+ active: [audit_proposal_digest, build_publication, confirmed_variant_guard]
1729
+ inactive: [lookup, precedence, semantic_equivalence_review]
1730
+ allowed_provenance: [project_file]
1731
+ input:
1732
+ authority: repository_files
1733
+ bounded_rule: Admit only the cited project-relative record bound by its record SHA-256.
1734
+ excluded_categories: [personal_history_record, personal_history_anchor]
1735
+ proposal_digest:
1736
+ algorithm: sha256
1737
+ encoding: lowercase_hex
1738
+ canonicalization: >-
1739
+ Hash the complete terminology finding except proposal_digest as canonical
1740
+ JSON with mapping keys sorted recursively. Sort canonical_evidence and
1741
+ each variant evidence by source_path, line, then source_record_sha256;
1742
+ sort variants by case-insensitive term and then exact term. The digest
1743
+ therefore changes when any proposal, confidence, severity, divergence,
1744
+ term, source path, line identity, or source-record digest changes, but not
1745
+ when equivalent evidence or variant arrays arrive in a different order.
1746
+ Locale-independent lowercase ordering is only a deterministic sort key;
1747
+ it does not define term identity.
1748
+ proposal_validation:
1749
+ owner: audit
1750
+ shared_runtime: packages/cli/src/audit/terminologyDrift.ts#validateTerminologyProposal
1751
+ required_rules:
1752
+ - safe_distinct_evidence_identities_per_term
1753
+ - unicode_caseless_exact_unique_term_identities
1754
+ - best_supported_canonical_term_with_lexicographic_tie_break
1755
+ - authority_confidence_floor_and_range
1756
+ - confidence_below_70_forces_info_severity
1757
+ - canonical_evidence_and_variant_order
1758
+ - canonical_proposal_digest
1759
+ publication_rule: >-
1760
+ Build publication accepts only the complete canonical finding that this
1761
+ Audit-owned validator can emit. Publication reuses this validator and
1762
+ must not duplicate or weaken Audit proposal semantics.
1763
+ entry_derivation:
1764
+ term: proposal.proposed_canonical_term
1765
+ meaning: proposal.concept
1766
+ confidence: proposal.confidence
1767
+ permanence: stable
1768
+ temporal.observed_at: confirmation.confirmed_at calendar date
1769
+ temporal.last_confirmed_at: confirmation.confirmed_at calendar date
1770
+ provenance.kind: project_file
1771
+ provenance.evidence: >-
1772
+ Exactly the first canonical_evidence record after proposal-digest
1773
+ canonical ordering, projected to source_path and source_record_sha256.
1774
+ Line identifies and revalidates the source record during publication but
1775
+ is not persisted because it is not part of the shared project_file
1776
+ provenance variant.
1777
+ rejection_rule: >-
1778
+ Reject before effects when any required proposal or derived entry value
1779
+ is absent or invalid; never invent a field or extend the shared entry.
1780
+ publication:
1781
+ owner: build
1782
+ command: npx -y agentera@next state glossary publish --input REQUEST --format json
1783
+ request:
1784
+ schema_version: agentera.glossaryPublicationRequest.v1
1785
+ required_fields: [schema_version, proposal, confirmation]
1786
+ additional_fields: forbidden
1787
+ proposal_shape: complete_terminology_drift_finding_with_proposal_digest
1788
+ confirmation:
1789
+ required_fields: [proposal_digest, confirmed_by, confirmed_at]
1790
+ additional_fields: forbidden
1791
+ confirmed_by: user
1792
+ confirmed_at: iso_8601_timestamp
1793
+ binding: >-
1794
+ proposal_digest must equal the digest recomputed from proposal and
1795
+ therefore binds the exact finding, every cited source record, and
1796
+ the user's timestamped confirmation.
1797
+ persisted_document:
1798
+ schema_version: agentera.projectGlossary.v1
1799
+ required_fields: [schema_version, approvals, entries]
1800
+ additional_fields: forbidden
1801
+ approvals:
1802
+ type: list
1803
+ immutable_record_fields: [proposal_digest, proposal, confirmation]
1804
+ additional_record_fields: forbidden
1805
+ entries:
1806
+ type: list
1807
+ item: shared_primitive
1808
+ approval_fields: forbidden
1809
+ terminology_set_identity:
1810
+ normalization: unicode_caseless_exact_no_normalization
1811
+ members: [paired_entry.term, paired_approval.proposal.variants.term]
1812
+ uniqueness: global_across_complete_document
1813
+ rule: >-
1814
+ Every Unicode caseless-exact canonical or variant term belongs to
1815
+ exactly one approval-entry pair. Identity performs no Unicode
1816
+ normalization, accent folding, or compatibility folding. Reject
1817
+ duplicate variants and every cross-set canonical/variant collision
1818
+ before effects. An exact replay compares against its existing pair
1819
+ and remains a no-op.
1820
+ transaction: >-
1821
+ Under the established project writer lock, resolve the registered
1822
+ project path, safely re-read every cited project-relative source line,
1823
+ recompute its SHA-256 and the proposal digest, validate the complete
1824
+ candidate bytes, then atomically replace the single glossary document.
1825
+ Creation follows the same path. Dry-run performs all validation without
1826
+ publication.
1827
+ merge_and_replay: >-
1828
+ Preserve unrelated valid approvals and entries semantically unchanged.
1829
+ Canonical and variant identity is case-insensitive and globally unique
1830
+ across confirmed canonical sets. An exact approval and derived-entry
1831
+ replay is a no-op. An approval without its matching entry, a matching
1832
+ term with changed entry or proposal, reuse of an old confirmation for
1833
+ changed proposal content, duplicate identity, cross-set terminology
1834
+ collision, or malformed existing state is a conflict and must never be
1835
+ repaired or overwritten implicitly.
1836
+ confirmed_variant_guard:
1837
+ owner: packages/cli/src/validate/v1LegacyCruft.ts#scanPost30CruftViolations
1838
+ validation_surface: packages/cli/test/cli/v1LegacyCruft.test.ts
1839
+ loader: packages/cli/src/state/write/glossaryPublication.ts#loadProjectGlossaryDocument
1840
+ source_rule: >-
1841
+ Resolve the glossary through the canonical artifact registry and consume
1842
+ only complete validated approval-entry pairs. Derive each forbidden
1843
+ variant from approval.proposal.variants and its canonical replacement
1844
+ from the paired entry.term; never infer equivalence or consume personal
1845
+ glossary state.
1846
+ matching: exact_case_sensitive_boundary_aware_literal
1847
+ approved_evidence_rule: >-
1848
+ The exact source_path, line, and source_record_sha256 retained by the
1849
+ immutable proposal is historical evidence and does not self-trigger.
1850
+ Changed bytes at that location or a matching variant elsewhere fail.
1851
+ exclusions:
1852
+ - generated_output
1853
+ - vendor_and_dependency_state
1854
+ - cache_state
1855
+ - repository_metadata
1856
+ - historical_agentera_state
1857
+ - project_glossary_document
1858
+ - unrelated_agentera_state
1859
+ excluded_directory_names:
1860
+ - .agentera
1861
+ - .agentera-generated
1862
+ - .cache
1863
+ - .git
1864
+ - .next
1865
+ - .pnpm
1866
+ - .turbo
1867
+ - .venv
1868
+ - .vite
1869
+ - build
1870
+ - bundle
1871
+ - coverage
1872
+ - dist
1873
+ - node_modules
1874
+ - target
1875
+ - vendor
1876
+ exclusion_rule: >-
1877
+ Skip a directory only when its basename exactly equals one declared
1878
+ name. The validator and fixtures consume this list directly; prefixes,
1879
+ suffixes, substrings, and nearby ordinary source names remain scanned.
1880
+ failure_rule: >-
1881
+ Emit one deterministic violation per variant location with the canonical
1882
+ term, confirmed proposal evidence, offending source location, and the
1883
+ runnable validation command. A malformed present glossary fails closed;
1884
+ an absent glossary leaves the pre-existing legacy checks unchanged.
1885
+
1886
+ consumer_boundary:
1887
+ contract_status: active
1888
+ implementation:
1889
+ acquisition: active
1890
+ advice_resolution: active
1891
+ capability_integrations:
1892
+ build: active
1893
+ discuss: active
1894
+ plan: active
1895
+ prime: active
1896
+ forbidden_persisted_entry_fields: [precedence, collision, review]
1897
+ deterministic_judgments:
1898
+ term_identity: unicode_caseless_exact_no_normalization
1899
+ term_identity_runtime: packages/cli/src/registries/glossaryTermIdentity.ts#unicodeCaselessExact
1900
+ meaning_identity: exact_string
1901
+ project_state_validity: schema_and_bound_validation
1902
+ project_gap: valid_project_state_without_exact_term_identity
1903
+ forbidden_semantic_heuristics: [scores, thresholds, embeddings, automatic_merge]
1904
+ host_reviewed_judgments:
1905
+ inferred_semantic_equivalence: >-
1906
+ The host may identify a possible equivalence only from the current
1907
+ meaning-sensitive input and bounded candidate meanings. It never selects
1908
+ authority, merges entries, or resolves the review itself.
1909
+ project_state:
1910
+ gap_proving_states: [canonically_absent, valid_empty, valid_nonmatching]
1911
+ invalid_states: [malformed, unreadable, ambiguous_path, over_bound]
1912
+ invalid_rule: >-
1913
+ An invalid project state cannot prove a project gap. Abstain rather than
1914
+ falling back to a personal meaning, repairing state, or guessing authority.
1915
+ acquisition:
1916
+ implementation: active
1917
+ runtime: packages/cli/src/analytics/glossaryInputAcquisition.ts#acquireGlossaryInputs
1918
+ mutation: forbidden
1919
+ bounds:
1920
+ authority: consumer_boundary.profile_grounding.max_profile_utf8_bytes
1921
+ max_source_utf8_bytes: 65536
1922
+ max_entries: 100
1923
+ rule: >-
1924
+ Apply the existing bounded profile-read byte ceiling to each source and
1925
+ admit at most 100 entries from either owned glossary. The entry ceiling
1926
+ is declared only here and consumed by the runtime and schema validator.
1927
+ Reject raw bytes above the source ceiling before decoding, decode UTF-8
1928
+ fatally, and reject a parsed document above the entry ceiling; never
1929
+ replacement-decode, truncate, or partially admit input. Exactly 65,536
1930
+ raw bytes and 100 entries are permitted.
1931
+ availability:
1932
+ states:
1933
+ - absent
1934
+ - valid_empty
1935
+ - valid_present
1936
+ - malformed
1937
+ - unreadable
1938
+ - ambiguous
1939
+ - over_bound
1940
+ valid: [absent, valid_empty, valid_present]
1941
+ invalid: [malformed, unreadable, ambiguous, over_bound]
1942
+ project_gap_proving: [absent, valid_empty]
1943
+ rule: >-
1944
+ Classify the two sources independently. Project absence means the
1945
+ canonical artifact does not exist; personal absence means PROFILE.md or
1946
+ its owned Glossary section does not exist. A present empty owned document
1947
+ is valid_empty. Invalid states expose no entries and cannot prove a
1948
+ project gap. Dual invalid or absent input exposes no glossary entries;
1949
+ valid project entries remain available when personal input is invalid.
1950
+ project:
1951
+ identity: glossary
1952
+ discovery: packages/cli/src/registries/artifactRegistry.ts#loadArtifactRecord
1953
+ path_resolution: packages/cli/src/registries/artifactRegistry.ts#resolveArtifactPath
1954
+ docs_override: canonical_GLOSSARY.md_mapping_only
1955
+ docs_override_read: bounded_no_follow_regular_file
1956
+ project_root: packages/cli/src/state/projectRoot.ts#validateRealProjectRoot
1957
+ boundary_rule: >-
1958
+ Resolve only the registered glossary identity and its canonical docs
1959
+ override under one validated real project root. Missing canonical
1960
+ artifacts are absent. Unsafe overrides, path escapes, symlink ambiguity,
1961
+ or unavailable registry identity classify ambiguous; malformed present
1962
+ docs mappings or glossary documents fail closed and never fall back to a
1963
+ default path.
1964
+ filesystem_guarantee: >-
1965
+ Open the canonical .agentera/docs.yaml and resolved glossary target with
1966
+ O_NOFOLLOW after lstat snapshots of every existing project-relative path
1967
+ component. Match the opened regular-file descriptor to the snapshotted
1968
+ device and inode, read raw bytes from that descriptor, and require its
1969
+ size, mtime, ctime, device, and inode plus every snapshotted parent path
1970
+ identity to remain unchanged through the read. For an absent target,
1971
+ require the first missing component to remain missing while all existing
1972
+ parent identities remain unchanged. The descriptor pins accepted bytes;
1973
+ a symlink, parent swap, changed identity, unsupported no-follow boundary,
1974
+ or failed stability check is ambiguous. This does not claim detection of
1975
+ an identity swapped away and restored between observations, because such
1976
+ a swap cannot change bytes already pinned to the verified descriptor.
1977
+ external_docs_rule: >-
1978
+ A symlinked, escaped, changed, unreadable, malformed, over-bound, or
1979
+ non-UTF-8 docs mapping is ambiguous and never selects a glossary target.
1980
+ document_validation: ownership_contracts.project.publication
1981
+ approval_output: forbidden
1982
+ raw_source_provenance_output: forbidden
1983
+ personal:
1984
+ owner: ownership_contracts.personal.profile_output.owner
1985
+ profile_path_input: >-
1986
+ The caller passes exactly the profile path already returned by canonical
1987
+ profile context. Acquisition does not discover or return that path and
1988
+ accepts no project identity, root, glossary path, or project record.
1989
+ section: ownership_contracts.personal.profile_output.section
1990
+ parser: packages/cli/src/analytics/personalGlossaryProfile.ts#personalGlossaryConsumerEntries
1991
+ grounding_parser_isolation: >-
1992
+ profile-grounding continues to remove the owned section and never
1993
+ exposes it. Consumer acquisition separately parses exactly the existing
1994
+ single owned marker range and returns no bytes outside that range.
1995
+ provenance_output: forbidden
1996
+ producer_invariance: >-
1997
+ Personal parsing accepts only profile bytes and therefore returns the
1998
+ same result regardless of project glossary presence.
1999
+ output:
2000
+ entry_fields: [term, meaning, owner]
2001
+ owners: [personal, project]
2002
+ source_fields: [owner, availability, entries, gap_proving, diagnostic]
2003
+ diagnostic_fields: [class, recovery]
2004
+ diagnostic_rule: >-
2005
+ Diagnostics name only the availability class and a public recovery.
2006
+ They never contain profile paths, artifact paths, raw bytes, sections,
2007
+ definitions, entries, anchors, approval records, or provenance.
2008
+ entry_rule: >-
2009
+ Return only validated term and meaning plus source ownership. Do not
2010
+ return confidence, permanence, temporal metadata, personal anchors,
2011
+ profile paths, unrelated profile sections, project approval records, or
2012
+ project source provenance. Acquisition does not select precedence,
2013
+ fallback, tension, review, or a primary outcome.
2014
+ advice_resolution:
2015
+ implementation: active
2016
+ runtime: packages/cli/src/analytics/glossaryAdviceResolution.ts#resolveGlossaryAdvice
2017
+ mutation: forbidden
2018
+ invocation:
2019
+ command: npx -y agentera@next report glossary-advice --input REQUEST --format json
2020
+ request_schema_version: agentera.glossaryAdviceRequest.v1
2021
+ request_fields: [schema_version, requested_term, host_review]
2022
+ max_request_utf8_bytes: 131072
2023
+ acquisition: internal_bounded_owned_sources
2024
+ project_root: current_working_directory
2025
+ profile_path: canonical_registry_resolution
2026
+ output_envelope_fields: [schemaVersion, command, status, advice]
2027
+ rule: >-
2028
+ Consumers send the requested term and optional host review through one
2029
+ structured stdin or file request. The CLI acquires both owned sources;
2030
+ callers never read raw project glossary or profile files. The command is
2031
+ read-only, headless, JSON-only, and never refreshes either source.
2032
+ input:
2033
+ fields: [requested_term, acquired, host_review]
2034
+ requested_term_utf8_bound: consumer_boundary.acquisition.bounds.max_source_utf8_bytes
2035
+ acquired_contract: consumer_boundary.acquisition.output
2036
+ host_review:
2037
+ optional: true
2038
+ fields: [relation, candidate_owner, candidate_term]
2039
+ relations: [inferred_equivalence]
2040
+ candidate_owners: [personal]
2041
+ rule: >-
2042
+ A host may report only one explicit inferred-equivalence relation to
2043
+ one differently named, valid acquired personal candidate. Omission
2044
+ means no inferred candidate. Unknown relations, owners, fields, or
2045
+ candidates fail before selection and never echo input content.
2046
+ additional_fields: forbidden
2047
+ output:
2048
+ schema_version: agentera.glossaryAdvice.v1
2049
+ fields: [outcome, applicable_meaning, applicable_owner, review, tension, advisory]
2050
+ owners: [personal, project]
2051
+ advisory_fields: [reason, ownership_state]
2052
+ advisory_reasons: [personal_input_unavailable, inferred_equivalence]
2053
+ advisory_ownership_states: [project_governs_exact]
2054
+ rule: >-
2055
+ Return exactly one matrix outcome and its authority-declared semantics.
2056
+ Include only the selected meaning and owner. An orthogonal advisory may
2057
+ expose only its bounded reason and ownership state. Never return the
2058
+ requested or candidate term, acquisition diagnostics, source content,
2059
+ paths, anchors, approvals, provenance, unrelated entries, or conflict
2060
+ state.
2061
+ failure:
2062
+ classes: [invalid_request, invalid_acquisition, invalid_host_review]
2063
+ rule: >-
2064
+ Fail once before selection with only a bounded class and public recovery;
2065
+ never quote or serialize an input term, meaning, diagnostic, path, raw
2066
+ entry, profile or project content, approval, anchor, or provenance.
2067
+ primary_selection:
2068
+ dimensions:
2069
+ project_input: [invalid, valid_gap, valid_exact]
2070
+ personal_input: [invalid, valid_without_exact, valid_exact]
2071
+ exact_meaning: [not_applicable, equivalent, divergent]
2072
+ inferred_candidate: [absent, present]
2073
+ valid_state_rule: >-
2074
+ exact_meaning is equivalent or divergent exactly when both inputs have an
2075
+ exact term; otherwise it is not_applicable. inferred_candidate is
2076
+ considered only when no personal exact term exists.
2077
+ order:
2078
+ - invalid_or_unavailable_project
2079
+ - equivalent_exact_collision
2080
+ - divergent_exact_collision
2081
+ - project_only
2082
+ - proven_project_gap
2083
+ - inferred_equivalence
2084
+ - invalid_or_unavailable_personal
2085
+ - no_applicable_entry
2086
+ rule: >-
2087
+ Evaluate rows in this order and select exactly the first matching primary
2088
+ outcome. The declared valid input state space must match exactly one row;
2089
+ availability and inferred-equivalence advisories never compete with a
2090
+ usable exact project meaning.
2091
+ outcome_matrix:
2092
+ invalid_or_unavailable_project:
2093
+ when: project input is malformed, unreadable, ambiguous, or over bound
2094
+ match:
2095
+ project_input: [invalid]
2096
+ personal_input: [invalid, valid_without_exact, valid_exact]
2097
+ exact_meaning: [not_applicable]
2098
+ inferred_candidate: [absent, present]
2099
+ judgment: deterministic
2100
+ selected_owner: none
2101
+ selected_meaning: none
2102
+ review: unavailable
2103
+ tension: authority_unavailable
2104
+ equivalent_exact_collision:
2105
+ when: valid personal and project entries have exact term identity and exact meaning identity
2106
+ match:
2107
+ project_input: [valid_exact]
2108
+ personal_input: [valid_exact]
2109
+ exact_meaning: [equivalent]
2110
+ inferred_candidate: [absent, present]
2111
+ judgment: deterministic
2112
+ selected_owner: project
2113
+ selected_meaning: project
2114
+ review: none
2115
+ tension: none
2116
+ divergent_exact_collision:
2117
+ when: valid personal and project entries have exact term identity but not exact meaning identity
2118
+ match:
2119
+ project_input: [valid_exact]
2120
+ personal_input: [valid_exact]
2121
+ exact_meaning: [divergent]
2122
+ inferred_candidate: [absent, present]
2123
+ judgment: deterministic
2124
+ selected_owner: project
2125
+ selected_meaning: project
2126
+ review: none
2127
+ tension: divergent_exact_collision
2128
+ project_only:
2129
+ when: >-
2130
+ valid project input has an exact term and personal input is invalid,
2131
+ unavailable, valid without an exact term, or only a differently named
2132
+ inferred-equivalence candidate
2133
+ match:
2134
+ project_input: [valid_exact]
2135
+ personal_input: [invalid, valid_without_exact]
2136
+ exact_meaning: [not_applicable]
2137
+ inferred_candidate: [absent, present]
2138
+ judgment: deterministic
2139
+ selected_owner: project
2140
+ selected_meaning: project
2141
+ review: none_for_primary
2142
+ tension: none
2143
+ proven_project_gap:
2144
+ when: project state is gap-proving and one valid personal exact term exists
2145
+ match:
2146
+ project_input: [valid_gap]
2147
+ personal_input: [valid_exact]
2148
+ exact_meaning: [not_applicable]
2149
+ inferred_candidate: [absent, present]
2150
+ judgment: deterministic
2151
+ selected_owner: personal
2152
+ selected_meaning: personal
2153
+ review: none
2154
+ tension: none
2155
+ inferred_equivalence:
2156
+ when: >-
2157
+ project state is gap-proving, personal input is valid without an exact
2158
+ term, and the host identifies a possible semantic-equivalence candidate
2159
+ match:
2160
+ project_input: [valid_gap]
2161
+ personal_input: [valid_without_exact]
2162
+ exact_meaning: [not_applicable]
2163
+ inferred_candidate: [present]
2164
+ judgment: host_reviewed
2165
+ selected_owner: none_until_review
2166
+ selected_meaning: none_until_review
2167
+ review: required_when_meaning_sensitive
2168
+ tension: inferred_equivalence
2169
+ invalid_or_unavailable_personal:
2170
+ when: >-
2171
+ project state is gap-proving and personal input is malformed,
2172
+ unavailable, or over bound, so no fallback can be proven
2173
+ match:
2174
+ project_input: [valid_gap]
2175
+ personal_input: [invalid]
2176
+ exact_meaning: [not_applicable]
2177
+ inferred_candidate: [absent, present]
2178
+ judgment: deterministic
2179
+ selected_owner: none
2180
+ selected_meaning: none
2181
+ review: unavailable
2182
+ tension: input_unavailable
2183
+ no_applicable_entry:
2184
+ when: >-
2185
+ project state is gap-proving, personal input is valid without an exact
2186
+ term, and no inferred-equivalence candidate is present
2187
+ match:
2188
+ project_input: [valid_gap]
2189
+ personal_input: [valid_without_exact]
2190
+ exact_meaning: [not_applicable]
2191
+ inferred_candidate: [absent]
2192
+ judgment: deterministic
2193
+ selected_owner: none
2194
+ selected_meaning: none
2195
+ review: none
2196
+ tension: none
2197
+ orthogonal_advisories:
2198
+ personal_input_unavailable_with_project_exact:
2199
+ primary_outcome: project_only
2200
+ when: personal_input is invalid and project_input is valid_exact
2201
+ match:
2202
+ project_input: [valid_exact]
2203
+ personal_input: [invalid]
2204
+ exact_meaning: [not_applicable]
2205
+ inferred_candidate: [absent, present]
2206
+ caveat_reason: personal_input_unavailable
2207
+ ownership_state: project_governs_exact
2208
+ rule: >-
2209
+ Preserve the exact project meaning. The bounded availability caveat may
2210
+ report only reason and ownership state; it never becomes another primary
2211
+ outcome or exposes personal content.
2212
+ inferred_equivalence_with_project_exact:
2213
+ primary_outcome: project_only
2214
+ when: >-
2215
+ personal_input is valid_without_exact, project_input is valid_exact, and
2216
+ inferred_candidate is present
2217
+ match:
2218
+ project_input: [valid_exact]
2219
+ personal_input: [valid_without_exact]
2220
+ exact_meaning: [not_applicable]
2221
+ inferred_candidate: [present]
2222
+ review: required_when_the_inferred_relation_is_meaning_sensitive
2223
+ caveat_reason: inferred_equivalence
2224
+ ownership_state: project_governs_exact
2225
+ rule: >-
2226
+ Project authority remains the usable primary meaning. Host review governs
2227
+ only the possible differently named relation and cannot displace, merge,
2228
+ or suppress the exact project entry.
2229
+ refresh_events:
2230
+ required:
2231
+ - initial_meaning_sensitive_input
2232
+ - later_user_requirement_change_that_can_change_meaning
2233
+ - later_user_intent_change_that_can_change_meaning
2234
+ - later_acceptance_change_that_can_change_meaning
2235
+ - later_deliberation_premise_change_that_can_change_meaning
2236
+ - later_cycle_intent_change_that_can_change_meaning
2237
+ - clarification_answer_for_a_reviewed_term
2238
+ not_required:
2239
+ - unrelated_conversation_turn
2240
+ - unchanged_input_replay
2241
+ - background_state_reread
2242
+ - status_or_progress_render
2243
+ - tool_output_without_requirement_or_intent_change
2244
+ - artifact_rendering
2245
+ - evaluator_text_without_user_change
2246
+ - control_only_continuation
2247
+ rule: >-
2248
+ Refresh only at a governed event whose changed input can alter the meaning
2249
+ used by the capability. Rereads and incidental turns do not refresh advice.
2250
+ discuss_integration:
2251
+ implementation: active
2252
+ invocation: consumer_boundary.advice_resolution.invocation
2253
+ governed_events: consumer_boundary.refresh_events
2254
+ outcome_authority: consumer_boundary.outcome_matrix
2255
+ disclosure: consumer_boundary.disclosure.transient_advice
2256
+ interaction:
2257
+ scope: current_user_authored_meaning_sensitive_input
2258
+ transcript_scan: forbidden
2259
+ done_only_control: no_refresh
2260
+ review_rule: >-
2261
+ Before meaning-sensitive reasoning or decision framing relies on an
2262
+ inferred relation, ask one focused clarification question under the
2263
+ existing one-question-per-turn and Done contract. The clarification may
2264
+ identify a host-reviewed relation for a fresh advice request but is not
2265
+ decision confirmation, approval, or publication consent.
2266
+ exact_collision_rule: >-
2267
+ Use an applicable project meaning for a divergent exact collision and
2268
+ surface the bounded divergence as a concise scratchpad tension or Crux.
2269
+ Never ask the user to choose project versus personal authority.
2270
+ unavailable_rule: >-
2271
+ Continue without glossary grounding when advice is unavailable, invalid,
2272
+ or has no applicable entry. Ask ordinary clarification only when the term
2273
+ is necessary and ambiguous, without fabricating glossary facts.
2274
+ output_rule: >-
2275
+ Use only the transient applicable meaning and owner needed for the current
2276
+ deliberation, and never quote unrelated glossary content.
2277
+ mutation: forbidden
2278
+ forbidden_effects:
2279
+ - glossary_write
2280
+ - glossary_approval
2281
+ - publication_consent
2282
+ - progress_caveat
2283
+ - plan_conflict
2284
+ - decision_conflict
2285
+ plan_integration:
2286
+ implementation: active
2287
+ invocation: consumer_boundary.advice_resolution.invocation
2288
+ governed_events: consumer_boundary.refresh_events
2289
+ outcome_authority: consumer_boundary.outcome_matrix
2290
+ disclosure: consumer_boundary.disclosure.transient_advice
2291
+ mode:
2292
+ precedence:
2293
+ - explicit_delegated_or_orchestrated_no_pause
2294
+ - direct_user_invocation_with_available_clarification_turn
2295
+ - unknown_or_ambiguous
2296
+ signals:
2297
+ explicit_delegated_or_orchestrated_no_pause:
2298
+ result: autonomous
2299
+ direct_user_invocation_with_available_clarification_turn:
2300
+ result: interactive
2301
+ unknown_or_ambiguous:
2302
+ result: interactive_waiting
2303
+ silence_or_timeout: never_autonomous
2304
+ rule: >-
2305
+ Use the first matching signal. Unknown or conflicting mode evidence waits
2306
+ for interactive clarification; silence and elapsed time never imply
2307
+ autonomous execution.
2308
+ interaction:
2309
+ scope: current_user_authored_meaning_sensitive_input
2310
+ transcript_scan: forbidden
2311
+ control_only_continuation: no_refresh
2312
+ review:
2313
+ interactive_sequence:
2314
+ - emit_one_focused_clarification
2315
+ - wait_for_user_answer
2316
+ - refresh_advice_for_affected_term
2317
+ - finalize_affected_scope_requirements_tasks_acceptance
2318
+ autonomous_sequence:
2319
+ - abstain_from_disputed_meaning
2320
+ - defer_affected_scope_requirements_tasks_acceptance
2321
+ - emit_transient_handoff_intent
2322
+ clarification_effects:
2323
+ - not_plan_approval
2324
+ - not_decision_confirmation
2325
+ - not_glossary_approval
2326
+ - not_publication_consent
2327
+ exact_collision_rule: >-
2328
+ Use an applicable project meaning for a divergent exact collision. Where
2329
+ the divergence materially affects planning, represent only the bounded
2330
+ tension and never disclose the personal definition.
2331
+ unavailable_rule: >-
2332
+ Continue without glossary grounding when advice is unavailable, invalid,
2333
+ or has no applicable entry. In interactive Plan, ask ordinary focused
2334
+ clarification only when the term is necessary and meaning-critical.
2335
+ autonomous_handoff_intent:
2336
+ status: transient_emitted_not_delivered
2337
+ caller_fields: [event, reason, ownership_state]
2338
+ fixed_values:
2339
+ event: current
2340
+ accepted_writer_flags:
2341
+ [--input]
2342
+ input: one progress cycle YAML/JSON mapping whose glossary_caveat contains the three caller fields
2343
+ writer_owned_fields: [caveat_id, capability, transition_id]
2344
+ forbidden_fields: [caveat_id, capability, transition_id]
2345
+ forbidden_claims: [delivered, stored, persisted, published, durable_envelope]
2346
+ durable_writer: build
2347
+ writer_interface: npx -y agentera@next state progress explain --verb append --format json
2348
+ writer_result: authoritative_identity_and_six_field_envelope
2349
+ allowed_reason_state_pairs: consumer_boundary.autonomous_caveat.allowed_current_pairs
2350
+ rule: >-
2351
+ Emit one intent only when autonomous meaning-sensitive work has unresolved
2352
+ review or unavailable authority. The emitted-only intent contains exactly
2353
+ event=current, reason, and ownership_state, the three caller inputs accepted
2354
+ by the Build writer in one bounded structured record input. It is not delivered, stored, persisted, or published.
2355
+ The writer creates caveat_id, capability=build, and transition_id=null to
2356
+ complete the authoritative current envelope.
2357
+ exact_project_personal_unavailable:
2358
+ primary_outcome: project_only
2359
+ advisory_reason: personal_input_unavailable
2360
+ advisory_ownership_state: project_governs_exact
2361
+ plan_action: ground_exact_project_meaning
2362
+ autonomous_handoff_intent: none
2363
+ durable_unresolved_caveat: none
2364
+ rule: >-
2365
+ Unavailable personal input does not make exact project authority
2366
+ unresolved. Keep the advisory transient and never emit or publish it as
2367
+ an autonomous unresolved handoff.
2368
+ unavailable:
2369
+ invalid_project:
2370
+ interactive: clarify_or_wait_when_meaning_critical
2371
+ autonomous: abstain_defer_and_emit_authority_unavailable
2372
+ handoff_pair: [authority_unavailable, authority_unavailable]
2373
+ invalid_personal_after_project_gap:
2374
+ interactive: clarify_or_wait_when_meaning_critical
2375
+ autonomous: abstain_defer_and_emit_personal_input_unavailable
2376
+ handoff_pair: [personal_input_unavailable, authority_unavailable]
2377
+ behavior_matrix:
2378
+ interactive_review_required:
2379
+ mode: interactive
2380
+ plan_action: clarify_refresh_then_finalize
2381
+ handoff_intent: none
2382
+ autonomous_review_required:
2383
+ mode: autonomous
2384
+ plan_action: abstain_and_defer
2385
+ handoff_intent: emitted
2386
+ exact_project_personal_unavailable:
2387
+ mode: any
2388
+ plan_action: ground_exact_project_meaning
2389
+ handoff_intent: none
2390
+ unavailable_unresolved:
2391
+ mode: autonomous
2392
+ plan_action: abstain_and_defer
2393
+ handoff_intent: emitted
2394
+ divergent_exact_collision:
2395
+ mode: any
2396
+ plan_action: ground_project_and_bound_tension
2397
+ handoff_intent: none
2398
+ irrelevant_or_no_applicable_entry:
2399
+ mode: any
2400
+ plan_action: leave_unaffected_planning_unchanged
2401
+ handoff_intent: none
2402
+ output_rule: >-
2403
+ Use only the transient applicable meaning and owner needed for affected
2404
+ planning. An autonomous handoff intent is emitted, not delivered or stored,
2405
+ and contains exactly event=current, reason, and ownership_state for a later
2406
+ Build write.
2407
+ handoff: consumer_boundary.autonomous_caveat.handoff.plan
2408
+ mutation: forbidden
2409
+ forbidden_effects:
2410
+ - glossary_write
2411
+ - glossary_approval
2412
+ - publication_consent
2413
+ - progress_caveat
2414
+ - plan_conflict
2415
+ - decision_conflict
2416
+ disclosure:
2417
+ transient_advice:
2418
+ allowed: [outcome, applicable_meaning, applicable_owner, review, tension, advisory]
2419
+ minimum_rule: >-
2420
+ Include a meaning only when that meaning is selected by the matrix and
2421
+ needed for the current meaning-sensitive work. Never include unrelated entries.
2422
+ forbidden:
2423
+ - personal_evidence_anchor
2424
+ - personal_profile_path
2425
+ - raw_personal_glossary_section
2426
+ - unrelated_entry
2427
+ - provenance
2428
+ - project_source_path
2429
+ durable_surfaces:
2430
+ surfaces: [progress_evidence, prime_attention, diagnostics, errors]
2431
+ allowed: [caveat_id, event, capability, reason, ownership_state, transition_id]
2432
+ forbidden:
2433
+ - personal_definition
2434
+ - project_definition
2435
+ - personal_evidence_anchor
2436
+ - personal_profile_path
2437
+ - raw_personal_glossary_section
2438
+ - raw_project_glossary_section
2439
+ - unrelated_entry
2440
+ - provenance
2441
+ - project_source_path
2442
+ failure_rule: >-
2443
+ Errors identify only the invalid input class and a public recovery command;
2444
+ they never quote private bytes, definitions, paths, anchors, or provenance.
2445
+ plan_artifacts:
2446
+ surfaces:
2447
+ [
2448
+ scope,
2449
+ requirements,
2450
+ constraints,
2451
+ tasks,
2452
+ task_acceptance,
2453
+ overall_acceptance,
2454
+ diagnostics,
2455
+ handoff,
2456
+ ]
2457
+ allowed_sources:
2458
+ [user_authored_term, user_authored_clarification, derived_behavioral_requirement]
2459
+ forbidden_content:
2460
+ - profile_derived_definition
2461
+ - personal_glossary_definition
2462
+ - personal_evidence_anchor
2463
+ - personal_profile_path
2464
+ - raw_personal_glossary_section
2465
+ - raw_project_glossary_section
2466
+ - unrelated_entry
2467
+ - provenance
2468
+ - project_source_path
2469
+ user_term_rule: >-
2470
+ A term already supplied by the user may remain in the plan. Never copy or
2471
+ quote a profile-derived or personal glossary definition; express only the
2472
+ derived behavioral requirement needed by the plan.
2473
+ autonomous_caveat:
2474
+ durable_owner: build
2475
+ durable_channel: progress
2476
+ authority: skills/agentera/schemas/artifacts/progress.yaml#ENTITY_AUTHORITY
2477
+ publication_command: npx -y agentera@next state progress append
2478
+ publication_boundary: progress_cycle.glossary_caveat
2479
+ publication_status: active_build
2480
+ writer_runtime: packages/cli/src/state/progressEntities.ts#appendProgressEntity
2481
+ writer_interface: npx -y agentera@next state progress explain --verb append --format json
2482
+ envelope_validator: packages/cli/src/state/progressGlossaryCaveat.ts#validateProgressGlossaryCaveat
2483
+ lifecycle_validator: packages/cli/src/state/progressGlossaryCaveat.ts#glossaryCaveatLifecycleInvalidEntities
2484
+ allowed_current_pairs:
2485
+ - reason: inferred_equivalence
2486
+ ownership_state: review_required
2487
+ - reason: inferred_equivalence
2488
+ ownership_state: project_governs_exact
2489
+ - reason: authority_unavailable
2490
+ ownership_state: authority_unavailable
2491
+ - reason: personal_input_unavailable
2492
+ ownership_state: authority_unavailable
2493
+ identity:
2494
+ field: caveat_id
2495
+ type: opaque_non_content_id
2496
+ alphabet: abcdefghijklmnopqrstuvwxyz
2497
+ length: 10
2498
+ pattern: "^[a-z]{10}$"
2499
+ rule: >-
2500
+ Assign a fresh opaque ID for a current caveat and carry it unchanged to
2501
+ its matching terminal event. The ID must not encode a term, meaning,
2502
+ anchor, path, provenance, or project identity.
2503
+ envelope:
2504
+ schema_version: agentera.glossaryConsumerCaveat.v1
2505
+ fields: [caveat_id, event, capability, reason, ownership_state, transition_id]
2506
+ additional_fields: forbidden
2507
+ max_string_utf8_bytes: 64
2508
+ events: [current, resolved, superseded]
2509
+ capabilities: [build]
2510
+ reasons: [inferred_equivalence, authority_unavailable, personal_input_unavailable]
2511
+ ownership_states: [project_governs_exact, review_required, authority_unavailable]
2512
+ transition_rule: >-
2513
+ current and resolved require null transition_id. Superseded requires one
2514
+ different opaque successor caveat_id. Every field is required; only
2515
+ transition_id may be null.
2516
+ current_append:
2517
+ caller_fields: [event, reason, ownership_state]
2518
+ caller_fixed_values:
2519
+ event: current
2520
+ writer_fields: [caveat_id, capability, transition_id]
2521
+ writer_fixed_values:
2522
+ capability: build
2523
+ transition_id: null
2524
+ rule: >-
2525
+ A current append requires the caller to submit event=current, reason,
2526
+ and ownership_state. The writer creates the opaque identity, Build
2527
+ capability, and null current-transition field; it never defaults event.
2528
+ lifecycle:
2529
+ current: >-
2530
+ Append current once when autonomous meaning-sensitive work cannot pause
2531
+ and review or authority remains unresolved.
2532
+ resolved: >-
2533
+ Append resolved with the same caveat_id after explicit clarification or
2534
+ a governed refresh proves the caveat no longer applies.
2535
+ superseded: >-
2536
+ Append superseded with the old caveat_id and the fresh successor ID as
2537
+ transition_id when a governed refresh replaces, rather than resolves,
2538
+ the caveat.
2539
+ matching_rule: >-
2540
+ The latest valid event for one caveat_id determines whether it is current.
2541
+ A terminal event affects only its matching identity. Supersession is valid
2542
+ only when a matching current successor event also exists.
2543
+ expiration: none
2544
+ expiration_rule: >-
2545
+ Time alone never resolves or hides a caveat. Only an explicit matching
2546
+ resolved or valid superseded transition makes it noncurrent.
2547
+ prime_projection:
2548
+ status: active
2549
+ runtime: packages/cli/src/state/progressGlossaryCaveat.ts#projectCurrentGlossaryCaveats
2550
+ retrieval: canonical_validated_progress_entities
2551
+ attention_text: "normal: glossary review required before meaning-sensitive work"
2552
+ max_attention_entries: 1
2553
+ source:
2554
+ artifact: progress
2555
+ boundary: progress_cycle
2556
+ capability: build
2557
+ capacity:
2558
+ public_attention_limit: 6
2559
+ reserved_glossary_slots: 1
2560
+ policy: reserve_final_slot_when_current
2561
+ unrelated_retention: first_five_in_existing_order
2562
+ insertion: reserved_final_slot_when_current
2563
+ rule: >-
2564
+ Reconstruct current caveats by opaque identity from validated canonical
2565
+ progress entities. A matching resolved event or valid superseded event
2566
+ removes only that identity. Invalid, orphan, mismatched, or duplicate
2567
+ terminal evidence is omitted and cannot suppress a valid current event.
2568
+ Emit at most the declared generic attention text when one or more current
2569
+ caveats remain; preserve the relative order of every unrelated attention
2570
+ entry and do not change next-action selection.
2571
+ expiration: none
2572
+ forbidden_sources:
2573
+ - timestamp
2574
+ - recency
2575
+ - plan_state
2576
+ - transient_plan_handoff
2577
+ - profile_presence
2578
+ - unrelated_progress
2579
+ forbidden_output:
2580
+ - caveat_id
2581
+ - transition_id
2582
+ - reason
2583
+ - ownership_state
2584
+ - definition
2585
+ - meaning
2586
+ - anchor
2587
+ - path
2588
+ - raw_section
2589
+ - provenance
2590
+ - source_bytes
2591
+ malformed_evidence:
2592
+ prime: omit
2593
+ direct_progress_retrieval: fail_closed_generic_corrupt_entity
2594
+ allowed_diagnostic: canonical progress evidence is corrupt; run state validation
2595
+ forbidden_diagnostic_content:
2596
+ [stored_filename, stored_path, parser_text, raw_value, raw_bytes, provenance]
2597
+ handoff:
2598
+ plan: >-
2599
+ Plan cannot write progress. In autonomous mode it emits at most one
2600
+ transient intent containing exactly event=current, reason, and
2601
+ ownership_state and stores no caveat or conflict in plan state. It never
2602
+ emits identity, capability, transition_id, or a purported complete or
2603
+ delivered durable envelope.
2604
+ discuss: >-
2605
+ Discuss pauses for clarification; it does not persist caveat evidence or
2606
+ turn review into decision approval.
2607
+ build: >-
2608
+ Build is the sole durable writer and may later pass all three emitted
2609
+ intent inputs to the typed progress writer. The writer preserves the
2610
+ caller-owned event, reason, and ownership_state and creates authoritative
2611
+ identity, capability, and transition_id fields. Advice never invokes
2612
+ glossary publication.
2613
+ publication_isolation:
2614
+ rule: >-
2615
+ Advice, tension, review, clarification, caveat publication, resolution, and
2616
+ supersession never invoke glossary publication, authorize a proposal, reuse
2617
+ confirmation, satisfy a decision, or approve plan state.
2618
+ project_publication_authority: ownership_contracts.project.publication
2619
+ downstream_gate:
2620
+ status: blocked_until_contract_valid
2621
+ validator: packages/cli/src/registries/glossaryEntryContract.ts#validateGlossaryEntryContract
2622
+ command: npx -y agentera@next check validate vocabularyAuthority --format json
2623
+ required_sections:
2624
+ - consumer_boundary.acquisition
2625
+ - consumer_boundary.advice_resolution
2626
+ - consumer_boundary.primary_selection
2627
+ - consumer_boundary.outcome_matrix
2628
+ - consumer_boundary.orthogonal_advisories
2629
+ - consumer_boundary.refresh_events
2630
+ - consumer_boundary.discuss_integration
2631
+ - consumer_boundary.plan_integration
2632
+ - consumer_boundary.disclosure
2633
+ - consumer_boundary.autonomous_caveat
2634
+ - consumer_boundary.publication_isolation
2635
+ failure_rule: >-
2636
+ Discuss, Plan, Build, advice, and prime integration remain blocked when
2637
+ validation reports a missing or contradictory section. Acquisition itself
2638
+ fails closed. Each issue names the invalid section and required correction.
2639
+ profile_grounding:
2640
+ implementation: active_exclusion_only
2641
+ capabilities: [discuss, plan, build]
2642
+ command: npx -y agentera@next report profile-grounding --format json
2643
+ schema_version: agentera.profileGrounding.v1
2644
+ parser: packages/cli/src/analytics/personalGlossaryProfile.ts#personalProfileGrounding
2645
+ max_profile_utf8_bytes: 65536
2646
+ validity:
2647
+ statuses: [absent, valid, repair_needed]
2648
+ classes: [absent, valid, malformed, ambiguous, unreadable, unsafe, oversized, invalid_utf8]
2649
+ freshness:
2650
+ states: [current, stale, unknown]
2651
+ rule: Freshness is computed only after one source passes validity and never changes validity.
2652
+ recovery:
2653
+ repair: >-
2654
+ Use the Profile capability to repair or regenerate PROFILE.md, then retry `npx -y agentera@next report profile-grounding --format json`; no profile bytes were changed.
2655
+ absent: >-
2656
+ Use the Profile capability to generate PROFILE.md, then retry npx -y agentera@next report profile-grounding --format json.
2657
+ raw_profile_read: forbidden
2658
+ content_rule: >-
2659
+ Return the complete profile with exactly the validated owned personal
2660
+ Glossary marker range removed. Preserve every byte outside that range.
2661
+ This is profile grounding only and performs no glossary lookup, project
2662
+ glossary read, precedence, matching, review, collision, or advisory work.
2663
+ Profile Full retains access to the complete stored profile for regeneration.
2664
+ failure_rule: >-
2665
+ Absent and repair-needed profiles return nonzero with the shared validity
2666
+ object, exact advancing recovery, unknown freshness, and no profile
2667
+ content. Oversized, unsafe, unreadable, invalid UTF-8, and malformed or
2668
+ ambiguous owned Glossary sources fail closed without path or byte leaks.
2669
+ exact_collision:
2670
+ behavior: project_precedence_at_consumption
2671
+ persistence: forbidden
2672
+ personal_entry_suppression: forbidden
2673
+ inferred_semantic_equivalence:
2674
+ behavior: user_review
2675
+ automatic_merge: forbidden
2676
+ suppression: forbidden
2677
+ precedence: forbidden
2678
+ rule: >-
2679
+ Audit remains mutation-free and Build project-glossary publication is active.
2680
+ Build, Discuss, Plan, and prime bounded glossary consumption are active, and
2681
+ Build progress caveat publication and explicit personal publication are active.
2682
+ Profile Full preserves an existing owned section, then uses only the current
2683
+ consent-bound personal generation and canonical authorized personal publication.
2684
+ Project-driven personal-profile mutation and docs-mapping mutation remain deferred.
2685
+
2686
+ deferred_capability_contracts:
2687
+ profile:
2688
+ capabilities: [profile]
2689
+ implementation: active_partial
2690
+ intended_behavior: personal_glossary_synthesis
2691
+ active_behavior:
2692
+ - ownership_contracts.personal.admission
2693
+ - personal_mining_authority.profile_full
2694
+ inactive_behavior: [lookup]
2695
+ contracts:
2696
+ admission: ownership_contracts.personal.input
2697
+ provenance: ownership_contracts.personal.allowed_provenance
2698
+ confidence: shared_primitive.fields.confidence
2699
+ retention_and_decay: ownership_contracts.personal.retention_and_decay
2700
+ profile_full: personal_mining_authority.profile_full
2701
+ forbidden_current_claims: [lookup, project_glossary_consumption]
2702
+ audit:
2703
+ capabilities: [audit]
2704
+ implementation: active_partial
2705
+ active_behavior: terminology_drift_finding_generation
2706
+ finding_family:
2707
+ status: implemented
2708
+ mutation: forbidden
2709
+ evidence: ownership_contracts.project.input
2710
+ confidence: skills/agentera/protocol.yaml#CONFIDENCE_SCALE
2711
+ filtering: skills/agentera/capabilities/audit/schemas/validation.yaml
2712
+ canonical_proposal_rule: >-
2713
+ Propose the term with the most distinct verified project-file anchors;
2714
+ break ties lexicographically. A proposal is an audit finding, never a
2715
+ decision or persisted glossary entry.
2716
+ personal_comparison_rule: >-
2717
+ A supplied personal-profile term may annotate divergence for the same
2718
+ assessed concept. Missing profile evidence adds no divergence and never
2719
+ invents a personal term.
2720
+ proposal_output:
2721
+ implementation: active
2722
+ intended_output: read_only_terminology_drift_finding
2723
+ digest: ownership_contracts.project.proposal_digest
2724
+ inputs:
2725
+ personal_history: ownership_contracts.personal.input
2726
+ project_file: ownership_contracts.project.input
2727
+ project_file_history_classification: forbidden
2728
+ forbidden_current_claims: [persistence, approval, docs_mapping_mutation, lookup]
2729
+ build_publication:
2730
+ capabilities: [build]
2731
+ implementation: active
2732
+ active_behavior: ownership_contracts.project.publication
2733
+ output: skills/agentera/schemas/artifacts/glossary.yaml
2734
+ inactive_behavior:
2735
+ [
2736
+ lookup,
2737
+ precedence,
2738
+ semantic_equivalence_review,
2739
+ personal_profile_mutation,
2740
+ docs_mapping_mutation,
2741
+ ]
2742
+ forbidden_current_claims:
2743
+ [lookup, precedence, review, personal_profile_mutation, docs_mapping_mutation]
2744
+ consumers:
2745
+ capabilities: [discuss, plan, build, prime]
2746
+ implementation:
2747
+ build: active
2748
+ discuss: active
2749
+ plan: active
2750
+ prime: active
2751
+ behavior: consumer_boundary
2752
+ forbidden_current_claims: []