@starci/hfs 4.0.9 → 4.1.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 (247) hide show
  1. package/CHANGELOG.md +1 -1
  2. package/LICENSE +21 -0
  3. package/emit/operations.mjs +1 -1
  4. package/emit/type-schema.mjs +2 -1
  5. package/lint/run.mjs +82 -8
  6. package/package.json +3 -2
  7. package/report/order.mjs +2 -0
  8. package/runtime/config.example.yaml +187 -0
  9. package/runtime/engine/by-code-unit.mjs +12 -0
  10. package/runtime/engine/config.mjs +247 -273
  11. package/runtime/engine/invalid-config.mjs +5 -5
  12. package/runtime/engine/model-config.mjs +90 -0
  13. package/runtime/engine/orca-config.mjs +3 -1
  14. package/runtime/engine/removed-vocabulary.mjs +28 -0
  15. package/runtime/engine/resources-config.mjs +52 -0
  16. package/runtime/engine/runtime-root.mjs +17 -0
  17. package/runtime/engine/secrets.mjs +134 -0
  18. package/runtime/engine/sonar-config.mjs +21 -0
  19. package/runtime/engine/temp-root.mjs +32 -0
  20. package/runtime/knowledge/hfs/canon-pins.yaml +18 -18
  21. package/runtime/knowledge/hfs/peer-integrations.yaml +2 -3
  22. package/runtime/knowledge/hfs/rules.yaml +102 -69
  23. package/runtime/knowledge/hfs/slots.yaml +11 -14
  24. package/runtime/knowledge/patterns/be/api.yaml +7 -24
  25. package/runtime/knowledge/patterns/be/cli.yaml +3 -12
  26. package/runtime/knowledge/patterns/be/realtime.yaml +1 -14
  27. package/runtime/knowledge/patterns/be/webhooks.yaml +0 -19
  28. package/runtime/modules/kernel/failure-codes.yaml +1 -1
  29. package/runtime/modules/kernel/removed-vocabulary.yaml +168 -0
  30. package/runtime/modules/models/registry.yaml +25 -397
  31. package/runtime/modules/models/runtimes.yaml +92 -262
  32. package/runtime/modules/models/tiers.yaml +65 -0
  33. package/runtime/scripts/api/fs/claim-file.mjs +30 -0
  34. package/runtime/scripts/api/fs/ensure-temp-root.mjs +27 -0
  35. package/runtime/scripts/api/fs/forbidden-root.mjs +2 -1
  36. package/runtime/scripts/api/fs/lib.mjs +6 -0
  37. package/runtime/scripts/api/fs/make-temp-dir.mjs +11 -0
  38. package/runtime/scripts/api/fs/safe-remove.mjs +52 -35
  39. package/runtime/scripts/api/git/lib.mjs +36 -1
  40. package/runtime/scripts/api/process/resolve-real-tool.mjs +52 -0
  41. package/runtime/scripts/api/process/run-program.mjs +8 -0
  42. package/runtime/scripts/api/sops/decrypt.mjs +9 -16
  43. package/runtime/scripts/api/sops/lib.mjs +309 -11
  44. package/runtime/scripts/api/sops/seal.mjs +8 -4
  45. package/runtime/scripts/hfs/allows.mjs +3 -3
  46. package/runtime/scripts/hfs/architecture/ast-walks.mjs +63 -50
  47. package/runtime/scripts/hfs/architecture/automatic-gates.mjs +96 -0
  48. package/runtime/scripts/hfs/architecture/backend.mjs +261 -175
  49. package/runtime/scripts/hfs/architecture/background-unowned.mjs +69 -34
  50. package/runtime/scripts/hfs/architecture/client-reaches-server.mjs +55 -54
  51. package/runtime/scripts/hfs/architecture/clones.mjs +179 -106
  52. package/runtime/scripts/hfs/architecture/config-unread.mjs +5 -22
  53. package/runtime/scripts/hfs/architecture/config.mjs +95 -80
  54. package/runtime/scripts/hfs/architecture/connection-map.mjs +233 -141
  55. package/runtime/scripts/hfs/architecture/constructor-deps.mjs +15 -9
  56. package/runtime/scripts/hfs/architecture/context-coupling.mjs +76 -52
  57. package/runtime/scripts/hfs/architecture/context-map.mjs +215 -141
  58. package/runtime/scripts/hfs/architecture/context-owner.mjs +39 -30
  59. package/runtime/scripts/hfs/architecture/context-platform-tables.mjs +31 -17
  60. package/runtime/scripts/hfs/architecture/context-transaction.mjs +38 -25
  61. package/runtime/scripts/hfs/architecture/contract-fixture-guard.mjs +86 -40
  62. package/runtime/scripts/hfs/architecture/contracts-readonly.mjs +342 -0
  63. package/runtime/scripts/hfs/architecture/contracts.mjs +263 -455
  64. package/runtime/scripts/hfs/architecture/cross-app-duplicate.mjs +43 -34
  65. package/runtime/scripts/hfs/architecture/dead-exports.mjs +201 -154
  66. package/runtime/scripts/hfs/architecture/default-deny.mjs +118 -93
  67. package/runtime/scripts/hfs/architecture/doc-language.mjs +2 -1
  68. package/runtime/scripts/hfs/architecture/entrypoint.mjs +45 -30
  69. package/runtime/scripts/hfs/architecture/error-codes.mjs +19 -12
  70. package/runtime/scripts/hfs/architecture/error-masked.mjs +39 -26
  71. package/runtime/scripts/hfs/architecture/fe-slot-allows.mjs +3 -2
  72. package/runtime/scripts/hfs/architecture/feature-shape.mjs +26 -20
  73. package/runtime/scripts/hfs/architecture/framework-pinned.mjs +1 -1
  74. package/runtime/scripts/hfs/architecture/frontend-grammar.mjs +190 -0
  75. package/runtime/scripts/hfs/architecture/frontend-routing.mjs +186 -0
  76. package/runtime/scripts/hfs/architecture/frontend-world-render.mjs +311 -0
  77. package/runtime/scripts/hfs/architecture/frontend-world.mjs +328 -0
  78. package/runtime/scripts/hfs/architecture/frontend.mjs +109 -829
  79. package/runtime/scripts/hfs/architecture/hfs-graph.mjs +14 -2
  80. package/runtime/scripts/hfs/architecture/hfs.mjs +120 -288
  81. package/runtime/scripts/hfs/architecture/hooks-are-hooks.mjs +46 -26
  82. package/runtime/scripts/hfs/architecture/i18n-keys.mjs +114 -76
  83. package/runtime/scripts/hfs/architecture/index.mjs +158 -102
  84. package/runtime/scripts/hfs/architecture/injection-token-exported.mjs +33 -28
  85. package/runtime/scripts/hfs/architecture/machine-ast.mjs +180 -144
  86. package/runtime/scripts/hfs/architecture/managed-scripts.mjs +8 -2
  87. package/runtime/scripts/hfs/architecture/module-per-transport.mjs +150 -101
  88. package/runtime/scripts/hfs/architecture/next-data-contract.mjs +51 -43
  89. package/runtime/scripts/hfs/architecture/next-data-key.mjs +338 -0
  90. package/runtime/scripts/hfs/architecture/next-data.mjs +179 -427
  91. package/runtime/scripts/hfs/architecture/owners.mjs +27 -13
  92. package/runtime/scripts/hfs/architecture/package-shape.mjs +51 -23
  93. package/runtime/scripts/hfs/architecture/presentation.mjs +165 -0
  94. package/runtime/scripts/hfs/architecture/reachability.mjs +127 -61
  95. package/runtime/scripts/hfs/architecture/register-once.mjs +112 -63
  96. package/runtime/scripts/hfs/architecture/registration.mjs +187 -110
  97. package/runtime/scripts/hfs/architecture/required-files.mjs +100 -68
  98. package/runtime/scripts/hfs/architecture/route-files-thin.mjs +83 -58
  99. package/runtime/scripts/hfs/architecture/schema-owner.mjs +182 -108
  100. package/runtime/scripts/hfs/architecture/source-names-shape.mjs +318 -0
  101. package/runtime/scripts/hfs/architecture/source-names.mjs +83 -248
  102. package/runtime/scripts/hfs/architecture/sql-owner.mjs +175 -118
  103. package/runtime/scripts/hfs/architecture/sql-returning.mjs +39 -28
  104. package/runtime/scripts/hfs/architecture/sql-tokens.mjs +302 -172
  105. package/runtime/scripts/hfs/architecture/supabase-ast.mjs +1 -1
  106. package/runtime/scripts/hfs/architecture/supabase-be.mjs +55 -45
  107. package/runtime/scripts/hfs/architecture/supabase-results.mjs +182 -0
  108. package/runtime/scripts/hfs/architecture/supabase-tables.mjs +20 -12
  109. package/runtime/scripts/hfs/architecture/supabase.mjs +191 -263
  110. package/runtime/scripts/hfs/architecture/symbols.mjs +175 -99
  111. package/runtime/scripts/hfs/architecture/test-world-files.mjs +82 -41
  112. package/runtime/scripts/hfs/architecture/tiers.mjs +120 -69
  113. package/runtime/scripts/hfs/architecture/transport-owner.mjs +84 -57
  114. package/runtime/scripts/hfs/architecture/type-context.mjs +282 -0
  115. package/runtime/scripts/hfs/architecture/typescript.mjs +116 -276
  116. package/runtime/scripts/hfs/architecture/unit-spec-providers.mjs +84 -62
  117. package/runtime/scripts/hfs/architecture.mjs +3 -4
  118. package/runtime/scripts/hfs/check.mjs +61 -70
  119. package/runtime/scripts/hfs/coverage-scope.mjs +84 -38
  120. package/runtime/scripts/hfs/declaration-shape.mjs +77 -36
  121. package/runtime/scripts/hfs/declaration-slots.mjs +1 -1
  122. package/runtime/scripts/hfs/edition-slots.mjs +5 -3
  123. package/runtime/scripts/hfs/linear-text.mjs +30 -0
  124. package/runtime/scripts/hfs/manifest-shape.mjs +164 -63
  125. package/runtime/scripts/hfs/path-findings.mjs +58 -38
  126. package/runtime/scripts/hfs/pin-findings.mjs +31 -0
  127. package/runtime/scripts/hfs/repo-identity.mjs +5 -2
  128. package/runtime/scripts/hfs/rule-catalog.mjs +194 -0
  129. package/runtime/scripts/hfs/rule-params-shape.mjs +33 -27
  130. package/runtime/scripts/hfs/rules/cli.mjs +5 -1
  131. package/runtime/scripts/hfs/rules/contract-compat.mjs +40 -22
  132. package/runtime/scripts/hfs/rules/contract.mjs +35 -27
  133. package/runtime/scripts/hfs/rules/database-config.mjs +57 -32
  134. package/runtime/scripts/hfs/rules/database-migrations.mjs +52 -31
  135. package/runtime/scripts/hfs/rules/database-plpgsql.mjs +106 -91
  136. package/runtime/scripts/hfs/rules/database-sql.mjs +254 -173
  137. package/runtime/scripts/hfs/rules/database.mjs +36 -23
  138. package/runtime/scripts/hfs/rules/deps.mjs +64 -32
  139. package/runtime/scripts/hfs/rules/docker.mjs +113 -65
  140. package/runtime/scripts/hfs/rules/edition.mjs +118 -111
  141. package/runtime/scripts/hfs/rules/event-bus.mjs +91 -45
  142. package/runtime/scripts/hfs/rules/fe-contract-documents.mjs +17 -16
  143. package/runtime/scripts/hfs/rules/fe-no-tests.mjs +36 -16
  144. package/runtime/scripts/hfs/rules/frontend-tree.mjs +4 -3
  145. package/runtime/scripts/hfs/rules/integration-specs.mjs +75 -41
  146. package/runtime/scripts/hfs/rules/kinds.mjs +59 -25
  147. package/runtime/scripts/hfs/rules/lint-suppression.mjs +9 -3
  148. package/runtime/scripts/hfs/rules/monorepo.mjs +82 -45
  149. package/runtime/scripts/hfs/rules/peer-integrations.mjs +24 -3
  150. package/runtime/scripts/hfs/rules/pipeline.mjs +58 -9
  151. package/runtime/scripts/hfs/rules/proof-commands.mjs +14 -8
  152. package/runtime/scripts/hfs/rules/repo-local-checks.mjs +11 -6
  153. package/runtime/scripts/hfs/rules/saga.mjs +128 -61
  154. package/runtime/scripts/hfs/rules/secrets.mjs +4 -3
  155. package/runtime/scripts/hfs/rules/services.mjs +34 -16
  156. package/runtime/scripts/hfs/rules/stacks.mjs +21 -14
  157. package/runtime/scripts/hfs/rules/supabase-secrets.mjs +32 -23
  158. package/runtime/scripts/hfs/rules/test-topology.mjs +25 -11
  159. package/runtime/scripts/hfs/secret.mjs +90 -45
  160. package/runtime/scripts/hfs/slot-app-view.mjs +102 -0
  161. package/runtime/scripts/hfs/slot-classify.mjs +65 -0
  162. package/runtime/scripts/hfs/slot-errors.mjs +11 -0
  163. package/runtime/scripts/hfs/slot-imports.mjs +76 -0
  164. package/runtime/scripts/hfs/slot-manifest-shape.mjs +73 -0
  165. package/runtime/scripts/hfs/slot-match.mjs +153 -0
  166. package/runtime/scripts/hfs/slot-path.mjs +8 -0
  167. package/runtime/scripts/hfs/slot-required.mjs +76 -0
  168. package/runtime/scripts/hfs/slot-semantic-problems.mjs +148 -0
  169. package/runtime/scripts/hfs/slot-side-problems.mjs +28 -0
  170. package/runtime/scripts/hfs/slots.mjs +72 -693
  171. package/runtime/scripts/hfs/sql/pg-parse.mjs +5 -2
  172. package/runtime/scripts/hfs/trailing-slashes.mjs +8 -0
  173. package/runtime/scripts/hfs/tree.mjs +19 -14
  174. package/runtime/scripts/hfs/typescript-programs.mjs +6 -4
  175. package/runtime/scripts/hfs/view.mjs +1 -1
  176. package/runtime/scripts/lib/dockerfile.mjs +56 -33
  177. package/runtime/scripts/lib/event-contract.mjs +17 -13
  178. package/runtime/scripts/lib/fs-kind.mjs +14 -4
  179. package/runtime/scripts/lib/git.mjs +2 -2
  180. package/runtime/scripts/lib/graphql-contract.mjs +158 -322
  181. package/runtime/scripts/lib/graphql-sdl.mjs +262 -0
  182. package/runtime/scripts/lib/i18n.mjs +3 -2
  183. package/runtime/scripts/lib/in-order.mjs +71 -0
  184. package/runtime/scripts/lib/language.mjs +3 -3
  185. package/runtime/scripts/lib/list.mjs +8 -1
  186. package/runtime/scripts/lib/mutation-fence.mjs +15 -0
  187. package/runtime/scripts/lib/path-key.mjs +42 -9
  188. package/runtime/scripts/lib/pid-alive.mjs +7 -0
  189. package/runtime/scripts/lib/regex.mjs +1 -1
  190. package/runtime/scripts/lib/same-text.mjs +1 -1
  191. package/runtime/scripts/lib/secret-patterns.mjs +6 -2
  192. package/runtime/scripts/lib/sleep-sync.mjs +2 -2
  193. package/runtime/scripts/lib/sops-envelope.mjs +103 -2
  194. package/runtime/scripts/lib/stack-services.mjs +1 -2
  195. package/runtime/scripts/lib/ts-ast.mjs +9 -0
  196. package/runtime/scripts/lib/walk.mjs +6 -1
  197. package/scaffold/add-cli-lite.mjs +2 -1
  198. package/scaffold/add-table.mjs +2 -2
  199. package/scaffold/add.mjs +3 -2
  200. package/scaffold/app.mjs +4 -2
  201. package/scaffold/edition-gate.mjs +25 -25
  202. package/scaffold/lite-exports.mjs +2 -1
  203. package/scaffold/service.mjs +5 -4
  204. package/sync/hygiene.mjs +15 -9
  205. package/sync/index.mjs +7 -3
  206. package/templates/app/ci-workflows/github/workflows/ci.yml +4 -4
  207. package/templates/app/ci-workflows/github/workflows/e2e.yml +3 -3
  208. package/templates/app/ci-workflows/github/workflows/images.yml +3 -3
  209. package/templates/app/ci-workflows/sonar-steps.yml +2 -2
  210. package/templates/app/ci-workflows-lite/github/workflows/ci.yml +6 -6
  211. package/templates/app/ci-workflows-lite/github/workflows/db-deploy.yml +3 -3
  212. package/templates/app/ci-workflows-lite/github/workflows/images.yml +3 -3
  213. package/templates/app/starciwork.gitignore +1 -1
  214. package/templates/be/image/api/Dockerfile +1 -1
  215. package/templates/be/image/cli/Dockerfile +1 -1
  216. package/templates/be/image/worker/Dockerfile +1 -1
  217. package/templates/be/patterns/cli/group.cli.spec.ts.tpl +1 -1
  218. package/templates/be/patterns/cli/group.cli.ts.tpl +2 -2
  219. package/templates/be/patterns/event-bus/platform/event-runner.service.spec.ts.tpl +13 -0
  220. package/templates/be/patterns/event-bus/platform/event-runner.service.ts.tpl +7 -2
  221. package/templates/be/patterns/event-bus/platform/event.policy.ts.tpl +4 -1
  222. package/templates/be/patterns/event-bus/platform/kafka-event-transport.client.ts.tpl +2 -1
  223. package/templates/be/patterns/outbox/platform/outbox-relay.policy.ts.tpl +24 -9
  224. package/templates/be/patterns/queues/platform/queue-relay.service.ts.tpl +3 -2
  225. package/templates/be/patterns/queues/platform/queue-worker.service.ts.tpl +8 -5
  226. package/templates/be/skeleton/src/features/cli/migrate/migrate.cli.spec.ts +1 -1
  227. package/templates/be/skeleton/src/features/cli/migrate/migrate.cli.ts +2 -2
  228. package/templates/be/skeleton/src/features/cli/seed/seed.cli.spec.ts +1 -1
  229. package/templates/be/skeleton/src/features/cli/seed/seed.cli.ts +2 -2
  230. package/templates/be/skeleton/src/modules/platform/database/migrate-connections.client.ts +3 -2
  231. package/templates/be/skeleton/src/modules/platform/database/seed-connections.client.ts +5 -4
  232. package/templates/be/skeleton/src/modules/platform/primitives/index.ts +1 -0
  233. package/templates/be/skeleton/src/modules/platform/primitives/sequence.policy.spec.ts +47 -0
  234. package/templates/be/skeleton/src/modules/platform/primitives/sequence.policy.ts +16 -0
  235. package/templates/be/skeleton-lite/apps/api/Dockerfile +1 -0
  236. package/templates/be/skeleton-lite/src/modules/platform/primitives/index.ts +2 -0
  237. package/templates/fe/image/next/Dockerfile +2 -1
  238. package/templates/fe/skeleton/apps/app/src/app/[locale]/page.tsx +2 -2
  239. package/templates/fe/skeleton/apps/landing/src/app/[locale]/page.tsx +2 -2
  240. package/templates/fe/skeleton/packages/__project__-i18n/src/index.ts +1 -2
  241. package/templates/fe/skeleton-lite/apps/web/src/app/[locale]/layout.tsx +1 -2
  242. package/templates/fe/skeleton-lite/apps/web/src/app/[locale]/page.tsx +2 -2
  243. package/templates/fe/skeleton-lite/apps/web/src/components/blocks/SignInForm/index.tsx +7 -1
  244. package/templates/fe/skeleton-lite/apps/web/src/modules/db/auth/write-sign-out.ts +1 -1
  245. package/templates/fe/skeleton-lite/apps/web/src/modules/db/validation/validation.mapper.ts +10 -2
  246. package/templates/fe/skeleton-lite/apps/web/src/modules/i18n/request.ts +10 -3
  247. package/upgrade/index.mjs +9 -2
