@zq-silk/yui 2.0.0 → 2.2.0

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 (138) hide show
  1. package/README.md +4 -0
  2. package/dist/cli/commandCatalog.js +318 -289
  3. package/dist/cli/commandDiscovery.js +72 -0
  4. package/dist/cli/completion.js +22 -227
  5. package/dist/cli/dynamicCompletion.js +12 -6
  6. package/dist/cli/invocationAuthority.js +2 -2
  7. package/dist/cli/invocationRouter.js +18 -7
  8. package/dist/cli.js +23 -3030
  9. package/dist/commands/capabilityCommands.js +5 -5
  10. package/dist/commands/globalRoleCommands.js +2 -1
  11. package/dist/commands/taskCommands.js +90 -21
  12. package/dist/commands/taskIntegrationCommands.js +3 -1
  13. package/dist/commands/taskUpstreamCommands.js +3 -1
  14. package/dist/context/runContextPack.js +132 -5
  15. package/dist/context/sourceRunContext.js +4 -2
  16. package/dist/context/taskContext.js +12 -3
  17. package/dist/controlPlaneCli.js +3092 -0
  18. package/dist/controller/fileSchedulerStoreAdapter.js +19 -6
  19. package/dist/controller/jobControl.js +21 -0
  20. package/dist/executor/agentExecutor.js +1 -1
  21. package/dist/executor/effectiveLaunch.js +18 -5
  22. package/dist/executor/fileRoleLaunchPlanner.js +15 -19
  23. package/dist/integration/gitIntegrationService.js +50 -15
  24. package/dist/kernel/accessAssessment.js +1 -0
  25. package/dist/kernel/builtinCapabilities.js +28 -1
  26. package/dist/kernel/capabilityRegistry.js +64 -19
  27. package/dist/message/messageContinuation.js +7 -2
  28. package/dist/nativeAgent/agent.js +275 -0
  29. package/dist/nativeAgent/cliDemo.js +37 -0
  30. package/dist/nativeAgent/codingTools.js +11 -0
  31. package/dist/nativeAgent/commandTool.js +215 -0
  32. package/dist/nativeAgent/compactionDemo.js +158 -0
  33. package/dist/nativeAgent/composition.js +71 -0
  34. package/dist/nativeAgent/context/budget.js +44 -0
  35. package/dist/nativeAgent/context/index.js +339 -0
  36. package/dist/nativeAgent/context/providerCompressor.js +103 -0
  37. package/dist/nativeAgent/contracts.js +1 -0
  38. package/dist/nativeAgent/demo.js +40 -0
  39. package/dist/nativeAgent/evaluation/cases.js +38 -0
  40. package/dist/nativeAgent/evaluation/checks.js +91 -0
  41. package/dist/nativeAgent/evaluation/demo.js +19 -0
  42. package/dist/nativeAgent/evaluation/files.js +54 -0
  43. package/dist/nativeAgent/evaluation/fixture.js +36 -0
  44. package/dist/nativeAgent/evaluation/index.js +239 -0
  45. package/dist/nativeAgent/executionOwner.js +209 -0
  46. package/dist/nativeAgent/filePatterns.js +170 -0
  47. package/dist/nativeAgent/fileToolsSupport.js +202 -0
  48. package/dist/nativeAgent/index.js +16 -0
  49. package/dist/nativeAgent/interaction/cli.js +358 -0
  50. package/dist/nativeAgent/interaction/contracts.js +1 -0
  51. package/dist/nativeAgent/interaction/index.js +3 -0
  52. package/dist/nativeAgent/interaction/memoryDemo.js +115 -0
  53. package/dist/nativeAgent/interaction/renderer.js +34 -0
  54. package/dist/nativeAgent/localSafety.js +258 -0
  55. package/dist/nativeAgent/mockProvider.js +43 -0
  56. package/dist/nativeAgent/model/anthropicMessages.js +204 -0
  57. package/dist/nativeAgent/model/chatCompletions.js +210 -0
  58. package/dist/nativeAgent/model/errors.js +47 -0
  59. package/dist/nativeAgent/model/gateway.js +423 -0
  60. package/dist/nativeAgent/model/index.js +7 -0
  61. package/dist/nativeAgent/model/observationAdapter.js +21 -0
  62. package/dist/nativeAgent/model/protocols.js +19 -0
  63. package/dist/nativeAgent/model/responses.js +263 -0
  64. package/dist/nativeAgent/model/types.js +1 -0
  65. package/dist/nativeAgent/model/wire.js +73 -0
  66. package/dist/nativeAgent/observability/index.js +220 -0
  67. package/dist/nativeAgent/product/catalog.js +82 -0
  68. package/dist/nativeAgent/product/config.js +295 -0
  69. package/dist/nativeAgent/product/facts.js +30 -0
  70. package/dist/nativeAgent/product/index.js +62 -0
  71. package/dist/nativeAgent/product/location.js +44 -0
  72. package/dist/nativeAgent/product/runtime.js +276 -0
  73. package/dist/nativeAgent/product/storage.js +49 -0
  74. package/dist/nativeAgent/product/tools.js +47 -0
  75. package/dist/nativeAgent/product/transport.js +54 -0
  76. package/dist/nativeAgent/projectGuidance/index.js +425 -0
  77. package/dist/nativeAgent/searchTools.js +305 -0
  78. package/dist/nativeAgent/session/backends.js +293 -0
  79. package/dist/nativeAgent/session/catalog.js +97 -0
  80. package/dist/nativeAgent/session/catalogDemo.js +87 -0
  81. package/dist/nativeAgent/session/contracts.js +1 -0
  82. package/dist/nativeAgent/session/format.js +269 -0
  83. package/dist/nativeAgent/session/index.js +5 -0
  84. package/dist/nativeAgent/session/location.js +36 -0
  85. package/dist/nativeAgent/session/sqliteFormat.js +134 -0
  86. package/dist/nativeAgent/session/store.js +248 -0
  87. package/dist/nativeAgent/textTools.js +293 -0
  88. package/dist/nativeAgent/toolManager/executor.js +290 -0
  89. package/dist/nativeAgent/toolManager/index.js +4 -0
  90. package/dist/nativeAgent/validation.js +95 -0
  91. package/dist/plugins/pluginService.js +98 -8
  92. package/dist/resources/projectResourceService.js +23 -1
  93. package/dist/runtime/managedIdentity.js +6 -0
  94. package/dist/surface/surfaceContributions.js +3 -0
  95. package/dist/task/taskAuthority.js +61 -10
  96. package/dist/web/assets/assetManifest.js +38 -22
  97. package/dist/web/assets/client/api.js +115 -0
  98. package/dist/web/assets/client/app.js +615 -862
  99. package/dist/web/assets/client/components.js +323 -897
  100. package/dist/web/assets/client/detail.js +333 -0
  101. package/dist/web/assets/client/dock.js +225 -0
  102. package/dist/web/assets/client/dom.js +55 -3
  103. package/dist/web/assets/client/evidence.js +172 -0
  104. package/dist/web/assets/client/format.js +25 -14
  105. package/dist/web/assets/client/forms.js +230 -0
  106. package/dist/web/assets/client/i18n.js +1024 -791
  107. package/dist/web/assets/client/overview.js +118 -0
  108. package/dist/web/assets/client/records.js +63 -0
  109. package/dist/web/assets/client/sections.js +313 -0
  110. package/dist/web/assets/client/sidebar.js +146 -0
  111. package/dist/web/assets/client/theme.js +61 -22
  112. package/dist/web/assets/icons.js +39 -0
  113. package/dist/web/assets/shell.js +125 -118
  114. package/dist/web/assets/styles/base.js +41 -0
  115. package/dist/web/assets/styles/components.js +169 -0
  116. package/dist/web/assets/styles/layout.js +56 -77
  117. package/dist/web/assets/styles/markdown.js +16 -24
  118. package/dist/web/assets/styles/responsive.js +41 -44
  119. package/dist/web/assets/styles/tokens.js +65 -89
  120. package/dist/web/assets/styles/views.js +292 -0
  121. package/dist/web/webServer.js +2 -1
  122. package/docs/agent-result-consumption.md +16 -0
  123. package/docs/agent-result-consumption.zh-CN.md +13 -0
  124. package/docs/examples/agent-offline.mjs +194 -0
  125. package/docs/native-agent.md +283 -0
  126. package/docs/release-workflow.md +61 -0
  127. package/docs/release-workflow.zh-CN.md +46 -0
  128. package/docs/roles-and-configuration.md +32 -0
  129. package/docs/roles-and-configuration.zh-CN.md +26 -0
  130. package/package.json +1 -1
  131. package/skills/yui-leader/SKILL.md +9 -0
  132. package/skills/yui-reviewer/SKILL.md +5 -0
  133. package/skills/yui-runtime/SKILL.md +33 -0
  134. package/dist/web/assets/client/taskSummary.js +0 -350
  135. package/dist/web/assets/client/taskSurface.js +0 -616
  136. package/dist/web/assets/client/view.js +0 -608
  137. package/dist/web/assets/styles/cards.js +0 -247
  138. package/dist/web/assets/styles/widgets.js +0 -168
@@ -1,5 +1,7 @@
1
1
  import { supportedAgentAdapterIds } from "../agent/adapterCatalog.js";
2
2
  import { supportedAgentExecutionComponentIds } from "../agent/executionComponents.js";
3
+ import { productConfigurationOptions } from "../nativeAgent/product/config.js";
4
+ import { catalogCommands, catalogCommandOptions } from "../nativeAgent/product/catalog.js";
3
5
  import { CONFIG_DEFINITIONS, CONFIG_DOMAINS, configDefinitionsForDomain } from "../config/configCatalog.js";
4
6
  function buildNode(input, parentPath = []) {
5
7
  const path = [...parentPath, input.name];
@@ -24,6 +26,7 @@ function buildNode(input, parentPath = []) {
24
26
  }))),
25
27
  children: Object.freeze(children),
26
28
  hidden: input.hidden ?? false,
29
+ ...(input.discovery === undefined ? {} : { discovery: input.discovery }),
27
30
  options: Object.freeze([...(input.options ?? [])]),
28
31
  hiddenOptions: Object.freeze([...(input.hiddenOptions ?? [])]),
29
32
  values: Object.freeze((input.values ?? []).map((value) => Object.freeze(typeof value === "string" ? { name: value, summary: value } : { ...value }))),
