workspai 0.75.2 → 0.76.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 (113) hide show
  1. package/contracts/agent-framework-capabilities.v1.json +2 -2
  2. package/contracts/cli-runtime-command-inventory.v1.snapshot.json +12 -0
  3. package/contracts/create-planner-capabilities.v1.json +24 -0
  4. package/contracts/extension-cli-compatibility.v1.json +4 -2
  5. package/contracts/published-contract-catalog.v1.json +10 -0
  6. package/contracts/runtime-command-surface.v1.json +3 -1
  7. package/contracts/workspace-intelligence/agent-framework-admission-candidate.v2.json +217 -0
  8. package/contracts/workspace-intelligence/agent-framework-conformance-report.v2.json +274 -0
  9. package/contracts/workspace-intelligence-architecture.v1.json +5 -3
  10. package/dist/analyze-QVRVJB7I.js +1 -0
  11. package/dist/autopilot-release-DOGIETAT.js +1 -0
  12. package/dist/capabilities-command-FYBUVHZ7.js +1 -0
  13. package/dist/{chunk-ADHX7D3F.js → chunk-23CNBYIW.js} +1 -1
  14. package/dist/{chunk-IKBE3HOH.js → chunk-2I2A55RE.js} +1 -1
  15. package/dist/{chunk-4JXJRIJM.js → chunk-4BBFEHPL.js} +1 -1
  16. package/dist/{chunk-VHMDWRDG.js → chunk-4BPZJR4Z.js} +4 -4
  17. package/dist/{chunk-KDVNRNDU.js → chunk-4MXKXHLW.js} +1 -1
  18. package/dist/{chunk-JKAAKE4Z.js → chunk-4R44E7HN.js} +1 -1
  19. package/dist/chunk-5S6IZ6PY.js +2 -0
  20. package/dist/chunk-6BO4QHKA.js +1 -0
  21. package/dist/{chunk-VWBWDDU2.js → chunk-AGI46TSQ.js} +1 -1
  22. package/dist/{chunk-GDOO2YZW.js → chunk-BZLDCASY.js} +1 -1
  23. package/dist/{chunk-OA2YJN22.js → chunk-DWDYLKVW.js} +1 -1
  24. package/dist/{chunk-P36TACKN.js → chunk-FBF767WP.js} +1 -1
  25. package/dist/{chunk-PFAGXI3G.js → chunk-FD2ZGGCQ.js} +1 -1
  26. package/dist/chunk-H4YHIOCT.js +7 -0
  27. package/dist/{chunk-ZI54C2AO.js → chunk-HRGIHWYH.js} +1 -1
  28. package/dist/{chunk-LFY7KTPD.js → chunk-IKNWNGLY.js} +1 -1
  29. package/dist/{chunk-ZGVODK5C.js → chunk-KO4DM2AV.js} +1 -1
  30. package/dist/{chunk-FNVWDXK2.js → chunk-KW35SWG6.js} +5 -5
  31. package/dist/{chunk-EP7SUMAX.js → chunk-L6VNI4DN.js} +1 -1
  32. package/dist/chunk-NSC4VWV2.js +1 -0
  33. package/dist/chunk-P5LI5DL3.js +1 -0
  34. package/dist/chunk-PSQPKK6H.js +97 -0
  35. package/dist/chunk-PUH3TSPC.js +1 -0
  36. package/dist/chunk-QFDTKOYS.js +2649 -0
  37. package/dist/chunk-QIPW3G2H.js +1 -0
  38. package/dist/chunk-QVFIR64T.js +10 -0
  39. package/dist/{chunk-FZWLWFR4.js → chunk-R3Z4LY3O.js} +1 -1
  40. package/dist/chunk-RKFTUIZ4.js +4 -0
  41. package/dist/{chunk-COOVCORC.js → chunk-SVO2GGTV.js} +1 -1
  42. package/dist/{chunk-5K4O3TAW.js → chunk-TFFNHWXY.js} +1 -1
  43. package/dist/chunk-TJ3MDZMC.js +6 -0
  44. package/dist/{chunk-WXUCAVFT.js → chunk-UOTOJJI4.js} +8 -8
  45. package/dist/chunk-VODNLROY.js +1 -0
  46. package/dist/{chunk-WHBKKJ7L.js → chunk-X7MDTBX5.js} +1 -1
  47. package/dist/chunk-YLLCZMKP.js +2 -0
  48. package/dist/{chunk-K52IQX3J.js → chunk-Z2M2XCIB.js} +1 -1
  49. package/dist/{chunk-DTNOF3MP.js → chunk-ZXQC36NJ.js} +1 -1
  50. package/dist/{create-ZFSFWAW3.js → create-ZRUQ3KNZ.js} +1 -1
  51. package/dist/{doctor-4KL4XUCS.js → doctor-7V7LJLHX.js} +1 -1
  52. package/dist/{goal-lifecycle-EXQZD7IA.js → goal-lifecycle-EM4DUJCR.js} +1 -1
  53. package/dist/{goal-pack-DKJU2DEP.js → goal-pack-YMWZHAH6.js} +1 -1
  54. package/dist/index.d.ts +12 -6
  55. package/dist/index.js +251 -250
  56. package/dist/{pipeline-4GVAOCEN.js → pipeline-6MBH3MU2.js} +1 -1
  57. package/dist/platform-capabilities-RWOWND5Q.js +1 -0
  58. package/dist/{project-agent-entry-7QKNEEXP.js → project-agent-entry-ZXAE2MAJ.js} +1 -1
  59. package/dist/{project-intelligence-lens-IHRYCLNU.js → project-intelligence-lens-NBTPOK2R.js} +1 -1
  60. package/dist/{project-test-coverage-3P5FH6E5.js → project-test-coverage-HOZC72EK.js} +1 -1
  61. package/dist/proof-carrying-change-WJFAKK3C.js +1 -0
  62. package/dist/{pythonRapidkitExec-UMFLDIYR.js → pythonRapidkitExec-S35OEIEF.js} +1 -1
  63. package/dist/{verified-goal-XI4RQESU.js → verified-goal-B7EX2PBE.js} +1 -1
  64. package/dist/{workspace-EYXAKMVI.js → workspace-EBPYCSEM.js} +1 -1
  65. package/dist/{workspace-agent-sync-SN55KT6N.js → workspace-agent-sync-Y4F6FBBC.js} +1 -1
  66. package/dist/{workspace-context-PW6ESEHH.js → workspace-context-Y7F7GJCQ.js} +1 -1
  67. package/dist/{workspace-contract-FPLFL4G3.js → workspace-contract-XJMWMVQE.js} +1 -1
  68. package/dist/{workspace-explain-TVQ5IF5D.js → workspace-explain-T2J5ZLY7.js} +1 -1
  69. package/dist/{workspace-foundation-DWIJPZRH.js → workspace-foundation-2UP6IMTH.js} +1 -1
  70. package/dist/{workspace-graph-stream-RUTNWLQB.js → workspace-graph-stream-MZVL3OCX.js} +1 -1
  71. package/dist/{workspace-intelligence-4CA2CSPZ.js → workspace-intelligence-FZRQIFFM.js} +1 -1
  72. package/dist/{workspace-intelligence-runner-VM5SXXAT.js → workspace-intelligence-runner-IXT62JG7.js} +1 -1
  73. package/dist/{workspace-knowledge-graph-JXN2ZOAF.js → workspace-knowledge-graph-EFC4TUDZ.js} +1 -1
  74. package/dist/workspace-knowledge-graph-snapshot-QIMF7TCF.js +1 -0
  75. package/dist/{workspace-mcp-serve-4WN4CSD7.js → workspace-mcp-serve-C42UUU7W.js} +1 -1
  76. package/dist/{workspace-model-D4IECQML.js → workspace-model-72SJ6WXT.js} +1 -1
  77. package/dist/{workspace-onboarding-6XWDKLM5.js → workspace-onboarding-TFDAIHTS.js} +1 -1
  78. package/dist/{workspace-registry-summary-Y3ET36NH.js → workspace-registry-summary-ZNTXSUI4.js} +1 -1
  79. package/dist/{workspace-repair-engine-HBUXRHDY.js → workspace-repair-engine-542TAL3Z.js} +1 -1
  80. package/dist/workspace-run-NAPJYNSZ.js +1 -0
  81. package/dist/{workspace-verify-OOAZ3NMZ.js → workspace-verify-UXKENOQU.js} +1 -1
  82. package/dist/{workspace-watch-BNM5B6HU.js → workspace-watch-DV5AHLOK.js} +1 -1
  83. package/docs/README.md +2 -2
  84. package/docs/agent-framework-adapters.md +164 -39
  85. package/docs/ci-workflows.md +29 -22
  86. package/docs/commands-reference.md +17 -8
  87. package/docs/creating-workspaces-and-projects.md +4 -2
  88. package/docs/doctor-command.md +6 -4
  89. package/docs/native-kit-baselines.md +2 -1
  90. package/docs/workspace-run.md +3 -1
  91. package/package.json +3 -1
  92. package/scripts/enterprise-package-smoke.mjs +98 -5
  93. package/dist/analyze-6UEBC5OJ.js +0 -1
  94. package/dist/autopilot-release-H5TO6NYY.js +0 -1
  95. package/dist/capabilities-command-VK3LQLP2.js +0 -1
  96. package/dist/chunk-3N27P3KO.js +0 -7
  97. package/dist/chunk-3RNWBFRP.js +0 -4
  98. package/dist/chunk-66O62XNJ.js +0 -97
  99. package/dist/chunk-7NKM6EHE.js +0 -7
  100. package/dist/chunk-BR6QIYQS.js +0 -1
  101. package/dist/chunk-DFREJHG7.js +0 -1
  102. package/dist/chunk-E42IFQFR.js +0 -6
  103. package/dist/chunk-EWD6QTAM.js +0 -2
  104. package/dist/chunk-G5UCEXP6.js +0 -1
  105. package/dist/chunk-LARREYZN.js +0 -1
  106. package/dist/chunk-RGNCL5OB.js +0 -1
  107. package/dist/chunk-SZHRPELL.js +0 -1
  108. package/dist/chunk-VXFIMEC6.js +0 -2
  109. package/dist/chunk-X7OI24LO.js +0 -418
  110. package/dist/platform-capabilities-DB4BZPTD.js +0 -1
  111. package/dist/proof-carrying-change-O37XUPIZ.js +0 -1
  112. package/dist/workspace-knowledge-graph-snapshot-KBNUXA64.js +0 -1
  113. package/dist/workspace-run-VN7KV4BU.js +0 -1
