@openrig/cli 0.5.5 → 0.5.6

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 (727) hide show
  1. package/daemon/assets/continuity/apprentice-cutover.md +19 -0
  2. package/daemon/assets/continuity/apprentice-prepare.md +17 -0
  3. package/daemon/assets/plugins/openrig-core/hooks/scripts/refocus.cjs +81 -4
  4. package/daemon/assets/plugins/openrig-core/skills/applying-a-permission-policy/SKILL.md +3 -3
  5. package/daemon/assets/plugins/openrig-core/skills/claude-compaction-restore/scripts/precompact-hook.mjs +0 -0
  6. package/daemon/assets/plugins/openrig-core/skills/claude-compaction-restore/scripts/restore-from-jsonl.mjs +0 -0
  7. package/daemon/assets/plugins/openrig-core/skills/forming-an-openrig-mental-model/SKILL.md +4 -9
  8. package/daemon/assets/plugins/openrig-core/skills/messaging-the-human/SKILL.md +82 -118
  9. package/daemon/assets/plugins/openrig-core/skills/mission-slice-sop/SKILL.md +24 -25
  10. package/daemon/assets/plugins/openrig-core/skills/openrig-operating-model/SKILL.md +5 -12
  11. package/daemon/assets/plugins/openrig-core/skills/openrig-operating-model/scripts/compose.py +36 -117
  12. package/daemon/assets/plugins/openrig-core/skills/openrig-skills/SKILL.md +9 -6
  13. package/daemon/assets/plugins/openrig-core/skills/openrig-user/SKILL.md +1 -12
  14. package/daemon/assets/plugins/openrig-core/skills/orienting-to-an-inherited-seat/CHANGELOG.md +1 -1
  15. package/daemon/assets/plugins/openrig-core/skills/orienting-to-an-inherited-seat/SKILL.md +15 -0
  16. package/daemon/assets/plugins/openrig-core/skills/queue-handoff/SKILL.md +4 -16
  17. package/daemon/assets/plugins/openrig-core/skills/refocusing/scripts/trace-to-root.py +50 -7
  18. package/daemon/assets/plugins/openrig-core/skills/retiring-and-inheriting-a-seat/SKILL.md +29 -9
  19. package/daemon/assets/plugins/openrig-core/skills/seat-continuity-and-handover/SKILL.md +3 -0
  20. package/daemon/assets/plugins/openrig-core/skills/seat-continuity-and-handover/references/apprentice-evidence-toolkit.md +32 -0
  21. package/daemon/assets/plugins/openrig-core/skills/seat-continuity-and-handover/references/apprentice-successor-seat-cutover.md +256 -0
  22. package/daemon/assets/plugins/openrig-core/skills/seat-continuity-and-handover/references/orchestrator-role.md +40 -0
  23. package/daemon/assets/plugins/openrig-core/skills/software-for-agents/SKILL.md +9 -4
  24. package/daemon/assets/vm-preview-fixtures/README.md +16 -38
  25. package/daemon/assets/vm-preview-fixtures/workflows/sample-basic-loop.yaml +4 -5
  26. package/daemon/context-packs/onboarding-width/manifest.yaml +4 -1
  27. package/daemon/context-packs/onboarding-width/public-reference-material.md +1 -1
  28. package/daemon/context-packs/skills/core/agent-starters/manifest.yaml +2 -1
  29. package/daemon/context-packs/skills/core/agent-startup-and-context-ingestion/SKILL.md +1 -1
  30. package/daemon/context-packs/skills/core/agent-startup-and-context-ingestion/manifest.yaml +2 -1
  31. package/daemon/context-packs/skills/core/cross-host-rig-commands/SKILL.md +6 -13
  32. package/daemon/context-packs/skills/core/cross-host-rig-commands/manifest.yaml +2 -1
  33. package/daemon/context-packs/skills/core/human-in-the-loop/manifest.yaml +2 -1
  34. package/daemon/context-packs/skills/core/messaging-the-human/SKILL.md +98 -0
  35. package/daemon/context-packs/skills/core/messaging-the-human/manifest.yaml +10 -0
  36. package/daemon/context-packs/skills/core/openrig-architect/manifest.yaml +2 -1
  37. package/daemon/context-packs/skills/core/openrig-cmux/manifest.yaml +2 -1
  38. package/daemon/context-packs/skills/core/openrig-herdr/manifest.yaml +2 -1
  39. package/daemon/context-packs/skills/core/openrig-skills/SKILL.md +118 -0
  40. package/daemon/context-packs/skills/core/openrig-skills/manifest.yaml +10 -0
  41. package/daemon/context-packs/skills/core/openrig-upgrade/SKILL.md +19 -75
  42. package/daemon/context-packs/skills/core/openrig-upgrade/manifest.yaml +2 -1
  43. package/daemon/context-packs/skills/core/rig-bundles-and-shareable-artifacts/manifest.yaml +2 -1
  44. package/daemon/context-packs/skills/core/rig-lifecycle/manifest.yaml +2 -1
  45. package/daemon/context-packs/skills/core/session-source-fork/manifest.yaml +2 -1
  46. package/daemon/context-packs/skills/core/specification-system/manifest.yaml +2 -1
  47. package/daemon/context-packs/skills/core/topology-mutation-and-seat-management/manifest.yaml +2 -1
  48. package/daemon/context-packs/skills/core/watchdog/SKILL.md +4 -10
  49. package/daemon/context-packs/skills/core/watchdog/manifest.yaml +2 -1
  50. package/daemon/context-packs/skills/pm/backlog-capture/manifest.yaml +2 -1
  51. package/daemon/context-packs/skills/pm/context-builder/manifest.yaml +2 -1
  52. package/daemon/context-packs/skills/pm/exec-summary/manifest.yaml +2 -1
  53. package/daemon/context-packs/skills/pm/office-hours/manifest.yaml +2 -1
  54. package/daemon/context-packs/skills/pm/plan-review/manifest.yaml +2 -1
  55. package/daemon/context-packs/skills/pm/requirements-writer/SKILL.md +15 -21
  56. package/daemon/context-packs/skills/pm/requirements-writer/manifest.yaml +4 -3
  57. package/daemon/context-packs/skills/pm/ui-mockup/manifest.yaml +2 -1
  58. package/daemon/context-packs/skills/pods/development-team/manifest.yaml +2 -1
  59. package/daemon/context-packs/skills/pods/orchestration-team/manifest.yaml +2 -1
  60. package/daemon/context-packs/skills/pods/oversight-team/manifest.yaml +2 -1
  61. package/daemon/context-packs/skills/pods/review-team/manifest.yaml +2 -1
  62. package/daemon/context-packs/skills/process/agent-browser/manifest.yaml +2 -1
  63. package/daemon/context-packs/skills/process/brainstorming/manifest.yaml +2 -1
  64. package/daemon/context-packs/skills/process/context-engineering/manifest.yaml +2 -1
  65. package/daemon/context-packs/skills/process/dogfood/manifest.yaml +2 -1
  66. package/daemon/context-packs/skills/process/executing-plans/manifest.yaml +2 -1
  67. package/daemon/context-packs/skills/process/frontend-design/manifest.yaml +2 -1
  68. package/daemon/context-packs/skills/process/systematic-debugging/find-polluter.sh +0 -0
  69. package/daemon/context-packs/skills/process/systematic-debugging/manifest.yaml +2 -1
  70. package/daemon/context-packs/skills/process/test-driven-development/manifest.yaml +2 -1
  71. package/daemon/context-packs/skills/process/using-superpowers/manifest.yaml +2 -1
  72. package/daemon/context-packs/skills/process/verification-before-completion/manifest.yaml +2 -1
  73. package/daemon/context-packs/skills/process/writing-plans/manifest.yaml +2 -1
  74. package/daemon/context-packs/world-example/manifest.yaml +15 -2
  75. package/daemon/context-packs/world-example/your-world.md +19 -2
  76. package/daemon/context-packs/world-public/boundaries.md +33 -0
  77. package/daemon/context-packs/world-public/build-your-world.md +84 -0
  78. package/daemon/context-packs/world-public/claims.yaml +205 -0
  79. package/daemon/context-packs/world-public/manifest.yaml +59 -0
  80. package/daemon/context-packs/world-public/start-here.md +51 -0
  81. package/daemon/context-packs/world-public/verify-world.sh +522 -0
  82. package/daemon/dist/build-info.js +3 -3
  83. package/daemon/dist/context-pack-taxonomy-surface.d.ts +2 -0
  84. package/daemon/dist/context-pack-taxonomy-surface.d.ts.map +1 -0
  85. package/daemon/dist/context-pack-taxonomy-surface.js +6 -0
  86. package/daemon/dist/context-pack-taxonomy-surface.js.map +1 -0
  87. package/daemon/dist/db/all-migrations.d.ts +1 -1
  88. package/daemon/dist/db/all-migrations.d.ts.map +1 -1
  89. package/daemon/dist/db/all-migrations.js +8 -2
  90. package/daemon/dist/db/all-migrations.js.map +1 -1
  91. package/daemon/dist/db/migrations/074_context_usage_watchdog.d.ts +4 -0
  92. package/daemon/dist/db/migrations/074_context_usage_watchdog.d.ts.map +1 -0
  93. package/daemon/dist/db/migrations/074_context_usage_watchdog.js +11 -0
  94. package/daemon/dist/db/migrations/074_context_usage_watchdog.js.map +1 -0
  95. package/daemon/dist/db/migrations/075_context_usage_watchdog_generation.d.ts +4 -0
  96. package/daemon/dist/db/migrations/075_context_usage_watchdog_generation.d.ts.map +1 -0
  97. package/daemon/dist/db/migrations/075_context_usage_watchdog_generation.js +8 -0
  98. package/daemon/dist/db/migrations/075_context_usage_watchdog_generation.js.map +1 -0
  99. package/daemon/dist/db/migrations/076_owner_notification_levels.d.ts +8 -0
  100. package/daemon/dist/db/migrations/076_owner_notification_levels.d.ts.map +1 -0
  101. package/daemon/dist/db/migrations/076_owner_notification_levels.js +15 -0
  102. package/daemon/dist/db/migrations/076_owner_notification_levels.js.map +1 -0
  103. package/daemon/dist/domain/active-occupant.d.ts +44 -0
  104. package/daemon/dist/domain/active-occupant.d.ts.map +1 -0
  105. package/daemon/dist/domain/active-occupant.js +72 -0
  106. package/daemon/dist/domain/active-occupant.js.map +1 -0
  107. package/daemon/dist/domain/agent-manifest.d.ts +6 -0
  108. package/daemon/dist/domain/agent-manifest.d.ts.map +1 -1
  109. package/daemon/dist/domain/agent-manifest.js +77 -15
  110. package/daemon/dist/domain/agent-manifest.js.map +1 -1
  111. package/daemon/dist/domain/agent-resolver.d.ts +11 -0
  112. package/daemon/dist/domain/agent-resolver.d.ts.map +1 -1
  113. package/daemon/dist/domain/agent-resolver.js +55 -0
  114. package/daemon/dist/domain/agent-resolver.js.map +1 -1
  115. package/daemon/dist/domain/bundle-context-packs-router.d.ts +9 -2
  116. package/daemon/dist/domain/bundle-context-packs-router.d.ts.map +1 -1
  117. package/daemon/dist/domain/bundle-context-packs-router.js +18 -0
  118. package/daemon/dist/domain/bundle-context-packs-router.js.map +1 -1
  119. package/daemon/dist/domain/claude-compaction-enforcer.d.ts +7 -0
  120. package/daemon/dist/domain/claude-compaction-enforcer.d.ts.map +1 -1
  121. package/daemon/dist/domain/claude-compaction-enforcer.js +10 -0
  122. package/daemon/dist/domain/claude-compaction-enforcer.js.map +1 -1
  123. package/daemon/dist/domain/context-packs/context-pack-library-service.d.ts.map +1 -1
  124. package/daemon/dist/domain/context-packs/context-pack-library-service.js +7 -0
  125. package/daemon/dist/domain/context-packs/context-pack-library-service.js.map +1 -1
  126. package/daemon/dist/domain/context-packs/context-pack-types.d.ts +11 -0
  127. package/daemon/dist/domain/context-packs/context-pack-types.d.ts.map +1 -1
  128. package/daemon/dist/domain/context-packs/context-pack-types.js +11 -0
  129. package/daemon/dist/domain/context-packs/context-pack-types.js.map +1 -1
  130. package/daemon/dist/domain/context-packs/manifest-parser.d.ts.map +1 -1
  131. package/daemon/dist/domain/context-packs/manifest-parser.js +13 -1
  132. package/daemon/dist/domain/context-packs/manifest-parser.js.map +1 -1
  133. package/daemon/dist/domain/continuity-policy-materializer.d.ts +88 -0
  134. package/daemon/dist/domain/continuity-policy-materializer.d.ts.map +1 -0
  135. package/daemon/dist/domain/continuity-policy-materializer.js +290 -0
  136. package/daemon/dist/domain/continuity-policy-materializer.js.map +1 -0
  137. package/daemon/dist/domain/continuity-stack-packets.d.ts +65 -0
  138. package/daemon/dist/domain/continuity-stack-packets.d.ts.map +1 -0
  139. package/daemon/dist/domain/continuity-stack-packets.js +99 -0
  140. package/daemon/dist/domain/continuity-stack-packets.js.map +1 -0
  141. package/daemon/dist/domain/execution-view.d.ts +39 -0
  142. package/daemon/dist/domain/execution-view.d.ts.map +1 -0
  143. package/daemon/dist/domain/execution-view.js +707 -0
  144. package/daemon/dist/domain/execution-view.js.map +1 -0
  145. package/daemon/dist/domain/gateway/delivery-rules-engine.d.ts +60 -0
  146. package/daemon/dist/domain/gateway/delivery-rules-engine.d.ts.map +1 -0
  147. package/daemon/dist/domain/gateway/delivery-rules-engine.js +144 -0
  148. package/daemon/dist/domain/gateway/delivery-rules-engine.js.map +1 -0
  149. package/daemon/dist/domain/gateway/destination-resolver.d.ts +20 -0
  150. package/daemon/dist/domain/gateway/destination-resolver.d.ts.map +1 -0
  151. package/daemon/dist/domain/gateway/destination-resolver.js +52 -0
  152. package/daemon/dist/domain/gateway/destination-resolver.js.map +1 -0
  153. package/daemon/dist/domain/gateway/dispatcher.d.ts +3 -1
  154. package/daemon/dist/domain/gateway/dispatcher.d.ts.map +1 -1
  155. package/daemon/dist/domain/gateway/dispatcher.js +9 -2
  156. package/daemon/dist/domain/gateway/dispatcher.js.map +1 -1
  157. package/daemon/dist/domain/gateway/gateway-subsystem.d.ts +6 -2
  158. package/daemon/dist/domain/gateway/gateway-subsystem.d.ts.map +1 -1
  159. package/daemon/dist/domain/gateway/gateway-subsystem.js +5 -3
  160. package/daemon/dist/domain/gateway/gateway-subsystem.js.map +1 -1
  161. package/daemon/dist/domain/gateway/human-registry.d.ts +9 -1
  162. package/daemon/dist/domain/gateway/human-registry.d.ts.map +1 -1
  163. package/daemon/dist/domain/gateway/human-registry.js +32 -1
  164. package/daemon/dist/domain/gateway/human-registry.js.map +1 -1
  165. package/daemon/dist/domain/gateway/operator-delivery-engine.d.ts +32 -0
  166. package/daemon/dist/domain/gateway/operator-delivery-engine.d.ts.map +1 -0
  167. package/daemon/dist/domain/gateway/operator-delivery-engine.js +86 -0
  168. package/daemon/dist/domain/gateway/operator-delivery-engine.js.map +1 -0
  169. package/daemon/dist/domain/gateway/slack/config.d.ts +3 -2
  170. package/daemon/dist/domain/gateway/slack/config.d.ts.map +1 -1
  171. package/daemon/dist/domain/gateway/slack/config.js +20 -4
  172. package/daemon/dist/domain/gateway/slack/config.js.map +1 -1
  173. package/daemon/dist/domain/gateway/slack/inbound.d.ts +34 -6
  174. package/daemon/dist/domain/gateway/slack/inbound.d.ts.map +1 -1
  175. package/daemon/dist/domain/gateway/slack/inbound.js +60 -9
  176. package/daemon/dist/domain/gateway/slack/inbound.js.map +1 -1
  177. package/daemon/dist/domain/gateway/slack/outbound-driver.d.ts +3 -0
  178. package/daemon/dist/domain/gateway/slack/outbound-driver.d.ts.map +1 -1
  179. package/daemon/dist/domain/gateway/slack/outbound-driver.js +12 -5
  180. package/daemon/dist/domain/gateway/slack/outbound-driver.js.map +1 -1
  181. package/daemon/dist/domain/gateway/slack/queue-access.d.ts +10 -5
  182. package/daemon/dist/domain/gateway/slack/queue-access.d.ts.map +1 -1
  183. package/daemon/dist/domain/gateway/slack/queue-access.js +46 -19
  184. package/daemon/dist/domain/gateway/slack/queue-access.js.map +1 -1
  185. package/daemon/dist/domain/gateway/slack/slack-api.d.ts +29 -6
  186. package/daemon/dist/domain/gateway/slack/slack-api.d.ts.map +1 -1
  187. package/daemon/dist/domain/gateway/slack/slack-api.js +41 -3
  188. package/daemon/dist/domain/gateway/slack/slack-api.js.map +1 -1
  189. package/daemon/dist/domain/gateway/slack/slack-delivery.d.ts +9 -3
  190. package/daemon/dist/domain/gateway/slack/slack-delivery.d.ts.map +1 -1
  191. package/daemon/dist/domain/gateway/slack/slack-delivery.js +132 -12
  192. package/daemon/dist/domain/gateway/slack/slack-delivery.js.map +1 -1
  193. package/daemon/dist/domain/gateway/slack/slack-subsystem.d.ts +10 -0
  194. package/daemon/dist/domain/gateway/slack/slack-subsystem.d.ts.map +1 -1
  195. package/daemon/dist/domain/gateway/slack/slack-subsystem.js +286 -11
  196. package/daemon/dist/domain/gateway/slack/slack-subsystem.js.map +1 -1
  197. package/daemon/dist/domain/graph-projection.d.ts +6 -0
  198. package/daemon/dist/domain/graph-projection.d.ts.map +1 -1
  199. package/daemon/dist/domain/graph-projection.js +6 -0
  200. package/daemon/dist/domain/graph-projection.js.map +1 -1
  201. package/daemon/dist/domain/mission-control/mission-control-write-contract.d.ts.map +1 -1
  202. package/daemon/dist/domain/mission-control/mission-control-write-contract.js +1 -0
  203. package/daemon/dist/domain/mission-control/mission-control-write-contract.js.map +1 -1
  204. package/daemon/dist/domain/node-inventory.d.ts +41 -3
  205. package/daemon/dist/domain/node-inventory.d.ts.map +1 -1
  206. package/daemon/dist/domain/node-inventory.js +45 -48
  207. package/daemon/dist/domain/node-inventory.js.map +1 -1
  208. package/daemon/dist/domain/parked-query.d.ts +1 -0
  209. package/daemon/dist/domain/parked-query.d.ts.map +1 -1
  210. package/daemon/dist/domain/parked-query.js +1 -0
  211. package/daemon/dist/domain/parked-query.js.map +1 -1
  212. package/daemon/dist/domain/pod-bundle-assembler.d.ts.map +1 -1
  213. package/daemon/dist/domain/pod-bundle-assembler.js +12 -5
  214. package/daemon/dist/domain/pod-bundle-assembler.js.map +1 -1
  215. package/daemon/dist/domain/policies/context-usage-threshold.d.ts +7 -0
  216. package/daemon/dist/domain/policies/context-usage-threshold.d.ts.map +1 -0
  217. package/daemon/dist/domain/policies/context-usage-threshold.js +99 -0
  218. package/daemon/dist/domain/policies/context-usage-threshold.js.map +1 -0
  219. package/daemon/dist/domain/policies/delivery-deferral.d.ts +54 -0
  220. package/daemon/dist/domain/policies/delivery-deferral.d.ts.map +1 -0
  221. package/daemon/dist/domain/policies/delivery-deferral.js +153 -0
  222. package/daemon/dist/domain/policies/delivery-deferral.js.map +1 -0
  223. package/daemon/dist/domain/policies/delivery-digest-flush.d.ts +45 -0
  224. package/daemon/dist/domain/policies/delivery-digest-flush.d.ts.map +1 -0
  225. package/daemon/dist/domain/policies/delivery-digest-flush.js +94 -0
  226. package/daemon/dist/domain/policies/delivery-digest-flush.js.map +1 -0
  227. package/daemon/dist/domain/policies/parked-owner-consumer.d.ts +65 -0
  228. package/daemon/dist/domain/policies/parked-owner-consumer.d.ts.map +1 -0
  229. package/daemon/dist/domain/policies/parked-owner-consumer.js +244 -0
  230. package/daemon/dist/domain/policies/parked-owner-consumer.js.map +1 -0
  231. package/daemon/dist/domain/policies/types.d.ts +8 -0
  232. package/daemon/dist/domain/policies/types.d.ts.map +1 -1
  233. package/daemon/dist/domain/profile-resolver.d.ts +4 -0
  234. package/daemon/dist/domain/profile-resolver.d.ts.map +1 -1
  235. package/daemon/dist/domain/profile-resolver.js +58 -0
  236. package/daemon/dist/domain/profile-resolver.js.map +1 -1
  237. package/daemon/dist/domain/provider/provider-signals.d.ts +20 -1
  238. package/daemon/dist/domain/provider/provider-signals.d.ts.map +1 -1
  239. package/daemon/dist/domain/provider/provider-signals.js +64 -0
  240. package/daemon/dist/domain/provider/provider-signals.js.map +1 -1
  241. package/daemon/dist/domain/ps-projection.d.ts +7 -5
  242. package/daemon/dist/domain/ps-projection.d.ts.map +1 -1
  243. package/daemon/dist/domain/ps-projection.js +19 -32
  244. package/daemon/dist/domain/ps-projection.js.map +1 -1
  245. package/daemon/dist/domain/queue-pickup.d.ts.map +1 -1
  246. package/daemon/dist/domain/queue-pickup.js +5 -0
  247. package/daemon/dist/domain/queue-pickup.js.map +1 -1
  248. package/daemon/dist/domain/queue-repository.d.ts +55 -18
  249. package/daemon/dist/domain/queue-repository.d.ts.map +1 -1
  250. package/daemon/dist/domain/queue-repository.js +387 -83
  251. package/daemon/dist/domain/queue-repository.js.map +1 -1
  252. package/daemon/dist/domain/queue-retention.d.ts.map +1 -1
  253. package/daemon/dist/domain/queue-retention.js +8 -2
  254. package/daemon/dist/domain/queue-retention.js.map +1 -1
  255. package/daemon/dist/domain/queue-stuck-sweep.d.ts +24 -1
  256. package/daemon/dist/domain/queue-stuck-sweep.d.ts.map +1 -1
  257. package/daemon/dist/domain/queue-stuck-sweep.js +161 -24
  258. package/daemon/dist/domain/queue-stuck-sweep.js.map +1 -1
  259. package/daemon/dist/domain/queue-transition-log.d.ts +10 -0
  260. package/daemon/dist/domain/queue-transition-log.d.ts.map +1 -1
  261. package/daemon/dist/domain/queue-transition-log.js +49 -11
  262. package/daemon/dist/domain/queue-transition-log.js.map +1 -1
  263. package/daemon/dist/domain/queue-wake-ladder.d.ts +20 -2
  264. package/daemon/dist/domain/queue-wake-ladder.d.ts.map +1 -1
  265. package/daemon/dist/domain/queue-wake-ladder.js +187 -15
  266. package/daemon/dist/domain/queue-wake-ladder.js.map +1 -1
  267. package/daemon/dist/domain/queue-wake-repository.d.ts +16 -0
  268. package/daemon/dist/domain/queue-wake-repository.d.ts.map +1 -1
  269. package/daemon/dist/domain/queue-wake-repository.js +52 -3
  270. package/daemon/dist/domain/queue-wake-repository.js.map +1 -1
  271. package/daemon/dist/domain/restore-check-service.js +1 -1
  272. package/daemon/dist/domain/restore-check-service.js.map +1 -1
  273. package/daemon/dist/domain/restore-orchestrator.d.ts +2 -1
  274. package/daemon/dist/domain/restore-orchestrator.d.ts.map +1 -1
  275. package/daemon/dist/domain/restore-orchestrator.js +88 -15
  276. package/daemon/dist/domain/restore-orchestrator.js.map +1 -1
  277. package/daemon/dist/domain/restore-plan-preview.d.ts +6 -2
  278. package/daemon/dist/domain/restore-plan-preview.d.ts.map +1 -1
  279. package/daemon/dist/domain/restore-plan-preview.js +37 -19
  280. package/daemon/dist/domain/restore-plan-preview.js.map +1 -1
  281. package/daemon/dist/domain/rig-expansion-service.d.ts.map +1 -1
  282. package/daemon/dist/domain/rig-expansion-service.js +10 -9
  283. package/daemon/dist/domain/rig-expansion-service.js.map +1 -1
  284. package/daemon/dist/domain/rig-repository.d.ts +4 -0
  285. package/daemon/dist/domain/rig-repository.d.ts.map +1 -1
  286. package/daemon/dist/domain/rig-repository.js +21 -3
  287. package/daemon/dist/domain/rig-repository.js.map +1 -1
  288. package/daemon/dist/domain/rigspec-codec.d.ts.map +1 -1
  289. package/daemon/dist/domain/rigspec-codec.js +74 -4
  290. package/daemon/dist/domain/rigspec-codec.js.map +1 -1
  291. package/daemon/dist/domain/rigspec-instantiator.d.ts +4 -0
  292. package/daemon/dist/domain/rigspec-instantiator.d.ts.map +1 -1
  293. package/daemon/dist/domain/rigspec-instantiator.js +14 -0
  294. package/daemon/dist/domain/rigspec-instantiator.js.map +1 -1
  295. package/daemon/dist/domain/rigspec-schema.d.ts.map +1 -1
  296. package/daemon/dist/domain/rigspec-schema.js +32 -4
  297. package/daemon/dist/domain/rigspec-schema.js.map +1 -1
  298. package/daemon/dist/domain/scope/node-file.d.ts +8 -0
  299. package/daemon/dist/domain/scope/node-file.d.ts.map +1 -1
  300. package/daemon/dist/domain/scope/node-file.js +18 -0
  301. package/daemon/dist/domain/scope/node-file.js.map +1 -1
  302. package/daemon/dist/domain/scope/scope-audit.d.ts +5 -2
  303. package/daemon/dist/domain/scope/scope-audit.d.ts.map +1 -1
  304. package/daemon/dist/domain/scope/scope-audit.js +3 -3
  305. package/daemon/dist/domain/scope/scope-audit.js.map +1 -1
  306. package/daemon/dist/domain/snapshot-capture.d.ts.map +1 -1
  307. package/daemon/dist/domain/snapshot-capture.js +6 -0
  308. package/daemon/dist/domain/snapshot-capture.js.map +1 -1
  309. package/daemon/dist/domain/types.d.ts +26 -4
  310. package/daemon/dist/domain/types.d.ts.map +1 -1
  311. package/daemon/dist/domain/types.js.map +1 -1
  312. package/daemon/dist/domain/view-projector.d.ts +5 -1
  313. package/daemon/dist/domain/view-projector.d.ts.map +1 -1
  314. package/daemon/dist/domain/view-projector.js +24 -0
  315. package/daemon/dist/domain/view-projector.js.map +1 -1
  316. package/daemon/dist/domain/watchdog-jobs-repository.d.ts +25 -6
  317. package/daemon/dist/domain/watchdog-jobs-repository.d.ts.map +1 -1
  318. package/daemon/dist/domain/watchdog-jobs-repository.js +115 -32
  319. package/daemon/dist/domain/watchdog-jobs-repository.js.map +1 -1
  320. package/daemon/dist/domain/watchdog-policy-engine.d.ts +40 -1
  321. package/daemon/dist/domain/watchdog-policy-engine.d.ts.map +1 -1
  322. package/daemon/dist/domain/watchdog-policy-engine.js +112 -6
  323. package/daemon/dist/domain/watchdog-policy-engine.js.map +1 -1
  324. package/daemon/dist/domain/watchdog-scheduler.d.ts.map +1 -1
  325. package/daemon/dist/domain/watchdog-scheduler.js +3 -2
  326. package/daemon/dist/domain/watchdog-scheduler.js.map +1 -1
  327. package/daemon/dist/domain/workspace/workspace-doctor.d.ts.map +1 -1
  328. package/daemon/dist/domain/workspace/workspace-doctor.js +2 -4
  329. package/daemon/dist/domain/workspace/workspace-doctor.js.map +1 -1
  330. package/daemon/dist/index.d.ts +9 -0
  331. package/daemon/dist/index.d.ts.map +1 -1
  332. package/daemon/dist/index.js +24 -1
  333. package/daemon/dist/index.js.map +1 -1
  334. package/daemon/dist/routes/agent-images.d.ts.map +1 -1
  335. package/daemon/dist/routes/agent-images.js +9 -0
  336. package/daemon/dist/routes/agent-images.js.map +1 -1
  337. package/daemon/dist/routes/bundles.d.ts.map +1 -1
  338. package/daemon/dist/routes/bundles.js +61 -1
  339. package/daemon/dist/routes/bundles.js.map +1 -1
  340. package/daemon/dist/routes/gateway.js +1 -1
  341. package/daemon/dist/routes/gateway.js.map +1 -1
  342. package/daemon/dist/routes/queue.d.ts.map +1 -1
  343. package/daemon/dist/routes/queue.js +22 -11
  344. package/daemon/dist/routes/queue.js.map +1 -1
  345. package/daemon/dist/routes/rigs.js +38 -2
  346. package/daemon/dist/routes/rigs.js.map +1 -1
  347. package/daemon/dist/routes/scope-audit.js +6 -6
  348. package/daemon/dist/routes/scope-audit.js.map +1 -1
  349. package/daemon/dist/routes/views.d.ts.map +1 -1
  350. package/daemon/dist/routes/views.js +4 -1
  351. package/daemon/dist/routes/views.js.map +1 -1
  352. package/daemon/dist/routes/watchdog.d.ts.map +1 -1
  353. package/daemon/dist/routes/watchdog.js +40 -3
  354. package/daemon/dist/routes/watchdog.js.map +1 -1
  355. package/daemon/dist/server.d.ts.map +1 -1
  356. package/daemon/dist/server.js +5 -0
  357. package/daemon/dist/server.js.map +1 -1
  358. package/daemon/dist/startup.d.ts.map +1 -1
  359. package/daemon/dist/startup.js +194 -5
  360. package/daemon/dist/startup.js.map +1 -1
  361. package/daemon/docs/reference/agent-spec.md +4 -4
  362. package/daemon/docs/reference/agent-state-taxonomy.md +8 -13
  363. package/daemon/docs/reference/chain-file-convention.md +2 -2
  364. package/daemon/docs/reference/knowledge-maturity.md +123 -0
  365. package/daemon/docs/reference/lore-routing.md +173 -0
  366. package/daemon/docs/reference/mission-install.md +194 -0
  367. package/daemon/docs/reference/planning-dial.md +55 -0
  368. package/daemon/docs/reference/product-management-pass.md +139 -0
  369. package/daemon/docs/reference/release-boundary.md +88 -0
  370. package/daemon/docs/reference/sdlc-conventions.md +42 -69
  371. package/daemon/docs/reference/wave-sdlc.md +113 -0
  372. package/daemon/policies/builtin/standard.policy.md +3 -3
  373. package/daemon/policies/builtin/yolo.policy.md +7 -2
  374. package/daemon/specs/agents/shared/skills/core/agent-startup-and-context-ingestion/SKILL.md +1 -1
  375. package/daemon/specs/agents/shared/skills/core/cross-host-rig-commands/SKILL.md +6 -13
  376. package/daemon/specs/agents/shared/skills/core/messaging-the-human/SKILL.md +98 -0
  377. package/daemon/specs/agents/shared/skills/core/openrig-skills/SKILL.md +118 -0
  378. package/daemon/specs/agents/shared/skills/core/openrig-upgrade/SKILL.md +19 -75
  379. package/daemon/specs/agents/shared/skills/core/watchdog/SKILL.md +4 -10
  380. package/daemon/specs/agents/shared/skills/pm/requirements-writer/SKILL.md +15 -21
  381. package/daemon/specs/agents/shared/skills/process/systematic-debugging/find-polluter.sh +0 -0
  382. package/daemon/specs/rigs/launch/kernel/agents/advisor/lead/guidance/role.md +2 -2
  383. package/daemon/specs/rigs/launch/kernel/agents/advisor/lead/startup/context.md +3 -3
  384. package/daemon/specs/rigs/launch/kernel/agents/operator/agent/guidance/role.md +3 -3
  385. package/daemon/specs/rigs/launch/kernel/agents/queue/worker/guidance/role.md +1 -1
  386. package/daemon/specs/rigs/launch/kernel/agents/queue/worker/startup/context.md +1 -1
  387. package/daemon/substance-surfaces.json +8 -0
  388. package/dist/build-info.js +3 -3
  389. package/dist/commands/broadcast.d.ts.map +1 -1
  390. package/dist/commands/broadcast.js +6 -1
  391. package/dist/commands/broadcast.js.map +1 -1
  392. package/dist/commands/capture.js +1 -1
  393. package/dist/commands/context.d.ts.map +1 -1
  394. package/dist/commands/context.js +12 -1
  395. package/dist/commands/context.js.map +1 -1
  396. package/dist/commands/expand.d.ts.map +1 -1
  397. package/dist/commands/expand.js +9 -13
  398. package/dist/commands/expand.js.map +1 -1
  399. package/dist/commands/ps.d.ts +4 -0
  400. package/dist/commands/ps.d.ts.map +1 -1
  401. package/dist/commands/ps.js +15 -7
  402. package/dist/commands/ps.js.map +1 -1
  403. package/dist/commands/scope.d.ts.map +1 -1
  404. package/dist/commands/scope.js +40 -11
  405. package/dist/commands/scope.js.map +1 -1
  406. package/dist/commands/send.d.ts +2 -0
  407. package/dist/commands/send.d.ts.map +1 -1
  408. package/dist/commands/send.js +24 -2
  409. package/dist/commands/send.js.map +1 -1
  410. package/dist/commands/slack.d.ts.map +1 -1
  411. package/dist/commands/slack.js +4 -2
  412. package/dist/commands/slack.js.map +1 -1
  413. package/dist/commands/view.d.ts.map +1 -1
  414. package/dist/commands/view.js +3 -0
  415. package/dist/commands/view.js.map +1 -1
  416. package/dist/commands/watchdog.d.ts.map +1 -1
  417. package/dist/commands/watchdog.js +64 -9
  418. package/dist/commands/watchdog.js.map +1 -1
  419. package/dist/cross-host-target.js +1 -1
  420. package/dist/cross-host-target.js.map +1 -1
  421. package/dist/host-registry.d.ts +2 -2
  422. package/dist/host-registry.js +2 -2
  423. package/dist/lib/scope/scope-audit.d.ts +4 -1
  424. package/dist/lib/scope/scope-audit.d.ts.map +1 -1
  425. package/dist/lib/scope/scope-audit.js +3 -3
  426. package/dist/lib/scope/scope-audit.js.map +1 -1
  427. package/dist/lib/scope/scope-fs.d.ts +8 -0
  428. package/dist/lib/scope/scope-fs.d.ts.map +1 -1
  429. package/dist/lib/scope/scope-fs.js +18 -0
  430. package/dist/lib/scope/scope-fs.js.map +1 -1
  431. package/dist/lib/scope-templates/backlog-deprecation.md +1 -1
  432. package/dist/lib/scope-templates/backlog-tech-debt.md +1 -1
  433. package/dist/lib/scope-templates/bug-fix.md +1 -1
  434. package/dist/lib/scope-templates/capability-delta.md +1 -0
  435. package/dist/lib/scope-templates/placeholder.md +1 -1
  436. package/dist/lib/scope-templates/release-feature.md +1 -1
  437. package/dist/lib/scope-templates/research.md +1 -1
  438. package/node_modules/@openrig/daemon/dist/build-info.js +3 -3
  439. package/node_modules/@openrig/daemon/dist/context-pack-taxonomy-surface.d.ts +2 -0
  440. package/node_modules/@openrig/daemon/dist/context-pack-taxonomy-surface.d.ts.map +1 -0
  441. package/node_modules/@openrig/daemon/dist/context-pack-taxonomy-surface.js +6 -0
  442. package/node_modules/@openrig/daemon/dist/context-pack-taxonomy-surface.js.map +1 -0
  443. package/node_modules/@openrig/daemon/dist/db/all-migrations.d.ts +1 -1
  444. package/node_modules/@openrig/daemon/dist/db/all-migrations.d.ts.map +1 -1
  445. package/node_modules/@openrig/daemon/dist/db/all-migrations.js +8 -2
  446. package/node_modules/@openrig/daemon/dist/db/all-migrations.js.map +1 -1
  447. package/node_modules/@openrig/daemon/dist/db/migrations/074_context_usage_watchdog.d.ts +4 -0
  448. package/node_modules/@openrig/daemon/dist/db/migrations/074_context_usage_watchdog.d.ts.map +1 -0
  449. package/node_modules/@openrig/daemon/dist/db/migrations/074_context_usage_watchdog.js +11 -0
  450. package/node_modules/@openrig/daemon/dist/db/migrations/074_context_usage_watchdog.js.map +1 -0
  451. package/node_modules/@openrig/daemon/dist/db/migrations/075_context_usage_watchdog_generation.d.ts +4 -0
  452. package/node_modules/@openrig/daemon/dist/db/migrations/075_context_usage_watchdog_generation.d.ts.map +1 -0
  453. package/node_modules/@openrig/daemon/dist/db/migrations/075_context_usage_watchdog_generation.js +8 -0
  454. package/node_modules/@openrig/daemon/dist/db/migrations/075_context_usage_watchdog_generation.js.map +1 -0
  455. package/node_modules/@openrig/daemon/dist/db/migrations/076_owner_notification_levels.d.ts +8 -0
  456. package/node_modules/@openrig/daemon/dist/db/migrations/076_owner_notification_levels.d.ts.map +1 -0
  457. package/node_modules/@openrig/daemon/dist/db/migrations/076_owner_notification_levels.js +15 -0
  458. package/node_modules/@openrig/daemon/dist/db/migrations/076_owner_notification_levels.js.map +1 -0
  459. package/node_modules/@openrig/daemon/dist/domain/active-occupant.d.ts +44 -0
  460. package/node_modules/@openrig/daemon/dist/domain/active-occupant.d.ts.map +1 -0
  461. package/node_modules/@openrig/daemon/dist/domain/active-occupant.js +72 -0
  462. package/node_modules/@openrig/daemon/dist/domain/active-occupant.js.map +1 -0
  463. package/node_modules/@openrig/daemon/dist/domain/agent-manifest.d.ts +6 -0
  464. package/node_modules/@openrig/daemon/dist/domain/agent-manifest.d.ts.map +1 -1
  465. package/node_modules/@openrig/daemon/dist/domain/agent-manifest.js +77 -15
  466. package/node_modules/@openrig/daemon/dist/domain/agent-manifest.js.map +1 -1
  467. package/node_modules/@openrig/daemon/dist/domain/agent-resolver.d.ts +11 -0
  468. package/node_modules/@openrig/daemon/dist/domain/agent-resolver.d.ts.map +1 -1
  469. package/node_modules/@openrig/daemon/dist/domain/agent-resolver.js +55 -0
  470. package/node_modules/@openrig/daemon/dist/domain/agent-resolver.js.map +1 -1
  471. package/node_modules/@openrig/daemon/dist/domain/bundle-context-packs-router.d.ts +9 -2
  472. package/node_modules/@openrig/daemon/dist/domain/bundle-context-packs-router.d.ts.map +1 -1
  473. package/node_modules/@openrig/daemon/dist/domain/bundle-context-packs-router.js +18 -0
  474. package/node_modules/@openrig/daemon/dist/domain/bundle-context-packs-router.js.map +1 -1
  475. package/node_modules/@openrig/daemon/dist/domain/claude-compaction-enforcer.d.ts +7 -0
  476. package/node_modules/@openrig/daemon/dist/domain/claude-compaction-enforcer.d.ts.map +1 -1
  477. package/node_modules/@openrig/daemon/dist/domain/claude-compaction-enforcer.js +10 -0
  478. package/node_modules/@openrig/daemon/dist/domain/claude-compaction-enforcer.js.map +1 -1
  479. package/node_modules/@openrig/daemon/dist/domain/context-packs/context-pack-library-service.d.ts.map +1 -1
  480. package/node_modules/@openrig/daemon/dist/domain/context-packs/context-pack-library-service.js +7 -0
  481. package/node_modules/@openrig/daemon/dist/domain/context-packs/context-pack-library-service.js.map +1 -1
  482. package/node_modules/@openrig/daemon/dist/domain/context-packs/context-pack-types.d.ts +11 -0
  483. package/node_modules/@openrig/daemon/dist/domain/context-packs/context-pack-types.d.ts.map +1 -1
  484. package/node_modules/@openrig/daemon/dist/domain/context-packs/context-pack-types.js +11 -0
  485. package/node_modules/@openrig/daemon/dist/domain/context-packs/context-pack-types.js.map +1 -1
  486. package/node_modules/@openrig/daemon/dist/domain/context-packs/manifest-parser.d.ts.map +1 -1
  487. package/node_modules/@openrig/daemon/dist/domain/context-packs/manifest-parser.js +13 -1
  488. package/node_modules/@openrig/daemon/dist/domain/context-packs/manifest-parser.js.map +1 -1
  489. package/node_modules/@openrig/daemon/dist/domain/continuity-policy-materializer.d.ts +88 -0
  490. package/node_modules/@openrig/daemon/dist/domain/continuity-policy-materializer.d.ts.map +1 -0
  491. package/node_modules/@openrig/daemon/dist/domain/continuity-policy-materializer.js +290 -0
  492. package/node_modules/@openrig/daemon/dist/domain/continuity-policy-materializer.js.map +1 -0
  493. package/node_modules/@openrig/daemon/dist/domain/continuity-stack-packets.d.ts +65 -0
  494. package/node_modules/@openrig/daemon/dist/domain/continuity-stack-packets.d.ts.map +1 -0
  495. package/node_modules/@openrig/daemon/dist/domain/continuity-stack-packets.js +99 -0
  496. package/node_modules/@openrig/daemon/dist/domain/continuity-stack-packets.js.map +1 -0
  497. package/node_modules/@openrig/daemon/dist/domain/execution-view.d.ts +39 -0
  498. package/node_modules/@openrig/daemon/dist/domain/execution-view.d.ts.map +1 -0
  499. package/node_modules/@openrig/daemon/dist/domain/execution-view.js +707 -0
  500. package/node_modules/@openrig/daemon/dist/domain/execution-view.js.map +1 -0
  501. package/node_modules/@openrig/daemon/dist/domain/gateway/delivery-rules-engine.d.ts +60 -0
  502. package/node_modules/@openrig/daemon/dist/domain/gateway/delivery-rules-engine.d.ts.map +1 -0
  503. package/node_modules/@openrig/daemon/dist/domain/gateway/delivery-rules-engine.js +144 -0
  504. package/node_modules/@openrig/daemon/dist/domain/gateway/delivery-rules-engine.js.map +1 -0
  505. package/node_modules/@openrig/daemon/dist/domain/gateway/destination-resolver.d.ts +20 -0
  506. package/node_modules/@openrig/daemon/dist/domain/gateway/destination-resolver.d.ts.map +1 -0
  507. package/node_modules/@openrig/daemon/dist/domain/gateway/destination-resolver.js +52 -0
  508. package/node_modules/@openrig/daemon/dist/domain/gateway/destination-resolver.js.map +1 -0
  509. package/node_modules/@openrig/daemon/dist/domain/gateway/dispatcher.d.ts +3 -1
  510. package/node_modules/@openrig/daemon/dist/domain/gateway/dispatcher.d.ts.map +1 -1
  511. package/node_modules/@openrig/daemon/dist/domain/gateway/dispatcher.js +9 -2
  512. package/node_modules/@openrig/daemon/dist/domain/gateway/dispatcher.js.map +1 -1
  513. package/node_modules/@openrig/daemon/dist/domain/gateway/gateway-subsystem.d.ts +6 -2
  514. package/node_modules/@openrig/daemon/dist/domain/gateway/gateway-subsystem.d.ts.map +1 -1
  515. package/node_modules/@openrig/daemon/dist/domain/gateway/gateway-subsystem.js +5 -3
  516. package/node_modules/@openrig/daemon/dist/domain/gateway/gateway-subsystem.js.map +1 -1
  517. package/node_modules/@openrig/daemon/dist/domain/gateway/human-registry.d.ts +9 -1
  518. package/node_modules/@openrig/daemon/dist/domain/gateway/human-registry.d.ts.map +1 -1
  519. package/node_modules/@openrig/daemon/dist/domain/gateway/human-registry.js +32 -1
  520. package/node_modules/@openrig/daemon/dist/domain/gateway/human-registry.js.map +1 -1
  521. package/node_modules/@openrig/daemon/dist/domain/gateway/operator-delivery-engine.d.ts +32 -0
  522. package/node_modules/@openrig/daemon/dist/domain/gateway/operator-delivery-engine.d.ts.map +1 -0
  523. package/node_modules/@openrig/daemon/dist/domain/gateway/operator-delivery-engine.js +86 -0
  524. package/node_modules/@openrig/daemon/dist/domain/gateway/operator-delivery-engine.js.map +1 -0
  525. package/node_modules/@openrig/daemon/dist/domain/gateway/slack/config.d.ts +3 -2
  526. package/node_modules/@openrig/daemon/dist/domain/gateway/slack/config.d.ts.map +1 -1
  527. package/node_modules/@openrig/daemon/dist/domain/gateway/slack/config.js +20 -4
  528. package/node_modules/@openrig/daemon/dist/domain/gateway/slack/config.js.map +1 -1
  529. package/node_modules/@openrig/daemon/dist/domain/gateway/slack/inbound.d.ts +34 -6
  530. package/node_modules/@openrig/daemon/dist/domain/gateway/slack/inbound.d.ts.map +1 -1
  531. package/node_modules/@openrig/daemon/dist/domain/gateway/slack/inbound.js +60 -9
  532. package/node_modules/@openrig/daemon/dist/domain/gateway/slack/inbound.js.map +1 -1
  533. package/node_modules/@openrig/daemon/dist/domain/gateway/slack/outbound-driver.d.ts +3 -0
  534. package/node_modules/@openrig/daemon/dist/domain/gateway/slack/outbound-driver.d.ts.map +1 -1
  535. package/node_modules/@openrig/daemon/dist/domain/gateway/slack/outbound-driver.js +12 -5
  536. package/node_modules/@openrig/daemon/dist/domain/gateway/slack/outbound-driver.js.map +1 -1
  537. package/node_modules/@openrig/daemon/dist/domain/gateway/slack/queue-access.d.ts +10 -5
  538. package/node_modules/@openrig/daemon/dist/domain/gateway/slack/queue-access.d.ts.map +1 -1
  539. package/node_modules/@openrig/daemon/dist/domain/gateway/slack/queue-access.js +46 -19
  540. package/node_modules/@openrig/daemon/dist/domain/gateway/slack/queue-access.js.map +1 -1
  541. package/node_modules/@openrig/daemon/dist/domain/gateway/slack/slack-api.d.ts +29 -6
  542. package/node_modules/@openrig/daemon/dist/domain/gateway/slack/slack-api.d.ts.map +1 -1
  543. package/node_modules/@openrig/daemon/dist/domain/gateway/slack/slack-api.js +41 -3
  544. package/node_modules/@openrig/daemon/dist/domain/gateway/slack/slack-api.js.map +1 -1
  545. package/node_modules/@openrig/daemon/dist/domain/gateway/slack/slack-delivery.d.ts +9 -3
  546. package/node_modules/@openrig/daemon/dist/domain/gateway/slack/slack-delivery.d.ts.map +1 -1
  547. package/node_modules/@openrig/daemon/dist/domain/gateway/slack/slack-delivery.js +132 -12
  548. package/node_modules/@openrig/daemon/dist/domain/gateway/slack/slack-delivery.js.map +1 -1
  549. package/node_modules/@openrig/daemon/dist/domain/gateway/slack/slack-subsystem.d.ts +10 -0
  550. package/node_modules/@openrig/daemon/dist/domain/gateway/slack/slack-subsystem.d.ts.map +1 -1
  551. package/node_modules/@openrig/daemon/dist/domain/gateway/slack/slack-subsystem.js +286 -11
  552. package/node_modules/@openrig/daemon/dist/domain/gateway/slack/slack-subsystem.js.map +1 -1
  553. package/node_modules/@openrig/daemon/dist/domain/graph-projection.d.ts +6 -0
  554. package/node_modules/@openrig/daemon/dist/domain/graph-projection.d.ts.map +1 -1
  555. package/node_modules/@openrig/daemon/dist/domain/graph-projection.js +6 -0
  556. package/node_modules/@openrig/daemon/dist/domain/graph-projection.js.map +1 -1
  557. package/node_modules/@openrig/daemon/dist/domain/mission-control/mission-control-write-contract.d.ts.map +1 -1
  558. package/node_modules/@openrig/daemon/dist/domain/mission-control/mission-control-write-contract.js +1 -0
  559. package/node_modules/@openrig/daemon/dist/domain/mission-control/mission-control-write-contract.js.map +1 -1
  560. package/node_modules/@openrig/daemon/dist/domain/node-inventory.d.ts +41 -3
  561. package/node_modules/@openrig/daemon/dist/domain/node-inventory.d.ts.map +1 -1
  562. package/node_modules/@openrig/daemon/dist/domain/node-inventory.js +45 -48
  563. package/node_modules/@openrig/daemon/dist/domain/node-inventory.js.map +1 -1
  564. package/node_modules/@openrig/daemon/dist/domain/parked-query.d.ts +1 -0
  565. package/node_modules/@openrig/daemon/dist/domain/parked-query.d.ts.map +1 -1
  566. package/node_modules/@openrig/daemon/dist/domain/parked-query.js +1 -0
  567. package/node_modules/@openrig/daemon/dist/domain/parked-query.js.map +1 -1
  568. package/node_modules/@openrig/daemon/dist/domain/pod-bundle-assembler.d.ts.map +1 -1
  569. package/node_modules/@openrig/daemon/dist/domain/pod-bundle-assembler.js +12 -5
  570. package/node_modules/@openrig/daemon/dist/domain/pod-bundle-assembler.js.map +1 -1
  571. package/node_modules/@openrig/daemon/dist/domain/policies/context-usage-threshold.d.ts +7 -0
  572. package/node_modules/@openrig/daemon/dist/domain/policies/context-usage-threshold.d.ts.map +1 -0
  573. package/node_modules/@openrig/daemon/dist/domain/policies/context-usage-threshold.js +99 -0
  574. package/node_modules/@openrig/daemon/dist/domain/policies/context-usage-threshold.js.map +1 -0
  575. package/node_modules/@openrig/daemon/dist/domain/policies/delivery-deferral.d.ts +54 -0
  576. package/node_modules/@openrig/daemon/dist/domain/policies/delivery-deferral.d.ts.map +1 -0
  577. package/node_modules/@openrig/daemon/dist/domain/policies/delivery-deferral.js +153 -0
  578. package/node_modules/@openrig/daemon/dist/domain/policies/delivery-deferral.js.map +1 -0
  579. package/node_modules/@openrig/daemon/dist/domain/policies/delivery-digest-flush.d.ts +45 -0
  580. package/node_modules/@openrig/daemon/dist/domain/policies/delivery-digest-flush.d.ts.map +1 -0
  581. package/node_modules/@openrig/daemon/dist/domain/policies/delivery-digest-flush.js +94 -0
  582. package/node_modules/@openrig/daemon/dist/domain/policies/delivery-digest-flush.js.map +1 -0
  583. package/node_modules/@openrig/daemon/dist/domain/policies/parked-owner-consumer.d.ts +65 -0
  584. package/node_modules/@openrig/daemon/dist/domain/policies/parked-owner-consumer.d.ts.map +1 -0
  585. package/node_modules/@openrig/daemon/dist/domain/policies/parked-owner-consumer.js +244 -0
  586. package/node_modules/@openrig/daemon/dist/domain/policies/parked-owner-consumer.js.map +1 -0
  587. package/node_modules/@openrig/daemon/dist/domain/policies/types.d.ts +8 -0
  588. package/node_modules/@openrig/daemon/dist/domain/policies/types.d.ts.map +1 -1
  589. package/node_modules/@openrig/daemon/dist/domain/profile-resolver.d.ts +4 -0
  590. package/node_modules/@openrig/daemon/dist/domain/profile-resolver.d.ts.map +1 -1
  591. package/node_modules/@openrig/daemon/dist/domain/profile-resolver.js +58 -0
  592. package/node_modules/@openrig/daemon/dist/domain/profile-resolver.js.map +1 -1
  593. package/node_modules/@openrig/daemon/dist/domain/provider/provider-signals.d.ts +20 -1
  594. package/node_modules/@openrig/daemon/dist/domain/provider/provider-signals.d.ts.map +1 -1
  595. package/node_modules/@openrig/daemon/dist/domain/provider/provider-signals.js +64 -0
  596. package/node_modules/@openrig/daemon/dist/domain/provider/provider-signals.js.map +1 -1
  597. package/node_modules/@openrig/daemon/dist/domain/ps-projection.d.ts +7 -5
  598. package/node_modules/@openrig/daemon/dist/domain/ps-projection.d.ts.map +1 -1
  599. package/node_modules/@openrig/daemon/dist/domain/ps-projection.js +19 -32
  600. package/node_modules/@openrig/daemon/dist/domain/ps-projection.js.map +1 -1
  601. package/node_modules/@openrig/daemon/dist/domain/queue-pickup.d.ts.map +1 -1
  602. package/node_modules/@openrig/daemon/dist/domain/queue-pickup.js +5 -0
  603. package/node_modules/@openrig/daemon/dist/domain/queue-pickup.js.map +1 -1
  604. package/node_modules/@openrig/daemon/dist/domain/queue-repository.d.ts +55 -18
  605. package/node_modules/@openrig/daemon/dist/domain/queue-repository.d.ts.map +1 -1
  606. package/node_modules/@openrig/daemon/dist/domain/queue-repository.js +387 -83
  607. package/node_modules/@openrig/daemon/dist/domain/queue-repository.js.map +1 -1
  608. package/node_modules/@openrig/daemon/dist/domain/queue-retention.d.ts.map +1 -1
  609. package/node_modules/@openrig/daemon/dist/domain/queue-retention.js +8 -2
  610. package/node_modules/@openrig/daemon/dist/domain/queue-retention.js.map +1 -1
  611. package/node_modules/@openrig/daemon/dist/domain/queue-stuck-sweep.d.ts +24 -1
  612. package/node_modules/@openrig/daemon/dist/domain/queue-stuck-sweep.d.ts.map +1 -1
  613. package/node_modules/@openrig/daemon/dist/domain/queue-stuck-sweep.js +161 -24
  614. package/node_modules/@openrig/daemon/dist/domain/queue-stuck-sweep.js.map +1 -1
  615. package/node_modules/@openrig/daemon/dist/domain/queue-transition-log.d.ts +10 -0
  616. package/node_modules/@openrig/daemon/dist/domain/queue-transition-log.d.ts.map +1 -1
  617. package/node_modules/@openrig/daemon/dist/domain/queue-transition-log.js +49 -11
  618. package/node_modules/@openrig/daemon/dist/domain/queue-transition-log.js.map +1 -1
  619. package/node_modules/@openrig/daemon/dist/domain/queue-wake-ladder.d.ts +20 -2
  620. package/node_modules/@openrig/daemon/dist/domain/queue-wake-ladder.d.ts.map +1 -1
  621. package/node_modules/@openrig/daemon/dist/domain/queue-wake-ladder.js +187 -15
  622. package/node_modules/@openrig/daemon/dist/domain/queue-wake-ladder.js.map +1 -1
  623. package/node_modules/@openrig/daemon/dist/domain/queue-wake-repository.d.ts +16 -0
  624. package/node_modules/@openrig/daemon/dist/domain/queue-wake-repository.d.ts.map +1 -1
  625. package/node_modules/@openrig/daemon/dist/domain/queue-wake-repository.js +52 -3
  626. package/node_modules/@openrig/daemon/dist/domain/queue-wake-repository.js.map +1 -1
  627. package/node_modules/@openrig/daemon/dist/domain/restore-check-service.js +1 -1
  628. package/node_modules/@openrig/daemon/dist/domain/restore-check-service.js.map +1 -1
  629. package/node_modules/@openrig/daemon/dist/domain/restore-orchestrator.d.ts +2 -1
  630. package/node_modules/@openrig/daemon/dist/domain/restore-orchestrator.d.ts.map +1 -1
  631. package/node_modules/@openrig/daemon/dist/domain/restore-orchestrator.js +88 -15
  632. package/node_modules/@openrig/daemon/dist/domain/restore-orchestrator.js.map +1 -1
  633. package/node_modules/@openrig/daemon/dist/domain/restore-plan-preview.d.ts +6 -2
  634. package/node_modules/@openrig/daemon/dist/domain/restore-plan-preview.d.ts.map +1 -1
  635. package/node_modules/@openrig/daemon/dist/domain/restore-plan-preview.js +37 -19
  636. package/node_modules/@openrig/daemon/dist/domain/restore-plan-preview.js.map +1 -1
  637. package/node_modules/@openrig/daemon/dist/domain/rig-expansion-service.d.ts.map +1 -1
  638. package/node_modules/@openrig/daemon/dist/domain/rig-expansion-service.js +10 -9
  639. package/node_modules/@openrig/daemon/dist/domain/rig-expansion-service.js.map +1 -1
  640. package/node_modules/@openrig/daemon/dist/domain/rig-repository.d.ts +4 -0
  641. package/node_modules/@openrig/daemon/dist/domain/rig-repository.d.ts.map +1 -1
  642. package/node_modules/@openrig/daemon/dist/domain/rig-repository.js +21 -3
  643. package/node_modules/@openrig/daemon/dist/domain/rig-repository.js.map +1 -1
  644. package/node_modules/@openrig/daemon/dist/domain/rigspec-codec.d.ts.map +1 -1
  645. package/node_modules/@openrig/daemon/dist/domain/rigspec-codec.js +74 -4
  646. package/node_modules/@openrig/daemon/dist/domain/rigspec-codec.js.map +1 -1
  647. package/node_modules/@openrig/daemon/dist/domain/rigspec-instantiator.d.ts +4 -0
  648. package/node_modules/@openrig/daemon/dist/domain/rigspec-instantiator.d.ts.map +1 -1
  649. package/node_modules/@openrig/daemon/dist/domain/rigspec-instantiator.js +14 -0
  650. package/node_modules/@openrig/daemon/dist/domain/rigspec-instantiator.js.map +1 -1
  651. package/node_modules/@openrig/daemon/dist/domain/rigspec-schema.d.ts.map +1 -1
  652. package/node_modules/@openrig/daemon/dist/domain/rigspec-schema.js +32 -4
  653. package/node_modules/@openrig/daemon/dist/domain/rigspec-schema.js.map +1 -1
  654. package/node_modules/@openrig/daemon/dist/domain/scope/node-file.d.ts +8 -0
  655. package/node_modules/@openrig/daemon/dist/domain/scope/node-file.d.ts.map +1 -1
  656. package/node_modules/@openrig/daemon/dist/domain/scope/node-file.js +18 -0
  657. package/node_modules/@openrig/daemon/dist/domain/scope/node-file.js.map +1 -1
  658. package/node_modules/@openrig/daemon/dist/domain/scope/scope-audit.d.ts +5 -2
  659. package/node_modules/@openrig/daemon/dist/domain/scope/scope-audit.d.ts.map +1 -1
  660. package/node_modules/@openrig/daemon/dist/domain/scope/scope-audit.js +3 -3
  661. package/node_modules/@openrig/daemon/dist/domain/scope/scope-audit.js.map +1 -1
  662. package/node_modules/@openrig/daemon/dist/domain/snapshot-capture.d.ts.map +1 -1
  663. package/node_modules/@openrig/daemon/dist/domain/snapshot-capture.js +6 -0
  664. package/node_modules/@openrig/daemon/dist/domain/snapshot-capture.js.map +1 -1
  665. package/node_modules/@openrig/daemon/dist/domain/types.d.ts +26 -4
  666. package/node_modules/@openrig/daemon/dist/domain/types.d.ts.map +1 -1
  667. package/node_modules/@openrig/daemon/dist/domain/types.js.map +1 -1
  668. package/node_modules/@openrig/daemon/dist/domain/view-projector.d.ts +5 -1
  669. package/node_modules/@openrig/daemon/dist/domain/view-projector.d.ts.map +1 -1
  670. package/node_modules/@openrig/daemon/dist/domain/view-projector.js +24 -0
  671. package/node_modules/@openrig/daemon/dist/domain/view-projector.js.map +1 -1
  672. package/node_modules/@openrig/daemon/dist/domain/watchdog-jobs-repository.d.ts +25 -6
  673. package/node_modules/@openrig/daemon/dist/domain/watchdog-jobs-repository.d.ts.map +1 -1
  674. package/node_modules/@openrig/daemon/dist/domain/watchdog-jobs-repository.js +115 -32
  675. package/node_modules/@openrig/daemon/dist/domain/watchdog-jobs-repository.js.map +1 -1
  676. package/node_modules/@openrig/daemon/dist/domain/watchdog-policy-engine.d.ts +40 -1
  677. package/node_modules/@openrig/daemon/dist/domain/watchdog-policy-engine.d.ts.map +1 -1
  678. package/node_modules/@openrig/daemon/dist/domain/watchdog-policy-engine.js +112 -6
  679. package/node_modules/@openrig/daemon/dist/domain/watchdog-policy-engine.js.map +1 -1
  680. package/node_modules/@openrig/daemon/dist/domain/watchdog-scheduler.d.ts.map +1 -1
  681. package/node_modules/@openrig/daemon/dist/domain/watchdog-scheduler.js +3 -2
  682. package/node_modules/@openrig/daemon/dist/domain/watchdog-scheduler.js.map +1 -1
  683. package/node_modules/@openrig/daemon/dist/domain/workspace/workspace-doctor.d.ts.map +1 -1
  684. package/node_modules/@openrig/daemon/dist/domain/workspace/workspace-doctor.js +2 -4
  685. package/node_modules/@openrig/daemon/dist/domain/workspace/workspace-doctor.js.map +1 -1
  686. package/node_modules/@openrig/daemon/dist/index.d.ts +9 -0
  687. package/node_modules/@openrig/daemon/dist/index.d.ts.map +1 -1
  688. package/node_modules/@openrig/daemon/dist/index.js +24 -1
  689. package/node_modules/@openrig/daemon/dist/index.js.map +1 -1
  690. package/node_modules/@openrig/daemon/dist/routes/agent-images.d.ts.map +1 -1
  691. package/node_modules/@openrig/daemon/dist/routes/agent-images.js +9 -0
  692. package/node_modules/@openrig/daemon/dist/routes/agent-images.js.map +1 -1
  693. package/node_modules/@openrig/daemon/dist/routes/bundles.d.ts.map +1 -1
  694. package/node_modules/@openrig/daemon/dist/routes/bundles.js +61 -1
  695. package/node_modules/@openrig/daemon/dist/routes/bundles.js.map +1 -1
  696. package/node_modules/@openrig/daemon/dist/routes/gateway.js +1 -1
  697. package/node_modules/@openrig/daemon/dist/routes/gateway.js.map +1 -1
  698. package/node_modules/@openrig/daemon/dist/routes/queue.d.ts.map +1 -1
  699. package/node_modules/@openrig/daemon/dist/routes/queue.js +22 -11
  700. package/node_modules/@openrig/daemon/dist/routes/queue.js.map +1 -1
  701. package/node_modules/@openrig/daemon/dist/routes/rigs.js +38 -2
  702. package/node_modules/@openrig/daemon/dist/routes/rigs.js.map +1 -1
  703. package/node_modules/@openrig/daemon/dist/routes/scope-audit.js +6 -6
  704. package/node_modules/@openrig/daemon/dist/routes/scope-audit.js.map +1 -1
  705. package/node_modules/@openrig/daemon/dist/routes/views.d.ts.map +1 -1
  706. package/node_modules/@openrig/daemon/dist/routes/views.js +4 -1
  707. package/node_modules/@openrig/daemon/dist/routes/views.js.map +1 -1
  708. package/node_modules/@openrig/daemon/dist/routes/watchdog.d.ts.map +1 -1
  709. package/node_modules/@openrig/daemon/dist/routes/watchdog.js +40 -3
  710. package/node_modules/@openrig/daemon/dist/routes/watchdog.js.map +1 -1
  711. package/node_modules/@openrig/daemon/dist/server.d.ts.map +1 -1
  712. package/node_modules/@openrig/daemon/dist/server.js +5 -0
  713. package/node_modules/@openrig/daemon/dist/server.js.map +1 -1
  714. package/node_modules/@openrig/daemon/dist/startup.d.ts.map +1 -1
  715. package/node_modules/@openrig/daemon/dist/startup.js +194 -5
  716. package/node_modules/@openrig/daemon/dist/startup.js.map +1 -1
  717. package/node_modules/@openrig/daemon/package.json +5 -1
  718. package/package.json +1 -1
  719. package/tui/dist/demo-data.js +2 -2
  720. package/tui/dist/demo-data.js.map +1 -1
  721. package/daemon/assets/plugins/openrig-core/skills/openrig-operating-model/CHANGELOG.md +0 -92
  722. package/daemon/assets/plugins/openrig-core/skills/openrig-operating-model/REVISION-GUIDE.md +0 -34
  723. package/daemon/assets/plugins/openrig-core/skills/openrig-operating-model/ROADMAP.md +0 -23
  724. package/daemon/assets/plugins/openrig-core/skills/openrig-operating-model/ROLLOUT.md +0 -234
  725. package/daemon/context-packs/skills/core/attention-queue/SKILL.md +0 -264
  726. package/daemon/context-packs/skills/core/attention-queue/manifest.yaml +0 -9
  727. package/daemon/specs/agents/shared/skills/core/attention-queue/SKILL.md +0 -264
