minutework 0.1.44 → 0.1.46

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -42,6 +42,12 @@ workspace state. It is wired for Cursor (`.cursor/mcp.json`) and Codex
42
42
  `mcp/claude-desktop.sample.json`. Refresh all of this with
43
43
  `minutework workspace sync-assets`.
44
44
 
45
+ Primitive catalog membership does not imply executability or agent exposure;
46
+ check the live-status block in skills/runtime-capability-inventory/SKILL.md and
47
+ the minutework_runtime_primitive_status workspace MCP tool before authoring
48
+ against a primitive (interim paths:
49
+ skills/runtime-primitive-interim-paths/SKILL.md).
50
+
45
51
  ## Hosted Sandbox Runtime
46
52
 
47
53
  Use `minutework sandbox create` to provision and link the workspace to its
@@ -52,6 +52,7 @@ Generated-workspace-first guidance should live here, especially:
52
52
  - `workspace-guidance-refresh/SKILL.md`
53
53
  - `shell-architecture/SKILL.md`
54
54
  - `runtime-capability-inventory/SKILL.md`
55
+ - `runtime-primitive-interim-paths/SKILL.md`
55
56
  - `integration-broker-and-connectors/SKILL.md`
56
57
  - `layering-and-import-modes/SKILL.md`
57
58
  - `standalone-mobile-client/SKILL.md`
@@ -23,6 +23,8 @@ generation, itinerary generation, content generation, or structured-output UX.
23
23
  - Start with `minutework_capability_inventory` and the generated workspace
24
24
  capability guidance before assuming runtime AI capability is present,
25
25
  missing, or unsupported.
26
+ - When a needed primitive is catalogued but not yet executable or agent-exposed,
27
+ use the sanctioned interim paths in `runtime-primitive-interim-paths/SKILL.md`.
26
28
  - If runtime AI availability is unclear, inspect the linked runtime/workspace
27
29
  context or ask a clarifying question before inventing new AI infrastructure.
28
30
  - When AI drafting or generation touches external participants, guests,
@@ -77,11 +77,11 @@ flows, or the default MinuteWork site model.
77
77
  ## Current Baseline Catalog
78
78
 
79
79
  <!-- builder-doc-sync:mw-core-site:start -->
80
- - Baseline schemas: `mw.core.site.config`, `mw.core.site.page`,
81
- `mw.core.site.nav`, `mw.core.site.form`, `mw.core.site.submission`
80
+ - Baseline schemas: `mw.core.site.config`, `mw.core.site.page`, `mw.core.site.nav`,
81
+ `mw.core.site.form`, `mw.core.site.submission`
82
82
  - Query surfaces: `site.get_public_config`, `site.get_page_by_path`,
83
83
  `site.list_navigation`, `site.get_form_definition`
84
- - Action surfaces: `site.upsert_config`, `site.upsert_page`,
85
- `site.upsert_navigation`, `site.upsert_form`
84
+ - Action surfaces: `site.upsert_config`, `site.upsert_page`, `site.upsert_navigation`,
85
+ `site.upsert_form`
86
86
  - Reserved next schema: `mw.core.site.post`
87
87
  <!-- builder-doc-sync:mw-core-site:end -->
@@ -92,19 +92,70 @@ generated Builder workspace.
92
92
  ## Known Seeded Primitive Catalog
93
93
 
94
94
  <!-- builder-doc-sync:active-primitives:start -->