@@ -12,23 +12,31 @@ existing project ---/ |
12
12
  -> Workspai Context, Goal, PCC, and Verify
13
13
  ```
14
14
 
15
- Microsoft Agent Framework is the first concrete implementation of this
15
+ Microsoft Agent Framework is the first adapter implementation of this
16
16
  foundation. Its Python and .NET adapters are intentionally separate because
17
17
  their package graphs, runtime requirements, entrypoints, and verification
18
- commands differ. Both are available for governed attachment after their exact
19
- manifest digests pass the required Linux, macOS, and Windows conformance lanes
20
- and are bound into the reviewed release-admission inventory.
18
+ commands differ. Both become available for governed attachment only after the
19
+ exact manifest and release baseline pass the required Linux, macOS, and Windows
20
+ conformance lanes and are bound into the reviewed release-admission inventory.
21
+ Per-platform semantic implementation digests accompany that evidence for
22
+ traceability, but do not act as runtime authorization locks.
23
+
24
+ OpenAI Agents SDK adapters for Python and TypeScript are implemented in the
25
+ same registry and lifecycle. They become Create/Attach kits only after their
26
+ complete cross-platform matrix is reviewed into that inventory. Public
27
+ commands fail closed rather than silently substituting Microsoft, OpenAI, or
28
+ another runtime.
21
29
 
22
30
  ## Published contracts
23
31
 
24
- | Contract | Purpose |
25
- | ------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------- |
26
- | `contracts/agent-framework-capabilities.v1.json` | Normative ownership, capability, lifecycle, security, versioning, and admission rules |
27
- | `contracts/workspace-intelligence/agent-framework-adapter-manifest.v1.json` | JSON Schema for one framework/version adapter declaration |
28
- | `contracts/workspace-intelligence/agent-framework-conformance-report.v1.json` | JSON Schema for reproducible adapter admission evidence |
29
- | `contracts/workspace-intelligence/agent-framework-change-plan.v1.json` | Portable, mutation-free scaffold or attach plan returned to the host |
30
- | `contracts/workspace-intelligence/agent-framework-ownership-receipt.v1.json` | Hash-bound proof of the files Workspai may safely refresh |
31
- | `contracts/workspace-intelligence/agent-framework-admission-candidate.v1.json` | Review-pending, digest-bound index of the complete cross-platform evidence matrix |
32
+ | Contract | Purpose |
33
+ | ------------------------------------------------------------------------------ | ---------------------------------------------------------------------------------------- |
34
+ | `contracts/agent-framework-capabilities.v1.json` | Normative ownership, capability, lifecycle, security, versioning, and admission rules |
35
+ | `contracts/workspace-intelligence/agent-framework-adapter-manifest.v1.json` | JSON Schema for one framework/version adapter declaration |
36
+ | `contracts/workspace-intelligence/agent-framework-conformance-report.v2.json` | JSON Schema binding reproducible adapter evidence to manifest and implementation digests |
37
+ | `contracts/workspace-intelligence/agent-framework-change-plan.v1.json` | Portable, mutation-free scaffold or attach plan returned to the host |
38
+ | `contracts/workspace-intelligence/agent-framework-ownership-receipt.v1.json` | Hash-bound proof of the files Workspai may safely refresh |
39
+ | `contracts/workspace-intelligence/agent-framework-admission-candidate.v2.json` | Review-pending, digest-bound index of the complete cross-platform evidence matrix |
32
40
 
33
41
  The schemas are also discoverable through
34
42
  `contracts/published-contract-catalog.v1.json` and the extension compatibility
@@ -109,16 +117,38 @@ Generated starter files use an isolated `agents/<instance>` root and keep
109
117
  adapter state under `.workspai/agent-frameworks/<adapter>/<instance>.json`.
110
118
  That instance contains the only runtime dependency manifest; the project root
111
119
  does not receive an empty Python or .NET manifest that could be mistaken for a
112
- second executable unit. Workspace Model reports these projects as `agent`,
120
+ second executable unit. Python and .NET starters resolve bounded context from
121
+ the directory that owns `agents/<instance>/`. They do not use process cwd.
122
+ `workspace run start` executes from the agent package directory and still
123
+ finds `.workspai/reports/project-context-agent.json` at the project root.
124
+ Loaders share the OpenAI containment contract: canonical path walk, regular-file
125
+ open, 128 KiB cap, UTF-8 JSON, and `schemaVersion: project-context-agent.v1`.
126
+ The Python starter is pip-editable (`[build-system]` + setuptools modules) and
127
+ uses the official Foundry hello-world `Agent(client=FoundryChatClient(...))`
128
+ pattern with three read-only documented tools: `describe_workspai_context`,
129
+ `read_workspai_project_summary`, and `list_workspai_supported_commands`. The
130
+ .NET starter uses `AIProjectClient.AsAIAgent` plus `AIFunctionFactory.Create`,
131
+ enables `RestorePackagesWithLockFile`, and does not emit invented NuGet lock
132
+ hashes. Neither starter pastes admitted JSON into instructions; live
133
+ entrypoints stream stdout and accept a prompt from argv or stdin. Neither
134
+ starter hardcodes a Foundry model name; `FOUNDRY_MODEL` is
135
+ required. `DefaultAzureCredential` remains the local development convenience
136
+ Microsoft documents; generated READMEs tell production hosts to prefer
137
+ `ManagedIdentityCredential`. Adapters remain `preview`. Unsupported Microsoft
138
+ primitives (durable workflows, MCP, HITL loops, hosted tools) stay out of the
139
+ generated first-version scaffold.
140
+ Workspace Model reports these projects as `agent`,
113
141
  retains `microsoft-agent-framework` as their framework identity, and reports
114
142
  only lifecycle stages backed by concrete manifests, entrypoints, tests, or an
115
143
  owned project runner.
116
144
  Each starter also includes credentialless tests for the bounded context
117
- boundary and an environment-name example with no secret values. Python uses
118
- the host platform's normal Python 3 launcher and remains dependency-free for
119
- these tests; .NET uses a separately pinned test project. The conformance matrix
120
- executes these tests in addition to compiling and exercising the deterministic
121
- framework lifecycle.
145
+ boundary, allowlisted views, and Azure-shaped redaction, plus an
146
+ environment-name example with no secret values. Python context
147
+ tests isolate the operational context file and restore it afterward; they stay
148
+ dependency-free unless `agent-framework` is installed for the optional
149
+ LocalChatClient loop. .NET uses a separately pinned test project. The conformance
150
+ matrix executes these tests in addition to compiling and exercising the
151
+ deterministic framework lifecycle.
122
152
  Existing user-authored files are blockers, never overwrite targets. A managed
123
153
  comment alone does not prove ownership: refresh also requires the previous
124
154
  Workspai ownership receipt, which is bound to the exact adapter-manifest digest;
@@ -127,18 +157,100 @@ Provider credentials remain environment references. The first provider profile u
127
157
  Microsoft Foundry, but provider identity is not part of framework identity and
128
158
  additional profiles must preserve the same security boundary.
129
159
 
130
- A path-filtered six-lane adapter matrix compiles the generated Python and .NET
131
- projects on Linux, macOS, and Windows. Every lane records all 18 mandatory
132
- checks, the exact runtime and framework baseline, a digest of the adapter
133
- manifest, and one bounded evidence file per check. Reports are retained as CI
134
- artifacts for review. A final job validates every evidence path and admits the
135
- matrix only when all three operating-system lanes pass for both adapters.
160
+ ## OpenAI Agents SDK baseline
161
+
162
+ The built-in OpenAI adapters pin independently verified SDK baselines. They do
163
+ not reuse Microsoft detection, kits, or model-provider defaults.
164
+
165
+ | Adapter | Tested framework | Runtime | Authored detection |
166
+ | -------------------------- | ---------------- | --------------- | ---------------------------------- |
167
+ | `openai-agents-python` | `0.22.2` | Python `>=3.10` | exact PyPI package `openai-agents` |
168
+ | `openai-agents-typescript` | `0.18.0` | Node.js `>=22` | exact npm package `@openai/agents` |
169
+
170
+ The TypeScript starter also pins peer `zod` `4.6.5`, TypeScript `5.9.3`, and
171
+ `@types/node` `22.20.3`. The `openai` PyPI or npm package alone is not this
172
+ framework. Generated markers under `.workspai/agent-frameworks/` cannot select
173
+ it.
174
+
175
+ Generated loaders resolve the Workspai project as the directory that owns
176
+ `agents/<instance>/`. They do not use process cwd, unbounded ancestor search,
177
+ or a copied context file inside the agent package. Canonical containment,
178
+ a regular-file open (`O_NOFOLLOW` when the platform provides it), the 128 KiB
179
+ cap, UTF-8 JSON, and `schemaVersion: project-context-agent.v1` are enforced in
180
+ the starter. Generation, freshness, and integrity remain host-owned agent-sync
181
+ work. Internal symlinks, including Windows reparse points treated as links, are
182
+ allowed only when every resolved hop stays inside the project root. Diagnostics
183
+ do not include file contents.
184
+
185
+ The loader walk is not an atomic open. Between `lstat` of one hop and `open` of
186
+ the next, a local actor who can replace a path component may still race the
187
+ walk. The bound we claim, and only that bound, is: after a successful open with
188
+ `O_NOFOLLOW` when the kernel provides it, that file descriptor is `fstat`'d and
189
+ at most 128 KiB is read from that descriptor. This is not a proof of complete
190
+ TOCTOU immunity, of Windows junction behavior on every host, or of
191
+ enterprise-grade isolation.
192
+
193
+ Claimed capabilities are conservative and independently evidenced:
194
+
195
+ - native: `single-agent`, `typed-tools`, `local-execution`
196
+ - conditional: `telemetry` (defaults off; `WORKSPAI_AGENT_TRACING=1` opts in;
197
+ `OPENAI_AGENTS_DISABLE_TRACING=1|true` keeps tracing off even if the opt-in
198
+ is set), `provider-neutral-models` (starter only reads `OPENAI_MODEL` /
199
+ `OPENAI_DEFAULT_MODEL`)
200
+ - unsupported in this version: handoffs, MCP, sessions/resume, voice, sandbox,
201
+ hosted tools, and human-approval loops
202
+
203
+ Python cancellation uses `Runner.max_turns` and `ModelSettings.timeout` from
204
+ `openai-agents` `0.22.2`. `ModelSettings.timeout` is a per-model-request
205
+ timeout applied only on the live model path. Injected `ScriptedModel` runs omit
206
+ it because that setting hung the official test double on Python 3.13.
207
+ TypeScript cancellation uses `maxTurns` plus `AbortSignal` from
208
+ `@openai/agents` `0.18.0`. Those SDK controls are not a Workspai-owned timeout
209
+ service. Workspai still owns mutation admission and verification; a successful
210
+ model run is not verified evidence.
211
+
212
+ Generated starters do not paste `project-context-agent.json` into model
213
+ instructions. They expose three read-only tools over allowlisted views:
214
+ context size and `schemaVersion`, workspace/project identity (including
215
+ `boundedGraphSearch` as a pointer, not a shell), and the admitted command
216
+ surface. Live Python uses `Runner.run_streamed`; live TypeScript streams
217
+ `Runner.run({ stream: true })`. Credentialless ScriptedModel tests stay on
218
+ the non-stream `run` path. A prompt is taken from argv or stdin.
219
+
220
+ Generated OpenAI context tests copy the operational
221
+ `.workspai/reports/project-context-agent.json` aside for the suite and restore
222
+ it afterward. A green test run is not allowed to delete or replace that host
223
+ artifact.
224
+
225
+ Create lists every published agent kit under **AI Agent**, including
226
+ `agent.openai.python` and `agent.openai.typescript`. That picker is the
227
+ published catalog: it is not filtered by release-admission digest match or
228
+ workspace profile. A later adapter-manifest change must not hide a kit.
229
+ Create and Attach still refuse a kit whose adapter is not release-admitted;
230
+ visibility in the picker is not permission to write a blocked adapter.
231
+ Attach still requires `--framework openai-agents` when the
232
+ runtime is shared. OpenAI adapters are labeled `stable`; release admission
233
+ remains blocked until the exact v2 cross-platform candidate is promoted.
234
+ Handoffs, MCP, sessions, voice, sandbox, and approval loops stay unsupported.
235
+ Microsoft adapters remain `preview`.
236
+
237
+ A path-filtered PR gate compiles only the affected Microsoft or OpenAI adapter
238
+ family on Linux. Shared lifecycle, security, registry, admission, and contract
239
+ changes select both families; documentation-only edits do not run adapter
240
+ conformance. The complete twelve-lane matrix is an explicit release-
241
+ qualification operation: it compiles Microsoft Python/.NET and OpenAI
242
+ Python/TypeScript on Linux, macOS, and Windows. Every full-qualification lane
243
+ records all 18 mandatory checks, the exact runtime and framework baseline,
244
+ digests of the adapter manifest and semantic implementation, and one bounded
245
+ evidence file per check. Reports are retained as CI artifacts for review. A
246
+ final job validates every evidence path and emits an admission candidate only
247
+ when all three operating-system lanes pass for every built-in adapter.
136
248
  Python conformance is pinned to 3.10.11, the final Python 3.10 release with
137
249
  cross-platform binary installers; this provides one reproducible minimum-runtime
138
250
  baseline while the adapter continues to declare Python `>=3.10` support.
139
251
 
140
252
  After verification, CI emits one admission-candidate artifact. It binds the
141
- source commit, CLI version, adapter-manifest digests, lane reports, and every
253
+ source commit, CLI version, adapter manifest and implementation digests, lane reports, and every
142
254
  evidence file by SHA-256. Its status is always `pending`: successful CI produces
143
255
  reviewable evidence, not release authority. Only the protected version-update
144
256
  branch may convert that candidate into the exact release-admission inventory,
@@ -149,11 +261,16 @@ blocked when callers provide neither raw conformance reports nor explicit
149
261
  permission to use the bundled reviewed release inventory. User-facing commands
150
262
  enable that inventory deliberately and fail closed if an adapter version,
151
263
  manifest digest, framework baseline, runtime, or platform list has changed.
264
+ Semantic implementation digests remain in lane reports, candidates, and the
265
+ reviewed inventory as audit provenance. They are verified during full
266
+ qualification and promotion, but are deliberately not runtime authorization:
267
+ routine implementation changes are guarded by affected-family tests instead
268
+ of requiring a hand-edited admission digest for every source edit.
152
269
 
153
270
  ## Attach an agent runtime
154
271
 
155
- Build current Workspace Intelligence first, then inspect the release-admitted
156
- runtimes:
272
+ Build current Workspace Intelligence first, then inspect adapter admission
273
+ state:
157
274
 
158
275
  ```bash