@@ -1,5 +1,5 @@
1
1
  import { createHash } from "node:crypto";
2
- import { loadHumanRegistry } from "./gateway/human-registry.js";
2
+ import { loadHumanRegistry, resolveRegisteredHumanAddress } from "./gateway/human-registry.js";
3
3
  import { resolveExternal } from "./gateway/external-admission.js";
4
4
  import { QueueTransitionLog } from "./queue-transition-log.js";
5
5
  import { WAKE_INTENT_PREFIX } from "./outbox-handler.js";
@@ -7,9 +7,10 @@ import { derivePickup } from "./queue-pickup.js";
7
7
  import { wrapPaneEnvelope } from "../lib/pane-envelope.js";
8
8
  import { getSelfHostId } from "./hosts/fanout-contract.js";
9
9
  import { parseSessionName } from "./session-name.js";
10
+ import { classifyDestination } from "./gateway/destination-resolver.js";
10
11
  import { computeClosureRequiredAt, validateClosure, } from "./hot-potato-enforcer.js";
11
12
  import { isHumanSeatSession, validateHumanPark, validateHumanRoute } from "./human-route-enforcer.js";
12
- import { QueueWakeRepository } from "./queue-wake-repository.js";
13
+ import { QueueWakeRepository, USAGE_LIMIT_BLOCKER_TAG, } from "./queue-wake-repository.js";
13
14
  import { WatchdogJobsRepository } from "./watchdog-jobs-repository.js";
