@rubytech/create-maxy-code 0.1.566 → 0.1.568

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 (176) hide show
  1. package/dist/__tests__/brand-agent-root.test.js +91 -0
  2. package/dist/brand-agent-root.js +58 -0
  3. package/dist/index.js +25 -28
  4. package/package.json +1 -1
  5. package/payload/platform/neo4j/schema.cypher +9 -0
  6. package/payload/platform/package-lock.json +66 -1
  7. package/payload/platform/plugins/.claude-plugin/marketplace.json +5 -0
  8. package/payload/platform/plugins/admin/hooks/lib/maxy-mcp-plugins.txt +1 -0
  9. package/payload/platform/plugins/admin/mcp/dist/index.js +7 -1
  10. package/payload/platform/plugins/admin/mcp/dist/index.js.map +1 -1
  11. package/payload/platform/plugins/admin/mcp/dist/lib/roster-census.d.ts +10 -1
  12. package/payload/platform/plugins/admin/mcp/dist/lib/roster-census.d.ts.map +1 -1
  13. package/payload/platform/plugins/admin/mcp/dist/lib/roster-census.js +6 -1
  14. package/payload/platform/plugins/admin/mcp/dist/lib/roster-census.js.map +1 -1
  15. package/payload/platform/plugins/admin/mcp/dist/tools/capabilities-here.d.ts +9 -0
  16. package/payload/platform/plugins/admin/mcp/dist/tools/capabilities-here.d.ts.map +1 -1
  17. package/payload/platform/plugins/admin/mcp/dist/tools/capabilities-here.js +1 -1
  18. package/payload/platform/plugins/admin/mcp/dist/tools/capabilities-here.js.map +1 -1
  19. package/payload/platform/plugins/admin/skills/capabilities-here/SKILL.md +1 -1
  20. package/payload/platform/plugins/admin/skills/platform-architecture/SKILL.md +91 -1
  21. package/payload/platform/plugins/admin/skills/public-agent-manager/SKILL.md +5 -1
  22. package/payload/platform/plugins/admin/skills/whats-new/SKILL.md +13 -0
  23. package/payload/platform/plugins/docs/references/channel-wake-and-prompt.md +90 -0
  24. package/payload/platform/plugins/inventory/.claude-plugin/plugin.json +21 -0
  25. package/payload/platform/plugins/inventory/PLUGIN.md +75 -0
  26. package/payload/platform/plugins/inventory/lib/mcp-spawn-tee/index.js +204 -0
  27. package/payload/platform/plugins/inventory/lib/mcp-spawn-tee/package.json +3 -0
  28. package/payload/platform/plugins/inventory/mcp/dist/index.d.ts +2 -0
  29. package/payload/platform/plugins/inventory/mcp/dist/index.d.ts.map +1 -0
  30. package/payload/platform/plugins/inventory/mcp/dist/index.js +241 -0
  31. package/payload/platform/plugins/inventory/mcp/dist/index.js.map +1 -0
  32. package/payload/platform/plugins/inventory/mcp/dist/lib/forecast.d.ts +20 -0
  33. package/payload/platform/plugins/inventory/mcp/dist/lib/forecast.d.ts.map +1 -0
  34. package/payload/platform/plugins/inventory/mcp/dist/lib/forecast.js +29 -0
  35. package/payload/platform/plugins/inventory/mcp/dist/lib/forecast.js.map +1 -0
  36. package/payload/platform/plugins/inventory/mcp/dist/lib/neo4j.d.ts +5 -0
  37. package/payload/platform/plugins/inventory/mcp/dist/lib/neo4j.d.ts.map +1 -0
  38. package/payload/platform/plugins/inventory/mcp/dist/lib/neo4j.js +40 -0
  39. package/payload/platform/plugins/inventory/mcp/dist/lib/neo4j.js.map +1 -0
  40. package/payload/platform/plugins/inventory/mcp/dist/lib/read.d.ts +28 -0
  41. package/payload/platform/plugins/inventory/mcp/dist/lib/read.d.ts.map +1 -0
  42. package/payload/platform/plugins/inventory/mcp/dist/lib/read.js +91 -0
  43. package/payload/platform/plugins/inventory/mcp/dist/lib/read.js.map +1 -0
  44. package/payload/platform/plugins/inventory/mcp/dist/lib/replenish.d.ts +56 -0
  45. package/payload/platform/plugins/inventory/mcp/dist/lib/replenish.d.ts.map +1 -0
  46. package/payload/platform/plugins/inventory/mcp/dist/lib/replenish.js +107 -0
  47. package/payload/platform/plugins/inventory/mcp/dist/lib/replenish.js.map +1 -0
  48. package/payload/platform/plugins/inventory/mcp/dist/lib/types.d.ts +98 -0
  49. package/payload/platform/plugins/inventory/mcp/dist/lib/types.d.ts.map +1 -0
  50. package/payload/platform/plugins/inventory/mcp/dist/lib/types.js +7 -0
  51. package/payload/platform/plugins/inventory/mcp/dist/lib/types.js.map +1 -0
  52. package/payload/platform/plugins/inventory/mcp/dist/lib/write-rejects.d.ts +12 -0
  53. package/payload/platform/plugins/inventory/mcp/dist/lib/write-rejects.d.ts.map +1 -0
  54. package/payload/platform/plugins/inventory/mcp/dist/lib/write-rejects.js +49 -0
  55. package/payload/platform/plugins/inventory/mcp/dist/lib/write-rejects.js.map +1 -0
  56. package/payload/platform/plugins/inventory/mcp/dist/tools/demand-record.d.ts +20 -0
  57. package/payload/platform/plugins/inventory/mcp/dist/tools/demand-record.d.ts.map +1 -0
  58. package/payload/platform/plugins/inventory/mcp/dist/tools/demand-record.js +53 -0
  59. package/payload/platform/plugins/inventory/mcp/dist/tools/demand-record.js.map +1 -0
  60. package/payload/platform/plugins/inventory/mcp/dist/tools/forecast.d.ts +23 -0
  61. package/payload/platform/plugins/inventory/mcp/dist/tools/forecast.d.ts.map +1 -0
  62. package/payload/platform/plugins/inventory/mcp/dist/tools/forecast.js +18 -0
  63. package/payload/platform/plugins/inventory/mcp/dist/tools/forecast.js.map +1 -0
  64. package/payload/platform/plugins/inventory/mcp/dist/tools/policy-set.d.ts +25 -0
  65. package/payload/platform/plugins/inventory/mcp/dist/tools/policy-set.d.ts.map +1 -0
  66. package/payload/platform/plugins/inventory/mcp/dist/tools/policy-set.js +37 -0
  67. package/payload/platform/plugins/inventory/mcp/dist/tools/policy-set.js.map +1 -0
  68. package/payload/platform/plugins/inventory/mcp/dist/tools/purchase-order-record.d.ts +25 -0
  69. package/payload/platform/plugins/inventory/mcp/dist/tools/purchase-order-record.d.ts.map +1 -0
  70. package/payload/platform/plugins/inventory/mcp/dist/tools/purchase-order-record.js +43 -0
  71. package/payload/platform/plugins/inventory/mcp/dist/tools/purchase-order-record.js.map +1 -0
  72. package/payload/platform/plugins/inventory/mcp/dist/tools/replenish-plan.d.ts +29 -0
  73. package/payload/platform/plugins/inventory/mcp/dist/tools/replenish-plan.d.ts.map +1 -0
  74. package/payload/platform/plugins/inventory/mcp/dist/tools/replenish-plan.js +95 -0
  75. package/payload/platform/plugins/inventory/mcp/dist/tools/replenish-plan.js.map +1 -0
  76. package/payload/platform/plugins/inventory/mcp/dist/tools/stock-record.d.ts +21 -0
  77. package/payload/platform/plugins/inventory/mcp/dist/tools/stock-record.d.ts.map +1 -0
  78. package/payload/platform/plugins/inventory/mcp/dist/tools/stock-record.js +46 -0
  79. package/payload/platform/plugins/inventory/mcp/dist/tools/stock-record.js.map +1 -0
  80. package/payload/platform/plugins/inventory/mcp/dist/tools/supplier-terms-set.d.ts +24 -0
  81. package/payload/platform/plugins/inventory/mcp/dist/tools/supplier-terms-set.d.ts.map +1 -0
  82. package/payload/platform/plugins/inventory/mcp/dist/tools/supplier-terms-set.js +29 -0
  83. package/payload/platform/plugins/inventory/mcp/dist/tools/supplier-terms-set.js.map +1 -0
  84. package/payload/platform/plugins/inventory/mcp/package.json +21 -0
  85. package/payload/platform/plugins/memory/references/schema-retail.md +20 -0
  86. package/payload/platform/scripts/lib/provision-account-dir.sh +0 -2
  87. package/payload/platform/services/claude-session-manager/dist/account-agent-registry.d.ts +19 -0
  88. package/payload/platform/services/claude-session-manager/dist/account-agent-registry.d.ts.map +1 -0
  89. package/payload/platform/services/claude-session-manager/dist/account-agent-registry.js +146 -0
  90. package/payload/platform/services/claude-session-manager/dist/account-agent-registry.js.map +1 -0
  91. package/payload/platform/services/claude-session-manager/dist/canonical-tool-names.generated.d.ts.map +1 -1
  92. package/payload/platform/services/claude-session-manager/dist/canonical-tool-names.generated.js +8 -0
  93. package/payload/platform/services/claude-session-manager/dist/canonical-tool-names.generated.js.map +1 -1
  94. package/payload/platform/services/claude-session-manager/dist/fs-watcher.d.ts +5 -0
  95. package/payload/platform/services/claude-session-manager/dist/fs-watcher.d.ts.map +1 -1
  96. package/payload/platform/services/claude-session-manager/dist/fs-watcher.js +5 -5
  97. package/payload/platform/services/claude-session-manager/dist/fs-watcher.js.map +1 -1
  98. package/payload/platform/services/claude-session-manager/dist/http-server.d.ts +11 -1
  99. package/payload/platform/services/claude-session-manager/dist/http-server.d.ts.map +1 -1
  100. package/payload/platform/services/claude-session-manager/dist/http-server.js +124 -17
  101. package/payload/platform/services/claude-session-manager/dist/http-server.js.map +1 -1
  102. package/payload/platform/services/claude-session-manager/dist/index.js +25 -13
  103. package/payload/platform/services/claude-session-manager/dist/index.js.map +1 -1
  104. package/payload/platform/services/claude-session-manager/dist/pty-census.d.ts +6 -1
  105. package/payload/platform/services/claude-session-manager/dist/pty-census.d.ts.map +1 -1
  106. package/payload/platform/services/claude-session-manager/dist/pty-census.js +6 -3
  107. package/payload/platform/services/claude-session-manager/dist/pty-census.js.map +1 -1
  108. package/payload/platform/services/claude-session-manager/dist/pty-spawner.d.ts +21 -8
  109. package/payload/platform/services/claude-session-manager/dist/pty-spawner.d.ts.map +1 -1
  110. package/payload/platform/services/claude-session-manager/dist/pty-spawner.js +38 -15
  111. package/payload/platform/services/claude-session-manager/dist/pty-spawner.js.map +1 -1
  112. package/payload/platform/services/claude-session-manager/dist/public-spawn-model.d.ts +28 -0
  113. package/payload/platform/services/claude-session-manager/dist/public-spawn-model.d.ts.map +1 -0
  114. package/payload/platform/services/claude-session-manager/dist/public-spawn-model.js +58 -0
  115. package/payload/platform/services/claude-session-manager/dist/public-spawn-model.js.map +1 -0
  116. package/payload/platform/services/claude-session-manager/dist/rc-daemon.d.ts +2 -0
  117. package/payload/platform/services/claude-session-manager/dist/rc-daemon.d.ts.map +1 -1
  118. package/payload/platform/services/claude-session-manager/dist/rc-daemon.js +4 -1
  119. package/payload/platform/services/claude-session-manager/dist/rc-daemon.js.map +1 -1
  120. package/payload/platform/services/claude-session-manager/dist/reaper.d.ts +3 -0
  121. package/payload/platform/services/claude-session-manager/dist/reaper.d.ts.map +1 -1
  122. package/payload/platform/services/claude-session-manager/dist/reaper.js +2 -1
  123. package/payload/platform/services/claude-session-manager/dist/reaper.js.map +1 -1
  124. package/payload/platform/services/claude-session-manager/dist/session-cap-audit.d.ts +2 -0
  125. package/payload/platform/services/claude-session-manager/dist/session-cap-audit.d.ts.map +1 -1
  126. package/payload/platform/services/claude-session-manager/dist/session-cap-audit.js +5 -2
  127. package/payload/platform/services/claude-session-manager/dist/session-cap-audit.js.map +1 -1
  128. package/payload/platform/services/claude-session-manager/dist/slice-memory-policy.d.ts +2 -0
  129. package/payload/platform/services/claude-session-manager/dist/slice-memory-policy.d.ts.map +1 -1
  130. package/payload/platform/services/claude-session-manager/dist/slice-memory-policy.js +5 -3
  131. package/payload/platform/services/claude-session-manager/dist/slice-memory-policy.js.map +1 -1
  132. package/payload/platform/services/claude-session-manager/dist/systemd-scope.d.ts +26 -16
  133. package/payload/platform/services/claude-session-manager/dist/systemd-scope.d.ts.map +1 -1
  134. package/payload/platform/services/claude-session-manager/dist/systemd-scope.js +84 -31
  135. package/payload/platform/services/claude-session-manager/dist/systemd-scope.js.map +1 -1
  136. package/payload/platform/services/claude-session-manager/dist/wa-channel-mcp.d.ts +7 -0
  137. package/payload/platform/services/claude-session-manager/dist/wa-channel-mcp.d.ts.map +1 -1
  138. package/payload/platform/services/claude-session-manager/dist/wa-channel-mcp.js +6 -0
  139. package/payload/platform/services/claude-session-manager/dist/wa-channel-mcp.js.map +1 -1
  140. package/payload/platform/services/telegram-channel/dist/notification.d.ts +10 -2
  141. package/payload/platform/services/telegram-channel/dist/notification.d.ts.map +1 -1
  142. package/payload/platform/services/telegram-channel/dist/notification.js +15 -3
  143. package/payload/platform/services/telegram-channel/dist/notification.js.map +1 -1
  144. package/payload/platform/services/telegram-channel/dist/server.d.ts +5 -0
  145. package/payload/platform/services/telegram-channel/dist/server.d.ts.map +1 -1
  146. package/payload/platform/services/telegram-channel/dist/server.js +57 -5
  147. package/payload/platform/services/telegram-channel/dist/server.js.map +1 -1
  148. package/payload/platform/services/telegram-channel/dist/turn-follow.d.ts +44 -2
  149. package/payload/platform/services/telegram-channel/dist/turn-follow.d.ts.map +1 -1
  150. package/payload/platform/services/telegram-channel/dist/turn-follow.js +188 -15
  151. package/payload/platform/services/telegram-channel/dist/turn-follow.js.map +1 -1
  152. package/payload/platform/services/webchat-channel/dist/server.d.ts +5 -0
  153. package/payload/platform/services/webchat-channel/dist/server.d.ts.map +1 -1
  154. package/payload/platform/services/webchat-channel/dist/server.js +53 -4
  155. package/payload/platform/services/webchat-channel/dist/server.js.map +1 -1
  156. package/payload/platform/services/webchat-channel/dist/turn-follow.d.ts +44 -2
  157. package/payload/platform/services/webchat-channel/dist/turn-follow.d.ts.map +1 -1
  158. package/payload/platform/services/webchat-channel/dist/turn-follow.js +188 -15
  159. package/payload/platform/services/webchat-channel/dist/turn-follow.js.map +1 -1
  160. package/payload/platform/services/whatsapp-channel/dist/instructions.d.ts +9 -0
  161. package/payload/platform/services/whatsapp-channel/dist/instructions.d.ts.map +1 -0
  162. package/payload/platform/services/whatsapp-channel/dist/instructions.js +22 -0
  163. package/payload/platform/services/whatsapp-channel/dist/instructions.js.map +1 -0
  164. package/payload/platform/services/whatsapp-channel/dist/notification.d.ts +3 -1
  165. package/payload/platform/services/whatsapp-channel/dist/notification.d.ts.map +1 -1
  166. package/payload/platform/services/whatsapp-channel/dist/notification.js +10 -2
  167. package/payload/platform/services/whatsapp-channel/dist/notification.js.map +1 -1
  168. package/payload/platform/services/whatsapp-channel/dist/server.d.ts +10 -2
  169. package/payload/platform/services/whatsapp-channel/dist/server.d.ts.map +1 -1
  170. package/payload/platform/services/whatsapp-channel/dist/server.js +71 -8
  171. package/payload/platform/services/whatsapp-channel/dist/server.js.map +1 -1
  172. package/payload/platform/services/whatsapp-channel/dist/turn-follow.d.ts +34 -2
  173. package/payload/platform/services/whatsapp-channel/dist/turn-follow.d.ts.map +1 -1
  174. package/payload/platform/services/whatsapp-channel/dist/turn-follow.js +153 -15
  175. package/payload/platform/services/whatsapp-channel/dist/turn-follow.js.map +1 -1
  176. package/payload/server/server.js +254 -96