159
276
  npx workspai workspace intelligence run --for-agent generic --strict --json
@@ -170,6 +287,11 @@ npx workspai agent framework plan \
170
287
  --name support-agent
171
288
  ```
172
289
 
290
+ When more than one admitted framework shares a runtime, pass `--framework`
291
+ explicitly. Workspai does not guess or fall back. `--runtime python` without
292
+ `--framework` now requires an explicit choice because Microsoft Agent Framework
293
+ and OpenAI Agents SDK are both admitted.
294
+
173
295
  The interactive attach command displays the same plan and asks before granting
174
296
  its filesystem effect. Automation must opt in with `--yes` and records the
175
297
  identity supplied by `--granted-by`:
@@ -207,8 +329,9 @@ npx workspai create project agent.microsoft.dotnet operations-agent
207
329
  Create writes a minimal runtime identity, registers the project, seals a
208
330
  Model/Graph baseline so the adapter can plan, applies the adapter-owned scaffold
209
331
  inside that Change, then re-observes Model, Graph, and project grounding against
210
- the nested runtime. The interactive wizard exposes these kits under the **AI
211
- Agent** category only because they are release-admitted. A failed scaffold
332
+ the nested runtime. The interactive wizard lists every published kit under the
333
+ **AI Agent** category. Scaffolding still requires the selected adapter to be
334
+ release-admitted. A failed scaffold
212
335
  rolls back the new directory and workspace registration. Detection itself
213
336
  remains read-only and never authorizes writes.
214
337
 
@@ -274,10 +397,12 @@ and unadvertised runtimes fail closed.
274
397
 
275
398
  The generic boundary was hardened against two deliberately different
276
399
  integration shapes: a filesystem-first Node.js framework and the
277
- multi-language Microsoft Agent Framework. Only the Microsoft adapters are
278
- implemented. They are selectable for Create and Attach only while their exact
279
- manifest digest, framework baseline, runtime, and platform list remain in the
280
- reviewed release-admission inventory.
400
+ multi-language Microsoft Agent Framework. OpenAI Agents SDK Python and
401
+ TypeScript adapters now share that same create, attach, detection, ownership,
402
+ and verification host. They are selectable for Create and Attach only after
403
+ their exact manifest digest, framework baseline, runtime, and platform list
404
+ enter the reviewed release-admission inventory. Microsoft adapters remain
405
+ selectable while their current inventory entries stay valid.
281
406
 
282
407
  ## Implementation sequence
283
408
 
@@ -286,13 +411,13 @@ reviewed release-admission inventory.
286
411
  2. Use the framework-neutral registry, detector, and bounded manifest loader.
287
412
  3. Review the Microsoft Python and .NET digest-bound evidence produced by the
288
413
  full conformance matrix.
289
- 4. Keep automated upstream discovery separate from release authority: report
414
+ 4. Review the OpenAI Python and TypeScript digest-bound evidence produced by
415
+ the same matrix; do not treat local Linux success as multi-OS admission.
416
+ 5. Keep automated upstream discovery separate from release authority: report
290
417
  newer registry versions, then update pins only through a reviewed change.
291
418
  Re-run the full matrix before treating a new pin as independently proven.
292
- 5. Admit another framework only after its create and attach paths share these
293
- ownership, rollback, and verification guarantees.
294
419
 
295
420
  AutoGen is not planned as a new-project target because Microsoft Agent
296
- Framework is its supported successor path. Eve, LangGraph, and OpenAI Agents
297
- SDK are not advertised; each requires its own adapter, tested baseline, and
298
- conformance evidence.
421
+ Framework is its supported successor path. Eve and LangGraph are not
422
+ advertised; each requires its own adapter, tested baseline, and conformance
423
+ evidence.
@@ -4,31 +4,38 @@ Map of GitHub Actions workflows in this repository. Use this when editing CI to
4
4
 
5
5
  ## Workflows
6
6
 
7
- | Workflow | Path | Purpose |
8
- | ------------------------ | ---------------------------------------------------- | ------------------------------------------------------------------------- |
9
- | Build / test matrix | `.github/workflows/ci.yml` | Path-aware docs or full matrix validation plus the required `CI Gate` |
10
- | Workspace E2E matrix | `.github/workflows/workspace-e2e-matrix.yml` | Cross-OS workspace lifecycle smoke; setup `--warm-deps`; cache/mirror ops |
11
- | Windows bridge E2E | `.github/workflows/windows-bridge-e2e.yml` | Native Windows bridge and lifecycle checks |
12
- | E2E smoke | `.github/workflows/e2e-smoke.yml` | Focused bridge regression smoke |
13
- | Official generator smoke | `.github/workflows/frontend-generator-smoke.yml` | Contract-driven official-generator drift gate |
14
- | Agent Framework matrix | `.github/workflows/agent-framework-conformance.yml` | Six-lane Python/.NET adapter compile, credentialless lifecycle, admission |
15
- | Agent Framework discovery| `.github/workflows/agent-framework-version-discovery.yml` | Weekly PyPI/NuGet candidate report; no commit, PR, or contract rewrite |
16
- | Security | `.github/workflows/security.yml` | Path-aware scanning plus the always-resolved `Security Gate` |
17
- | Manual npm release | `.github/workflows/release-npm-manual.yml` | Maintainer-only release gate and publish workflow |
18
- | Discord announcement | `.github/workflows/discord-release-announcement.yml` | Preview and publish one idempotent product-aware release announcement |
19
- | Contributor onboarding | `.github/workflows/contributor-onboarding.yml` | Accepted-contributor onboarding automation |
20
- | Contributor Hub | `.github/workflows/contributor-hub.yml` | Daily live issue-route freshness |
21
- | Welcome | `.github/workflows/welcome.yml` | First-issue and first-contribution messages |
7
+ | Workflow | Path | Purpose |
8
+ | ------------------------- | --------------------------------------------------------- | ----------------------------------------------------------------------------------------- |
9
+ | Build / test matrix | `.github/workflows/ci.yml` | Path-aware docs or full matrix validation plus the required `CI Gate` |
10
+ | Workspace E2E matrix | `.github/workflows/workspace-e2e-matrix.yml` | Cross-OS workspace lifecycle smoke; setup `--warm-deps`; cache/mirror ops |
11
+ | Windows bridge E2E | `.github/workflows/windows-bridge-e2e.yml` | Native Windows bridge and lifecycle checks |
12
+ | E2E smoke | `.github/workflows/e2e-smoke.yml` | Focused bridge regression smoke |
13
+ | Official generator smoke | `.github/workflows/frontend-generator-smoke.yml` | Contract-driven official-generator drift gate |
14
+ | Agent Framework matrix | `.github/workflows/agent-framework-conformance.yml` | Affected-family Linux PR gate plus manual twelve-lane release qualification and admission |
15
+ | Agent Framework discovery | `.github/workflows/agent-framework-version-discovery.yml` | Weekly PyPI/NuGet candidate report; no commit, PR, or contract rewrite |
16
+ | Security | `.github/workflows/security.yml` | Path-aware scanning plus the always-resolved `Security Gate` |
17
+ | Manual npm release | `.github/workflows/release-npm-manual.yml` | Maintainer-only release gate and publish workflow |
18
+ | Discord announcement | `.github/workflows/discord-release-announcement.yml` | Preview and publish one idempotent product-aware release announcement |
19
+ | Contributor onboarding | `.github/workflows/contributor-onboarding.yml` | Accepted-contributor onboarding automation |
20
+ | Contributor Hub | `.github/workflows/contributor-hub.yml` | Daily live issue-route freshness |
21
+ | Welcome | `.github/workflows/welcome.yml` | First-issue and first-contribution messages |
22
22
 
23
23
  ## Agent Framework workflows
24
24
 
25
- Weekly `agent-framework-version-discovery` checks PyPI and NuGet, then stops at
25
+ Weekly `agent-framework-version-discovery` checks PyPI, NuGet, and npm, then stops at
26
26
  a report and artifact. It does not commit, open a pull request, regenerate
27
- Create contracts, or write `release-admissions.v1.json`. A human pin update
28
- still has to pass `agent-framework-conformance` on Linux, macOS, and Windows
29
- for Python and .NET. That matrix compiles the nested `agents/primary` runtime,
30
- runs credentialless context-boundary tests, and records digest-bound evidence.
31
- It never sets Foundry credentials. Only a reviewed admission on the protected
27
+ Create contracts, or write `release-admissions.v2.json`. A human pin update
28
+ still has to pass the manual `full` mode of `agent-framework-conformance` on
29
+ Linux, macOS, and Windows for every built-in adapter runtime. Pull requests run
30
+ the faster Linux gate only for the affected Microsoft or OpenAI family; shared
31
+ agent-framework surfaces select both, while documentation-only changes skip the
32
+ specialized workflow. The full matrix compiles the nested `agents/primary`
33
+ runtime, runs credentialless context-boundary tests, and records manifest-bound
34
+ admission data plus semantic implementation provenance. Promotion requires the
35
+ candidate source commit to equal the checked-out promotion commit. An
36
+ implementation digest is audit evidence, not a runtime lock and not a manual
37
+ maintenance requirement after every routine adapter edit.
38
+ It never sets Foundry or OpenAI credentials. Only a reviewed admission on the protected
32
39
  version-update branch can promote a green candidate.
33
40
 
34
41
  The PR template at `.github/agent-framework-version-update.md` is for that
@@ -118,7 +125,7 @@ Validate or preview the current CLI announcement locally:
118
125
  npm --workspace workspai run check:release-announcement
119
126
  npm --workspace workspai run release:announcement -- \
120
127
  --product workspai-cli \
121
- --tag v0.75.2 \
128
+ --tag v0.76.0 \
122
129
  --markdown-output /tmp/workspai-discord-announcement.md
123
130
  ```