14
15
  export const QUEUE_STATES = [
15
16
  "pending",
@@ -164,6 +165,14 @@ function detectQueueColumn(db, columnName) {
164
165
  return false;
165
166
  }
166
167
  }
168
+ function detectTable(db, tableName) {
169
+ try {
170
+ return !!db.prepare("SELECT 1 FROM sqlite_master WHERE type = 'table' AND name = ?").get(tableName);
171
+ }
172
+ catch {
173
+ return false;
174
+ }
175
+ }
167
176
  /**
168
177
  * L3 — Queue repository. Owns CRUD over `queue_items` plus the wired-in
169
178
  * append-only transition log and hot-potato strict-rejection contract.
@@ -284,6 +293,9 @@ export class QueueRepository {
284
293
  hasEvidenceRefColumn;
285
294
  hasMintingGenColumn;
286
295
  hasClaimedGenColumn;
296
+ hasQueueTransitionsTable;
297
+ hasOwnerNotificationColumns;
298
+ loadHumanRegistryFn;
287
299
  /** OPR.0.4.6.WF3 FR-6 — injected by startup (never imported): the
288
300
  * workflow domain's is-live-frontier-packet predicate. */
289
301
  workflowFrontierPredicate;
@@ -296,9 +308,16 @@ export class QueueRepository {
296
308
  this.transport = opts?.transport;
297
309
  this.workflowFrontierPredicate = opts?.workflowFrontierPredicate;
298
310
  this.resolveOccupantGeneration = opts?.resolveOccupantGeneration;
311
+ this.loadHumanRegistryFn = opts?.loadHumanRegistry ?? (() => loadHumanRegistry());
299
312
  this.hasTargetRepoColumn = detectQueueColumn(db, "target_repo");
300
313
  this.hasSummaryColumn = detectQueueColumn(db, "summary");
301
314
  this.hasEvidenceRefColumn = detectQueueColumn(db, "evidence_ref");
315
+ this.hasQueueTransitionsTable = detectTable(db, "queue_transitions");
316
+ const transitionColumns = this.hasQueueTransitionsTable
317
+ ? new Set(db.prepare("PRAGMA table_info(queue_transitions)").all().map((column) => column.name))
318
+ : new Set();
319
+ this.hasOwnerNotificationColumns = transitionColumns.has("owner_notification_kind")
320
+ && transitionColumns.has("owner_notification_level");
302
321
  // GHOST-STAGE (e/Class-B): generation stamps (migration 063). Defensive detect so a pre-063
303
322
  // harness degrades (writers skip the columns; the release predicate never matches unstamped rows).
304
323
  this.hasMintingGenColumn = detectQueueColumn(db, "minting_generation_uuid");
@@ -347,6 +366,26 @@ export class QueueRepository {
347
366
  }
348
367
  this.outbox = outbox;
349
368
  }