95
- - Current active primitives by family:
96
- - `records`: `records.query`, `records.upsert`
97
- - `workflow`: `workflow.run_action`, `workflow.schedule_timer`,
98
- `workflow.resume_checkpoint`, `workflow.cancel_on_thread_activity`
99
- - `projection`: `projection.publish_receipt`
100
- - `integrations`: `integrations.query_provider`,
101
- `integrations.execute_automation`
102
- - `communication`: `communication.send_email`, `communication.send_sms`
103
- - `consent`: `consent.check_channel`
104
- - `scheduling`: `scheduling.book_appointment`
105
- - `discovery`: `discovery.request_proposal`
106
- - `voice`: `voice.initiate_call`, `voice.hangup_call`,
107
- `voice.get_call_status`
108
- - `ontology`: `ontology.resolve_local`, `ontology.propose_candidate`
109
- - `command_exec`: `command_exec.run_template`
95
+ - Three-layer rule: catalogued != executor-wired != agent-exposed. Catalog membership
96
+ never implies a primitive can execute today, and an executor never implies any agent
97
+ can call it; check each layer separately.
98
+ - Default agent ring is the read-only READ_RING (`records.query`,
99
+ `app_pack.list_surfaces`, `app_pack.query`); its members need no grant. (`app_pack.*`
100
+ and `delegate_to_builder` are agent tools, not catalog primitives.) Every other tool
101
+ needs a per-agent `enable_agent_tools` grant (operator-only). Enabling the effectful
102
+ `app_pack.action` tool is additionally process-gated on the A1-A3 human-approval
103
+ surface being live for the tenant plane; surfaces with forced approval park on a human
104
+ approval before executing.
105
+ - Machine-readable copy with per-primitive live-status fields:
106
+ `skills/runtime-capability-inventory/primitive-catalog.json` (synced from the runtime
107
+ fixture). The `minutework_runtime_primitive_status` workspace MCP tool serves the same
108
+ answer, linked-runtime-backed when a runtime binding exists.
109
+ - Live executors (catalogued and wired today):
110
+ - `records.query` -- Native agent tool in the default READ_RING: enabled for the
111
+ provisioning-default agent without any grant.
112
+ - `records.upsert` -- Effectful; outside the default READ_RING, granted per agent via
113
+ enable_agent_tools (OPERATOR_RING member).
114
+ - `workflow.run_action` -- Agents reach this envelope through the app_pack.action tool
115
+ over manifest-declared agent_exposed action surfaces; approval is decided per target
116
+ capability/definition.
117
+ - `workflow.schedule_timer` -- Workflow-internal machinery (WORKFLOW_TIMER jobs); not
118
+ an agent-callable tool.
119
+ - `workflow.resume_checkpoint` -- Workflow-internal machinery driven by the jobs
120
+ worker; not an agent-callable tool.
121
+ - `workflow.cancel_on_thread_activity` -- Workflow-internal machinery; not an
122
+ agent-callable tool.
123
+ - `integrations.query_provider` -- Read-only provider query; preflight fail-closes on
124
+ connection/secret availability.
125
+ - `integrations.execute_automation` -- Approval is definition-forced in
126
+ mw.core.agent_actions (a definition can force approval, never relax it).
127
+ - `consent.check_channel` -- Service seam consumed by other executors and sidecars as
128
+ a preflight; not an agent-callable tool.
129
+ - `discovery.request_proposal` -- Effectful; outside the default READ_RING, granted
130
+ per agent via enable_agent_tools (BUILDER_DELEGATION_RING member).
131
+ - `command_exec.run_template` -- Operator/platform-dispatch surface; not an
132
+ agent-callable tool.
133
+ - `voice.hangup_call` -- VoiceSession finalization is live; the provider-side hangup
134
+ leg is platform-owned Phase 4. Not an agent-callable tool.
135
+ - `voice.get_call_status` -- Read-only session status lookup. Not an agent-callable
136
+ tool.
137
+ - Partial executors (wired with a deferred leg; treat the deferred
138
+ leg as unavailable):
139
+ - `scheduling.book_appointment` -- Capability is registered but the direct booking
140
+ executor is MVP-deferred; preflight truthfully reports provider_unavailable.
141
+ - `voice.initiate_call` -- Pre-dial stack is live (consent + TCPA preflight, approval
142
+ parking, VoiceSession lifecycle); the Twilio dial + realtime media worker are
143
+ platform-owned Phase 4.
144
+ - Catalogued-only (no executor wired; use the sanctioned interim
145
+ path):
146
+ - `projection.publish_receipt` -- Owning services emit receipts through the runtime
147
+ bridge directly (e.g. command_exec posts its own run receipts); do not build a
148
+ bespoke generic receipt executor.
149
+ - `communication.send_email` -- Sidecar bridge mirroring the
150
+ runtime_bridge/integrations transport seam with a consent.check_channel preflight;
151
+ route sends through the send_notification seam, never inline in runtime. End-state
152
+ is an action capability like voice.initiate_call.
153
+ - `communication.send_sms` -- Sidecar bridge mirroring the runtime_bridge/integrations
154
+ transport seam with a consent.check_channel preflight; route sends through the
155
+ send_notification seam, never inline in runtime. End-state is an action capability
156
+ like voice.initiate_call.
157
+ - `ontology.resolve_local` -- Seed URNAnchor rows at install; treat resolution as a
158
+ read-only lookup over seeded anchors.
159
+ - `ontology.propose_candidate` -- Stage PromotionCandidate rows for manual review; the
160
+ promotion service is platform-owned, do not build it tenant-side.
110
161
  <!-- builder-doc-sync:active-primitives:end -->
