@eir-labs/coltrane 0.10.0 → 0.11.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/agents/bandleader.json +54 -0
  2. package/agents/bill.json +4 -2
  3. package/agents/change-verifier.json +2 -1
  4. package/agents/code-implementer.json +7 -4
  5. package/agents/john.json +5 -3
  6. package/agents/lineage-scout-external.json +19 -6
  7. package/agents/lineage-scribe.json +20 -9
  8. package/agents/lineage-weaver.json +26 -11
  9. package/agents/miles.json +2 -1
  10. package/agents/players/bandleader.md +70 -0
  11. package/agents/pr-publisher.json +4 -2
  12. package/agents/red-spec-drafter.json +12 -6
  13. package/agents/room-prober.json +29 -0
  14. package/agents/source-walker.json +1 -1
  15. package/charts/room-probe-chart-v1.json +14 -0
  16. package/charts/worker-contract-docker-v2.json +135 -0
  17. package/charts/worker-contract-v3.json +206 -0
  18. package/dist/src/boundary_check.d.ts +18 -0
  19. package/dist/src/boundary_check.js +70 -0
  20. package/dist/src/boundary_check.js.map +1 -0
  21. package/dist/src/boundary_scan.d.ts +62 -0
  22. package/dist/src/boundary_scan.js +93 -0
  23. package/dist/src/boundary_scan.js.map +1 -0
  24. package/dist/src/chart.js +34 -1
  25. package/dist/src/chart.js.map +1 -1
  26. package/dist/src/claude_invoker.d.ts +2 -1
  27. package/dist/src/claude_invoker.js +150 -17
  28. package/dist/src/claude_invoker.js.map +1 -1
  29. package/dist/src/cli.d.ts +1 -1
  30. package/dist/src/cli.js +61 -26
  31. package/dist/src/cli.js.map +1 -1
  32. package/dist/src/drain_preflight.d.ts +33 -0
  33. package/dist/src/drain_preflight.js +97 -0
  34. package/dist/src/drain_preflight.js.map +1 -0
  35. package/dist/src/genome_schema.d.ts +390 -9
  36. package/dist/src/genome_schema.js +163 -8
  37. package/dist/src/genome_schema.js.map +1 -1
  38. package/dist/src/genome_store.js +9 -0
  39. package/dist/src/genome_store.js.map +1 -1
  40. package/dist/src/genome_writer.d.ts +1 -1
  41. package/dist/src/genome_writer.js +10 -2
  42. package/dist/src/genome_writer.js.map +1 -1
  43. package/dist/src/gig_conformance.d.ts +66 -0
  44. package/dist/src/gig_conformance.js +153 -0
  45. package/dist/src/gig_conformance.js.map +1 -0
  46. package/dist/src/gig_tracker.js +8 -0
  47. package/dist/src/gig_tracker.js.map +1 -1
  48. package/dist/src/grounding.d.ts +44 -0
  49. package/dist/src/grounding.js +127 -0
  50. package/dist/src/grounding.js.map +1 -0
  51. package/dist/src/index.d.ts +1 -0
  52. package/dist/src/index.js +1 -0
  53. package/dist/src/index.js.map +1 -1
  54. package/dist/src/institution_loader.d.ts +29 -5
  55. package/dist/src/institution_loader.js +67 -6
  56. package/dist/src/institution_loader.js.map +1 -1
  57. package/dist/src/lineage_adoption.d.ts +82 -0
  58. package/dist/src/lineage_adoption.js +82 -0
  59. package/dist/src/lineage_adoption.js.map +1 -0
  60. package/dist/src/lineage_persist.d.ts +34 -0
  61. package/dist/src/lineage_persist.js +60 -0
  62. package/dist/src/lineage_persist.js.map +1 -0
  63. package/dist/src/loader.d.ts +13 -0
  64. package/dist/src/loader.js +43 -2
  65. package/dist/src/loader.js.map +1 -1
  66. package/dist/src/mcp.js +37 -4
  67. package/dist/src/mcp.js.map +1 -1
  68. package/dist/src/org_hire.d.ts +23 -0
  69. package/dist/src/org_hire.js +42 -0
  70. package/dist/src/org_hire.js.map +1 -0
  71. package/dist/src/outputs.d.ts +17 -0
  72. package/dist/src/outputs.js +86 -1
  73. package/dist/src/outputs.js.map +1 -1
  74. package/dist/src/player_to_claude_code.js +26 -2
  75. package/dist/src/player_to_claude_code.js.map +1 -1
  76. package/dist/src/registry.d.ts +3 -1
  77. package/dist/src/registry.js +43 -3
  78. package/dist/src/registry.js.map +1 -1
  79. package/dist/src/repo_index.d.ts +58 -0
  80. package/dist/src/repo_index.js +232 -0
  81. package/dist/src/repo_index.js.map +1 -0
  82. package/dist/src/reuse.d.ts +44 -4
  83. package/dist/src/reuse.js +0 -0
  84. package/dist/src/reuse.js.map +1 -1
  85. package/dist/src/runtime.d.ts +82 -0
  86. package/dist/src/runtime.js +254 -25
  87. package/dist/src/runtime.js.map +1 -1
  88. package/dist/src/server.d.ts +37 -0
  89. package/dist/src/server.js +422 -11
  90. package/dist/src/server.js.map +1 -1
  91. package/dist/src/server_relay.d.ts +40 -2
  92. package/dist/src/server_relay.js +186 -19
  93. package/dist/src/server_relay.js.map +1 -1
  94. package/dist/src/tool_providers.d.ts +27 -0
  95. package/dist/src/tool_providers.js +48 -0
  96. package/dist/src/tool_providers.js.map +1 -1
  97. package/dist/src/venue_credential.d.ts +41 -0
  98. package/dist/src/venue_credential.js +57 -0
  99. package/dist/src/venue_credential.js.map +1 -0
  100. package/dist/src/venue_realize.d.ts +23 -0
  101. package/dist/src/venue_realize.js +43 -3
  102. package/dist/src/venue_realize.js.map +1 -1
  103. package/dist/src/venue_realizer.d.ts +224 -0
  104. package/dist/src/venue_realizer.js +889 -0
  105. package/dist/src/venue_realizer.js.map +1 -0
  106. package/dist/src/version.d.ts +1 -1
  107. package/dist/src/version.js +1 -1
  108. package/dist/src/worker.d.ts +37 -0
  109. package/dist/src/worker.js +127 -24
  110. package/dist/src/worker.js.map +1 -1
  111. package/dist/src/worker_env.d.ts +79 -0
  112. package/dist/src/worker_env.js +322 -0
  113. package/dist/src/worker_env.js.map +1 -0
  114. package/dist/src/workspace.d.ts +12 -1
  115. package/dist/src/workspace.js +10 -3
  116. package/dist/src/workspace.js.map +1 -1
  117. package/domain_types/change-context.json +59 -13
  118. package/domain_types/lineage-adoption-target.json +22 -0
  119. package/domain_types/lineage-map.json +7 -2
  120. package/domain_types/lineage-record.json +55 -5
  121. package/domain_types/prior-art-hit.json +16 -1
  122. package/domain_types/red-spec.json +5 -3
  123. package/domain_types/woodshed-record.json +149 -0
  124. package/evals/gist-present.json +7 -0
  125. package/institutions/coltrane.json +178 -6
  126. package/package.json +6 -3
  127. package/skills/non-vacuity-probe/fixtures/fixture-001.json +17 -0
  128. package/skills/non-vacuity-probe/meta.json +12 -0
  129. package/skills/non-vacuity-probe/skill.md +27 -0
  130. package/skills/non-vacuity-probe/skill.mjs +81 -0
  131. package/standards/lineage-adopt-v0.json +37 -0
  132. package/standards/room-probe-v1.json +28 -0
  133. package/standards/software-change-pr-v1.json +15 -15
  134. package/standards/software-change-red-first-v0.json +183 -0
  135. package/standards/spec-review-and-sequence-v0.json +112 -0
  136. package/standards/studio-session-v0.json +101 -0
  137. package/tours/coltrane.json +72 -0
  138. package/venues/engine-room-v1.json +32 -0