369
+ /** The one transition-write classifier. It consumes structured state/action facts only. */
370
+ classifyOwnerNotification(input) {
371
+ if (input.explicitKind === "human-decision-resolved") {
372
+ return { kind: input.explicitKind, level: "NOTICE" };
373
+ }
374
+ const registry = this.loadHumanRegistryFn();
375
+ if (!registry.ok)
376
+ return null;
377
+ const blockedHuman = resolveRegisteredHumanAddress(input.nextBlockedOn, registry.entities);
378
+ const previousBlockedHuman = resolveRegisteredHumanAddress(input.previousBlockedOn, registry.entities);
379
+ const enteredHumanPark = input.nextState === "blocked" && blockedHuman !== null &&
380
+ (input.previousState !== "blocked" || previousBlockedHuman !== blockedHuman);
381
+ if (enteredHumanPark)
382
+ return { kind: "human-required", level: "ALERT" };
383
+ const destinationHuman = resolveRegisteredHumanAddress(input.destinationSession, registry.entities);
384
+ if (input.action === "create" && destinationHuman !== null) {
385
+ return { kind: "human-required", level: "ALERT" };
386
+ }
387
+ return null;
388
+ }
350
389
  /**
351
390
  * W1 (transactional closure) — the PUBLIC composable primitive (stage half).
352
391
  * Stage the durable WAKE INTENT for a successor qitem from INSIDE a terminal
@@ -677,18 +716,36 @@ export class QueueRepository {
677
716
  // subsystem's input (the Slack connector polls human-destined rows and its own
678
717
  // ledger is the delivery record). Falling through to tmux here recorded
679
718
  // "failed: … tmux reports no session" while the founder verifiably received the
680
- // message, and that failed: literal poisoned the undelivered surface. So: the
681
- // wake for this class is GATEWAY-OWNED tmux is never consulted, and the
682
- // recorded wording claims exactly what was (and was not) checked. Classified
683
- // indeterminate (landed with the owning subsystem; render unconfirmable here) —
684
- // never verified, never failed. Human-CLASS seats with real panes
685
- // (human-*@kernel) are NOT this class and keep tmux transport.
686
- if (parseSessionName(destinationSession).kind === "external") {
719
+ // message, and that failed: literal poisoned the undelivered surface.
720
+ // OPR.0.5.6.14 the inline @external branch became THE ONE RESOLVER SEAM
721
+ // (gateway/destination-resolver.ts): pane-bound keeps terminal transport;
722
+ // gateway-routable (@external AND registry-resolved aliases like the
723
+ // paneless human-*@kernel virtual identities the live 4-row specimen
724
+ // class) is GATEWAY-OWNED (tmux never consulted; the connector's row-poll
725
+ // is the dispatch and its ledger the delivery record); neither is an
726
+ // honest structured teaching refusal (tmux is not consulted for an
727
+ // address it can never hold). Classified indeterminate for gateway
728
+ // (landed with the owning subsystem; render unconfirmable here) — never
729
+ // verified, never failed.
730
+ const destClass = classifyDestination(destinationSession, {
731
+ entities: (() => {
732
+ const loaded = this.loadHumanRegistryFn();
733
+ return loaded.ok ? loaded.entities : null;
734
+ })(),
735
+ hasTerminalTransport: (dest) => this.hasTerminalTransport(dest),
736
+ });
737
+ if (destClass.class === "gateway-routable") {
738
+ const resolvedNote = destClass.via === "registry-alias" && destClass.resolvedHuman
739
+ ? ` — the human registry resolves it to registered human '${destClass.resolvedHuman}'`
740
+ : "";
687
741
  return {
688
742
  classified: "indeterminate",
689
- nudgeResult: `gateway-owned: '${destinationSession}' is a virtual @external destination — delivery rides the gateway subsystem (Slack connector), whose own ledger is the delivery record; tmux was not consulted (it can never hold this address class)`,
743
+ nudgeResult: `gateway-owned: '${destinationSession}' is a virtual ${destClass.via === "registry-alias" ? "paneless human" : "@external"} destination${resolvedNote} — delivery rides the gateway subsystem (Slack connector), whose own ledger is the delivery record; tmux was not consulted (it can never hold this address class)`,
690
744
  };
691
745
  }
746
+ if (destClass.class === "unroutable") {
747
+ return { classified: "failed", nudgeResult: destClass.teaching };
748
+ }
692
749
  const stampISO = new Date().toISOString();
693
750
  let text;
694
751
  if (prebuiltText !== undefined) {
@@ -873,12 +930,19 @@ export class QueueRepository {
873
930
  this.persistSummary(id, input.summary ?? null);
874
931
  this.persistEvidenceRef(id, input.evidenceRef ?? null);
875
932
  this.persistMintingGeneration(id, input.sourceSession);
933
+ const notification = this.classifyOwnerNotification({
934
+ action: "create",
935
+ destinationSession: input.destinationSession,
936
+ nextState: "pending",
937
+ });
876
938
  this.transitionLog.append({
877
939
  qitemId: id,
878
940
  state: "pending",
879
941
  actorSession: input.sourceSession,
880
942
  transitionNote: "created",
881
943
  identityProvenance: input.identityProvenance ?? null, // P21 §4 era-stamp
944
+ ownerNotificationKind: notification?.kind,
945
+ ownerNotificationLevel: notification?.level,
882
946
  });
883
947
  const persistedEvent = this.eventBus.persistWithinTransaction({
884
948
  type: "queue.created",
@@ -968,12 +1032,19 @@ export class QueueRepository {
968
1032
  this.persistSummary(newId, input.summary ?? null);
969
1033
  this.persistEvidenceRef(newId, input.evidenceRef ?? null);
970
1034
  this.persistMintingGeneration(newId, input.fromSession);
1035
+ const successorNotification = this.classifyOwnerNotification({
1036
+ action: "create",
1037
+ destinationSession: input.toSession,
1038
+ nextState: "pending",
1039
+ });
971
1040
  this.transitionLog.append({
972
1041
  qitemId: newId,
973
1042
  state: "pending",
974
1043
  actorSession: input.fromSession,
975
1044
  transitionNote: `handoff from ${source.qitemId}`,
976
1045
  identityProvenance: input.identityProvenance ?? null, // P21 §4 era-stamp
1046
+ ownerNotificationKind: successorNotification?.kind,
1047
+ ownerNotificationLevel: successorNotification?.level,
977
1048
  });
978
1049
  // W1-a: the durable wake intent joins the SAME transaction as the close +
979
1050
  // successor create. If this (or anything above) throws, the whole act rolls
@@ -988,6 +1059,17 @@ export class QueueRepository {
988
1059
  summary: source.summary ?? null,
989
1060
  });
990
1061
  events.push({ name: "queue.handed_off", payload: handoffEvent });
1062
+ // OPR.0.5.6.26 — a handed-off blocker actuates its attached rows through the one
1063
+ // propagation site, with the update path's exact effect set.
1064
+ for (const dependentEvent of this.propagateBlockerCompletion({
1065
+ qitemId: source.qitemId,
1066
+ terminalState: "handed-off",
1067
+ actorSession: input.fromSession,
1068
+ identityProvenance: input.identityProvenance ?? null,
1069
+ ts,
1070
+ })) {
1071
+ events.push({ name: "queue.updated", payload: dependentEvent });
1072
+ }
991
1073
  const createdEvent = this.eventBus.persistWithinTransaction({
992
1074
  type: "queue.created",
993
1075
  qitemId: newId,
@@ -1092,11 +1174,18 @@ export class QueueRepository {
1092
1174
  this.persistSummary(newId, input.summary ?? null);
1093
1175
  this.persistEvidenceRef(newId, input.evidenceRef ?? null);
1094
1176
  this.persistMintingGeneration(newId, input.fromSession);
1177
+ const successorNotification = this.classifyOwnerNotification({
1178
+ action: "create",
1179
+ destinationSession: input.toSession,
1180
+ nextState: "pending",
1181
+ });
1095
1182
  this.transitionLog.append({
1096
1183
  qitemId: newId,
1097
1184
  state: "pending",
1098
1185
  actorSession: input.fromSession,
1099
1186
  transitionNote: `handoff-and-complete from ${source.qitemId}`,
1187
+ ownerNotificationKind: successorNotification?.kind,
1188
+ ownerNotificationLevel: successorNotification?.level,
1100
1189
  });
1101
1190
  // W1-a: the durable wake intent joins the SAME transaction as the close +
1102
1191
  // successor create — one act or none (symmetric with handoff()).
@@ -1110,6 +1199,17 @@ export class QueueRepository {
1110
1199
  summary: source.summary ?? null,
1111
1200
  });
1112
1201
  events.push({ name: "queue.handed_off", payload: handoffEvent });
1202
+ // OPR.0.5.6.26 — a done-via-handoff-and-complete blocker actuates its attached rows through the one
1203
+ // propagation site, with the update path's exact effect set (the confirmed R-2 prediction).
1204
+ for (const dependentEvent of this.propagateBlockerCompletion({
1205
+ qitemId: source.qitemId,
1206
+ terminalState: "done",
1207
+ actorSession: input.fromSession,
1208
+ identityProvenance: input.identityProvenance ?? null,
1209
+ ts,
1210
+ })) {
1211
+ events.push({ name: "queue.updated", payload: dependentEvent });
1212
+ }
1113
1213
  const createdEvent = this.eventBus.persistWithinTransaction({
1114
1214
  type: "queue.created",
1115
1215
  qitemId: newId,
@@ -1155,9 +1255,9 @@ export class QueueRepository {
1155
1255
  * `cross_host_close_conflict` (someone else closed it meanwhile —
1156
1256
  * surface, never overwrite).
1157
1257
  * - otherwise → close exactly like the local handoff's close leg:
1158
- * `closure_reason=handed_off_to`; `closure_target` carries the OPAQUE
1159
- * three-part `<member@rig>@<host>` form (arch R1 — presence-checked
1160
- * display/audit metadata, NEVER parsed for routing); `handed_off_to`
1258
+ * `closure_reason=handed_off_to`; `closure_target` carries the
1259
+ * host-qualified successor key `<qitem-id>@<host>` (custody metadata,
1260
+ * never a local lookup key); `handed_off_to`
1161
1261
  * stays the two-part `member@rig` (BR-1 — session-string carriers
1162
1262
  * never gain `@host`).
1163
1263
  */