124
131
 
@@ -84,9 +84,9 @@ npx workspai create project agent.microsoft.python <name> [--agent-name <name>]
84
84
  npx workspai create project agent.microsoft.dotnet <name> [--agent-name <name>] [--skip-git]
85
85
  npx workspai agent bootstrap [--project <path>] [--for-agent <host>] [--no-live-inputs] [--strict] [--json]
86
86
  npx workspai agent framework list [--json]
87
- npx workspai agent framework plan --project <name> --runtime <python|dotnet> --name <agent> [--goal <goal-id>] [--workspace <path>] [--json]
88
- npx workspai agent framework attach --project <name> --runtime <python|dotnet> --name <agent> [-y] [--granted-by <identity>] [--workspace <path>] [--json]
89
- npx workspai agent framework apply --change <change-id> --project <name> --runtime <python|dotnet> [--workspace <path>] [--json]
87
+ npx workspai agent framework plan --project <name> --runtime <python|dotnet|node> [--framework <id>] --name <agent> [--goal <goal-id>] [--workspace <path>] [--json]
88
+ npx workspai agent framework attach --project <name> --runtime <python|dotnet|node> [--framework <id>] --name <agent> [-y] [--granted-by <identity>] [--workspace <path>] [--json]
89
+ npx workspai agent framework apply --change <change-id> --project <name> --runtime <python|dotnet|node> [--framework <id>] [--workspace <path>] [--json]
90
90
  ```
91
91
 
92
92
  Recommended CI:
@@ -275,16 +275,25 @@ Blocked receipts exit `2`; strict mode also maps degraded evidence to exit `2`.
275
275
  See [Canonical-first agent entry](./agent-entry.md).
276
276
 
277
277
  `agent framework` is the governed bridge between Workspai evidence and an
278
- agent runtime. `list` exposes only exact release-admitted baselines: Python
279
- `1.18.0` and .NET `1.21.0` in this CLI version. `plan` creates or reuses a
280
- scoped Goal, begins a Proof-Carrying Change, and attaches a hash-bound file
281
- plan without writing project files. `attach` shows that plan and requires an
278
+ agent runtime. `list` exposes every built-in adapter and its release-admission
279
+ state. In this CLI version Microsoft Python `1.18.0` and .NET `1.21.0` remain
280
+ `preview`. OpenAI Agents SDK Python `0.22.2` and TypeScript `0.18.0` are
281
+ labeled `stable`. Create and Attach require the reviewed v2 release inventory,
282
+ whose manifest, framework baseline, runtime, and platform claims were promoted
283
+ from the Linux, macOS, and Windows release matrix. Semantic implementation
284
+ digests remain audit provenance rather than runtime authorization. `plan`
285
+ creates or reuses a scoped Goal, begins a Proof-Carrying Change, and
286
+ attaches a hash-bound file plan without writing project files. `--runtime`
287
+ selects `python`, `dotnet`, or `node`. `--framework` selects the independent
288
+ framework id when more than one admitted adapter shares that runtime.
289
+ `attach` shows that plan and requires an
282
290
  interactive confirmation or explicit `--yes` before granting the filesystem
283
291
  effect and writing an isolated `agents/<name>` directory. `create project