@@ -965,7 +965,7 @@ export type LineageRecordRefOutput = z.output<typeof LineageRecordRefSchema>;
965
965
  * `evidence_grade` types the distinction the diplomatics tradition draws and this codebase had
966
966
  * only ever narrated: ARCHIVE — the primary was fetched, and `retrieved_at` says when — versus
967
967
  * ATTESTATION — someone declared it. The grade is recorded and never laundered upward. */
968
- export declare const CitationSchema: z.ZodEffects<z.ZodObject<{
968
+ export declare const CitationSchema: z.ZodEffects<z.ZodEffects<z.ZodObject<{
969
969
  /** Author names as cited, e.g. "Crawford, S.E.S.". At least one — an anonymous citation is a rumour. */
970
970
  authors: z.ZodArray<z.ZodString, "many">;
971
971
  year: z.ZodNumber;
@@ -1020,6 +1020,26 @@ export declare const CitationSchema: z.ZodEffects<z.ZodObject<{
1020
1020
  doi?: string | undefined;
1021
1021
  url?: string | undefined;
1022
1022
  retrieved_at?: string | undefined;
1023
+ }>, {
1024
+ authors: string[];
1025
+ year: number;
1026
+ title: string;
1027
+ venue: string;
1028
+ evidence_grade: "archive" | "attestation";
1029
+ locator?: string | undefined;
1030
+ doi?: string | undefined;
1031
+ url?: string | undefined;
1032
+ retrieved_at?: string | undefined;
1033
+ }, {
1034
+ authors: string[];
1035
+ year: number;
1036
+ title: string;
1037
+ venue: string;
1038
+ evidence_grade: "archive" | "attestation";
1039
+ locator?: string | undefined;
1040
+ doi?: string | undefined;
1041
+ url?: string | undefined;
1042
+ retrieved_at?: string | undefined;
1023
1043
  }>;
1024
1044
  /** How a genome schema class stands to the published work behind it.
1025
1045
  *
@@ -1042,7 +1062,7 @@ export declare const SchemaAttributionSchema: z.ZodObject<{
1042
1062
  subject: z.ZodString;
1043
1063
  relation: z.ZodEnum<["descends-from", "aligns-with", "diverges-from", "supersedes", "informed-by"]>;
1044
1064
  what_taken: z.ZodString;
1045
- citation: z.ZodEffects<z.ZodObject<{
1065
+ citation: z.ZodEffects<z.ZodEffects<z.ZodObject<{
1046
1066
  /** Author names as cited, e.g. "Crawford, S.E.S.". At least one — an anonymous citation is a rumour. */
1047
1067
  authors: z.ZodArray<z.ZodString, "many">;
1048
1068
  year: z.ZodNumber;
@@ -1097,6 +1117,26 @@ export declare const SchemaAttributionSchema: z.ZodObject<{
1097
1117
  doi?: string | undefined;
1098
1118
  url?: string | undefined;
1099
1119
  retrieved_at?: string | undefined;
1120
+ }>, {
1121
+ authors: string[];
1122
+ year: number;
1123
+ title: string;
1124
+ venue: string;
1125
+ evidence_grade: "archive" | "attestation";
1126
+ locator?: string | undefined;
1127
+ doi?: string | undefined;
1128
+ url?: string | undefined;
1129
+ retrieved_at?: string | undefined;
1130
+ }, {
1131
+ authors: string[];
1132
+ year: number;
1133
+ title: string;
1134
+ venue: string;
1135
+ evidence_grade: "archive" | "attestation";
1136
+ locator?: string | undefined;
1137
+ doi?: string | undefined;
1138
+ url?: string | undefined;
1139
+ retrieved_at?: string | undefined;
1100
1140
  }>;
1101
1141
  }, "strict", z.ZodTypeAny, {
1102
1142
  subject: string;
@@ -2269,7 +2309,214 @@ export declare const VenueLifecycleSchema: z.ZodObject<{
2269
2309
  policy?: "ephemeral" | "standing" | undefined;
2270
2310
  rebuild_cadence?: string | undefined;
2271
2311
  }>;
2272
- export declare const VenueSchema: z.ZodObject<{
2312
+ /** The CLOSED set of device KINDS a room may ask a host for — a class, never a path. A contract that
2313
+ * could name a raw device path could name the raw memory device (`/dev/mem`) or a whole block
2314
+ * device, which is a host compromise submitted as a hardware request; the concrete nodes are the
2315
+ * machine's business, mapped from the class at realization. Validated at the VALUE level so a path
2316
+ * is refused by name (on `devices`), not merely as an unknown key. */
2317
+ export declare const VenueDeviceClassSchema: z.ZodEnum<["audio", "gpio", "i2c", "serial", "spi", "video"]>;
2318
+ export declare const DEVICE_CLASSES: ["audio", "gpio", "i2c", "serial", "spi", "video"];
2319
+ /** One MCP server a room stands up: a slug, a transport, the launch command, and which credential
2320
+ * CLASSES it needs (never material). Modelled on what a room declares and deliberately NOT
2321
+ * `.strict()`, so a future transport-specific field is an addition rather than a breaking change —
2322
+ * the sub-schema is inferred from the contract's own shape, not a formally frozen surface. */
2323
+ export declare const VenueMcpServerSchema: z.ZodObject<{
2324
+ slug: z.ZodString;
2325
+ transport: z.ZodString;
2326
+ command: z.ZodDefault<z.ZodArray<z.ZodString, "many">>;
2327
+ /** The endpoint an over-the-wire transport (e.g. `sse`) connects to. Absent for a `stdio` server,
2328
+ * which is reached by its `command` instead — the per-transport requirement is stated once, in the
2329
+ * cross-field rule on `VenueSchema`, so both doors (the loader and venue_define) enforce it. */
2330
+ url: z.ZodOptional<z.ZodString>;
2331
+ credential_names: z.ZodDefault<z.ZodArray<z.ZodString, "many">>;
2332
+ }, "strip", z.ZodTypeAny, {
2333
+ slug: string;
2334
+ transport: string;
2335
+ command: string[];
2336
+ credential_names: string[];
2337
+ url?: string | undefined;
2338
+ }, {
2339
+ slug: string;
2340
+ transport: string;
2341
+ url?: string | undefined;
2342
+ command?: string[] | undefined;
2343
+ credential_names?: string[] | undefined;
2344
+ }>;
2345
+ export declare const VenueObjectSchema: z.ZodObject<{
2346
+ slug: z.ZodString;
2347
+ /** Exactly one owning institution. The institution is the duty holder; the office below is the
2348
+ * appointed accountable individual. */
2349
+ institution_slug: z.ZodString;
2350
+ /** Why this room is shaped the way it is — read at review, never at runtime. */
2351
+ description: z.ZodOptional<z.ZodString>;
2352
+ /** The base kind of room (e.g. "ingest-empty", "code-work"). A label for humans and for
2353
+ * "which room does this work want", not a resolvable reference. */
2354
+ flavor: z.ZodOptional<z.ZodString>;
2355
+ /** Defaulted, not required, and the default is the EMPTY room. Every access-shaped field here
2356
+ * leans the same way: absent doors reach nothing, absent installs install nothing, an absent
2357
+ * credential surface permits nothing. A venue that forgot to state its equipment must hold
2358
+ * nothing rather than hold whatever the reader assumed — and both doors into this class (the
2359
+ * loader and venue_define) get that from the one schema rather than from two agreeing habits. */
2360
+ equipment: z.ZodDefault<z.ZodObject<{
2361
+ tools: z.ZodDefault<z.ZodArray<z.ZodString, "many">>;
2362
+ }, "strict", z.ZodTypeAny, {
2363
+ tools: string[];
2364
+ }, {
2365
+ tools?: string[] | undefined;
2366
+ }>>;
2367
+ doors: z.ZodOptional<z.ZodObject<{
2368
+ ingress: z.ZodDefault<z.ZodArray<z.ZodEffects<z.ZodString, string, string>, "many">>;
2369
+ egress: z.ZodDefault<z.ZodArray<z.ZodEffects<z.ZodString, string, string>, "many">>;
2370
+ }, "strict", z.ZodTypeAny, {
2371
+ ingress: string[];
2372
+ egress: string[];
2373
+ }, {
2374
+ ingress?: string[] | undefined;
2375
+ egress?: string[] | undefined;
2376
+ }>>;
2377
+ /** Digest-pinned software the room contains. */
2378
+ installs: z.ZodDefault<z.ZodArray<z.ZodString, "many">>;
2379
+ /** Which CLASSES of credential may legitimately be present, by name. Never material, and never
2380
+ * a field material could occupy: a room that declares nothing here is a room where finding a
2381
+ * credential is a breach rather than a configuration difference. */
2382
+ credential_surface: z.ZodDefault<z.ZodArray<z.ZodString, "many">>;
2383
+ lifecycle: z.ZodDefault<z.ZodObject<{
2384
+ policy: z.ZodDefault<z.ZodEnum<["ephemeral", "standing"]>>;
2385
+ /** ISO-8601 duration or cron-shaped cadence — read by the responsible office, not the engine. */
2386
+ rebuild_cadence: z.ZodOptional<z.ZodString>;
2387
+ }, "strict", z.ZodTypeAny, {
2388
+ policy: "ephemeral" | "standing";
2389
+ rebuild_cadence?: string | undefined;
2390
+ }, {
2391
+ policy?: "ephemeral" | "standing" | undefined;
2392
+ rebuild_cadence?: string | undefined;
2393
+ }>>;
2394
+ /** The accountable office: an institutional chair id (the office, not its incumbent). One named
2395
+ * duty-holder answers for the room and for what it permits. */
2396
+ responsible_chair: z.ZodOptional<z.ZodString>;
2397
+ /** WHICH SUBSTRATE this room requires — a free string a deployment matches its available
2398
+ * realizers against (e.g. "container"). A FREE string, not a closed enum: the set of substrates
2399
+ * is a deployment fact rather than a genome one, and freezing it here would over-constrain
2400
+ * substrates the contract has not yet named. Absent means the deployment's default — deny-by-
2401
+ * default belongs on CAPABILITY, not on portability, so a room that names no substrate runs on
2402
+ * whatever is supplied, the same lean an unnamed venue takes on targeting. */
2403
+ substrate: z.ZodOptional<z.ZodString>;
2404
+ /** The MCP servers the room stands up. Each names credential CLASSES, never material — the same
2405
+ * discipline `credential_surface` takes, restated at the server that consumes them. */
2406
+ mcp_servers: z.ZodDefault<z.ZodArray<z.ZodObject<{
2407
+ slug: z.ZodString;
2408
+ transport: z.ZodString;
2409
+ command: z.ZodDefault<z.ZodArray<z.ZodString, "many">>;
2410
+ /** The endpoint an over-the-wire transport (e.g. `sse`) connects to. Absent for a `stdio` server,
2411
+ * which is reached by its `command` instead — the per-transport requirement is stated once, in the
2412
+ * cross-field rule on `VenueSchema`, so both doors (the loader and venue_define) enforce it. */
2413
+ url: z.ZodOptional<z.ZodString>;
2414
+ credential_names: z.ZodDefault<z.ZodArray<z.ZodString, "many">>;
2415
+ }, "strip", z.ZodTypeAny, {
2416
+ slug: string;
2417
+ transport: string;
2418
+ command: string[];
2419
+ credential_names: string[];
2420
+ url?: string | undefined;
2421
+ }, {
2422
+ slug: string;
2423
+ transport: string;
2424
+ url?: string | undefined;
2425
+ command?: string[] | undefined;
2426
+ credential_names?: string[] | undefined;
2427
+ }>, "many">>;
2428
+ /** The device CLASSES the room needs — a kind (`serial`, `gpio`…), never a path. The machine
2429
+ * maps a class to concrete nodes and the owning group; a contract that could name a node could
2430
+ * name the raw memory device, so the value is pinned to the closed enumeration. */
2431
+ devices: z.ZodDefault<z.ZodArray<z.ZodEnum<["audio", "gpio", "i2c", "serial", "spi", "video"]>, "many">>;
2432
+ /** The architectures this room supports (e.g. `arm64`). Absent means any: portability is not
2433
+ * capability, so an unnamed architecture is realizable on any host rather than none. */
2434
+ architectures: z.ZodDefault<z.ZodArray<z.ZodString, "many">>;
2435
+ /** A ceiling on how many chairs may realize against this room at once. Per-chair realization
2436
+ * multiplies substrate resources by the WIDTH of a phase, and memory scales with running
2437
+ * processes, so the bound belongs in the contract where an author sets it deliberately rather
2438
+ * than discovering it with the first wide DAG on the first box that runs it. */
2439
+ max_concurrent_chairs: z.ZodOptional<z.ZodNumber>;
2440
+ /** The shared FLOOR this room composes over, so N rooms cost floor + Σ(deltas) rather than
2441
+ * N × environment. A label two rooms share to declare they build on the same base. */
2442
+ floor: z.ZodOptional<z.ZodString>;
2443
+ }, "strict", z.ZodTypeAny, {
2444
+ slug: string;
2445
+ institution_slug: string;
2446
+ equipment: {
2447
+ tools: string[];
2448
+ };
2449
+ installs: string[];
2450
+ credential_surface: string[];
2451
+ lifecycle: {
2452
+ policy: "ephemeral" | "standing";
2453
+ rebuild_cadence?: string | undefined;
2454
+ };
2455
+ mcp_servers: {
2456
+ slug: string;
2457
+ transport: string;
2458
+ command: string[];
2459
+ credential_names: string[];
2460
+ url?: string | undefined;
2461
+ }[];
2462
+ devices: ("audio" | "gpio" | "i2c" | "serial" | "spi" | "video")[];
2463
+ architectures: string[];
2464
+ description?: string | undefined;
2465
+ flavor?: string | undefined;
2466
+ doors?: {
2467
+ ingress: string[];
2468
+ egress: string[];
2469
+ } | undefined;
2470
+ responsible_chair?: string | undefined;
2471
+ substrate?: string | undefined;
2472
+ max_concurrent_chairs?: number | undefined;
2473
+ floor?: string | undefined;
2474
+ }, {
2475
+ slug: string;
2476
+ institution_slug: string;
2477
+ description?: string | undefined;
2478
+ flavor?: string | undefined;
2479
+ equipment?: {
2480
+ tools?: string[] | undefined;
2481
+ } | undefined;
2482
+ doors?: {
2483
+ ingress?: string[] | undefined;
2484
+ egress?: string[] | undefined;
2485
+ } | undefined;
2486
+ installs?: string[] | undefined;
2487
+ credential_surface?: string[] | undefined;
2488
+ lifecycle?: {
2489
+ policy?: "ephemeral" | "standing" | undefined;
2490
+ rebuild_cadence?: string | undefined;
2491
+ } | undefined;
2492
+ responsible_chair?: string | undefined;
2493
+ substrate?: string | undefined;
2494
+ mcp_servers?: {
2495
+ slug: string;
2496
+ transport: string;
2497
+ url?: string | undefined;
2498
+ command?: string[] | undefined;
2499
+ credential_names?: string[] | undefined;
2500
+ }[] | undefined;
2501
+ devices?: ("audio" | "gpio" | "i2c" | "serial" | "spi" | "video")[] | undefined;
2502
+ architectures?: string[] | undefined;
2503
+ max_concurrent_chairs?: number | undefined;
2504
+ floor?: string | undefined;
2505
+ }>;
2506
+ /**
2507
+ * The venue contract, with the cross-field MCP rules a single field cannot state.
2508
+ *
2509
+ * The inner `VenueObjectSchema` above is a plain `ZodObject` — it retains `.shape`, which
2510
+ * `zodToMcpProps(VenueObjectSchema)` (the advertised MCP surface) and `Object.keys(...shape)` (the
2511
+ * hosted-write key list) both need. `VenueSchema` wraps it in a `.superRefine`, which is a
2512
+ * `ZodEffects` that has NEITHER — so those two consumers read the inner object while every
2513
+ * `.parse`/`.safeParse` caller (the loader, `venue_define`, the realizer) gets the cross-field rules
2514
+ * for free. The three rules below are the ones a room could otherwise author "granted but
2515
+ * unprovided": a tool naming a server the room never declared, a transport missing the field that
2516
+ * makes it reachable, or a server needing a credential the surface does not admit. Each is refused at
2517
+ * PARSE, moving the discovery from a box nobody is watching to the author's own terminal.
2518
+ */
2519
+ export declare const VenueSchema: z.ZodEffects<z.ZodObject<{
2273
2520
  slug: z.ZodString;
2274
2521
  /** Exactly one owning institution. The institution is the duty holder; the office below is the
2275
2522
  * appointed accountable individual. */
@@ -2321,6 +2568,52 @@ export declare const VenueSchema: z.ZodObject<{
2321
2568
  /** The accountable office: an institutional chair id (the office, not its incumbent). One named
2322
2569
  * duty-holder answers for the room and for what it permits. */
2323
2570
  responsible_chair: z.ZodOptional<z.ZodString>;
2571
+ /** WHICH SUBSTRATE this room requires — a free string a deployment matches its available
2572
+ * realizers against (e.g. "container"). A FREE string, not a closed enum: the set of substrates
2573
+ * is a deployment fact rather than a genome one, and freezing it here would over-constrain
2574
+ * substrates the contract has not yet named. Absent means the deployment's default — deny-by-
2575
+ * default belongs on CAPABILITY, not on portability, so a room that names no substrate runs on
2576
+ * whatever is supplied, the same lean an unnamed venue takes on targeting. */
2577
+ substrate: z.ZodOptional<z.ZodString>;
2578
+ /** The MCP servers the room stands up. Each names credential CLASSES, never material — the same
2579
+ * discipline `credential_surface` takes, restated at the server that consumes them. */
2580
+ mcp_servers: z.ZodDefault<z.ZodArray<z.ZodObject<{
2581
+ slug: z.ZodString;
2582
+ transport: z.ZodString;
2583
+ command: z.ZodDefault<z.ZodArray<z.ZodString, "many">>;
2584
+ /** The endpoint an over-the-wire transport (e.g. `sse`) connects to. Absent for a `stdio` server,
2585
+ * which is reached by its `command` instead — the per-transport requirement is stated once, in the
2586
+ * cross-field rule on `VenueSchema`, so both doors (the loader and venue_define) enforce it. */
2587
+ url: z.ZodOptional<z.ZodString>;
2588
+ credential_names: z.ZodDefault<z.ZodArray<z.ZodString, "many">>;
2589
+ }, "strip", z.ZodTypeAny, {
2590
+ slug: string;
2591
+ transport: string;
2592
+ command: string[];
2593
+ credential_names: string[];
2594
+ url?: string | undefined;
2595
+ }, {
2596
+ slug: string;
2597
+ transport: string;
2598
+ url?: string | undefined;
2599
+ command?: string[] | undefined;
2600
+ credential_names?: string[] | undefined;
2601
+ }>, "many">>;
2602
+ /** The device CLASSES the room needs — a kind (`serial`, `gpio`…), never a path. The machine
2603
+ * maps a class to concrete nodes and the owning group; a contract that could name a node could
2604
+ * name the raw memory device, so the value is pinned to the closed enumeration. */
2605
+ devices: z.ZodDefault<z.ZodArray<z.ZodEnum<["audio", "gpio", "i2c", "serial", "spi", "video"]>, "many">>;
2606
+ /** The architectures this room supports (e.g. `arm64`). Absent means any: portability is not
2607
+ * capability, so an unnamed architecture is realizable on any host rather than none. */
2608
+ architectures: z.ZodDefault<z.ZodArray<z.ZodString, "many">>;
2609
+ /** A ceiling on how many chairs may realize against this room at once. Per-chair realization
2610
+ * multiplies substrate resources by the WIDTH of a phase, and memory scales with running
2611
+ * processes, so the bound belongs in the contract where an author sets it deliberately rather
2612
+ * than discovering it with the first wide DAG on the first box that runs it. */
2613
+ max_concurrent_chairs: z.ZodOptional<z.ZodNumber>;
2614
+ /** The shared FLOOR this room composes over, so N rooms cost floor + Σ(deltas) rather than
2615
+ * N × environment. A label two rooms share to declare they build on the same base. */
2616
+ floor: z.ZodOptional<z.ZodString>;
2324
2617
  }, "strict", z.ZodTypeAny, {
2325
2618
  slug: string;
2326
2619
  institution_slug: string;
@@ -2333,6 +2626,77 @@ export declare const VenueSchema: z.ZodObject<{
2333
2626
  policy: "ephemeral" | "standing";
2334
2627
  rebuild_cadence?: string | undefined;
2335
2628
  };
2629
+ mcp_servers: {
2630
+ slug: string;
2631
+ transport: string;
2632
+ command: string[];
2633
+ credential_names: string[];
2634
+ url?: string | undefined;
2635
+ }[];
2636
+ devices: ("audio" | "gpio" | "i2c" | "serial" | "spi" | "video")[];
2637
+ architectures: string[];
2638
+ description?: string | undefined;
2639
+ flavor?: string | undefined;
2640
+ doors?: {
2641
+ ingress: string[];
2642
+ egress: string[];
2643
+ } | undefined;
2644
+ responsible_chair?: string | undefined;
2645
+ substrate?: string | undefined;
2646
+ max_concurrent_chairs?: number | undefined;
2647
+ floor?: string | undefined;
2648
+ }, {
2649
+ slug: string;
2650
+ institution_slug: string;
2651
+ description?: string | undefined;
2652
+ flavor?: string | undefined;
2653
+ equipment?: {
2654
+ tools?: string[] | undefined;
2655
+ } | undefined;
2656
+ doors?: {
2657
+ ingress?: string[] | undefined;
2658
+ egress?: string[] | undefined;
2659
+ } | undefined;
2660
+ installs?: string[] | undefined;
2661
+ credential_surface?: string[] | undefined;
2662
+ lifecycle?: {
2663
+ policy?: "ephemeral" | "standing" | undefined;
2664
+ rebuild_cadence?: string | undefined;
2665
+ } | undefined;
2666
+ responsible_chair?: string | undefined;
2667
+ substrate?: string | undefined;
2668
+ mcp_servers?: {
2669
+ slug: string;
2670
+ transport: string;
2671
+ url?: string | undefined;
2672
+ command?: string[] | undefined;
2673
+ credential_names?: string[] | undefined;
2674
+ }[] | undefined;
2675
+ devices?: ("audio" | "gpio" | "i2c" | "serial" | "spi" | "video")[] | undefined;
2676
+ architectures?: string[] | undefined;
2677
+ max_concurrent_chairs?: number | undefined;
2678
+ floor?: string | undefined;
2679
+ }>, {
2680
+ slug: string;
2681
+ institution_slug: string;
2682
+ equipment: {
2683
+ tools: string[];
2684
+ };
2685
+ installs: string[];
2686
+ credential_surface: string[];
2687
+ lifecycle: {
2688
+ policy: "ephemeral" | "standing";
2689
+ rebuild_cadence?: string | undefined;
2690
+ };
2691
+ mcp_servers: {
2692
+ slug: string;
2693
+ transport: string;
2694
+ command: string[];
2695
+ credential_names: string[];
2696
+ url?: string | undefined;
2697
+ }[];
2698
+ devices: ("audio" | "gpio" | "i2c" | "serial" | "spi" | "video")[];
2699
+ architectures: string[];
2336
2700
  description?: string | undefined;
2337
2701
  flavor?: string | undefined;
2338
2702
  doors?: {
@@ -2340,6 +2704,9 @@ export declare const VenueSchema: z.ZodObject<{
2340
2704
  egress: string[];
2341
2705
  } | undefined;
2342
2706
  responsible_chair?: string | undefined;
2707
+ substrate?: string | undefined;
2708
+ max_concurrent_chairs?: number | undefined;
2709
+ floor?: string | undefined;
2343
2710
  }, {
2344
2711
  slug: string;
2345
2712
  institution_slug: string;
@@ -2359,17 +2726,31 @@ export declare const VenueSchema: z.ZodObject<{
2359
2726
  rebuild_cadence?: string | undefined;
2360
2727
  } | undefined;
2361
2728
  responsible_chair?: string | undefined;
2729
+ substrate?: string | undefined;
2730
+ mcp_servers?: {
2731
+ slug: string;
2732
+ transport: string;
2733
+ url?: string | undefined;
2734
+ command?: string[] | undefined;
2735
+ credential_names?: string[] | undefined;
2736
+ }[] | undefined;
2737
+ devices?: ("audio" | "gpio" | "i2c" | "serial" | "spi" | "video")[] | undefined;
2738
+ architectures?: string[] | undefined;
2739
+ max_concurrent_chairs?: number | undefined;
2740
+ floor?: string | undefined;
2362
2741
  }>;
2363
2742
  export type VenueInput = z.input<typeof VenueSchema>;
2364
2743
  export type VenueOutput = z.output<typeof VenueSchema>;
2365
2744
  /**
2366
- * Cross-field venue rules the ones a single field cannot state.
2745
+ * The one cross-field venue rule that is NOT a parse error the lifecycle snowflake below.
2367
2746
  *
2368
- * A separate function rather than a `.superRefine`, on purpose and by the existing idiom
2369
- * (`domainTypeDefect` in src/registry.ts): the MCP write-surface is generated from
2370
- * `zodToMcpProps(VenueSchema)`, which needs a plain `ZodObject` with a `.shape`, and a refined
2371
- * schema is a `ZodEffects` that has neither. So both doors the loader and `venue_define` — call
2372
- * `VenueSchema.safeParse` and then this, and a rule enforced at one door is enforced at both.
2747
+ * The MCP cross-field rules (a granted server must be declared, a transport owes its reachability
2748
+ * field, a credential must be in the surface) now live on `VenueSchema.superRefine`, so
2749
+ * `VenueSchema.safeParse` catches them directly; the split into `VenueObjectSchema` (which keeps the
2750
+ * `.shape` that `zodToMcpProps(VenueObjectSchema)` and `Object.keys(...shape)` need) is what let those
2751
+ * rules move onto the schema without breaking the advertised surface. This function remains for the
2752
+ * lifecycle rule, kept out of the schema so its teaching message stays a full paragraph rather than a
2753
+ * ZodIssue string; both doors — the loader and `venue_define` — call `safeParse` and then this.
2373
2754
  *
2374
2755
  * Returns the teaching message, or null when the venue is sound.
2375
2756
  */