@@ -1193,7 +1293,7 @@ export class QueueRepository {
1193
1293
  state: input.terminalState,
1194
1294
  actorSession: input.fromSession,
1195
1295
  // BR-1: the minted note carries the TWO-PART toSession only — the
1196
- // host-qualified 3-part form is allowed in closure_target and nowhere
1296
+ // host-qualified successor key is allowed in closure_target and nowhere
1197
1297
  // else, and transition_note is a durable carrier.
1198
1298
  transitionNote: input.transitionNote ?? `cross-host handoff to ${input.toSession}`,
1199
1299
  closureReason: "handed_off_to",
@@ -1209,6 +1309,19 @@ export class QueueRepository {
1209
1309
  summary: source.summary ?? null,
1210
1310
  });
1211
1311
  events.push(handoffEvent);
1312
+ // OPR.0.5.6.26 (R2 B-1) — the cross-host terminal close is the third
1313
+ // handoff-family caller of the one propagation site: attached rows actuate
1314
+ // with the update path's exact effect set, at this close's actual terminal
1315
+ // state. Absorbed redrives return above this transaction and never re-run it.
1316
+ for (const dependentEvent of this.propagateBlockerCompletion({
1317
+ qitemId: input.qitemId,
1318
+ terminalState: input.terminalState,
1319
+ actorSession: input.fromSession,
1320
+ identityProvenance: null,
1321
+ ts,
1322
+ })) {
1323
+ events.push(dependentEvent);
1324
+ }
1212
1325
  });