@@ -0,0 +1,392 @@
1
+ {
2
+ "catalog_version": "1.1.0",
3
+ "live_status_contract": {
4
+ "note": "Live-status fields are hand-maintained claims validated against the in-process registries by apps/runtime_builder/tests/test_primitive_live_status.py (fail-closed: a claim without registry evidence fails CI). Catalog membership, executor wiring, and agent exposure are three separate layers.",
5
+ "executor_ready_values": ["live", "partial", "none"],
6
+ "agent_exposure_path_values": ["native_tool", "app_pack_action", "none"],
7
+ "approval_required_null_means": "no registry-evidenced approval seam exists for this primitive: either no executor is wired, or approval is decided per target capability/definition (the workflow.run_action envelope)",
8
+ "executor_ref_schemes": ["tool:<registered agent tool name>", "capability:<registered action capability id>", "service:<module>:<attr>"]
9
+ },
10
+ "primitives": [
11
+ {
12
+ "primitive_id": "records.query",
13
+ "family": "records",
14
+ "display_name": "Query Records",
15
+ "description": "Query dynamic entities by schema, filters, and paging.",
16
+ "runtime_app": "runtime_app_host",
17
+ "dispatch_path": "",
18
+ "status": "active",
19
+ "requires_integration": false,
20
+ "requires_secret": false,
21
+ "metered": false,
22
+ "executor_ready": "live",
23
+ "executor_ref": "tool:records.query",
24
+ "executor_notes": "Native agent tool in the default READ_RING: enabled for the provisioning-default agent without any grant.",
25
+ "agent_exposable": true,
26
+ "agent_exposure_path": "native_tool",
27
+ "approval_required": false,
28
+ "interim_path": ""
29
+ },
30
+ {
31
+ "primitive_id": "records.upsert",
32
+ "family": "records",
33
+ "display_name": "Upsert Record",
34
+ "description": "Create or update a dynamic entity against a registered schema.",
35
+ "runtime_app": "runtime_app_host",
36
+ "dispatch_path": "",
37
+ "status": "active",
38
+ "requires_integration": false,
39
+ "requires_secret": false,
40
+ "metered": false,
41
+ "executor_ready": "live",
42
+ "executor_ref": "tool:records.upsert",
43
+ "executor_notes": "Effectful; outside the default READ_RING, granted per agent via enable_agent_tools (OPERATOR_RING member).",
44
+ "agent_exposable": true,
45
+ "agent_exposure_path": "native_tool",
46
+ "approval_required": false,
47
+ "interim_path": ""
48
+ },
49
+ {
50
+ "primitive_id": "workflow.run_action",
51
+ "family": "workflow",
52
+ "display_name": "Run Action",
53
+ "description": "Execute a typed action through the action-execution contract.",
54
+ "runtime_app": "runtime_app_host",
55
+ "dispatch_path": "",
56
+ "status": "active",
57
+ "requires_integration": false,
58
+ "requires_secret": false,
59
+ "metered": true,
60
+ "executor_ready": "live",
61
+ "executor_ref": "service:apps.runtime_app_host.services:execute_action_run",
62
+ "executor_notes": "Agents reach this envelope through the app_pack.action tool over manifest-declared agent_exposed action surfaces; approval is decided per target capability/definition.",
63
+ "agent_exposable": true,
64
+ "agent_exposure_path": "app_pack_action",
65
+ "approval_required": null,
66
+ "interim_path": ""
67
+ },
68
+ {
69
+ "primitive_id": "workflow.schedule_timer",
70
+ "family": "workflow",
71
+ "display_name": "Schedule Timer",
72
+ "description": "Schedule a durable timer, reminder, or milestone.",
73
+ "runtime_app": "runtime_jobs",
74
+ "dispatch_path": "",
75
+ "status": "active",
76
+ "requires_integration": false,
77
+ "requires_secret": false,
78
+ "metered": false,
79
+ "executor_ready": "live",
80
+ "executor_ref": "service:apps.runtime_app_host.services:schedule_workflow_timer",
81
+ "executor_notes": "Workflow-internal machinery (WORKFLOW_TIMER jobs); not an agent-callable tool.",
82
+ "agent_exposable": false,
83
+ "agent_exposure_path": "none",
84
+ "approval_required": false,
85
+ "interim_path": ""
86
+ },
87
+ {
88
+ "primitive_id": "workflow.resume_checkpoint",
89
+ "family": "workflow",
90
+ "display_name": "Resume Checkpoint",
91
+ "description": "Resume a paused workflow at a human-approval or wait checkpoint.",
92
+ "runtime_app": "runtime_app_host",
93
+ "dispatch_path": "",
94
+ "status": "active",
95
+ "requires_integration": false,
96
+ "requires_secret": false,
97
+ "metered": false,
98
+ "executor_ready": "live",
99
+ "executor_ref": "service:apps.runtime_app_host.services:resume_workflow_checkpoint",
100
+ "executor_notes": "Workflow-internal machinery driven by the jobs worker; not an agent-callable tool.",
101
+ "agent_exposable": false,
102
+ "agent_exposure_path": "none",
103
+ "approval_required": false,
104
+ "interim_path": ""
105
+ },
106
+ {
107
+ "primitive_id": "workflow.cancel_on_thread_activity",
108
+ "family": "workflow",
109
+ "display_name": "Cancel On Thread Activity",
110
+ "description": "Arm a workflow run to cancel when its thread sees inbound activity (e.g. a reply or unsubscribe).",
111
+ "runtime_app": "runtime_app_host",
112
+ "dispatch_path": "",
113
+ "status": "active",
114
+ "requires_integration": false,
115
+ "requires_secret": false,
116
+ "metered": false,
117
+ "executor_ready": "live",
118
+ "executor_ref": "service:apps.runtime_app_host.services:arm_workflow_cancel_on_thread_activity",
119
+ "executor_notes": "Workflow-internal machinery; not an agent-callable tool.",
120
+ "agent_exposable": false,
121
+ "agent_exposure_path": "none",
122
+ "approval_required": false,
123
+ "interim_path": ""
124
+ },
125
+ {
126
+ "primitive_id": "projection.publish_receipt",
127
+ "family": "projection",
128
+ "display_name": "Publish Receipt",
129
+ "description": "Emit a receipt to Core through the runtime bridge.",
130
+ "runtime_app": "runtime_bridge",
131
+ "dispatch_path": "",
132
+ "status": "active",
133
+ "requires_integration": false,
134
+ "requires_secret": false,
135
+ "metered": false,
136
+ "executor_ready": "none",
137
+ "executor_ref": "",
138
+ "executor_notes": "Catalogued only: no generic executor is wired for this primitive id.",
139
+ "agent_exposable": false,
140
+ "agent_exposure_path": "none",
141
+ "approval_required": null,
142
+ "interim_path": "Owning services emit receipts through the runtime bridge directly (e.g. command_exec posts its own run receipts); do not build a bespoke generic receipt executor."
143
+ },
144
+ {
145
+ "primitive_id": "integrations.query_provider",
146
+ "family": "integrations",
147
+ "display_name": "Query Provider",
148
+ "description": "Query an external provider through a managed integration connection.",
149
+ "runtime_app": "runtime_integrations",
150
+ "dispatch_path": "",
151
+ "status": "active",
152
+ "requires_integration": true,
153
+ "requires_secret": true,
154
+ "metered": true,
155
+ "executor_ready": "live",
156
+ "executor_ref": "capability:integrations.query_provider",
157
+ "executor_notes": "Read-only provider query; preflight fail-closes on connection/secret availability.",
158
+ "agent_exposable": true,
159
+ "agent_exposure_path": "app_pack_action",
160
+ "approval_required": false,
161
+ "interim_path": ""
162
+ },
163
+ {
164
+ "primitive_id": "integrations.execute_automation",
165
+ "family": "integrations",
166
+ "display_name": "Execute Automation",
167
+ "description": "Run a browser-automation or portal-execution job.",
168
+ "runtime_app": "runtime_integrations",
169
+ "dispatch_path": "",
170
+ "status": "active",
171
+ "requires_integration": true,
172
+ "requires_secret": true,
173
+ "metered": true,
174
+ "executor_ready": "live",
175
+ "executor_ref": "capability:integrations.execute_automation",
176
+ "executor_notes": "Approval is definition-forced in mw.core.agent_actions (a definition can force approval, never relax it).",
177
+ "agent_exposable": true,
178
+ "agent_exposure_path": "app_pack_action",
179
+ "approval_required": true,
180
+ "interim_path": ""
181
+ },
182
+ {
183
+ "primitive_id": "communication.send_email",
184
+ "family": "communication",
185
+ "display_name": "Send Email",
186
+ "description": "Send an outbound email through a configured provider.",
187
+ "runtime_app": "runtime_communication",
188
+ "dispatch_path": "",
189
+ "status": "active",
190
+ "requires_integration": true,
191
+ "requires_secret": true,
192
+ "metered": true,
193
+ "executor_ready": "none",
194
+ "executor_ref": "",
195
+ "executor_notes": "Catalogued only: no send executor is registered for this primitive id.",
196
+ "agent_exposable": false,
197
+ "agent_exposure_path": "none",
198
+ "approval_required": null,
199
+ "interim_path": "Sidecar bridge mirroring the runtime_bridge/integrations transport seam with a consent.check_channel preflight; route sends through the send_notification seam, never inline in runtime. End-state is an action capability like voice.initiate_call."
200
+ },
201
+ {
202
+ "primitive_id": "communication.send_sms",
203
+ "family": "communication",
204
+ "display_name": "Send SMS",
205
+ "description": "Send an outbound SMS through a configured provider.",
206
+ "runtime_app": "runtime_communication",
207
+ "dispatch_path": "",
208
+ "status": "active",
209
+ "requires_integration": true,
210
+ "requires_secret": true,
211
+ "metered": true,
212
+ "executor_ready": "none",
213
+ "executor_ref": "",
214
+ "executor_notes": "Catalogued only: no send executor is registered for this primitive id.",
215
+ "agent_exposable": false,
216
+ "agent_exposure_path": "none",
217
+ "approval_required": null,
218
+ "interim_path": "Sidecar bridge mirroring the runtime_bridge/integrations transport seam with a consent.check_channel preflight; route sends through the send_notification seam, never inline in runtime. End-state is an action capability like voice.initiate_call."
219
+ },
220
+ {
221
+ "primitive_id": "consent.check_channel",
222
+ "family": "consent",
223
+ "display_name": "Check Channel Consent",
224
+ "description": "Preflight a recipient/channel for suppression, contact preferences, marketing consent, quiet hours, and rate limits before sending.",
225
+ "runtime_app": "runtime_communication",
226
+ "dispatch_path": "",
227
+ "status": "active",
228
+ "requires_integration": false,
229
+ "requires_secret": false,
230
+ "metered": false,
231
+ "executor_ready": "live",
232
+ "executor_ref": "service:apps.runtime_communication.services:check_channel",
233
+ "executor_notes": "Service seam consumed by other executors and sidecars as a preflight; not an agent-callable tool.",
234
+ "agent_exposable": false,
235
+ "agent_exposure_path": "none",
236
+ "approval_required": false,
237
+ "interim_path": ""
238
+ },
239
+ {
240
+ "primitive_id": "scheduling.book_appointment",
241
+ "family": "scheduling",
242
+ "display_name": "Book Appointment",
243
+ "description": "Book a scheduling appointment through a configured provider (Cal.com/Calendly). MVP: the agent shares a correlation-tokened booking link and the provider webhook confirms the booking; the direct executor is provider-gated.",
244
+ "runtime_app": "runtime_integrations",
245
+ "dispatch_path": "",
246
+ "status": "active",
247
+ "requires_integration": true,
248
+ "requires_secret": true,
249
+ "metered": false,
250
+ "executor_ready": "partial",
251
+ "executor_ref": "capability:scheduling.book_appointment",
252
+ "executor_notes": "Capability is registered but the direct booking executor is MVP-deferred; preflight truthfully reports provider_unavailable.",
253
+ "agent_exposable": false,
254
+ "agent_exposure_path": "none",
255
+ "approval_required": false,
256
+ "interim_path": "Target the workflow.run_action link+webhook envelope: share a correlation-tokened booking link (consent-guarded), and the provider webhook POST /api/v1/ingress/booking confirms the booking. Only the preflight changes when the direct executor lands."
257
+ },
258
+ {
259
+ "primitive_id": "discovery.request_proposal",
260
+ "family": "discovery",
261
+ "display_name": "Request Discovery Proposal",
262
+ "description": "Bridge a thread into the Vuilder discovery engine: create a discovery lead/session (resume optional), link it to the thread, and poll the gateway until the proposal is ready, then post the build-direction cards member-only. Discovery stays authoritative in public-dj.",
263
+ "runtime_app": "runtime_agents",
264
+ "dispatch_path": "",
265
+ "status": "active",
266
+ "requires_integration": false,
267
+ "requires_secret": true,
268
+ "metered": false,
269
+ "executor_ready": "live",
270
+ "executor_ref": "tool:discovery.request_proposal",
271
+ "executor_notes": "Effectful; outside the default READ_RING, granted per agent via enable_agent_tools (BUILDER_DELEGATION_RING member).",
272
+ "agent_exposable": true,
273
+ "agent_exposure_path": "native_tool",
274
+ "approval_required": false,
275
+ "interim_path": ""
276
+ },
277
+ {
278
+ "primitive_id": "ontology.resolve_local",
279
+ "family": "ontology",
280
+ "display_name": "Resolve Local Ontology",
281
+ "description": "Resolve a local record against the ontology bundle and Core URNs.",
282
+ "runtime_app": "runtime_memory",
283
+ "dispatch_path": "",
284
+ "status": "active",
285
+ "requires_integration": false,
286
+ "requires_secret": false,
287
+ "metered": false,
288
+ "executor_ready": "none",
289
+ "executor_ref": "",
290
+ "executor_notes": "Catalogued only: URNAnchor models exist but no resolve executor is wired.",
291
+ "agent_exposable": false,
292
+ "agent_exposure_path": "none",
293
+ "approval_required": null,
294
+ "interim_path": "Seed URNAnchor rows at install; treat resolution as a read-only lookup over seeded anchors."
295
+ },
296
+ {
297
+ "primitive_id": "ontology.propose_candidate",
298
+ "family": "ontology",
299
+ "display_name": "Propose Ontology Candidate",
300
+ "description": "Submit a promotion candidate to Core for shared ontology acceptance.",
301
+ "runtime_app": "runtime_bridge",
302
+ "dispatch_path": "",
303
+ "status": "active",
304
+ "requires_integration": false,
305
+ "requires_secret": false,
306
+ "metered": false,
307
+ "executor_ready": "none",
308
+ "executor_ref": "",
309
+ "executor_notes": "Catalogued only: PromotionCandidate models exist but no propose executor is wired.",
310
+ "agent_exposable": false,
311
+ "agent_exposure_path": "none",
312
+ "approval_required": null,
313
+ "interim_path": "Stage PromotionCandidate rows for manual review; the promotion service is platform-owned, do not build it tenant-side."
314
+ },
315
+ {
316
+ "primitive_id": "command_exec.run_template",
317
+ "family": "command_exec",
318
+ "display_name": "Run Command Template",
319
+ "description": "Execute a named command template with validated arguments.",
320
+ "runtime_app": "runtime_command_exec",
321
+ "dispatch_path": "",
322
+ "status": "active",
323
+ "requires_integration": false,
324
+ "requires_secret": false,
325
+ "metered": false,
326
+ "executor_ready": "live",
327
+ "executor_ref": "service:apps.runtime_command_exec.services:launch_command_execution",
328
+ "executor_notes": "Operator/platform-dispatch surface; not an agent-callable tool.",
329
+ "agent_exposable": false,
330
+ "agent_exposure_path": "none",
331
+ "approval_required": false,
332
+ "interim_path": ""
333
+ },
334
+ {
335
+ "primitive_id": "voice.initiate_call",
336
+ "family": "voice",
337
+ "display_name": "Initiate Call",
338
+ "description": "Place an outbound voice call to a contact and join an AI on the line. Runs through execute_action_run: preflight enforces consent (do_not_call), TCPA calling windows/quiet hours, and telephony-provider availability, then drives a VoiceSession (direction=outbound). The actual Twilio dial + realtime media worker are platform-owned (v3_voice_replacement Phase 4); outbound calls default to human approval.",
339
+ "runtime_app": "runtime_agents",
340
+ "dispatch_path": "",
341
+ "status": "active",
342
+ "requires_integration": true,
343
+ "requires_secret": true,
344
+ "metered": true,
345
+ "executor_ready": "partial",
346
+ "executor_ref": "capability:voice.initiate_call",
347
+ "executor_notes": "Pre-dial stack is live (consent + TCPA preflight, approval parking, VoiceSession lifecycle); the Twilio dial + realtime media worker are platform-owned Phase 4.",
348
+ "agent_exposable": true,
349
+ "agent_exposure_path": "app_pack_action",
350
+ "approval_required": true,
351
+ "interim_path": "Build the pre-dial stack now (preflight matrix, APPROVAL_PENDING parking, VoiceSession lifecycle, mock transcripts, hangup/get_call_status); dial, media worker, and inbound telephony are platform-owned Phase 4."
352
+ },
353
+ {
354
+ "primitive_id": "voice.hangup_call",
355
+ "family": "voice",
356
+ "display_name": "Hang Up Call",
357
+ "description": "Finalize an in-progress voice call: finalize the VoiceSession (terminal status + duration) and request provider hangup. Provider hangup is platform-owned (v3_voice_replacement Phase 4).",
358
+ "runtime_app": "runtime_agents",
359
+ "dispatch_path": "",
360
+ "status": "active",
361
+ "requires_integration": true,
362
+ "requires_secret": true,
363
+ "metered": false,
364
+ "executor_ready": "live",
365
+ "executor_ref": "capability:voice.hangup_call",
366
+ "executor_notes": "VoiceSession finalization is live; the provider-side hangup leg is platform-owned Phase 4. Not an agent-callable tool.",
367
+ "agent_exposable": false,
368
+ "agent_exposure_path": "none",
369
+ "approval_required": false,
370
+ "interim_path": ""
371
+ },
372
+ {
373
+ "primitive_id": "voice.get_call_status",
374
+ "family": "voice",
375
+ "display_name": "Get Call Status",
376
+ "description": "Read the current status, duration, and transcript summary for a VoiceSession. Read-only; no provider call.",
377
+ "runtime_app": "runtime_agents",
378
+ "dispatch_path": "",
379
+ "status": "active",
380
+ "requires_integration": true,
381
+ "requires_secret": true,
382
+ "metered": false,
383
+ "executor_ready": "live",
384
+ "executor_ref": "capability:voice.get_call_status",
385
+ "executor_notes": "Read-only session status lookup. Not an agent-callable tool.",
386
+ "agent_exposable": false,
387
+ "agent_exposure_path": "none",
388
+ "approval_required": false,
389
+ "interim_path": ""
390
+ }
391
+ ]
392
+ }
@@ -0,0 +1,96 @@
1
+ ---
2
+ name: runtime-primitive-interim-paths
3
+ description: "Sanctioned interim build paths for catalogued runtime primitives that are not fully executable or agent-exposed yet: outbound comms, booking, ontology, voice, exposure ops, sandbox parity."
4
+ ---
5
+
6
+ # Runtime Primitive Interim Paths
7
+
8
+ Use this skill when a build targets a runtime primitive that is catalogued but
9
+ not fully executable or agent-exposed yet, and the workspace needs a sanctioned
10
+ interim path instead of bespoke substrate.
11
+
12
+ Catalog membership never implies executability or agent exposure. Check the
13
+ live-status block in `skills/runtime-capability-inventory/SKILL.md` and the
14
+ `minutework_runtime_primitive_status` workspace MCP tool first; the paths below
15
+ are the sanctioned interim shapes for the known gaps.
16
+
17
+ ## Outbound Email / SMS (`communication.send_email` / `communication.send_sms`)
18
+
19
+ Status: catalogued, no executor.
20
+
21
+ - Build outbound delivery as a sidecar bridge mirroring the
22
+ `runtime_bridge`/integrations transport seam.
23
+ - Always preflight with `consent.check_channel` (suppression, contact
24
+ preferences, marketing consent, quiet hours, rate limits).
25
+ - Route sends through the runtime's `send_notification` seam, which queues a
26
+ `SCHEDULED_SEND` job. Never send inline in runtime request paths.
27
+ - The end-state is a governed action capability like `voice.initiate_call`.
28
+ File a `BuilderCapabilityRequest` gap (see
29
+ `skills/capability-gap-reporting/SKILL.md`) rather than hard-wiring a
30
+ provider SDK into runtime.
31
+
32
+ ## Booking (`scheduling.book_appointment`)
33
+
34
+ Status: partial -- capability registered; preflight truthfully reports
35
+ `provider_unavailable`.
36
+
37
+ - Target the `workflow.run_action` envelope now: share a correlation-tokened
38
+ Cal.com/Calendly booking link through a consent-guarded notification.
39
+ - The provider webhook `POST /api/v1/ingress/booking` (this route exists on
40
+ the platform gateway and the runtime ingress dispatcher) confirms the
41
+ booking.
42
+ - When the direct executor lands, only the preflight outcome changes. Author
43
+ flows against the envelope, not the provider.
44
+
45
+ ## Ontology (`ontology.resolve_local` / `ontology.propose_candidate`)
46
+
47
+ Status: catalogued, no executor; `URNAnchor` and `PromotionCandidate` models
48
+ exist in `runtime_ontology`.
49
+
50
+ - Seed `URNAnchor` rows at install; treat `resolve_local` as a read-only
51
+ lookup over seeded anchors.
52
+ - Treat `propose_candidate` as staging `PromotionCandidate` rows for manual
53
+ review. The promotion service is platform-owned -- do not build it
54
+ tenant-side.
55
+
56
+ ## Voice (`voice.initiate_call`)
57
+
58
+ Status: partial; `hangup_call` / `get_call_status` are live.
59
+
60
+ - The workspace can build the full pre-dial stack: the preflight matrix
61
+ (consent `do_not_call` -> TCPA calling window 08:00-21:00 callee-local ->
62
+ provider availability), `APPROVAL_PENDING` parking on the `ActionRun`,
63
+ `VoiceSession` lifecycle, mock transcripts, and `hangup_call` /
64
+ `get_call_status` handling.
65
+ - The actual dial, the realtime media worker, and inbound telephony are
66
+ platform-owned (`v3_voice_replacement` Phase 4). Never implement Twilio
67
+ internals in a workspace.
68
+
69
+ ## Exposure Ops
70
+
71
+ - Per-agent tool grants happen only via the operator-run `enable_agent_tools`
72
+ management command (registry-validated names; `@read` / `@operator` /
73
+ `@builder_delegation` ring tokens).
74
+ - Manifest-declared exposure (D1) is live: app-pack manifests declare
75
+ `agentExposed` per action/query (truthy-only, plus approval metadata on
76
+ capability-bound actions), and those surfaces are reached through the
77
+ `app_pack.action` / `app_pack.query` tools -- which still require the
78
+ per-agent grant above.
79
+ - `app_pack.action` exposure is process-gated on the A1-A3 human-approval
80
+ surface being live for the tenant plane; `integrations.execute_automation`
81
+ and `voice.initiate_call` park on approval.
82
+
83
+ ## Sandbox Tier Parity
84
+
85
+ - Sandbox runtimes run identical wiring and gating to primary -- a faithful
86
+ dry-run. There is no permissive sandbox mode; anything blocked on primary is
87
+ blocked in sandbox.
88
+
89
+ ## Before Authoring
90
+
91
+ - Check the live-status block in
92
+ `skills/runtime-capability-inventory/SKILL.md` and the
93
+ `minutework_runtime_primitive_status` workspace MCP tool before authoring
94
+ against any primitive.
95
+ - File gaps via `skills/capability-gap-reporting/SKILL.md` for the comms
96
+ executor and the ontology services.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "minutework",
3
- "version": "0.1.44",
3
+ "version": "0.1.46",
4
4
  "description": "MinuteWork CLI for workspace scaffolding, local preview workflows, and hosted preview deploys.",
5
5
  "type": "module",
6
6
  "bin": {
@@ -24,8 +24,8 @@
24
24
  "@modelcontextprotocol/sdk": "^1.28.0",
25
25
  "jiti": "^2.6.1",
26
26
  "zod": "^4.3.6",
27
- "@minutework/platform-config": "0.1.3",
28
- "@minutework/schema-compiler": "0.1.7"
27
+ "@minutework/schema-compiler": "0.1.8",
28
+ "@minutework/platform-config": "0.1.3"
29
29
  },
30
30
  "devDependencies": {
31
31
  "@types/node": "^24.9.1",