@@ -0,0 +1,168 @@
1
+ # Every spelling the runtime refuses by name, each with what replaced it. engine/removed-vocabulary.mjs reads this file:
2
+ # the config and routing-bias refusals take their names and replacements from it, and the `removed-vocabulary` self-check
3
+ # refuses any of these spellings in text an agent or the owner reads, outside this file, CHANGELOG.md and a block marked
4
+ # `[removed-list]` (CONTRIBUTING.md, "Removing or renaming a spelling").
5
+ # Fields: id; kind (config-key | bias-field | verb | flag | code | vocabulary | file; a file is named by its base name); name (the removed spelling); use (the
6
+ # replacement, worded to finish the sentence "<name> is removed (<use>)"); since (the release that removed it);
7
+ # match (optional regular expression the scan uses instead of the literal name); scan (false when the name is too common
8
+ # a word to scan for).
9
+ kinds: [config-key, bias-field, verb, flag, code, vocabulary, file]
10
+ removed:
11
+ - id: bias-require
12
+ kind: bias-field
13
+ name: require
14
+ use: 'a requirement is now `only`, which keeps just the named members of the tier chain: write each as "<agent>", "<agent>/<model>" or a {pool, provider, model} selector, e.g. {"only":["claude"]}'
15
+ since: 1.0.0-alpha.6
16
+ match: '\brequire\s*:\s*[\[{]|"require"\s*:|\brequire bias\b|\bbias[^\n.]{0,30}`require`'
17
+ - id: config-models-pools
18
+ kind: config-key
19
+ name: models.pools
20
+ use: 'tiers are ordered member chains in modules/models/tiers.yaml; override one with models.tiers'
21
+ since: 1.0.0-alpha.6
22
+ - id: config-models-nonoperation
23
+ kind: config-key
24
+ name: models.nonOperation
25
+ use: 'planner, validator and kernelManager take the frontier tier (modules/models/tiers.yaml seats); remap with models.seats'
26
+ since: 1.0.0-alpha.6
27
+ - id: config-models-selection
28
+ kind: config-key
29
+ name: models.selection
30
+ use: 'selection is always quota-aware; there is no key'
31
+ since: 1.0.0-alpha.6
32
+ - id: config-allocation-shares
33
+ kind: config-key
34
+ name: allocation.shares
35
+ use: 'the picker balances by models.balance (maxStreak, maxSharePercent); there are no per-provider weights'
36
+ since: 1.0.0-alpha.6
37
+ match: 'allocation[. ]shares'
38
+ - id: config-allocation-windowhours
39
+ kind: config-key
40
+ name: allocation.windowHours
41
+ use: 'balance reads the recent picks of one tier (models.balance); there is no window'
42
+ since: 1.0.0-alpha.6
43
+ - id: config-allocation-preferredprovider
44
+ kind: config-key
45
+ name: allocation.preferredProvider
46
+ use: 'an owner preference is a goal routing bias (prefer <agent>)'
47
+ since: 1.0.0-alpha.6
48
+ match: 'preferredProvider'
49
+ - id: config-allocation-policy
50
+ kind: config-key
51
+ name: allocation.policy
52
+ use: 'the picker is the one policy; there is no key'
53
+ since: 1.0.0-alpha.6
54
+ - id: config-allocation-mode
55
+ kind: config-key
56
+ name: allocation.mode
57
+ use: 'allocation holds grants only'
58
+ since: 1.0.0-alpha.6
59
+ - id: config-kernel-group
60
+ kind: config-key
61
+ name: kernel.group
62
+ use: 'the Kernel takes the high tier; pin with kernel.agent / kernel.model (an `only` bias)'
63
+ since: 1.0.0-alpha.6
64
+ - id: config-supervisor-kernel-group
65
+ kind: config-key
66
+ name: supervisor.kernel.group
67
+ use: 'the Supervisor takes the frontier tier; pin with supervisor.kernel.agent / .model (an `only` bias)'
68
+ since: 1.0.0-alpha.6
69
+ - id: config-coredebug
70
+ kind: config-key
71
+ name: coreDebug
72
+ use: 'the debug watcher is a /loop of the calling chat, not a seat; the cadence and the worktree alert limit are debugLoop.interval and debugLoop.worktreeLimit'
73
+ since: 1.0.0-alpha.6
74
+ - id: config-debug
75
+ kind: config-key
76
+ name: debug
77
+ use: 'the debug watcher is started by the /starci skill in the calling chat; there is no switch (debugLoop.interval sets its cadence)'
78
+ since: 1.0.0-alpha.6
79
+ scan: false
80
+ - id: vocabulary-sol-opus
81
+ kind: vocabulary
82
+ name: sol-opus
83
+ use: 'a pool of two providers is a tier chain of members (modules/models/tiers.yaml)'
84
+ since: 1.0.0-alpha.6
85
+ - id: seat-core-debug
86
+ kind: vocabulary
87
+ name: core-debug seat
88
+ use: 'the debug watcher is a /loop of the calling chat running `starci debug digest`'
89
+ since: 1.0.0-alpha.6
90
+ match: '\bcore-debug\s+(?:seat|watcher|worker|pass)\b'
91
+ - id: verb-debug-pass
92
+ kind: verb
93
+ name: debug pass
94
+ use: '`starci debug digest` (read-only) and `starci debug run <probe>`'
95
+ since: 1.0.0-alpha.6
96
+ match: '(?<![\w-])debug pass\b'
97
+ - id: config-supervisor-landgate-push
98
+ kind: config-key
99
+ name: supervisor.landGate.push
100
+ use: 'a land fast-forwards local main only and never pushes; the remote main of the runtime moves once per release, through starci release cut'
101
+ since: 1.0.0-alpha.7
102
+ match: 'landGate\.push\b'
103
+ - id: flag-land-no-push
104
+ kind: flag
105
+ name: --no-push
106
+ use: 'a land never pushes, so there is nothing to leave unpushed'
107
+ since: 1.0.0-alpha.7
108
+ - id: code-landed-push-owed
109
+ kind: code
110
+ name: landed-push-owed
111
+ use: 'a land has no push step; the outcome is landed'
112
+ since: 1.0.0-alpha.7
113
+ - id: flag-caller-agent
114
+ kind: flag
115
+ name: --caller-agent
116
+ use: 'the debug digest runs in the calling chat; it takes no caller flag'
117
+ since: 1.0.0-alpha.6
118
+ - id: flag-caller-model
119
+ kind: flag
120
+ name: --caller-model
121
+ use: 'the debug digest runs in the calling chat; it takes no caller flag'
122
+ since: 1.0.0-alpha.6
123
+ - id: flag-caller-effort
124
+ kind: flag
125
+ name: --caller-effort
126
+ use: 'the debug digest runs in the calling chat; it takes no caller flag'
127
+ since: 1.0.0-alpha.6
128
+ - id: code-workflow-debug-not-ready
129
+ kind: code
130
+ name: workflow-debug-not-ready
131
+ use: 'there is no debug seat to be ready; the digest reads the ledger directly'
132
+ since: 1.0.0-alpha.6
133
+ - id: file-core-debug
134
+ kind: file
135
+ name: core-debug.mjs
136
+ use: 'the debug watcher is a /loop of the calling chat running `starci debug digest`; the core-watch probe is scripts/reconciler/core-watch.mjs'
137
+ since: 1.0.0-alpha.6
138
+ match: '(?<![\w-])core-debug\.mjs\b'
139
+ - id: file-debug-pass
140
+ kind: file
141
+ name: debug-pass.mjs
142
+ use: '`starci debug digest` (read-only)'
143
+ since: 1.0.0-alpha.6
144
+ match: '(?<![\w-])debug-pass\.mjs\b'
145
+ - id: file-caller-context
146
+ kind: file
147
+ name: caller-context.mjs
148
+ use: 'there is no declared caller context; the debug digest runs in the calling chat'
149
+ since: 1.0.0-alpha.6
150
+ match: '(?<![\w-])caller-context\b'
151
+ - id: file-host-maintenance
152
+ kind: file
153
+ name: host-maintenance.md
154
+ use: 'skills/starci/references/host-startup.md'
155
+ since: 1.0.0-alpha.6
156
+ match: '(?<![\w-])host-maintenance\b'
157
+ - id: file-sonar-secrets-keys
158
+ kind: file
159
+ name: KEYS.md
160
+ use: 'secret.env.example lists the names of the host secrets; ext/sonar/README.md describes the stack'
161
+ since: 1.0.0-alpha.7
162
+ match: '(?<![\w/.-])secrets/KEYS\.md'
163
+ - id: vocab-example-sonar-token-member
164
+ kind: vocabulary
165
+ name: per-example Sonar token custody
166
+ use: 'the examples are analysed on SonarCloud with the SONAR_TOKEN of the runtime secret.env (runtimeSecrets in their services.sonar declaration)'
167
+ since: 1.0.0-alpha.7
168
+ match: 'sonarqube-(?:lite-app|shape-slot|starci-ecommerce-app)-token'
@@ -2,8 +2,8 @@ schema: starci/profile-registry@1
2
2
  purpose: >-