284
292
  agent.microsoft.python|dotnet` uses the same admitted lifecycle for a new
285
293
  project: it registers the project, plans against a Model baseline, writes the
286
294
  nested runtime, then re-observes Model/Graph before it claims Intelligence is
287
- sealed. Dependency installation, credentials, generated-code execution, and
295
+ sealed. `create project agent.openai.python|typescript` uses the same admitted
296
+ lifecycle. Dependency installation, credentials, generated-code execution, and
288
297
  model provider calls are never implied by that approval. `apply` is the
289
298
  automation counterpart for a plan that was separately authorized with
290
299
  `change authorize`. Any adapter, version, manifest, runtime, or platform drift
@@ -394,9 +394,11 @@ project metadata and performs the selected workspace registration.
394
394
  | ------------------------ | ------- | --------------- | ------ |
395
395
  | `agent.microsoft.python` | Python | `agent-framework-core` `1.18.0`, Foundry `1.13.0`, `azure-identity` `1.25.3` | Isolated `agents/<instance>/` with `pyproject.toml`, credentialless `unittest`, and `.env.example` |
396
396
  | `agent.microsoft.dotnet` | .NET | `Microsoft.Agents.AI` `1.21.0`, Foundry `1.21.0-preview.260911.1` | Isolated `agents/<instance>/` with the executable project plus a dedicated test project |
397
+ | `agent.openai.python` | Python | `openai-agents` `0.22.2` | Isolated `agents/<instance>/` with pip-editable `pyproject.toml`, credentialless `unittest`, and `.env.example` |
398
+ | `agent.openai.typescript` | Node.js | `@openai/agents` `0.18.0`, `zod` `4.6.5` | Isolated `agents/<instance>/` with `package.json`, credentialless `node:test`, and `.env.example` |
397
399
 
398
- Interactive `workspai create` shows these kits under **AI Agent** only after
399
- release admission. Agent kits require Workspace governance and therefore do not
400
+ Interactive `workspai create` shows these kits under **AI Agent** after
401
+ reviewed release admission. Agent kits require Workspace governance and therefore do not
400
402
  accept `--no-workspace`. Optional `--agent-name` names the instance directory
401
403
  (default `primary`). They do not install dependencies, call a model, or store
402
404
  credentials. Exact versions are promoted only after the full Linux, macOS, and
@@ -775,10 +775,12 @@ These fields are designed for release gates and extension timeline cards that mu
775
775
  - Supports Workspai, legacy RapidKit, and non-Workspai projects when project metadata is missing.
776
776
  - Evidence: `.workspai/reports/doctor-project-last-run.json`.
777
777
  - `--fix`, `--plan`, and `--apply` apply only project-scoped fixes.
778
- - Governed Microsoft Agent Framework projects keep `kind`/`framework` as `agent` /
779
- `microsoft-agent-framework`. Doctor discovers nested environment examples and
780
- dependency manifests under `agents/primary` and aims Python/`uv` or .NET
781
- repair commands at that runtime, not at a phantom project-root manifest.
778
+ - Governed Microsoft Agent Framework and OpenAI Agents SDK projects keep
779
+ `kind` as `agent`. Microsoft retains `microsoft-agent-framework`; OpenAI
780
+ retains `openai-agents`. Doctor discovers nested environment examples and
781
+ dependency manifests under `agents/primary` and aims Python/`uv`, Node
782
+ `npm --prefix`, or .NET repair commands at that runtime, not at a phantom
783
+ project-root manifest.
782
784
 
783
785
  ## Project JSON fields (AI/automation)
784
786
 
@@ -12,7 +12,8 @@ native kits:
12
12
  This policy does not cover FastAPI or NestJS kits owned by the RapidKit Python
13
13
  engine. It also does not cover generators delegated to an upstream official
14
14
  CLI, such as Next.js, Astro, Angular, Vue, Svelte, Nuxt, or React Native.
15
- Governed Microsoft Agent Framework kits are versioned separately through the
15
+ Governed Microsoft Agent Framework and OpenAI Agents SDK kits are versioned
16
+ separately through the
16
17
  [Agent Framework Adapter Contract](./agent-framework-adapters.md); they are
17
18
  not native HTTP service generators.
18
19
 
@@ -52,7 +52,9 @@ Microsoft Agent Framework projects keep their executable manifest under
52
52
  `agents/<instance>/`. Workspace Run treats that nested `pyproject.toml` or
53
53
  `.csproj` as its own unit (`python3 -m compileall .`,
54
54
  `python3 -m unittest discover -s tests`, `python3 main.py`, or the matching
55
- .NET commands). An empty legacy root manifest is ignored only when it still
55
+ .NET commands). A Python unit with `main.py` uses `compileall` even when
56
+ `pyproject.toml` declares `[build-system]`; `python -m build` remains only for
57
+ packaging projects that have no agent entrypoint. An empty legacy root manifest is ignored only when it still
56
58
  matches the exact older Workspai shell and a real `agents/primary` runtime
57
59
  exists. Any user edit restores the root as an independent unit.
58
60
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "workspai",
3
- "version": "0.75.2",
3
+ "version": "0.76.0",
4
4
  "type": "module",
5
5
  "description": "Open-source workspace intelligence CLI for software systems: create, adopt, govern, verify, and align polyglot workspaces for humans, CI, IDEs, and AI agents.",
6
6
  "keywords": [
@@ -115,6 +115,8 @@
115
115
  "test:runtime-contract": "node scripts/runtime-acceptance-matrix.mjs --contract-only",
116
116
  "test:agent-framework:python": "tsx scripts/smoke-microsoft-agent-framework-adapter.ts --runtime python",
117
117
  "test:agent-framework:dotnet": "tsx scripts/smoke-microsoft-agent-framework-adapter.ts --runtime dotnet",
118
+ "test:agent-framework:openai:python": "tsx scripts/smoke-openai-agents-adapter.ts --runtime python",
119
+ "test:agent-framework:openai:typescript": "tsx scripts/smoke-openai-agents-adapter.ts --runtime typescript",
118
120
  "verify:agent-framework:matrix": "tsx scripts/verify-agent-framework-conformance.ts --reports test-results/agent-framework-conformance",
119
121
  "discover:agent-framework:versions": "tsx scripts/discover-agent-framework-versions.ts",
120
122
  "propose:agent-framework:versions": "tsx scripts/propose-agent-framework-version-update.ts",
@@ -9,6 +9,7 @@ import process from 'node:process';
9
9
  const repoRoot = process.cwd();
10
10
  const cliPath = path.join(repoRoot, 'dist', 'index.js');
11
11
  const isolatedHome = fs.mkdtempSync(path.join(os.tmpdir(), 'workspai-enterprise-home-'));
12
+ let releaseAdmittedAdapterIds = new Set();
12
13
 
13
14
  process.on('exit', () => {
14
15
  fs.rmSync(isolatedHome, { recursive: true, force: true });
@@ -348,12 +349,43 @@ function assertCliContracts() {
348
349
  }
349
350
 
350
351
  const frameworks = parseTrailingJson(runCli(['agent', 'framework', 'list', '--json']));
352
+ if (frameworks.schemaVersion !== 'workspai.agent-framework-list.v1') {
353
+ fail(`unexpected agent framework list schema: ${frameworks.schemaVersion}`);
354
+ }
355
+ const adapters = Array.isArray(frameworks.adapters) ? frameworks.adapters : [];
356
+ const admittedIds = adapters
357
+ .filter((adapter) => adapter.status === 'admitted')
358
+ .map((adapter) => adapter.id)
359
+ .sort();
360
+ const expectedAdapterIds = [
361
+ 'microsoft-agent-framework-dotnet',
362
+ 'microsoft-agent-framework-python',
363
+ 'openai-agents-python',
364
+ 'openai-agents-typescript',
365
+ ];
351
366
  if (
352
- frameworks.schemaVersion !== 'workspai.agent-framework-list.v1' ||
353
- frameworks.adapters?.length !== 2 ||
354
- frameworks.adapters.some((adapter) => adapter.status !== 'admitted')
367
+ admittedIds.length !== 0 &&
368
+ JSON.stringify(admittedIds) !== JSON.stringify(expectedAdapterIds)
355
369
  ) {
356
- fail('published CLI does not expose the two exact release-admitted framework adapters');
370
+ fail(
371
+ `published CLI does not expose the exact release-admitted framework adapters (admitted: ${
372
+ admittedIds.join(', ') || 'none'
373
+ })`
374
+ );
375
+ }
376
+ releaseAdmittedAdapterIds = new Set(admittedIds);
377
+ for (const openaiId of ['openai-agents-python', 'openai-agents-typescript']) {
378
+ const openai = adapters.find((adapter) => adapter.id === openaiId);
379
+ if (!openai) {
380
+ fail(`published CLI is missing implemented OpenAI adapter ${openaiId}`);
381
+ }
382
+ if (openai.stability !== 'stable') {
383
+ fail(
384
+ `${openaiId} must be labeled stable after the digest-changing promotion (observed: ${
385
+ openai.stability ?? 'missing'
386
+ })`
387
+ );
388
+ }
357
389
  }
358
390
 
359
391
  log(`verified CLI contract surfaces for v${version.version}`);
@@ -390,6 +422,7 @@ function smokeCreateAgentFrameworkKits() {
390
422
  {
391
423
  kit: 'agent.microsoft.python',
392
424
  name: 'python-agent',
425
+ expectCreate: releaseAdmittedAdapterIds.has('microsoft-agent-framework-python'),
393
426
  expectedFiles: [
394
427
  'README.md',
395
428
  '.workspai/project.json',
@@ -404,6 +437,7 @@ function smokeCreateAgentFrameworkKits() {
404
437
  {
405
438
  kit: 'agent.microsoft.dotnet',
406
439
  name: 'dotnet-agent',
440
+ expectCreate: releaseAdmittedAdapterIds.has('microsoft-agent-framework-dotnet'),
407
441
  expectedFiles: [
408
442
  'README.md',
409
443
  '.workspai/project.json',
@@ -417,6 +451,41 @@ function smokeCreateAgentFrameworkKits() {
417
451
  'agents/primary/README.md',
418
452
  ],
419
453
  },
454
+ {
455
+ kit: 'agent.openai.python',
456
+ name: 'openai-python-agent',
457
+ expectCreate: releaseAdmittedAdapterIds.has('openai-agents-python'),
458
+ expectedFiles: [
459
+ 'README.md',
460
+ '.workspai/project.json',
461
+ '.workspai/agent-frameworks/openai-agents-python/primary.json',
462
+ 'agents/primary/main.py',
463
+ 'agents/primary/workspai_context.py',
464
+ 'agents/primary/agent.py',
465
+ 'agents/primary/pyproject.toml',
466
+ 'agents/primary/tests/test_context.py',
467
+ 'agents/primary/.env.example',
468
+ 'agents/primary/README.md',
469
+ ],
470
+ },
471
+ {
472
+ kit: 'agent.openai.typescript',
473
+ name: 'openai-typescript-agent',
474
+ expectCreate: releaseAdmittedAdapterIds.has('openai-agents-typescript'),
475
+ expectedFiles: [
476
+ 'README.md',
477
+ '.workspai/project.json',
478
+ '.workspai/agent-frameworks/openai-agents-typescript/primary.json',
479
+ 'agents/primary/src/main.ts',
480
+ 'agents/primary/src/workspai-context.ts',
481
+ 'agents/primary/src/agent.ts',
482
+ 'agents/primary/package.json',
483
+ 'agents/primary/tsconfig.json',
484
+ 'agents/primary/tests/context.test.ts',
485
+ 'agents/primary/.env.example',
486
+ 'agents/primary/README.md',
487
+ ],
488
+ },
420
489
  ];
421
490
  try {
422
491
  for (const scenario of scenarios) {
@@ -430,6 +499,22 @@ function smokeCreateAgentFrameworkKits() {
430
499
  stdio: ['ignore', 'pipe', 'pipe'],
431
500
  }
432
501
  );
502
+ const combined = `${result.stdout}\n${result.stderr}`;
503
+ if (scenario.expectCreate === false) {
504
+ if (result.status === 0) {
505
+ fail(`${scenario.kit} create succeeded before the stable digest was release-admitted`);
506
+ }
507
+ if (
508
+ !/not release-admitted|adapter (?:manifest|implementation) changed after release admission/i.test(
509
+ combined
510
+ )
511
+ ) {
512
+ fail(
513
+ `${scenario.kit} failed closed without an admission blocker\n${result.stdout}\n${result.stderr}`
514
+ );
515
+ }
516
+ continue;
517
+ }
433
518
  if (result.status !== 0) {
434
519
  fail(
435
520
  `${scenario.kit} governed create failed with exit ${result.status}\n${result.stdout}\n${result.stderr}`
@@ -437,8 +522,16 @@ function smokeCreateAgentFrameworkKits() {
437
522
  }
438
523
  assertGeneratedProject(path.join(workspacePath, scenario.name), scenario.expectedFiles);
439
524
  }
525
+ const admittedCreates = scenarios.filter((scenario) => scenario.expectCreate);
440
526
  const ownershipRoot = path.join(workspacePath, '.workspai', 'agent-frameworks', 'ownership');
441
- if (!fs.existsSync(ownershipRoot)) fail('agent kit smoke did not record ownership receipts');
527
+ const recordedOwnership = fs.existsSync(ownershipRoot);
528
+ if (admittedCreates.length === 0) {
529
+ if (recordedOwnership) {
530
+ fail('agent kit smoke recorded ownership receipts without a release-admitted create');
531
+ }
532
+ } else if (!recordedOwnership) {
533
+ fail('agent kit smoke did not record ownership receipts');
534
+ }
442
535
  } finally {
443
536
  fs.rmSync(tempDir, { recursive: true, force: true });
444
537
  }
@@ -1 +0,0 @@
1
- export{b as printAnalyzeReport,a as runAnalyze}from'./chunk-K52IQX3J.js';