@ashlr/hub 3.2.7 → 3.3.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 (149) hide show
  1. package/CHANGELOG.md +268 -0
  2. package/README.md +4 -1
  3. package/dist/build-identity.json +2 -2
  4. package/dist/cli/activation.d.ts +41 -0
  5. package/dist/cli/activation.js +485 -0
  6. package/dist/cli/activation.js.map +1 -0
  7. package/dist/cli/audit.js +18 -0
  8. package/dist/cli/audit.js.map +1 -1
  9. package/dist/cli/backlog.d.ts +0 -5
  10. package/dist/cli/backlog.js +18 -0
  11. package/dist/cli/backlog.js.map +1 -1
  12. package/dist/cli/comms.js +20 -0
  13. package/dist/cli/comms.js.map +1 -1
  14. package/dist/cli/completions.d.ts +6 -1
  15. package/dist/cli/completions.js +35 -11
  16. package/dist/cli/completions.js.map +1 -1
  17. package/dist/cli/daemon.js +10 -3
  18. package/dist/cli/daemon.js.map +1 -1
  19. package/dist/cli/demo.d.ts +0 -27
  20. package/dist/cli/demo.js +17 -0
  21. package/dist/cli/demo.js.map +1 -1
  22. package/dist/cli/help.js +19 -3
  23. package/dist/cli/help.js.map +1 -1
  24. package/dist/cli/inbox.d.ts +14 -2
  25. package/dist/cli/inbox.js +137 -23
  26. package/dist/cli/inbox.js.map +1 -1
  27. package/dist/cli/index.d.ts +1 -0
  28. package/dist/cli/index.js +10 -0
  29. package/dist/cli/index.js.map +1 -1
  30. package/dist/cli/onboard.d.ts +0 -13
  31. package/dist/cli/onboard.js +20 -0
  32. package/dist/cli/onboard.js.map +1 -1
  33. package/dist/cli/resources.js +15 -0
  34. package/dist/cli/resources.js.map +1 -1
  35. package/dist/cli/run.js +1 -1
  36. package/dist/cli/run.js.map +1 -1
  37. package/dist/cli/sandbox.js +43 -0
  38. package/dist/cli/sandbox.js.map +1 -1
  39. package/dist/cli/tui.d.ts +0 -6
  40. package/dist/cli/tui.js +14 -0
  41. package/dist/cli/tui.js.map +1 -1
  42. package/dist/core/config.js +70 -0
  43. package/dist/core/config.js.map +1 -1
  44. package/dist/core/daemon/activation-permit.d.ts +268 -33
  45. package/dist/core/daemon/activation-permit.js +1111 -106
  46. package/dist/core/daemon/activation-permit.js.map +1 -1
  47. package/dist/core/daemon/loop.d.ts +13 -1
  48. package/dist/core/daemon/loop.js +192 -9
  49. package/dist/core/daemon/loop.js.map +1 -1
  50. package/dist/core/daemon/runtime-activation-resident-start-protocol.d.ts +141 -0
  51. package/dist/core/daemon/runtime-activation-resident-start-protocol.js +462 -0
  52. package/dist/core/daemon/runtime-activation-resident-start-protocol.js.map +1 -0
  53. package/dist/core/daemon/runtime-activation-resident-start-runtime.d.ts +27 -0
  54. package/dist/core/daemon/runtime-activation-resident-start-runtime.js +28 -0
  55. package/dist/core/daemon/runtime-activation-resident-start-runtime.js.map +1 -0
  56. package/dist/core/daemon/runtime-activation-stopped-consumer.d.ts +139 -0
  57. package/dist/core/daemon/runtime-activation-stopped-consumer.js +995 -0
  58. package/dist/core/daemon/runtime-activation-stopped-consumer.js.map +1 -0
  59. package/dist/core/daemon/runtime-activation-stopped-runtime.d.ts +36 -0
  60. package/dist/core/daemon/runtime-activation-stopped-runtime.js +134 -0
  61. package/dist/core/daemon/runtime-activation-stopped-runtime.js.map +1 -0
  62. package/dist/core/daemon/runtime-activation-transaction.d.ts +41 -17
  63. package/dist/core/daemon/runtime-activation-transaction.js +80 -11
  64. package/dist/core/daemon/runtime-activation-transaction.js.map +1 -1
  65. package/dist/core/daemon/runtime-release-dependency-inventory.js +1 -0
  66. package/dist/core/daemon/runtime-release-dependency-inventory.js.map +1 -1
  67. package/dist/core/daemon/service-install-authority.d.ts +0 -4
  68. package/dist/core/daemon/service-install-authority.js +18 -3
  69. package/dist/core/daemon/service-install-authority.js.map +1 -1
  70. package/dist/core/dashboard.d.ts +10 -0
  71. package/dist/core/dashboard.js +103 -28
  72. package/dist/core/dashboard.js.map +1 -1
  73. package/dist/core/effective-config.js +7 -0
  74. package/dist/core/effective-config.js.map +1 -1
  75. package/dist/core/fleet/automerge-pass.js +33 -0
  76. package/dist/core/fleet/automerge-pass.js.map +1 -1
  77. package/dist/core/fleet/decisions-ledger.js +35 -12
  78. package/dist/core/fleet/decisions-ledger.js.map +1 -1
  79. package/dist/core/fleet/external-skill-git-capture.js +9 -1
  80. package/dist/core/fleet/external-skill-git-capture.js.map +1 -1
  81. package/dist/core/fleet/judge-decision-metadata.d.ts +8 -1
  82. package/dist/core/fleet/judge-decision-metadata.js +14 -1
  83. package/dist/core/fleet/judge-decision-metadata.js.map +1 -1
  84. package/dist/core/fleet/manager.d.ts +15 -1
  85. package/dist/core/fleet/manager.js +108 -30
  86. package/dist/core/fleet/manager.js.map +1 -1
  87. package/dist/core/fleet/post-merge-credit.d.ts +134 -9
  88. package/dist/core/fleet/post-merge-credit.js +350 -10
  89. package/dist/core/fleet/post-merge-credit.js.map +1 -1
  90. package/dist/core/fleet/self-improve.d.ts +34 -1
  91. package/dist/core/fleet/self-improve.js +106 -1
  92. package/dist/core/fleet/self-improve.js.map +1 -1
  93. package/dist/core/fleet/skill-library.d.ts +21 -2
  94. package/dist/core/fleet/skill-library.js +54 -12
  95. package/dist/core/fleet/skill-library.js.map +1 -1
  96. package/dist/core/fleet/status.js +1 -0
  97. package/dist/core/fleet/status.js.map +1 -1
  98. package/dist/core/fleet/worked-ledger.d.ts +22 -0
  99. package/dist/core/fleet/worked-ledger.js +32 -0
  100. package/dist/core/fleet/worked-ledger.js.map +1 -1
  101. package/dist/core/foundry/automerge-scope-policy.d.ts +2 -2
  102. package/dist/core/foundry/automerge-scope-policy.js +9 -2
  103. package/dist/core/foundry/automerge-scope-policy.js.map +1 -1
  104. package/dist/core/goals/store.js +18 -4
  105. package/dist/core/goals/store.js.map +1 -1
  106. package/dist/core/inbox/apply.js +5 -2
  107. package/dist/core/inbox/apply.js.map +1 -1
  108. package/dist/core/inbox/merge.d.ts +94 -1
  109. package/dist/core/inbox/merge.js +349 -16
  110. package/dist/core/inbox/merge.js.map +1 -1
  111. package/dist/core/integrations/github.d.ts +2 -0
  112. package/dist/core/integrations/github.js +2 -1
  113. package/dist/core/integrations/github.js.map +1 -1
  114. package/dist/core/learn/reflect.d.ts +42 -4
  115. package/dist/core/learn/reflect.js +56 -5
  116. package/dist/core/learn/reflect.js.map +1 -1
  117. package/dist/core/run/engines.d.ts +8 -0
  118. package/dist/core/run/engines.js +9 -1
  119. package/dist/core/run/engines.js.map +1 -1
  120. package/dist/core/run/learned-router.js +28 -3
  121. package/dist/core/run/learned-router.js.map +1 -1
  122. package/dist/core/run/orchestrator.d.ts +7 -2
  123. package/dist/core/run/orchestrator.js +86 -60
  124. package/dist/core/run/orchestrator.js.map +1 -1
  125. package/dist/core/swarm/rollback.d.ts +11 -0
  126. package/dist/core/swarm/rollback.js +54 -0
  127. package/dist/core/swarm/rollback.js.map +1 -1
  128. package/dist/core/swarm/runner.js +94 -8
  129. package/dist/core/swarm/runner.js.map +1 -1
  130. package/dist/core/types.d.ts +100 -1
  131. package/dist/core/types.js.map +1 -1
  132. package/dist/core/web/api.js +105 -7
  133. package/dist/core/web/api.js.map +1 -1
  134. package/dist/core/web/control.d.ts +20 -0
  135. package/dist/core/web/control.js +44 -32
  136. package/dist/core/web/control.js.map +1 -1
  137. package/dist/core/web/fleet-status-cache.d.ts +68 -0
  138. package/dist/core/web/fleet-status-cache.js +120 -0
  139. package/dist/core/web/fleet-status-cache.js.map +1 -0
  140. package/dist/core/web/public/next/assets/index-CY0U241s.css +1 -0
  141. package/dist/core/web/public/next/assets/index-Ct0mf8n4.js +69 -0
  142. package/dist/core/web/public/next/assets/index-Ct0mf8n4.js.map +1 -0
  143. package/dist/core/web/public/next/index.html +15 -0
  144. package/dist/release-dependency-inventory.json +1 -1
  145. package/docs/RUNTIME_ACTIVATION_AUTHORITY.md +126 -21
  146. package/docs/contracts/CONTRACT-M521.md +102 -0
  147. package/package.json +20 -3
  148. package/schema/config.schema.json +800 -5
  149. package/node_modules/which/CHANGELOG.md +0 -166