3
3
  The ONE model catalog of the runtime. Concrete model ids — provider,
4
4
  capability tier and per-token price — live under `models`; the provider
5
- quota/capacity pools, their roles, concurrency and per-difficulty model pins
6
- live under `pools`; every launch target lives under `targets`, carrying
5
+ quota/capacity pools, their roles and concurrency live under `pools` (which
6
+ model takes which work is modules/models/tiers.yaml); every launch target lives under `targets`, carrying
7
7
  `defaultModel` where it names a single model. No other file in the repo
8
8
  states a model id, tier, price or pool: those cite these keys.
9
9
 
@@ -54,50 +54,31 @@ models:
54
54
  gpt-6-luna: {provider: codex, tier: economy, price: {input: 0.1, output: 0.5, cacheRead: 0.01, cacheWrite: 0.125, source: official}}
55
55
  swe-2-max: {provider: devin, tier: frontier, price: {input: null, output: null, cacheRead: null, cacheWrite: null, source: unset}}
56
56
 
57
- # The provider quota/capacity pools the allocator serves. `models` pins the launch
58
- # model per difficulty (easy|medium|hard|insane) — a missing pin is a typed error,
59
- # never a fallback to a neighbouring tier's model; `defaultModel` is the model a
60
- # launch takes when no difficulty pin applies. `maxParallel` is the only concurrency
61
- # authority (registry.yaml executionModel.concurrency).
57
+ # The provider quota/capacity pools the allocator serves. Which model a seat or operation takes is
58
+ # modules/models/tiers.yaml; `defaultModel` is the model a launch takes when it names none. `maxParallel` is
59
+ # the only concurrency authority (registry.yaml executionModel.concurrency).
62
60
  pools:
63
- # One Codex account window carries both models: Luna is the easy/medium model, Sol the hard and insane one.
64
- # Role/tier/tool/quality gates still apply on top of the difficulty pin; an owner allocation changes
65
- # capacity, never qualification or effect authority.
61
+ # One Codex account window carries every Codex model. Role, tool and quality gates still apply on top of tier
62
+ # membership; an owner allocation changes capacity, never qualification or effect authority.
66
63
  codex-agent:
67
64
  target: codex-agent
68
65
  provider: codex
69
66
  roles: [implement, verify, write, decide, plan]
70
67
  maxParallel: 10
71
68
  defaultModel: gpt-6-luna
72
- models:
73
- easy: gpt-6-luna
74
- medium: gpt-6-luna
75
- hard: gpt-6.1-sol
76
- insane: gpt-6.1-sol
77
- effort:
78
- easy: low
79
- medium: medium
80
- hard: high
81
- insane: max
82
- # One Claude session/week window, all five roles on the same pinned model at every difficulty. The Claude
83
- # CLI lists no models, so the dispatch's model attestation is what proves the claude-opus-5-5 id.
69
+ # One Claude session/week window, all five roles. The Claude CLI lists no models, so the dispatch's model
70
+ # attestation is what proves the model id a tier member names.
84
71
  claude-agent:
