@starci/hfs 4.0.7 → 4.0.9
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.
- package/CHANGELOG.md +22 -0
- package/README.md +86 -43
- package/emit/contracts.mjs +56 -9
- package/emit/db-types.mjs +169 -0
- package/emit/events.mjs +41 -0
- package/emit/operations-worker.mjs +1 -1
- package/emit/operations.mjs +2 -2
- package/emit/schema-worker.mjs +1 -1
- package/lint/bound-sys.cjs +50 -0
- package/lint/run.mjs +54 -20
- package/package.json +14 -9
- package/report/sonar.mjs +8 -8
- package/runtime/engine/config.mjs +494 -0
- package/runtime/engine/invalid-config.mjs +15 -0
- package/runtime/engine/orca-config.mjs +27 -0
- package/runtime/engine/runtime-root.mjs +5 -0
- package/runtime/engine/yaml.mjs +3 -3
- package/runtime/knowledge/hfs/canon-pins.yaml +163 -32
- package/runtime/knowledge/hfs/peer-integrations.yaml +2 -2
- package/runtime/knowledge/hfs/rules.yaml +2059 -0
- package/runtime/knowledge/hfs/slots.yaml +915 -123
- package/runtime/knowledge/patterns/be/api.yaml +369 -0
- package/runtime/knowledge/patterns/be/cli.yaml +297 -0
- package/runtime/knowledge/patterns/be/domain.yaml +113 -0
- package/runtime/knowledge/patterns/be/event-bus.yaml +285 -0
- package/runtime/knowledge/patterns/be/jobs.yaml +261 -0
- package/runtime/knowledge/patterns/be/projections.yaml +178 -0
- package/runtime/knowledge/patterns/be/queues.yaml +236 -0
- package/runtime/knowledge/patterns/be/reactors.yaml +140 -0
- package/runtime/knowledge/patterns/be/realtime.yaml +222 -0
- package/runtime/knowledge/patterns/be/saga.yaml +248 -0
- package/runtime/knowledge/patterns/be/webhooks.yaml +221 -0
- package/runtime/knowledge/patterns/fe/folder.yaml +133 -27
- package/runtime/knowledge/sonar-gate.yaml +53 -19
- package/runtime/modules/kernel/failure-codes.yaml +580 -50
- package/runtime/modules/models/registry.yaml +591 -0
- package/runtime/modules/models/runtimes.yaml +701 -0
- package/runtime/scripts/api/fs/forbidden-root.mjs +51 -0
- package/runtime/scripts/api/fs/is-link-like.mjs +25 -0
- package/runtime/scripts/api/fs/lib.mjs +14 -0
- package/runtime/scripts/api/fs/safe-remove.mjs +104 -0
- package/runtime/scripts/api/git/config-get.mjs +10 -0
- package/runtime/scripts/api/git/diff.mjs +5 -0
- package/runtime/scripts/api/git/lib.mjs +17 -27
- package/runtime/scripts/api/git/log.mjs +5 -0
- package/runtime/scripts/api/git/ls-files.mjs +6 -0
- package/runtime/scripts/api/git/ls-tree.mjs +5 -0
- package/runtime/scripts/api/git/merge-base.mjs +9 -0
- package/runtime/scripts/api/git/remote.mjs +5 -0
- package/runtime/scripts/api/git/rev-parse-query.mjs +5 -0
- package/runtime/scripts/api/git/show.mjs +6 -0
- package/runtime/scripts/api/sops/decrypt.mjs +10 -6
- package/runtime/scripts/api/sops/lib.mjs +35 -0
- package/runtime/scripts/api/sops/seal.mjs +18 -0
- package/runtime/scripts/{lib/hfs-allows.mjs → hfs/allows.mjs} +3 -3
- package/runtime/scripts/hfs/architecture/ast-walks.mjs +220 -0
- package/runtime/scripts/{checks → hfs}/architecture/backend.mjs +17 -24
- package/runtime/scripts/{checks → hfs}/architecture/background-unowned.mjs +16 -34
- package/runtime/scripts/{checks → hfs}/architecture/client-reaches-server.mjs +3 -1
- package/runtime/scripts/{checks → hfs}/architecture/clones.mjs +4 -4
- package/runtime/scripts/{checks → hfs}/architecture/config.mjs +11 -8
- package/runtime/scripts/{checks → hfs}/architecture/connection-map.mjs +21 -9
- package/runtime/scripts/hfs/architecture/context-coupling.mjs +88 -0
- package/runtime/scripts/hfs/architecture/context-map.mjs +237 -0
- package/runtime/scripts/hfs/architecture/context-owner.mjs +82 -0
- package/runtime/scripts/hfs/architecture/context-platform-tables.mjs +47 -0
- package/runtime/scripts/hfs/architecture/context-transaction.mjs +60 -0
- package/runtime/scripts/{checks → hfs}/architecture/contract-fixture-guard.mjs +5 -11
- package/runtime/scripts/{checks → hfs}/architecture/contracts.mjs +33 -162
- package/runtime/scripts/{checks → hfs}/architecture/dead-exports.mjs +58 -29
- package/runtime/scripts/{checks → hfs}/architecture/doc-language.mjs +1 -1
- package/runtime/scripts/{checks → hfs}/architecture/entrypoint.mjs +2 -1
- package/runtime/scripts/{checks → hfs}/architecture/fe-slot-allows.mjs +4 -4
- package/runtime/scripts/{checks → hfs}/architecture/feature-shape.mjs +6 -3
- package/runtime/scripts/{checks → hfs}/architecture/framework-pinned.mjs +1 -1
- package/runtime/scripts/{checks → hfs}/architecture/frontend.mjs +17 -43
- package/runtime/scripts/{checks → hfs}/architecture/hfs-graph.mjs +1 -1
- package/runtime/scripts/{checks → hfs}/architecture/hfs.mjs +27 -42
- package/runtime/scripts/{checks → hfs}/architecture/i18n-keys.mjs +1 -1
- package/runtime/scripts/{checks → hfs}/architecture/index.mjs +17 -4
- package/runtime/scripts/{checks → hfs}/architecture/machine-ast.mjs +44 -11
- package/runtime/scripts/hfs/architecture/managed-scripts.mjs +27 -0
- package/runtime/scripts/{checks → hfs}/architecture/module-per-transport.mjs +30 -6
- package/runtime/scripts/hfs/architecture/next-data-contract.mjs +96 -0
- package/runtime/scripts/{checks → hfs}/architecture/next-data.mjs +40 -168
- package/runtime/scripts/{checks → hfs}/architecture/owners.mjs +35 -15
- package/runtime/scripts/{checks → hfs}/architecture/register-once.mjs +2 -1
- package/runtime/scripts/{checks → hfs}/architecture/registration.mjs +23 -81
- package/runtime/scripts/{checks → hfs}/architecture/required-files.mjs +21 -13
- package/runtime/scripts/{checks → hfs}/architecture/schema-owner.mjs +17 -114
- package/runtime/scripts/hfs/architecture/server-action.mjs +24 -0
- package/runtime/scripts/hfs/architecture/side-boundary.mjs +16 -0
- package/runtime/scripts/{checks → hfs}/architecture/source-names.mjs +27 -147
- package/runtime/scripts/{checks → hfs}/architecture/sql-owner.mjs +59 -18
- package/runtime/scripts/hfs/architecture/sql-returning.mjs +64 -0
- package/runtime/scripts/hfs/architecture/supabase-ast.mjs +111 -0
- package/runtime/scripts/hfs/architecture/supabase-be.mjs +131 -0
- package/runtime/scripts/hfs/architecture/supabase-tables.mjs +42 -0
- package/runtime/scripts/hfs/architecture/supabase.mjs +434 -0
- package/runtime/scripts/{checks → hfs}/architecture/surface.mjs +10 -4
- package/runtime/scripts/{checks → hfs}/architecture/test-world-files.mjs +11 -21
- package/runtime/scripts/{checks → hfs}/architecture/tiers.mjs +47 -5
- package/runtime/scripts/{checks → hfs}/architecture/transport-owner.mjs +3 -3
- package/runtime/scripts/{checks → hfs}/architecture/typescript.mjs +13 -27
- package/runtime/scripts/{checks → hfs}/architecture.mjs +5 -5
- package/runtime/scripts/{lib/hfs-check.mjs → hfs/check.mjs} +95 -84
- package/runtime/scripts/hfs/coverage-scope.mjs +162 -0
- package/runtime/scripts/hfs/declaration-shape.mjs +62 -0
- package/runtime/scripts/hfs/declaration-slots.mjs +75 -0
- package/runtime/scripts/hfs/edition-slots.mjs +66 -0
- package/runtime/scripts/hfs/manifest-shape.mjs +247 -0
- package/runtime/scripts/hfs/param-names.mjs +18 -0
- package/runtime/scripts/{lib/hfs-path-findings.mjs → hfs/path-findings.mjs} +7 -7
- package/runtime/scripts/{lib → hfs}/repo-identity.mjs +9 -6
- package/runtime/scripts/hfs/rule-params-shape.mjs +50 -0
- package/runtime/scripts/hfs/rules/app-root.mjs +51 -0
- package/runtime/scripts/hfs/rules/cli.mjs +37 -0
- package/runtime/scripts/hfs/rules/contract-compat.mjs +71 -0
- package/runtime/scripts/{lib/hfs-rules → hfs/rules}/contract.mjs +11 -9
- package/runtime/scripts/hfs/rules/database-config.mjs +102 -0
- package/runtime/scripts/hfs/rules/database-constants.mjs +13 -0
- package/runtime/scripts/hfs/rules/database-migrations.mjs +111 -0
- package/runtime/scripts/hfs/rules/database-plpgsql.mjs +233 -0
- package/runtime/scripts/hfs/rules/database-sql.mjs +336 -0
- package/runtime/scripts/hfs/rules/database.mjs +68 -0
- package/runtime/scripts/{lib/hfs-rules → hfs/rules}/deps.mjs +1 -1
- package/runtime/scripts/hfs/rules/docker.mjs +259 -0
- package/runtime/scripts/hfs/rules/edition.mjs +111 -0
- package/runtime/scripts/hfs/rules/event-bus.mjs +153 -0
- package/runtime/scripts/hfs/rules/fe-contract-documents.mjs +66 -0
- package/runtime/scripts/{lib/hfs-rules → hfs/rules}/fe-no-tests.mjs +6 -5
- package/runtime/scripts/{lib/hfs-rules/frontend.mjs → hfs/rules/frontend-tree.mjs} +9 -9
- package/runtime/scripts/{lib/hfs-rules → hfs/rules}/integration-specs.mjs +3 -6
- package/runtime/scripts/hfs/rules/kinds.mjs +84 -0
- package/runtime/scripts/{lib/hfs-rules → hfs/rules}/lint-suppression.mjs +1 -1
- package/runtime/scripts/hfs/rules/monorepo.mjs +179 -0
- package/runtime/scripts/{lib/hfs-rules → hfs/rules}/peer-integrations.mjs +3 -3
- package/runtime/scripts/{lib/hfs-rules → hfs/rules}/pipeline.mjs +11 -21
- package/runtime/scripts/{lib/hfs-rules → hfs/rules}/proof-commands.mjs +2 -2
- package/runtime/scripts/{lib/hfs-rules → hfs/rules}/read.mjs +1 -1
- package/runtime/scripts/{lib/hfs-rules → hfs/rules}/repo-local-checks.mjs +2 -2
- package/runtime/scripts/hfs/rules/saga.mjs +170 -0
- package/runtime/scripts/{lib/hfs-rules → hfs/rules}/secrets.mjs +4 -4
- package/runtime/scripts/hfs/rules/services.mjs +220 -0
- package/runtime/scripts/{lib/hfs-rules → hfs/rules}/spec-placement.mjs +1 -1
- package/runtime/scripts/{lib/hfs-rules → hfs/rules}/stacks.mjs +5 -5
- package/runtime/scripts/hfs/rules/supabase-secrets.mjs +89 -0
- package/runtime/scripts/{lib/hfs-rules → hfs/rules}/test-topology.mjs +2 -2
- package/runtime/scripts/hfs/secret.mjs +175 -0
- package/runtime/scripts/{lib/hfs-slots.mjs → hfs/slots.mjs} +114 -150
- package/runtime/scripts/hfs/sql/pg-parse.mjs +46 -0
- package/runtime/scripts/hfs/test-world-slot.mjs +6 -0
- package/runtime/scripts/{lib/hfs-tree.mjs → hfs/tree.mjs} +6 -5
- package/runtime/scripts/{checks → hfs}/typescript-programs.mjs +0 -5
- package/runtime/scripts/{lib/hfs-view.mjs → hfs/view.mjs} +6 -5
- package/runtime/scripts/lib/dockerfile.mjs +124 -0
- package/runtime/scripts/lib/env.mjs +10 -0
- package/runtime/scripts/lib/event-contract.mjs +103 -0
- package/runtime/scripts/lib/git.mjs +36 -0
- package/runtime/scripts/lib/graphql-contract.mjs +429 -0
- package/runtime/scripts/lib/i18n.mjs +86 -0
- package/runtime/scripts/lib/is-main.mjs +13 -0
- package/runtime/scripts/lib/json.mjs +13 -3
- package/runtime/scripts/lib/language.mjs +26 -7
- package/runtime/scripts/lib/list.mjs +20 -0
- package/runtime/scripts/lib/package-at.mjs +37 -0
- package/runtime/scripts/lib/path-key.mjs +59 -2
- package/runtime/scripts/lib/read-text.mjs +34 -0
- package/runtime/scripts/lib/regex.mjs +4 -0
- package/runtime/scripts/lib/same-text.mjs +5 -0
- package/runtime/scripts/lib/secret-patterns.mjs +4 -3
- package/runtime/scripts/lib/sleep-sync.mjs +2 -1
- package/runtime/scripts/lib/sops-envelope.mjs +58 -0
- package/runtime/scripts/lib/stack-declaration.mjs +2 -2
- package/runtime/scripts/lib/stack-services.mjs +7 -31
- package/runtime/scripts/lib/ts-ast.mjs +35 -0
- package/runtime/scripts/{checks/common.mjs → lib/walk.mjs} +5 -15
- package/scaffold/add-app.mjs +174 -0
- package/scaffold/add-cli-lite.mjs +257 -0
- package/scaffold/add-inbox-lite.mjs +314 -0
- package/scaffold/add-table.mjs +344 -0
- package/scaffold/add.mjs +299 -0
- package/scaffold/app.mjs +359 -70
- package/scaffold/edition-gate.mjs +25 -0
- package/scaffold/image.mjs +19 -0
- package/scaffold/lite-exports.mjs +186 -0
- package/scaffold/service.mjs +33 -27
- package/scaffold/supabase-ports.mjs +26 -0
- package/src/main.mjs +327 -0
- package/sync/cli.mjs +6 -9
- package/sync/format.mjs +1 -1
- package/sync/hygiene.mjs +17 -17
- package/sync/index.mjs +171 -71
- package/sync/managed.mjs +19 -11
- package/sync/sonar-key.mjs +5 -0
- package/templates/app/ci-workflows/github/workflows/ci.yml +14 -14
- package/templates/app/ci-workflows/github/workflows/images.yml +37 -0
- package/templates/app/ci-workflows/sonar-steps.yml +9 -0
- package/templates/app/ci-workflows-lite/github/workflows/ci.yml +66 -0
- package/templates/app/ci-workflows-lite/github/workflows/db-deploy.yml +31 -0
- package/templates/app/ci-workflows-lite/github/workflows/images.yml +37 -0
- package/templates/app/codegen-lite/scripts/codegen.mjs +32 -0
- package/templates/app/docker-ignore/dockerignore +50 -0
- package/templates/app/gitignore-lite +35 -0
- package/templates/app/hooks/husky/pre-commit +3 -8
- package/templates/app/hooks/husky/pre-push +45 -6
- package/templates/app/package-scripts/core.json +8 -0
- package/templates/app/package-scripts/package.json +3 -10
- package/templates/app/package-scripts-lite/package.json +15 -0
- package/templates/app/quality-config/codecov.yml +15 -3
- package/templates/app/quality-config/sonar-base.properties +4 -0
- package/templates/app/quality-config/sonar-project.properties +2 -5
- package/templates/app/quality-config-lite/sonar-project.properties +5 -0
- package/templates/app/skeleton/.starcistacks/dev/seeds/primary-notes.sql +5 -0
- package/templates/app/skeleton/.starciwork/features/system-health/index.yaml +4 -0
- package/templates/app/skeleton/.starciwork/{features/index.yaml → index.yaml} +2 -2
- package/templates/app/skeleton/README.md +7 -5
- package/templates/app/skeleton-lite/.sops.yaml +3 -0
- package/templates/app/skeleton-lite/.starcistacks/dev/environment.json +5 -0
- package/templates/app/skeleton-lite/.starcistacks/dev/secrets/.gitkeep +1 -0
- package/templates/app/skeleton-lite/.starciwork/shell/index.yaml +55 -0
- package/templates/app/skeleton-lite/README.md +40 -0
- package/templates/app/skeleton-lite/supabase/config.toml +41 -0
- package/templates/app/skeleton-lite/supabase/migrations/__timestamp___baseline.sql +56 -0
- package/templates/app/skeleton-lite/supabase/seed.sql +0 -0
- package/templates/app/task-graph/turbo.json +23 -0
- package/templates/app/tool-config-lite/prettierignore +2 -0
- package/templates/app/tool-config-lite/prettierrc +1 -0
- package/templates/app/upgrade-full/.starcistacks/application-stacks.yaml +38 -0
- package/templates/app/upgrade-full/.starcistacks/dev/README.md +10 -0
- package/templates/app/upgrade-full/.starcistacks/dev/infra/compose/api.yaml +13 -0
- package/templates/app/upgrade-full/.starcistacks/dev/infra/compose/compose.yaml +3 -0
- package/templates/app/upgrade-full/.starcistacks/dev/infra/compose/postgres.yaml +12 -0
- package/templates/app/upgrade-full/.starcistacks/dev/infra/metadata.json +7 -0
- package/templates/be/common/main-listen.ts.partial +14 -0
- package/templates/be/common/sql-ident.ts.partial +7 -0
- package/templates/be/common/sql-tag.ts.partial +5 -0
- package/templates/be/image/api/Dockerfile +38 -0
- package/templates/be/image/cli/Dockerfile +38 -0
- package/templates/be/image/worker/Dockerfile +36 -0
- package/templates/be/inbox/database-client.ts.tpl +50 -0
- package/templates/be/inbox/index.ts.tpl +2 -0
- package/templates/be/inbox/migration.sql.tpl +29 -0
- package/templates/be/inbox/module-definition.ts.tpl +6 -0
- package/templates/be/inbox/module.ts.tpl +14 -0
- package/templates/be/inbox/options.ts.tpl +2 -0
- package/templates/be/inbox/service.ts.tpl +33 -0
- package/templates/be/inbox/sql.ts.tpl +16 -0
- package/templates/be/inbox/webhook-door.ts.tpl +36 -0
- package/templates/be/patterns/api/application.command.http.ts.tpl +10 -0
- package/templates/be/patterns/api/application.command.ts.tpl +10 -0
- package/templates/be/patterns/api/application.contracts.ts.tpl +11 -0
- package/templates/be/patterns/api/application.handler.http.ts.tpl +22 -0
- package/templates/be/patterns/api/application.handler.ts.tpl +22 -0
- package/templates/be/patterns/api/feature.index.http.ts.tpl +1 -0
- package/templates/be/patterns/api/feature.index.ts.tpl +1 -0
- package/templates/be/patterns/api/feature.module.ts.tpl +6 -0
- package/templates/be/patterns/api/graphql.input.ts.tpl +13 -0
- package/templates/be/patterns/api/graphql.mapper.ts.tpl +9 -0
- package/templates/be/patterns/api/graphql.module.ts.tpl +7 -0
- package/templates/be/patterns/api/graphql.resolver.ts.tpl +27 -0
- package/templates/be/patterns/api/graphql.type.ts.tpl +9 -0
- package/templates/be/patterns/api/http.controller.ts.tpl +27 -0
- package/templates/be/patterns/api/http.mapper.ts.tpl +9 -0
- package/templates/be/patterns/api/http.module.ts.tpl +7 -0
- package/templates/be/patterns/api/http.request.ts.tpl +10 -0
- package/templates/be/patterns/api/http.response.ts.tpl +5 -0
- package/templates/be/patterns/cli/group.cli.spec.ts.tpl +15 -0
- package/templates/be/patterns/cli/group.cli.ts.tpl +11 -0
- package/templates/be/patterns/cli/group.module.ts.tpl +7 -0
- package/templates/be/patterns/cli/sub.run.cli.spec.ts.tpl +17 -0
- package/templates/be/patterns/cli/sub.run.cli.ts.tpl +15 -0
- package/templates/be/patterns/event-bus/platform/errors/event-bus.error.ts.tpl +22 -0
- package/templates/be/patterns/event-bus/platform/event-bus.config.ts.tpl +19 -0
- package/templates/be/patterns/event-bus/platform/event-bus.contracts.ts.tpl +58 -0
- package/templates/be/patterns/event-bus/platform/event-bus.decorators.ts.tpl +46 -0
- package/templates/be/patterns/event-bus/platform/event-bus.log-events.ts.tpl +12 -0
- package/templates/be/patterns/event-bus/platform/event-bus.module-definition.ts.tpl +10 -0
- package/templates/be/patterns/event-bus/platform/event-bus.module.ts.tpl +52 -0
- package/templates/be/patterns/event-bus/platform/event-bus.options.ts.tpl +19 -0
- package/templates/be/patterns/event-bus/platform/event-bus.port.ts.tpl +28 -0
- package/templates/be/patterns/event-bus/platform/event-bus.service.spec.ts.tpl +165 -0
- package/templates/be/patterns/event-bus/platform/event-bus.service.ts.tpl +93 -0
- package/templates/be/patterns/event-bus/platform/event-envelope.policy.spec.ts.tpl +90 -0
- package/templates/be/patterns/event-bus/platform/event-envelope.policy.ts.tpl +58 -0
- package/templates/be/patterns/event-bus/platform/event-relay.service.spec.ts.tpl +136 -0
- package/templates/be/patterns/event-bus/platform/event-relay.service.ts.tpl +56 -0
- package/templates/be/patterns/event-bus/platform/event-runner.service.spec.ts.tpl +272 -0
- package/templates/be/patterns/event-bus/platform/event-runner.service.ts.tpl +128 -0
- package/templates/be/patterns/event-bus/platform/event-transport.port.ts.tpl +180 -0
- package/templates/be/patterns/event-bus/platform/event.policy.spec.ts.tpl +67 -0
- package/templates/be/patterns/event-bus/platform/event.policy.ts.tpl +38 -0
- package/templates/be/patterns/event-bus/platform/index.ts.tpl +11 -0
- package/templates/be/patterns/event-bus/platform/kafka-event-transport.client.spec.ts.tpl +348 -0
- package/templates/be/patterns/event-bus/platform/kafka-event-transport.client.ts.tpl +241 -0
- package/templates/be/patterns/event-bus/platform/messages/event-bus.messages.ts.tpl +15 -0
- package/templates/be/patterns/event-bus/platform/persistence/connection.ts.tpl +8 -0
- package/templates/be/patterns/event-bus/platform/persistence/entities/event-outbox.entity.ts.tpl +37 -0
- package/templates/be/patterns/event-bus/platform/persistence/event-bus.rows.ts.tpl +11 -0
- package/templates/be/patterns/event-bus/platform/persistence/event-bus.sql.ts.tpl +12 -0
- package/templates/be/patterns/event-bus/platform/persistence/migrations/1789800009000-create-event-outbox.ts.tpl +26 -0
- package/templates/be/patterns/jobs/job.index.ts.tpl +1 -0
- package/templates/be/patterns/jobs/job.module.ts.tpl +6 -0
- package/templates/be/patterns/jobs/job.processor.ts.tpl +20 -0
- package/templates/be/patterns/jobs/job.queue.module.ts.tpl +20 -0
- package/templates/be/patterns/jobs/job.step.ts.tpl +19 -0
- package/templates/be/patterns/jobs/platform/fenced.processor.spec.ts.tpl +31 -0
- package/templates/be/patterns/jobs/platform/fenced.processor.ts.tpl +13 -0
- package/templates/be/patterns/jobs/platform/job-claim.service.spec.ts.tpl +150 -0
- package/templates/be/patterns/jobs/platform/job-claim.service.ts.tpl +100 -0
- package/templates/be/patterns/jobs/platform/job-runner.service.spec.ts.tpl +138 -0
- package/templates/be/patterns/jobs/platform/job-runner.service.ts.tpl +69 -0
- package/templates/be/patterns/jobs/platform/jobs.config.ts.tpl +11 -0
- package/templates/be/patterns/jobs/platform/jobs.contracts.ts.tpl +62 -0
- package/templates/be/patterns/jobs/platform/jobs.decorators.ts.tpl +31 -0
- package/templates/be/patterns/jobs/platform/jobs.error.ts.tpl +22 -0
- package/templates/be/patterns/jobs/platform/jobs.index.ts.tpl +11 -0
- package/templates/be/patterns/jobs/platform/jobs.log-events.ts.tpl +9 -0
- package/templates/be/patterns/jobs/platform/jobs.messages.ts.tpl +15 -0
- package/templates/be/patterns/jobs/platform/jobs.module-definition.ts.tpl +10 -0
- package/templates/be/patterns/jobs/platform/jobs.module.ts.tpl +32 -0
- package/templates/be/patterns/jobs/platform/jobs.options.ts.tpl +11 -0
- package/templates/be/patterns/jobs/platform/jobs.port.ts.tpl +36 -0
- package/templates/be/patterns/jobs/platform/persistence.connection.ts.tpl +8 -0
- package/templates/be/patterns/jobs/platform/persistence.job.entity.ts.tpl +53 -0
- package/templates/be/patterns/jobs/platform/persistence.jobs.rows.ts.tpl +13 -0
- package/templates/be/patterns/jobs/platform/persistence.jobs.sql.ts.tpl +33 -0
- package/templates/be/patterns/jobs/platform/persistence.migration.ts.tpl +29 -0
- package/templates/be/patterns/outbox/platform/index.ts.tpl +2 -0
- package/templates/be/patterns/outbox/platform/outbox-relay.policy.spec.ts.tpl +96 -0
- package/templates/be/patterns/outbox/platform/outbox-relay.policy.ts.tpl +78 -0
- package/templates/be/patterns/outbox/platform/outbox.log-events.ts.tpl +5 -0
- package/templates/be/patterns/projections/migration.ts.tpl +18 -0
- package/templates/be/patterns/projections/persistence.connection.ts.tpl +8 -0
- package/templates/be/patterns/projections/projection.entity.ts.tpl +9 -0
- package/templates/be/patterns/projections/projection.index.ts.tpl +3 -0
- package/templates/be/patterns/projections/projection.module-definition.ts.tpl +7 -0
- package/templates/be/patterns/projections/projection.module.ts.tpl +18 -0
- package/templates/be/patterns/projections/projection.options.ts.tpl +2 -0
- package/templates/be/patterns/projections/projection.projection.spec.ts.tpl +55 -0
- package/templates/be/patterns/projections/projection.projection.ts.tpl +21 -0
- package/templates/be/patterns/queues/platform/bullmq-queue-transport.client.spec.ts.tpl +142 -0
- package/templates/be/patterns/queues/platform/bullmq-queue-transport.client.ts.tpl +81 -0
- package/templates/be/patterns/queues/platform/persistence.connection.ts.tpl +8 -0
- package/templates/be/patterns/queues/platform/persistence.migration.ts.tpl +25 -0
- package/templates/be/patterns/queues/platform/persistence.queue-outbox.entity.ts.tpl +25 -0
- package/templates/be/patterns/queues/platform/persistence.queue.rows.ts.tpl +9 -0
- package/templates/be/patterns/queues/platform/persistence.queue.sql.ts.tpl +12 -0
- package/templates/be/patterns/queues/platform/queue-outbox.service.spec.ts.tpl +48 -0
- package/templates/be/patterns/queues/platform/queue-outbox.service.ts.tpl +17 -0
- package/templates/be/patterns/queues/platform/queue-relay.service.spec.ts.tpl +128 -0
- package/templates/be/patterns/queues/platform/queue-relay.service.ts.tpl +48 -0
- package/templates/be/patterns/queues/platform/queue-transport.port.ts.tpl +115 -0
- package/templates/be/patterns/queues/platform/queue-worker.service.spec.ts.tpl +91 -0
- package/templates/be/patterns/queues/platform/queue-worker.service.ts.tpl +45 -0
- package/templates/be/patterns/queues/platform/queue.config.ts.tpl +15 -0
- package/templates/be/patterns/queues/platform/queue.contracts.ts.tpl +31 -0
- package/templates/be/patterns/queues/platform/queue.decorators.ts.tpl +45 -0
- package/templates/be/patterns/queues/platform/queue.index.ts.tpl +7 -0
- package/templates/be/patterns/queues/platform/queue.log-events.ts.tpl +5 -0
- package/templates/be/patterns/queues/platform/queue.module-definition.ts.tpl +10 -0
- package/templates/be/patterns/queues/platform/queue.module.ts.tpl +62 -0
- package/templates/be/patterns/queues/platform/queue.options.ts.tpl +22 -0
- package/templates/be/patterns/queues/platform/queue.policy.spec.ts.tpl +19 -0
- package/templates/be/patterns/queues/platform/queue.policy.ts.tpl +11 -0
- package/templates/be/patterns/queues/platform/queue.port.ts.tpl +14 -0
- package/templates/be/patterns/queues/queue.index.ts.tpl +3 -0
- package/templates/be/patterns/queues/queue.module.ts.tpl +6 -0
- package/templates/be/patterns/queues/queue.queue.ts.tpl +23 -0
- package/templates/be/patterns/reactors/application.command.ts.tpl +10 -0
- package/templates/be/patterns/reactors/application.contracts.ts.tpl +12 -0
- package/templates/be/patterns/reactors/application.handler.ts.tpl +22 -0
- package/templates/be/patterns/reactors/consumer.ts.tpl +19 -0
- package/templates/be/patterns/reactors/message.module.ts.tpl +20 -0
- package/templates/be/patterns/reactors/reactor.index.ts.tpl +1 -0
- package/templates/be/patterns/reactors/reactor.module.ts.tpl +6 -0
- package/templates/be/patterns/realtime/channel.graphql.module.ts.tpl +6 -0
- package/templates/be/patterns/realtime/channel.index.ts.tpl +1 -0
- package/templates/be/patterns/realtime/channel.input.ts.tpl +12 -0
- package/templates/be/patterns/realtime/channel.subscription.spec.ts.tpl +51 -0
- package/templates/be/patterns/realtime/channel.subscription.ts.tpl +32 -0
- package/templates/be/patterns/realtime/channel.type.ts.tpl +9 -0
- package/templates/be/patterns/saga/saga.compensate.command.ts.tpl +11 -0
- package/templates/be/patterns/saga/saga.compensate.contracts.ts.tpl +7 -0
- package/templates/be/patterns/saga/saga.compensate.handler.ts.tpl +22 -0
- package/templates/be/patterns/saga/saga.compensation.ts.tpl +21 -0
- package/templates/be/patterns/saga/saga.complete.command.ts.tpl +11 -0
- package/templates/be/patterns/saga/saga.complete.contracts.ts.tpl +7 -0
- package/templates/be/patterns/saga/saga.complete.handler.ts.tpl +22 -0
- package/templates/be/patterns/saga/saga.done.consumer.ts.tpl +21 -0
- package/templates/be/patterns/saga/saga.failed.consumer.ts.tpl +21 -0
- package/templates/be/patterns/saga/saga.index.ts.tpl +1 -0
- package/templates/be/patterns/saga/saga.message.module.ts.tpl +23 -0
- package/templates/be/patterns/saga/saga.module.ts.tpl +20 -0
- package/templates/be/patterns/saga/saga.service.spec.ts.tpl +70 -0
- package/templates/be/patterns/saga/saga.service.ts.tpl +44 -0
- package/templates/be/patterns/saga/saga.state.ts.tpl +14 -0
- package/templates/be/patterns/saga/saga.step.ts.tpl +11 -0
- package/templates/be/patterns/saga/saga.undo.command.ts.tpl +10 -0
- package/templates/be/patterns/saga/saga.undo.contracts.ts.tpl +5 -0
- package/templates/be/patterns/saga/saga.undo.handler.ts.tpl +21 -0
- package/templates/be/patterns/webhooks/webhook.door.spec.ts.tpl +72 -0
- package/templates/be/patterns/webhooks/webhook.door.ts.tpl +36 -0
- package/templates/be/patterns/webhooks/webhook.http.module.ts.tpl +6 -0
- package/templates/be/patterns/webhooks/webhook.index.ts.tpl +1 -0
- package/templates/be/patterns/webhooks/webhook.request.ts.tpl +9 -0
- package/templates/be/skeleton/apps/__app__/src/__app__.options.ts +3 -0
- package/templates/be/skeleton/apps/__app__/src/app.module.ts +15 -2
- package/templates/be/skeleton/apps/__app__/src/main.ts +7 -15
- package/templates/be/skeleton/apps/cli/src/app.module.ts +30 -0
- package/templates/be/skeleton/apps/cli/src/cli.options.ts +22 -0
- package/templates/be/skeleton/apps/cli/src/main.ts +24 -0
- package/templates/be/skeleton/src/features/cli/cli.module.ts +7 -0
- package/templates/be/skeleton/src/features/cli/index.ts +1 -0
- package/templates/be/skeleton/src/features/cli/migrate/migrate.cli.spec.ts +17 -0
- package/templates/be/skeleton/src/features/cli/migrate/migrate.cli.ts +15 -0
- package/templates/be/skeleton/src/features/cli/migrate/migrate.module.ts +7 -0
- package/templates/be/skeleton/src/features/cli/migrate/subs/run.cli.spec.ts +17 -0
- package/templates/be/skeleton/src/features/cli/migrate/subs/run.cli.ts +18 -0
- package/templates/be/skeleton/src/features/cli/seed/seed.cli.spec.ts +17 -0
- package/templates/be/skeleton/src/features/cli/seed/seed.cli.ts +15 -0
- package/templates/be/skeleton/src/features/cli/seed/seed.module.ts +7 -0
- package/templates/be/skeleton/src/features/cli/seed/subs/run.cli.spec.ts +33 -0
- package/templates/be/skeleton/src/features/cli/seed/subs/run.cli.ts +34 -0
- package/templates/be/skeleton/src/modules/domain/identity/admission.policy.spec.ts +13 -0
- package/templates/be/skeleton/src/modules/domain/identity/auth.guard.spec.ts +40 -0
- package/templates/be/skeleton/src/modules/domain/identity/messages/identity.messages.ts +1 -1
- package/templates/be/skeleton/src/modules/domain/note/errors/note.error.ts +16 -0
- package/templates/be/skeleton/src/modules/domain/note/index.ts +3 -0
- package/templates/be/skeleton/src/modules/domain/note/note.contracts.ts +19 -0
- package/templates/be/skeleton/src/modules/domain/note/note.decorators.ts +9 -0
- package/templates/be/skeleton/src/modules/domain/note/note.module-definition.ts +7 -0
- package/templates/be/skeleton/src/modules/domain/note/note.module.ts +19 -0
- package/templates/be/skeleton/src/modules/domain/note/note.options.ts +2 -0
- package/templates/be/skeleton/src/modules/domain/note/note.service.spec.ts +76 -0
- package/templates/be/skeleton/src/modules/domain/note/note.service.ts +37 -0
- package/templates/be/skeleton/src/modules/domain/note/persistence/connection.ts +8 -0
- package/templates/be/skeleton/src/modules/domain/note/persistence/entities/note.entity.ts +17 -0
- package/templates/be/skeleton/src/modules/domain/note/persistence/migrations/1790000000000-init-note.ts +22 -0
- package/templates/be/skeleton/src/modules/domain/note/persistence/note.rows.ts +17 -0
- package/templates/be/skeleton/src/modules/domain/note/persistence/note.sql.ts +4 -0
- package/templates/be/skeleton/src/modules/platform/config/env-source.config.ts +20 -0
- package/templates/be/skeleton/src/modules/platform/config/index.ts +1 -1
- package/templates/be/skeleton/src/modules/platform/cqrs/cqrs.contracts.ts +18 -0
- package/templates/be/skeleton/src/modules/platform/database/connection-source.client.spec.ts +41 -0
- package/templates/be/skeleton/src/modules/platform/database/connection-source.client.ts +17 -0
- package/templates/be/skeleton/src/modules/platform/database/database.module-definition.ts +13 -0
- package/templates/be/skeleton/src/modules/platform/database/database.module.ts +77 -0
- package/templates/be/skeleton/src/modules/platform/database/database.options.ts +30 -0
- package/templates/be/skeleton/src/modules/platform/database/database.port.ts +65 -0
- package/templates/be/skeleton/src/modules/platform/database/database.sql.ts +47 -0
- package/templates/be/skeleton/src/modules/platform/database/errors/database.error.ts +16 -0
- package/templates/be/skeleton/src/modules/platform/database/index.ts +9 -0
- package/templates/be/skeleton/src/modules/platform/database/migrate-connections.client.ts +30 -0
- package/templates/be/skeleton/src/modules/platform/database/migration-runner.service.spec.ts +84 -0
- package/templates/be/skeleton/src/modules/platform/database/migration-runner.service.ts +23 -0
- package/templates/be/skeleton/src/modules/platform/database/primary.config.ts +9 -0
- package/templates/be/skeleton/src/modules/platform/database/primary.connection.ts +2 -0
- package/templates/be/skeleton/src/modules/platform/database/primary.decorators.ts +10 -0
- package/templates/be/skeleton/src/modules/platform/database/seed-connections.client.spec.ts +108 -0
- package/templates/be/skeleton/src/modules/platform/database/seed-connections.client.ts +75 -0
- package/templates/be/skeleton/src/modules/platform/database/seed-runner.service.spec.ts +88 -0
- package/templates/be/skeleton/src/modules/platform/database/seed-runner.service.ts +29 -0
- package/templates/be/skeleton/src/modules/platform/errors/errors.filter.spec.ts +48 -0
- package/templates/be/skeleton/src/modules/platform/errors/messages/errors.messages.ts +1 -1
- package/templates/be/skeleton/src/modules/platform/http-security/errors/http-security.error.ts +12 -0
- package/templates/be/skeleton/src/modules/platform/http-security/execution-request.mapper.spec.ts +16 -0
- package/templates/be/skeleton/src/modules/platform/http-security/http-security.config.ts +8 -1
- package/templates/be/skeleton/src/modules/platform/http-security/http-security.decorators.ts +8 -0
- package/templates/be/skeleton/src/modules/platform/http-security/http-security.module.ts +14 -1
- package/templates/be/skeleton/src/modules/platform/http-security/http-security.options.ts +12 -0
- package/templates/be/skeleton/src/modules/platform/http-security/messages/http-security.messages.ts +10 -2
- package/templates/be/skeleton/src/modules/platform/http-security/origin.guard.spec.ts +63 -0
- package/templates/be/skeleton/src/modules/platform/http-security/origin.guard.ts +2 -2
- package/templates/be/skeleton/src/modules/platform/http-security/rate-limit.guard.spec.ts +108 -0
- package/templates/be/skeleton/src/modules/platform/http-security/request-validation.service.spec.ts +39 -0
- package/templates/be/skeleton/src/modules/platform/http-security/request-validation.service.ts +25 -0
- package/templates/be/skeleton/src/modules/platform/http-security/webhook-signature.service.spec.ts +172 -0
- package/templates/be/skeleton/src/modules/platform/http-security/webhook-signature.service.ts +66 -0
- package/templates/be/skeleton/src/modules/platform/logging/logging.log-events.ts +3 -1
- package/templates/be/skeleton/src/modules/platform/primitives/outcome.mapper.spec.ts +52 -0
- package/templates/be/skeleton-lite/apps/api/Dockerfile +37 -0
- package/templates/be/skeleton-lite/apps/api/src/api.options.ts +16 -0
- package/templates/be/skeleton-lite/apps/api/src/app.module.ts +81 -0
- package/templates/be/skeleton-lite/apps/api/src/main.ts +34 -0
- package/templates/be/skeleton-lite/src/modules/domain/identity/admission.policy.ts +14 -0
- package/templates/be/skeleton-lite/src/modules/domain/identity/auth.guard.ts +50 -0
- package/templates/be/skeleton-lite/src/modules/domain/identity/identity.contracts.ts +26 -0
- package/templates/be/skeleton-lite/src/modules/domain/identity/identity.decorators.ts +19 -0
- package/templates/be/skeleton-lite/src/modules/domain/identity/identity.module.ts +26 -0
- package/templates/be/skeleton-lite/src/modules/domain/identity/identity.options.ts +7 -0
- package/templates/be/skeleton-lite/src/modules/domain/identity/index.ts +6 -0
- package/templates/be/skeleton-lite/src/modules/integrations/supabase/errors/supabase.error.ts +19 -0
- package/templates/be/skeleton-lite/src/modules/integrations/supabase/index.ts +10 -0
- package/templates/be/skeleton-lite/src/modules/integrations/supabase/supabase.client.ts +24 -0
- package/templates/be/skeleton-lite/src/modules/integrations/supabase/supabase.config.ts +8 -0
- package/templates/be/skeleton-lite/src/modules/integrations/supabase/supabase.decorators.ts +17 -0
- package/templates/be/skeleton-lite/src/modules/integrations/supabase/supabase.jwks.ts +32 -0
- package/templates/be/skeleton-lite/src/modules/integrations/supabase/supabase.options.ts +24 -0
- package/templates/be/skeleton-lite/src/modules/platform/cqrs/index.ts +4 -0
- package/templates/be/skeleton-lite/src/modules/platform/database/database.module.ts +54 -0
- package/templates/be/skeleton-lite/src/modules/platform/database/database.options.ts +23 -0
- package/templates/be/skeleton-lite/src/modules/platform/database/database.port.ts +10 -0
- package/templates/be/skeleton-lite/src/modules/platform/database/database.sql.ts +49 -0
- package/templates/be/skeleton-lite/src/modules/platform/database/index.ts +4 -0
- package/templates/be/skeleton-lite/src/modules/platform/database/migration-runner.service.ts +21 -0
- package/templates/be/skeleton-lite/src/modules/platform/database/primary.config.ts +11 -0
- package/templates/be/skeleton-lite/src/modules/platform/database/seed-runner.service.ts +28 -0
- package/templates/be/skeleton-lite/src/modules/platform/http-security/http-security.module.ts +25 -0
- package/templates/be/skeleton-lite/src/modules/platform/http-security/index.ts +9 -0
- package/templates/be/skeleton-lite/src/modules/platform/i18n/index.ts +4 -0
- package/templates/be/skeleton-lite/src/modules/platform/logging/index.ts +5 -0
- package/templates/be/table/error.ts.tpl +16 -0
- package/templates/be/table/index.ts.tpl +2 -0
- package/templates/be/table/migration.sql.tpl +51 -0
- package/templates/be/table/module-definition.ts.tpl +7 -0
- package/templates/be/table/module.ts.tpl +14 -0
- package/templates/be/table/options.ts.tpl +2 -0
- package/templates/be/table/rows.ts.tpl +4 -0
- package/templates/be/table/service.ts.tpl +23 -0
- package/templates/be/table/sql.ts.tpl +4 -0
- package/templates/be/tool-config/jest.config.js +3 -1
- package/templates/be/upgrade-full/apps/cli/src/app.module.ts +14 -0
- package/templates/be/upgrade-full/apps/cli/src/main.ts +26 -0
- package/templates/be/upgrade-full/src/features/cli/cli.module.ts +6 -0
- package/templates/be/upgrade-full/src/features/cli/migrate/subs/run.cli.ts +23 -0
- package/templates/common/gitignore.base +1 -2
- package/templates/fe/app/package.json.tpl +1 -0
- package/templates/fe/app/tsconfig.json +12 -0
- package/templates/fe/common/app-layout.tsx.partial +8 -0
- package/templates/fe/common/site-shell.tsx.partial +9 -0
- package/templates/fe/image/next/Dockerfile +42 -0
- package/templates/fe/skeleton/apps/app/next.config.ts +23 -0
- package/templates/fe/skeleton/apps/app/postcss.config.mjs +7 -0
- package/templates/fe/skeleton/apps/{__app__ → app}/src/app/[locale]/error.tsx +3 -3
- package/templates/fe/skeleton/apps/app/src/app/[locale]/layout.tsx +22 -0
- package/templates/fe/skeleton/apps/{__app__ → app}/src/app/[locale]/loading.tsx +2 -2
- package/templates/fe/skeleton/apps/{__app__ → app}/src/app/[locale]/not-found.tsx +2 -2
- package/templates/fe/skeleton/apps/app/src/app/[locale]/page.tsx +9 -0
- package/templates/fe/skeleton/apps/{__app__ → app}/src/app/global-error.tsx +2 -2
- package/templates/fe/skeleton/apps/app/src/app/globals.css +10 -0
- package/templates/fe/skeleton/apps/app/src/features/layouts/AppLayout/index.tsx +18 -0
- package/templates/fe/skeleton/apps/app/src/features/pages/AppErrorPage/component.tsx +19 -0
- package/templates/fe/skeleton/apps/app/src/features/pages/AppErrorPage/index.tsx +11 -0
- package/templates/fe/skeleton/apps/app/src/features/pages/AppGlobalErrorPage/index.tsx +16 -0
- package/templates/fe/skeleton/apps/app/src/features/pages/AppHomePage/component.tsx +10 -0
- package/templates/fe/skeleton/apps/app/src/features/pages/AppHomePage/index.tsx +15 -0
- package/templates/fe/skeleton/apps/app/src/features/pages/AppLoadingPage/index.tsx +8 -0
- package/templates/fe/skeleton/apps/app/src/features/pages/AppNotFoundPage/index.tsx +9 -0
- package/templates/fe/skeleton/apps/app/src/modules/i18n/index.ts +4 -0
- package/templates/fe/skeleton/apps/app/src/modules/i18n/messages/vi.json +28 -0
- package/templates/fe/skeleton/apps/app/src/modules/i18n/request.ts +4 -0
- package/templates/fe/skeleton/apps/app/src/modules/routes/index.ts +4 -0
- package/templates/fe/skeleton/apps/app/src/proxy.ts +1 -0
- package/templates/fe/skeleton/apps/landing/next.config.ts +21 -0
- package/templates/fe/skeleton/apps/landing/postcss.config.mjs +7 -0
- package/templates/fe/skeleton/apps/landing/src/app/[locale]/error.tsx +10 -0
- package/templates/fe/skeleton/apps/landing/src/app/[locale]/layout.tsx +22 -0
- package/templates/fe/skeleton/apps/landing/src/app/[locale]/loading.tsx +6 -0
- package/templates/fe/skeleton/apps/landing/src/app/[locale]/not-found.tsx +6 -0
- package/templates/fe/skeleton/apps/landing/src/app/[locale]/page.tsx +9 -0
- package/templates/fe/skeleton/apps/landing/src/app/global-error.tsx +10 -0
- package/templates/fe/skeleton/apps/landing/src/app/globals.css +10 -0
- package/templates/fe/skeleton/apps/landing/src/features/layouts/LandingLayout/index.tsx +24 -0
- package/templates/fe/skeleton/apps/landing/src/features/pages/LandingErrorPage/component.tsx +18 -0
- package/templates/fe/skeleton/apps/landing/src/features/pages/LandingErrorPage/index.tsx +11 -0
- package/templates/fe/skeleton/apps/landing/src/features/pages/LandingGlobalErrorPage/index.tsx +16 -0
- package/templates/fe/skeleton/apps/landing/src/features/pages/LandingLoadingPage/index.tsx +8 -0
- package/templates/fe/skeleton/apps/landing/src/features/pages/LandingNotFoundPage/index.tsx +9 -0
- package/templates/fe/skeleton/apps/landing/src/features/pages/LandingPage/component.tsx +24 -0
- package/templates/fe/skeleton/apps/landing/src/features/pages/LandingPage/index.tsx +16 -0
- package/templates/fe/skeleton/apps/landing/src/modules/config/index.ts +12 -0
- package/templates/fe/skeleton/apps/landing/src/modules/i18n/index.ts +7 -0
- package/templates/fe/skeleton/apps/landing/src/modules/i18n/messages/vi.json +31 -0
- package/templates/fe/skeleton/apps/landing/src/modules/i18n/request.ts +4 -0
- package/templates/fe/skeleton/apps/landing/src/modules/routes/index.ts +4 -0
- package/templates/fe/skeleton/apps/landing/src/proxy.ts +1 -0
- package/templates/fe/skeleton/packages/__project__-i18n/src/index.ts +49 -0
- package/templates/fe/skeleton/packages/__project__-i18n/src/proxy.ts +24 -0
- package/templates/fe/skeleton/packages/__project__-i18n/src/routing.ts +20 -0
- package/templates/fe/skeleton/packages/__project__-ui/src/branches/Providers/index.tsx +23 -0
- package/templates/fe/skeleton/packages/__project__-ui/src/composites/ErrorNotice/index.tsx +14 -0
- package/templates/fe/skeleton/packages/__project__-ui/src/composites/GlobalErrorNotice/index.tsx +25 -0
- package/templates/fe/skeleton/packages/__project__-ui/src/composites/LoadingNotice/index.tsx +9 -0
- package/templates/fe/skeleton/packages/__project__-ui/src/composites/LocaleShell/index.tsx +21 -0
- package/templates/fe/skeleton/packages/__project__-ui/src/composites/NotFoundNotice/index.tsx +19 -0
- package/templates/fe/skeleton/packages/__project__-ui/src/composites/SiteShell/classNames.ts +4 -0
- package/templates/fe/skeleton/packages/__project__-ui/src/composites/SiteShell/index.tsx +19 -0
- package/templates/fe/skeleton/packages/__project__-ui/src/index.ts +6 -0
- package/templates/fe/skeleton-lite/apps/web/next.config.ts +22 -0
- package/templates/fe/skeleton-lite/apps/web/src/app/[locale]/error.tsx +10 -0
- package/templates/fe/skeleton-lite/apps/web/src/app/[locale]/layout.tsx +37 -0
- package/templates/fe/skeleton-lite/apps/web/src/app/[locale]/loading.tsx +6 -0
- package/templates/fe/skeleton-lite/apps/web/src/app/[locale]/not-found.tsx +6 -0
- package/templates/fe/skeleton-lite/apps/web/src/app/[locale]/page.tsx +9 -0
- package/templates/fe/skeleton-lite/apps/web/src/app/[locale]/providers.tsx +26 -0
- package/templates/fe/skeleton-lite/apps/web/src/app/auth/callback/route.ts +24 -0
- package/templates/fe/skeleton-lite/apps/web/src/app/global-error.tsx +10 -0
- package/templates/fe/{skeleton/apps/__app__ → skeleton-lite/apps/web}/src/app/globals.css +1 -1
- package/templates/fe/skeleton-lite/apps/web/src/app/health/live/route.ts +5 -0
- package/templates/fe/skeleton-lite/apps/web/src/components/blocks/SignInForm/component.tsx +29 -0
- package/templates/fe/skeleton-lite/apps/web/src/components/blocks/SignInForm/index.tsx +41 -0
- package/templates/fe/skeleton-lite/apps/web/src/components/blocks/SignOutButton/component.tsx +17 -0
- package/templates/fe/skeleton-lite/apps/web/src/components/blocks/SignOutButton/index.tsx +38 -0
- package/templates/fe/skeleton-lite/apps/web/src/components/composites/ErrorNotice/index.tsx +13 -0
- package/templates/fe/skeleton-lite/apps/web/src/components/composites/GlobalErrorNotice/index.tsx +24 -0
- package/templates/fe/skeleton-lite/apps/web/src/components/composites/LoadingNotice/index.tsx +7 -0
- package/templates/fe/skeleton-lite/apps/web/src/components/composites/NotFoundNotice/index.tsx +18 -0
- package/templates/fe/skeleton-lite/apps/web/src/components/composites/SiteShell/classNames.ts +4 -0
- package/templates/fe/skeleton-lite/apps/web/src/components/composites/SiteShell/index.tsx +13 -0
- package/templates/fe/skeleton-lite/apps/web/src/features/layouts/AppLayout/index.tsx +31 -0
- package/templates/fe/skeleton-lite/apps/web/src/features/pages/AppErrorPage/component.tsx +12 -0
- package/templates/fe/skeleton-lite/apps/web/src/features/pages/AppErrorPage/index.tsx +10 -0
- package/templates/fe/skeleton-lite/apps/web/src/features/pages/AppGlobalErrorPage/index.tsx +15 -0
- package/templates/fe/skeleton-lite/apps/web/src/features/pages/AppHomePage/component.tsx +14 -0
- package/templates/fe/skeleton-lite/apps/web/src/features/pages/AppHomePage/index.tsx +30 -0
- package/templates/fe/skeleton-lite/apps/web/src/features/pages/AppLoadingPage/index.tsx +8 -0
- package/templates/fe/skeleton-lite/apps/web/src/features/pages/AppNotFoundPage/index.tsx +9 -0
- package/templates/fe/skeleton-lite/apps/web/src/modules/brand/brand.css +20 -0
- package/templates/fe/skeleton-lite/apps/web/src/modules/brand/index.ts +2 -0
- package/templates/fe/skeleton-lite/apps/web/src/modules/config/index.ts +20 -0
- package/templates/fe/skeleton-lite/apps/web/src/modules/db/auth/read-session.ts +25 -0
- package/templates/fe/skeleton-lite/apps/web/src/modules/db/auth/write-sign-in.ts +25 -0
- package/templates/fe/skeleton-lite/apps/web/src/modules/db/auth/write-sign-out.ts +17 -0
- package/templates/fe/skeleton-lite/apps/web/src/modules/db/browser.ts +14 -0
- package/templates/fe/skeleton-lite/apps/web/src/modules/db/index.ts +3 -0
- package/templates/fe/skeleton-lite/apps/web/src/modules/db/outcome.ts +59 -0
- package/templates/fe/skeleton-lite/apps/web/src/modules/db/principal.ts +29 -0
- package/templates/fe/skeleton-lite/apps/web/src/modules/db/server.ts +70 -0
- package/templates/fe/skeleton-lite/apps/web/src/modules/db/validation/validation.mapper.ts +50 -0
- package/templates/fe/skeleton-lite/apps/web/src/modules/i18n/index.ts +8 -0
- package/templates/fe/skeleton-lite/apps/web/src/modules/i18n/messages/vi.json +48 -0
- package/templates/fe/{skeleton/apps/__app__ → skeleton-lite/apps/web}/src/modules/i18n/request.ts +4 -2
- package/templates/fe/skeleton-lite/apps/web/src/modules/i18n/routing.ts +14 -0
- package/templates/fe/skeleton-lite/apps/web/src/modules/routes/index.ts +7 -0
- package/templates/fe/skeleton-lite/apps/web/src/modules/routes/safe-next-path.ts +26 -0
- package/templates/fe/skeleton-lite/apps/web/src/proxy.ts +43 -0
- package/templates/fe/table/read.ts.tpl +16 -0
- package/templates/fe/table/write.ts.tpl +16 -0
- package/upgrade/check.mjs +137 -0
- package/upgrade/index.mjs +524 -0
- package/bin/hfs.mjs +0 -233
- package/runtime/engine/admission.mjs +0 -284
- package/runtime/engine/digest.mjs +0 -10
- package/runtime/engine/ledger-db.mjs +0 -1245
- package/runtime/engine/machine-db.mjs +0 -1565
- package/runtime/engine/migrations/machine/0001-init.sql +0 -887
- package/runtime/engine/migrations/machine/0002-worktrees-no-workflow-kind.sql +0 -13
- package/runtime/engine/migrations/machine/0003-worktrees-workflow-orca.sql +0 -21
- package/runtime/engine/migrations/runtime/0001-init.sql +0 -1072
- package/runtime/engine/migrations/runtime/0003-usage-unavailable.sql +0 -13
- package/runtime/engine/migrations/runtime/0004-attempt-why.sql +0 -43
- package/runtime/engine/migrations/runtime/0005-ended-workflow-views.sql +0 -93
- package/runtime/scripts/api/fs/rmdir-link.mjs +0 -12
- package/runtime/scripts/lib/artifact-hold.mjs +0 -89
- package/runtime/scripts/lib/artifact-store.mjs +0 -103
- package/runtime/scripts/lib/redact.mjs +0 -148
- package/runtime/scripts/lib/safe-remove.mjs +0 -275
- package/runtime/scripts/lib/test-secrets.mjs +0 -116
- package/templates/fe/skeleton/apps/__app__/next.config.ts +0 -11
- package/templates/fe/skeleton/apps/__app__/src/app/[locale]/layout.tsx +0 -20
- package/templates/fe/skeleton/apps/__app__/src/app/[locale]/page.tsx +0 -9
- package/templates/fe/skeleton/apps/__app__/src/components/composites/FailureScreen/index.tsx +0 -28
- package/templates/fe/skeleton/apps/__app__/src/features/layouts/LocaleShell/index.tsx +0 -35
- package/templates/fe/skeleton/apps/__app__/src/features/pages/ErrorPage/component.tsx +0 -21
- package/templates/fe/skeleton/apps/__app__/src/features/pages/ErrorPage/index.tsx +0 -17
- package/templates/fe/skeleton/apps/__app__/src/features/pages/GlobalErrorPage/component.tsx +0 -26
- package/templates/fe/skeleton/apps/__app__/src/features/pages/GlobalErrorPage/index.tsx +0 -15
- package/templates/fe/skeleton/apps/__app__/src/features/pages/HomePage/component.tsx +0 -25
- package/templates/fe/skeleton/apps/__app__/src/features/pages/HomePage/index.tsx +0 -15
- package/templates/fe/skeleton/apps/__app__/src/features/pages/LoadingPage/component.tsx +0 -27
- package/templates/fe/skeleton/apps/__app__/src/features/pages/LoadingPage/index.tsx +0 -8
- package/templates/fe/skeleton/apps/__app__/src/features/pages/NotFoundPage/component.tsx +0 -32
- package/templates/fe/skeleton/apps/__app__/src/features/pages/NotFoundPage/index.tsx +0 -8
- package/templates/fe/skeleton/apps/__app__/src/modules/i18n/config.ts +0 -8
- package/templates/fe/skeleton/apps/__app__/src/modules/i18n/index.ts +0 -2
- package/templates/fe/skeleton/apps/__app__/src/modules/i18n/messages/vi.json +0 -25
- package/templates/fe/skeleton/apps/__app__/src/modules/i18n/routing.ts +0 -9
- package/templates/fe/skeleton/apps/__app__/src/modules/routes/index.ts +0 -4
- package/templates/fe/skeleton/apps/__app__/src/proxy.ts +0 -10
- /package/runtime/scripts/{checks → hfs}/architecture/config-unread.mjs +0 -0
- /package/runtime/scripts/{checks → hfs}/architecture/constructor-deps.mjs +0 -0
- /package/runtime/scripts/{checks → hfs}/architecture/cross-app-duplicate.mjs +0 -0
- /package/runtime/scripts/{checks → hfs}/architecture/default-deny.mjs +0 -0
- /package/runtime/scripts/{checks → hfs}/architecture/error-codes.mjs +0 -0
- /package/runtime/scripts/{checks → hfs}/architecture/error-masked.mjs +0 -0
- /package/runtime/scripts/{checks → hfs}/architecture/hooks-are-hooks.mjs +0 -0
- /package/runtime/scripts/{checks → hfs}/architecture/injection-token-exported.mjs +0 -0
- /package/runtime/scripts/{checks → hfs}/architecture/package-shape.mjs +0 -0
- /package/runtime/scripts/{checks → hfs}/architecture/reachability.mjs +0 -0
- /package/runtime/scripts/{checks → hfs}/architecture/route-files-thin.mjs +0 -0
- /package/runtime/scripts/{checks → hfs}/architecture/sql-tokens.mjs +0 -0
- /package/runtime/scripts/{checks → hfs}/architecture/symbols.mjs +0 -0
- /package/runtime/scripts/{checks → hfs}/architecture/unit-spec-providers.mjs +0 -0
- /package/templates/be/skeleton/src/features/{system-health → api/system-health}/application/check-liveness.contracts.ts +0 -0
- /package/templates/be/skeleton/src/features/{system-health → api/system-health}/application/check-liveness.handler.ts +0 -0
- /package/templates/be/skeleton/src/features/{system-health → api/system-health}/application/check-liveness.query.ts +0 -0
- /package/templates/be/skeleton/src/features/{system-health → api/system-health}/index.ts +0 -0
- /package/templates/be/skeleton/src/features/{system-health → api/system-health}/system-health.module.ts +0 -0
- /package/templates/be/skeleton/src/features/{system-health → api/system-health}/transport/http/live.controller.ts +0 -0
- /package/templates/be/skeleton/src/features/{system-health → api/system-health}/transport/http/system-health-http.module.ts +0 -0
- /package/templates/fe/skeleton/apps/{__app__ → app}/src/app/health/live/route.ts +0 -0
- /package/templates/fe/skeleton/apps/{__app__ → app}/src/modules/config/index.ts +0 -0
- /package/templates/fe/{skeleton/apps/__app__ → skeleton-lite/apps/web}/postcss.config.mjs +0 -0
|
@@ -0,0 +1,701 @@
|
|
|
1
|
+
schema: starci/runtimes@1
|
|
2
|
+
purpose: |-
|
|
3
|
+
Every runtime is a provider-window pool with real parallel slots and a cooldown: the pool boundary IS the
|
|
4
|
+
quota-window boundary, so one pool never spans two independently metered windows and one window never splits
|
|
5
|
+
into two pools. The workflow-bound profile applies adaptive capacity from config.yaml: role, tier, tools,
|
|
6
|
+
qualification, independent review, fresh provider quota, shared admitted load and recent observed service
|
|
7
|
+
filter and score provider families before one runtime is handed to the typed launcher. The preference/tier
|
|
8
|
+
lists below are within-family suitability and a compatibility policy for direct low-level consumers; they are
|
|
9
|
+
not a provider fallback chain in a workflow. A runtime that fails is classified and parked for the cooldown of
|
|
10
|
+
that failure kind, doubling per repeat. Auth health is provider-wide rather than pool-wide: a confirmed
|
|
11
|
+
launch, worker-start or attestation auth rejection parks every runtime sharing that provider credential. A
|
|
12
|
+
stale-token preflight may make one real refresh attempt; a typed no-effect rejection falls through on the
|
|
13
|
+
same logical operation attempt, while partial or unknown effects require reconciliation before fallback.
|
|
14
|
+
|
|
15
|
+
Models are pinned inside the pool per DIFFICULTY (`models`) and attested at launch - never inferred from the
|
|
16
|
+
pool name. The pools themselves — membership, `provider`, `roles`, `maxParallel`, per-difficulty `models`
|
|
17
|
+
and `effort` pins, `defaultModel` — live in modules/models/registry.yaml `pools`, the ONE model catalog;
|
|
18
|
+
this file keeps only the operational allocation policy and runtime tuning that is not model data.
|
|
19
|
+
# `maxParallelOps` is the worker-wide ceiling across every workflow; `budgets.maxOps` in the owner's
|
|
20
|
+
# config.yaml is the per-workflow one. The lower of the two admits: engine/admission.mjs
|
|
21
|
+
# opSlotCeiling takes min(budgets.maxOps, maxParallelOps) and scripts/kernel/cli.mjs refuses
|
|
22
|
+
# route/dispatch with `max-ops` at it.
|
|
23
|
+
maxParallelOps: 20
|
|
24
|
+
allocation:
|
|
25
|
+
# Common new-admission thresholds, consumed by the pure selector and runtime reservation adapter.
|
|
26
|
+
admission:
|
|
27
|
+
schema: starci/agent-admission-policy@1
|
|
28
|
+
version: 1
|
|
29
|
+
reservePercent: 90
|
|
30
|
+
exhaustedPercent: 100
|
|
31
|
+
maxAgeMs: 300000
|
|
32
|
+
qualityOrder: [economy, standard, frontier]
|
|
33
|
+
ownerBiasRoles: [op]
|
|
34
|
+
eligibilityModes: [qualified, probation, kernel-function, scoped-control-plane, operation-policy]
|
|
35
|
+
roles:
|
|
36
|
+
kernel: {qualityFloor: standard}
|
|
37
|
+
op:
|
|
38
|
+
qualityFloor: economy
|
|
39
|
+
difficultyFloors: {easy: economy, medium: economy, hard: frontier, insane: frontier}
|
|
40
|
+
supervisor: {qualityFloor: standard}
|
|
41
|
+
worker: {qualityFloor: standard}
|
|
42
|
+
critic: {qualityFloor: standard, independence: provider}
|
|
43
|
+
# The default policy. config.yaml allocation.policy overrides it for `starci kernel route` (engine/config.mjs
|
|
44
|
+
# configuredAllocationPolicy): prefer-then-overflow takes the first eligible pool of the tier order below;
|
|
45
|
+
# balanced walks the eligible pools of that order and takes the FIRST one still below its config.yaml
|
|
46
|
+
# allocation.shares target of the recent dispatches (scripts/agent/balance.mjs counts them; scripts/agent/
|
|
47
|
+
# models.mjs selectPool picks), so the evidence order ranks and the share caps; when every eligible pool
|
|
48
|
+
# is at or above its share, the one furthest below (least over) takes it and the order breaks ties. Under
|
|
49
|
+
# both, every gate (role, difficulty pin, owner grant, host tools, quota/auth, circuit, maxParallel)
|
|
50
|
+
# applies first.
|
|
51
|
+
policy: prefer-then-overflow
|
|
52
|
+
# Under balanced, a pool listed here for a work class and tier is taken only when no other pool of the
|
|
53
|
+
# order is eligible: Opus stays hands-on overflow below insane, so its share is spent on think work; at
|
|
54
|
+
# insane, where only Opus and Sol pin a model, the two balance.
|
|
55
|
+
balanced:
|
|
56
|
+
overflowOnly:
|
|
57
|
+
hands-on:
|
|
58
|
+
easy: [claude-agent]
|
|
59
|
+
medium: [claude-agent]
|
|
60
|
+
hard: [claude-agent]
|
|
61
|
+
# Owner decision 2026-09-25 (review-hands, amending routing-by-evidence): a pool an order lists here is taken
|
|
62
|
+
# only when no other pool of that order is eligible, under EITHER policy - neither the balanced share nor the
|
|
63
|
+
# owner's goal routing_bias prefer moves it ahead. Opus and Sol are the review order's overflow: they take a review only when
|
|
64
|
+
# Devin is unavailable (circuit open, quota dead, full, or excluded by the cross-family rule).
|
|
65
|
+
overflowByOrder:
|
|
66
|
+
review: [claude-agent, codex-agent]
|
|
67
|
+
# Cross-family audit: a verify kind whose records overlap the output of the latest settled non-verify op of
|
|
68
|
+
# the workflow (scripts/kernel/cli.mjs cmdRoute finds that author with scripts/agent/balance.mjs
|
|
69
|
+
# auditAuthorOf) routes to an eligible pool of another audit family - the reviewer's provider differs from
|
|
70
|
+
# the implementer's. The audit families are the pools of `frontier` and `hands`: Opus or Sol review what
|
|
71
|
+
# Devin implemented; Sol reviews Opus's records and Opus reviews Sol's. The author's
|
|
72
|
+
# own family is taken only when no pool of another family is eligible (crossFamily.applied false).
|
|
73
|
+
# thinkAuditCrossFamily keeps its name from when only think verdicts were audited.
|
|
74
|
+
thinkAuditCrossFamily: true
|
|
75
|
+
# The frontier think group: Claude Opus 5.5 and GPT-6.1 Sol. It is what the kernel's own model calls route
|
|
76
|
+
# over (scripts/route/route-model.mjs decisionFlow kernel-function) and two families of the cross-family
|
|
77
|
+
# audit above.
|
|
78
|
+
frontier: [claude-agent, codex-agent]
|
|
79
|
+
# The hands group: Devin (SWE-2 Max). It implements and, since the owner decision of 2026-09-25
|
|
80
|
+
# (review-hands), reviews - the third audit family.
|
|
81
|
+
hands: [devin-agent]
|
|
82
|
+
# Owner decision 2026-09-25 ("ok"): route by the 72h evidence of scripts/agent/model-scorecard.mjs (1389 op jobs over the product ledgers of that window).
|
|
83
|
+
# Those historical Sol scores describe the pre-migration model; they are not GPT-6.1 Sol qualification evidence.
|
|
84
|
+
# Each kind walks ONE order, named by its roleOfKind `order` (default: `think` for think work, else its role),
|
|
85
|
+
# at its difficulty tier:
|
|
86
|
+
# implement, write, verify (hands-on implementation: backend.implement, interface.implement, code.refactor,
|
|
87
|
+
# test.author, the hands-on verify kinds, release/scope finish): Devin first, then Codex and Claude -
|
|
88
|
+
# Devin passed 70% of backend.implement and 68% of interface.implement over the 72h scorecard.
|
|
89
|
+
# scaffold (scaffold, docs, content, grammar.update - small work - and every cut slice of a fan-out, which
|
|
90
|
+
# scripts/kernel/cli.mjs cmdRoute routes on this order): Devin first - backend.scaffold passed 73% on Devin,
|
|
91
|
+
# 43% on Codex over the 72h scorecard.
|
|
92
|
+
# think, decide, plan (every think kind: decide, review and author ops): Claude Opus first, GPT-6.1 Sol second
|
|
93
|
+
# and nothing else - Opus passed 72-73% of business/architecture.decide, Sol 60-64%. Think kinds route at a hard floor, where codex-agent pins Sol; the
|
|
94
|
+
# easy and medium keys (Claude only, never Luna) exist for direct role consumers that bring no kind.
|
|
95
|
+
# draw (interface.draw; owner ruling 2026-09-27 draw-devin-brand-claude, modules/kernel/owner-rulings.yaml):
|
|
96
|
+
# Devin draws first (SWE-2 Max; token-render HTML + Playwright in the product checkout - its card carries
|
|
97
|
+
# browser-dom), Codex (GPT-6.1 Sol at effort high) is the fallback. The raster regions a drawing needs are
|
|
98
|
+
# artworkSlots for interface.asset, never painted by the drawer. Devin pins no easy or insane model, so the easy
|
|
99
|
+
# and insane keys are Codex alone. The draw loop's independent critic stays a DIFFERENT model from the drawer
|
|
100
|
+
# (allocation.drawLoop.critic, criticWhenDrawer).
|
|
101
|
+
# asset (interface.asset): Codex only - the one agent with the image tool (image_gen.imagegen).
|
|
102
|
+
# brand (brand.decide; owner ruling 2026-09-27 draw-devin-brand-claude): Claude Opus decides the brand and its
|
|
103
|
+
# direction, GPT-6.1 Sol is the fallback when the Claude pool cannot serve; Codex is also the cross-family second
|
|
104
|
+
# opinion on think work.
|
|
105
|
+
# review (owner decision 2026-09-25 review-hands, amending the think order above: "codex/claude only
|
|
106
|
+
# decide (that is, set the strategy), review must be done by the hands"): every verify kind -
|
|
107
|
+
# review.verify, handover.review, security.verify, goal.validate, uat.assisted.verify, interface.audit and
|
|
108
|
+
# the hands-on e2e/integration/perf/uat verify kinds - and work.author walk the review order: Devin,
|
|
109
|
+
# then Opus and Sol as overflow only (overflowByOrder.review). The cross-family rule sends a review of
|
|
110
|
+
# what Devin implemented to Opus or Sol. An experiment, measured in
|
|
111
|
+
# benchmark/findings/2026-09-25-review-hands.md.
|
|
112
|
+
# Claude and Codex keep strategy: request.analyze, scope.define, business/architecture/goal decide and
|
|
113
|
+
# revise, decision.prepare and implementation.plan (the cut) stay on think/decide/plan (Opus, Sol); brand.decide
|
|
114
|
+
# walks its own brand order (Opus, then Sol).
|
|
115
|
+
# interface.audit needs the browser-dom host tool: Devin and Codex carry it, Claude does not, so the
|
|
116
|
+
# host-tool gate passes Claude over (Devin audited it at 11% pass, 83% fail over the 72h scorecard -
|
|
117
|
+
# the experiment re-measures it).
|
|
118
|
+
# Devin (SWE-2-max) pins no easy or insane model, so easy hands-on work starts at Codex (Luna) and insane
|
|
119
|
+
# hands-on work at the frontier pools; Opus stays hands-on overflow below insane.
|
|
120
|
+
# Owner routing 2026-09-26: Opus brainstorms and decides (think/decide/plan orders); Sol draws, audits the UI
|
|
121
|
+
# and verifies e2e/security/assisted UAT (order ui: Devin as fallback when the Codex quota circuit
|
|
122
|
+
# opens); Devin implements, run the kernel and do the mechanical ops (provision.ask, workspace.manage,
|
|
123
|
+
# task.execute, knowledge.repair walk implement); the kernel's own model calls walk sol-think (Sol, Opus overflow).
|
|
124
|
+
tiers:
|
|
125
|
+
hard:
|
|
126
|
+
default: [devin-agent, codex-agent, claude-agent]
|
|
127
|
+
implement: [devin-agent, codex-agent, claude-agent]
|
|
128
|
+
write: [devin-agent, codex-agent, claude-agent]
|
|
129
|
+
verify: [devin-agent, codex-agent, claude-agent]
|
|
130
|
+
scaffold: [devin-agent, codex-agent, claude-agent]
|
|
131
|
+
think: [claude-agent, codex-agent]
|
|
132
|
+
decide: [claude-agent, codex-agent]
|
|
133
|
+
plan: [claude-agent, codex-agent]
|
|
134
|
+
draw: [devin-agent, codex-agent]
|
|
135
|
+
asset: [codex-agent]
|
|
136
|
+
brand: [claude-agent, codex-agent]
|
|
137
|
+
review: [devin-agent, claude-agent, codex-agent]
|
|
138
|
+
ui: [codex-agent, devin-agent]
|
|
139
|
+
sol-think: [codex-agent, claude-agent]
|
|
140
|
+
medium:
|
|
141
|
+
default: [devin-agent, codex-agent, claude-agent]
|
|
142
|
+
implement: [devin-agent, codex-agent, claude-agent]
|
|
143
|
+
write: [devin-agent, codex-agent, claude-agent]
|
|
144
|
+
verify: [devin-agent, codex-agent, claude-agent]
|
|
145
|
+
scaffold: [devin-agent, codex-agent, claude-agent]
|
|
146
|
+
think: [claude-agent]
|
|
147
|
+
decide: [claude-agent]
|
|
148
|
+
plan: [claude-agent]
|
|
149
|
+
draw: [devin-agent, codex-agent]
|
|
150
|
+
asset: [codex-agent]
|
|
151
|
+
brand: [claude-agent, codex-agent]
|
|
152
|
+
review: [devin-agent, claude-agent, codex-agent]
|
|
153
|
+
ui: [codex-agent, devin-agent]
|
|
154
|
+
sol-think: [codex-agent, claude-agent]
|
|
155
|
+
easy:
|
|
156
|
+
default: [codex-agent, claude-agent]
|
|
157
|
+
implement: [codex-agent, claude-agent]
|
|
158
|
+
write: [codex-agent, claude-agent]
|
|
159
|
+
verify: [codex-agent, claude-agent]
|
|
160
|
+
scaffold: [codex-agent, claude-agent]
|
|
161
|
+
think: [claude-agent]
|
|
162
|
+
decide: [claude-agent]
|
|
163
|
+
plan: [claude-agent]
|
|
164
|
+
draw: [codex-agent]
|
|
165
|
+
asset: [codex-agent]
|
|
166
|
+
brand: [claude-agent, codex-agent]
|
|
167
|
+
review: [claude-agent, codex-agent]
|
|
168
|
+
ui: [codex-agent]
|
|
169
|
+
sol-think: [codex-agent, claude-agent]
|
|
170
|
+
# Insane tops the ladder: only pools that declare an insane model can serve it. Devin carries no insane
|
|
171
|
+
# pin and is ineligible here by the models gate, so it is absent rather than listed-and-rejected (an insane
|
|
172
|
+
# review is Opus's, with Sol as overflow).
|
|
173
|
+
insane:
|
|
174
|
+
default: [claude-agent, codex-agent]
|
|
175
|
+
implement: [claude-agent, codex-agent]
|
|
176
|
+
write: [claude-agent, codex-agent]
|
|
177
|
+
verify: [claude-agent, codex-agent]
|
|
178
|
+
scaffold: [claude-agent, codex-agent]
|
|
179
|
+
think: [claude-agent, codex-agent]
|
|
180
|
+
decide: [claude-agent, codex-agent]
|
|
181
|
+
plan: [claude-agent, codex-agent]
|
|
182
|
+
draw: [codex-agent]
|
|
183
|
+
asset: [codex-agent]
|
|
184
|
+
brand: [claude-agent, codex-agent]
|
|
185
|
+
review: [claude-agent, codex-agent]
|
|
186
|
+
ui: [codex-agent]
|
|
187
|
+
sol-think: [codex-agent, claude-agent]
|
|
188
|
+
# config.yaml allocation.preferredProvider is a bias within the tier's eligible pools and never moves think
|
|
189
|
+
# work to a pool outside `think` (scripts/route/route-model.mjs).
|
|
190
|
+
preference:
|
|
191
|
+
implement: [devin-agent, codex-agent, claude-agent]
|
|
192
|
+
verify: [devin-agent, codex-agent, claude-agent]
|
|
193
|
+
write: [devin-agent, codex-agent, claude-agent]
|
|
194
|
+
scaffold: [devin-agent, codex-agent, claude-agent]
|
|
195
|
+
think: [claude-agent, codex-agent]
|
|
196
|
+
decide: [claude-agent, codex-agent]
|
|
197
|
+
plan: [claude-agent, codex-agent]
|
|
198
|
+
draw: [devin-agent, codex-agent]
|
|
199
|
+
asset: [codex-agent]
|
|
200
|
+
brand: [claude-agent, codex-agent]
|
|
201
|
+
review: [devin-agent, claude-agent, codex-agent]
|
|
202
|
+
ui: [codex-agent, devin-agent]
|
|
203
|
+
sol-think: [codex-agent, claude-agent]
|
|
204
|
+
# Heavy work fans out: a big node is cut into children with disjoint write scopes, the seam every other child
|
|
205
|
+
# would touch is built first and alone, then the rest run at once - bounded here so one parent never takes
|
|
206
|
+
# every slot of the pool and leaves the rest of the tree waiting behind it.
|
|
207
|
+
fanOut: {seamFirst: true, maxPerGroup: 10}
|
|
208
|
+
# Deterministic same-op slicing — the kernel measures the write scope and calls `starci kernel estimate`;
|
|
209
|
+
# it never guesses an agent count. W = sum(weight * count) in agent-minutes places the closure in
|
|
210
|
+
# a `size` class, and the class plus the owner's `parallel.gear` (config.yaml) names how many
|
|
211
|
+
# agents the op asks for. `s` and `m` are always one agent; only `l` and `xl` fan out. The static
|
|
212
|
+
# bounds in kinds.yaml (12 files / 8 assertions / 3 components) are a coarse screen over the same
|
|
213
|
+
# measure — the estimate is the authority. When N > 1 slices are admitted together the kernel
|
|
214
|
+
# routes them one after the other with plain starci kernel route (a Kernel --prefer/--avoid is ignored, owner
|
|
215
|
+
# decision 2026-09-25) so the workers spread over the lanes instead of piling onto the first pool. A
|
|
216
|
+
# hands-on slice (payload.cut) walks the scaffold order, Devin first (owner decision 2026-09-25): each
|
|
217
|
+
# routed slice is already counted before the next one is routed, and a pool that reaches its share
|
|
218
|
+
# passes the next slice down the order.
|
|
219
|
+
# A gear never raises a pool's maxParallel, maxParallelOps or budgets.maxOps: it raises only what
|
|
220
|
+
# `starci kernel estimate` requests, and admission still clamps it.
|
|
221
|
+
slicing:
|
|
222
|
+
weights: {file: 4, assertion: 3, component: 12, record: 2}
|
|
223
|
+
targetMinutes: [15, 30]
|
|
224
|
+
maxSlices: 15
|
|
225
|
+
gears: [1, 2]
|
|
226
|
+
# Size classes over the same measure. A closure is `xl` when any of its counts reaches an `xl`
|
|
227
|
+
# bound, `l` when any reaches an `l` bound, `s` when W is inside targetMinutes[0], else `m`.
|
|
228
|
+
# `l.from.files: 12` is ledger-derived: of 52 settled implement/refactor/author jobs in the
|
|
229
|
+
# measured product ledger, closures at or above 12 authored files ran a median 46 min against 12 min below
|
|
230
|
+
# it, the first cutoff where the majority exceeds one targetMinutes[1] window
|
|
231
|
+
# (benchmark/findings/2026-09-23-parallel-gear.md). Every other `from` bound is the
|
|
232
|
+
# benchmark/findings/fable.md sketch value carried as an ASSUMPTION: that ledger holds exactly one job over three
|
|
233
|
+
# windows and no assertion or component measurement at all, so `xl.from` and both `assertions`
|
|
234
|
+
# bounds have no observation behind them and are re-derived when estimate inputs are recorded.
|
|
235
|
+
size:
|
|
236
|
+
l: {from: {files: 12, assertions: 40}, agents: {1: 3, 2: 5}}
|
|
237
|
+
xl: {from: {files: 40, assertions: 150}, agents: {1: 6, 2: 10}}
|
|
238
|
+
# The workers' operating windows, in milliseconds. engine/config.mjs allocationMs() is how code reads
|
|
239
|
+
# them and kernel contracts cite the key rather than restating the number, so each one is changed here
|
|
240
|
+
# and nowhere else.
|
|
241
|
+
dispatchLeaseTtlMs: 1800000
|
|
242
|
+
watchdogCadenceMs: 300000
|
|
243
|
+
observeCadenceMs: 180000
|
|
244
|
+
# activeStaleMs: an `active` screen (spinner/"Working" row) is trusted only while the terminal still
|
|
245
|
+
# prints; a spinner re-renders every second, so output older than this is a frozen frame. The watchdog
|
|
246
|
+
# then treats the Kernel as turn-idle (reason stale-active) and wakes it, and a worker reads turn-idle
|
|
247
|
+
# for the nudge frontier (scripts/lib/terminal-liveness.mjs staleAwareState).
|
|
248
|
+
# quietMs: a worker still at its idle prompt (or frozen) this long after a delivered nudge, with no
|
|
249
|
+
# output since, is quiet - dead to the frontier; the watchdog settles it failed-no-report and queues
|
|
250
|
+
# its retry (starci kernel reconcile --dead-worker --settle-failed). A provider card's liveness.activeStaleMs /
|
|
251
|
+
# liveness.quietMs overrides these per provider (modules/models/agents/<provider>.yaml).
|
|
252
|
+
# launchGraceMs: a managed worker-start returns before Orca injects the worker's Task, so for this
|
|
253
|
+
# long after its op-dispatched event a managed worker that still reads an idle prompt is `starting`
|
|
254
|
+
# - never nudge-ready, and starci kernel nudge skips it worker-starting.
|
|
255
|
+
# A command-terminal dispatch has already proven its prompt submitted and carries no grace; a
|
|
256
|
+
# staged paste is nudge-ready at any age, and a nudge since the dispatch ends the grace.
|
|
257
|
+
# kernelTurnBudgetMs / supervisorTurnBudgetMs: the longest ONE busy turn of a Kernel / the [Supervisor] seat (its
|
|
258
|
+
# spinner timer) before the reconciler's host controller sends the agent's own interrupt key and re-wakes it with
|
|
259
|
+
# the decision doorbell; still the same turn turnInterruptGraceMs later, the seat is replaced (KERNEL_TURN_OVERDUE,
|
|
260
|
+
# scripts/reconciler/controllers/host.mjs turnStep). A busy turn defers every doorbell and notice (kernel-busy).
|
|
261
|
+
liveness: {activeUnclassifiedMs: 120000, activeStaleMs: 600000, quietMs: 1200000, launchGraceMs: 90000,
|
|
262
|
+
kernelTurnBudgetMs: 1200000, supervisorTurnBudgetMs: 1800000, turnInterruptGraceMs: 300000}
|
|
263
|
+
# one local git read over a job's owned paths (scripts/kernel/owned-path-effects.mjs ownedPathEffects, job-artifacts.mjs).
|
|
264
|
+
settleGit: {commandMs: 15000}
|
|
265
|
+
# Typed logs (scripts/kernel/typed-logs.mjs, the ledger's logs table): perJobCap rows a job's own writes
|
|
266
|
+
# may store before one log.truncated row closes them (derived event rows are never capped); dataMaxBytes bounds
|
|
267
|
+
# one row's data after redaction. diff: the caps of a job patch's pre-structured <patch>.json
|
|
268
|
+
# (scripts/kernel/patch-json.mjs) - lines kept per file and in total, files, characters per line, and the size of
|
|
269
|
+
# an image literal decoded into <patch>.assets/.
|
|
270
|
+
logs:
|
|
271
|
+
perJobCap: 2000
|
|
272
|
+
dataMaxBytes: 4096
|
|
273
|
+
diff: {fileLines: 1500, totalLines: 20000, files: 400, lineChars: 2000, assetBytes: 5242880}
|
|
274
|
+
# Recovery windows. hostOutage (scripts/kernel/host-outage.mjs): how long a watchdog tick or a kernel
|
|
275
|
+
# start waits for an Orca that does not answer, and how long after a responding Orca calls a kernel dead
|
|
276
|
+
# it is asked again.
|
|
277
|
+
hostOutage: {waitMs: 90000, deathSettleMs: 10000}
|
|
278
|
+
# resume: unused since resume-all.mjs was retired (2026-09-28); the logon run waited orcaWaitMs for Orca; the scheduled task
|
|
279
|
+
# re-runs resume every everyMs (whole minutes: schtasks /MO).
|
|
280
|
+
resume: {orcaWaitMs: 600000, everyMs: 600000}
|
|
281
|
+
# supervisorTick: the numbers of the retired supervisor tick (2026-09-28) that the reconciler controllers still read
|
|
282
|
+
# (host thresholds, orca probes, statusApp port, owner digest cadence); everyMs is unused. The tick ran every
|
|
283
|
+
# everyMs (whole minutes: schtasks repetition). host: above maxNode node.exe or maxGit git.exe processes the host
|
|
284
|
+
# controller logs the counts and the parents holding the most. orca: terminal-list is probed up to probes times, probeTimeoutMs each, gapMs apart; when every
|
|
285
|
+
# probe fails the Orca app (never its terminal daemon) gets closeWaitMs to close before it is forced, is launched
|
|
286
|
+
# again, and restart-all runs. deadKernelMs: a watchdog whose trailing ticks read tick-failed or restart-failed
|
|
287
|
+
# this long flags a dead kernel. orphanedFrontierMs: a workflow read orphaned-frontier on ticks this far apart is
|
|
288
|
+
# flagged. noProgressMs: a STALLED workflow idle this long is flagged. statusApp: the status
|
|
289
|
+
# UI's ports and scheduled task — port serves the built UI and its read-only API, devPort the Vite dev/preview
|
|
290
|
+
# server (ui/ports.mjs is the one reader; nothing else states either) — restarted when port does not answer
|
|
291
|
+
# within probeTimeoutMs. alertRepeatMs: one
|
|
292
|
+
# alert key reaches the inbox and Telegram at most once per window. actionSlaMs: an owed action (scripts/supervisor/
|
|
293
|
+
# actions.mjs) no supervisor action touched this long is an SLA breach, alerted into the Supervisor's inbox.
|
|
294
|
+
# ownerDigestMs: the Owner Notifier's periodic owner digest goes out at most this often.
|
|
295
|
+
supervisorTick:
|
|
296
|
+
everyMs: 1800000
|
|
297
|
+
host: {maxNode: 300, maxGit: 100}
|
|
298
|
+
orca: {probeTimeoutMs: 30000, probes: 5, gapMs: 30000, closeWaitMs: 20000}
|
|
299
|
+
deadKernelMs: 900000
|
|
300
|
+
orphanedFrontierMs: 1800000
|
|
301
|
+
noProgressMs: 21600000
|
|
302
|
+
statusApp: {port: 4547, devPort: 4545, task: 'StarCi Harness App', probeTimeoutMs: 5000}
|
|
303
|
+
alertRepeatMs: 21600000
|
|
304
|
+
actionSlaMs: 1800000
|
|
305
|
+
ownerDigestMs: 7200000
|
|
306
|
+
# supervisorLearning (scripts/machine/lessons.mjs, supervise.yaml selfLearning): a failure signature seen
|
|
307
|
+
# minRepeats times opens a hypothesis; a landed experiment is measured for measureMs (its signature recurring, a new
|
|
308
|
+
# signature naming a file it changed, or an op success rate lower by successDrop -> revert due); at most
|
|
309
|
+
# dailyAutoLandCap autonomous landings in 24 h; an owner-feedback lesson weighs ownerWeight (a self-derived one 1).
|
|
310
|
+
supervisorLearning: {minRepeats: 2, measureMs: 21600000, dailyAutoLandCap: 8, ownerWeight: 3, successDrop: 0.1}
|
|
311
|
+
# progress (scripts/kernel/progress-rca.mjs; owner 2026-09-28 "could the supervisor not think before?" and "why do
|
|
312
|
+
# workflows not coordinate themselves but wait for the supervisor"): the outcome SLA each Kernel reads first on every wake (starci kernel status
|
|
313
|
+
# progress + rca) and the Supervisor backstops. units/h over windowMs (only units that passed their gates), ETA over
|
|
314
|
+
# etaWindowMs. A priority workflow (highest ramThrottle.priorities weight) below minUnitsPerHour.priority for graceMs,
|
|
315
|
+
# or holding queued-ready work while running < its allowed parallelism, is a progress stall: the Kernel acts on the
|
|
316
|
+
# ranked rca.actions at once; a stall older than supervisorGraceMs is the Supervisor's (progress-stall). maxUnitsPerEdit
|
|
317
|
+
# bounds one light graph-edit; recutThreshold open cut-shaped failures (absent paths, grants too narrow) rank a heavy
|
|
318
|
+
# re-cut first. rca: failures of one op in one workflow >= minFailures inside windowMs open the RCA even without a stall.
|
|
319
|
+
# commandTimeoutMs: the window the tool-timeout action gives an op (op-override).
|
|
320
|
+
progress:
|
|
321
|
+
windowMs: 3600000
|
|
322
|
+
etaWindowMs: 21600000
|
|
323
|
+
graceMs: 1800000
|
|
324
|
+
supervisorGraceMs: 3600000
|
|
325
|
+
minUnitsPerHour: {priority: 3, default: 0}
|
|
326
|
+
maxUnitsPerEdit: 3
|
|
327
|
+
recutThreshold: 3
|
|
328
|
+
commandTimeoutMs: 600000
|
|
329
|
+
# settleBacklog: SETTLE-FIRST - starci kernel route/dispatch refuse settle-backlog while >= max filed reports older than ageMs
|
|
330
|
+
# wait unconsumed (a finished [Op] keeps its terminal and slot until its settle closes it).
|
|
331
|
+
# The runtime settles green reports itself (settler below); this refusal counts only the reports waiting on the Kernel
|
|
332
|
+
# (non-green outcomes and done reports the settler handed over as needs-kernel-decision), consumed or not.
|
|
333
|
+
settleBacklog: {max: 3, ageMs: 120000}
|
|
334
|
+
rca: {minFailures: 3, windowMs: 86400000, examples: 4}
|
|
335
|
+
# settler (scripts/kernel/settle/job-settle.mjs; owner ruling settle-runtime-service 2026-09-28): the runtime settles every
|
|
336
|
+
# filed done report whose declared checks re-verify green through the same `starci kernel record-checks` + `starci kernel settle` path, from each
|
|
337
|
+
# workflow watchdog loop every everyMs and right after `starci kernel report`. rerunTimeoutMs bounds one declared check re-run and
|
|
338
|
+
# itemBudgetMs one report. invariantMaxAgeMs: the Supervisor tick asserts no filed/consumed report of a live job stays
|
|
339
|
+
# unsettled and un-handed-over longer than this (settle-unsettled-report, a runtime bug). releaseWindowMs: settled jobs
|
|
340
|
+
# this recent whose worker close is unproven are closed and verified. tail: the async settle tail (artifact indexing,
|
|
341
|
+
# evidence copy, session retention, input baselines, rev drift) retries a failed run after retryMs, up to maxAttempts.
|
|
342
|
+
settler:
|
|
343
|
+
everyMs: 60000
|
|
344
|
+
rerunTimeoutMs: 300000
|
|
345
|
+
itemBudgetMs: 900000
|
|
346
|
+
invariantMaxAgeMs: 180000
|
|
347
|
+
releaseWindowMs: 86400000
|
|
348
|
+
tail: {retryMs: 120000, maxAttempts: 5}
|
|
349
|
+
# redesign (starci kernel redesign; owner 2026-09-28: heavy redesign is dispatched to the op that owns it, and the Kernel stays on
|
|
350
|
+
# Devin): these ops, enqueued from an RCA, route as `routeAs` (implementation.plan: the plan order - Opus, then Sol) at
|
|
351
|
+
# >= minDifficulty at `effort` whatever their usual order (work.author walks the review order, Devin first, otherwise).
|
|
352
|
+
redesign:
|
|
353
|
+
ops: [work.author, scope.define, goal.revise]
|
|
354
|
+
routeAs: implementation.plan
|
|
355
|
+
minDifficulty: hard
|
|
356
|
+
effort: high
|
|
357
|
+
# restart: unused since restart-all.mjs was retired (2026-09-28); it waited waitMs for every running workflow to show one live
|
|
358
|
+
# Kernel, polling every pollMs.
|
|
359
|
+
restart: {waitMs: 480000, pollMs: 20000}
|
|
360
|
+
# selfReload (scripts/machine/self-reload.mjs): a watchdog loop re-execs at most once per minIntervalMs; its
|
|
361
|
+
# replacement takes over the loop's lock within handoverMs or is stopped.
|
|
362
|
+
selfReload: {minIntervalMs: 300000, handoverMs: 30000}
|
|
363
|
+
# footprint (scripts/guards/footprint-scan.mjs): one host-wide scan at most every everyMs; a crashed
|
|
364
|
+
# tick's claim lock is cleared after lockStaleMs.
|
|
365
|
+
footprint: {everyMs: 600000, lockStaleMs: 60000}
|
|
366
|
+
# jobGuard (scripts/guards/hook-install.mjs): a guard file older than ttlMs is pruned.
|
|
367
|
+
jobGuard: {ttlMs: 604800000}
|
|
368
|
+
# landGate (scripts/supervisor/land.mjs): a land waits waitMs for its turn at the gate; its spec run may take
|
|
369
|
+
# specsBaseMs plus perSpecMs for every spec it runs, specConcurrency spec files at a time.
|
|
370
|
+
landGate: {waitMs: 1800000, specsBaseMs: 600000, perSpecMs: 60000, specConcurrency: 6}
|
|
371
|
+
# workerClose (scripts/machine/worker-close.mjs; owner rule: a finished worker is closed COMPLETELY): after worker-release and the terminal
|
|
372
|
+
# close the runtime waits verifyMs for every process of that terminal's shell tree to end (polled every pollMs); a survivor proven to belong
|
|
373
|
+
# to the tree is stopped and given stopVerifyMs to end before the finding is raised.
|
|
374
|
+
workerClose: {verifyMs: 10000, pollMs: 1000, stopVerifyMs: 5000}
|
|
375
|
+
# waiterPriority (scripts/kernel/waiter-priority.mjs): a queued job that has blocked another
|
|
376
|
+
# workflow this long earns its Kernel one heads-up per newly waiting workflow.
|
|
377
|
+
waiterPriority: {blockingHeadsUpMs: 900000}
|
|
378
|
+
# cutSeam (scripts/kernel/seam-policy.mjs; owner ruling 2026-09-28 "a seam must not block the whole chain"): a cut
|
|
379
|
+
# sibling ordinal waits on its seam at most maxSiblingWaitMs (30 min), then runs on a stub and owes one
|
|
380
|
+
# cut-seam-reconcile once the seam lands; a published seam interface, a seam whose latest attempt
|
|
381
|
+
# settled failed/blocked, or recutAfterFailures failed seam attempts release it at once (and owe a re-cut).
|
|
382
|
+
cutSeam: {maxSiblingWaitMs: 1800000, recutAfterFailures: 2}
|
|
383
|
+
# opTelemetry (scripts/machine/op-metrics.mjs): op health per op and per workflow over the last windowMs; the
|
|
384
|
+
# supervisor tick records one supervisor-op-metrics snapshot per run and the owner digest's trend line compares the
|
|
385
|
+
# newest with the one closest to trendMs earlier. stuckSla: every wait a running workflow holds (starci kernel status stuck[])
|
|
386
|
+
# is severity warn past warnMs and critical past criticalMs - either is a Supervisor owed action; the tick alerts
|
|
387
|
+
# every critical one.
|
|
388
|
+
opTelemetry:
|
|
389
|
+
windowMs: 86400000
|
|
390
|
+
trendMs: 86400000
|
|
391
|
+
stuckSla:
|
|
392
|
+
owner-gate: {warnMs: 14400000, criticalMs: 86400000}
|
|
393
|
+
peer-wait: {warnMs: 3600000, criticalMs: 14400000}
|
|
394
|
+
dependency: {warnMs: 14400000, criticalMs: 86400000}
|
|
395
|
+
retry-cap: {warnMs: 1800000, criticalMs: 14400000}
|
|
396
|
+
deferred-settle: {warnMs: 1800000, criticalMs: 7200000}
|
|
397
|
+
queued-ready: {warnMs: 900000, criticalMs: 3600000}
|
|
398
|
+
throttled: {warnMs: 3600000, criticalMs: 14400000}
|
|
399
|
+
# quitAgent (scripts/kernel/quit-agent.mjs): after the agent's own quit input is typed, settle waits
|
|
400
|
+
# this long for the terminal to disconnect before the release/close proceeds anyway.
|
|
401
|
+
quitAgent: {waitMs: 6000}
|
|
402
|
+
# drawRender (scripts/work/draw-render.mjs): a capture waits settleMs after document.fonts.ready.
|
|
403
|
+
drawRender: {settleMs: 500}
|
|
404
|
+
# drawLoop (scripts/work/draw-loop.mjs, scripts/work/draw/draw-taste.mjs; owner rulings 2026-09-27): interface.draw
|
|
405
|
+
# draws -> shoots -> evaluates -> fixes in rounds. A loop stops when every machine metric passes and the
|
|
406
|
+
# independent critic's beauty is at least beautyMin, after maxRounds, or after stallRounds rounds in a row that
|
|
407
|
+
# neither cut the failures nor raised the beauty; the best round is kept. Taste thresholds: accentBudget is the
|
|
408
|
+
# largest share of the render the accent colour may fill (the brand art band excluded), bandsPerCardMax the most
|
|
409
|
+
# hairline bands one card splits into, badgesPerEntityMax the most badges one entity carries. critic is the fresh,
|
|
410
|
+
# context-free Orca worker that scores beauty and hierarchy against the product's brand.direction rubric: started
|
|
411
|
+
# through orchestration worker-start --agent <provider> --model --effort (scripts/agent/lib.mjs startAgent) on a
|
|
412
|
+
# runtime worktree detached at the empty tree (draw-critic.mjs criticWorkspace; Orca refuses a bare temp dir) holding only the PNGs, the HTML and the rubric; it writes verdict.json and reports worker_done; a
|
|
413
|
+
# critic with no worker_done within timeoutMs is stopped and released (outcome timeout, no beauty). The critic is a DIFFERENT model from the drawer (owner ruling 2026-09-27
|
|
414
|
+
# draw-devin-brand-claude): Devin draws, Codex critiques; when the drawer (the op's provider, bound to its
|
|
415
|
+
# terminal - scripts/guards/op-context.mjs - or draw-loop.mjs round --drawer) is the critic's provider - Codex drawing as the draw order's fallback - the round is
|
|
416
|
+
# judged by criticWhenDrawer.<drawer> instead, and a round with no independent critic has no beauty. directionPrerequisite: interface.draw needs an ACCEPTED brand.direction
|
|
417
|
+
# archetype for its ui record's ui.archetype - brand.mjs checkDirection evidence.ready, the owner's receipt
|
|
418
|
+
# (scripts/kernel/prerequisites.mjs direction-unaccepted; the Kernel enqueues brand.decide --param
|
|
419
|
+
# directionArchetype=<archetype> first). false switches the gate off.
|
|
420
|
+
drawLoop:
|
|
421
|
+
maxRounds: 10
|
|
422
|
+
stallRounds: 2
|
|
423
|
+
beautyMin: 8
|
|
424
|
+
accentBudget: 0.10
|
|
425
|
+
bandsPerCardMax: 3
|
|
426
|
+
badgesPerEntityMax: 2
|
|
427
|
+
critic: {provider: codex, model: gpt-6.1-sol, effort: high, timeoutMs: 900000}
|
|
428
|
+
criticWhenDrawer:
|
|
429
|
+
codex: {provider: claude, model: claude-opus-5-5, effort: high, timeoutMs: 900000}
|
|
430
|
+
directionPrerequisite: true
|
|
431
|
+
# How long the workflow that claimed foundation `shell` (the layout chain an interface.draw draws) may hold it before a
|
|
432
|
+
# waiting draw opens a Supervisor Decision Item (scripts/kernel/shell-foundation.mjs; owner ruling 2026-09-29 draw-from-todo).
|
|
433
|
+
shellFoundationStallMs: 7200000
|
|
434
|
+
# autopilot (scripts/kernel/autopilot-run.mjs; owner ruling 2026-09-28 autopilot-run-to-finish, modules/kernel/
|
|
435
|
+
# owner-rulings.yaml): "run to the finish in one go, don't stop to ask the owner - not even UX/UI review; the owner
|
|
436
|
+
# reviews once at the end". enabled is the default for every running workflow; workflows.<workflowId>.enabled
|
|
437
|
+
# overrides it for one workflow (starci kernel autopilot --workflow <id> --set on|off records a ledger override that wins
|
|
438
|
+
# over both). Under autopilot:
|
|
439
|
+
# - a draw-review or brand-direction-review ask whose machine gates pass is answered PROVISIONALLY (answeredBy
|
|
440
|
+
# autopilot, receipt provisional:true + gate evidence); it never becomes golden and never counts as an owner
|
|
441
|
+
# answer (owner-claim.mjs). Failing gates answer redraw/revise with the gate findings, at most
|
|
442
|
+
# redrawBudget times per record, then the leg is deferred to the final review;
|
|
443
|
+
# - a credential, real-money, shared-external-system or owner-only ask is deferred-to-handover: nothing is
|
|
444
|
+
# sent or waited on, the leg proceeds on the sandbox/stub path the deferral names, the live-proof legs that
|
|
445
|
+
# need it wait for the one end-of-flow credential checklist (provision.ask subject handover-credentials);
|
|
446
|
+
# - a retry cap or an owner-gate that is really a runtime/process issue is a supervisor-gate incident (the
|
|
447
|
+
# Supervisor fixes or decides the retry), supervisorExtraBudget gates per node group, then the leg is
|
|
448
|
+
# deferred; an unresolved supervisor-gate older than supervisorGateTimeoutMs defers what it holds;
|
|
449
|
+
# - budgets caps one workflow (non-kernel jobs, token total recorded on jobs, wall time since start): past
|
|
450
|
+
# one, a supervisor-gate holds new dispatch until the Supervisor extends the budget.
|
|
451
|
+
autopilot:
|
|
452
|
+
enabled: true
|
|
453
|
+
workflows: {}
|
|
454
|
+
redrawBudget: 2
|
|
455
|
+
supervisorExtraBudget: 2
|
|
456
|
+
supervisorGateTimeoutMs: 21600000
|
|
457
|
+
budgets: {attempts: 600, tokens: 400000000, wallMs: 1209600000}
|
|
458
|
+
# serveAsk (scripts/kernel/ask-server.mjs): the default lifetime of a served owner-ask link
|
|
459
|
+
# (--ttl <ms> overrides it per serve).
|
|
460
|
+
serveAsk: {ttlMs: 14400000}
|
|
461
|
+
# workerJobs (scripts/supervisor/workers.mjs takeLeases, scripts/supervisor/supervisor-watchdog.mjs
|
|
462
|
+
# filedReports): a contract worker's file leases expire leaseTtlMs after it takes them, so a dead
|
|
463
|
+
# worker's leases free themselves; the watchdog consumes worker reports filed in the last
|
|
464
|
+
# reportWindowMs.
|
|
465
|
+
workerJobs: {leaseTtlMs: 604800000, reportWindowMs: 604800000}
|
|
466
|
+
# draft (scripts/kernel/clear-draft.mjs): the beat between one Ctrl+U and the re-read that judges
|
|
467
|
+
# the input box's answer - a TUI repaints a beat later. clearDraft and probeDraft default to it and
|
|
468
|
+
# the wake-delivery draft probe caps its own interval at it.
|
|
469
|
+
draft: {intervalMs: 300}
|
|
470
|
+
# housekeeping (scripts/housekeeping/housekeeping.mjs): every retention window and root the host
|
|
471
|
+
# cleanup reads - no literal may live in the script. tmp: top-level %TEMP% entries whose name starts
|
|
472
|
+
# with one of tmpPrefixes (the prefixes StarCi, its ops lanes and its spec fixtures create) and
|
|
473
|
+
# whose age passes tmpMaxAgeMs are removed, never %TEMP%/claude and never a dir a live process
|
|
474
|
+
# holds. Agent session files (codex sessions and archived_sessions, devin
|
|
475
|
+
# transcripts and summaries, orca's own codex-runtime-home sessions/generated_images) older than
|
|
476
|
+
# sessionArchiveAfterMs move under archiveRoot keeping their relative path; Claude Code project
|
|
477
|
+
# transcripts get the longer claudeTranscriptArchiveAfterMs. Archive files older than
|
|
478
|
+
# archiveMaxAgeMs are deleted outright. lanesRoot is where lane worktrees sit; a landed lane is
|
|
479
|
+
# removed only once its branch reflog, HEAD reflog and directory stayed unchanged for laneGraceMs
|
|
480
|
+
# (a fresh lane with no commit yet reads as landed to git cherry); unset, no lane is removed.
|
|
481
|
+
# logMaxAgeMs caps every jsonl and log under %LOCALAPPDATA%/StarCi and ~/.starci.
|
|
482
|
+
# gitIndexLockStaleMs: a product checkout's .git/index.lock older than this, with no git process on
|
|
483
|
+
# that repository (one naming no repository counts as on it), is removed by
|
|
484
|
+
# scripts/api/git/index-lock.mjs - from the op worker's git shim before git runs, and by the
|
|
485
|
+
# housekeeping area gitlocks - and recorded as a supervisor-ledger git-index-lock-removed event. A
|
|
486
|
+
# live git holds the lock only while it writes (a commit with hooks: minutes at most), and its
|
|
487
|
+
# process keeps the lock regardless of age.
|
|
488
|
+
housekeeping:
|
|
489
|
+
tmpMaxAgeMs: 172800000
|
|
490
|
+
tmpPrefixes: [policy-, rights-, l4-, starci, starci-w2, evidence, sup-k, work-v3, scoped-lint, si-, w1-, nivo-, orca-spec,
|
|
491
|
+
owner-bias-cli-, admission-runtime-, agent-launch-, starci-provider-budget-, starci-provider-schema-,
|
|
492
|
+
codex-, deps-, direction-part-, draw-layer-, footprint-, grammar-pin-, guard-, literal-argv-, module-yaml-,
|
|
493
|
+
doc-language-, guidance-, hk-, hfs-, install-link-, kernel-check-, kguard-, sup-orca, land-, op-manifest-, path-key-, pathspec-, push-scan-spec-, rename-over-, sbl-, serve-ask-, sup-chat, sup-repo, sup-src, sup-wd,
|
|
494
|
+
work-acceptance-, work-brand-test-, work-core-test-, work-custody-test-, work-external-,
|
|
495
|
+
work-index-md-, work-module-spec-, example-critique-, example-derive-, example-evidence-, example-verify-,
|
|
496
|
+
example-work-gate-, work-artifacts-, work-consistency-, work-surfaces-,
|
|
497
|
+
grammar-land-, kernel-replace-close-, nm-link-, rc-job-, rc-health-, release-gate-, seat-titles-, slice-typecheck-, unit-roles-, spec-budget-]
|
|
498
|
+
sessionArchiveAfterMs: 259200000
|
|
499
|
+
claudeTranscriptArchiveAfterMs: 604800000
|
|
500
|
+
archiveMaxAgeMs: 2592000000
|
|
501
|
+
# archiveRoot and lanesRoot are unset on purpose: no host location lives in a tracked file. The defaults are
|
|
502
|
+
# <starciLocalRoot>/archive and <starciLocalRoot>/lanes (scripts/machine/home.mjs archiveRoot, lanesRoot); the owner
|
|
503
|
+
# relocates them with STARCI_ARCHIVE_ROOT and STARCI_LANES_ROOT or by setting these keys on the host.
|
|
504
|
+
laneGraceMs: 86400000
|
|
505
|
+
logMaxAgeMs: 1209600000
|
|
506
|
+
gitIndexLockStaleMs: 300000
|
|
507
|
+
# gc: the Supervisor's garbage collection (scripts/supervisor/gc.mjs, every tick; owner 2026-09-28 "there must be
|
|
508
|
+
# garbage collection"). An idle bare shell or an unregistered runtime terminal of a live workflow is closed only once it has
|
|
509
|
+
# been seen for gcMinAgeMs (a dispatch binds its terminal well within that); a merged lane worktree only once idle
|
|
510
|
+
# for gcLaneGraceMs. GC never purges an ended workflow: housekeeping does (Q6: 30 days, zipped and verified first).
|
|
511
|
+
gcMinAgeMs: 600000
|
|
512
|
+
gcLaneGraceMs: 1800000
|
|
513
|
+
# gc: the cadence of the Supervisor's periodic sweep (scripts/supervisor/gc.mjs; owner 2026-09-28 "every 30 minutes, not
|
|
514
|
+
# every tick": the tick only checks whether it is due) and the tabs it never touches (keepTitles: regexes on the tab or
|
|
515
|
+
# pane title; an owner's hand-opened tab with recent output is reported, not closed, allowlisted or not).
|
|
516
|
+
gc:
|
|
517
|
+
sweepMs: 1800000
|
|
518
|
+
# laneCap: the most lane worktrees that stay registered under the lanes root (scripts/supervisor/gc.mjs collectLanes); past it the
|
|
519
|
+
# longest idle clean lanes go, landed or not (an unlanded lane keeps its branch). Owner rule: worktrees never accumulate.
|
|
520
|
+
laneCap: 40
|
|
521
|
+
keepTitles: []
|
|
522
|
+
# reconciler (scripts/reconciler/*; DESIGN 7.4-7.8, contract modules/reconciler/reconciler.yaml): the engine polls
|
|
523
|
+
# every ledger's events every pollMs; the leader row lasts leaseMs and is renewed (with the heartbeat row and file)
|
|
524
|
+
# every renewMs; boot.mjs ensure restarts an engine whose heartbeat is older than
|
|
525
|
+
# heartbeatStaleMs; one starci kernel status snapshot per workflow is shared for statusCacheMs; a failing key backs off
|
|
526
|
+
# backoff.minMs doubling to backoff.maxMs; more than crashLoop.max engine starts in crashLoop.windowMs start it
|
|
527
|
+
# --safe (read-only) and push the owner one urgent Telegram (boot.mjs).
|
|
528
|
+
reconciler: {pollMs: 2000, leaseMs: 30000, renewMs: 10000, heartbeatStaleMs: 60000, statusCacheMs: 20000, backoff: {minMs: 1000, maxMs: 300000}, crashLoop: {max: 3, windowMs: 1800000}}
|
|
529
|
+
# resources: the host-floor guards the provider-health / admission path reads. Below minFreeDiskGb
|
|
530
|
+
# `starci kernel dispatch --spawn` refuses host-resources-low until there is room again - measured on the
|
|
531
|
+
# drive that holds %TEMP% and the repos. RAM goes through the RAM-aware, priority-aware throttle
|
|
532
|
+
# (scripts/machine/ram-throttle.mjs; owner ruling 2026-09-28 "Parallelism ceiling follows real RAM: free RAM below 15%
|
|
533
|
+
# then reduce the number of parallel ops, avoid freezing the machine and killing ops mid-run"): at every dispatch the effective cap
|
|
534
|
+
# is min(maxParallelOps, running + the ops that fit in free RAM above hardFloorPct of total), counted across
|
|
535
|
+
# every ledger of the host, and never above maxParallelOps. minFreeRamPct is the heavy floor: below it no NEW
|
|
536
|
+
# heavy op (opRam class heavy: Playwright / render / test / implement) starts from a workflow below the top
|
|
537
|
+
# priority, light ops still start; heavy resumes only above ramThrottle.heavyResumeAbovePct (hysteresis).
|
|
538
|
+
# Below landSpecPauseBelowPct no heavy op starts from any workflow and the land gate's spec runs pause until
|
|
539
|
+
# free RAM is back above landSpecResumeAbovePct. A CPU at or above cpuHeavyStopAbove pauses heavy ops the
|
|
540
|
+
# same way until it falls below cpuHeavyResumeBelow. Running ops are never stopped. Owner ruling 2026-09-28
|
|
541
|
+
# ("15→10, 10→2.5"): the heavy floor 10% resuming at 15%, critical 2.5% resuming at 5%, the fit floor 2.5%.
|
|
542
|
+
resources:
|
|
543
|
+
minFreeDiskGb: 20
|
|
544
|
+
minFreeRamPct: 10
|
|
545
|
+
ramThrottle:
|
|
546
|
+
heavyResumeAbovePct: 15
|
|
547
|
+
landSpecPauseBelowPct: 2.5
|
|
548
|
+
landSpecResumeAbovePct: 5
|
|
549
|
+
hardFloorPct: 2.5
|
|
550
|
+
cpuHeavyStopAbove: 0.95
|
|
551
|
+
cpuHeavyResumeBelow: 0.85
|
|
552
|
+
# The estimate history: the newest historySamples op-ram-footprint samples (the Resource controller records them);
|
|
553
|
+
# a kind's measured RAM replaces its opRam prior once it has historyMinObservations observations. kernelMb:
|
|
554
|
+
# the RAM one running Kernel's agent is assumed to hold, subtracted from the agent trees before sharing.
|
|
555
|
+
historySamples: 48
|
|
556
|
+
historyMinObservations: 3
|
|
557
|
+
kernelMb: 900
|
|
558
|
+
# priorities: {<workflowId>: {weight, reserve}}. Weight 1 is everyone's default. A workflow below the top
|
|
559
|
+
# weight leaves `reserve` slots (and the RAM its queued ops need) to the higher ones and loses its heavy
|
|
560
|
+
# ops first under the heavy pause; the top one keeps starting heavy ops while they fit, until critical.
|
|
561
|
+
# The Supervisor overrides per host: starci supervisor ram-cap prioritize --workflow <id>
|
|
562
|
+
# --weight <n> [--reserve <slots>]. Owner priority 2026-09-28: the prioritized FE refactor workflow ran
|
|
563
|
+
# up to 15 parallel code.refactor slices first; the other workflows ramped up in what was left.
|
|
564
|
+
priorities: {}
|
|
565
|
+
# opRam: the per-op RAM estimate table (MB for one running op: the agent CLI plus what it runs - the
|
|
566
|
+
# test runner, the browser, the dev server) and its class. heavy = Playwright / render / test /
|
|
567
|
+
# implement; light = reading, deciding, writing records. A kind not listed takes `default`.
|
|
568
|
+
opRam:
|
|
569
|
+
default: {mb: 1000, class: light}
|
|
570
|
+
backend.implement: {mb: 2500, class: heavy}
|
|
571
|
+
interface.implement: {mb: 3000, class: heavy}
|
|
572
|
+
interface.draw: {mb: 3500, class: heavy}
|
|
573
|
+
interface.asset: {mb: 2500, class: heavy}
|
|
574
|
+
interface.audit: {mb: 3000, class: heavy}
|
|
575
|
+
brand.decide: {mb: 3000, class: heavy}
|
|
576
|
+
code.refactor: {mb: 2000, class: heavy}
|
|
577
|
+
test.author: {mb: 2500, class: heavy}
|
|
578
|
+
task.execute: {mb: 2000, class: heavy}
|
|
579
|
+
backend.scaffold: {mb: 2000, class: heavy}
|
|
580
|
+
interface.scaffold: {mb: 2000, class: heavy}
|
|
581
|
+
package.scaffold: {mb: 2000, class: heavy}
|
|
582
|
+
uat.verify: {mb: 3500, class: heavy}
|
|
583
|
+
uat.assisted.verify: {mb: 3500, class: heavy}
|
|
584
|
+
e2e.verify: {mb: 3500, class: heavy}
|
|
585
|
+
perf.verify: {mb: 3500, class: heavy}
|
|
586
|
+
unit.verify: {mb: 2500, class: heavy}
|
|
587
|
+
integration.verify: {mb: 2500, class: heavy}
|
|
588
|
+
security.verify: {mb: 1500, class: light}
|
|
589
|
+
review.verify: {mb: 1000, class: light}
|
|
590
|
+
runtime.operate: {mb: 1500, class: light}
|
|
591
|
+
release.deliver: {mb: 1500, class: light}
|
|
592
|
+
architecture.decide: {mb: 800, class: light}
|
|
593
|
+
business.decide: {mb: 800, class: light}
|
|
594
|
+
decision.prepare: {mb: 800, class: light}
|
|
595
|
+
request.analyze: {mb: 800, class: light}
|
|
596
|
+
scope.define: {mb: 800, class: light}
|
|
597
|
+
scope.finish: {mb: 800, class: light}
|
|
598
|
+
goal.revise: {mb: 800, class: light}
|
|
599
|
+
docs.author: {mb: 800, class: light}
|
|
600
|
+
content.generate: {mb: 800, class: light}
|
|
601
|
+
work.author: {mb: 800, class: light}
|
|
602
|
+
grammar.update: {mb: 800, class: light}
|
|
603
|
+
knowledge.repair: {mb: 800, class: light}
|
|
604
|
+
handover.review: {mb: 800, class: light}
|
|
605
|
+
provision.ask: {mb: 800, class: light}
|
|
606
|
+
uat.assisted.prepare: {mb: 1000, class: light}
|
|
607
|
+
workspace.manage: {mb: 1000, class: light}
|
|
608
|
+
# A routed-but-queued job (payload.model set, status queued) holds its pool slot only this long after its latest route
|
|
609
|
+
# decision (payload.routedAt, else its newest route-decided event): long enough for one fan-out's sequential route
|
|
610
|
+
# calls to spread across pools, short enough that a job parked behind a gate, hold, peer-wait, dependency or
|
|
611
|
+
# readiness loop does not starve the pool (scripts/kernel/cli.mjs poolLoadOf, shared by starci kernel route and starci kernel status).
|
|
612
|
+
# Running, leased and answering jobs always hold theirs. Re-routing refreshes the hold.
|
|
613
|
+
routeHoldMs: 900000
|
|
614
|
+
verifyAvoidsImplementRuntime: true
|
|
615
|
+
onLaunchFailure: next-available-runtime
|
|
616
|
+
tieBreak: round-robin
|
|
617
|
+
# worker-start is a managed launch the host refused without classifying it. Two minutes is long
|
|
618
|
+
# enough for the kernel to reroute the attempt to a different pool, short enough that a one-off
|
|
619
|
+
# host hiccup does not park a healthy pool for the rest of the leg. prompt-delivery-stalled is its
|
|
620
|
+
# command-terminal twin: a prompt lost on a stalled send and on its one re-delivery (scripts/agent/lib.mjs).
|
|
621
|
+
# quota: the fallback only - a provider whose plan reset is configured holds its quota circuit until that reset
|
|
622
|
+
# plus one probe interval, cleared earlier by its recovery probe.
|
|
623
|
+
# capacity: the provider refused to serve the model for now (an agent card's capacityExhausted row).
|
|
624
|
+
cooldownMs: {rate-limited: 600000, quota: 3600000, capacity: 600000, auth: 86400000, other: 300000, worker-start: 120000, prompt-delivery-stalled: 120000}
|
|
625
|
+
# Observations of one failure kind before its circuit opens. A kind absent here opens on the first:
|
|
626
|
+
# a provider answering 401 is not a flake, a single refused launch can be.
|
|
627
|
+
# A circuit that reopens for the same failure inside windowMs waits factor
|
|
628
|
+
# times longer each time, capped at capMs (scripts/kernel/cli.mjs
|
|
629
|
+
# writeProviderCircuit). An un-onboarded CLI does not clear in two minutes.
|
|
630
|
+
circuitBackoff: {factor: 5, capMs: 3600000, windowMs: 3600000}
|
|
631
|
+
providerStrikes: {worker-start: 2, prompt-delivery-stalled: 2}
|
|
632
|
+
backoffFactor: 2
|
|
633
|
+
maxCooldownMs: 3600000
|
|
634
|
+
# The allocator's reading of each kind, from what its op manifest's goal and steps do. `role` is the
|
|
635
|
+
# kinds.yaml role. `work` is `think` when the output is a canonical record (SRS, SDS, scope, goal, decision,
|
|
636
|
+
# brand, ui, Work, workspace, rule) or a verdict about quality, and `hands-on` when the op builds, runs or
|
|
637
|
+
# measures under a record someone else settled. `floor` is the least difficulty the kind routes at:
|
|
638
|
+
# scripts/agent/models.mjs selectPool raises a measured difficulty to it and never lowers one. Every think
|
|
639
|
+
# kind's floor is hard, the tier where every think pool pins a frontier model. The kernel's own model
|
|
640
|
+
# calls (selection.yaml kernelFunctionKinds) are think work at the same floor. `order` names the allocation
|
|
641
|
+
# tiers/preference key the kind walks when it is not the default (`think` for think work, else the role):
|
|
642
|
+
# `scaffold` (Devin first) for scaffold, docs, content and grammar work, `draw` (Devin first, Codex Sol at effort high
|
|
643
|
+
# the fallback) for interface.draw, `asset` (Codex only, the image tool) for interface.asset, `brand` (Opus first, Sol
|
|
644
|
+
# the fallback) for brand.decide, `review` (Devin, Opus and Sol overflow) for the remaining verify kinds and
|
|
645
|
+
# work.author (owner decision 2026-09-25 review-hands), `ui` (Codex first, Devin as fallback) for
|
|
646
|
+
# interface.audit, e2e.verify, security.verify and uat.assisted.verify, `implement` for the mechanical
|
|
647
|
+
# think ops the hands take whatever their kind role - provision.ask, workspace.manage, task.execute and
|
|
648
|
+
# knowledge.repair - and `sol-think` (Sol first, Opus overflow) for the kernel's own model calls, verify
|
|
649
|
+
# calls included (owner routing 2026-09-26). work.author authors Work records - the write role, as in
|
|
650
|
+
# modules/models/kinds.yaml - so the hands pools, which carry no plan role, can take it; its cut form,
|
|
651
|
+
# implementation.plan, stays plan work on the think order.
|
|
652
|
+
roleOfKind:
|
|
653
|
+
request.analyze: {role: plan, work: think, floor: hard}
|
|
654
|
+
task.execute: {role: plan, work: think, floor: hard, order: implement}
|
|
655
|
+
backend.implement: {role: implement, work: hands-on, floor: medium}
|
|
656
|
+
backend.scaffold: {role: implement, work: hands-on, floor: easy, order: scaffold}
|
|
657
|
+
interface.implement: {role: implement, work: hands-on, floor: medium}
|
|
658
|
+
interface.audit: {role: verify, work: think, floor: hard, order: ui}
|
|
659
|
+
interface.scaffold: {role: implement, work: hands-on, floor: easy, order: scaffold}
|
|
660
|
+
package.scaffold: {role: implement, work: hands-on, floor: easy, order: scaffold}
|
|
661
|
+
scope.define: {role: decide, work: think, floor: hard}
|
|
662
|
+
code.refactor: {role: implement, work: hands-on, floor: easy}
|
|
663
|
+
test.author: {role: implement, work: hands-on, floor: easy}
|
|
664
|
+
grammar.update: {role: implement, work: hands-on, floor: hard, order: scaffold}
|
|
665
|
+
architecture.revise: {role: decide, work: think, floor: hard}
|
|
666
|
+
business.revise: {role: decide, work: think, floor: hard}
|
|
667
|
+
content.generate: {role: write, work: hands-on, floor: easy, order: scaffold}
|
|
668
|
+
docs.author: {role: write, work: hands-on, floor: easy, order: scaffold}
|
|
669
|
+
knowledge.repair: {role: write, work: think, floor: hard, order: implement}
|
|
670
|
+
release.deliver: {role: implement, work: hands-on, floor: hard}
|
|
671
|
+
scope.finish: {role: implement, work: hands-on, floor: hard}
|
|
672
|
+
runtime.operate: {role: implement, work: hands-on, floor: medium}
|
|
673
|
+
review.verify: {role: verify, work: think, floor: hard, order: review}
|
|
674
|
+
handover.review: {role: verify, work: think, floor: hard, order: review}
|
|
675
|
+
e2e.verify: {role: verify, work: hands-on, floor: medium, order: ui}
|
|
676
|
+
integration.verify: {role: verify, work: hands-on, floor: hard, order: review}
|
|
677
|
+
security.verify: {role: verify, work: think, floor: hard, order: ui}
|
|
678
|
+
perf.verify: {role: verify, work: hands-on, floor: medium, order: review}
|
|
679
|
+
unit.verify: {role: verify, work: hands-on, floor: medium, order: review}
|
|
680
|
+
uat.verify: {role: verify, work: hands-on, floor: medium, order: review}
|
|
681
|
+
uat.assisted.prepare: {role: write, work: hands-on, floor: medium}
|
|
682
|
+
uat.assisted.verify: {role: verify, work: think, floor: hard, order: ui}
|
|
683
|
+
goal.validate: {role: verify, work: think, floor: hard, order: review}
|
|
684
|
+
architecture.decide: {role: decide, work: think, floor: hard}
|
|
685
|
+
business.decide: {role: decide, work: think, floor: hard}
|
|
686
|
+
goal.revise: {role: decide, work: think, floor: hard}
|
|
687
|
+
decision.prepare: {role: decide, work: think, floor: hard}
|
|
688
|
+
provision.ask: {role: decide, work: think, floor: hard, order: implement}
|
|
689
|
+
brand.decide: {role: write, work: think, floor: hard, order: brand}
|
|
690
|
+
interface.draw: {role: write, work: think, floor: hard, order: draw}
|
|
691
|
+
interface.asset: {role: write, work: hands-on, floor: medium, order: asset}
|
|
692
|
+
work.author: {role: write, work: think, floor: hard, order: review}
|
|
693
|
+
implementation.plan: {role: plan, work: think, floor: hard}
|
|
694
|
+
workspace.manage: {role: plan, work: think, floor: hard, order: implement}
|
|
695
|
+
model.assessGoal: {role: plan, work: think, floor: hard, order: sol-think}
|
|
696
|
+
model.planOp: {role: plan, work: think, floor: hard, order: sol-think}
|
|
697
|
+
model.decide: {role: decide, work: think, floor: hard, order: sol-think}
|
|
698
|
+
model.manageWorkflow: {role: decide, work: think, floor: hard, order: sol-think}
|
|
699
|
+
model.validateOp: {role: verify, work: think, floor: hard, order: sol-think}
|
|
700
|
+
model.critiqueGoal: {role: verify, work: think, floor: hard, order: sol-think}
|
|
701
|
+
judge: {role: verify, work: think, floor: hard, order: sol-think}
|