@@ -1,8 +1,17 @@
1
1
  export interface RosterCensusInput {
2
2
  /** `<accountDir>/agents/admin/AGENTS.md` — the admin's routing prose. */
3
3
  agentsMdPath: string;
4
- /** `<accountDir>/specialists/agents` — the directory spawn-context reads. */
4
+ /** `<accountDir>/specialists/agents` — the source directory spawn-context
5
+ * reads for the `<specialist-domains>` prompt block, and the directory the
6
+ * registry mirrors. Not what dispatch resolves against; see `registryDir`.
7
+ * Drives `undurable` and `bundleOrphans` only. */
5
8
  specialistsAgentsDir: string;
9
+ /** Task 2460 — `<accountDir>/.claude/agents`, the one directory the CLI
10
+ * resolves a subagent name from once the brand-wide root is retired.
11
+ * `syncAccountAgentRegistry` writes it at every spawn. Required, not
12
+ * optional: a caller that omitted it would report every declared specialist
13
+ * as orphaned. */
14
+ registryDir: string;
6
15
  /** Directories whose own `*.md` files are durable copies. Today just
7
16
  * `$PLATFORM_ROOT/templates/specialists/agents`. Required, not optional:
8
17
  * a caller that omitted them would report every live specialist as
@@ -1 +1 @@
1
- {"version":3,"file":"roster-census.d.ts","sourceRoot":"","sources":["../../src/lib/roster-census.ts"],"names":[],"mappings":"AAgCA,MAAM,WAAW,iBAAiB;IAChC,yEAAyE;IACzE,YAAY,EAAE,MAAM,CAAC;IACrB,6EAA6E;IAC7E,oBAAoB,EAAE,MAAM,CAAC;IAC7B;;;qBAGiB;IACjB,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB;;;;4EAIwE;IACxE,kBAAkB,EAAE,MAAM,EAAE,CAAC;IAC7B;;qEAEiE;IACjE,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC5B;AAED,MAAM,WAAW,kBAAkB;IACjC,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;IACrB,oEAAoE;IACpE,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB;;oEAEgE;IAChE,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB;;;;sEAIkE;IAClE,aAAa,EAAE,MAAM,EAAE,CAAC;CACzB;AAyCD,wBAAgB,eAAe,CAAC,KAAK,EAAE,iBAAiB,GAAG,kBAAkB,CAgC5E"}
1
+ {"version":3,"file":"roster-census.d.ts","sourceRoot":"","sources":["../../src/lib/roster-census.ts"],"names":[],"mappings":"AAmCA,MAAM,WAAW,iBAAiB;IAChC,yEAAyE;IACzE,YAAY,EAAE,MAAM,CAAC;IACrB;;;uDAGmD;IACnD,oBAAoB,EAAE,MAAM,CAAC;IAC7B;;;;uBAImB;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB;;;qBAGiB;IACjB,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB;;;;4EAIwE;IACxE,kBAAkB,EAAE,MAAM,EAAE,CAAC;IAC7B;;qEAEiE;IACjE,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC5B;AAED,MAAM,WAAW,kBAAkB;IACjC,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;IACrB,oEAAoE;IACpE,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB;;oEAEgE;IAChE,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB;;;;sEAIkE;IAClE,aAAa,EAAE,MAAM,EAAE,CAAC;CACzB;AAyCD,wBAAgB,eAAe,CAAC,KAAK,EAAE,iBAAiB,GAAG,kBAAkB,CAqC5E"}
@@ -43,7 +43,12 @@ export function runRosterCensus(input) {
43
43
  for (const match of body.matchAll(/^- \*\*specialists:([^*]+)\*\*:/gm)) {
44
44
  declared.push(match[1]);
45
45
  }
46
- const orphaned = declared.filter((name) => !existsSync(join(input.specialistsAgentsDir, `${name}.md`)));
46
+ // Task 2460 measured against the registry, not the source directory. Those
47
+ // two disagreed on the account that filed that task: 13 authored, 12
48
+ // registered, and this line reported zero orphans three times. existsSync
49
+ // follows symlinks, so a dangling registry link reads as absent, which is
50
+ // correct — it does not resolve.
51
+ const orphaned = declared.filter((name) => !existsSync(join(input.registryDir, `${name}.md`)));
47
52
  const durable = new Set();
48
53
  for (const dir of input.durableDirs) {
49
54
  for (const filename of markdownIn(dir))
@@ -1 +1 @@
1
- {"version":3,"file":"roster-census.js","sourceRoot":"","sources":["../../src/lib/roster-census.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"roster-census.js","sourceRoot":"","sources":["../../src/lib/roster-census.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAChE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAkFjC;;;;uDAIuD;AACvD,SAAS,UAAU,CAAC,GAAW;IAC7B,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC;QAAE,OAAO,EAAE,CAAC;IAChC,OAAO,WAAW,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC;AACnE,CAAC;AAED,SAAS,OAAO,CAAC,GAAW;IAC1B,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC;QAAE,OAAO,EAAE,CAAC;IAChC,OAAO,WAAW,CAAC,GAAG,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC;SAC7C,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC;SACtC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;AAChC,CAAC;AAED,SAAS,iBAAiB,CACxB,oBAA4B,EAC5B,iBAA0B;IAE1B,IAAI,CAAC,iBAAiB;QAAE,OAAO,EAAE,CAAC;IAClC,MAAM,OAAO,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAAC;IAC3C,4EAA4E;IAC5E,0EAA0E;IAC1E,yEAAyE;IACzE,sEAAsE;IACtE,wEAAwE;IACxE,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IACpC,0EAA0E;IAC1E,6EAA6E;IAC7E,cAAc;IACd,OAAO,UAAU,CAAC,oBAAoB,CAAC;SACpC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;SACrC,MAAM,CACL,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,iBAAiB,EAAE,CAAC,EAAE,QAAQ,EAAE,IAAI,CAAC,CAAC,CAAC,CACvF,CAAC;AACN,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,KAAwB;IACtD,MAAM,IAAI,GAAG,UAAU,CAAC,KAAK,CAAC,YAAY,CAAC;QACzC,CAAC,CAAC,YAAY,CAAC,KAAK,CAAC,YAAY,EAAE,MAAM,CAAC;QAC1C,CAAC,CAAC,EAAE,CAAC;IACP,MAAM,QAAQ,GAAa,EAAE,CAAC;IAC9B,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,QAAQ,CAAC,mCAAmC,CAAC,EAAE,CAAC;QACvE,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IAC1B,CAAC;IACD,6EAA6E;IAC7E,qEAAqE;IACrE,0EAA0E;IAC1E,0EAA0E;IAC1E,iCAAiC;IACjC,MAAM,QAAQ,GAAG,QAAQ,CAAC,MAAM,CAC9B,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,GAAG,IAAI,KAAK,CAAC,CAAC,CAC7D,CAAC;IAEF,MAAM,OAAO,GAAG,IAAI,GAAG,EAAU,CAAC;IAClC,KAAK,MAAM,GAAG,IAAI,KAAK,CAAC,WAAW,EAAE,CAAC;QACpC,KAAK,MAAM,QAAQ,IAAI,UAAU,CAAC,GAAG,CAAC;YAAE,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IAChE,CAAC;IACD,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC,kBAAkB,EAAE,CAAC;QAC5C,KAAK,MAAM,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;YACnC,KAAK,MAAM,QAAQ,IAAI,UAAU,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC;gBAAE,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QACzF,CAAC;IACH,CAAC;IACD,MAAM,SAAS,GAAG,UAAU,CAAC,KAAK,CAAC,oBAAoB,CAAC,CAAC,MAAM,CAC7D,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CACrC,CAAC;IAEF,OAAO;QACL,QAAQ,EAAE,QAAQ,CAAC,MAAM;QACzB,YAAY,EAAE,QAAQ,CAAC,MAAM,GAAG,QAAQ,CAAC,MAAM;QAC/C,QAAQ;QACR,SAAS;QACT,aAAa,EAAE,iBAAiB,CAAC,KAAK,CAAC,oBAAoB,EAAE,KAAK,CAAC,iBAAiB,CAAC;KACtF,CAAC;AACJ,CAAC"}
@@ -11,7 +11,16 @@ export interface CapabilitiesHereInput {
11
11
  brandConfigPath: string;
12
12
  platformRoot: string;
13
13
  premiumPluginsRoot: string;
14
+ /** Still needed: `listConnectorsRaw` runs `claude mcp list` under it. No
15
+ * longer the source of `registeredAgentTypes`; see `agentRegistryDir`. */
14
16
  claudeConfigDir: string;
17
+ /** Task 2460 — `<accountDir>/.claude/agents`, the account's agent registry.
18
+ * `registeredAgentTypes` used to enumerate `$CLAUDE_CONFIG_DIR/agents`, the
19
+ * brand-wide root the installer wrote; that root is retired and cleared on
20
+ * upgrade, so reading it would report an empty registry on every install.
21
+ * This tool's contract is that a caller may rely on it before claiming what
22
+ * is dispatchable, so it must name the directory dispatch resolves against. */
23
+ agentRegistryDir: string;
15
24
  /** Task 1160 — returns the raw combined output of `claude mcp list` run under
16
25
  * the brand config dir. Injected by the adapter (index.ts) so this function
17
26
  * stays a pure resolver and so the subprocess never runs in unit tests. When
@@ -1 +1 @@
1
- {"version":3,"file":"capabilities-here.d.ts","sourceRoot":"","sources":["../../src/tools/capabilities-here.ts"],"names":[],"mappings":"AAaA,MAAM,MAAM,sBAAsB,GAAG,WAAW,GAAG,YAAY,GAAG,aAAa,CAAC;AAEhF,MAAM,WAAW,iBAAiB;IAChC;qFACiF;IACjF,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,sBAAsB,CAAC;CAC/B;AAED,MAAM,WAAW,qBAAqB;IACpC,SAAS,EAAE,MAAM,CAAC;IAClB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,eAAe,EAAE,MAAM,CAAC;IACxB,YAAY,EAAE,MAAM,CAAC;IACrB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,eAAe,EAAE,MAAM,CAAC;IACxB;;;;;yCAKqC;IACrC,iBAAiB,CAAC,EAAE,MAAM,OAAO,CAAC,MAAM,CAAC,CAAC;CAC3C;AAED,MAAM,WAAW,sBAAsB;IACrC,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,cAAc,EAAE,MAAM,EAAE,CAAC;IACzB,4BAA4B,EAAE,MAAM,EAAE,CAAC;IACvC,2BAA2B,EAAE,KAAK,CAAC;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACrE,oBAAoB,EAAE,MAAM,EAAE,CAAC;IAC/B,kBAAkB,EAAE,iBAAiB,EAAE,CAAC;IACxC,KAAK,EAAE;QACL,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;QAC3B,mBAAmB,EAAE,MAAM,EAAE,CAAC;KAC/B,CAAC;IACF,UAAU,EAAE,MAAM,CAAC;CACpB;AASD,wBAAgB,uBAAuB,CAAC,aAAa,EAAE,MAAM,GAAG,iBAAiB,EAAE,CAwBlF;AAuCD,wBAAsB,uBAAuB,CAC3C,KAAK,EAAE,qBAAqB,EAC5B,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,sBAAsB,CAAC,CAmDjC"}
1
+ {"version":3,"file":"capabilities-here.d.ts","sourceRoot":"","sources":["../../src/tools/capabilities-here.ts"],"names":[],"mappings":"AAaA,MAAM,MAAM,sBAAsB,GAAG,WAAW,GAAG,YAAY,GAAG,aAAa,CAAC;AAEhF,MAAM,WAAW,iBAAiB;IAChC;qFACiF;IACjF,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,sBAAsB,CAAC;CAC/B;AAED,MAAM,WAAW,qBAAqB;IACpC,SAAS,EAAE,MAAM,CAAC;IAClB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,eAAe,EAAE,MAAM,CAAC;IACxB,YAAY,EAAE,MAAM,CAAC;IACrB,kBAAkB,EAAE,MAAM,CAAC;IAC3B;+EAC2E;IAC3E,eAAe,EAAE,MAAM,CAAC;IACxB;;;;;oFAKgF;IAChF,gBAAgB,EAAE,MAAM,CAAC;IACzB;;;;;yCAKqC;IACrC,iBAAiB,CAAC,EAAE,MAAM,OAAO,CAAC,MAAM,CAAC,CAAC;CAC3C;AAED,MAAM,WAAW,sBAAsB;IACrC,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,cAAc,EAAE,MAAM,EAAE,CAAC;IACzB,4BAA4B,EAAE,MAAM,EAAE,CAAC;IACvC,2BAA2B,EAAE,KAAK,CAAC;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACrE,oBAAoB,EAAE,MAAM,EAAE,CAAC;IAC/B,kBAAkB,EAAE,iBAAiB,EAAE,CAAC;IACxC,KAAK,EAAE;QACL,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;QAC3B,mBAAmB,EAAE,MAAM,EAAE,CAAC;KAC/B,CAAC;IACF,UAAU,EAAE,MAAM,CAAC;CACpB;AASD,wBAAgB,uBAAuB,CAAC,aAAa,EAAE,MAAM,GAAG,iBAAiB,EAAE,CAwBlF;AAuCD,wBAAsB,uBAAuB,CAC3C,KAAK,EAAE,qBAAqB,EAC5B,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,sBAAsB,CAAC,CAiDjC"}
@@ -101,7 +101,7 @@ export async function resolveCapabilitiesHere(input, nowIso) {
101
101
  for (const name of names)
102
102
  installedPremiumSpecialists.push({ bundle, name });
103
103
  }
104
- const registeredAgentTypes = listAgentRegistry(resolve(input.claudeConfigDir, "agents"));
104
+ const registeredAgentTypes = listAgentRegistry(input.agentRegistryDir);
105
105
  const claudeAiConnectors = await resolveClaudeAiConnectors(input.listConnectorsRaw);
106
106
  return {
107
107
  accountId: input.accountId,
@@ -1 +1 @@
1
- {"version":3,"file":"capabilities-here.js","sourceRoot":"","sources":["../../src/tools/capabilities-here.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"capabilities-here.js","sourceRoot":"","sources":["../../src/tools/capabilities-here.ts"],"names":[],"mappings":"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"}
@@ -22,7 +22,7 @@ Call `mcp__plugin_admin_admin__capabilities-here` with no arguments. The tool re
22
22
  - `brand.json` for `productName` and `shipsPremiumBundles`.
23
23
  - `platform/templates/specialists/agents/` for `installedPlatformSpecialists`.
24
24
  - Each enabled premium bundle's `agents/` for `installedPremiumSpecialists`.
25
- - `$CLAUDE_CONFIG_DIR/agents/` for `registeredAgentTypes` (the same registry the Agent tool resolves against).
25
+ - `<accountDir>/.claude/agents/` for `registeredAgentTypes` (this account's agent registry, the same one the Agent tool resolves against). It is mirrored from `<accountDir>/specialists/agents/` before every spawn. The brand-wide `$CLAUDE_CONFIG_DIR/agents/` is not a registration surface and registers nothing.
26
26
 
27
27
  Returns one JSON object with those fields plus `accountId`, `capturedAt`, and the `brand` block. No LLM in the resolution path; pure disk + JSON reads.
28
28
 
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  name: platform-architecture
3
3
  description: Use when grounding any documented-surface claim about what Maxy ships — plugins, skills, specialists, install/deploy flows, internals. This is the install catalogue, not evidence of what is enabled on the current account. For install state on this account, call `capabilities-here`; for documented surface, cite the `Source:` URL inline.
4
- content-hash: sha256:c0d108d50a5c5109da65ad22f4838284c614aed9161d4b5ab70c6db7c30904c2
4
+ content-hash: sha256:021d3690d7d8100b010cc7d9669e51707f501b5be58dac2399a2d751ca9844e1
5
5
  brand: maxy-code
6
6
  product-name: Maxy
7
7
  ---
@@ -1773,6 +1773,96 @@ The first-run dialog is answered for the session, and the watcher that guards ag
1773
1773
 
1774
1774
  Two standing audits reconcile that chain rather than waiting for someone to notice. `op=public-notify-reconcile` reports `routed` against `answered`, so a visitor routed to an agent that never replied shows as `answerGap`. `op=spawn-census` reports attempts against successes. A non-zero gap, or attempts with no successes, is a fault even when nothing has been reported.
1775
1775
 
1776
+ ## Delivery parity, and where its lines actually land
1777
+
1778
+ **The contract.** For any channel session, the set of answers delivered to the
1779
+ chat equals the transcript's assistant `text` blocks **for turns that answered a
1780
+ channel inbound**. An answer readable in the reader and absent from the chat is a
1781
+ defect. Turns that answered no inbound — subagent side-chains, turns driven from
1782
+ claude.ai — are deliberately outside that set: the credit guards are what keep
1783
+ them out of a customer's chat.
1784
+
1785
+ Each door's `src/parity.test.ts` asserts the contract end to end against a real
1786
+ JSONL and the real follower.
1787
+
1788
+ **Six discard sites, each now logged.** A follower outcome is dropped at:
1789
+
1790
+ | File | Guard | `reason=` |
1791
+ |---|---|---|
1792
+ | `telegram-channel/src/server.ts:241` | `pendingTurns <= 0` | `no-credit` |
1793
+ | `webchat-channel/src/server.ts:378` | `pendingTurns <= 0` | `no-credit` |
1794
+ | `whatsapp-channel/src/server.ts:481` | `pendingTurns <= 0` | `no-credit` |
1795
+ | `whatsapp-channel/src/server.ts:489` | `consumedInbounds <= 0` | `no-consumed-inbound` |
1796
+ | `whatsapp-channel/src/server.ts:617` | `pendingTurns <= 0` (2nd follower) | `no-credit` |
1797
+ | `whatsapp-channel/src/server.ts:620` | `consumedInbounds <= 0` (2nd follower) | `no-consumed-inbound` |
1798
+
1799
+ ```
1800
+ [<door>-channel] op=turn-drop sessionId=… messageId=… finalBytes=… reason=…
1801
+ [<door>-turn-census] op=census sessionId=… pending=… held=<0|1> heldMessageId=… heldAgeMs=… lastMessageId=…
1802
+ ```
1803
+
1804
+ Any `op=turn-drop` with `finalBytes>0` is a lost answer. The census runs every
1805
+ 60 s per follower; `held=1` with `heldAgeMs` rising across ticks is a hold that
1806
+ never resolved, and `pending` not returning to 0 with no inbound in flight is
1807
+ credit drift.
1808
+
1809
+ **Read them in the right file.** Both lines are emitted by the *channel MCP
1810
+ server*, whose stderr is teed to `${LOG_DIR}/mcp-<serverName>-<sessionId>.log`
1811
+ (`claude-session-manager/src/channel-spawn-tee.ts`). They are **never** in
1812
+ `server.log`, which carries the gateway-side half only — `op=turn-end`,
1813
+ `op=turn-answer-absent`, `delivered=`. Grepping `server.log` for a drop returns
1814
+ nothing and means nothing.
1815
+
1816
+ ```bash
1817
+ # the discard and the hold, per session
1818
+ grep -E 'op=(turn-drop|census)' ~/.<brand>/logs/mcp-telegram-channel-*.log | tail -20
1819
+ # the gateway's view of the same turn
1820
+ grep -E 'op=(turn-end|turn-answer-absent)' ~/.<brand>/logs/server.log | grep <sessionId>
1821
+ ```
1822
+
1823
+ **A seventh discard site, and the one nothing was reading.** An answer that
1824
+ survived every guard above could still be produced and thrown away at the last
1825
+ step, because the gateway resolved its destination from admin identity rather
1826
+ than from the channel it came in on. A public visitor has no admin identity, so
1827
+ the resolver returned no target: nothing was attempted, no transport failed, and
1828
+ the line read `reached=none notReached=none`.
1829
+
1830
+ The turn-end body now carries the channel server's own spawn `role`, and that is
1831
+ the only thing that decides the destination:
1832
+
1833
+ | `role=` | Where the answer goes | `op=fan-out` |
1834
+ |---|---|---|
1835
+ | `public` | every segment through the posting key's own transport; no identity resolver, no registry read | never emitted |
1836
+ | `admin` | every live door the person is reachable on, via `fanTargetsFor` | emitted |
1837
+ | absent or unrecognised | nowhere. 400, plus one `op=turn-role-absent … evicted=<yes\|no>` | never emitted |
1838
+
1839
+ `op=turn-end` and `op=turn-strand-anomaly` both name the role, so no outcome is
1840
+ unattributable.
1841
+
1842
+ A roleless POST has one cause: a channel server from a build predating the field,
1843
+ still attached to a session that outlived the platform restart. It reconnects its
1844
+ stream, so nothing respawns it, and left alone it would post roleless turn-ends for
1845
+ the life of that session. `evicted=yes` says the gateway dropped its subscriber, so
1846
+ the next inbound spawns a server on the current build: one turn is lost per session
1847
+ rather than all of them. That turn's answer is deliberately not delivered to the
1848
+ posting key, because doing so would restore the very fallback whose reachability hid
1849
+ the original defect. The standing check is one line per door per minute, over a
1850
+ rolling hour:
1851
+
1852
+ ```bash
1853
+ # the standing read; any undeliveredPublic>0 is a failure
1854
+ grep -E 'op=census' ~/.<brand>/logs/server.log | grep delivery-census | tail -5
1855
+ # a visitor's answer that reached nobody, or a turn-end that named no role
1856
+ grep -E 'op=(turn-role-absent|turn-strand-anomaly)' ~/.<brand>/logs/server.log | tail -20
1857
+ ```
1858
+
1859
+ `[<door>-delivery-census] op=census windowMin=60 turnEnds=… record=… none=…
1860
+ undelivered=… undeliveredPublic=… undeliveredAdmin=… roleAbsent=…`. Healthy is
1861
+ `undeliveredPublic=0 roleAbsent=0` with `record` tracking `turnEnds` minus
1862
+ `none`. A door with no turn-end in the hour emits nothing; the
1863
+ `op=arm name=channel-delivery-census` line at boot is what separates that from a
1864
+ census that is not running.
1865
+
1776
1866
  ---
1777
1867
  # Settings
1778
1868
  Source: https://docs.getmaxy.com/settings.md
@@ -47,6 +47,10 @@ Each agent lives at `{accountDir}/agents/{slug}/`:
47
47
  }
48
48
  ```
49
49
 
50
+ ### model
51
+
52
+ `model` is live. A public spawn reads it from this file and passes it to the agent's process as `--model`; changing it here changes the next spawn's model with no code change and no restart. An id outside the three listed below is ignored, and the spawn falls back to the account's `publicModel`.
53
+
50
54
  ### Toolless by construction
51
55
 
52
56
  The public agent has no tools. It cannot search the graph, read files, run commands, or load skills mid-conversation. Everything it knows is the KNOWLEDGE.md and SOUL assembled into its system prompt at spawn time. There is no operator toggle for this — it is the fixed posture for every public agent on every channel. If the agent needs to surface graph content created after deployment, refresh its KNOWLEDGE.md (see Update knowledge below); the agent itself never reaches the live graph.
@@ -83,7 +87,7 @@ Tagging routes a node to the suggestion surface; it does not publish it. A tagge
83
87
 
84
88
  ### Model Options
85
89
 
86
- Present as a `select` field within the agent configuration `form` during creation:
90
+ Present as a `select` field within the agent configuration `form` during creation. The chosen id is written to `config.json` `model` and is what the agent's spawns actually run on:
87
91
 
88
92
  | Model | ID | Suitability | Cost |
89
93
  |-------|-----|------------|------|
@@ -9,6 +9,19 @@ Invoked by the admin agent directly.
9
9
 
10
10
  This is the platform's release timeline, newest first. Each entry shows the date it shipped and the version it shipped in, so you can tell the operator how current their install is. To compare, read the installed version from `capabilities-here` and match it against the versions below. Keep answers high level and in plain English; this is a summary, not a full commit log.
11
11
 
12
+ ## 2026-08-06 (0.1.568)
13
+
14
+ - Answers reach the conversation they came from again. An answer was being routed by who the account's admin is rather than by the conversation it was sent to, so a public agent's reply could go nowhere and an admin answer could strand with nothing said about it. Delivery now returns to the door the message arrived on, and every failure to find one is named rather than passing silently. If you rolled an install back because of this, you can move forward again.
15
+ - Starting one product no longer kills conversations belonging to another on the same machine. A product starting up was clearing away stale conversations by a pattern that matched every other co-resident product's live ones too.
16
+ - A specialist you wrote is now actually dispatchable. It was being listed to the assistant while never being registered where dispatch looks, so asking for it did nothing.
17
+ - Telegram and webchat no longer spend one of your inbound allowances on a turn that answered nothing.
18
+
19
+ ## 2026-08-05 (0.1.567)
20
+
21
+ - An answer you can see in the reader is now delivered to the channel it belongs to. A turn that ended on a thinking block was closing before its answer row arrived, and that answer was dropped. Every channel now holds a close that carries no message, merges a split answer back into one message, and records a line at each of the six points where a turn used to be discarded silently.
22
+ - A public agent now runs on the model it is configured with. Public conversations were ignoring the agent's own setting and inheriting the admin model instead.
23
+ - Retail installs can plan, not just record. A new inventory area adds stock positions, demand history, supplier terms and replenishment policy, and answers what to order and when, rather than only recording what has already been sold.
24
+
12
25
  ## 2026-08-05 (0.1.566)
13
26
 
14
27
  - Installing or upgrading Maxy on a machine that also runs another Maxy-family product no longer fails because a browser is in the way. Maxy's browser-automation port was the one every browser tool picks by default when nothing tells it otherwise, so an assistant on the other product could take it and the install would stop rather than write over a port in use. Maxy now uses a port outside that range.
@@ -86,3 +86,93 @@ op=startup-watch state=disposed
86
86
  The first-run dialog is answered for the session, and the watcher that guards against an *unanswered* one drops what it saw before that answer. `bufferCleared=false` means the confirm fired and the drop did not, which is the shape that killed a resumed spawn on 2026-08-01: the answered dialog's own footer stayed in the buffer, the replayed transcript slid past it, and the spawn was blocked by a line the agent itself had written the day before.
87
87
 
88
88
  Two standing audits reconcile that chain rather than waiting for someone to notice. `op=public-notify-reconcile` reports `routed` against `answered`, so a visitor routed to an agent that never replied shows as `answerGap`. `op=spawn-census` reports attempts against successes. A non-zero gap, or attempts with no successes, is a fault even when nothing has been reported.
89
+
90
+ ## Delivery parity, and where its lines actually land
91
+
92
+ **The contract.** For any channel session, the set of answers delivered to the
93
+ chat equals the transcript's assistant `text` blocks **for turns that answered a
94
+ channel inbound**. An answer readable in the reader and absent from the chat is a
95
+ defect. Turns that answered no inbound — subagent side-chains, turns driven from
96
+ claude.ai — are deliberately outside that set: the credit guards are what keep
97
+ them out of a customer's chat.
98
+
99
+ Each door's `src/parity.test.ts` asserts the contract end to end against a real
100
+ JSONL and the real follower.
101
+
102
+ **Six discard sites, each now logged.** A follower outcome is dropped at:
103
+
104
+ | File | Guard | `reason=` |
105
+ |---|---|---|
106
+ | `telegram-channel/src/server.ts:241` | `pendingTurns <= 0` | `no-credit` |
107
+ | `webchat-channel/src/server.ts:378` | `pendingTurns <= 0` | `no-credit` |
108
+ | `whatsapp-channel/src/server.ts:481` | `pendingTurns <= 0` | `no-credit` |
109
+ | `whatsapp-channel/src/server.ts:489` | `consumedInbounds <= 0` | `no-consumed-inbound` |
110
+ | `whatsapp-channel/src/server.ts:617` | `pendingTurns <= 0` (2nd follower) | `no-credit` |
111
+ | `whatsapp-channel/src/server.ts:620` | `consumedInbounds <= 0` (2nd follower) | `no-consumed-inbound` |
112
+
113
+ ```
114
+ [<door>-channel] op=turn-drop sessionId=… messageId=… finalBytes=… reason=…
115
+ [<door>-turn-census] op=census sessionId=… pending=… held=<0|1> heldMessageId=… heldAgeMs=… lastMessageId=…
116
+ ```
117
+
118
+ Any `op=turn-drop` with `finalBytes>0` is a lost answer. The census runs every
119
+ 60 s per follower; `held=1` with `heldAgeMs` rising across ticks is a hold that
120
+ never resolved, and `pending` not returning to 0 with no inbound in flight is
121
+ credit drift.
122
+
123
+ **Read them in the right file.** Both lines are emitted by the *channel MCP
124
+ server*, whose stderr is teed to `${LOG_DIR}/mcp-<serverName>-<sessionId>.log`
125
+ (`claude-session-manager/src/channel-spawn-tee.ts`). They are **never** in
126
+ `server.log`, which carries the gateway-side half only — `op=turn-end`,
127
+ `op=turn-answer-absent`, `delivered=`. Grepping `server.log` for a drop returns
128
+ nothing and means nothing.
129
+
130
+ ```bash
131
+ # the discard and the hold, per session
132
+ grep -E 'op=(turn-drop|census)' ~/.<brand>/logs/mcp-telegram-channel-*.log | tail -20
133
+ # the gateway's view of the same turn
134
+ grep -E 'op=(turn-end|turn-answer-absent)' ~/.<brand>/logs/server.log | grep <sessionId>
135
+ ```
136
+
137
+ **A seventh discard site, and the one nothing was reading.** An answer that
138
+ survived every guard above could still be produced and thrown away at the last
139
+ step, because the gateway resolved its destination from admin identity rather
140
+ than from the channel it came in on. A public visitor has no admin identity, so
141
+ the resolver returned no target: nothing was attempted, no transport failed, and
142
+ the line read `reached=none notReached=none`.
143
+
144
+ The turn-end body now carries the channel server's own spawn `role`, and that is
145
+ the only thing that decides the destination:
146
+
147
+ | `role=` | Where the answer goes | `op=fan-out` |
148
+ |---|---|---|
149
+ | `public` | every segment through the posting key's own transport; no identity resolver, no registry read | never emitted |
150
+ | `admin` | every live door the person is reachable on, via `fanTargetsFor` | emitted |
151
+ | absent or unrecognised | nowhere. 400, plus one `op=turn-role-absent … evicted=<yes\|no>` | never emitted |
152
+
153
+ `op=turn-end` and `op=turn-strand-anomaly` both name the role, so no outcome is
154
+ unattributable.
155
+
156
+ A roleless POST has one cause: a channel server from a build predating the field,
157
+ still attached to a session that outlived the platform restart. It reconnects its
158
+ stream, so nothing respawns it, and left alone it would post roleless turn-ends for
159
+ the life of that session. `evicted=yes` says the gateway dropped its subscriber, so
160
+ the next inbound spawns a server on the current build: one turn is lost per session
161
+ rather than all of them. That turn's answer is deliberately not delivered to the
162
+ posting key, because doing so would restore the very fallback whose reachability hid
163
+ the original defect. The standing check is one line per door per minute, over a
164
+ rolling hour:
165
+
166
+ ```bash
167
+ # the standing read; any undeliveredPublic>0 is a failure
168
+ grep -E 'op=census' ~/.<brand>/logs/server.log | grep delivery-census | tail -5
169
+ # a visitor's answer that reached nobody, or a turn-end that named no role
170
+ grep -E 'op=(turn-role-absent|turn-strand-anomaly)' ~/.<brand>/logs/server.log | tail -20
171
+ ```
172
+
173
+ `[<door>-delivery-census] op=census windowMin=60 turnEnds=… record=… none=…
174
+ undelivered=… undeliveredPublic=… undeliveredAdmin=… roleAbsent=…`. Healthy is
175
+ `undeliveredPublic=0 roleAbsent=0` with `record` tracking `turnEnds` minus
176
+ `none`. A door with no turn-end in the hour emits nothing; the
177
+ `op=arm name=channel-delivery-census` line at boot is what separates that from a
178
+ census that is not running.
@@ -0,0 +1,21 @@
1
+ {
2
+ "name": "inventory",
3
+ "description": "Retail replenishment planning. Records measured stock and observed demand at a product-plus-location grain, holds supplier lead times and service-level policy, and computes what to reorder rather than storing it. Provides inventory-stock-record, inventory-demand-record, inventory-policy-set, inventory-supplier-terms-set, inventory-forecast, inventory-replenish-plan, inventory-purchase-order-record.",
4
+ "version": "0.1.0",
5
+ "author": {
6
+ "name": "Rubytech LLC"
7
+ },
8
+ "mcpServers": {
9
+ "inventory": {
10
+ "type": "stdio",
11
+ "command": "node",
12
+ "args": [
13
+ "${CLAUDE_PLUGIN_ROOT}/lib/mcp-spawn-tee/index.js",
14
+ "${CLAUDE_PLUGIN_ROOT}/mcp/dist/index.js"
15
+ ],
16
+ "env": {
17
+ "MCP_SPAWN_TEE_NAME": "inventory"
18
+ }
19
+ }
20
+ }
21
+ }
@@ -0,0 +1,75 @@
1
+ ---
2
+ name: inventory
3
+ description: "Retail replenishment planning. Records measured stock and observed demand at a product-plus-location grain, holds supplier lead times and service-level policy, and computes what to reorder rather than storing it. Provides inventory-stock-record, inventory-demand-record, inventory-policy-set, inventory-supplier-terms-set, inventory-forecast, inventory-replenish-plan, inventory-purchase-order-record."
4
+ tools:
5
+ - name: inventory-stock-record
6
+ publicAllowlist: false
7
+ adminAllowlist: true
8
+ riskClass: write_local
9
+ - name: inventory-demand-record
10
+ publicAllowlist: false
11
+ adminAllowlist: true
12
+ riskClass: write_local
13
+ - name: inventory-policy-set
14
+ publicAllowlist: false
15
+ adminAllowlist: true
16
+ riskClass: write_local
17
+ - name: inventory-supplier-terms-set
18
+ publicAllowlist: false
19
+ adminAllowlist: true
20
+ riskClass: write_local
21
+ - name: inventory-forecast
22
+ publicAllowlist: false
23
+ adminAllowlist: true
24
+ riskClass: read
25
+ - name: inventory-replenish-plan
26
+ publicAllowlist: false
27
+ adminAllowlist: true
28
+ riskClass: read
29
+ - name: inventory-purchase-order-record
30
+ publicAllowlist: false
31
+ adminAllowlist: true
32
+ riskClass: write_local
33
+ always: false
34
+ embed: false
35
+ metadata: {"platform":{}}
36
+ mcp:
37
+ command: node
38
+ args:
39
+ - ${PLATFORM_ROOT}/lib/mcp-spawn-tee/dist/index.js
40
+ - ${PLATFORM_ROOT}/plugins/inventory/mcp/dist/index.js
41
+ env:
42
+ MCP_SPAWN_TEE_NAME: inventory
43
+ LOG_DIR: ${LOG_DIR}
44
+ PLATFORM_ROOT: ${PLATFORM_ROOT}
45
+ ACCOUNT_ID: ${ACCOUNT_ID}
46
+ SESSION_ID: ${SESSION_ID}
47
+ AGENT_SLUG: ${AGENT_SLUG}
48
+ mcp-manifest: auto
49
+ ---
50
+
51
+ # Inventory
52
+
53
+ Replenishment planning for a retail account. Admin agent only.
54
+
55
+ Load `platform/plugins/memory/references/schema-retail.md` before writing: this plugin's nodes are declared there.
56
+
57
+ ## Nothing it recommends is stored
58
+
59
+ The forecast and the reorder point are computed from recorded facts on every call. There is no `Forecast` node and no stored plan.
60
+
61
+ A stored recommendation drifts the moment stock moves by a path that forgets to update it, and nothing fails when it does: the plan simply reports a number that no longer reconciles against the positions it was computed from. A computed figure cannot disagree with the data it is computed from.
62
+
63
+ ## The planning grain is a product at a location
64
+
65
+ Stock lives on `:StockPosition`, keyed on product plus location, not on `Product.stockLevel`. A retailer with a shop and a warehouse can say how much sits where; a single-site seller simply has one location.
66
+
67
+ No tool here reads `Product.stockLevel`.
68
+
69
+ ## Nothing is defaulted
70
+
71
+ A line that cannot be computed, because the supplier has no lead time, the product has no policy, or there is no demand history, comes back named as skipped with the missing input. It is never computed from a substituted value: a default service level or a guessed lead time produces a confident, wrong order quantity, which is worse than no answer.
72
+
73
+ ## Data age is returned, not assumed
74
+
75
+ Stock arrives by upload, so it is stale by construction. `inventory-replenish-plan` returns the oldest and newest `asOf` it actually read. Report that age to the operator as a fact from the tool rather than assuming the data is current.