1213
1326
  txn();
1214
1327
  for (const e of events) {
@@ -1615,6 +1728,12 @@ export class QueueRepository {
1615
1728
  intervalSeconds: input.wakeAfterSeconds,
1616
1729
  registeredBySession: input.actorSession,
1617
1730
  });
1731
+ // S16 only: ordinary periodic reminders intentionally evaluate immediately.
1732
+ // A provider-limit timer instead starts its interval at registration so the
1733
+ // existing scheduler's due boundary is registeredAt + intervalSeconds.
1734
+ if (qitem.tags?.includes(USAGE_LIMIT_BLOCKER_TAG)) {
1735
+ jobsRepo.recordEvaluation(job.jobId, job.registeredAt, false);
1736
+ }
1618
1737
  parkWake = { kind: "timer", ref: job.jobId };
1619
1738
  }
1620
1739
  else if (input.state === "blocked" && effectiveBlockedOn?.startsWith("qitem-")) {
@@ -1628,6 +1747,15 @@ export class QueueRepository {
1628
1747
  // NULL. The prior `COALESCE(?, blocked_on)` preserved the blocker on every non-blocked
1629
1748
  // transition, leaving dead blockers that nothing audits (the root-cause strand).
1630
1749
  const nextBlockedOn = input.state === "blocked" ? effectiveBlockedOn : null;
1750
+ const notification = this.classifyOwnerNotification({
1751
+ action: "update",
1752
+ destinationSession: qitem.destinationSession,
1753
+ previousState: qitem.state,
1754
+ previousBlockedOn: qitem.blockedOn,
1755
+ nextState: input.state,
1756
+ nextBlockedOn,
1757
+ explicitKind: input.ownerNotificationKind,
1758
+ });
1631
1759
  this.db
1632
1760
  .prepare(`UPDATE queue_items
1633
1761
  SET state = ?,
@@ -1653,6 +1781,8 @@ export class QueueRepository {
1653
1781
  closureReason: validation.closureReason ?? undefined,
1654
1782
  closureTarget: validation.closureTarget ?? undefined,
1655
1783
  identityProvenance: input.identityProvenance ?? null, // P21 §4 era-stamp
1784
+ ownerNotificationKind: notification?.kind,
1785
+ ownerNotificationLevel: notification?.level,
1656
1786
  });
1657
1787
  if (parkWake) {
1658
1788
  this.wakeRepo.record({
@@ -1669,45 +1799,15 @@ export class QueueRepository {
1669
1799
  // When THIS qitem reaches a terminal state, auto-unpark every row parked on it (blocked_on = this,
1670
1800
  // state='blocked') to pending, clear its (now-resolved) blocker, log the transition, and emit an
1671
1801
  // event so watchers/sweeps see the unblock without a fetch.
1672
- const dependentEvents = [];
1673
- if (!isBlockerLive(input.state)) {
1674
- const blockedRows = this.db
1675
- .prepare("SELECT qitem_id, destination_session FROM queue_items WHERE blocked_on = ? AND state = 'blocked'")
1676
- .all(input.qitemId);
1677
- for (const r of blockedRows) {
1678
- this.db
1679
- .prepare("UPDATE queue_items SET state = 'pending', blocked_on = NULL, ts_updated = ? WHERE qitem_id = ?")
1680
- .run(ts, r.qitem_id);
1681
- const resumeTransition = this.transitionLog.append({
1682
- qitemId: r.qitem_id,
1683
- state: "pending",
1684
- actorSession: input.actorSession,
1685
- transitionNote: `auto-unparked: blocker ${input.qitemId} reached terminal state '${input.state}'`,
1686
- });
1687
- const wakeIntentId = this.stageAutoUnparkWakeIntent({
1688
- qitemId: r.qitem_id,
1689
- destinationSession: r.destination_session,
1690
- fromSession: input.actorSession,
1691
- identityProvenance: input.identityProvenance ?? null,
1692
- blockerQitemId: input.qitemId,
1693
- resumeTransitionId: resumeTransition.transitionId,
1694
- });
1695
- if (wakeIntentId)
1696
- this.deliverWakeIntentAfterCommit(wakeIntentId);
1697
- const dependentEvent = this.eventBus.persistWithinTransaction({
1698
- type: "queue.updated",
1699
- qitemId: r.qitem_id,
1700
- fromState: "blocked",
1701
- toState: "pending",
1702
- closureReason: null,
1703
- closureTarget: null,
1704
- actorSession: input.actorSession,
1705
- summary: this.getById(r.qitem_id)?.summary ?? null,
1706
- });
1707
- this.eventBus.registerPersistedWithinActiveEnvelope(dependentEvent);
1708
- dependentEvents.push(dependentEvent);
1709
- }
1710
- }
1802
+ const dependentEvents = !isBlockerLive(input.state)
1803
+ ? this.propagateBlockerCompletion({
1804
+ qitemId: input.qitemId,
1805
+ terminalState: input.state,
1806
+ actorSession: input.actorSession,
1807
+ identityProvenance: input.identityProvenance ?? null,
1808
+ ts,
1809
+ })
1810
+ : [];
1711
1811
  const persistedEvent = this.eventBus.persistWithinTransaction({
1712
1812
  type: "queue.updated",
1713
1813
  qitemId: input.qitemId,
@@ -1722,6 +1822,52 @@ export class QueueRepository {
1722
1822
  });
1723
1823
  return { persistedEvent, persistedEvents: [...dependentEvents, persistedEvent] };
1724
1824
  }
1825
+ /** OPR.0.5.6.26 — THE ONE PROPAGATION SITE. blocked_on promises "A waits until B
1826
+ * completes"; every terminal closure of a blocker actuates the attached rows'
1827
+ * auto-unpark through THIS helper — the update path and the handoff family both
1828
+ * call it inside their own transactions. The class this unifies away was
1829
+ * per-code-path: the handoff verbs wrote terminal states via direct SQL and the
1830
+ * promise never fired for them. Never a second copy of this logic. */
1831
+ propagateBlockerCompletion(input) {
1832
+ const dependentEvents = [];
1833
+ const blockedRows = this.db
1834
+ .prepare("SELECT qitem_id, destination_session FROM queue_items WHERE blocked_on = ? AND state = 'blocked'")
1835
+ .all(input.qitemId);
1836
+ for (const r of blockedRows) {
1837
+ this.db
1838
+ .prepare("UPDATE queue_items SET state = 'pending', blocked_on = NULL, ts_updated = ? WHERE qitem_id = ?")
1839
+ .run(input.ts, r.qitem_id);
1840
+ const resumeTransition = this.transitionLog.append({
1841
+ qitemId: r.qitem_id,
1842
+ state: "pending",
1843
+ actorSession: input.actorSession,
1844
+ transitionNote: `auto-unparked: blocker ${input.qitemId} reached terminal state '${input.terminalState}'`,
1845
+ });
1846
+ const wakeIntentId = this.stageAutoUnparkWakeIntent({
1847
+ qitemId: r.qitem_id,
1848
+ destinationSession: r.destination_session,
1849
+ fromSession: input.actorSession,
1850
+ identityProvenance: input.identityProvenance,
1851
+ blockerQitemId: input.qitemId,
1852
+ resumeTransitionId: resumeTransition.transitionId,
1853
+ });
1854
+ if (wakeIntentId)
1855
+ this.deliverWakeIntentAfterCommit(wakeIntentId);
1856
+ const dependentEvent = this.eventBus.persistWithinTransaction({
1857
+ type: "queue.updated",
1858
+ qitemId: r.qitem_id,
1859
+ fromState: "blocked",
1860
+ toState: "pending",
1861
+ closureReason: null,
1862
+ closureTarget: null,
1863
+ actorSession: input.actorSession,
1864
+ summary: this.getById(r.qitem_id)?.summary ?? null,
1865
+ });
1866
+ this.eventBus.registerPersistedWithinActiveEnvelope(dependentEvent);
1867
+ dependentEvents.push(dependentEvent);
1868
+ }
1869
+ return dependentEvents;
1870
+ }
1725
1871
  getParkWakeStatus(qitemId) {
1726
1872
  return this.wakeRepo.getStatus(qitemId);
1727
1873
  }
@@ -1738,7 +1884,7 @@ export class QueueRepository {
1738
1884
  const targets = this.wakeRepo.findBlockedQitemsByWatchdog(jobId);
1739
1885
  if (targets.length === 0)
1740
1886
  return;
1741
- const events = this.db.transaction(() => targets.map(({ qitemId, kind }) => {
1887
+ const recordFired = ({ qitemId, kind }) => {
1742
1888
  const transition = this.transitionLog.append({
1743
1889
  qitemId,
1744
1890
  state: "blocked",
@@ -1763,7 +1909,22 @@ export class QueueRepository {
1763
1909
  actorSession: "watchdog@system",
1764
1910
  summary: this.getById(qitemId)?.summary ?? null,
1765
1911
  });
1766
- }))();
1912
+ };
1913
+ const usageLimitBlockers = targets.filter(({ qitemId }) => this.getById(qitemId)?.tags?.includes(USAGE_LIMIT_BLOCKER_TAG));
1914
+ const events = this.db.transaction(() => {
1915
+ const firedEvents = targets.map(recordFired);
1916
+ if (usageLimitBlockers.length === 0)
1917
+ return firedEvents;
1918
+ (this.watchdogJobsRepo ?? new WatchdogJobsRepository(this.db)).markTerminal(jobId, "usage_limit_expiry_fired");
1919
+ const resolutionEvents = usageLimitBlockers.flatMap(({ qitemId }) => this.updateInTransactionalContext({
1920
+ qitemId,
1921
+ actorSession: "watchdog@system",
1922
+ state: "done",
1923
+ closureReason: "no-follow-on",
1924
+ transitionNote: `provider-limit timer ${jobId} reached its expiry; resolving the shared blocker once`,
1925
+ }).persistedEvents);
1926
+ return [...firedEvents, ...resolutionEvents];
1927
+ })();
1767
1928
  for (const event of events)
1768
1929
  this.eventBus.notifySubscribers(event);
1769
1930
  }
@@ -1771,7 +1932,13 @@ export class QueueRepository {
1771
1932
  const row = this.db
1772
1933
  .prepare("SELECT * FROM queue_items WHERE qitem_id = ?")
1773
1934
  .get(qitemId);
1774
- return row ? this.rowToItem(row) : null;
1935
+ if (!row)
1936
+ return null;
1937
+ const item = this.rowToItem(row);
1938
+ // OPR.0.5.6.14 — the row FACE answers "did it reach them" in one read for
1939
+ // gateway-routed rows; null for pane-bound (absence-governed, no key lies).
1940
+ const ledger = this.deliveryOutcomeFor(item.qitemId);
1941
+ return { ...item, deliveryOutcome: ledger?.outcome ?? null };
1775
1942
  }
1776
1943
  list(opts) {
1777
1944
  const limit = opts?.limit ?? 100;
@@ -1817,7 +1984,11 @@ export class QueueRepository {
1817
1984
  const rows = this.db
1818
1985
  .prepare(`SELECT ${columns} FROM queue_items ${where} ORDER BY ${orderBy} LIMIT ?`)
1819
1986
  .all(...params);
1820
- const items = rows.map((r) => this.rowToItem(r));
1987
+ const items = rows.map((r) => {
1988
+ const item = this.rowToItem(r);
1989
+ const ledger = this.deliveryOutcomeFor(item.qitemId);
1990
+ return { ...item, deliveryOutcome: ledger?.outcome ?? null };
1991
+ });
1821
1992
  return opts?.compact
1822
1993
  ? items.map((item) => ({
1823
1994
  ...item,
@@ -1935,22 +2106,34 @@ export class QueueRepository {
1935
2106
  return rows.map((r) => this.rowToItem(r));
1936
2107
  }
1937
2108
  /**
1938
- * 0.5.1-54 DR-1 surface the create-path failed-nudge strands. `last_nudge_result` is written by
1939
- * `recordNudgeAttempt` (from `maybeNudge`) but nothing ever queries it, so a create whose nudge FAILED
1940
- * (`failed:<msg>`) is invisible: the sender records a successful create while the destination was never
1941
- * woken. This is the `/overdue` analogue for pending-undelivered create-path work — a READ only (no
1942
- * retry, no unwind; DR-2 retry is PM-gated on DR-1's live measurement).
1943
- *
1944
- * V1-ONLY predicate, NO false-positive mode: `state='pending' AND last_nudge_result LIKE 'failed:%'`.
1945
- * - A delivered row (`verified` / `delivered-ack-pending`) is excluded — it was woken.
1946
- * - A NEVER-ATTEMPTED row (`last_nudge_result IS NULL` — a deliberate cold-park or a no-transport create)
1947
- * is excluded. That class is FP-dominated (a legitimate cold-park is indistinguishable from a real
1948
- * never-reached strand at the row) and stays DEFERRED behind a forward create-time intent bit; surfacing
1949
- * it here would train the reader to ignore the signal. The reason it is excluded lives in this comment
1950
- * AND the PRD, not in chat — it must outlive the excluder.
2109
+ * Surface two evidence-backed undelivered classes: the original pending
2110
+ * create-path nudge failures, and active human-notification episodes whose
2111
+ * gateway ledger says transport-failed or receiptless past the post window.
2112
+ * A generic null nudge is still excluded; only a structured OWNER episode
2113
+ * makes that absence meaningful. READ only no retry or unwind.
1951
2114
  */
1952
2115
  findUndelivered(opts) {
1953
- const conditions = ["state = 'pending'", "last_nudge_result LIKE 'failed:%'"];
2116
+ // OPR.0.5.6.14 delivery truth belongs to the CURRENT human-notification
2117
+ // episode, not to the row's whole history. Pull every active row that can
2118
+ // carry a current episode or a legacy nudge/receipt, then derive/filter in
2119
+ // JS. LIMIT is applied after that filtering so historical POSTED episodes
2120
+ // cannot consume the window and hide a later failure.
2121
+ const ownerEpisodeCandidate = this.hasOwnerNotificationColumns
2122
+ ? `EXISTS (SELECT 1 FROM queue_transitions owner_episode
2123
+ WHERE owner_episode.qitem_id = queue_items.qitem_id
2124
+ AND owner_episode.owner_notification_level IS NOT NULL)`
2125
+ : "0";
2126
+ const conditions = [
2127
+ "state IN ('pending', 'in-progress', 'blocked')",
2128
+ `((state = 'pending' AND (last_nudge_result LIKE 'failed:%'
2129
+ OR last_nudge_result LIKE 'unroutable:%'
2130
+ OR last_nudge_result LIKE 'gateway-owned%'))
2131
+ OR ${ownerEpisodeCandidate}
2132
+ OR EXISTS (SELECT 1 FROM queue_transitions receipt
2133
+ WHERE receipt.qitem_id = queue_items.qitem_id
2134
+ AND (receipt.transition_note LIKE 'slack-owner-notification-posted %'
2135
+ OR receipt.transition_note LIKE 'slack-owner-notification-transport-failed %')))`,
2136
+ ];
1954
2137
  const params = [];
1955
2138
  if (opts?.rig) {
1956
2139
  const escaped = opts.rig.replace(/%/g, "\\%").replace(/_/g, "\\_");
@@ -1958,14 +2141,141 @@ export class QueueRepository {
1958
2141
  params.push(`%@${escaped}`, `%@${escaped}`);
1959
2142
  }
1960
2143
  const columns = opts?.compact ? COMPACT_QUEUE_COLUMNS : "*";
1961
- let sql = `SELECT ${columns} FROM queue_items WHERE ${conditions.join(" AND ")} ORDER BY ts_created ASC`;
1962
- if (opts?.limit !== undefined) {
1963
- sql += " LIMIT ?";
1964
- params.push(opts.limit);
1965
- }
2144
+ const sql = `SELECT ${columns} FROM queue_items WHERE ${conditions.join(" AND ")} ORDER BY ts_created ASC`;
1966
2145
  const rows = this.db.prepare(sql).all(...params);
1967
- return rows.map((r) => this.rowToItem(r));
2146
+ const out = [];
2147
+ for (const r of rows) {
2148
+ const item = this.rowToItem(r);
2149
+ const ledger = this.deliveryOutcomeFor(item.qitemId);
2150
+ if (ledger?.outcome === "posted")
2151
+ continue; // the receipt wins, always
2152
+ if (ledger?.outcome === "transport-failed") {
2153
+ out.push({
2154
+ ...item,
2155
+ deliveryOutcome: "transport-failed",
2156
+ deliveryFailureClass: "transport-failed",
2157
+ deliveryFailureDetail: ledger.detail,
2158
+ });
2159
+ }
2160
+ else if (ledger?.outcome === "never-posted") {
2161
+ out.push({
2162
+ ...item,
2163
+ deliveryOutcome: "never-posted",
2164
+ deliveryFailureClass: "never-posted",
2165
+ deliveryFailureDetail: ledger.detail,
2166
+ });
2167
+ }
2168
+ else {
2169
+ // No ledger verdict: only the legacy pending failed/unroutable class is
2170
+ // undelivered. An active non-human row can still have an old OWNER
2171
+ // transition; that historical episode is not a current obligation.
2172
+ const lastNudge = item.lastNudgeResult ?? "";
2173
+ if (item.state === "pending" && (lastNudge.startsWith("failed:") || lastNudge.startsWith("unroutable:"))) {
2174
+ out.push(item);
2175
+ }
2176
+ }
2177
+ if (opts?.limit !== undefined && out.length >= opts.limit)
2178
+ break;
2179
+ }
2180
+ return out;
2181
+ }
2182
+ /** OPR.0.5.6.14 — terminal transport is a CAPABILITY, not topology presence.
2183
+ * An exact session or composed canonical seat is pane-bound only when its
2184
+ * node carries an explicit tmux binding. external_cli is paneless and must
2185
+ * continue to the human-registry/gateway leg. FAIL-OPEN only where the DB
2186
+ * cannot carry classification evidence (empty/partial bootstrap schemas). */
2187
+ hasTerminalTransport(dest) {
2188
+ try {
2189
+ const anyTopology = this.db.prepare("SELECT 1 FROM sessions LIMIT 1").get()
2190
+ ?? this.db.prepare("SELECT 1 FROM nodes LIMIT 1").get();
2191
+ if (!anyTopology)
2192
+ return true;
2193
+ if (this.db.prepare(`SELECT 1 FROM sessions s JOIN bindings b ON b.node_id = s.node_id
2194
+ WHERE s.session_name = ?
2195
+ AND COALESCE(b.attachment_type, 'tmux') = 'tmux'
2196
+ AND b.tmux_session IS NOT NULL LIMIT 1`).get(dest))
2197
+ return true;
2198
+ const at = dest.lastIndexOf("@");
2199
+ if (at <= 0)
2200
+ return true; // non-canonical shapes stay on the legacy path
2201
+ const seat = dest.slice(0, at);
2202
+ const rig = dest.slice(at + 1);
2203
+ const composed = this.db.prepare(`SELECT 1 FROM nodes n
2204
+ JOIN rigs r ON r.id = n.rig_id
2205
+ JOIN bindings b ON b.node_id = n.id
2206
+ WHERE r.name = ? AND REPLACE(n.logical_id, '.', '-') = ?
2207
+ AND COALESCE(b.attachment_type, 'tmux') = 'tmux'
2208
+ AND b.tmux_session IS NOT NULL LIMIT 1`).get(rig, seat);
2209
+ return !!composed;
2210
+ }
2211
+ catch {
2212
+ return true; // schema-partial fixture DB: never discriminate without evidence
2213
+ }
2214
+ }
2215
+ /** Null means legacy/no OWNER history; inactive means OWNER history exists
2216
+ * but the row no longer projects a current human-notification episode. */
2217
+ currentDeliveryEpisode(item) {
2218
+ const transition = this.transitionLog.latestOwnerNotificationForQitem(item.qitemId);
2219
+ if (!transition)
2220
+ return null;
2221
+ const registry = this.loadHumanRegistryFn();
2222
+ if (!registry.ok)
2223
+ return "inactive";
2224
+ const humanAddress = transition.ownerNotificationKind === "human-decision-resolved"
2225
+ ? resolveRegisteredHumanAddress(transition.actorSession, registry.entities)
2226
+ : item.state === "blocked"
2227
+ ? resolveRegisteredHumanAddress(item.blockedOn, registry.entities)
2228
+ : resolveRegisteredHumanAddress(item.destinationSession, registry.entities);
2229
+ return humanAddress
2230
+ ? { notificationKey: `${item.qitemId}:${transition.transitionId}`, startedAt: transition.ts }
2231
+ : "inactive";
2232
+ }
2233
+ /** OPR.0.5.6.14 — derive the current episode's delivery ledger. Receipt
2234
+ * transitions are same-row but keyed by qitemId:OWNER-transitionId; an old
2235
+ * posted receipt cannot mask a later human park. Legacy pre-OWNER or literal
2236
+ * external rows retain their row-scoped fallback. */
2237
+ deliveryOutcomeFor(qitemId) {
2238
+ // Some repository-only fixtures intentionally model the pre-transition
2239
+ // schema. Delivery projection is additive there: absence means no verdict,
2240
+ // never a list failure.
2241
+ if (!this.hasQueueTransitionsTable)
2242
+ return null;
2243
+ const row = this.db.prepare("SELECT * FROM queue_items WHERE qitem_id = ?")
2244
+ .get(qitemId);
2245
+ if (!row)
2246
+ return null;
2247
+ const item = this.rowToItem(row);
2248
+ const episodeState = this.currentDeliveryEpisode(item);
2249
+ if (episodeState === "inactive")
2250
+ return null;
2251
+ const episode = episodeState;
2252
+ const notes = this.db.prepare(`SELECT transition_note FROM queue_transitions
2253
+ WHERE qitem_id = ? AND (transition_note LIKE 'slack-owner-notification-posted %'
2254
+ OR transition_note LIKE 'slack-owner-notification-transport-failed %')
2255
+ ORDER BY transition_id DESC`).all(qitemId);
2256
+ const currentNotes = episode
2257
+ ? notes.filter((note) => note.transition_note.split(/\s+/).includes(`notification_key=${episode.notificationKey}`))
2258
+ : notes;
2259
+ const posted = currentNotes.find((note) => note.transition_note.startsWith("slack-owner-notification-posted "));
2260
+ if (posted)
2261
+ return { outcome: "posted", detail: posted.transition_note };
2262
+ const failed = currentNotes.find((note) => note.transition_note.startsWith("slack-owner-notification-transport-failed "));
2263
+ if (failed)
2264
+ return { outcome: "transport-failed", detail: failed.transition_note };
2265
+ const startedAt = episode?.startedAt ?? item.tsCreated;
2266
+ const gatewayRouted = episode !== null || item.lastNudgeResult?.startsWith("gateway-owned") === true;
2267
+ if (gatewayRouted) {
2268
+ const ageMs = Date.now() - new Date(startedAt.includes("T") ? startedAt : startedAt + "Z").getTime();
2269
+ if (ageMs > QueueRepository.NEVER_POSTED_WINDOW_MS) {
2270
+ const key = episode ? ` for notification_key=${episode.notificationKey}` : "";
2271
+ return { outcome: "never-posted", detail: `gateway-routed row with no delivery receipt${key} past the post window` };
2272
+ }
2273
+ }
2274
+ return null;
1968
2275
  }
2276
+ /** The grace window before a receiptless gateway-routed row honestly reads
2277
+ * never-posted (the connector sweep cadence bounds normal posting latency). */
2278
+ static NEVER_POSTED_WINDOW_MS = 120_000;
1969
2279
  recordNudgeAttempt(qitemId, result) {
1970
2280
  const ts = new Date().toISOString();
1971
2281
  this.db
@@ -1974,12 +2284,6 @@ export class QueueRepository {
1974
2284
  WHERE qitem_id = ?`)
1975
2285
  .run(ts, result, qitemId);
1976
2286
  }
1977
- recordHeartbeat(qitemId) {
1978
- const ts = new Date().toISOString();
1979
- this.db
1980
- .prepare(`UPDATE queue_items SET last_heartbeat = ? WHERE qitem_id = ?`)
1981
- .run(ts, qitemId);
1982
- }
1983
2287
  /**
1984
2288
  * Pod-fallback: redirect qitem to a fallback destination (e.g., when a seat
1985
2289
  * is unreachable). Emits qitem.fallback_routed; preserves chain_of_record.