85
72
  target: claude-agent
86
73
  provider: claude
87
74
  roles: [implement, verify, write, decide, plan]
88
75
  maxParallel: 6
89
76
  defaultModel: claude-opus-5-5
90
- models:
91
- easy: claude-opus-5-5
92
- medium: claude-opus-5-5
93
- hard: claude-opus-5-5
94
- insane: claude-opus-5-5
95
77
  # Devin has no machine-readable account headroom equivalent to Orca's provider windows. Owner-assigned
96
78
  # capacity: 10 parallel lanes, opened by the owner's default grant (config.yaml allocation.grants
97
79
  # devin-agent=10@implement+verify+write applies to every workflow; once config.yaml declares a grants list,
98
80
  # `starci kernel route` rejects a grant-gated pool that list does not open). The CLI's auth/readiness and observed
99
- # launch/refusal status are the live capacity signal on top of this cap. swe-2-max is a medium+ agent: no
100
- # easy or insane pin, and the easy tier does not list the pool.
81
+ # launch/refusal status are the live capacity signal on top of this cap.
101
82
  devin-agent:
102
83
  target: devin-agent
103
84
  provider: devin
@@ -106,9 +87,6 @@ pools:
106
87
  capacityAuthority: explicit-workflow-quota
107
88
  quotaTelemetry: launch-status
108
89
  defaultModel: swe-2-max
109
- models:
110
- medium: swe-2-max
111
- hard: swe-2-max
112
90
 
113
91
  runtimes:
114
92
  - codex
@@ -154,9 +132,6 @@ targets:
154
132
  # difficulty and whose `defaultModel` covers an unpinned difficulty. A pool target names no model itself.
155
133
  codex-agent:
156
134
  runtime: codex
157
- profiles:
158
- working: gpt-6-luna
159
- reasoning: gpt-6.1-sol
160
135
  orcaLaunch: {agent: codex} # orca orchestration worker-start --agent codex
161
136
  # Launch-only targets: an explicit `--model gpt-6.1-sol` or `--model gpt-6-luna` request reaches that one model
162
137
  # on the Codex provider window. They are off every automatic chain; allocation routes the codex-agent pool.
@@ -164,16 +139,10 @@ targets:
164
139
  gpt-6.1-sol:
165
140
  runtime: codex
166
141
  defaultModel: gpt-6.1-sol
167
- profiles:
168
- working: gpt-6.1-sol
169
- reasoning: gpt-6.1-sol
170
142
  orcaLaunch: {agent: codex} # orca orchestration worker-start --agent codex
171
143
  gpt-6-luna:
172
144
  runtime: codex
173
145
  defaultModel: gpt-6-luna
174
- profiles:
175
- working: gpt-6-luna
176
- reasoning: gpt-6-luna
177
146
  orcaLaunch: {agent: codex} # orca orchestration worker-start --agent codex
178
147
  # Cursor: Orca agent id `cursor` (binary cursor-agent). A launch-only target like gpt-6.1-sol: off every automatic chain,
179
148
  # reached by an explicit `--model auto` (the CLI's default) or any id of the account's `cursor-agent --list-models`.
@@ -183,328 +152,14 @@ targets:
183
152
  cursor-agent:
184
153
  runtime: cursor
185
154
  defaultModel: auto
186
- profiles:
187
- working: auto
188
- reasoning: auto
189
155
  orcaLaunch: {agent: cursor} # orca orchestration worker-start --agent cursor
190
156
  claude-agent:
191
157
  runtime: claude
192
- profiles:
193
- working: opus
194
- reasoning: opus-reviewer
195
158
  orcaLaunch: {agent: claude} # orca orchestration worker-start --agent claude
196
159
  devin-agent:
197
160
  runtime: devin
198
161
  executionHosts: [orca]
199
- profiles:
200
- working: devin-worker
201
- reasoning: devin-reviewer
202
162
  orcaLaunch: {agent: devin} # orca orchestration worker-start --agent devin
203
- targetAliases:
204
- codex-gpt-6.1-sol: codex-agent
205
- codex-gpt-6-luna: codex-agent
206
- devin-devin-worker: devin-agent
207
- devin-devin-reviewer: devin-agent
208
- # Bare model ids that are not targets resolve to the provider-window pool that carries them, so workflow
209
- # quota entries land on the right window. gpt-6.1-sol and gpt-6-luna are targets; their `runtime: codex`
210
- # names the window.
211
- claude-opus: claude-agent
212
- claude-opus-5-5: claude-agent
213
- skills:
214
- starci:
215
- chains:
216
- working:
217
- - devin-agent
218
- - codex-agent
219
- - claude-agent
220
- reasoning:
221
- - claude-agent
222
- - codex-agent
223
- # An operator whose kind runtimes.yaml roleOfKind marks think work with no declared order carries the
224
- # think order of runtimes.yaml allocation.preference.think (Opus, then Sol) and nothing else;
225
- # scripts/route/route-model.mjs refuses any other pool for it. A kind's declared order wins: owner routing
226
- # 2026-09-26 gives the ui order (Codex, then Devin) to interface.audit, e2e.verify,
227
- # security.verify and uat.assisted.verify, the implement order (Devin, Codex, Opus) to the
228
- # mechanical ops provision.ask, workspace.manage, task.execute and knowledge.repair, and sol-think (Sol,
229
- # Opus overflow) to the kernel's own model calls, which carry no operator entry. Owner decision 2026-09-25
230
- # (72h scripts/agent/model-scorecard.mjs evidence):
231
- # hands-on implementation chains lead with Devin; scaffold, docs, content and grammar chains (the
232
- # roleOfKind order scaffold) lead with Devin; the image-tool chains are Codex alone.
233
- operators:
234
- architecture.decide:
235
- skill: starci
236
- chain: [claude-agent, codex-agent]
237
- environments:
238
- - {environment: claude, profiles: [claude-agent]}
239
- - {environment: codex, profiles: [codex-agent]}
240
- backend.implement:
241
- skill: starci
242
- chain: [devin-agent, codex-agent, claude-agent]
243
- environments:
244
- - {environment: devin, profiles: [devin-agent]}
245
- - {environment: codex, profiles: [codex-agent]}
246
- - {environment: claude, profiles: [claude-agent]}
247
- brand.decide:
248
- skill: starci
249
- # Owner ruling 2026-09-27 (draw-devin-brand-claude): Claude decides the brand and its direction (runtimes.yaml
250
- # order brand), Codex is the fallback. A decide operation that also produces bytes: when the product has no
251
- # mascot, the Codex runtime, the only one carrying the image model ($imagegen), generates one placeholder;
252
- # Claude decides the identity and defers that artwork with a brief.
253
- chain: [claude-agent, codex-agent]
254
- environments:
255
- - {environment: claude, profiles: [claude-agent]}
256
- - {environment: codex, profiles: [codex-agent]}
257
- decision.prepare:
258
- skill: starci
259
- chain: [claude-agent, codex-agent]
260
- environments:
261
- - {environment: claude, profiles: [claude-agent]}
262
- - {environment: codex, profiles: [codex-agent]}
263
- docs.author:
264
- skill: starci
265
- # Authoring reference docs is write-role work over the record tree: the full writing chain.
266
- chain: [devin-agent, codex-agent, claude-agent]
267
- environments:
268
- - {environment: devin, profiles: [devin-agent]}
269
- - {environment: codex, profiles: [codex-agent]}
270
- - {environment: claude, profiles: [claude-agent]}
271
- provision.ask:
272
- skill: starci
273
- # Asking for a provision is naming it exactly and waiting: a mechanical op the hands take — the
274
- # implement order (owner routing 2026-09-26).
275
- chain: [devin-agent, codex-agent, claude-agent]
276
- environments:
277
- - {environment: devin, profiles: [devin-agent]}
278
- - {environment: codex, profiles: [codex-agent]}
279
- - {environment: claude, profiles: [claude-agent]}
280
- business.decide:
281
- skill: starci
282
- chain: [claude-agent, codex-agent]
283
- environments:
284
- - {environment: claude, profiles: [claude-agent]}
285
- - {environment: codex, profiles: [codex-agent]}
286
- content.generate:
287
- skill: starci
288
- chain: [devin-agent, codex-agent, claude-agent]
289
- environments:
290
- - {environment: devin, profiles: [devin-agent]}
291
- - {environment: codex, profiles: [codex-agent]}
292
- - {environment: claude, profiles: [claude-agent]}
293
- code.refactor:
294
- skill: starci
295
- # Restructuring code under a behaviour invariant is implementation work: the full coding chain.
296
- chain: [devin-agent, codex-agent, claude-agent]
297
- environments:
298
- - {environment: devin, profiles: [devin-agent]}
299
- - {environment: codex, profiles: [codex-agent]}
300
- - {environment: claude, profiles: [claude-agent]}
301
- e2e.verify:
302
- skill: starci
303
- # End-to-end proof is UI verification: the ui order, Sol first with the hands as fallback
304
- # (owner routing 2026-09-26).
305
- chain: [codex-agent, devin-agent]
306
- environments:
307
- - {environment: codex, profiles: [codex-agent]}
308
- - {environment: devin, profiles: [devin-agent]}
309
- integration.verify:
310
- skill: starci
311
- # A live call to a real provider is the same kind of work as the API proof: run code, read the response
312
- # back, keep the output. Its hard floor starts the chain at Devin.
313
- chain: [devin-agent, claude-agent, codex-agent]
314
- environments:
315
- - {environment: devin, profiles: [devin-agent]}
316
- - {environment: claude, profiles: [claude-agent]}
317
- - {environment: codex, profiles: [codex-agent]}
318
- grammar.update:
319
- skill: starci
320
- # Growing the installed grammar is code, stories, tests, a published version and a canon entry: hands-on
321
- # work at a hard floor on the scaffold order, Devin first (owner decision 2026-09-25).
322
- chain: [devin-agent, codex-agent, claude-agent]
323
- environments:
324
- - {environment: devin, profiles: [devin-agent]}
325
- - {environment: codex, profiles: [codex-agent]}
326
- - {environment: claude, profiles: [claude-agent]}
327
- goal.revise:
328
- skill: starci
329
- # Revising a live goal is a decision about the work, not work on it: the reasoning chain.
330
- chain: [claude-agent, codex-agent]
331
- environments:
332
- - {environment: claude, profiles: [claude-agent]}
333
- - {environment: codex, profiles: [codex-agent]}
334
- interface.asset:
335
- skill: starci
336
- # Generating the artwork a candidate embeds needs the same image model the drawing used, so the chain is
337
- # the same single Codex link: a runtime that cannot render an image cannot carry this operation at all.
338
- chain: [codex-agent]
339
- environments:
340
- - {environment: codex, profiles: [codex-agent]}
341
- interface.draw:
342
- skill: starci
343
- # Owner ruling 2026-09-27 (draw-devin-brand-claude): Devin draws - token-render HTML/CSS in the Grammar's tokens
344
- # captured by Playwright in the product checkout (its card carries browser-dom) - and Codex (Sol) is the fallback.
345
- # No drawer paints raster art: a raster region is an artworkSlot interface.asset generates on Codex's image tool.
346
- chain: [devin-agent, codex-agent]
347
- environments:
348
- - {environment: devin, profiles: [devin-agent]}
349
- - {environment: codex, profiles: [codex-agent]}
350
- interface.implement:
351
- skill: starci
352
- chain: [devin-agent, codex-agent, claude-agent]
353
- environments:
354
- - {environment: devin, profiles: [devin-agent]}
355
- - {environment: codex, profiles: [codex-agent]}
356
- - {environment: claude, profiles: [claude-agent]}
357
- interface.audit:
358
- skill: starci
359
- # Visual/Grammar conformance is an independent verdict about quality: the ui order, Sol first
360
- # (owner routing 2026-09-26). Its browser-dom host tool (route.riskHints) admits only a pool
361
- # whose agent card lists it (capabilities.hostTools): Devin and Codex; Claude is passed over.
362
- chain: [codex-agent, devin-agent]
363
- environments:
364
- - {environment: codex, profiles: [codex-agent]}
365
- - {environment: devin, profiles: [devin-agent]}
366
- knowledge.repair:
367
- skill: starci
368
- # Repairing a canonical rule file is a mechanical op: the implement order (owner routing 2026-09-26).
369
- chain: [devin-agent, codex-agent, claude-agent]
370
- environments:
371
- - {environment: devin, profiles: [devin-agent]}
372
- - {environment: codex, profiles: [codex-agent]}
373
- - {environment: claude, profiles: [claude-agent]}
374
- unit.verify:
375
- skill: starci
376
- # Running the whole unit suite is mechanical, hands-on verify work: the same chain as the performance run.
377
- chain: [devin-agent, claude-agent, codex-agent]
378
- environments:
379
- - {environment: devin, profiles: [devin-agent]}
380
- - {environment: claude, profiles: [claude-agent]}
381
- - {environment: codex, profiles: [codex-agent]}
382
- perf.verify:
383
- skill: starci
384
- # Measuring a performance budget runs the product and reads numbers back: the hands-on verify chain.
385
- chain: [devin-agent, claude-agent, codex-agent]
386
- environments:
387
- - {environment: devin, profiles: [devin-agent]}
388
- - {environment: claude, profiles: [claude-agent]}
389
- - {environment: codex, profiles: [codex-agent]}
390
- release.deliver:
391
- skill: starci
392
- chain: [devin-agent, codex-agent, claude-agent]
393
- environments:
394
- - {environment: devin, profiles: [devin-agent]}
395
- - {environment: codex, profiles: [codex-agent]}
396
- - {environment: claude, profiles: [claude-agent]}
397
- request.analyze:
398
- skill: starci
399
- # Turning a raw request into a scoped, checkable goal is planning work: the reasoning chain, the cheap pool never.
400
- chain: [claude-agent, codex-agent]
401
- environments:
402
- - {environment: claude, profiles: [claude-agent]}
403
- - {environment: codex, profiles: [codex-agent]}
404
- review.verify:
405
- skill: starci
406
- chain: [devin-agent, claude-agent, codex-agent]
407
- environments:
408
- - {environment: devin, profiles: [devin-agent]}
409
- - {environment: claude, profiles: [claude-agent]}
410
- - {environment: codex, profiles: [codex-agent]}
411
- handover.review:
412
- skill: starci
413
- # Writing the owner's handover is judging what was delivered and what was not proven: a verdict the hands
414
- # give (owner decision 2026-09-25 review-hands), Opus and Sol as overflow.
415
- chain: [devin-agent, claude-agent, codex-agent]
416
- environments:
417
- - {environment: devin, profiles: [devin-agent]}
418
- - {environment: claude, profiles: [claude-agent]}
419
- - {environment: codex, profiles: [codex-agent]}
420
- runtime.operate:
421
- skill: starci
422
- chain: [devin-agent, codex-agent, claude-agent]
423
- environments:
424
- - {environment: devin, profiles: [devin-agent]}
425
- - {environment: codex, profiles: [codex-agent]}
426
- - {environment: claude, profiles: [claude-agent]}
427
- scope.finish:
428
- skill: starci
429
- chain: [devin-agent, codex-agent, claude-agent]
430
- environments:
431
- - {environment: devin, profiles: [devin-agent]}
432
- - {environment: codex, profiles: [codex-agent]}
433
- - {environment: claude, profiles: [claude-agent]}
434
- scope.define:
435
- skill: starci
436
- # Cutting a goal into bounded nodes is a decision about the work: the reasoning chain.
437
- chain: [claude-agent, codex-agent]
438
- environments:
439
- - {environment: claude, profiles: [claude-agent]}
440
- - {environment: codex, profiles: [codex-agent]}
441
- security.verify:
442
- skill: starci
443
- # Auditing code against the security baseline is a verdict about quality: the ui order, Sol first
444
- # (owner routing 2026-09-26).
445
- chain: [codex-agent, devin-agent]
446
- environments:
447
- - {environment: codex, profiles: [codex-agent]}
448
- - {environment: devin, profiles: [devin-agent]}
449
- task.execute:
450
- skill: starci
451
- # A bounded, evidence-grounded workflow selection is a mechanical op: the implement order
452
- # (owner routing 2026-09-26).
453
- chain: [devin-agent, codex-agent, claude-agent]
454
- environments:
455
- - {environment: devin, profiles: [devin-agent]}
456
- - {environment: codex, profiles: [codex-agent]}
457
- - {environment: claude, profiles: [claude-agent]}
458
- test.author:
459
- skill: starci
460
- # Authoring the regression check a behaviour-invariant change is measured against is implementation work:
461
- # the full coding chain.
462
- chain: [devin-agent, codex-agent, claude-agent]
463
- environments:
464
- - {environment: devin, profiles: [devin-agent]}
465
- - {environment: codex, profiles: [codex-agent]}
466
- - {environment: claude, profiles: [claude-agent]}
467
- uat.verify:
468
- skill: starci
469
- chain: [devin-agent, claude-agent, codex-agent]
470
- environments:
471
- - {environment: devin, profiles: [devin-agent]}
472
- - {environment: claude, profiles: [claude-agent]}
473
- - {environment: codex, profiles: [codex-agent]}
474
- uat.assisted.prepare:
475
- skill: starci
476
- # Preparation authors deterministic scripts/evidence but performs no product journey.
477
- chain: [devin-agent, codex-agent, claude-agent]
478
- environments:
479
- - {environment: devin, profiles: [devin-agent]}
480
- - {environment: codex, profiles: [codex-agent]}
481
- - {environment: claude, profiles: [claude-agent]}
482
- uat.assisted.verify:
483
- skill: starci
484
- # Receipt acceptance is an elevated verdict over evidence: the ui order, Sol first
485
- # (owner routing 2026-09-26).
486
- chain: [codex-agent, devin-agent]
487
- environments:
488
- - {environment: codex, profiles: [codex-agent]}
489
- - {environment: devin, profiles: [devin-agent]}
490
- work.author:
491
- skill: starci
492
- # Authoring the Work records - a node's scope and checks, a whole feature's drafts - is authoring the hands
493
- # do (owner decision 2026-09-25 review-hands: "work.author" with test/UAT authoring); the kernel's cut
494
- # decision (implementation.plan) stays on the think order.
495
- chain: [devin-agent, claude-agent, codex-agent]
496
- environments:
497
- - {environment: devin, profiles: [devin-agent]}
498
- - {environment: claude, profiles: [claude-agent]}
499
- - {environment: codex, profiles: [codex-agent]}
500
- workspace.manage:
501
- skill: starci
502
- # Workspace bookkeeping is a mechanical op: the implement order (owner routing 2026-09-26).
503
- chain: [devin-agent, codex-agent, claude-agent]
504
- environments:
505
- - {environment: devin, profiles: [devin-agent]}
506
- - {environment: codex, profiles: [codex-agent]}
507
- - {environment: claude, profiles: [claude-agent]}
508
163
  fallback:
509
164
  allowedReasons:
510
165
  - unavailable
@@ -520,52 +175,25 @@ fallback:
520
175
  - safety-block
521
176
  - partial-or-unknown-effects
522
177
  selection: |-
523
- Orca supplies the observed external-agent inventory. Resolve the selected skill and
524
- operator chain from top to bottom, choosing the first ready runtime/profile. Fall through only
525
- after an allowed failure with verified no-effect state. This policy never installs an agent,
526
- authenticates a provider, grants tools or expands the workflow authority. Every pool launches the one
527
- way (modules/kernel/contract-changes/launch-through-worker-start.yaml): `orca orchestration worker-start --agent
178
+ Orca supplies the observed external-agent inventory. The tier chain (modules/models/tiers.yaml) names the
179
+ candidates; a member is taken only when it passes the picker's hard filter and has tokens (scripts/lib/tier-pick.mjs).
180
+ A launch falls to the next member only after an allowed failure with verified no-effect state. This policy never
181
+ installs an agent, authenticates a provider, grants tools or expands the workflow authority. Every member launches
182
+ the one way (modules/kernel/start-workflow.yaml): `orca orchestration worker-start --agent
528
183
  <runtime> [--model <id> --effort <level>] --spec <prompt>` (Orca files the Task), the unattended flags from Orca's per-agent
529
184
  default args; the launcher takes the agent terminal from the start receipt (else worker-show) and attests the effective agent and model
530
185
  (worker-show). Devin takes no model flag (Orca: --model is for Claude, Codex and Cursor) and starts on its CLI default.
531
186
  costPolicy: |-
532
- Runtime pools are provider quota windows: the Codex pool carries gpt-6-luna for easy and medium work and
533
- gpt-6.1-sol for hard and insane work, the Claude pool carries claude-opus-5-5 for every role,
534
- and Devin opens through the owner's default grant (config.yaml allocation.grants). modules/models/runtimes.yaml
535
- roleOfKind splits the kinds: strategy (decide, plan and every other think kind that is not a verdict, a
536
- kernel call or a mechanical op) runs the Claude pool, then the Codex pool on Sol; the kernel's own model
537
- calls walk sol-think - the Codex pool first, the Claude pool as overflow (owner routing 2026-09-26);
538
- review - the verify kinds still on the review order and work.author (owner decision 2026-09-25
539
- review-hands) - runs the Devin pool, with Claude and Codex as
540
- overflow only (the cross-family rule sends a review of Devin's work to them); the ui order leads interface.audit, e2e.verify, security.verify and uat.assisted.verify
541
- with the Codex pool, Devin behind it; the mechanical ops - provision.ask, workspace.manage,
542
- task.execute and knowledge.repair - walk the implement order the hands serve whatever their kind role;
543
- hands-on work runs the Devin and Codex pools with the Claude pool as overflow. brand.decide is think work that also generates a placeholder mascot when the product has none;
544
- the Claude pool decides the identity and defers that artwork with a concrete brief, and the Codex pool, the
545
- only one with an image generator, generates it when it takes the launch.
546
- interface.draw token-renders its shapes (HTML/CSS in the Grammar's tokens, Playwright capture) and walks the
547
- draw order: the Devin pool first, the Codex pool as fallback (owner ruling 2026-09-27); its raster regions are
548
- artworkSlots, never painted by the drawer. interface.asset generates that artwork and therefore carries the
549
- single image-capable Codex route, with no deferral fallback - a deferred
550
- slot is exactly what this operation exists to close. grammar.update is the opposite case: it grows the
551
- installed grammar as code - a typed unit with its stories, its tests, its published version and its canon
552
- entry - so it carries the execution `implement` role at a hard floor; nothing in it is drawn, and a publish
553
- is irreversible, so the chain is limited to declared coding runtimes. knowledge.repair rewrites a canonical
554
- rule of this runtime and is think work the hands serve on the implement order. Every automatic chain contains only
555
- worker-start candidates and advances only after a verified no-effect failure. Agents have explicit turn, wall-time
556
- and tool-call ceilings; a ceiling stop is a failed attempt and never proof of completion.
557
- Never infer price or quality superiority from a subscription label; benchmark bounded
558
- representative operations before proposing another routing change. A native worker is released
559
- after its exact worker_done result is accepted; the workflow child remains until integration is
560
- complete. The chain does not decide who runs an operation - `modules/models/runtimes.yaml`
561
- does, by role preference - so every operator's `environments` must declare every runtime that carries
562
- that operation's role and owns a profile for it, and the chain lists exactly those targets so
563
- `candidateFor` can answer with a launch shape for whichever runtime the allocator picked. A pool
564
- whose roles do not cover an operation's role (Devin carries no `decide`, so they cannot take an
565
- `architecture.decide`) stays out of that operator and is excluded from allocation by the roles gate
566
- (scripts/agent/models.mjs poolRejectionReasons). The one widening: an order that names a role -
567
- `implement` - lets a pool that serves the order take its kinds whatever the kind's own role, which is how
568
- the mechanical ops reach the hands.
187
+ Runtime pools are provider quota windows. Which model takes which seat or operation is modules/models/tiers.yaml:
188
+ a seat or an op difficulty names a tier, a tier is an ordered member chain, and the picker takes the first member
189
+ with tokens after the owner bias and the balance step. Devin opens through the owner's default grant (config.yaml
190
+ allocation.grants). Drawing and artwork ops (interface.draw, interface.asset, brand.decide) take the tier of their
191
+ difficulty like every core op and make images through the headless `starci work imagegen` call, which is picked from the
192
+ imagegen call tier (tiers.yaml calls, tierUse) and holds one provider slot while it runs. Every automatic launch contains only worker-start candidates and advances only
193
+ after a verified no-effect failure. Agents have explicit turn, wall-time and tool-call ceilings; a ceiling stop is a
194
+ failed attempt and never proof of completion. Never infer price or quality superiority from a subscription label;
195
+ benchmark bounded representative operations before proposing another tier change. A native worker is released
196
+ after its exact worker_done result is accepted; the workflow child remains until integration is complete.
569
197
  assetFallback: When image generation is unavailable, reuse verified assets first; Claude may leave
570
198
  decorative image slots blank with a concrete deferred brief. Never mark missing artwork generated
571
199
  or satisfy a functional criterion with a blank slot.