@@ -197,7 +197,7 @@
197
197
  "plugins": {
198
198
  "type": "object",
199
199
  "additionalProperties": false,
200
- "description": "M33 plugin-system configuration. Default empty \u2014 enabled:[] means no plugins load.",
200
+ "description": "M33 plugin-system configuration. Default empty — enabled:[] means no plugins load.",
201
201
  "properties": {
202
202
  "enabled": {
203
203
  "type": "array",
@@ -232,8 +232,803 @@
232
232
  },
233
233
  "foundry": {
234
234
  "type": "object",
235
- "description": "v4/v5 autonomous-fleet configuration (M45+). Full key reference: docs/FOUNDRY-CONFIG.md. Deep validation is runtime: unknown keys surface as effective-config warnings (M340).",
236
- "additionalProperties": true
235
+ "description": "v4/v5 autonomous-fleet configuration (M45+). Full key reference: docs/FOUNDRY-CONFIG.md. Declared exhaustively from AshlrConfig['foundry'] in src/core/types.ts (M340b). additionalProperties stays true: KNOWN_FOUNDRY_KEYS in src/core/effective-config.ts is the authoritative typo/unknown-key detector at config-load time (an accompanying human-readable warning, not a hard validation failure) and currently recognizes several keys this schema does not yet model 1:1 (e.g. acePlaybook, localization, redTeam, feedbackEnabled, stallIdleMs, strategistModel, managerJudgeModel, managerJudgeEngine, inventPerCycle, blastRadius) plus operator-extension keys consumed by tooling outside this package. This schema is documentation/editor metadata only; it is not loaded or enforced by any code path in src/.",
236
+ "additionalProperties": true,
237
+ "properties": {
238
+ "allowedBackends": {
239
+ "type": "array",
240
+ "items": {
241
+ "type": "string"
242
+ },
243
+ "description": "Backends the fleet may use. Absent means ['builtin'] only."
244
+ },
245
+ "autonomyControlLoop": {
246
+ "type": "boolean",
247
+ "description": "M308: executable autonomy control loop gating daemon dispatch. Default true when foundry is present."
248
+ },
249
+ "repairHandoffV2Write": {
250
+ "type": "boolean",
251
+ "description": "Reader-first migration gate for objective-scoped repair handoff schema v2. Default false."
252
+ },
253
+ "repairHandoffV2Activation": {
254
+ "type": "object",
255
+ "additionalProperties": false,
256
+ "required": [
257
+ "id",
258
+ "activatedAt"
259
+ ],
260
+ "description": "CLI-issued identity for the current v2 writer activation epoch.",
261
+ "properties": {
262
+ "id": {
263
+ "type": "string",
264
+ "description": "Fresh UUID minted when the writer transitions disabled to enabled."
265
+ },
266
+ "activatedAt": {
267
+ "type": "string",
268
+ "description": "Canonical ISO timestamp recorded with the activation identity."
269
+ }
270
+ }
271
+ },
272
+ "models": {
273
+ "type": "object",
274
+ "additionalProperties": {
275
+ "type": "string"
276
+ },
277
+ "description": "Per-backend preferred model id, keyed by EngineId."
278
+ },
279
+ "claude5": {
280
+ "type": "object",
281
+ "additionalProperties": false,
282
+ "description": "M320: Claude 5 generation rollout (Sonnet 5 workhorse + Fable 5 judge/strategist). Absent means enabled.",
283
+ "properties": {
284
+ "enabled": {
285
+ "type": "boolean",
286
+ "description": "Master switch. Default true."
287
+ },
288
+ "fable": {
289
+ "type": "boolean",
290
+ "description": "Use Fable 5 as default judge/strategist with fallback to opus-4-8. Default true."
291
+ }
292
+ }
293
+ },
294
+ "modelGranularRouting": {
295
+ "type": "object",
296
+ "additionalProperties": false,
297
+ "description": "M323: model-granular cost-aware learned routing. DEFAULT OFF.",
298
+ "properties": {
299
+ "enabled": {
300
+ "type": "boolean",
301
+ "description": "Master switch. Default false."
302
+ },
303
+ "minShipRate": {
304
+ "type": "number",
305
+ "minimum": 0,
306
+ "maximum": 1,
307
+ "description": "Minimum learned ship-rate for the cost-aware pick. Default 0.6."
308
+ }
309
+ }
310
+ },
311
+ "bestOfN": {
312
+ "type": "number",
313
+ "description": "M170/M333: best-of-N candidate generation count. Default 1 (single dispatch)."
314
+ },
315
+ "bestOfNCandidates": {
316
+ "type": "array",
317
+ "description": "M333: per-candidate engine/model specs for multi-model best-of-N.",
318
+ "items": {
319
+ "type": "object",
320
+ "additionalProperties": false,
321
+ "required": [
322
+ "engine"
323
+ ],
324
+ "properties": {
325
+ "engine": {
326
+ "type": "string"
327
+ },
328
+ "model": {
329
+ "type": [
330
+ "string",
331
+ "null"
332
+ ]
333
+ }
334
+ }
335
+ }
336
+ },
337
+ "bestOfNMinItemScore": {
338
+ "type": "number",
339
+ "description": "M333: fan out only for work items whose score >= this threshold."
340
+ },
341
+ "outcomeWatcher": {
342
+ "type": "boolean",
343
+ "description": "M332: observation-only revert/follow-up watcher. DEFAULT ON; false disables."
344
+ },
345
+ "verifyToGreen": {
346
+ "type": "object",
347
+ "additionalProperties": false,
348
+ "description": "M331: verify-to-green bounded engine repair loop before filing a proposal. DEFAULT OFF.",
349
+ "properties": {
350
+ "enabled": {
351
+ "type": "boolean",
352
+ "description": "Master switch. Default false."
353
+ },
354
+ "maxIterations": {
355
+ "type": "integer",
356
+ "minimum": 1,
357
+ "maximum": 5,
358
+ "description": "Max repair iterations. Default 3."
359
+ },
360
+ "perRunTimeoutMs": {
361
+ "type": "integer",
362
+ "minimum": 1,
363
+ "description": "Per repair-run timeout in ms. Default 180000."
364
+ },
365
+ "failureTailBytes": {
366
+ "type": "integer",
367
+ "minimum": 1,
368
+ "description": "Verification-failure tail bytes fed back to the engine. Default 8192."
369
+ }
370
+ }
371
+ },
372
+ "sandboxExternal": {
373
+ "type": "boolean",
374
+ "description": "Run external engines inside a sandbox with diff capture. Default true when foundry is set."
375
+ },
376
+ "timeoutMs": {
377
+ "type": "integer",
378
+ "minimum": 1,
379
+ "description": "Hard wall-clock per external run (ms). Default 20 minutes."
380
+ },
381
+ "completenessGate": {
382
+ "type": "boolean",
383
+ "description": "M275: completeness + self-verify gate before filing a proposal. DEFAULT true."
384
+ },
385
+ "mergeAuthority": {
386
+ "type": "array",
387
+ "description": "Allowlist for the merge-authority gate: a proposal may auto-apply to main only if its {engine,model} matches an entry here.",
388
+ "items": {
389
+ "type": "object",
390
+ "additionalProperties": false,
391
+ "required": [
392
+ "engine",
393
+ "model"
394
+ ],
395
+ "properties": {
396
+ "engine": {
397
+ "type": "string"
398
+ },
399
+ "model": {
400
+ "type": "string"
401
+ }
402
+ }
403
+ }
404
+ },
405
+ "limits": {
406
+ "type": "object",
407
+ "description": "M46: per-backend rate limits for subscription backends, keyed by EngineId. Absent means unlimited.",
408
+ "additionalProperties": {
409
+ "type": "object",
410
+ "additionalProperties": false,
411
+ "required": [
412
+ "window",
413
+ "max"
414
+ ],
415
+ "properties": {
416
+ "window": {
417
+ "type": "string",
418
+ "description": "Rolling window label, e.g. '1m'|'5m'|'1h'|'1d'."
419
+ },
420
+ "max": {
421
+ "type": "integer",
422
+ "description": "Max dispatches per rolling window."
423
+ }
424
+ }
425
+ }
426
+ },
427
+ "engines": {
428
+ "type": "object",
429
+ "description": "M50 (v5): declarative engine roster (EngineSpec per key). Overrides/extends BUILTIN_ENGINE_REGISTRY. Absent means exactly the builtin roster. See EngineSpec in src/core/types.ts.",
430
+ "additionalProperties": true
431
+ },
432
+ "nim": {
433
+ "type": "object",
434
+ "additionalProperties": false,
435
+ "description": "M195: NVIDIA NIM backend config (OpenAI-compatible cloud inference). Entirely opt-in.",
436
+ "properties": {
437
+ "baseUrl": {
438
+ "type": "string",
439
+ "description": "Default 'https://integrate.api.nvidia.com/v1'."
440
+ },
441
+ "model": {
442
+ "type": "string",
443
+ "description": "Default 'moonshotai/kimi-k2.6'."
444
+ },
445
+ "apiKeyEnv": {
446
+ "type": "string",
447
+ "description": "Env var NAME holding the bearer API key. Default 'NVIDIA_NIM_API_KEY'."
448
+ },
449
+ "tier": {
450
+ "type": "string",
451
+ "enum": [
452
+ "local",
453
+ "mid",
454
+ "frontier"
455
+ ],
456
+ "description": "Trust tier for routing. Default 'frontier'."
457
+ },
458
+ "maxConcurrent": {
459
+ "type": "integer",
460
+ "minimum": 0
461
+ },
462
+ "costPerMTokenOut": {
463
+ "type": "number",
464
+ "minimum": 0
465
+ }
466
+ }
467
+ },
468
+ "kimi": {
469
+ "type": "object",
470
+ "additionalProperties": false,
471
+ "description": "Kimi/Moonshot resource hints (engine normally defined via foundry.engines.kimi).",
472
+ "properties": {
473
+ "maxConcurrent": {
474
+ "type": "integer",
475
+ "minimum": 0
476
+ },
477
+ "costPerMTokenOut": {
478
+ "type": "number",
479
+ "minimum": 0
480
+ },
481
+ "tier": {
482
+ "type": "string",
483
+ "enum": [
484
+ "local",
485
+ "mid",
486
+ "frontier"
487
+ ],
488
+ "description": "M270: promotes the kimi engine spec's tier (engine-registry.ts applyKimiConfig)."
489
+ }
490
+ }
491
+ },
492
+ "fleetMcp": {
493
+ "type": "boolean",
494
+ "description": "M248: guarantee fleet sandboxed engines inherit ashlr-plugin MCP tools. DEFAULT true."
495
+ },
496
+ "minItemValue": {
497
+ "type": "number",
498
+ "description": "M124: backlog value filter floor. Default 2."
499
+ },
500
+ "scanTodos": {
501
+ "type": "boolean",
502
+ "description": "M136: TODO/FIXME marker scanner toggle. DEFAULT false."
503
+ },
504
+ "scanDeps": {
505
+ "type": "boolean",
506
+ "description": "M160: dependency-bump/npm-audit scanner toggle. DEFAULT false."
507
+ },
508
+ "scanDependencyBumps": {
509
+ "type": "boolean",
510
+ "description": "M271: mechanical npm-outdated package bump scanner toggle. DEFAULT false. Requires scanDeps=true."
511
+ },
512
+ "scanLint": {
513
+ "type": "boolean",
514
+ "description": "M160: lint-error scanner toggle. DEFAULT false."
515
+ },
516
+ "scanHygiene": {
517
+ "type": "boolean",
518
+ "description": "M160: repo-hygiene (README/LICENSE/CONTRIBUTING) scanner toggle. DEFAULT false."
519
+ },
520
+ "goalPlanning": {
521
+ "type": "boolean",
522
+ "description": "M222: goal to milestones auto-planning. DEFAULT true."
523
+ },
524
+ "goalFocusMode": {
525
+ "type": "boolean",
526
+ "description": "Defer new planning-goal expansion / generative invention while active goals have pending milestones. DEFAULT true."
527
+ },
528
+ "goalFocusActiveThreshold": {
529
+ "type": "number",
530
+ "description": "Active actionable-goal threshold for goalFocusMode. Default 4."
531
+ },
532
+ "browserVerify": {
533
+ "type": "boolean",
534
+ "description": "M167: headless browser verification of web-app renders after a diff. DEFAULT false (opt-in)."
535
+ },
536
+ "visualGrounding": {
537
+ "type": "object",
538
+ "additionalProperties": false,
539
+ "description": "Pluggable visual grounding layer for screenshot/document perception. DEFAULT false.",
540
+ "properties": {
541
+ "enabled": {
542
+ "type": "boolean"
543
+ },
544
+ "provider": {
545
+ "type": "string",
546
+ "enum": [
547
+ "locateanything-http",
548
+ "generic-openai-vision"
549
+ ]
550
+ },
551
+ "endpoint": {
552
+ "type": "string"
553
+ },
554
+ "model": {
555
+ "type": "string"
556
+ },
557
+ "query": {
558
+ "type": "string"
559
+ },
560
+ "apiKeyEnv": {
561
+ "type": "string"
562
+ },
563
+ "timeoutMs": {
564
+ "type": "integer",
565
+ "minimum": 1
566
+ },
567
+ "maxImageBytes": {
568
+ "type": "integer",
569
+ "minimum": 1
570
+ },
571
+ "licenseAccepted": {
572
+ "type": "boolean"
573
+ },
574
+ "allowRemoteEndpoint": {
575
+ "type": "boolean"
576
+ }
577
+ }
578
+ },
579
+ "usePhantom": {
580
+ "type": "boolean",
581
+ "description": "M168: opt-in phantom-secret injection for fleet verification/integration tasks. DEFAULT false."
582
+ },
583
+ "diffSafety": {
584
+ "type": "boolean",
585
+ "description": "M158: destructive-diff pre-judge guard. DEFAULT true."
586
+ },
587
+ "tasteCritic": {
588
+ "type": "boolean",
589
+ "description": "M183: frontier TASTE critic for best-of-N selection. DEFAULT false."
590
+ },
591
+ "routingPolicy": {
592
+ "type": "string",
593
+ "enum": [
594
+ "balanced",
595
+ "cost",
596
+ "quality"
597
+ ],
598
+ "description": "M128: intelligent model-granular routing policy. Absent means 'balanced'."
599
+ },
600
+ "learnedRouting": {
601
+ "type": "boolean",
602
+ "description": "M240: bias engine/model selection using historical judge outcomes. DEFAULT true."
603
+ },
604
+ "modelRacing": {
605
+ "type": "object",
606
+ "additionalProperties": false,
607
+ "required": [
608
+ "enabled"
609
+ ],
610
+ "description": "M166: model-racing + distillation dataset. DEFAULT DISABLED.",
611
+ "properties": {
612
+ "enabled": {
613
+ "type": "boolean"
614
+ },
615
+ "localEngine": {
616
+ "type": "string",
617
+ "description": "Defaults to 'local-coder'."
618
+ },
619
+ "frontierEngine": {
620
+ "type": "string",
621
+ "description": "Defaults to 'claude'."
622
+ }
623
+ }
624
+ },
625
+ "intelligence": {
626
+ "type": "object",
627
+ "additionalProperties": false,
628
+ "description": "M53: fleet-intelligence tuning (learned routing / budget recovery / anomaly holds). Absent means off.",
629
+ "properties": {
630
+ "anomalyK": {
631
+ "type": "number",
632
+ "description": "Default 4."
633
+ },
634
+ "minFrontierSuccessRate": {
635
+ "type": "number",
636
+ "minimum": 0,
637
+ "maximum": 1,
638
+ "description": "Default 0.5."
639
+ },
640
+ "minProposalYieldRate": {
641
+ "type": "number",
642
+ "minimum": 0,
643
+ "maximum": 1,
644
+ "description": "Default 0.2."
645
+ },
646
+ "dispatchYieldWindowHours": {
647
+ "type": "number",
648
+ "description": "Default 24."
649
+ }
650
+ }
651
+ },
652
+ "pulseEmit": {
653
+ "type": "boolean",
654
+ "description": "M214: emit GenAI-OTel spans to Pulse OTLP ingest. DEFAULT false."
655
+ },
656
+ "skillLibrary": {
657
+ "type": "boolean",
658
+ "description": "M243: skill-library write-back for realized merge proposals. DEFAULT true."
659
+ },
660
+ "judgePerPass": {
661
+ "type": "integer",
662
+ "minimum": 0,
663
+ "description": "M259: max frontier-judge calls per runAutoMergePass tick. Default 8."
664
+ },
665
+ "autoArchiveAfterRejects": {
666
+ "type": "integer",
667
+ "minimum": 0,
668
+ "description": "M259: auto-archive proposals after K consecutive non-ship verdicts. Default 3."
669
+ },
670
+ "proposalTtlDays": {
671
+ "type": "number",
672
+ "minimum": 0,
673
+ "description": "M259: TTL for pending proposals in days. Default 7. Set 0 to disable."
674
+ },
675
+ "simpleConductor": {
676
+ "type": "boolean",
677
+ "description": "M280: use the flat-task dispatch loop instead of the goal-conductor. DEFAULT false."
678
+ },
679
+ "resourceAwareDispatch": {
680
+ "type": "boolean",
681
+ "description": "M300: check resource snapshot before dispatch and reroute to a fallback engine when exhausted. DEFAULT true."
682
+ },
683
+ "dispatchRetries": {
684
+ "type": "integer",
685
+ "minimum": 0,
686
+ "description": "M297: bounded retry count for transient external-agent aborts. Default 2."
687
+ },
688
+ "killSwitch": {
689
+ "type": "boolean",
690
+ "description": "Test/operator kill flag for sandboxed dispatch, more restrictive than the global ~/.ashlr/KILL switch only."
691
+ },
692
+ "engineFallbackOrder": {
693
+ "type": "array",
694
+ "items": {
695
+ "type": "string"
696
+ },
697
+ "description": "M300: fallback engine preference order when the primary engine is exhausted. Default ['codex','kimi','nim','local-coder']."
698
+ },
699
+ "autoMerge": {
700
+ "type": "object",
701
+ "additionalProperties": false,
702
+ "required": [
703
+ "enabled"
704
+ ],
705
+ "description": "M47: tiered-trust auto-merge to main. DEFAULT DISABLED.",
706
+ "properties": {
707
+ "enabled": {
708
+ "type": "boolean"
709
+ },
710
+ "trustBasis": {
711
+ "type": "string",
712
+ "enum": [
713
+ "tier",
714
+ "verification",
715
+ "evidence"
716
+ ],
717
+ "description": "M153: authority model for Gate 4. Default 'tier'."
718
+ },
719
+ "maxRisk": {
720
+ "type": "string",
721
+ "enum": [
722
+ "low",
723
+ "medium",
724
+ "high"
725
+ ],
726
+ "description": "Default 'low'."
727
+ },
728
+ "managerGate": {
729
+ "type": "boolean",
730
+ "description": "Optional pass-level manager quality gate. Default false."
731
+ },
732
+ "allowSelfMerge": {
733
+ "type": "boolean",
734
+ "description": "Default false."
735
+ },
736
+ "maxAutomergeFiles": {
737
+ "type": "integer",
738
+ "minimum": 0,
739
+ "maximum": 40,
740
+ "description": "Default 4, hard maximum 40 (MAX_AUTOMERGE_POLICY_FILES in src/core/foundry/automerge-scope-policy.ts — keep in sync)."
741
+ },
742
+ "maxAutomergeLines": {
743
+ "type": "integer",
744
+ "minimum": 0,
745
+ "maximum": 3000,
746
+ "description": "Default 150, hard maximum 3000 (MAX_AUTOMERGE_POLICY_LINES in src/core/foundry/automerge-scope-policy.ts — keep in sync)."
747
+ },
748
+ "pushToRemote": {
749
+ "type": "boolean",
750
+ "description": "Also merge/push on the remote (gh pr merge). Default false."
751
+ },
752
+ "protectedRemote": {
753
+ "type": "object",
754
+ "additionalProperties": false,
755
+ "required": [
756
+ "branchProtection",
757
+ "requiredChecks"
758
+ ],
759
+ "properties": {
760
+ "branchProtection": {
761
+ "type": "boolean"
762
+ },
763
+ "requiredChecks": {
764
+ "type": "array",
765
+ "items": {}
766
+ }
767
+ }
768
+ },
769
+ "midToBranch": {
770
+ "type": "boolean",
771
+ "description": "M56 (v5): permit mid-tier proposals to auto-apply to a branch/PR, never main. Default false."
772
+ },
773
+ "allowWithoutVerification": {
774
+ "type": "boolean",
775
+ "description": "Permit auto-merge when no verification commands are detected. Default false (fail-closed)."
776
+ },
777
+ "verifyBeforeJudgePerPass": {
778
+ "type": "integer",
779
+ "minimum": 0,
780
+ "description": "Max verification-before-judge runs per auto-merge pass. Default judgePerPass."
781
+ }
782
+ }
783
+ },
784
+ "generative": {
785
+ "type": "boolean",
786
+ "description": "M181: generative engine ('rip mode') — invent bold net-new features. DEFAULT false (opt-in)."
787
+ },
788
+ "confinement": {
789
+ "type": "object",
790
+ "description": "M52: per-engine OS-level confinement profiles, keyed by EngineId or '*' for a fleet-wide default. Absent means v4 env-only containment.",
791
+ "additionalProperties": {
792
+ "type": "object",
793
+ "additionalProperties": false,
794
+ "properties": {
795
+ "mode": {
796
+ "type": "string",
797
+ "enum": [
798
+ "off",
799
+ "os"
800
+ ],
801
+ "description": "Default 'off'."
802
+ },
803
+ "readAllowed": {
804
+ "type": "array",
805
+ "items": {
806
+ "type": "string"
807
+ }
808
+ },
809
+ "networkEgress": {
810
+ "type": "boolean",
811
+ "description": "Default false."
812
+ },
813
+ "onUnsupported": {
814
+ "type": "string",
815
+ "enum": [
816
+ "fallback",
817
+ "fail"
818
+ ],
819
+ "description": "Default 'fallback'."
820
+ }
821
+ }
822
+ }
823
+ },
824
+ "fabric": {
825
+ "type": "object",
826
+ "additionalProperties": false,
827
+ "description": "M247/SPEC-INFERENCE-FABRIC: InferenceGateway config. DEFAULT ABSENT means byte-identical to pre-M247.",
828
+ "properties": {
829
+ "gateway": {
830
+ "type": "boolean",
831
+ "description": "Enable the InferenceGateway. Default false."
832
+ },
833
+ "gatewayShadow": {
834
+ "type": "boolean",
835
+ "description": "M334: observe-only shadow mode beside legacy routing. Default false."
836
+ },
837
+ "cacheShadow": {
838
+ "type": "boolean",
839
+ "description": "M249: RunCache shadow measurement mode. Default false."
840
+ },
841
+ "cache": {
842
+ "type": "boolean",
843
+ "description": "M250: live cache short-circuit (not yet implemented). Default false."
844
+ },
845
+ "resourceAware": {
846
+ "type": "boolean",
847
+ "description": "M250: resource-aware backend demoting. Requires gateway=true. Default false."
848
+ },
849
+ "concurrentDispatch": {
850
+ "type": "boolean",
851
+ "description": "M255: dispatch across all backends with headroom in parallel. Requires gateway=true. Default false."
852
+ },
853
+ "maxSlotsPerBackend": {
854
+ "type": "integer",
855
+ "minimum": 0,
856
+ "description": "M255: max concurrent slots per backend. Default 3."
857
+ },
858
+ "workhorseDispatch": {
859
+ "type": "boolean",
860
+ "description": "M256: spread local-mid bulk items across workhorse backends. Requires concurrentDispatch=true. Default false."
861
+ }
862
+ }
863
+ },
864
+ "productionVelocity": {
865
+ "description": "Production velocity profile. DEFAULT OFF. Boolean shorthand or an explicit resource-control profile object.",
866
+ "oneOf": [
867
+ {
868
+ "type": "boolean"
869
+ },
870
+ {
871
+ "type": "object",
872
+ "additionalProperties": false,
873
+ "properties": {
874
+ "enabled": {
875
+ "type": "boolean"
876
+ },
877
+ "profile": {
878
+ "type": "string",
879
+ "enum": [
880
+ "off",
881
+ "resource-control"
882
+ ]
883
+ },
884
+ "fillQueueToSlots": {
885
+ "type": "boolean"
886
+ },
887
+ "stalePendingTtlHours": {
888
+ "type": "number"
889
+ },
890
+ "maxSlotsPerBackend": {
891
+ "type": "integer",
892
+ "minimum": 0
893
+ },
894
+ "localMaxConcurrent": {
895
+ "type": "integer",
896
+ "minimum": 0
897
+ },
898
+ "nimMaxConcurrent": {
899
+ "type": "integer",
900
+ "minimum": 0
901
+ },
902
+ "kimiMaxConcurrent": {
903
+ "type": "integer",
904
+ "minimum": 0
905
+ }
906
+ }
907
+ }
908
+ ]
909
+ },
910
+ "claudeResource": {
911
+ "type": "object",
912
+ "additionalProperties": false,
913
+ "description": "M250 Resource Control Plane: Claude subscription-window resource caps.",
914
+ "properties": {
915
+ "fiveHourMessageCap": {
916
+ "type": "number"
917
+ },
918
+ "fiveHourTokenCap": {
919
+ "type": "number"
920
+ },
921
+ "weeklyTokenBudget": {
922
+ "type": "number"
923
+ },
924
+ "weeklyCostBudgetUsd": {
925
+ "type": "number"
926
+ },
927
+ "weeklyMessageCap": {
928
+ "type": "number"
929
+ },
930
+ "window": {
931
+ "type": "string",
932
+ "description": "Default '7d'."
933
+ },
934
+ "protectPct": {
935
+ "type": "number",
936
+ "description": "Default 85."
937
+ }
938
+ }
939
+ },
940
+ "resourceOverrides": {
941
+ "type": "object",
942
+ "description": "Operator resource overrides for known external capacity events (e.g. vendor weekly lockout), keyed by engine/backend id. Expired overrides are ignored automatically.",
943
+ "additionalProperties": {
944
+ "type": "object",
945
+ "additionalProperties": false,
946
+ "properties": {
947
+ "availability": {
948
+ "type": "string",
949
+ "enum": [
950
+ "open",
951
+ "near",
952
+ "throttled",
953
+ "exhausted",
954
+ "unreachable",
955
+ "unknown"
956
+ ]
957
+ },
958
+ "until": {
959
+ "type": [
960
+ "string",
961
+ "number"
962
+ ]
963
+ },
964
+ "resetsAt": {
965
+ "type": "number"
966
+ },
967
+ "reason": {
968
+ "type": "string"
969
+ },
970
+ "usedPct": {
971
+ "type": "number"
972
+ },
973
+ "cap": {
974
+ "type": "number"
975
+ },
976
+ "capUnit": {
977
+ "type": [
978
+ "string",
979
+ "null"
980
+ ],
981
+ "enum": [
982
+ "messages",
983
+ "tokens",
984
+ "requests",
985
+ "concurrent",
986
+ null
987
+ ]
988
+ },
989
+ "capWindow": {
990
+ "type": "string"
991
+ }
992
+ }
993
+ }
994
+ },
995
+ "local": {
996
+ "type": "object",
997
+ "additionalProperties": false,
998
+ "description": "M250 Resource Control Plane: local/Ollama concurrency config.",
999
+ "properties": {
1000
+ "maxConcurrent": {
1001
+ "type": "integer",
1002
+ "minimum": 0,
1003
+ "description": "Default 1."
1004
+ },
1005
+ "baseUrl": {
1006
+ "type": "string",
1007
+ "description": "Default 'http://localhost:11434'."
1008
+ }
1009
+ }
1010
+ },
1011
+ "edvVerify": {
1012
+ "type": "boolean",
1013
+ "description": "M151: opt-in EDV (independent/external) verification signal folded into backlog item scoring. DEFAULT false."
1014
+ },
1015
+ "ashlrcodeExecutor": {
1016
+ "type": "boolean",
1017
+ "description": "M185: gate for the `ashlrcode` (ac) autonomous executor path. DEFAULT false."
1018
+ },
1019
+ "specContract": {
1020
+ "type": "boolean",
1021
+ "description": "Spec-contract acceptance-criteria checking gate. DEFAULT false (disabled)."
1022
+ },
1023
+ "repoMap": {
1024
+ "type": "boolean",
1025
+ "description": "Inject a lightweight repo map into sandboxed-engine prompts. DEFAULT false."
1026
+ },
1027
+ "proposalRepair": {
1028
+ "type": "boolean",
1029
+ "description": "Repair-treatment maintenance pass toggle. DEFAULT true (opt-out via false). NOT YET present in KNOWN_FOUNDRY_KEYS (src/core/effective-config.ts) as of this pass."
1030
+ }
1031
+ }
237
1032
  },
238
1033
  "daemon": {
239
1034
  "type": "object",
@@ -242,12 +1037,12 @@
242
1037
  },
243
1038
  "user": {
244
1039
  "type": "object",
245
- "description": "Fleet owner identity (M109) \u2014 attribution on pulse spans and team surfaces.",
1040
+ "description": "Fleet owner identity (M109) — attribution on pulse spans and team surfaces.",
246
1041
  "additionalProperties": true
247
1042
  },
248
1043
  "notify": {
249
1044
  "type": "object",
250
- "description": "Outward notification targets (M18) \u2014 opt-in webhook for run/swarm completion summaries.",
1045
+ "description": "Outward notification targets (M18) — opt-in webhook for run/swarm completion summaries.",
251
1046
  "additionalProperties": true
252
1047
  },
253
1048
  "comms": {