@@ -66,7 +69,7 @@ function durableConfigDomainNode(domain) {
66
69
  ? ["--quiet-after-seconds", "--diagnostic-after-seconds", "--stall-after-seconds"]
67
70
  : [];
68
71
  return {
69
- name: domain,
72
+ name: domain, discovery: { surface: "public", audiences: ["public", "operator"] },
70
73
  summary: CONFIG_DOMAIN_SUMMARIES[domain],
71
74
  examples: [
72
75
  `yui config ${domain} show`,
@@ -75,9 +78,9 @@ function durableConfigDomainNode(domain) {
75
78
  ],
76
79
  sections: [{ id: "manage", title: "Commands", entries: ["show", "set", "clear"] }],
77
80
  children: [
78
- { name: "show", summary: `Show effective ${domain} configuration.` },
81
+ { name: "show", discovery: { surface: "public", audiences: ["public", "operator", "leader", "assignment", "global"] }, summary: `Show effective ${domain} configuration.` },
79
82
  {
80
- name: "set",
83
+ name: "set", discovery: { surface: "public", audiences: ["public", "operator"] },
81
84
  summary: `Set one ${domain} configuration key.`,
82
85
  usage: `yui config ${domain} set <key> <value...>`,
83
86
  sections: [{ id: "keys", title: "Configuration keys", entries: keys }],
@@ -90,7 +93,7 @@ function durableConfigDomainNode(domain) {
90
93
  : {}
91
94
  },
92
95
  {
93
- name: "clear",
96
+ name: "clear", discovery: { surface: "public", audiences: ["public", "operator"] },
94
97
  summary: `Reset one ${domain} configuration key to its default.`,
95
98
  usage: `yui config ${domain} clear <key>`,
96
99
  sections: [{ id: "keys", title: "Configuration keys", entries: keys }],
@@ -101,7 +104,7 @@ function durableConfigDomainNode(domain) {
101
104
  }
102
105
  const agentChildren = [
103
106
  {
104
- name: "add",
107
+ name: "add", discovery: { surface: "public", audiences: ["public", "operator"] },
105
108
  summary: "Add a configured Agent execution component.",
106
109
  usage: "yui config agent add <id> [--component <component>] [--adapter <adapter>] --command <command> [--arg <arg> ...] [--env TARGET=PROCESS_NAME ...]",
107
110
  options: ["--component", "--adapter", "--command", "--arg", "--env"],
@@ -111,16 +114,16 @@ const agentChildren = [
111
114
  },
112
115
  executableOptions: ["--command"]
113
116
  },
114
- { name: "list", summary: "List configured Agents." },
115
- { name: "show", summary: "Show one configured Agent.", usage: "yui config agent show <id>" },
117
+ { name: "list", discovery: { surface: "public", audiences: ["public", "operator", "leader", "assignment", "global"] }, summary: "List configured Agents." },
118
+ { name: "show", discovery: { surface: "public", audiences: ["public", "operator", "leader", "assignment", "global"] }, summary: "Show one configured Agent.", usage: "yui config agent show <id>" },
116
119
  {
117
- name: "capabilities",
120
+ name: "capabilities", discovery: { surface: "public", audiences: ["public", "operator", "leader", "assignment", "global"] },
118
121
  summary: "Probe one Agent CLI for runtime configuration options.",
119
122
  usage: "yui config agent capabilities <id> [--refresh]",
120
123
  options: ["--refresh"]
121
124
  },
122
125
  {
123
- name: "update",
126
+ name: "update", discovery: { surface: "public", audiences: ["public", "operator"] },
124
127
  summary: "Update a configured Agent.",
125
128
  usage: "yui config agent update <id> [--component <component>] [--adapter <adapter>] [--command <command>] [--arg <arg> ... | --clear-args] [--env TARGET=PROCESS_NAME ... | --clear-env]",
126
129
  options: ["--component", "--adapter", "--command", "--arg", "--clear-args", "--env", "--clear-env", "--yes"],
@@ -130,7 +133,7 @@ const agentChildren = [
130
133
  },
131
134
  executableOptions: ["--command"]
132
135
  },
133
- { name: "remove", summary: "Remove a configured Agent.", usage: "yui config agent remove <id>" }
136
+ { name: "remove", discovery: { surface: "public", audiences: ["public", "operator"] }, summary: "Remove a configured Agent.", usage: "yui config agent remove <id>" }
134
137
  ];
135
138
  const roleProfileOptions = [
136
139
  "--description", "--responsibility", "--constraint",
@@ -164,17 +167,17 @@ const roleAgentOptionValues = {
164
167
  };
165
168
  const roleChildren = [
166
169
  {
167
- name: "add",
170
+ name: "add", discovery: { surface: "public", audiences: ["public", "operator"] },
168
171
  summary: "Add a reusable global Role.",
169
172
  usage: "yui config role add <name> --agent <id> [Role and Agent settings]",
170
173
  options: ["--agent", "--workspace", ...roleProfileOptions, ...roleAgentOptions],
171
174
  optionValues: roleAgentOptionValues,
172
175
  fileOptions: ["--workspace"]
173
176
  },
174
- { name: "list", summary: "List global Roles." },
175
- { name: "show", summary: "Show one global Role.", usage: "yui config role show <name>" },
177
+ { name: "list", discovery: { surface: "public", audiences: ["public", "operator", "leader", "assignment", "global"] }, summary: "List global Roles." },
178
+ { name: "show", discovery: { surface: "public", audiences: ["public", "operator", "leader", "assignment", "global"] }, summary: "Show one global Role.", usage: "yui config role show <name>" },
176
179
  {
177
- name: "update",
180
+ name: "update", discovery: { surface: "public", audiences: ["public", "operator"] },
178
181
  summary: "Update a global Role.",
179
182
  usage: "yui config role update <name> [profile options] [clear options]",
180
183
  options: ["--agent", "--workspace", ...roleProfileOptions, ...roleAgentOptions,
@@ -182,74 +185,74 @@ const roleChildren = [
182
185
  optionValues: roleAgentOptionValues,
183
186
  fileOptions: ["--workspace"]
184
187
  },
185
- { name: "remove", summary: "Remove a global Role.", usage: "yui config role remove <name>" },
186
- { name: "bind", summary: "Bind and activate an Agent for a global Role.", usage: "yui config role bind <role> <agent-id>" },
187
- { name: "unbind", summary: "Unbind a dormant Agent from a global Role.", usage: "yui config role unbind <role> <agent-id>" }
188
+ { name: "remove", discovery: { surface: "public", audiences: ["public", "operator"] }, summary: "Remove a global Role.", usage: "yui config role remove <name>" },
189
+ { name: "bind", discovery: { surface: "public", audiences: ["public", "operator"] }, summary: "Bind and activate an Agent for a global Role.", usage: "yui config role bind <role> <agent-id>" },
190
+ { name: "unbind", discovery: { surface: "public", audiences: ["public", "operator"] }, summary: "Unbind a dormant Agent from a global Role.", usage: "yui config role unbind <role> <agent-id>" }
188
191
  ];
189
192
  const globalSessionChildren = [
190
- { name: "enter", summary: "Enter a global Role's native session.", usage: "yui session enter <role>" },
193
+ { name: "enter", discovery: { surface: "public", audiences: ["public", "operator"] }, summary: "Enter a global Role's native session.", usage: "yui session enter <role>" },
191
194
  {
192
- name: "context",
195
+ name: "context", discovery: { surface: "managed", audiences: ["operator", "global", "unbound"] },
193
196
  summary: "Load the exact authorized global Role context.",
194
197
  usage: "yui session context <role> [--cursor <cursor>]",
195
198
  options: ["--cursor"]
196
199
  },
197
200
  {
198
- name: "record",
201
+ name: "record", discovery: { surface: "public", audiences: ["public", "operator"] },
199
202
  summary: "Record the active Agent's native session ID.",
200
203
  usage: "yui session record <role> --native-id <id>",
201
204
  options: ["--native-id"]
202
205
  },
203
206
  {
204
- name: "replace",
207
+ name: "replace", discovery: { surface: "public", audiences: ["public", "operator"] },
205
208
  summary: "Explicitly replace the active Agent's native session ID.",
206
209
  usage: "yui session replace <role> --native-id <id> --reason <text>",
207
210
  options: ["--native-id", "--reason"]
208
211
  },
209
212
  {
210
- name: "stop",
213
+ name: "stop", discovery: { surface: "public", audiences: ["public", "operator"] },
211
214
  summary: "Stop all idle managed Sessions and the Controller before an offline update.",
212
215
  usage: "yui session stop --all",
213
216
  options: ["--all"]
214
217
  },
215
218
  {
216
- name: "reconcile",
219
+ name: "reconcile", discovery: { surface: "public", audiences: ["public", "operator"] },
217
220
  summary: "Reconcile durable Session owners with native sessions.",
218
221
  usage: "yui session reconcile [--report] [--cleanup]",
219
222
  options: ["--report", "--cleanup"]
220
223
  },
221
224
  {
222
- name: "retry",
225
+ name: "retry", discovery: { surface: "public", audiences: ["public", "operator"] },
223
226
  summary: "Inspect or control bounded Provider recovery for this Global Session.",
224
227
  usage: "yui session retry <role> [show|cancel|disable|enable]"
225
228
  }
226
229
  ];
227
230
  const profileChildren = [
228
231
  {
229
- name: "add",
232
+ name: "add", discovery: { surface: "public", audiences: ["public", "operator"] },
230
233
  summary: "Add a reusable Agent Profile that inherits Worker runtime or selects one explicit Agent.",
231
234
  usage: "yui config profile add <id> [--access <read|write>] [--inherit-worker | --agent <id> [--model <model>] [--effort <effort>]] [Profile settings]",
232
235
  options: ["--access", ...agentProfileOptions],
233
236
  optionValues: { "--access": ["read", "write"] }
234
237
  },
235
- { name: "list", summary: "List Agent Profiles." },
236
- { name: "show", summary: "Show one Agent Profile.", usage: "yui config profile show <id>" },
238
+ { name: "list", discovery: { surface: "public", audiences: ["public", "operator", "leader", "assignment", "global"] }, summary: "List Agent Profiles." },
239
+ { name: "show", discovery: { surface: "public", audiences: ["public", "operator", "leader", "assignment", "global"] }, summary: "Show one Agent Profile.", usage: "yui config profile show <id>" },
237
240
  {
238
- name: "update",
241
+ name: "update", discovery: { surface: "public", audiences: ["public", "operator"] },
239
242
  summary: "Update an Agent Profile's behavior or runtime source.",
240
243
  usage: "yui config profile update <id> [--access <read|write>] [--inherit-worker | [--agent <id>] [--model <model>|--clear-model] [--effort <effort>|--clear-effort]] [Profile settings]",
241
244
  options: ["--access", ...agentProfileOptions, ...agentProfileClearOptions],
242
245
  optionValues: { "--access": ["read", "write"] }
243
246
  },
244
- { name: "remove", summary: "Remove a custom Agent Profile.", usage: "yui config profile remove <id>" },
245
- { name: "reset", summary: "Reset all built-in Agent Profiles." }
247
+ { name: "remove", discovery: { surface: "public", audiences: ["public", "operator"] }, summary: "Remove a custom Agent Profile.", usage: "yui config profile remove <id>" },
248
+ { name: "reset", discovery: { surface: "public", audiences: ["public", "operator"] }, summary: "Reset all built-in Agent Profiles." }
246
249
  ];
247
250
  const completionChildren = [
248
- { name: "bash", summary: "Interactively configure Bash completion." },
249
- { name: "zsh", summary: "Interactively configure Zsh completion." },
250
- { name: "fish", summary: "Interactively configure Fish completion." },
251
+ { name: "bash", discovery: { surface: "public", audiences: ["public", "operator"] }, summary: "Interactively configure Bash completion." },
252
+ { name: "zsh", discovery: { surface: "public", audiences: ["public", "operator"] }, summary: "Interactively configure Zsh completion." },
253
+ { name: "fish", discovery: { surface: "public", audiences: ["public", "operator"] }, summary: "Interactively configure Fish completion." },
251
254
  {
252
- name: "candidates",
255
+ name: "candidates", discovery: { surface: "runtime", audiences: [] },
253
256
  summary: "Resolve internal dynamic completion candidates.",
254
257
  usage: "yui config completion candidates <prefix> -- <words...>",
255
258
  hidden: true
@@ -257,24 +260,24 @@ const completionChildren = [
257
260
  ];
258
261
  const taskChildren = [
259
262
  {
260
- name: "create",
263
+ name: "create", discovery: { surface: "public", audiences: ["public", "operator"] },
261
264
  summary: "Create a Draft Task.",
262
265
  usage: "yui task create <title> [--type <project-defined-type>] [--project <project> ...] [--base <project>=<ref> ...]",
263
266
  options: ["--type", "--project", "--base"],
264
267
  optionValues: { "--type": ["feature", "bugfix"] }
265
268
  },
266
269
  {
267
- name: "project",
270
+ name: "project", discovery: { surface: "managed", audiences: ["operator", "leader"] },
268
271
  summary: "Manage Projects bound to a Task.",
269
272
  sections: [{ id: "manage", title: "Commands", entries: ["list", "add"] }],
270
273
  children: [
271
274
  {
272
- name: "list",
275
+ name: "list", discovery: { surface: "public", audiences: ["public", "operator", "leader"] },
273
276
  summary: "List the Projects bound to a Task.",
274
277
  usage: "yui task project list <task>"
275
278
  },
276
279
  {
277
- name: "add",
280
+ name: "add", discovery: { surface: "public", audiences: ["public", "operator", "leader"] },
278
281
  summary: "Add a Project to a Task.",
279
282
  usage: "yui task project add <task> <project> [--base <ref>] [--directory <name>]",
280
283
  options: ["--base", "--directory"]
@@ -282,7 +285,7 @@ const taskChildren = [
282
285
  ]
283
286
  },
284
287
  {
285
- name: "update",
288
+ name: "update", discovery: { surface: "public", audiences: ["public", "operator", "leader"] },
286
289
  summary: "Update Task metadata.",
287
290
  usage: "yui task update <id> [--title <text>] [--type <project-defined-type>|--clear-type] [--description <text>|--clear-description] [--priority <low|medium|high|urgent>|--clear-priority] [--tags <comma-separated>|--clear-tags] [--due-at <RFC3339>|--clear-due-at]",
288
291
  options: [
@@ -295,14 +298,14 @@ const taskChildren = [
295
298
  "--type": ["feature", "bugfix"]
296
299
  }
297
300
  },
298
- { name: "activate", summary: "Adopt an existing Activation request for a Draft Task.", usage: "yui task activate <id>" },
301
+ { name: "activate", discovery: { surface: "public", audiences: ["public", "operator", "leader"] }, summary: "Adopt an existing Activation request for a Draft Task.", usage: "yui task activate <id>" },
299
302
  {
300
- name: "activation",
303
+ name: "activation", discovery: { surface: "managed", audiences: ["operator", "leader"] },
301
304
  summary: "Request, cancel or inspect explicit Task Activation.",
302
305
  sections: [{ id: "manage", title: "Commands", entries: ["request", "cancel", "show"] }],
303
306
  children: [
304
307
  {
305
- name: "request",
308
+ name: "request", discovery: { surface: "public", audiences: ["public", "operator", "leader"] },
306
309
  summary: "Record an Activation request. Every active Task gets a managed main workspace. empty adds no execution environment; scratch adopts a separate scratch environment; local requires a registered Resource and grant, not a Project ID.",
307
310
  usage: "yui task activation request <task> --request-id <id> "
308
311
  + "--environment <empty|scratch|local:<resource>:<read|write>>",
@@ -313,126 +316,126 @@ const taskChildren = [
313
316
  ]
314
317
  },
315
318
  {
316
- name: "cancel",
319
+ name: "cancel", discovery: { surface: "public", audiences: ["public", "operator", "leader"] },
317
320
  summary: "Cancel a pending Activation request so it is never adopted.",
318
321
  usage: "yui task activation cancel <task> --request-id <id> --reason <text>",
319
322
  options: ["--request-id", "--reason"]
320
323
  },
321
324
  {
322
- name: "show",
325
+ name: "show", discovery: { surface: "public", audiences: ["public", "operator", "leader"] },
323
326
  summary: "Show the Task's Activation request and its disposition.",
324
327
  usage: "yui task activation show <task>"
325
328
  }
326
329
  ]
327
330
  },
328
331
  {
329
- name: "execution",
332
+ name: "execution", discovery: { surface: "managed", audiences: ["operator", "leader"] },
330
333
  summary: "Fence or resume all execution for a Task.",
331
334
  sections: [{ id: "manage", title: "Commands", entries: ["stop", "start"] }],
332
335
  children: [
333
336
  {
334
- name: "stop",
337
+ name: "stop", discovery: { surface: "public", audiences: ["public", "operator"] },
335
338
  summary: "Stop all Task execution while preserving durable progress.",
336
339
  usage: "yui task execution stop <task> --force --reason <text>",
337
340
  options: ["--force", "--reason"]
338
341
  },
339
342
  {
340
- name: "start",
343
+ name: "start", discovery: { surface: "public", audiences: ["public", "operator"] },
341
344
  summary: "Resume the Leader from durable Task progress.",
342
345
  usage: "yui task execution start <task>"
343
346
  }
344
347
  ]
345
348
  },
346
349
  {
347
- name: "complete",
350
+ name: "complete", discovery: { surface: "managed", audiences: ["operator", "leader"] },
348
351
  summary: "Complete locally, or prepare/dispatch the configured final Review and remain active. --refresh-remote only fetches freshness observations; it never rebases, changes HEAD or starts Integration checks.",
349
352
  usage: "yui task complete <id> (--summary <text>|--summary-file <path|->) [--artifact-ref <artifact-id|turn:id|url> ...] [--refresh-remote] [--accept-published-tree <publication-id>]",
350
353
  options: ["--summary", "--summary-file", "--artifact-ref", "--refresh-remote", "--accept-published-tree"],
351
354
  fileOptions: ["--summary-file"]
352
355
  },
353
356
  {
354
- name: "base",
357
+ name: "base", discovery: { surface: "managed", audiences: ["operator", "leader"] },
355
358
  summary: "Inspect Task Project baseline freshness.",
356
359
  sections: [{ id: "manage", title: "Commands", entries: ["status"] }],
357
360
  children: [
358
361
  {
359
- name: "status",
362
+ name: "status", discovery: { surface: "managed", audiences: ["operator", "leader"] },
360
363
  summary: "Observe Task Project bases against local refs; --refresh fetches remote objects without changing HEAD, starting checks or creating Integration/Review.",
361
364
  usage: "yui task base status <task> [--refresh]",
362
365
  options: ["--refresh"]
363
366
  }
364
367
  ]
365
368
  },
366
- { name: "reopen", summary: "Explicitly reopen completed or cancelled intent without replaying historical inputs.", usage: "yui task reopen <id>" },
369
+ { name: "reopen", discovery: { surface: "public", audiences: ["public", "operator"] }, summary: "Explicitly reopen completed or cancelled intent without replaying historical inputs.", usage: "yui task reopen <id>" },
367
370
  {
368
- name: "cancel",
371
+ name: "cancel", discovery: { surface: "public", audiences: ["public", "operator", "leader"] },
369
372
  summary: "Stop pursuing a Task without claiming its processes stopped.",
370
373
  usage: "yui task cancel <task> (--summary <text>|--summary-file <path|->)",
371
374
  options: ["--summary", "--summary-file"],
372
375
  fileOptions: ["--summary-file"]
373
376
  },
374
377
  {
375
- name: "retire",
378
+ name: "retire", discovery: { surface: "public", audiences: ["public", "operator"] },
376
379
  summary: "Retire a stale Task while preserving its historical evidence.",
377
380
  usage: "yui task retire <task> (--summary <text>|--summary-file <path|->) [--replacement <task>]",
378
381
  options: ["--summary", "--summary-file", "--replacement"],
379
382
  fileOptions: ["--summary-file"]
380
383
  },
381
384
  {
382
- name: "list",
385
+ name: "list", discovery: { surface: "public", audiences: ["public", "operator", "leader"] },
383
386
  summary: "Discover Tasks through a bounded, filterable catalog.",
384
387
  usage: "yui task list [--all] [--status <status>] [--project <id>] [--search <text>] [--attention <category>] [--limit <1..100>] [--cursor <cursor>]",
385
388
  options: ["--all", "--status", "--project", "--search", "--attention", "--limit", "--cursor"]
386
389
  },
387
- { name: "show", summary: "Show Task metadata and counts; long details use contentPage.", usage: "yui task show <id> [--cursor <cursor>]", options: ["--cursor"] },
390
+ { name: "show", discovery: { surface: "public", audiences: ["public", "operator", "leader", "assignment"] }, summary: "Show Task metadata and counts; long details use contentPage.", usage: "yui task show <id> [--cursor <cursor>]", options: ["--cursor"] },
388
391
  {
389
- name: "artifact",
392
+ name: "artifact", discovery: { surface: "managed", audiences: ["operator", "leader"] },
390
393
  summary: "Save Task files in local Git and read current or commit-pinned content.",
391
394
  sections: [{ id: "manage", title: "Commands", entries: ["list", "read", "save"] }],
392
395
  children: [
393
- { name: "list", summary: "List saved Task artifacts.", usage: "yui task artifact list <task>" },
394
- { name: "read", summary: "Read a file at HEAD or an exact commit.", usage: "yui task artifact read <task> <relative-path> [<commit>]" },
395
- { name: "save", summary: "Save and locally commit one file.", usage: "yui task artifact save <task> <relative-path> <content> [--message <text>] [--expected-head <commit>]", options: ["--message", "--expected-head"] }
396
+ { name: "list", discovery: { surface: "public", audiences: ["public", "operator", "leader", "assignment"] }, summary: "List saved Task artifacts.", usage: "yui task artifact list <task>" },
397
+ { name: "read", discovery: { surface: "public", audiences: ["public", "operator", "leader", "assignment"] }, summary: "Read a file at HEAD or an exact commit.", usage: "yui task artifact read <task> <relative-path> [<commit>]" },
398
+ { name: "save", discovery: { surface: "managed", audiences: ["operator", "leader"] }, summary: "Save and locally commit one file.", usage: "yui task artifact save <task> <relative-path> <content> [--message <text>] [--expected-head <commit>]", options: ["--message", "--expected-head"] }
396
399
  ]
397
400
  },
398
401
  {
399
- name: "context",
402
+ name: "context", discovery: { surface: "public", audiences: ["public", "operator", "leader", "assignment", "unbound"] },
400
403
  summary: "Read compact authorized facts, fixed-bound delta, or inspect a Context reference.",
401
404
  usage: "yui task context [read|list|delta|inspect] <task> [--after <cursor>] [--continuation <cursor>] [--cursor <cursor>] [--limit <n>] [--store <store> --ref <id>] [--digest <digest>]",
402
405
  options: ["--after", "--continuation", "--cursor", "--limit", "--store", "--ref", "--digest", "--status", "--work-item"]
403
406
  },
404
407
  {
405
- name: "next-action",
408
+ name: "next-action", discovery: { surface: "managed", audiences: ["operator", "leader"] },
406
409
  summary: "Read Task facts, mechanical prerequisites and legal alternatives; semantic choices remain with the Leader.",
407
410
  usage: "yui task next-action <task> [--cursor <cursor>] [--json]",
408
411
  options: ["--cursor", "--json"]
409
412
  },
410
413
  {
411
- name: "remote-delivery",
414
+ name: "remote-delivery", discovery: { surface: "public", audiences: ["public", "operator", "leader"] },
412
415
  summary: "Project exact Task heads and current PR/MR evidence into merge coverage.",
413
416
  usage: "yui task remote-delivery <task> [--cursor <cursor>] [--json]",
414
417
  options: ["--cursor", "--json"]
415
418
  },
416
419
  {
417
- name: "archive-preflight",
420
+ name: "archive-preflight", discovery: { surface: "public", audiences: ["public", "operator", "leader"] },
418
421
  summary: "Inspect current archive and exact-owner cleanup blockers without changing state or authorizing removal.",
419
422
  usage: "yui task archive-preflight <id> (--integrated|--abandon) [--force] [--json]",
420
423
  options: ["--integrated", "--abandon", "--force", "--json"]
421
424
  },
422
425
  {
423
- name: "archive",
426
+ name: "archive", discovery: { surface: "public", audiences: ["public", "operator", "leader"], optionAudiences: { "--force": ["public", "operator"] } },
424
427
  summary: "Archive a terminal Task; explicit --force commits despite delivery/cleanup warnings, retaining unsafe resources.",
425
428
  usage: "yui task archive <id> (--integrated|--abandon) [--force] [--source-message <id> --purpose <verbatim-authorization> --request-id <id>]",
426
429
  options: ["--integrated", "--abandon", "--force", "--source-message", "--purpose", "--request-id"]
427
430
  },
428
- { name: "reconcile", summary: "Run one immediate Controller reconciliation.", usage: "yui task reconcile <id>" },
431
+ { name: "reconcile", discovery: { surface: "managed", audiences: ["operator", "leader"] }, summary: "Run one immediate Controller reconciliation.", usage: "yui task reconcile <id>" },
429
432
  {
430
- name: "upstream",
433
+ name: "upstream", discovery: { surface: "managed", audiences: ["operator", "leader"] },
431
434
  summary: "Integrate upstream changes into an Active Task workspace.",
432
435
  sections: [{ id: "manage", title: "Commands", entries: ["integrate"] }],
433
436
  children: [
434
437
  {
435
- name: "integrate",
438
+ name: "integrate", discovery: { surface: "managed", audiences: ["operator", "leader"] },
436
439
  summary: "Explicitly rebase Task changes onto the remote development head, run configured/additional checks (possibly as Jobs), then advance HEAD through Integration CAS. Returns exact attempts and partial results; does not request Review or complete the Task.",
437
440
  usage: "yui task upstream integrate <task> (--latest|--project <project>) [--check <command> ...] [--rerun-checks]",
438
441
  options: ["--latest", "--project", "--check", "--rerun-checks"]
@@ -440,25 +443,25 @@ const taskChildren = [
440
443
  ]
441
444
  },
442
445
  {
443
- name: "replace",
446
+ name: "replace", discovery: { surface: "public", audiences: ["public", "operator"] },
444
447
  summary: "Create a draft successor for a terminal Task.",
445
448
  usage: "yui task replace <task> [--title <text>]",
446
449
  options: ["--title"]
447
450
  },
448
451
  {
449
- name: "message",
452
+ name: "message", discovery: { surface: "managed", audiences: ["operator", "leader"] },
450
453
  summary: "Manage durable Task messages.",
451
454
  sections: [{ id: "manage", title: "Commands", entries: ["send", "queue", "steer", "handoff", "list", "show", "update", "retire"] }],
452
455
  children: [
453
456
  {
454
- name: "handoff",
457
+ name: "handoff", discovery: { surface: "managed", audiences: ["operator", "leader"] },
455
458
  summary: "Explicitly hand an unassigned Message to the current dispatched owner of the same work.",
456
459
  usage: "yui task message handoff <task/message> --to <role>",
457
460
  options: ["--to"]
458
461
  },
459
462
  {
460
- name: "send",
461
- summary: "Send a Task message. An unaddressed user/operator message carries a submission intent (record|discuss|develop) and an optional idempotency key.",
463
+ name: "send", discovery: { surface: "managed", audiences: ["operator", "leader", "assignment"], optionAudiences: { "--intent": ["public", "operator"] } },
464
+ summary: "Send durable Task input within the current caller's routing and Assignment boundary.",
462
465
  usage: "yui task message send <id> (<body>|--body-file <path|->) [--intent record|discuss|develop] [--request-id <key>] [--to <role> --work-item <id>|--review-round <id>]",
463
466
  options: ["--body-file", "--intent", "--request-id", "--to", "--work-item", "--review-round"],
464
467
  optionValues: {
@@ -467,40 +470,40 @@ const taskChildren = [
467
470
  fileOptions: ["--body-file"]
468
471
  },
469
472
  {
470
- name: "queue",
473
+ name: "queue", discovery: { surface: "managed", audiences: ["operator", "leader"] },
471
474
  summary: "Queue ordinary Leader input without --to; an explicit Role requires an existing WorkItem/ReviewRound Assignment. Idempotent by request id.",
472
475
  usage: "yui task message queue <id> (<body>|--body-file <path|->) --request-id <id> [--to <role> (--work-item <id>|--review-round <id>)]",
473
476
  options: ["--body-file", "--request-id", "--to", "--work-item", "--review-round"],
474
477
  fileOptions: ["--body-file"]
475
478
  },
476
479
  {
477
- name: "steer",
480
+ name: "steer", discovery: { surface: "managed", audiences: ["operator", "leader"] },
478
481
  summary: "Steer only a Role's exact current native Turn; saved and reported without fallback when unsupported.",
479
482
  usage: "yui task message steer <id> (<body>|--body-file <path|->) --request-id <id> --expected-target <turn> --to <role> [--work-item <id>|--review-round <id>]",
480
483
  options: ["--body-file", "--request-id", "--expected-target", "--to", "--work-item", "--review-round"],
481
484
  fileOptions: ["--body-file"]
482
485
  },
483
486
  {
484
- name: "list",
487
+ name: "list", discovery: { surface: "public", audiences: ["public", "operator", "leader", "assignment"] },
485
488
  summary: "List Task messages.",
486
489
  usage: "yui task message list <id> [--after <timestamp>] [--limit <1..100>] [--cursor <cursor>]",
487
490
  options: ["--after", "--limit", "--cursor"]
488
491
  },
489
492
  {
490
- name: "show",
493
+ name: "show", discovery: { surface: "public", audiences: ["public", "operator", "leader", "assignment"] },
491
494
  summary: "Read a scoped Message and expand its single execution result.",
492
495
  usage: "yui task message show <task>/<message> [--cursor <cursor>]",
493
496
  options: ["--cursor"]
494
497
  },
495
498
  {
496
- name: "update",
499
+ name: "update", discovery: { surface: "managed", audiences: ["operator", "leader"] },
497
500
  summary: "Edit unkeyed Draft context without changing intent; inputs with request identities require a new Message.",
498
501
  usage: "yui task message update <task>/<message> (<body>|--body-file <path|->)",
499
502
  options: ["--body-file"],
500
503
  fileOptions: ["--body-file"]
501
504
  },
502
505
  {
503
- name: "retire",
506
+ name: "retire", discovery: { surface: "managed", audiences: ["operator", "leader"] },
504
507
  summary: "Retire an incorrect historical Task Message without deleting its audit record.",
505
508
  usage: "yui task message retire <task>/<message> --reason <text>",
506
509
  options: ["--reason"]
@@ -508,36 +511,36 @@ const taskChildren = [
508
511
  ]
509
512
  },
510
513
  {
511
- name: "input",
514
+ name: "input", discovery: { surface: "managed", audiences: ["operator", "leader"] },
512
515
  summary: "Manage durable Task-owned input requests.",
513
516
  sections: [{ id: "manage", title: "Commands", entries: ["request", "list", "show", "answer", "cancel"] }],
514
517
  children: [
515
518
  {
516
- name: "request",
519
+ name: "request", discovery: { surface: "managed", audiences: ["leader"] },
517
520
  summary: "Pause the active Leader AgentRun and request user input.",
518
521
  usage: "yui task input request <task> --question <text> [--choice <key=label> ...] [--blocks <work-item:id|turn:id> ...] [--recommend <key> --timeout-seconds <seconds>]",
519
522
  options: ["--question", "--choice", "--blocks", "--recommend", "--timeout-seconds"]
520
523
  },
521
524
  {
522
- name: "list",
525
+ name: "list", discovery: { surface: "public", audiences: ["public", "operator", "leader", "assignment"] },
523
526
  summary: "List the global Inbox or one Task's input requests.",
524
527
  usage: "yui task input list [task] [--all] [--limit <1..100>] [--cursor <cursor>]",
525
528
  options: ["--all", "--limit", "--cursor"]
526
529
  },
527
530
  {
528
- name: "show",
531
+ name: "show", discovery: { surface: "public", audiences: ["public", "operator", "leader", "assignment"] },
529
532
  summary: "Show one input request.",
530
533
  usage: "yui task input show (<task>/<input> | <input> --task <task>) [--cursor <cursor>]",
531
534
  options: ["--task", "--cursor"]
532
535
  },
533
536
  {
534
- name: "answer",
537
+ name: "answer", discovery: { surface: "public", audiences: ["public", "operator"] },
535
538
  summary: "Answer one open input request.",
536
539
  usage: "yui task input answer (<task>/<input> | <input> --task <task>) (--choice <key> | --text <text>)",
537
540
  options: ["--task", "--choice", "--text"]
538
541
  },
539
542
  {
540
- name: "cancel",
543
+ name: "cancel", discovery: { surface: "managed", audiences: ["leader"] },
541
544
  summary: "Cancel an open request from its originating Leader.",
542
545
  usage: "yui task input cancel <task> <input> --reason <text>",
543
546
  options: ["--reason"]
@@ -545,28 +548,28 @@ const taskChildren = [
545
548
  ]
546
549
  },
547
550
  {
548
- name: "grant",
551
+ name: "grant", discovery: { surface: "managed", audiences: ["operator", "leader"] },
549
552
  summary: "Manage Task grants as Operator, or bounded source-authorized grants as the current delivery Leader.",
550
553
  sections: [{ id: "manage", title: "Commands", entries: ["issue", "show", "list", "revoke"] }],
551
554
  children: [
552
555
  {
553
- name: "issue",
556
+ name: "issue", discovery: { surface: "managed", audiences: ["operator", "leader"] },
554
557
  summary: "Issue as Operator, or as current delivery Leader with --source-message, --purpose, --request-id, exact scope, expiry and finite uses.",
555
558
  usage: "yui task grant issue <task> --action <name> (repeatable) [--scope-project <id>...] [--scope-repo <owner/name>...] [--scope-package <name>...] [--scope-home <path>] [--param <name=v1,v2>...] [--expires-at <iso-8601>] [--max-uses <int>] [--irreversibility-ceiling <none|reversible|irreversible>]",
556
559
  options: ["--action", "--scope-project", "--scope-repo", "--scope-package", "--scope-home", "--param", "--expires-at", "--max-uses", "--irreversibility-ceiling", "--source-message", "--purpose", "--request-id"]
557
560
  },
558
561
  {
559
- name: "show",
562
+ name: "show", discovery: { surface: "managed", audiences: ["operator", "leader"] },
560
563
  summary: "Show one capability grant.",
561
564
  usage: "yui task grant show <task> <grant-id>"
562
565
  },
563
566
  {
564
- name: "list",
567
+ name: "list", discovery: { surface: "managed", audiences: ["operator", "leader"] },
565
568
  summary: "List capability grants for a Task.",
566
569
  usage: "yui task grant list <task>"
567
570
  },
568
571
  {
569
- name: "revoke",
572
+ name: "revoke", discovery: { surface: "managed", audiences: ["operator", "leader"] },
570
573
  summary: "Revoke as Operator, or this Task's current delivery Leader for a Leader-issued grant.",
571
574
  usage: "yui task grant revoke <task> <grant-id>",
572
575
  options: []
@@ -574,88 +577,88 @@ const taskChildren = [
574
577
  ]
575
578
  },
576
579
  {
577
- name: "workflow",
580
+ name: "workflow", discovery: { surface: "managed", audiences: ["operator", "leader"] },
578
581
  summary: "Manage release workflows for a Task.",
579
582
  sections: [{ id: "manage", title: "Commands", entries: ["create", "show", "list", "run", "resume", "status"] }],
580
583
  children: [
581
584
  {
582
- name: "create",
585
+ name: "create", discovery: { surface: "managed", audiences: ["operator", "leader"] },
583
586
  summary: "Create a release workflow for a Task.",
584
587
  usage: "yui task workflow create <task> --grant <grant-id> --source-repo <owner/name> --source-commit <sha> [--source-artifact <name@integrity>] --step <id>:<kind> (repeatable) [--step-irreversibility <id>=<level> (repeatable)] [--step-param <id>:<key>=<value> (repeatable)]",
585
588
  options: ["--grant", "--source-repo", "--source-commit", "--source-artifact", "--step", "--step-irreversibility", "--step-param"]
586
589
  },
587
590
  {
588
- name: "show",
591
+ name: "show", discovery: { surface: "managed", audiences: ["operator", "leader"] },
589
592
  summary: "Show one release workflow.",
590
593
  usage: "yui task workflow show <task> <workflow-id>"
591
594
  },
592
595
  {
593
- name: "list",
596
+ name: "list", discovery: { surface: "managed", audiences: ["operator", "leader"] },
594
597
  summary: "List release workflows for a Task.",
595
598
  usage: "yui task workflow list <task>"
596
599
  },
597
600
  {
598
- name: "run",
601
+ name: "run", discovery: { surface: "managed", audiences: ["operator", "leader"] },
599
602
  summary: "Run a release workflow from its resume cursor.",
600
603
  usage: "yui task workflow run <task> <workflow-id> [--grant <grant-id>] [--max-steps <int>]",
601
604
  options: ["--grant", "--max-steps"]
602
605
  },
603
606
  {
604
- name: "resume",
607
+ name: "resume", discovery: { surface: "managed", audiences: ["operator", "leader"] },
605
608
  summary: "Resume a release workflow from its first unconfirmed step.",
606
609
  usage: "yui task workflow resume <task> <workflow-id> [--grant <grant-id>] [--max-steps <int>]",
607
610
  options: ["--grant", "--max-steps"]
608
611
  },
609
612
  {
610
- name: "status",
613
+ name: "status", discovery: { surface: "managed", audiences: ["operator", "leader"] },
611
614
  summary: "Show a release workflow and its step states.",
612
615
  usage: "yui task workflow status <task> <workflow-id>"
613
616
  }
614
617
  ]
615
618
  },
616
619
  {
617
- name: "publication",
620
+ name: "publication", discovery: { surface: "managed", audiences: ["operator", "leader"] },
618
621
  summary: "Create or update external PR/MR publication evidence for a Task.",
619
622
  sections: [{ id: "manage", title: "Commands", entries: ["upsert", "diff", "adopt", "verify", "list", "show"] }],
620
623
  children: [
621
624
  {
622
- name: "upsert",
625
+ name: "upsert", discovery: { surface: "managed", audiences: ["operator", "leader"] },
623
626
  summary: "Create or immutably update an external PR/MR and its publication state.",
624
627
  usage: "yui task publication upsert <task> --project <project> --provider <github|gitlab> --repository <owner/name> --kind <pull-request|merge-request> --id <external-id> [--url <url>] [--title <text>] [--source-branch <branch>] [--target-branch <branch>] [--local-commit <sha>] [--head-commit <sha>] [--remote-commit <sha>] [--state <open|merged|closed>] [--reported|--verified] [--evidence <text>] [--merged-at <iso-timestamp>]",
625
628
  options: ["--project", "--provider", "--repository", "--kind", "--id", "--url", "--title", "--source-branch", "--target-branch", "--local-commit", "--head-commit", "--remote-commit", "--state", "--reported", "--verified", "--evidence", "--merged-at"]
626
629
  },
627
630
  {
628
- name: "diff",
631
+ name: "diff", discovery: { surface: "managed", audiences: ["operator", "leader"] },
629
632
  summary: "Read a completed Task's fixed acceptance-to-publication candidate diff using local Git only.",
630
633
  usage: "yui task publication diff <task>/<publication> [--integration <id>]",
631
634
  options: ["--integration"]
632
635
  },
633
636
  {
634
- name: "adopt",
637
+ name: "adopt", discovery: { surface: "managed", audiences: ["operator", "leader"] },
635
638
  summary: "Explicitly accept the reviewed publication candidate as covering the original completion.",
636
639
  usage: "yui task publication adopt <task>/<publication> --reviewed-diff <sha256> --acceptance <text> [--integration <id>]",
637
640
  options: ["--reviewed-diff", "--acceptance", "--integration"]
638
641
  },
639
642
  {
640
- name: "verify",
643
+ name: "verify", discovery: { surface: "managed", audiences: ["operator", "leader"] },
641
644
  summary: "Observe the current PR/MR head and merge through its provider; record verification separately from Task coverage.",
642
645
  usage: "yui task publication verify (<task>/<publication-id> | <task> <publication-id>)"
643
646
  },
644
647
  {
645
- name: "list",
648
+ name: "list", discovery: { surface: "public", audiences: ["public", "operator", "leader"] },
646
649
  summary: "List external publication evidence for a Task.",
647
650
  usage: "yui task publication list <task> [--limit <1..100>] [--cursor <cursor>]",
648
651
  options: ["--limit", "--cursor"]
649
652
  },
650
653
  {
651
- name: "show",
654
+ name: "show", discovery: { surface: "public", audiences: ["public", "operator", "leader"] },
652
655
  summary: "Show one external publication reference.",
653
656
  usage: "yui task publication show (<task>/<publication-id> | <task> <publication-id>)"
654
657
  }
655
658
  ]
656
659
  },
657
660
  {
658
- name: "role",
661
+ name: "role", discovery: { surface: "managed", audiences: ["operator", "leader"] },
659
662
  summary: "Manage Roles within a Task.",
660
663
  sections: [{ id: "manage", title: "Commands", entries: [
661
664
  "add", "list", "status", "show", "update", "remove", "bind", "unbind",
@@ -663,59 +666,59 @@ const taskChildren = [
663
666
  ] }],
664
667
  children: [
665
668
  {
666
- name: "add",
669
+ name: "add", discovery: { surface: "managed", audiences: ["operator", "leader"] },
667
670
  summary: "Add a Task Role from a frozen Profile/Worker runtime or one explicit Agent.",
668
671
  usage: "yui task role add <task> <name> [--profile <id>] [--agent <id> [Agent settings]] [Role settings]",
669
672
  options: ["--profile", "--agent", ...roleProfileOptions, ...roleAgentOptions],
670
673
  optionValues: roleAgentOptionValues
671
674
  },
672
- { name: "list", summary: "Discover recorded Role health; Host is unchecked until role status.", usage: "yui task role list <task> [--limit <1..100>] [--cursor <cursor>]", options: ["--limit", "--cursor"] },
675
+ { name: "list", discovery: { surface: "managed", audiences: ["operator", "leader"] }, summary: "Discover recorded Role health; Host is unchecked until role status.", usage: "yui task role list <task> [--limit <1..100>] [--cursor <cursor>]", options: ["--limit", "--cursor"] },
673
676
  {
674
- name: "status",
677
+ name: "status", discovery: { surface: "managed", audiences: ["operator", "leader"] },
675
678
  summary: "Show persisted and live runtime state for one Task Role.",
676
679
  usage: "yui task role status <task> <role> [--cursor <cursor>]",
677
680
  options: ["--cursor"]
678
681
  },
679
- { name: "show", summary: "Show one Task Role.", usage: "yui task role show <task> <role> [--cursor <cursor>]", options: ["--cursor"] },
680
- { name: "capabilities", summary: "Read native options using this Role's desired or exact failed launch configuration.",
682
+ { name: "show", discovery: { surface: "managed", audiences: ["operator", "leader"] }, summary: "Show one Task Role.", usage: "yui task role show <task> <role> [--cursor <cursor>]", options: ["--cursor"] },
683
+ { name: "capabilities", discovery: { surface: "managed", audiences: ["operator", "leader"] }, summary: "Read native options using this Role's desired or exact failed launch configuration.",
681
684
  usage: "yui task role capabilities <task> <role> [--error <event-id>] [--refresh]",
682
685
  options: ["--error", "--refresh"] },
683
686
  {
684
- name: "update",
687
+ name: "update", discovery: { surface: "managed", audiences: ["operator", "leader"] },
685
688
  summary: "Update a Task Role; Agent settings target the named or active binding without switching it.",
686
689
  usage: "yui task role update <task> <role> [--profile <id>] [--agent <id>] [--environment <preparation-id> | --managed-environment] [Role and Agent settings]",
687
690
  options: ["--profile", "--agent", "--environment", "--managed-environment", ...roleProfileOptions, ...roleAgentOptions,
688
691
  ...roleProfileClearOptions, ...roleAgentClearOptions, "--yes"],
689
692
  optionValues: roleAgentOptionValues
690
693
  },
691
- { name: "remove", summary: "Remove a Task Role.", usage: "yui task role remove <task> <role>" },
692
- { name: "bind", summary: "Bind and activate an Agent for a Task Role.", usage: "yui task role bind <task> <role> <agent-id>" },
693
- { name: "unbind", summary: "Unbind a dormant Agent from a Task Role.", usage: "yui task role unbind <task> <role> <agent-id>" },
694
+ { name: "remove", discovery: { surface: "managed", audiences: ["operator", "leader"] }, summary: "Remove a Task Role.", usage: "yui task role remove <task> <role>" },
695
+ { name: "bind", discovery: { surface: "managed", audiences: ["operator", "leader"] }, summary: "Bind and activate an Agent for a Task Role.", usage: "yui task role bind <task> <role> <agent-id>" },
696
+ { name: "unbind", discovery: { surface: "managed", audiences: ["operator", "leader"] }, summary: "Unbind a dormant Agent from a Task Role.", usage: "yui task role unbind <task> <role> <agent-id>" },
694
697
  {
695
- name: "session",
698
+ name: "session", discovery: { surface: "managed", audiences: ["operator", "leader"] },
696
699
  summary: "Inspect, stop or explicitly select a new Task Role Session.",
697
700
  executable: true,
698
701
  sections: [{ id: "manage", title: "Commands", entries: ["inspect", "retry", "stop", "new"] }],
699
702
  children: [
700
703
  {
701
- name: "retry",
704
+ name: "retry", discovery: { surface: "managed", audiences: ["operator", "leader"] },
702
705
  summary: "Inspect or control Provider recovery without stopping an admitted Turn.",
703
706
  usage: "yui task role session retry <task> <role> [show|cancel|disable|enable]"
704
707
  },
705
708
  {
706
- name: "inspect",
709
+ name: "inspect", discovery: { surface: "managed", audiences: ["operator", "leader"] },
707
710
  summary: "Read the current Session, Host process, and AgentRun facts.",
708
711
  usage: "yui task role session inspect <task> <role> [--cursor <cursor>]",
709
712
  options: ["--cursor"]
710
713
  },
711
714
  {
712
- name: "stop",
715
+ name: "stop", discovery: { surface: "managed", audiences: ["operator", "leader"] },
713
716
  summary: "Stop the exact Session execution and retain its conversation for possible reuse; preserve Task progress.",
714
717
  usage: "yui task role session stop <task> <role> --reason <text>",
715
718
  options: ["--reason"]
716
719
  },
717
720
  {
718
- name: "new",
721
+ name: "new", discovery: { surface: "managed", audiences: ["operator", "leader"] },
719
722
  summary: "Request replacement even for active or ended Sessions; stop exact execution and preserve Task context, results and workspaces.",
720
723
  usage: "yui task role session new <task> <role> --reason <text>",
721
724
  options: ["--reason"]
@@ -723,30 +726,30 @@ const taskChildren = [
723
726
  ]
724
727
  },
725
728
  {
726
- name: "view",
729
+ name: "view", discovery: { surface: "managed", audiences: ["operator", "leader"] },
727
730
  summary: "Attach read-only to an independent Provider presentation surface.",
728
731
  usage: "yui task role view <task> <role>"
729
732
  },
730
733
  {
731
- name: "interrupt",
734
+ name: "interrupt", discovery: { surface: "managed", audiences: ["operator", "leader"] },
732
735
  summary: "Interrupt a Role's exact current native Turn via native cancel; optionally deliver a saved Message once after a proven terminal.",
733
736
  usage: "yui task role interrupt <task> <role> --expected-target <turn> [--then-message <task/message>] [--request-id <id>]",
734
737
  options: ["--expected-target", "--then-message", "--request-id"]
735
738
  },
736
739
  {
737
- name: "takeover",
740
+ name: "takeover", discovery: { surface: "managed", audiences: ["operator", "leader"] },
738
741
  summary: "Enter the PTY input gateway for an independent Provider process.",
739
742
  usage: "yui task role takeover <task> <role>"
740
743
  },
741
744
  {
742
- name: "release",
745
+ name: "release", discovery: { surface: "managed", audiences: ["operator", "leader"] },
743
746
  summary: "Release an independent Provider PTY input gateway.",
744
747
  usage: "yui task role release <task> <role>"
745
748
  }
746
749
  ]
747
750
  },
748
751
  {
749
- name: "work",
752
+ name: "work", discovery: { surface: "managed", audiences: ["operator", "leader"] },
750
753
  summary: "Manage finite Task work items.",
751
754
  sections: [{
752
755
  id: "manage",
@@ -758,15 +761,15 @@ const taskChildren = [
758
761
  }],
759
762
  children: [
760
763
  {
761
- name: "create",
764
+ name: "create", discovery: { surface: "managed", audiences: ["operator", "leader"] },
762
765
  summary: "Create a separately managed result; a coherent Task may use zero WorkItems. Omit --role for Leader-direct execution; --role (including leader) selects a managed AgentRun executor. Isolate writable direct work before editing, then submit, integrate and accept its Candidate.",
763
766
  usage: "yui task work create <task> <title> [--project <project> ...] [--base-ref <project>=<ref> ...] [--objective <text>] [--accept <criterion> ...] [--after <work> ...] [--role <name>]",
764
767
  options: ["--project", "--base-ref", "--objective", "--accept", "--after", "--role"]
765
768
  },
766
- { name: "list", summary: "Discover work items by summary and exact reference.", usage: "yui task work list <task> [--limit <1..100>] [--cursor <cursor>]", options: ["--limit", "--cursor"] },
767
- { name: "show", summary: "Show one Work Item.", usage: "yui task work show <work> [--cursor <cursor>]", options: ["--cursor"] },
769
+ { name: "list", discovery: { surface: "managed", audiences: ["operator", "leader", "assignment"] }, summary: "Discover work items by summary and exact reference.", usage: "yui task work list <task> [--limit <1..100>] [--cursor <cursor>]", options: ["--limit", "--cursor"] },
770
+ { name: "show", discovery: { surface: "managed", audiences: ["operator", "leader", "assignment"] }, summary: "Show one Work Item.", usage: "yui task work show <work> [--cursor <cursor>]", options: ["--cursor"] },
768
771
  {
769
- name: "edit",
772
+ name: "edit", discovery: { surface: "managed", audiences: ["operator", "leader"] },
770
773
  summary: "Edit current requirements without changing frozen Assignments or acceptance.",
771
774
  usage: "yui task work edit <task>/<work> [--title <text>] [--objective <text>] [--accept <criterion> ...|--clear-acceptance] [--after <work> ...|--clear-dependencies] [--project <project> ...|--clear-projects] [--base-ref <project>=<ref> ...|--clear-base-refs] [--role <name>|--clear-role]",
772
775
  options: [
@@ -776,7 +779,7 @@ const taskChildren = [
776
779
  ]
777
780
  },
778
781
  {
779
- name: "update",
782
+ name: "update", discovery: { surface: "managed", audiences: ["operator", "leader"] },
780
783
  summary: "Record progress or submit a Candidate; acceptance remains explicit.",
781
784
  usage: "yui task work update <task>/<work> <todo|running|done|failed> [--summary <text>] [--artifact-ref <artifact-id> ...]",
782
785
  options: ["--summary", "--artifact-ref"],
@@ -785,41 +788,41 @@ const taskChildren = [
785
788
  }
786
789
  },
787
790
  {
788
- name: "scope",
791
+ name: "scope", discovery: { surface: "managed", audiences: ["operator", "leader"] },
789
792
  summary: "Expand the Projects a WorkItem may modify.",
790
793
  usage: "yui task work scope <task>/<work> [--project <project> ...]",
791
794
  options: ["--project"]
792
795
  },
793
796
  {
794
- name: "dispatch",
797
+ name: "dispatch", discovery: { surface: "managed", audiences: ["operator", "leader"] },
795
798
  summary: "Dispatch a work item to its Role.",
796
- usage: "yui task work dispatch <task>/<work> [--input <text>] [--lane-role <role> ...]",
797
- options: ["--input", "--lane-role"]
799
+ usage: "yui task work dispatch <task>/<work> [--input <text>] [--context-ref <store/refId@digest> ...] [--lane-role <role> ...]",
800
+ options: ["--input", "--context-ref", "--lane-role"]
798
801
  },
799
802
  {
800
- name: "synthesize",
803
+ name: "synthesize", discovery: { surface: "managed", audiences: ["operator", "leader"] },
801
804
  summary: "Dispatch synthesis over explicitly selected original Producer AgentRuns.",
802
805
  usage: "yui task work synthesize <task>/<work> --source-run <task>/<run> ...",
803
806
  options: ["--source-run"]
804
807
  },
805
808
  {
806
- name: "isolate",
809
+ name: "isolate", discovery: { surface: "managed", audiences: ["operator", "leader"] },
807
810
  summary: "Create a WorkItem-owned isolated worktree.",
808
811
  usage: "yui task work isolate <task>/<work>"
809
812
  },
810
813
  {
811
- name: "capture",
814
+ name: "capture", discovery: { surface: "managed", audiences: ["operator", "leader"] },
812
815
  summary: "Capture a terminal isolated WorkItem result as a ChangeSet.",
813
816
  usage: "yui task work capture <task>/<work>"
814
817
  },
815
818
  {
816
- name: "cleanup",
819
+ name: "cleanup", discovery: { surface: "managed", audiences: ["operator", "leader"] },
817
820
  summary: "Release an idle WorkItem runtime or remove its final clean worktree.",
818
821
  usage: "yui task work cleanup <task>/<work> (--runtime-only|--integrated|--abandon)",
819
822
  options: ["--runtime-only", "--integrated", "--abandon"]
820
823
  },
821
824
  {
822
- name: "review",
825
+ name: "review", discovery: { surface: "managed", audiences: ["operator", "leader"] },
823
826
  summary: "Ask the configured reviewer to inspect a WorkItem candidate directly or with replicated Producers.",
824
827
  usage: "yui task work review <task>/<work> [--lane-role <producer-role> --lane-role <producer-role> ...]",
825
828
  options: ["--lane-role"],
@@ -830,36 +833,36 @@ const taskChildren = [
830
833
  ],
831
834
  children: [
832
835
  {
833
- name: "retry",
836
+ name: "retry", discovery: { surface: "managed", audiences: ["operator", "leader"] },
834
837
  summary: "Retry a failed Task-final ReviewRound that has no Reviewer AgentRun.",
835
838
  usage: "yui task work review retry <task>/<review-round>"
836
839
  },
837
840
  {
838
- name: "cleanup",
841
+ name: "cleanup", discovery: { surface: "managed", audiences: ["operator", "leader"] },
839
842
  summary: "Remove only a clean terminal ReviewRound worktree.",
840
843
  usage: "yui task work review cleanup <task>/<review-round>"
841
844
  },
842
845
  {
843
- name: "preserve",
846
+ name: "preserve", discovery: { surface: "managed", audiences: ["operator", "leader"] },
844
847
  summary: "Record that a terminal ReviewRound worktree is retained for diagnosis.",
845
848
  usage: "yui task work review preserve <task>/<review-round>"
846
849
  }
847
850
  ]
848
851
  },
849
852
  {
850
- name: "accept",
853
+ name: "accept", discovery: { surface: "managed", audiences: ["operator", "leader"] },
851
854
  summary: "Accept a successful, validated, integrated Work Item.",
852
855
  usage: "yui task work accept <task>/<work> --summary <text> [--candidate <id>]",
853
856
  options: ["--summary", "--candidate"]
854
857
  },
855
858
  {
856
- name: "reject",
859
+ name: "reject", discovery: { surface: "managed", audiences: ["operator", "leader"] },
857
860
  summary: "Decline a result or withdraw acceptance while preserving its history.",
858
861
  usage: "yui task work reject <task>/<work> --summary <text>",
859
862
  options: ["--summary"]
860
863
  },
861
864
  {
862
- name: "retire",
865
+ name: "retire", discovery: { surface: "managed", audiences: ["operator", "leader"] },
863
866
  summary: "Retire a WorkItem and settle its exact AgentRuns.",
864
867
  usage: "yui task work retire <work> --summary <text> [--replacement <work>]",
865
868
  options: ["--summary", "--replacement"]
@@ -867,29 +870,29 @@ const taskChildren = [
867
870
  ]
868
871
  },
869
872
  {
870
- name: "run",
873
+ name: "run", discovery: { surface: "managed", audiences: ["operator", "leader"] },
871
874
  summary: "Inspect and control Task Role AgentRuns.",
872
875
  sections: [{ id: "manage", title: "Commands", entries: ["list", "show", "retry", "settle", "context", "checkpoint", "retire"] }],
873
876
  children: [
874
- { name: "list", summary: "Discover AgentRuns for a Task or one WorkItem.", usage: "yui task run list <task|task/work> [--limit <1..100>] [--cursor <cursor>]", options: ["--limit", "--cursor"] },
877
+ { name: "list", discovery: { surface: "managed", audiences: ["operator", "leader", "assignment"] }, summary: "Discover AgentRuns for a Task or one WorkItem.", usage: "yui task run list <task|task/work> [--limit <1..100>] [--cursor <cursor>]", options: ["--limit", "--cursor"] },
875
878
  {
876
- name: "show",
879
+ name: "show", discovery: { surface: "managed", audiences: ["operator", "leader", "assignment"] },
877
880
  summary: "Show one AgentRun and its retained audit evidence.",
878
881
  usage: "yui task run show <task>/<run> [--cursor <cursor>] [--json]",
879
882
  options: ["--cursor", "--json"]
880
883
  },
881
884
  {
882
- name: "retry",
885
+ name: "retry", discovery: { surface: "managed", audiences: ["operator", "leader"] },
883
886
  summary: "Retry an exact failed execution or review AgentRun while preserving its semantic unit.",
884
887
  usage: "yui task run retry <task>/<run>"
885
888
  },
886
889
  {
887
- name: "settle",
890
+ name: "settle", discovery: { surface: "managed", audiences: ["operator", "leader"] },
888
891
  summary: "Explicitly settle a failed WorkItem Lane or an obsolete stranded final Review AgentRun.",
889
892
  usage: "yui task run settle <task>/<run>"
890
893
  },
891
894
  {
892
- name: "context",
895
+ name: "context", discovery: { surface: "managed", audiences: ["operator", "leader", "assignment"] },
893
896
  summary: "Load the exact authorized AgentRun context.",
894
897
  usage: "yui task run context <task>/<run> [--cursor <cursor>] [--json]",
895
898
  options: ["--cursor", "--json"],
@@ -898,13 +901,13 @@ const taskChildren = [
898
901
  sections: [{ id: "load", title: "Commands", entries: ["expand", "delta"] }],
899
902
  children: [
900
903
  {
901
- name: "expand",
904
+ name: "expand", discovery: { surface: "managed", audiences: ["operator", "leader", "assignment"] },
902
905
  summary: "Expand one authorized AgentRun context reference.",
903
906
  usage: "yui task run context expand <task>/<run> <ref-id> --store <store> [--mode full] [--cursor <cursor>]",
904
907
  options: ["--store", "--mode", "--cursor"]
905
908
  },
906
909
  {
907
- name: "delta",
910
+ name: "delta", discovery: { surface: "managed", audiences: ["operator", "leader", "assignment"] },
908
911
  summary: "Load authorized AgentRun context changes after a cursor.",
909
912
  usage: "yui task run context delta <task>/<run> --after <digest> [--cursor <cursor>]",
910
913
  options: ["--after", "--cursor"]
@@ -912,7 +915,7 @@ const taskChildren = [
912
915
  ]
913
916
  },
914
917
  {
915
- name: "checkpoint",
918
+ name: "checkpoint", discovery: { surface: "runtime", audiences: [] },
916
919
  summary: "Record durable progress for a long-running AgentRun.",
917
920
  usage: "yui task run checkpoint <run> (--note <text>|--note-file <path|->)",
918
921
  options: ["--note", "--note-file"],
@@ -920,7 +923,7 @@ const taskChildren = [
920
923
  hidden: true
921
924
  },
922
925
  {
923
- name: "retire",
926
+ name: "retire", discovery: { surface: "managed", audiences: ["operator", "leader"] },
924
927
  summary: "Retire an incorrect historical AgentRun without deleting its audit record.",
925
928
  usage: "yui task run retire <task>/<run> --reason <text> [--expected-progress-at <timestamp>] [--agent-id <id>] [--adapter-id <id>] [--native-session-id <id>]",
926
929
  options: ["--reason", "--expected-progress-at", "--agent-id", "--adapter-id", "--native-session-id"]
@@ -928,78 +931,78 @@ const taskChildren = [
928
931
  ]
929
932
  },
930
933
  {
931
- name: "review",
934
+ name: "review", discovery: { surface: "managed", audiences: ["operator", "leader"] },
932
935
  summary: "Control Task-final ReviewRounds.",
933
936
  sections: [{ id: "manage", title: "Commands", entries: ["request", "synthesize", "retry"] }],
934
937
  children: [
935
938
  {
936
- name: "synthesize",
939
+ name: "synthesize", discovery: { surface: "managed", audiences: ["operator", "leader"] },
937
940
  summary: "Dispatch main Review over selected Producer AgentRuns and the frozen candidate.",
938
941
  usage: "yui task review synthesize <task>/<review-round> --source-run <task>/<run> ...",
939
942
  options: ["--source-run"]
940
943
  },
941
944
  {
942
- name: "request",
945
+ name: "request", discovery: { surface: "managed", audiences: ["operator", "leader"] },
943
946
  summary: "Request a direct or replicated Task-local final ReviewRound.",
944
947
  usage: "yui task review request <task> --role <main-role> [--lane-role <producer-role> --lane-role <producer-role> ...] [--delta-recheck]",
945
948
  options: ["--role", "--lane-role", "--delta-recheck"]
946
949
  },
947
950
  {
948
- name: "retry",
951
+ name: "retry", discovery: { surface: "managed", audiences: ["operator", "leader"] },
949
952
  summary: "Retry a failed Task-final ReviewRound without a Reviewer AgentRun.",
950
953
  usage: "yui task review retry <task>/<review-round>"
951
954
  }
952
955
  ]
953
956
  },
954
957
  {
955
- name: "integration",
958
+ name: "integration", discovery: { surface: "managed", audiences: ["operator", "leader"] },
956
959
  summary: "Integrate WorkItem results and upstream commits with Leader-owned decisions.",
957
960
  sections: [{ id: "manage", title: "Commands", entries: ["start", "continue", "resolve", "abort", "supersede", "list", "show", "cleanup"] }],
958
961
  children: [
959
962
  {
960
- name: "start",
963
+ name: "start", discovery: { surface: "managed", audiences: ["operator", "leader"] },
961
964
  summary: "Build, validate, and CAS-commit an integration candidate.",
962
965
  usage: "yui task integration start <task> --work-item <id> --strategy <ff|cherry-pick|merge|manual> [--project <project>] [--target <ref>] [--check <command> ...] [--rerun-checks]",
963
966
  options: ["--work-item", "--strategy", "--project", "--target", "--check", "--rerun-checks"],
964
967
  optionValues: { "--strategy": ["ff", "cherry-pick", "merge", "manual"] }
965
968
  },
966
969
  {
967
- name: "continue",
970
+ name: "continue", discovery: { surface: "managed", audiences: ["operator", "leader"] },
968
971
  summary: "Consume a finished check Job and finalize this exact Integration, or continue an approved manual resolution.",
969
972
  usage: "yui task integration continue <task>/<integration>"
970
973
  },
971
974
  {
972
- name: "resolve",
975
+ name: "resolve", discovery: { surface: "managed", audiences: ["operator", "leader"] },
973
976
  summary: "Record the Leader's semantic conflict decision.",
974
977
  usage: "yui task integration resolve <task>/<integration> --option <manual-resolution|reject> --rationale <text>",
975
978
  options: ["--option", "--rationale"],
976
979
  optionValues: { "--option": ["manual-resolution", "reject"] }
977
980
  },
978
981
  {
979
- name: "abort",
982
+ name: "abort", discovery: { surface: "managed", audiences: ["operator", "leader"] },
980
983
  summary: "Abandon an unadvanced Integration while preserving evidence; reconcile an already-applied target.",
981
984
  usage: "yui task integration abort <task>/<integration> --reason <text>",
982
985
  options: ["--reason"]
983
986
  },
984
987
  {
985
- name: "supersede",
988
+ name: "supersede", discovery: { surface: "managed", audiences: ["operator", "leader"] },
986
989
  summary: "Mark a committed Integration as obsolete, retaining its evidence.",
987
990
  usage: "yui task integration supersede <task>/<integration> --reason <text>",
988
991
  options: ["--reason"]
989
992
  },
990
- { name: "list", summary: "List Integration Attempts.", usage: "yui task integration list <task>" },
991
- { name: "show", summary: "Show one Integration Attempt.", usage: "yui task integration show <task>/<integration>" },
992
- { name: "cleanup", summary: "Remove a terminal Integration worktree and branch.", usage: "yui task integration cleanup <task>/<integration>" }
993
+ { name: "list", discovery: { surface: "managed", audiences: ["operator", "leader"] }, summary: "List Integration Attempts.", usage: "yui task integration list <task>" },
994
+ { name: "show", discovery: { surface: "managed", audiences: ["operator", "leader"] }, summary: "Show one Integration Attempt.", usage: "yui task integration show <task>/<integration>" },
995
+ { name: "cleanup", discovery: { surface: "managed", audiences: ["operator", "leader"] }, summary: "Remove a terminal Integration worktree and branch.", usage: "yui task integration cleanup <task>/<integration>" }
993
996
  ]
994
997
  },
995
998
  {
996
- name: "brief",
999
+ name: "brief", discovery: { surface: "managed", audiences: ["operator", "leader"] },
997
1000
  summary: "Manage the Task Brief, the authoritative summary of current task state.",
998
1001
  sections: [{ id: "manage", title: "Commands", entries: ["show", "update"] }],
999
1002
  children: [
1000
- { name: "show", summary: "Show the Task Brief.", usage: "yui task brief show <task> [--cursor <cursor>]", options: ["--cursor"] },
1003
+ { name: "show", discovery: { surface: "managed", audiences: ["operator", "leader"] }, summary: "Show the Task Brief.", usage: "yui task brief show <task> [--cursor <cursor>]", options: ["--cursor"] },
1001
1004
  {
1002
- name: "update",
1005
+ name: "update", discovery: { surface: "managed", audiences: ["operator", "leader"] },
1003
1006
  summary: "Create or update the Task Brief.",
1004
1007
  usage: "yui task brief update <task> [--objective <text>] [--boundary <text> ...] [--approach <text>] [--focus <text>] [--leader-summary <text>]",
1005
1008
  options: ["--objective", "--boundary", "--approach", "--focus", "--leader-summary"]
@@ -1007,26 +1010,26 @@ const taskChildren = [
1007
1010
  ]
1008
1011
  },
1009
1012
  {
1010
- name: "decision",
1013
+ name: "decision", discovery: { surface: "managed", audiences: ["operator", "leader"] },
1011
1014
  summary: "Record and supersede durable Task decisions.",
1012
1015
  sections: [{ id: "manage", title: "Commands", entries: ["record", "list", "show", "supersede"] }],
1013
1016
  children: [
1014
1017
  {
1015
- name: "record",
1018
+ name: "record", discovery: { surface: "managed", audiences: ["operator", "leader"] },
1016
1019
  summary: "Record a new active Decision.",
1017
1020
  usage: "yui task decision record <task> --title <text> --rationale <text>",
1018
1021
  options: ["--title", "--rationale"]
1019
1022
  },
1020
1023
  {
1021
- name: "list",
1024
+ name: "list", discovery: { surface: "public", audiences: ["public", "operator", "leader", "assignment"] },
1022
1025
  summary: "List Decisions for a Task.",
1023
1026
  usage: "yui task decision list <task> [--status active|superseded] [--limit <1..100>] [--cursor <cursor>]",
1024
1027
  options: ["--status", "--limit", "--cursor"],
1025
1028
  optionValues: { "--status": ["active", "superseded"] }
1026
1029
  },
1027
- { name: "show", summary: "Show one Decision.", usage: "yui task decision show <task> <decision> [--cursor <cursor>]", options: ["--cursor"] },
1030
+ { name: "show", discovery: { surface: "public", audiences: ["public", "operator", "leader", "assignment"] }, summary: "Show one Decision.", usage: "yui task decision show <task> <decision> [--cursor <cursor>]", options: ["--cursor"] },
1028
1031
  {
1029
- name: "supersede",
1032
+ name: "supersede", discovery: { surface: "managed", audiences: ["operator", "leader"] },
1030
1033
  summary: "Mark a Decision as superseded.",
1031
1034
  usage: "yui task decision supersede <task> <decision> --reason <text>",
1032
1035
  options: ["--reason"]
@@ -1034,41 +1037,41 @@ const taskChildren = [
1034
1037
  ]
1035
1038
  },
1036
1039
  {
1037
- name: "milestone",
1040
+ name: "milestone", discovery: { surface: "managed", audiences: ["operator", "leader"] },
1038
1041
  summary: "Append immutable Milestone records for completed progress.",
1039
1042
  sections: [{ id: "manage", title: "Commands", entries: ["add", "list", "show"] }],
1040
1043
  children: [
1041
1044
  {
1042
- name: "add",
1045
+ name: "add", discovery: { surface: "managed", audiences: ["operator", "leader"] },
1043
1046
  summary: "Append a Milestone to a Task.",
1044
1047
  usage: "yui task milestone add <task> --title <text> --summary <text>",
1045
1048
  options: ["--title", "--summary"]
1046
1049
  },
1047
- { name: "list", summary: "List Milestones for a Task.", usage: "yui task milestone list <task> [--limit <1..100>] [--cursor <cursor>]", options: ["--limit", "--cursor"] },
1048
- { name: "show", summary: "Show one Milestone.", usage: "yui task milestone show <task> <milestone> [--cursor <cursor>]", options: ["--cursor"] }
1050
+ { name: "list", discovery: { surface: "public", audiences: ["public", "operator", "leader", "assignment"] }, summary: "List Milestones for a Task.", usage: "yui task milestone list <task> [--limit <1..100>] [--cursor <cursor>]", options: ["--limit", "--cursor"] },
1051
+ { name: "show", discovery: { surface: "public", audiences: ["public", "operator", "leader", "assignment"] }, summary: "Show one Milestone.", usage: "yui task milestone show <task> <milestone> [--cursor <cursor>]", options: ["--cursor"] }
1049
1052
  ]
1050
1053
  },
1051
1054
  {
1052
- name: "event",
1055
+ name: "event", discovery: { surface: "managed", audiences: ["operator", "leader"] },
1053
1056
  summary: "Inspect the durable Task event history.",
1054
1057
  sections: [{ id: "manage", title: "Commands", entries: ["list", "show"] }],
1055
1058
  children: [
1056
1059
  {
1057
- name: "list",
1060
+ name: "list", discovery: { surface: "public", audiences: ["public", "operator", "leader", "assignment"] },
1058
1061
  summary: "List Task events.",
1059
1062
  usage: "yui task event list <task> [--after <timestamp>] [--limit <1..100>] [--cursor <cursor>]",
1060
1063
  options: ["--after", "--limit", "--cursor"]
1061
1064
  },
1062
- { name: "show", summary: "Show one Task event.", usage: "yui task event show <task> <event> [--cursor <cursor>]", options: ["--cursor"] }
1065
+ { name: "show", discovery: { surface: "public", audiences: ["public", "operator", "leader", "assignment"] }, summary: "Show one Task event.", usage: "yui task event show <task> <event> [--cursor <cursor>]", options: ["--cursor"] }
1063
1066
  ]
1064
1067
  },
1065
1068
  {
1066
- name: "continuation",
1069
+ name: "continuation", discovery: { surface: "managed", audiences: ["operator", "leader"] },
1067
1070
  summary: "Inspect native Provider child continuations and their durability mode.",
1068
1071
  sections: [{ id: "manage", title: "Commands", entries: ["list"] }],
1069
1072
  children: [
1070
1073
  {
1071
- name: "list",
1074
+ name: "list", discovery: { surface: "managed", audiences: ["operator", "leader"] },
1072
1075
  summary: "List native child continuations for a Task.",
1073
1076
  usage: "yui task continuation list <task> [--json]",
1074
1077
  options: ["--json"]
@@ -1076,35 +1079,35 @@ const taskChildren = [
1076
1079
  ]
1077
1080
  },
1078
1081
  {
1079
- name: "wake",
1082
+ name: "wake", discovery: { surface: "managed", audiences: ["operator", "leader"] },
1080
1083
  summary: "Inspect the durable Leader wake ledger and its delta content.",
1081
1084
  sections: [{ id: "manage", title: "Commands", entries: ["list", "show", "retry", "resolve"] }],
1082
1085
  children: [
1083
- { name: "list", summary: "List recorded Leader wakes.", usage: "yui task wake list <task> [--limit <1..100>] [--cursor <cursor>]", options: ["--limit", "--cursor"] },
1084
- { name: "show", summary: "Show a fixed wake window and exact detail reads.", usage: "yui task wake show <task> <wake> [--cursor <cursor>]", options: ["--cursor"] },
1085
- { name: "retry", summary: "Retry a rejected notification after correcting its cause; preserve original input.",
1086
+ { name: "list", discovery: { surface: "managed", audiences: ["operator", "leader"] }, summary: "List recorded Leader wakes.", usage: "yui task wake list <task> [--limit <1..100>] [--cursor <cursor>]", options: ["--limit", "--cursor"] },
1087
+ { name: "show", discovery: { surface: "managed", audiences: ["operator", "leader"] }, summary: "Show a fixed wake window and exact detail reads.", usage: "yui task wake show <task> <wake> [--cursor <cursor>]", options: ["--cursor"] },
1088
+ { name: "retry", discovery: { surface: "managed", audiences: ["operator", "leader"] }, summary: "Retry a rejected notification after correcting its cause; preserve original input.",
1086
1089
  usage: "yui task wake retry <task> <wake> --reason <correction>", options: ["--reason"] },
1087
- { name: "resolve", summary: "Release an unknown notification claim after explicit quiescence evidence, without replay.",
1090
+ { name: "resolve", discovery: { surface: "managed", audiences: ["operator", "leader"] }, summary: "Release an unknown notification claim after explicit quiescence evidence, without replay.",
1088
1091
  usage: "yui task wake resolve <task> <wake> --reason <quiescence-evidence>", options: ["--reason"] }
1089
1092
  ]
1090
1093
  },
1091
1094
  {
1092
- name: "overlap",
1095
+ name: "overlap", discovery: { surface: "public", audiences: ["public", "operator"] },
1093
1096
  summary: "Show read-only cross-Task overlap diagnostics.",
1094
1097
  usage: "yui task overlap [--project <project>] [--base <sha>] [--task <task> ...]",
1095
1098
  options: ["--project", "--base", "--task"]
1096
1099
  },
1097
1100
  {
1098
- name: "change-set",
1101
+ name: "change-set", discovery: { surface: "managed", audiences: ["operator", "leader"] },
1099
1102
  summary: "Inspect ChangeSets captured from WorkItem Candidates.",
1100
1103
  sections: [{ id: "inspect", title: "Commands", entries: ["show"] }],
1101
1104
  children: [
1102
- { name: "show", summary: "Show one ChangeSet.", usage: "yui task change-set show <task>/<change-set> [--cursor <cursor>]", options: ["--cursor"] }
1105
+ { name: "show", discovery: { surface: "managed", audiences: ["operator", "leader", "assignment"] }, summary: "Show one ChangeSet.", usage: "yui task change-set show <task>/<change-set> [--cursor <cursor>]", options: ["--cursor"] }
1103
1106
  ]
1104
1107
  },
1105
1108
  ];
1106
1109
  export const ROOT_COMMAND = buildNode({
1107
- name: "yui",
1110
+ name: "yui", discovery: { surface: "public", audiences: ["public", "operator"] },
1108
1111
  summary: "Coordinate durable, isolated Agent work.",
1109
1112
  usage: "yui [--json] <command>",
1110
1113
  examples: ["yui setup", "yui start", "yui operator enter", "yui task list"],
@@ -1112,7 +1115,7 @@ export const ROOT_COMMAND = buildNode({
1112
1115
  { id: "general", title: "General", entries: [
1113
1116
  "help", "version", "update", "upgrade", "setup", "start", "doctor"
1114
1117
  ] },
1115
- { id: "workflow", title: "Workflow", entries: ["operator", "role", "project", "task"] },
1118
+ { id: "workflow", title: "Workflow", entries: ["agent", "operator", "role", "project", "task"] },
1116
1119
  { id: "configuration", title: "Configuration", entries: ["config"] },
1117
1120
  { id: "operations", title: "Operations", entries: ["web", "controller", "session", "execution", "capability", "job", "jobs", "telemetry", "release"] },
1118
1121
  { id: "resources", title: "Resources", entries: ["resources"] },
@@ -1120,72 +1123,91 @@ export const ROOT_COMMAND = buildNode({
1120
1123
  ],
1121
1124
  children: [
1122
1125
  {
1123
- name: "role",
1126
+ name: "agent", discovery: { surface: "public", audiences: ["public", "operator"] },
1127
+ summary: "Run the independent coding Agent without a Controller or Yui Home.",
1128
+ sections: [{ id: "product", title: "Independent Agent", entries: ["check-config", "start", "run", ...catalogCommands] }],
1129
+ children: [
1130
+ { name: "check-config", discovery: { surface: "public", audiences: ["public", "operator"] },
1131
+ summary: "Validate explicit configuration without model requests or state initialization.",
1132
+ options: productConfigurationOptions, fileOptions: ["--config"] },
1133
+ { name: "start", discovery: { surface: "public", audiences: ["public", "operator"] },
1134
+ summary: "Open a foreground line UI; select --session ID to resume saved history.",
1135
+ options: [...productConfigurationOptions, "--session"], fileOptions: ["--config"] },
1136
+ { name: "run", discovery: { surface: "public", audiences: ["public", "operator"] },
1137
+ summary: "Submit one input and return real result/save evidence as JSON.",
1138
+ options: [...productConfigurationOptions, "--session", "--input"], fileOptions: ["--config"] },
1139
+ ...catalogCommands.map(name => ({ name, discovery: { surface: "public", audiences: ["public", "operator"] },
1140
+ summary: "Use the real persistent Session catalog without starting execution.",
1141
+ options: catalogCommandOptions(name) }))
1142
+ ]
1143
+ },
1144
+ {
1145
+ name: "role", discovery: { surface: "public", audiences: ["public", "operator"] },
1124
1146
  summary: "Queue input or control an exact current Global Role Turn.",
1125
1147
  sections: [{ id: "input", title: "Input control", entries: ["message", "interrupt"] }],
1126
1148
  children: [
1127
1149
  {
1128
- name: "message", summary: "Send durable input to a Global Role.",
1150
+ name: "message", discovery: { surface: "public", audiences: ["public", "operator"] }, summary: "Send durable input to a Global Role.",
1129
1151
  sections: [{ id: "input", title: "Input control", entries: ["queue", "steer", "list", "show"] }],
1130
1152
  children: [
1131
1153
  {
1132
- name: "list", summary: "Discover Global Messages without consuming input.",
1154
+ name: "list", discovery: { surface: "public", audiences: ["public", "operator"] }, summary: "Discover Global Messages without consuming input.",
1133
1155
  usage: "yui role message list <role> [--pending] [--limit <1..100>] [--cursor <cursor>]",
1134
1156
  options: ["--pending", "--limit", "--cursor"]
1135
1157
  },
1136
1158
  {
1137
- name: "show", summary: "Read one exact Global Message; follow contentPage.nextCursor for long content.",
1159
+ name: "show", discovery: { surface: "public", audiences: ["public", "operator"] }, summary: "Read one exact Global Message; follow contentPage.nextCursor for long content.",
1138
1160
  usage: "yui role message show <role> <message-id> [--cursor <cursor>]",
1139
1161
  options: ["--cursor"]
1140
1162
  },
1141
1163
  {
1142
- name: "queue", summary: "Queue input for the next legal delivery opportunity.",
1164
+ name: "queue", discovery: { surface: "public", audiences: ["public", "operator"] }, summary: "Queue input for the next legal delivery opportunity.",
1143
1165
  usage: "yui role message queue <role> (<text>|--body-file <path|->) --request-id <id>",
1144
1166
  options: ["--request-id", "--body-file"], fileOptions: ["--body-file"]
1145
1167
  },
1146
1168
  {
1147
- name: "steer", summary: "Steer the exact current native Turn.",
1169
+ name: "steer", discovery: { surface: "public", audiences: ["public", "operator"] }, summary: "Steer the exact current native Turn.",
1148
1170
  usage: "yui role message steer <role> (<text>|--body-file <path|->) --request-id <id> --expected-target <turn>",
1149
1171
  options: ["--request-id", "--expected-target", "--body-file"], fileOptions: ["--body-file"]
1150
1172
  }
1151
1173
  ]
1152
1174
  },
1153
1175
  {
1154
- name: "interrupt", summary: "Request cancellation of the exact current native Turn.",
1176
+ name: "interrupt", discovery: { surface: "public", audiences: ["public", "operator"] }, summary: "Request cancellation of the exact current native Turn.",
1155
1177
  usage: "yui role interrupt <role> --expected-target <turn> [--request-id <id>] [--then-message <message>]",
1156
1178
  options: ["--request-id", "--expected-target", "--then-message"]
1157
1179
  }
1158
1180
  ]
1159
1181
  },
1160
- { name: "help", summary: "Show root or scoped command help.", usage: "yui help [command ...]", commandPathArguments: true },
1161
- { name: "version", summary: "Print the installed Yui version." },
1182
+ { name: "help", discovery: { surface: "public", audiences: ["public", "operator", "leader", "assignment", "global", "unbound"] }, summary: "Show root or scoped command help.", usage: "yui help [command ...]", commandPathArguments: true },
1183
+ { name: "version", discovery: { surface: "public", audiences: ["public", "operator", "leader", "assignment", "global", "unbound"] }, summary: "Print the installed Yui version." },
1162
1184
  {
1163
- name: "update",
1185
+ name: "update", discovery: { surface: "public", audiences: ["public", "operator"] },
1164
1186
  summary: "Install the latest or an exact published Yui version after storage preflight.",
1165
1187
  usage: "yui update [--version <exact-version>]",
1166
1188
  options: ["--version"]
1167
1189
  },
1168
1190
  {
1169
- name: "upgrade",
1191
+ name: "upgrade", discovery: { surface: "public", audiences: ["public", "operator"] },
1170
1192
  summary: "Plan or apply supported storage migrations for this Home.",
1171
1193
  usage: "yui upgrade [--dry-run]",
1172
1194
  options: ["--dry-run"]
1173
1195
  },
1174
1196
  {
1175
- name: "setup",
1197
+ name: "setup", discovery: { surface: "public", audiences: ["public", "operator"] },
1176
1198
  summary: "Initialize the minimum Operator and Leader configuration required to execute Tasks.",
1177
1199
  examples: "yui setup"
1178
1200
  },
1179
- { name: "start", summary: "Start the Controller and Codex shared runtime needed by active Roles." },
1180
- { name: "doctor", summary: "Check Yui dependencies and file state." },
1201
+ { name: "start", discovery: { surface: "public", audiences: ["public", "operator"] }, summary: "Start the Controller and Codex shared runtime needed by active Roles." },
1202
+ { name: "doctor", discovery: { surface: "public", audiences: ["public", "operator", "leader", "assignment", "global", "unbound"] }, summary: "Check Yui dependencies and file state." },
1181
1203
  {
1182
- name: "web",
1204
+ name: "web", discovery: { surface: "public", audiences: ["public", "operator"] },
1183
1205
  summary: "Serve the control room using the running Controller's capability Host.",
1184
1206
  usage: "yui web [--host <loopback>] [--port <port>] | --status | --stop",
1185
1207
  options: ["--host", "--port", "--status", "--stop"]
1186
1208
  },
1187
1209
  {
1188
- name: "controller",
1210
+ name: "controller", discovery: { surface: "public", audiences: ["public", "operator"] },
1189
1211
  summary: "Inspect and recover local Controller runtime resources.",
1190
1212
  sections: [{
1191
1213
  id: "lifecycle",
@@ -1194,34 +1216,34 @@ export const ROOT_COMMAND = buildNode({
1194
1216
  }],
1195
1217
  children: [
1196
1218
  {
1197
- name: "status",
1219
+ name: "status", discovery: { surface: "public", audiences: ["public", "operator"] },
1198
1220
  summary: "Show Controller and AgentRuntime resources.",
1199
1221
  usage: "yui controller status [--all] [--verbose]",
1200
1222
  options: ["--all", "--verbose"]
1201
1223
  },
1202
1224
  {
1203
- name: "cleanup",
1225
+ name: "cleanup", discovery: { surface: "public", audiences: ["public", "operator"] },
1204
1226
  summary: "Interactively clean confirmed unused runtime resources.",
1205
1227
  usage: "yui controller cleanup [--all]",
1206
1228
  options: ["--all"]
1207
1229
  },
1208
1230
  {
1209
- name: "identity",
1231
+ name: "identity", discovery: { surface: "runtime", audiences: [] },
1210
1232
  summary: "Read the stable runtime identity receipt (build, backend, worker).",
1211
1233
  hidden: true
1212
1234
  },
1213
1235
  {
1214
- name: "live-identity",
1236
+ name: "live-identity", discovery: { surface: "runtime", audiences: [] },
1215
1237
  summary: "Read the authenticated live Controller runtime identity.",
1216
1238
  hidden: true
1217
1239
  },
1218
- { name: "start", summary: "Start the Controller for this Home without preparing Agent runtimes." },
1219
- { name: "stop", summary: "Stop the Controller." },
1220
- { name: "restart", summary: "Restart internal services without stopping tmux sessions." }
1240
+ { name: "start", discovery: { surface: "public", audiences: ["public", "operator"] }, summary: "Start the Controller for this Home without preparing Agent runtimes." },
1241
+ { name: "stop", discovery: { surface: "public", audiences: ["public", "operator"] }, summary: "Stop the Controller." },
1242
+ { name: "restart", discovery: { surface: "public", audiences: ["public", "operator"] }, summary: "Restart internal services without stopping tmux sessions." }
1221
1243
  ]
1222
1244
  },
1223
1245
  {
1224
- name: "execution",
1246
+ name: "execution", discovery: { surface: "public", audiences: ["public", "operator"] },
1225
1247
  summary: "Read-only execution history audit.",
1226
1248
  sections: [{
1227
1249
  id: "reports",
@@ -1230,7 +1252,7 @@ export const ROOT_COMMAND = buildNode({
1230
1252
  }],
1231
1253
  children: [
1232
1254
  {
1233
- name: "audit",
1255
+ name: "audit", discovery: { surface: "public", audiences: ["public", "operator"] },
1234
1256
  summary: "Report AgentRuns, wakes, Sessions, Reviews, Integrations, and telemetry volume.",
1235
1257
  usage: "yui execution audit [--task <id>] [--since <iso>] [--until <iso>]",
1236
1258
  options: ["--task", "--since", "--until"]
@@ -1238,7 +1260,7 @@ export const ROOT_COMMAND = buildNode({
1238
1260
  ]
1239
1261
  },
1240
1262
  {
1241
- name: "release",
1263
+ name: "release", discovery: { surface: "public", audiences: ["public", "operator"] },
1242
1264
  summary: "Install and activate immutable local runtime releases.",
1243
1265
  sections: [{
1244
1266
  id: "commands",
@@ -1247,25 +1269,25 @@ export const ROOT_COMMAND = buildNode({
1247
1269
  }],
1248
1270
  children: [
1249
1271
  {
1250
- name: "install",
1272
+ name: "install", discovery: { surface: "public", audiences: ["public", "operator"] },
1251
1273
  summary: "Install a runtime package as an immutable release.",
1252
1274
  usage: "yui release install <source-dir>"
1253
1275
  },
1254
- { name: "list", summary: "List installed releases and the active pointer." },
1276
+ { name: "list", discovery: { surface: "public", audiences: ["public", "operator"] }, summary: "List installed releases and the active pointer." },
1255
1277
  {
1256
- name: "activate",
1278
+ name: "activate", discovery: { surface: "public", audiences: ["public", "operator"] },
1257
1279
  summary: "Activate a release via atomic Controller handover.",
1258
1280
  usage: "yui release activate [release-id]"
1259
1281
  }
1260
1282
  ]
1261
1283
  },
1262
1284
  {
1263
- name: "resources",
1285
+ name: "resources", discovery: { surface: "public", audiences: ["public", "operator"] },
1264
1286
  summary: "Inspect and garbage-collect managed worktrees, deployments, and runtime artifacts.",
1265
1287
  sections: [{ id: "gc", title: "Commands", entries: ["gc"] }],
1266
1288
  children: [
1267
1289
  {
1268
- name: "gc",
1290
+ name: "gc", discovery: { surface: "public", audiences: ["public", "operator"] },
1269
1291
  summary: "Plan or apply resource garbage collection.",
1270
1292
  usage: "yui resources gc [--dry-run|--apply|--purge|--restore] [--quarantine-ttl-hours <hours>]",
1271
1293
  options: ["--dry-run", "--apply", "--purge", "--restore", "--quarantine-ttl-hours"]
@@ -1273,7 +1295,7 @@ export const ROOT_COMMAND = buildNode({
1273
1295
  ]
1274
1296
  },
1275
1297
  {
1276
- name: "config",
1298
+ name: "config", discovery: { surface: "public", audiences: ["public", "operator"] },
1277
1299
  summary: "Inspect, understand, and update all persistent Yui configuration.",
1278
1300
  examples: [
1279
1301
  "yui config show",
@@ -1292,12 +1314,12 @@ export const ROOT_COMMAND = buildNode({
1292
1314
  ],
1293
1315
  children: [
1294
1316
  {
1295
- name: "show",
1317
+ name: "show", discovery: { surface: "public", audiences: ["public", "operator", "leader", "assignment", "global"] },
1296
1318
  summary: "Show the complete effective Yui configuration.",
1297
1319
  examples: ["yui config show", "yui --json config show"]
1298
1320
  },
1299
1321
  {
1300
- name: "describe",
1322
+ name: "describe", discovery: { surface: "public", audiences: ["public", "operator", "leader", "assignment", "global"] },
1301
1323
  summary: "Explain configuration effects, defaults, choices, and activation behavior.",
1302
1324
  usage: `yui config describe [${[...CONFIG_DOMAINS, "agent", "role", "profile", "completion"].join("|")}]`,
1303
1325
  examples: ["yui config describe", "yui --json config describe role"],
@@ -1305,7 +1327,7 @@ export const ROOT_COMMAND = buildNode({
1305
1327
  },
1306
1328
  ...CONFIG_DOMAINS.map(durableConfigDomainNode),
1307
1329
  {
1308
- name: "agent",
1330
+ name: "agent", discovery: { surface: "public", audiences: ["public", "operator"] },
1309
1331
  summary: "Manage configured native Agent CLIs; launch-setting changes apply to the next Session activation.",
1310
1332
  examples: ["yui config agent list", "yui config agent capabilities codex"],
1311
1333
  sections: [
@@ -1315,7 +1337,7 @@ export const ROOT_COMMAND = buildNode({
1315
1337
  children: agentChildren
1316
1338
  },
1317
1339
  {
1318
- name: "profile",
1340
+ name: "profile", discovery: { surface: "public", audiences: ["public", "operator"] },
1319
1341
  summary: "Manage reusable Agent Profiles; updates affect future copies and do not rewrite existing Task Roles.",
1320
1342
  examples: ["yui config profile list", "yui config profile show implementer"],
1321
1343
  sections: [
@@ -1325,7 +1347,7 @@ export const ROOT_COMMAND = buildNode({
1325
1347
  children: profileChildren
1326
1348
  },
1327
1349
  {
1328
- name: "role",
1350
+ name: "role", discovery: { surface: "public", audiences: ["public", "operator"] },
1329
1351
  summary: "Manage reusable global Roles and desired Agent launch configuration for the next Host process.",
1330
1352
  examples: ["yui config role list", "yui config role show operator"],
1331
1353
  sections: [
@@ -1335,7 +1357,7 @@ export const ROOT_COMMAND = buildNode({
1335
1357
  children: roleChildren
1336
1358
  },
1337
1359
  {
1338
- name: "completion",
1360
+ name: "completion", discovery: { surface: "public", audiences: ["public", "operator"] },
1339
1361
  summary: "Interactively configure shell completion after confirming generated files and startup-file changes.",
1340
1362
  executable: true,
1341
1363
  acceptsArguments: false,
@@ -1350,7 +1372,7 @@ export const ROOT_COMMAND = buildNode({
1350
1372
  ]
1351
1373
  },
1352
1374
  {
1353
- name: "operator",
1375
+ name: "operator", discovery: { surface: "public", audiences: ["public", "operator"] },
1354
1376
  summary: "Use the persistent Operator Actor.",
1355
1377
  sections: [{
1356
1378
  id: "workflow",
@@ -1358,23 +1380,23 @@ export const ROOT_COMMAND = buildNode({
1358
1380
  entries: ["enter", "status", "new", "list", "resume", "submit"]
1359
1381
  }],
1360
1382
  children: [
1361
- { name: "enter", summary: "Enter the Operator's native session." },
1362
- { name: "status", summary: "Show the unique active writer and retained conversation history." },
1383
+ { name: "enter", discovery: { surface: "public", audiences: ["public", "operator"] }, summary: "Enter the Operator's native session." },
1384
+ { name: "status", discovery: { surface: "public", audiences: ["public", "operator"] }, summary: "Show the unique active writer and retained conversation history." },
1363
1385
  {
1364
- name: "new",
1386
+ name: "new", discovery: { surface: "public", audiences: ["public", "operator"] },
1365
1387
  summary: "Start a new Operator session.",
1366
1388
  usage: "yui operator new [--agent <id>]",
1367
1389
  options: ["--agent"]
1368
1390
  },
1369
- { name: "list", summary: "List Operator session history." },
1391
+ { name: "list", discovery: { surface: "public", audiences: ["public", "operator"] }, summary: "List Operator session history." },
1370
1392
  {
1371
- name: "resume",
1393
+ name: "resume", discovery: { surface: "public", audiences: ["public", "operator"] },
1372
1394
  summary: "Resume a previous Operator session.",
1373
1395
  usage: "yui operator resume [<ref> | --last]",
1374
1396
  options: ["--last"]
1375
1397
  },
1376
1398
  {
1377
- name: "submit",
1399
+ name: "submit", discovery: { surface: "public", audiences: ["public", "operator"] },
1378
1400
  summary: "Submit work through the Operator with a submission intent (record|discuss|develop); a task-less submit opens a Draft. An optional idempotency key makes a retry safe.",
1379
1401
  usage: "yui operator submit (<body>|--body-file <path|->) [--task <id>] [--intent record|discuss|develop] [--request-id <key>]",
1380
1402
  options: ["--task", "--body-file", "--intent", "--request-id"],
@@ -1386,7 +1408,7 @@ export const ROOT_COMMAND = buildNode({
1386
1408
  ]
1387
1409
  },
1388
1410
  {
1389
- name: "project",
1411
+ name: "project", discovery: { surface: "public", audiences: ["public", "operator"] },
1390
1412
  summary: "Manage Projects, stable checkouts, branches, and Yui knowledge.",
1391
1413
  sections: [
1392
1414
  { id: "manage", title: "Commands", entries: ["add", "clone", "refresh", "diagnose", "migrate", "update", "discover", "list", "show", "knowledge"] },
@@ -1394,60 +1416,60 @@ export const ROOT_COMMAND = buildNode({
1394
1416
  ],
1395
1417
  children: [
1396
1418
  {
1397
- name: "add",
1419
+ name: "add", discovery: { surface: "public", audiences: ["public", "operator"] },
1398
1420
  summary: "Bind a Project to a stable Git checkout.",
1399
1421
  usage: "yui project add <name> <path> [--alias <name> ...] [--remote <url>] [--stable <ref>] [--development <ref>]",
1400
1422
  options: ["--alias", "--remote", "--stable", "--development"],
1401
1423
  fileArguments: [1]
1402
1424
  },
1403
1425
  {
1404
- name: "clone",
1426
+ name: "clone", discovery: { surface: "public", audiences: ["public", "operator"] },
1405
1427
  summary: "Clone and bind a Project after user confirmation.",
1406
1428
  usage: "yui project clone <name> <remote> [--alias <name> ...] [--stable <ref>] [--development <ref>] [--external]",
1407
1429
  options: ["--alias", "--stable", "--development", "--external"]
1408
1430
  },
1409
1431
  {
1410
- name: "refresh",
1432
+ name: "refresh", discovery: { surface: "public", audiences: ["public", "operator"] },
1411
1433
  summary: "Fast-forward a clean stable checkout from its configured remote.",
1412
1434
  usage: "yui project refresh <project>"
1413
1435
  },
1414
1436
  {
1415
- name: "diagnose",
1437
+ name: "diagnose", discovery: { surface: "public", audiences: ["public", "operator"] },
1416
1438
  summary: "Show canonical HEAD vs remote head without mutating the checkout.",
1417
1439
  usage: "yui project diagnose <project>"
1418
1440
  },
1419
1441
  {
1420
- name: "migrate",
1442
+ name: "migrate", discovery: { surface: "public", audiences: ["public", "operator"] },
1421
1443
  summary: "Move an external Project into a Home-managed repository.",
1422
1444
  usage: "yui project migrate <project> [--preflight]",
1423
1445
  options: ["--preflight"]
1424
1446
  },
1425
1447
  {
1426
- name: "reset",
1448
+ name: "reset", discovery: { surface: "public", audiences: ["public", "operator"] },
1427
1449
  summary: "Hard-reset a canonical checkout to its verified remote baseline (Operator authority).",
1428
1450
  usage: "yui project reset <project> [--discard-local]",
1429
1451
  options: ["--discard-local"]
1430
1452
  },
1431
1453
  {
1432
- name: "replace",
1454
+ name: "replace", discovery: { surface: "public", audiences: ["public", "operator"] },
1433
1455
  summary: "Re-clone a Home-managed checkout from its remote, preserving Yui refs (Operator authority).",
1434
1456
  usage: "yui project replace <project> --discard-local",
1435
1457
  options: ["--discard-local"]
1436
1458
  },
1437
1459
  {
1438
- name: "retire",
1460
+ name: "retire", discovery: { surface: "public", audiences: ["public", "operator"] },
1439
1461
  summary: "Soft-deprecate a Project; record and evidence are retained (Operator authority).",
1440
1462
  usage: "yui project retire <project> --reason <text>",
1441
1463
  options: ["--reason"]
1442
1464
  },
1443
1465
  {
1444
- name: "delete",
1466
+ name: "delete", discovery: { surface: "public", audiences: ["public", "operator"] },
1445
1467
  summary: "Remove a retired Project's catalog record and optionally its checkout (Operator authority).",
1446
1468
  usage: "yui project delete <project> [--checkout] --confirm <project-id>",
1447
1469
  options: ["--checkout", "--confirm"]
1448
1470
  },
1449
1471
  {
1450
- name: "update",
1472
+ name: "update", discovery: { surface: "public", audiences: ["public", "operator"] },
1451
1473
  summary: "Update a bound Project's aliases, remote, or branch refs.",
1452
1474
  usage: "yui project update <project> [--alias <name> ...|--clear-aliases] [--remote <url>|--clear-remote] [--stable <ref>] [--development <ref>]",
1453
1475
  options: [
@@ -1456,14 +1478,14 @@ export const ROOT_COMMAND = buildNode({
1456
1478
  ]
1457
1479
  },
1458
1480
  {
1459
- name: "discover",
1481
+ name: "discover", discovery: { surface: "public", audiences: ["public", "operator"] },
1460
1482
  summary: "Find Git projects directly under the configured workspace.",
1461
1483
  usage: "yui project discover [name]"
1462
1484
  },
1463
- { name: "list", summary: "List bound Projects." },
1464
- { name: "show", summary: "Show one Project.", usage: "yui project show <project>" },
1485
+ { name: "list", discovery: { surface: "public", audiences: ["public", "operator"] }, summary: "List bound Projects." },
1486
+ { name: "show", discovery: { surface: "public", audiences: ["public", "operator"] }, summary: "Show one Project.", usage: "yui project show <project>" },
1465
1487
  {
1466
- name: "knowledge",
1488
+ name: "knowledge", discovery: { surface: "public", audiences: ["public", "operator"] },
1467
1489
  summary: "Manage durable Project knowledge stored by Yui.",
1468
1490
  sections: [
1469
1491
  {
@@ -1474,29 +1496,29 @@ export const ROOT_COMMAND = buildNode({
1474
1496
  ],
1475
1497
  children: [
1476
1498
  {
1477
- name: "add",
1499
+ name: "add", discovery: { surface: "public", audiences: ["public", "operator"] },
1478
1500
  summary: "Add Project knowledge (Operator authority).",
1479
1501
  usage: "yui project knowledge add <project> <title> --body <text>",
1480
1502
  options: ["--body"]
1481
1503
  },
1482
1504
  {
1483
- name: "retire",
1505
+ name: "retire", discovery: { surface: "public", audiences: ["public", "operator"] },
1484
1506
  summary: "Retire Project knowledge without deleting its record (Operator authority).",
1485
1507
  usage: "yui project knowledge retire <project> <knowledge>"
1486
1508
  },
1487
1509
  {
1488
- name: "list",
1510
+ name: "list", discovery: { surface: "public", audiences: ["public", "operator", "leader"] },
1489
1511
  summary: "List Project knowledge.",
1490
1512
  usage: "yui project knowledge list <project> [--all]",
1491
1513
  options: ["--all"]
1492
1514
  },
1493
1515
  {
1494
- name: "show",
1516
+ name: "show", discovery: { surface: "public", audiences: ["public", "operator", "leader"] },
1495
1517
  summary: "Read one Project knowledge entry.",
1496
1518
  usage: "yui project knowledge show <project> <knowledge>"
1497
1519
  },
1498
1520
  {
1499
- name: "propose",
1521
+ name: "propose", discovery: { surface: "public", audiences: ["public", "operator", "leader"] },
1500
1522
  summary: "Propose a Task conclusion for promotion into Project knowledge.",
1501
1523
  usage: "yui project knowledge propose <project> --title <text> --body <text> --task <task>"
1502
1524
  + " [--decision <id>] [--milestone <id>] [--commit <sha>] [--scope <text>]"
@@ -1504,31 +1526,31 @@ export const ROOT_COMMAND = buildNode({
1504
1526
  options: ["--title", "--body", "--task", "--decision", "--milestone", "--commit", "--scope", "--expires-when", "--supersedes"]
1505
1527
  },
1506
1528
  {
1507
- name: "proposals",
1529
+ name: "proposals", discovery: { surface: "public", audiences: ["public", "operator"] },
1508
1530
  summary: "List or show Knowledge promotion proposals.",
1509
1531
  sections: [{ id: "manage", title: "Commands", entries: ["list", "show"] }],
1510
1532
  children: [
1511
1533
  {
1512
- name: "list",
1534
+ name: "list", discovery: { surface: "public", audiences: ["public", "operator", "leader"] },
1513
1535
  summary: "List Knowledge promotion proposals (pending by default).",
1514
1536
  usage: "yui project knowledge proposals list <project> [--status pending|accepted|rejected] [--all]",
1515
1537
  options: ["--status", "--all"]
1516
1538
  },
1517
1539
  {
1518
- name: "show",
1540
+ name: "show", discovery: { surface: "public", audiences: ["public", "operator", "leader"] },
1519
1541
  summary: "Show one Knowledge promotion proposal.",
1520
1542
  usage: "yui project knowledge proposals show <project> <proposal>"
1521
1543
  }
1522
1544
  ]
1523
1545
  },
1524
1546
  {
1525
- name: "accept",
1547
+ name: "accept", discovery: { surface: "public", audiences: ["public", "operator"] },
1526
1548
  summary: "Accept a Knowledge promotion proposal (Operator authority).",
1527
1549
  usage: "yui project knowledge accept <project> <proposal> [--update <knowledge-id>]",
1528
1550
  options: ["--update"]
1529
1551
  },
1530
1552
  {
1531
- name: "reject",
1553
+ name: "reject", discovery: { surface: "public", audiences: ["public", "operator"] },
1532
1554
  summary: "Reject a Knowledge promotion proposal (Operator authority).",
1533
1555
  usage: "yui project knowledge reject <project> <proposal> --reason <text>",
1534
1556
  options: ["--reason"]
@@ -1538,7 +1560,7 @@ export const ROOT_COMMAND = buildNode({
1538
1560
  ]
1539
1561
  },
1540
1562
  {
1541
- name: "session",
1563
+ name: "session", discovery: { surface: "public", audiences: ["public", "operator"] },
1542
1564
  summary: "Enter, stop, and reconcile managed Role sessions.",
1543
1565
  examples: [
1544
1566
  "yui session context operator --json",
@@ -1554,7 +1576,7 @@ export const ROOT_COMMAND = buildNode({
1554
1576
  children: globalSessionChildren
1555
1577
  },
1556
1578
  {
1557
- name: "task",
1579
+ name: "task", discovery: { surface: "public", audiences: ["public", "operator"] },
1558
1580
  summary: "Manage Tasks, WorkItems, AgentRuns, and integration.",
1559
1581
  sections: [
1560
1582
  { id: "lifecycle", title: "Lifecycle", entries: ["create", "project", "base", "update", "activate", "activation", "execution", "complete", "cancel", "reopen", "retire", "list", "show", "context", "next-action", "remote-delivery", "archive-preflight", "archive", "replace", "reconcile", "upstream", "artifact"] },
@@ -1564,49 +1586,49 @@ export const ROOT_COMMAND = buildNode({
1564
1586
  children: taskChildren
1565
1587
  },
1566
1588
  {
1567
- name: "capability",
1589
+ name: "capability", discovery: { surface: "managed", audiences: ["operator", "leader", "assignment"] },
1568
1590
  summary: "Discover and call authorized capabilities through the Controller.",
1569
1591
  sections: [{ id: "entry", title: "Commands", entries: ["search", "commands", "panels", "describe", "call"] }],
1570
1592
  children: [
1571
- { name: "search", summary: "Search the current authorized directory.", usage: "yui capability search [query] --task <id>" },
1572
- { name: "commands", summary: "List current command names, help and capability mappings; invoke via capability call.", usage: "yui capability commands --task <id>" },
1573
- { name: "panels", summary: "List authorized text/link or query-only JSON panel descriptors.", usage: "yui capability panels --task <id>" },
1574
- { name: "describe", summary: "Describe one contract or report Provider ambiguity.", usage: "yui capability describe <name> --task <id> [--provider <id>] [--version <version>]" },
1575
- { name: "call", summary: "Invoke one implementation under the current managed identity.", usage: "yui capability call <name> --task <id> --input <json> [--provider <id>] [--version <version>] [--request-id <id>]" }
1593
+ { name: "search", discovery: { surface: "managed", audiences: ["operator", "leader", "assignment"] }, summary: "Search the current authorized directory.", usage: "yui capability search [query] --task <id>" },
1594
+ { name: "commands", discovery: { surface: "managed", audiences: ["operator", "leader", "assignment"] }, summary: "List current command names, help and capability mappings; invoke via capability call.", usage: "yui capability commands --task <id>" },
1595
+ { name: "panels", discovery: { surface: "managed", audiences: ["operator", "leader", "assignment"] }, summary: "List authorized text/link or query-only JSON panel descriptors.", usage: "yui capability panels --task <id>" },
1596
+ { name: "describe", discovery: { surface: "managed", audiences: ["operator", "leader", "assignment"] }, summary: "Describe a template or assess exact authorization without executing it.", usage: "yui capability describe <name> --task <id> [--input <json>] [--provider <id>] [--version <version>]", options: ["--task", "--input", "--provider", "--version"] },
1597
+ { name: "call", discovery: { surface: "managed", audiences: ["operator", "leader", "assignment"] }, summary: "Invoke one implementation under the current managed identity.", usage: "yui capability call <name> --task <id> --input <json> [--provider <id>] [--version <version>] [--request-id <id>]", options: ["--task", "--input", "--provider", "--version", "--request-id"] }
1576
1598
  ]
1577
1599
  },
1578
1600
  {
1579
- name: "job",
1601
+ name: "job", discovery: { surface: "managed", audiences: ["operator", "leader", "assignment"] },
1580
1602
  summary: "Start, inspect, cancel, or acknowledge a Controller-managed DurableJob.",
1581
1603
  sections: [{ id: "manage", title: "Commands", entries: ["start", "get", "cancel", "acknowledge"] }],
1582
1604
  children: [
1583
- { name: "start", summary: "Start a DurableJob under an explicit request identity.", usage: "yui job start --request-id <id> --task <id> --project <project> --head <sha> --workspace <dir> --step <name>=<command> [--step ...] [--owner task|work-item:<id>|integration-attempt:<id>] [--env <k=v>...]" },
1584
- { name: "get", summary: "Show a DurableJob record and its terminal result.", usage: "yui job get --task <id> --job <job-id>" },
1585
- { name: "cancel", summary: "Request cancellation of a running or queued DurableJob.", usage: "yui job cancel --task <id> --job <job-id>" },
1586
- { name: "acknowledge", summary: "Acknowledge an unknown-needs-attention DurableJob so Task lifecycle gates can proceed.", usage: "yui job acknowledge --task <id> --job <job-id>" }
1605
+ { name: "start", discovery: { surface: "managed", audiences: ["operator", "leader", "assignment"] }, summary: "Start a DurableJob under an explicit request identity.", usage: "yui job start --request-id <id> --task <id> --project <project> --head <sha> --workspace <dir> --step <name>=<command> [--step ...] [--owner task|work-item:<id>|integration-attempt:<id>] [--env <k=v>...]" },
1606
+ { name: "get", discovery: { surface: "managed", audiences: ["operator", "leader", "assignment"] }, summary: "Show a DurableJob record and its terminal result.", usage: "yui job get --task <id> --job <job-id>" },
1607
+ { name: "cancel", discovery: { surface: "managed", audiences: ["operator", "leader", "assignment"] }, summary: "Request cancellation of a running or queued DurableJob.", usage: "yui job cancel --task <id> --job <job-id>" },
1608
+ { name: "acknowledge", discovery: { surface: "managed", audiences: ["operator", "leader", "assignment"] }, summary: "Acknowledge an unknown-needs-attention DurableJob so Task lifecycle gates can proceed.", usage: "yui job acknowledge --task <id> --job <job-id>" }
1587
1609
  ]
1588
1610
  },
1589
1611
  {
1590
- name: "jobs",
1612
+ name: "jobs", discovery: { surface: "public", audiences: ["public", "operator"] },
1591
1613
  summary: "Inspect scheduler wake and recovery records.",
1592
1614
  sections: [{ id: "manage", title: "Commands", entries: ["list", "retry"] }],
1593
1615
  children: [
1594
- { name: "list", summary: "List scheduler wake and recovery records." },
1595
- { name: "retry", summary: "Retry a failed Leader recovery.", usage: "yui jobs retry <id>" }
1616
+ { name: "list", discovery: { surface: "public", audiences: ["public", "operator"] }, summary: "List scheduler wake and recovery records." },
1617
+ { name: "retry", discovery: { surface: "public", audiences: ["public", "operator"] }, summary: "Retry a failed Leader recovery.", usage: "yui jobs retry <id>" }
1596
1618
  ]
1597
1619
  },
1598
1620
  {
1599
- name: "telemetry",
1621
+ name: "telemetry", discovery: { surface: "public", audiences: ["public", "operator"] },
1600
1622
  summary: "Inspect and compact the bounded provider-progress sidecar.",
1601
1623
  sections: [{ id: "manage", title: "Commands", entries: ["status", "prune", "read"] }],
1602
1624
  children: [
1603
- { name: "status", summary: "Show sidecar health, row counts, and retention settings.", usage: "yui telemetry status" },
1604
- { name: "prune", summary: "Apply terminal retention and active-AgentRun caps.", usage: "yui telemetry prune [--task <id>] [--keep <n>] [--dry-run]" },
1605
- { name: "read", summary: "Page through retained progress rows or read a AgentRun aggregate.", usage: "yui telemetry read --task <id> [--run <id>] [--aggregate] [--limit <n>] [--offset <n>]" }
1625
+ { name: "status", discovery: { surface: "public", audiences: ["public", "operator"] }, summary: "Show sidecar health, row counts, and retention settings.", usage: "yui telemetry status" },
1626
+ { name: "prune", discovery: { surface: "public", audiences: ["public", "operator"] }, summary: "Apply terminal retention and active-AgentRun caps.", usage: "yui telemetry prune [--task <id>] [--keep <n>] [--dry-run]" },
1627
+ { name: "read", discovery: { surface: "public", audiences: ["public", "operator"] }, summary: "Page through retained progress rows or read a AgentRun aggregate.", usage: "yui telemetry read --task <id> [--run <id>] [--aggregate] [--limit <n>] [--offset <n>]" }
1606
1628
  ]
1607
1629
  },
1608
1630
  {
1609
- name: "internal",
1631
+ name: "internal", discovery: { surface: "runtime", audiences: [] },
1610
1632
  summary: "Internal Yui callbacks.",
1611
1633
  hidden: true,
1612
1634
  sections: [{
@@ -1616,17 +1638,17 @@ export const ROOT_COMMAND = buildNode({
1616
1638
  }],
1617
1639
  children: [
1618
1640
  {
1619
- name: "agent-host",
1641
+ name: "agent-host", discovery: { surface: "runtime", audiences: [] },
1620
1642
  summary: "Run the persistent structured Provider host.",
1621
1643
  usage: "yui internal agent-host <ticket>"
1622
1644
  },
1623
1645
  {
1624
- name: "session-notify",
1646
+ name: "session-notify", discovery: { surface: "runtime", audiences: [] },
1625
1647
  summary: "Record a structured native session notification.",
1626
1648
  usage: "yui internal session-notify <payload>"
1627
1649
  },
1628
1650
  {
1629
- name: "runtime-hook",
1651
+ name: "runtime-hook", discovery: { surface: "runtime", audiences: [] },
1630
1652
  summary: "Record a managed Agent Driver observation from stdin.",
1631
1653
  usage: "yui internal runtime-hook"
1632
1654
  }
@@ -1661,8 +1683,8 @@ export function orderedImmediateTokens(node) {
1661
1683
  export function findChild(node, name) {
1662
1684
  return node.children.find((child) => child.name === name);
1663
1685
  }
1664
- export function findCommandNode(path) {
1665
- let node = ROOT_COMMAND;
1686
+ export function findCommandNode(path, root = ROOT_COMMAND) {
1687
+ let node = root;
1666
1688
  for (const segment of path[0] === ROOT_COMMAND.name ? path.slice(1) : path) {
1667
1689
  const child = findChild(node, segment);
1668
1690
  if (child === undefined)
@@ -1698,6 +1720,13 @@ export function validateCommandCatalog(root) {
1698
1720
  throw new Error(`Command examples are required: ${node.path.join(" ")}`);
1699
1721
  }
1700
1722
  const canonicalPath = node.path.join(" ");
1723
+ if (node.kind !== "group" && node.discovery === undefined) {
1724
+ throw new Error(`Executable command discovery must be explicit: ${canonicalPath}`);
1725
+ }
1726
+ for (const option of Object.keys(node.discovery?.optionAudiences ?? {})) {
1727
+ if (!node.options.includes(option))
1728
+ throw new Error(`Discovery references unknown option: ${canonicalPath} ${option}`);
1729
+ }
1701
1730
  for (const example of node.examples) {
1702
1731
  const normalized = example.replace(/^yui --json(?=\s|$)/, "yui");
1703
1732
  if (normalized !== canonicalPath && !normalized.startsWith(`${canonicalPath} `)) {