@starci/hfs 4.7.32 → 4.7.34
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 +10 -0
- package/README.md +13 -6
- package/emit/contracts.mjs +4 -3
- package/emit/form-bounds-reader.ts.partial +58 -0
- package/emit/form-bounds.mjs +155 -0
- package/emit/graphql-input-bounds.mjs +97 -0
- package/emit/input-bounds.mjs +44 -0
- package/emit/operation-schemas.mjs +137 -0
- package/emit/operations-worker.mjs +2 -2
- package/emit/operations.mjs +52 -16
- package/emit/schema-worker.mjs +17 -4
- package/emit/type-schema.mjs +17 -5
- package/package.json +9 -2
- package/release/gate.mjs +18 -23
- package/release/index.mjs +1 -1
- package/release/push.mjs +4 -5
- package/runtime/engine/admission.mjs +331 -0
- package/runtime/engine/canonical-json.mjs +14 -0
- package/runtime/engine/db/blob.mjs +380 -0
- package/runtime/engine/db/event-compact.mjs +73 -0
- package/runtime/engine/db/ledger-open.mjs +38 -0
- package/runtime/engine/db/ledger-paths.mjs +87 -0
- package/runtime/engine/db/ledger.mjs +1068 -0
- package/runtime/engine/db/machine-connection.mjs +150 -0
- package/runtime/engine/db/machine-open.mjs +60 -0
- package/runtime/engine/db/machine-schema.mjs +105 -0
- package/runtime/engine/db/machine.mjs +1317 -0
- package/runtime/engine/db/provider-reservations.mjs +127 -0
- package/runtime/engine/db/provision-authority.mjs +76 -0
- package/runtime/engine/db/provision-lock.mjs +29 -0
- package/runtime/engine/db/provision-operations.mjs +146 -0
- package/runtime/engine/db/ref-value.mjs +67 -0
- package/runtime/engine/db/schema/machine.sql +920 -0
- package/runtime/engine/db/schema/runtime.sql +1113 -0
- package/runtime/engine/refuse.mjs +11 -0
- package/runtime/knowledge/hfs/canon-pins.yaml +65 -9
- package/runtime/knowledge/hfs/design-truths.yaml +149 -0
- package/runtime/knowledge/hfs/fe-stack.yaml +23 -5
- package/runtime/knowledge/hfs/rules.yaml +269 -48
- package/runtime/knowledge/hfs/slots.yaml +113 -53
- package/runtime/knowledge/patterns/be/api.yaml +46 -20
- package/runtime/knowledge/patterns/be/event-bus.yaml +19 -12
- package/runtime/knowledge/patterns/be/idempotency.yaml +265 -0
- package/runtime/knowledge/patterns/be/jobs.yaml +17 -12
- package/runtime/knowledge/patterns/be/projections.yaml +2 -2
- package/runtime/knowledge/patterns/be/queues.yaml +57 -22
- package/runtime/knowledge/patterns/be/reactors.yaml +1 -1
- package/runtime/knowledge/patterns/be/realtime.yaml +326 -27
- package/runtime/knowledge/patterns/be/saga.yaml +2 -2
- package/runtime/knowledge/sonar-gate.yaml +1 -1
- package/runtime/modules/kernel/command-policy.yaml +249 -0
- package/runtime/modules/kernel/failure-codes.yaml +211 -52
- package/runtime/modules/kernel/hook-input.yaml +6 -0
- package/runtime/modules/kernel/protected-zone.yaml +81 -0
- package/runtime/modules/kernel/removed-vocabulary.yaml +62 -0
- package/runtime/modules/kernel/roles.yaml +405 -0
- package/runtime/modules/models/registry.yaml +3 -1
- package/runtime/modules/models/runtimes.yaml +2 -0
- package/runtime/modules/schemas/application-stacks.schema.yaml +10 -2
- package/runtime/packages/cli/src/catalog.generated.mjs +46 -59
- package/runtime/packages/grammar/scripts/build-stamp.mjs +98 -0
- package/runtime/scripts/agent/codex-app-server.mjs +79 -0
- package/runtime/scripts/agent/codex-mirror-source.mjs +34 -0
- package/runtime/scripts/agent/host-agents.mjs +80 -0
- package/runtime/scripts/agent/launch-trust-policy.mjs +53 -0
- package/runtime/scripts/agent/trust-launch.mjs +191 -0
- package/runtime/scripts/agent/trust.mjs +523 -0
- package/runtime/scripts/api/fs/rename-over.mjs +21 -0
- package/runtime/scripts/api/fs/temp-path.mjs +8 -0
- package/runtime/scripts/api/fs/write-json-file.mjs +10 -0
- package/runtime/scripts/api/git/diff-names.mjs +8 -0
- package/runtime/scripts/api/git/head-time.mjs +10 -0
- package/runtime/scripts/api/git/index-lock.mjs +78 -0
- package/runtime/scripts/api/git/is-ancestor.mjs +5 -0
- package/runtime/scripts/api/git/log.mjs +5 -0
- package/runtime/scripts/api/git/merge-base-query.mjs +5 -0
- package/runtime/scripts/api/git/merge-tree.mjs +5 -0
- package/runtime/scripts/api/git/rev-list.mjs +5 -0
- package/runtime/scripts/api/git/rev-parse.mjs +13 -0
- package/runtime/scripts/api/git/status-query.mjs +5 -0
- package/runtime/scripts/api/git/worktree-list-query.mjs +5 -0
- package/runtime/scripts/api/node/spawn-node.mjs +6 -0
- package/runtime/scripts/api/npm/dist-tag.mjs +8 -0
- package/runtime/scripts/api/npm/lib.mjs +32 -0
- package/runtime/scripts/api/npm/pack-dry-run.mjs +9 -0
- package/runtime/scripts/api/npm/run-npm.mjs +6 -0
- package/runtime/scripts/api/npm/view.mjs +30 -0
- package/runtime/scripts/api/npm/whoami.mjs +8 -0
- package/runtime/scripts/api/process/hide-child-windows.mjs +31 -0
- package/runtime/scripts/api/process/kill-tree.mjs +22 -0
- package/runtime/scripts/api/process/lib.mjs +125 -0
- package/runtime/scripts/api/process/probe-guard-command.mjs +74 -0
- package/runtime/scripts/api/process/process-list.mjs +28 -0
- package/runtime/scripts/api/process/system-tool.mjs +37 -0
- package/runtime/scripts/gates/canon-digest.mjs +81 -0
- package/runtime/scripts/gates/canon-pins.mjs +16 -0
- package/runtime/scripts/gates/commit-proof.mjs +53 -0
- package/runtime/scripts/gates/gate-input.mjs +98 -0
- package/runtime/scripts/gates/gate.mjs +669 -0
- package/runtime/scripts/gates/grammar-dist.mjs +206 -0
- package/runtime/scripts/gates/runtime-package-selection.mjs +27 -0
- package/runtime/scripts/gates/test-world-run.mjs +254 -0
- package/runtime/scripts/gates/type-impact.mjs +277 -0
- package/runtime/scripts/gates/type-program.mjs +113 -0
- package/runtime/scripts/guards/assigned-command.mjs +12 -0
- package/runtime/scripts/guards/call-rights.mjs +47 -0
- package/runtime/scripts/guards/command-guard.mjs +468 -0
- package/runtime/scripts/guards/command-policy.mjs +342 -0
- package/runtime/scripts/guards/critic-reach.mjs +82 -0
- package/runtime/scripts/guards/deps-guard.mjs +150 -0
- package/runtime/scripts/guards/env-dump-verdict.mjs +89 -0
- package/runtime/scripts/guards/git-pathspec.mjs +225 -0
- package/runtime/scripts/guards/git-policy.mjs +355 -0
- package/runtime/scripts/guards/guards-root.mjs +27 -0
- package/runtime/scripts/guards/hook-install.mjs +343 -0
- package/runtime/scripts/guards/hook-io.mjs +76 -0
- package/runtime/scripts/guards/hook-verdict.mjs +12 -0
- package/runtime/scripts/guards/install-verdict.mjs +41 -0
- package/runtime/scripts/guards/kernel-seat.mjs +63 -0
- package/runtime/scripts/guards/launch-verdict.mjs +74 -0
- package/runtime/scripts/guards/op-starci.mjs +16 -0
- package/runtime/scripts/guards/op-write-scope.mjs +27 -0
- package/runtime/scripts/guards/orca-self-lifecycle.mjs +39 -0
- package/runtime/scripts/guards/process-kill-verdict.mjs +106 -0
- package/runtime/scripts/guards/protected-zone.mjs +56 -0
- package/runtime/scripts/guards/refusals.mjs +27 -0
- package/runtime/scripts/guards/release-definition.mjs +185 -0
- package/runtime/scripts/guards/release-push-gate.mjs +72 -0
- package/runtime/scripts/guards/release-record.mjs +58 -0
- package/runtime/scripts/guards/release-suite-mode.mjs +15 -0
- package/runtime/scripts/guards/rights.mjs +268 -0
- package/runtime/scripts/guards/seat-tools.mjs +47 -0
- package/runtime/scripts/guards/shell-commands.mjs +328 -0
- package/runtime/scripts/guards/supervisor-seat.mjs +80 -0
- package/runtime/scripts/guards/verdict-process.mjs +81 -0
- package/runtime/scripts/hfs/architecture/dead-exports.mjs +10 -10
- package/runtime/scripts/hfs/architecture/function-spec-providers.mjs +1 -1
- package/runtime/scripts/hfs/architecture/operation-contract-roots.mjs +53 -0
- package/runtime/scripts/hfs/architecture/reachability.mjs +1 -1
- package/runtime/scripts/hfs/architecture/sql-owner.mjs +17 -6
- package/runtime/scripts/hfs/architecture/sql-token-forms.mjs +105 -0
- package/runtime/scripts/hfs/architecture/sql-tokens.mjs +38 -52
- package/runtime/scripts/hfs/architecture/supabase-keys.mjs +261 -0
- package/runtime/scripts/hfs/architecture/transport-owner.mjs +49 -3
- package/runtime/scripts/hfs/architecture/typescript.mjs +1 -1
- package/runtime/scripts/hfs/check.mjs +6 -4
- package/runtime/scripts/hfs/coverage-scope.mjs +28 -1
- package/runtime/scripts/hfs/db-restamp-verb.mjs +56 -16
- package/runtime/scripts/hfs/declaration-shape.mjs +4 -4
- package/runtime/scripts/hfs/declaration-slots.mjs +14 -3
- package/runtime/scripts/hfs/manifest-shape.mjs +10 -6
- package/runtime/scripts/hfs/rule-params-shape.mjs +18 -6
- package/runtime/scripts/hfs/rules/a15-findings.mjs +4 -1
- package/runtime/scripts/hfs/rules/bypass-markers.mjs +22 -7
- package/runtime/scripts/hfs/rules/database-migrations.mjs +69 -14
- package/runtime/scripts/hfs/rules/database-queue-sources.mjs +9 -7
- package/runtime/scripts/hfs/rules/database-queues.mjs +68 -18
- package/runtime/scripts/hfs/rules/edition.mjs +56 -12
- package/runtime/scripts/hfs/rules/fe-contract-documents.mjs +1 -10
- package/runtime/scripts/hfs/rules/fe-stack.mjs +12 -7
- package/runtime/scripts/hfs/rules/lite-proof-lane.mjs +1 -1
- package/runtime/scripts/hfs/rules/stacks-lite-backing.mjs +75 -9
- package/runtime/scripts/hfs/rules/stacks-runtime.mjs +1 -1
- package/runtime/scripts/hfs/rules/stacks-swarm.mjs +15 -4
- package/runtime/scripts/hfs/rules/text-integrity.mjs +73 -0
- package/runtime/scripts/hfs/runtime-rules/hook-shape.mjs +74 -0
- package/runtime/scripts/hfs/runtime-rules/release-notes.mjs +44 -0
- package/runtime/scripts/hfs/sealed-members.mjs +3 -3
- package/runtime/scripts/hfs/slot-side-problems.mjs +3 -3
- package/runtime/scripts/hfs/slots.mjs +2 -1
- package/runtime/scripts/hfs/stack-deploy-config.mjs +22 -5
- package/runtime/scripts/hfs/stacks-gate.mjs +28 -7
- package/runtime/scripts/hfs/view.mjs +2 -1
- package/runtime/scripts/lib/app-data.mjs +11 -0
- package/runtime/scripts/lib/bypass-markers.mjs +272 -75
- package/runtime/scripts/lib/check-format.mjs +7 -0
- package/runtime/scripts/lib/cli-arg.mjs +120 -0
- package/runtime/scripts/lib/css-rules.mjs +220 -0
- package/runtime/scripts/lib/dom-tree.mjs +4 -0
- package/runtime/scripts/lib/escape.mjs +16 -0
- package/runtime/scripts/lib/event-items.mjs +22 -0
- package/runtime/scripts/lib/failure-code-template-errors.mjs +161 -0
- package/runtime/scripts/lib/git-dir.mjs +120 -0
- package/runtime/scripts/lib/grammar-vendor-parity.mjs +377 -0
- package/runtime/scripts/lib/guard-command.mjs +24 -0
- package/runtime/scripts/lib/hook-limits.mjs +5 -0
- package/runtime/scripts/lib/interrupt-cleanup.mjs +38 -0
- package/runtime/scripts/lib/js-lex.mjs +200 -0
- package/runtime/scripts/lib/json-formats.mjs +0 -1
- package/runtime/scripts/lib/language.mjs +94 -1
- package/runtime/scripts/lib/loosening-budgets.mjs +44 -0
- package/runtime/scripts/lib/loosening-config.mjs +361 -0
- package/runtime/scripts/lib/loosening-state.mjs +223 -0
- package/runtime/scripts/lib/menu-parts.mjs +11 -0
- package/runtime/scripts/lib/normalize.mjs +25 -0
- package/runtime/scripts/lib/op-gate.mjs +15 -0
- package/runtime/scripts/lib/redact.mjs +208 -0
- package/runtime/scripts/lib/runtime-location.mjs +21 -0
- package/runtime/scripts/lib/runtime-package-inventory.mjs +21 -0
- package/runtime/scripts/lib/runtime-package-manifests.mjs +84 -0
- package/runtime/scripts/lib/runtime-publication-tags.mjs +99 -0
- package/runtime/scripts/lib/seat-env.mjs +43 -0
- package/runtime/scripts/lib/secret-patterns.mjs +58 -9
- package/runtime/scripts/lib/shell-source.mjs +4 -0
- package/runtime/scripts/lib/source-phrases.mjs +34 -0
- package/runtime/scripts/lib/sqlite.mjs +21 -0
- package/runtime/scripts/lib/swarm-stack.mjs +2 -1
- package/runtime/scripts/lib/tar-files.mjs +39 -0
- package/runtime/scripts/lib/ts-analysis.mjs +10 -0
- package/runtime/scripts/lib/worktree-exclude.mjs +35 -0
- package/runtime/scripts/lib/worktree-record.mjs +14 -0
- package/runtime/scripts/machine/artifact-hold.mjs +52 -0
- package/runtime/scripts/machine/ask-receipts.mjs +113 -0
- package/runtime/scripts/machine/evidence-store.mjs +223 -0
- package/runtime/scripts/machine/home.mjs +216 -0
- package/runtime/scripts/machine/host-lock.mjs +184 -0
- package/runtime/scripts/machine/lock-recovery.mjs +55 -0
- package/runtime/scripts/machine/roles-contract.mjs +90 -0
- package/runtime/scripts/machine/runtime-change.mjs +20 -0
- package/runtime/scripts/machine/workflow-tree.mjs +122 -0
- package/runtime/scripts/reconciler/checklist-items.mjs +7 -0
- package/runtime/scripts/reconciler/guard-row.mjs +25 -0
- package/runtime/scripts/work/asset-slot.mjs +284 -0
- package/runtime/scripts/work/brand/brand-colour.mjs +125 -0
- package/runtime/scripts/work/brand/brand-tokens.mjs +167 -0
- package/runtime/scripts/work/brand/brand-value-source.mjs +106 -0
- package/runtime/scripts/work/brand/brand.mjs +892 -0
- package/runtime/scripts/work/draw/draw-dna-anatomy.mjs +60 -0
- package/runtime/scripts/work/draw/draw-dna-findings.mjs +256 -0
- package/runtime/scripts/work/draw/draw-dna-selector.mjs +38 -0
- package/runtime/scripts/work/draw/draw-dna.mjs +483 -0
- package/runtime/scripts/work/draw/draw-layer.mjs +305 -0
- package/runtime/scripts/work/draw/draw-rationale-page.mjs +237 -0
- package/runtime/scripts/work/draw/draw-rationale-ref.mjs +14 -0
- package/runtime/scripts/work/draw/draw-rationale.mjs +353 -0
- package/runtime/scripts/work/draw/draw-source.mjs +412 -0
- package/runtime/scripts/work/draw/draw-taste.mjs +278 -0
- package/runtime/scripts/work/draw/draw-typecheck.mjs +72 -0
- package/runtime/scripts/work/draw/rationale-findings.mjs +205 -0
- package/runtime/scripts/work/draw-grammar.mjs +175 -0
- package/runtime/scripts/work/draw-render-page.mjs +188 -0
- package/runtime/scripts/work/draw-render.mjs +626 -0
- package/runtime/scripts/work/grammar-proposal.mjs +279 -0
- package/runtime/scripts/work/png.mjs +237 -0
- package/runtime/scripts/work/render-tools.mjs +64 -0
- package/runtime/scripts/work/work-io.mjs +119 -0
- package/scaffold/add-inbox-lite.mjs +2 -2
- package/scaffold/add-plan.mjs +40 -13
- package/scaffold/add-queue-lite.mjs +372 -0
- package/scaffold/add.mjs +5 -2
- package/scaffold/app.mjs +1 -2
- package/scaffold/edition-gate.mjs +11 -7
- package/scaffold/lite-exports.mjs +10 -0
- package/scaffold/pattern-file-slots.mjs +33 -0
- package/scaffold/test-world.mjs +1 -1
- package/scaffold/yaml-block-edit.mjs +117 -0
- package/src/main.mjs +5 -4
- package/stack/deploy.mjs +7 -3
- package/stack/post-deploy.mjs +48 -0
- package/sync/index.mjs +10 -0
- package/templates/app/ci-workflows/github/workflows/stack-deploy.yml +1 -1
- package/templates/app/ci-workflows-lite/github/workflows/stack-deploy.yml +1 -1
- package/templates/app/codegen-graphql.mjs.partial +59 -12
- package/templates/app/hooks/husky/pre-commit +2 -2
- package/templates/app/hooks/husky/pre-push +10 -3
- package/templates/app/package-scripts/redis-dev.json +3 -0
- package/templates/app/package-scripts-lite/package.json +1 -0
- package/templates/app/skeleton/.starcistacks/application-stacks.yaml +36 -8
- package/templates/app/skeleton/.starcistacks/dev/README.md +1 -1
- package/templates/app/skeleton/.starcistacks/production/README.md +10 -9
- package/templates/app/skeleton/.starcistacks/production/infra/swarm/postgres-init.sh +21 -0
- package/templates/app/skeleton/.starcistacks/production/infra/swarm/recovery/restore-proof.md +1 -1
- package/templates/app/skeleton/.starcistacks/production/infra/swarm/releases/images.lock.yaml +1 -0
- package/templates/app/skeleton/.starcistacks/production/infra/swarm/stack.yaml +47 -5
- package/templates/app/skeleton/.starcistacks/production/runtime/env/KEYS.md +5 -3
- package/templates/app/skeleton/README.md +2 -0
- package/templates/app/skeleton-lite/.starcistacks/application-stacks.yaml +5 -0
- package/templates/app/skeleton-lite/.starcistacks/dev/README.md +2 -2
- package/templates/app/skeleton-lite/.starcistacks/production/README.md +1 -1
- package/templates/app/skeleton-lite/README.md +1 -1
- package/templates/be/inbox/platform/client-operation-outcomes.sql.tpl +18 -0
- package/templates/be/inbox/platform/event-bus/errors/event-bus.error.ts.tpl +16 -0
- package/templates/be/inbox/platform/event-bus/event-bus.contracts.ts.tpl +10 -0
- package/templates/be/inbox/platform/event-bus/event-bus.port.ts.tpl +1 -1
- package/templates/be/inbox/platform/event-bus/event-bus.service.spec.ts.tpl +15 -3
- package/templates/be/inbox/platform/event-bus/event-bus.service.ts.tpl +11 -3
- package/templates/be/inbox/platform/event-bus/index.ts.tpl +2 -0
- package/templates/be/inbox/platform/event-bus/messages/event-bus.messages.ts.tpl +7 -0
- package/templates/be/inbox/platform/event-bus/persistence/event-bus.sql.ts.tpl +2 -2
- package/templates/be/inbox/platform/idempotency/errors/idempotency.error.ts.tpl +19 -0
- package/templates/be/inbox/platform/idempotency/index.ts.tpl +2 -0
- package/templates/be/inbox/platform/idempotency/messages/idempotency.messages.ts.tpl +13 -0
- package/templates/be/inbox/platform/inbox/client-operation.policy.spec.ts.tpl +32 -0
- package/templates/be/inbox/platform/inbox/client-operation.policy.ts.tpl +17 -0
- package/templates/be/inbox/platform/inbox/errors/inbox.error.ts.tpl +22 -0
- package/templates/be/inbox/platform/inbox/inbox.port.ts.tpl +21 -0
- package/templates/be/inbox/platform/inbox/inbox.service.spec.ts.tpl +334 -11
- package/templates/be/inbox/platform/inbox/inbox.service.ts.tpl +55 -4
- package/templates/be/inbox/platform/inbox/index.ts.tpl +2 -0
- package/templates/be/inbox/platform/inbox/messages/inbox.messages.ts.tpl +15 -0
- package/templates/be/inbox/platform/inbox/persistence/inbox.rows.ts.tpl +33 -0
- package/templates/be/inbox/platform/inbox/persistence/inbox.sql.ts.tpl +26 -0
- package/templates/be/inbox/platform/inbox/request-fingerprint.policy.spec.ts.tpl +76 -0
- package/templates/be/inbox/platform/inbox/request-fingerprint.policy.ts.tpl +36 -0
- package/templates/be/inbox/platform/migration.sql.tpl +1 -0
- package/templates/be/inbox/service.spec.ts.tpl +4 -4
- package/templates/be/inbox/service.ts.tpl +3 -1
- package/templates/be/inbox/webhook-door.spec.ts.tpl +3 -2
- package/templates/be/inbox/webhook-door.ts.tpl +3 -2
- package/templates/be/patterns/event-bus/platform/errors/event-bus.error.ts.tpl +3 -0
- package/templates/be/patterns/event-bus/platform/event-bus.contracts.ts.tpl +10 -0
- package/templates/be/patterns/event-bus/platform/event-bus.port.ts.tpl +2 -2
- package/templates/be/patterns/event-bus/platform/event-bus.service.spec.ts.tpl +16 -3
- package/templates/be/patterns/event-bus/platform/event-bus.service.ts.tpl +11 -3
- package/templates/be/patterns/event-bus/platform/event-envelope.policy.spec.ts.tpl +139 -50
- package/templates/be/patterns/event-bus/platform/event-envelope.policy.ts.tpl +25 -2
- package/templates/be/patterns/event-bus/platform/event-relay.service.spec.ts.tpl +139 -78
- package/templates/be/patterns/event-bus/platform/event-relay.service.ts.tpl +10 -6
- package/templates/be/patterns/event-bus/platform/event-runner.service.spec.ts.tpl +262 -159
- package/templates/be/patterns/event-bus/platform/event-runner.service.ts.tpl +32 -5
- package/templates/be/patterns/event-bus/platform/messages/event-bus.messages.ts.tpl +2 -0
- package/templates/be/patterns/event-bus/platform/persistence/entities/event-outbox.entity.ts.tpl +5 -1
- package/templates/be/patterns/event-bus/platform/persistence/event-bus.rows.ts.tpl +2 -0
- package/templates/be/patterns/event-bus/platform/persistence/event-bus.sql.ts.tpl +4 -4
- package/templates/be/patterns/event-bus/platform/persistence/migrations/1789800009000-create-event-outbox.ts.tpl +1 -0
- package/templates/be/patterns/idempotency/platform/idempotency/errors/idempotency.error.ts.tpl +19 -0
- package/templates/be/patterns/idempotency/platform/idempotency/index.ts.tpl +2 -0
- package/templates/be/patterns/idempotency/platform/idempotency/messages/idempotency.messages.ts.tpl +13 -0
- package/templates/be/patterns/idempotency/platform/inbox/client-operation.policy.spec.ts.tpl +32 -0
- package/templates/be/patterns/idempotency/platform/inbox/client-operation.policy.ts.tpl +17 -0
- package/templates/be/patterns/idempotency/platform/inbox/client-outcome-backfill.client.spec.ts.tpl +66 -0
- package/templates/be/patterns/idempotency/platform/inbox/client-outcome-backfill.client.ts.tpl +24 -0
- package/templates/be/patterns/idempotency/platform/inbox/delivery-claim-backfill.client.spec.ts.tpl +60 -0
- package/templates/be/patterns/idempotency/platform/inbox/delivery-claim-backfill.client.ts.tpl +12 -0
- package/templates/be/patterns/idempotency/platform/inbox/delivery-claim-release.client.spec.ts.tpl +49 -0
- package/templates/be/patterns/idempotency/platform/inbox/delivery-claim-release.client.ts.tpl +12 -0
- package/templates/be/patterns/idempotency/platform/inbox/effectful.decorators.ts.tpl +7 -0
- package/templates/be/patterns/idempotency/platform/inbox/errors/inbox.error.ts.tpl +22 -0
- package/templates/be/patterns/idempotency/platform/inbox/inbox.decorators.ts.tpl +17 -0
- package/templates/be/patterns/idempotency/platform/inbox/inbox.module-definition.ts.tpl +7 -0
- package/templates/be/patterns/idempotency/platform/inbox/inbox.module.ts.tpl +28 -0
- package/templates/be/patterns/idempotency/platform/inbox/inbox.options.ts.tpl +7 -0
- package/templates/be/patterns/idempotency/platform/inbox/inbox.port.ts.tpl +44 -0
- package/templates/be/patterns/idempotency/platform/inbox/inbox.service.spec.ts.tpl +388 -0
- package/templates/be/patterns/idempotency/platform/inbox/inbox.service.ts.tpl +77 -0
- package/templates/be/patterns/idempotency/platform/inbox/index.ts.tpl +10 -0
- package/templates/be/patterns/idempotency/platform/inbox/messages/inbox.messages.ts.tpl +15 -0
- package/templates/be/patterns/idempotency/platform/inbox/persistence/connection.ts.tpl +9 -0
- package/templates/be/patterns/idempotency/platform/inbox/persistence/entities/inbox-claim.entity.ts.tpl +25 -0
- package/templates/be/patterns/idempotency/platform/inbox/persistence/inbox.rows.ts.tpl +33 -0
- package/templates/be/patterns/idempotency/platform/inbox/persistence/inbox.sql.ts.tpl +39 -0
- package/templates/be/patterns/idempotency/platform/inbox/persistence/migrations/1789800005000-create-inbox-claims.ts.tpl +21 -0
- package/templates/be/patterns/idempotency/platform/inbox/persistence/migrations/1792800000000-client-operation-outcomes.ts.tpl +21 -0
- package/templates/be/patterns/idempotency/platform/inbox/request-fingerprint.policy.spec.ts.tpl +76 -0
- package/templates/be/patterns/idempotency/platform/inbox/request-fingerprint.policy.ts.tpl +36 -0
- package/templates/be/patterns/jobs/platform/fenced.processor.spec.ts.tpl +1 -0
- package/templates/be/patterns/jobs/platform/job-claim.service.spec.ts.tpl +4 -3
- package/templates/be/patterns/jobs/platform/job-claim.service.ts.tpl +2 -0
- package/templates/be/patterns/jobs/platform/job-runner.service.spec.ts.tpl +20 -2
- package/templates/be/patterns/jobs/platform/job-runner.service.ts.tpl +1 -0
- package/templates/be/patterns/jobs/platform/jobs.contracts.ts.tpl +4 -0
- package/templates/be/patterns/jobs/platform-lite/jobs.index.ts.tpl +10 -0
- package/templates/be/patterns/jobs/platform-lite/jobs.sql.tpl +44 -0
- package/templates/be/patterns/jobs/platform-lite/persistence.jobs.sql.ts.tpl +33 -0
- package/templates/be/patterns/queues/platform/bullmq-queue-transport.client.spec.ts.tpl +203 -18
- package/templates/be/patterns/queues/platform/bullmq-queue-transport.client.ts.tpl +78 -22
- package/templates/be/patterns/queues/platform/errors/queue.error.ts.tpl +19 -0
- package/templates/be/patterns/queues/platform/messages/queue.messages.ts.tpl +13 -0
- package/templates/be/patterns/queues/platform/persistence.migration.ts.tpl +1 -0
- package/templates/be/patterns/queues/platform/persistence.queue-outbox.entity.ts.tpl +4 -0
- package/templates/be/patterns/queues/platform/persistence.queue.rows.ts.tpl +2 -0
- package/templates/be/patterns/queues/platform/persistence.queue.sql.ts.tpl +4 -4
- package/templates/be/patterns/queues/platform/queue-outbox.service.spec.ts.tpl +14 -2
- package/templates/be/patterns/queues/platform/queue-outbox.service.ts.tpl +5 -2
- package/templates/be/patterns/queues/platform/queue-relay.service.spec.ts.tpl +72 -74
- package/templates/be/patterns/queues/platform/queue-relay.service.ts.tpl +1 -1
- package/templates/be/patterns/queues/platform/queue-transport.port.ts.tpl +23 -8
- package/templates/be/patterns/queues/platform/queue-worker.service.spec.ts.tpl +29 -8
- package/templates/be/patterns/queues/platform/queue-worker.service.ts.tpl +7 -3
- package/templates/be/patterns/queues/platform/queue.contracts.ts.tpl +5 -0
- package/templates/be/patterns/queues/platform/queue.index.ts.tpl +2 -0
- package/templates/be/patterns/queues/platform/queue.log-events.ts.tpl +4 -0
- package/templates/be/patterns/queues/platform/queue.module.ts.tpl +2 -1
- package/templates/be/patterns/queues/platform/queue.port.ts.tpl +1 -1
- package/templates/be/patterns/queues/platform-lite/bullmq-queue-transport.client.spec.ts.tpl +417 -0
- package/templates/be/patterns/queues/platform-lite/bullmq-queue-transport.client.ts.tpl +172 -0
- package/templates/be/patterns/queues/platform-lite/persistence.queue.sql.ts.tpl +12 -0
- package/templates/be/patterns/queues/platform-lite/queue-outbox.sql.tpl +32 -0
- package/templates/be/patterns/queues/platform-lite/queue-relay.service.spec.ts.tpl +148 -0
- package/templates/be/patterns/queues/platform-lite/queue-relay.service.ts.tpl +51 -0
- package/templates/be/patterns/queues/platform-lite/queue-transport.port.ts.tpl +163 -0
- package/templates/be/patterns/queues/platform-lite/queue.config.ts.tpl +17 -0
- package/templates/be/patterns/queues/platform-lite/queue.error.ts.tpl +25 -0
- package/templates/be/patterns/queues/platform-lite/queue.index.ts.tpl +8 -0
- package/templates/be/patterns/queues/platform-lite/queue.messages.ts.tpl +21 -0
- package/templates/be/patterns/queues/platform-lite/queue.module.ts.tpl +74 -0
- package/templates/be/patterns/queues/platform-lite/queue.options.ts.tpl +38 -0
- package/templates/be/patterns/queues/queue.queue.ts.tpl +2 -2
- package/templates/be/patterns/reactors/application.contracts.ts.tpl +2 -0
- package/templates/be/patterns/reactors/consumer.ts.tpl +5 -1
- package/templates/be/platform/graphql/graphql.contracts.ts +2 -1
- package/templates/be/platform/graphql/localize-errors.mapper.spec.ts +1 -1
- package/templates/be/skeleton/apps/__app__/src/compose/platform.ts +6 -1
- package/templates/be/skeleton/apps/__app__/src/main.ts +7 -4
- package/templates/be/skeleton/apps/cli/src/compose/platform.ts +4 -0
- package/templates/be/skeleton/apps/cli/src/main.ts +7 -4
- package/templates/be/skeleton/src/modules/platform/database/index.ts +1 -1
- package/templates/be/skeleton/src/modules/platform/http/errors/http.error.ts +22 -0
- package/templates/be/skeleton/src/modules/platform/http/fetch-http-client.client.spec.ts +235 -0
- package/templates/be/skeleton/src/modules/platform/http/fetch-http-client.client.ts +85 -0
- package/templates/be/skeleton/src/modules/platform/http/graphql-call.mapper.spec.ts +92 -0
- package/templates/be/skeleton/src/modules/platform/http/graphql-call.mapper.ts +52 -0
- package/templates/be/skeleton/src/modules/platform/http/http.decorators.ts +9 -0
- package/templates/be/skeleton/src/modules/platform/http/http.module-definition.ts +7 -0
- package/templates/be/skeleton/src/modules/platform/http/http.module.ts +19 -0
- package/templates/be/skeleton/src/modules/platform/http/http.options.ts +2 -0
- package/templates/be/skeleton/src/modules/platform/http/http.port.ts +40 -0
- package/templates/be/skeleton/src/modules/platform/http/index.ts +7 -0
- package/templates/be/skeleton/src/modules/platform/http/messages/http.messages.ts +15 -0
- package/templates/be/skeleton/src/modules/platform/ids/ids.decorators.ts +9 -0
- package/templates/be/skeleton/src/modules/platform/ids/ids.module-definition.ts +7 -0
- package/templates/be/skeleton/src/modules/platform/ids/ids.module.ts +19 -0
- package/templates/be/skeleton/src/modules/platform/ids/ids.options.ts +2 -0
- package/templates/be/skeleton/src/modules/platform/ids/ids.port.ts +5 -0
- package/templates/be/skeleton/src/modules/platform/ids/index.ts +4 -0
- package/templates/be/skeleton/src/modules/platform/ids/system-ids.service.spec.ts +15 -0
- package/templates/be/skeleton/src/modules/platform/ids/system-ids.service.ts +10 -0
- package/templates/be/skeleton/src/modules/platform/logging/correlation-request.policy.spec.ts +59 -0
- package/templates/be/skeleton/src/modules/platform/logging/correlation-request.policy.ts +21 -0
- package/templates/be/skeleton/src/modules/platform/logging/correlation.contracts.ts +16 -0
- package/templates/be/skeleton/src/modules/platform/logging/correlation.policy.spec.ts +150 -0
- package/templates/be/skeleton/src/modules/platform/logging/correlation.policy.ts +42 -0
- package/templates/be/skeleton/src/modules/platform/logging/correlation.port.ts +15 -0
- package/templates/be/skeleton/src/modules/platform/logging/correlation.service.spec.ts +23 -0
- package/templates/be/skeleton/src/modules/platform/logging/correlation.service.ts +28 -0
- package/templates/be/skeleton/src/modules/platform/logging/index.ts +14 -1
- package/templates/be/skeleton/src/modules/platform/logging/json-logger.service.spec.ts +39 -6
- package/templates/be/skeleton/src/modules/platform/logging/json-logger.service.ts +15 -3
- package/templates/be/skeleton/src/modules/platform/logging/logging.decorators.ts +17 -2
- package/templates/be/skeleton/src/modules/platform/logging/logging.log-events.ts +13 -1
- package/templates/be/skeleton/src/modules/platform/logging/logging.module.ts +13 -3
- package/templates/be/skeleton/src/modules/platform/logging/nest-logger.service.spec.ts +69 -0
- package/templates/be/skeleton/src/modules/platform/logging/nest-logger.service.ts +48 -0
- package/templates/be/skeleton/src/modules/platform/primitives/index.ts +1 -0
- package/templates/be/skeleton/src/modules/platform/primitives/record.policy.spec.ts +12 -0
- package/templates/be/skeleton/src/modules/platform/primitives/record.policy.ts +3 -0
- package/templates/be/skeleton-lite/apps/api/src/compose/platform.ts +6 -1
- package/templates/be/skeleton-lite/apps/cli/src/compose/platform.ts +4 -0
- package/templates/be/skeleton-lite/src/modules/platform/database/index.ts +1 -0
- package/templates/be/skeleton-lite/src/modules/platform/logging/index.ts +14 -1
- package/templates/be/skeleton-lite/src/modules/platform/logging/logging.log-events.ts +12 -0
- package/templates/be/skeleton-lite/src/modules/platform/primitives/index.ts +2 -0
- package/templates/be/test-world/world/test-apps.options.ts.tpl +2 -0
- package/templates/be/test-world/world/test-world.config.ts.tpl +1 -0
- package/upgrade/check.mjs +12 -135
- package/upgrade/file-state.mjs +1 -16
- package/upgrade/index.mjs +34 -361
- package/runtime/scripts/lib/check-code-loosening.mjs +0 -128
- package/runtime/scripts/lib/gate-loosening.mjs +0 -292
- package/templates/app/upgrade-full/.starcistacks/application-stacks.yaml +0 -89
- package/templates/app/upgrade-full/.starcistacks/dev/README.md +0 -16
- package/templates/app/upgrade-full/.starcistacks/dev/infra/compose/api.yaml +0 -13
- package/templates/app/upgrade-full/.starcistacks/dev/infra/compose/compose.yaml +0 -3
- package/templates/app/upgrade-full/.starcistacks/dev/infra/compose/postgres.yaml +0 -12
- package/templates/app/upgrade-full/.starcistacks/dev/infra/metadata.json +0 -7
- package/templates/be/skeleton-lite/apps/api/src/main.ts +0 -26
- package/templates/be/upgrade-full/apps/cli/src/app.module.ts +0 -12
- package/templates/be/upgrade-full/apps/cli/src/cli.env.ts +0 -7
- package/templates/be/upgrade-full/apps/cli/src/compose/cli.ts +0 -5
- package/templates/be/upgrade-full/apps/cli/src/compose/platform.ts +0 -9
- package/templates/be/upgrade-full/apps/cli/src/main.ts +0 -29
- package/templates/be/upgrade-full/src/features/cli/cli.module.ts +0 -7
- package/templates/be/upgrade-full/src/features/cli/migrate/subs/run.cli.ts +0 -23
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
// refuse.mjs — the refusal Error every verb raises: a message plus a stable `code` (and any extra fields the
|
|
2
|
+
// caller attaches). `refuse` builds it, `fail` throws it, `need` throws it when a required condition is false.
|
|
3
|
+
|
|
4
|
+
/** An Error carrying `code` and `extra` fields; callers `throw` it or hand it to a result row. */
|
|
5
|
+
export const refuse = (message, code, extra = {}) => Object.assign(new Error(message), { code, ...extra });
|
|
6
|
+
|
|
7
|
+
/** Throws the refusal `refuse` builds — the spelling used where refusing is the whole statement. */
|
|
8
|
+
export const fail = (message, code, extra = {}) => { throw refuse(message, code, extra); };
|
|
9
|
+
|
|
10
|
+
/** Throws `refuse(message, code)` when `ok` is falsy — the assertion spelling of a refusal. */
|
|
11
|
+
export const need = (ok, message, code) => { if (!ok) throw refuse(message, code); };
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
schema: starci/canon-pins@1
|
|
2
2
|
purpose: >-
|
|
3
|
-
The exact version of every dependency
|
|
3
|
+
The exact version of every shared dependency in the StarCi family, including package-owned runtime dependencies. One version per dependency for the whole
|
|
4
4
|
family. Raising a version is a change to this file first (with the package bump when it is a @starci package),
|
|
5
5
|
then the repositories' own upgrade lane (each sets the exact version and reinstalls; nothing else installs a @starci package). Read on 2026-09-29 from the packages under
|
|
6
6
|
.claude/packages and from the installed node_modules of the six product repositories; where they disagreed the
|
|
@@ -10,7 +10,8 @@ purpose: >-
|
|
|
10
10
|
two, pinned here with a why (2026-10-01: every such conflict but graphql was already pinned). The runtime's example apps
|
|
11
11
|
merged the same way on 2026-10-01: no dependency outside this file was declared at two versions across their sides, so
|
|
12
12
|
every choice is a pin (each side's older @starci pins and graphql moved to the version here). `side` names the side whose code uses
|
|
13
|
-
the dependency; the app root package.json
|
|
13
|
+
the dependency; the app root package.json declares the direct dependencies and tools its sides need. Package-owned
|
|
14
|
+
runtime dependencies are declared by their package, not by the app.
|
|
14
15
|
pins:
|
|
15
16
|
# --- @starci packages. Every @starci package is a PUBLISHED npm package (install: registry): a product repository
|
|
16
17
|
# installs the exact pinned version from the npm registry in the root and every workspace package.json, never `file:`.
|
|
@@ -22,28 +23,28 @@ pins:
|
|
|
22
23
|
source: packages/heroicons/package.json
|
|
23
24
|
why: 'StarCi custom Heroicons-compatible cuts; eslint-canon-fe (icon.mjs) admits @starci/heroicons/24/outline and /16/solid as icon sources, so an app that uses them gets this exact version.'
|
|
24
25
|
'@starci/grammar':
|
|
25
|
-
version: 0.
|
|
26
|
+
version: 0.12.1
|
|
26
27
|
group: starci
|
|
27
28
|
install: registry
|
|
28
29
|
side: fe
|
|
29
30
|
source: packages/grammar/package.json
|
|
30
31
|
why: 'the grammar front ends read: the brand layer sets `--font-sans` and `--font-mono` and the grammar reads them; it carries the Input tel kind, the copyable and read-only Input, the IconButton disclosure props and count badge, ChatBubble, FillViewport, Textarea mentions and Enter-to-send, the leading PrimaryRailLayout rail, the plate-less Image, ListRow, the soft Alert, Progress steps, the floating primary IconButton, FlowGraph, the STATE-8 loading views and the bordered selectable TagGroup chips. The runtime source version wins for a @starci package.'
|
|
31
32
|
'@starci/eslint-canon-be':
|
|
32
|
-
version: 3.4.
|
|
33
|
+
version: 3.4.43
|
|
33
34
|
group: starci
|
|
34
35
|
install: registry
|
|
35
36
|
side: be
|
|
36
37
|
source: packages/eslint/be/package.json
|
|
37
38
|
why: 'the back-end ESLint canon: `loadHfs(import.meta.url)` of be/eslint.config.mjs finds the app-root hfs.json (kind app) and gives every linted file the view of the be side, and the project graph is built per side; its bundled runtime copies (slots, canon-pins, failure codes, the architecture machine) put .starcistacks and .sops.yaml at the app root; `starciBeConfig({ hfs: loadHfs(import.meta.url) })` is the typed factory and the BE-CONVENTION laws are its rules.'
|
|
38
39
|
'@starci/eslint-canon-fe':
|
|
39
|
-
version: 8.4.
|
|
40
|
+
version: 8.4.42
|
|
40
41
|
group: starci
|
|
41
42
|
install: registry
|
|
42
43
|
side: fe
|
|
43
44
|
source: packages/eslint/fe/package.json
|
|
44
45
|
why: 'the front-end ESLint canon: `loadHfs(import.meta.url)` of fe/eslint.config.mjs finds the app-root hfs.json (kind app) and gives every linted file the view of the fe side, and the project graph is built per side; its bundled runtime copies (slots, canon-pins, failure codes, the architecture machine) put .starcistacks and .sops.yaml at the app root; the front end has no tests (FE_NO_TESTS R97 in hfs) and no-vietnamese-in-source (R91) applies.'
|
|
45
46
|
'@starci/stylelint-canon':
|
|
46
|
-
version: 2.0.
|
|
47
|
+
version: 2.0.11
|
|
47
48
|
group: starci
|
|
48
49
|
install: registry
|
|
49
50
|
side: fe
|
|
@@ -62,7 +63,7 @@ pins:
|
|
|
62
63
|
side: both
|
|
63
64
|
source: packages/prettier-config/package.json
|
|
64
65
|
'@starci/jest-preset':
|
|
65
|
-
version: 2.3.
|
|
66
|
+
version: 2.3.6
|
|
66
67
|
group: starci
|
|
67
68
|
install: registry
|
|
68
69
|
side: be
|
|
@@ -76,14 +77,14 @@ pins:
|
|
|
76
77
|
source: packages/test-world/package.json
|
|
77
78
|
why: 'the shared e2e library of every back end (R47, R48), a devDependency of every back end: the warm stack behind toxiproxy, the network-edge fakes, the Nest boot, the typed useTestWorld handle, useSandbox for contract specs and the outage lock. Kafka is real own infra (the one digest-pinned apache/kafka KRaft image, a broker listener and proxy per slot, slot-prefixed topics, consumer groups and client ids) and Postgres is schema-per-context (a schema and a login role per context in a shared database). Each worker has its own data slot (<ns>_w<k>) with its own databases, Keycloak realm, leased Redis DB, bucket/collection/topic prefixes, fakes host, toxiproxy proxies and outage lock; a run provisions min(jest workers, workers cap, default 2) slots, and state file protocol 2 pairs exactly with @starci/jest-preset (TEST_WORLD_PAIR_MISMATCH otherwise). A modules world boots real peer apps beside its modules, world.apps.<name>.during(fn) is the outage of a peer app, w.keycloak.clientSecret(client) answers the run-generated secret of a confidential realm client, world.keycloak.events/sessions read the realm user events and live sessions, world.infra.postgresql.connection(name) takes one database connection down while the others serve, and world.resolve and scope.resolve take any Nest token. Every path a declaration names (`stack`, seeds, the realm, Dockerfiles) resolves from the app root (the directory of hfs.json); the globalSetup registers the path aliases as TypeScript resolves them. Its CLI main is exported at ./cli for starci app stack.'
|
|
78
79
|
'@starci/cli':
|
|
79
|
-
version: 1.7.
|
|
80
|
+
version: 1.7.34
|
|
80
81
|
group: starci
|
|
81
82
|
install: registry
|
|
82
83
|
side: both
|
|
83
84
|
source: packages/cli/package.json
|
|
84
85
|
why: 'the only StarCi command package; product repositories install it for starci app, while @starci/hfs remains its pinned transitive implementation.'
|
|
85
86
|
'@starci/hfs':
|
|
86
|
-
version: 4.7.
|
|
87
|
+
version: 4.7.34
|
|
87
88
|
group: starci
|
|
88
89
|
install: registry
|
|
89
90
|
side: both
|
|
@@ -238,6 +239,11 @@ pins:
|
|
|
238
239
|
group: framework
|
|
239
240
|
side: be
|
|
240
241
|
why: 'the Postgres driver behind TypeORM; the reference app declares ^8.12.0 and resolves 8.23.1.'
|
|
242
|
+
bullmq:
|
|
243
|
+
version: 6.3.11
|
|
244
|
+
group: framework
|
|
245
|
+
side: be
|
|
246
|
+
why: 'the queue transport of both editions behind platform/queue (ruling:R212/case-10); starci app add queue|job declares it in a lite app together with its Redis, and both example apps resolve this version.'
|
|
241
247
|
reflect-metadata:
|
|
242
248
|
version: 0.2.2
|
|
243
249
|
group: framework
|
|
@@ -305,6 +311,11 @@ pins:
|
|
|
305
311
|
group: framework
|
|
306
312
|
side: fe
|
|
307
313
|
why: 'the GraphQL client of every front end (fe-stack graphql): auth and no-auth clients with the link chain in modules/api/graphql; version read from the starci-academy package-lock on 2026-10-13.'
|
|
314
|
+
graphql-ws:
|
|
315
|
+
version: 6.2.1
|
|
316
|
+
group: framework
|
|
317
|
+
side: both
|
|
318
|
+
why: 'the subscription transport: the front end opens it only in the Apollo clients folder (fe-stack graphql, GraphQLWsLink of @apollo/client/link/subscriptions) and the back end serves it only from platform/realtime; the version resolved by the full-app lockfile on 2026-10-24.'
|
|
308
319
|
'@graphql-codegen/cli':
|
|
309
320
|
version: 7.4.6
|
|
310
321
|
group: tooling
|
|
@@ -370,6 +381,16 @@ pins:
|
|
|
370
381
|
group: ui
|
|
371
382
|
side: fe
|
|
372
383
|
why: 'the base of the one application icon set (fe-stack icons, with @starci/heroicons for the glyphs it lacks); eslint-canon-fe (icon.mjs) admits @heroicons/react/24/outline and /16/solid.'
|
|
384
|
+
'@dicebear/core':
|
|
385
|
+
version: 10.4.0
|
|
386
|
+
group: ui
|
|
387
|
+
side: fe
|
|
388
|
+
why: 'runtime dependency of @starci/grammar for its seeded circle avatars; apps use the Avatar seed prop and never declare or import @dicebear/*; pinned with @dicebear/styles.'
|
|
389
|
+
'@dicebear/styles':
|
|
390
|
+
version: 10.4.0
|
|
391
|
+
group: ui
|
|
392
|
+
side: fe
|
|
393
|
+
why: 'runtime dependency of @starci/grammar supplying its fixed avatar DNA style; apps use the Avatar seed prop and never declare or import @dicebear/*; pinned with @dicebear/core.'
|
|
373
394
|
'next-themes':
|
|
374
395
|
version: 0.4.6
|
|
375
396
|
group: ui
|
|
@@ -481,6 +502,16 @@ pins:
|
|
|
481
502
|
group: framework
|
|
482
503
|
side: be
|
|
483
504
|
why: 'the Apollo driver of @nestjs/graphql; the full-app resolution on 2026-10-13. Stays on 13.x with @nestjs/graphql (accepted advisory, major deferred to alpha.19).'
|
|
505
|
+
'@aws-sdk/client-s3':
|
|
506
|
+
version: 3.1150.0
|
|
507
|
+
group: framework
|
|
508
|
+
side: be
|
|
509
|
+
why: 'the S3 transport of integrations/object-storage, the one ObjectStorage adapter of both editions (MinIO, S3, Spaces, Supabase Storage); 3.1150.0 is the release of 2026-10-12, chosen over newer ones that had not aged two weeks.'
|
|
510
|
+
'@aws-sdk/s3-request-presigner':
|
|
511
|
+
version: 3.1150.0
|
|
512
|
+
group: framework
|
|
513
|
+
side: be
|
|
514
|
+
why: 'signs the presigned PUT and GET of integrations/object-storage locally, the same release as client-s3.'
|
|
484
515
|
'@apollo/server':
|
|
485
516
|
version: 5.5.1
|
|
486
517
|
group: framework
|
|
@@ -496,6 +527,31 @@ pins:
|
|
|
496
527
|
group: framework
|
|
497
528
|
side: be
|
|
498
529
|
why: 'the socket.io platform of @nestjs/websockets; the @nestjs/core pin line.'
|
|
530
|
+
socket.io:
|
|
531
|
+
version: 4.8.3
|
|
532
|
+
group: framework
|
|
533
|
+
side: be
|
|
534
|
+
why: 'the socket.io server the IoAdapter of platform/realtime builds (types and the adapter contract); the exact version @nestjs/platform-socket.io 11.2.5 depends on, so the workspace keeps one copy (4.8.4 is the latest on 2026-10-24).'
|
|
535
|
+
'@socket.io/postgres-adapter':
|
|
536
|
+
version: 0.5.0
|
|
537
|
+
group: framework
|
|
538
|
+
side: be
|
|
539
|
+
why: 'the stateless socket.io adapter of a back end without Redis that runs several api replicas (LISTEN/NOTIFY, no sticky sessions, websocket only), imported only by platform/realtime (knowledge/patterns/be/realtime.yaml BE-REALTIME-7); the latest registry version on 2026-10-24.'
|
|
540
|
+
'@socket.io/redis-adapter':
|
|
541
|
+
version: 8.3.0
|
|
542
|
+
group: framework
|
|
543
|
+
side: be
|
|
544
|
+
why: 'the sharded Redis adapter (createShardedAdapter, Redis 7 or later) of a back end with Redis declared that runs several api replicas, imported only by platform/realtime; the latest registry version on 2026-10-24.'
|
|
545
|
+
ioredis:
|
|
546
|
+
version: 5.11.1
|
|
547
|
+
group: framework
|
|
548
|
+
side: be
|
|
549
|
+
why: 'the one Redis client of a back end: the cache, the optional peer bullmq loads for the queue of platform/queue, and the Redis hub and sharded socket.io adapter of platform/realtime (its docs recommend ioredis over redis); the latest 5.x on 2026-10-24, because typeorm 0.3.31 declares ioredis ^5.0.4 as a peer and ioredis 6.0.0 (the latest) does not satisfy it.'
|
|
550
|
+
'@types/pg':
|
|
551
|
+
version: 8.23.1
|
|
552
|
+
group: framework
|
|
553
|
+
side: be
|
|
554
|
+
why: 'the types of the pg driver the Postgres hub of platform/realtime opens a LISTEN connection with; the pg pin line, the latest registry version on 2026-10-24.'
|
|
499
555
|
'@as-integrations/express5':
|
|
500
556
|
version: 1.1.2
|
|
501
557
|
group: framework
|
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
schema: starci/design-truths@1
|
|
2
|
+
id: hfs.design-truths
|
|
3
|
+
title: The design truths - the one list of exceptions the loosening state check allows
|
|
4
|
+
purpose: |
|
|
5
|
+
A loosening is always red (owner ruling loosening-always-red). The state check (scripts/lib/loosening-state.mjs, self-check loosening-state,
|
|
6
|
+
also the app gate's bypass rule) reads the tree as it stands and refuses any bypass, any ignore or exclude entry, any lowered threshold and any
|
|
7
|
+
exception file the canon does not derive. This file is where the canon says what it does derive and allow: every exception is here and nowhere
|
|
8
|
+
else, each with the owner ruling that makes it a design truth rather than a loosening, and each list entry bound to the files it holds for.
|
|
9
|
+
Changing this file is an owner decision (owner ruling loosening-state-check, 2026-10-24): the latest owner ruling that amends it records its
|
|
10
|
+
sha256 (pins), and the self-check is red whenever the file's digest is not the recorded one, so an edit never lands on a lane's say-so.
|
|
11
|
+
|
|
12
|
+
# The files that may spell a forbidden token on purpose (the fixtures of the specs of this checker) and the vendored dependency copy. They are not read
|
|
13
|
+
# by the tree check; each is pinned by digest in the latest owner ruling, only a package spec of packages/hfs/src may import the fixtures, and
|
|
14
|
+
# a vendored file is a dependency copy, not authored source.
|
|
15
|
+
fixtureFiles:
|
|
16
|
+
- packages/hfs/src/fixtures/loosening/forms.mjs
|
|
17
|
+
- packages/hfs/src/fixtures/loosening/swallows.mjs
|
|
18
|
+
- packages/hfs/src/fixtures/loosening/adversarial.mjs
|
|
19
|
+
vendored:
|
|
20
|
+
- {path: engine/yaml.mjs, slot: runtime.vendored-yaml}
|
|
21
|
+
|
|
22
|
+
# What no gate reads: build output, generated records and sealed custody. An ignore or exclude entry that names only these is no loosening. A group
|
|
23
|
+
# with anyDepth holds at any depth (a folder of that name anywhere is output); the others are rooted (only the spelling at the root of the file's own
|
|
24
|
+
# tree, never a glob that reaches a domain folder of that name).
|
|
25
|
+
outsideTheGates:
|
|
26
|
+
- id: build-output
|
|
27
|
+
cite: {ruling: design-truths-confirmed}
|
|
28
|
+
anyDepth: true
|
|
29
|
+
entries: [node_modules, dist, build, coverage, .next, storybook-static, "*.tsbuildinfo", __generated__, .starci]
|
|
30
|
+
- id: root-output-and-records
|
|
31
|
+
cite: {ruling: design-truths-confirmed}
|
|
32
|
+
entries: [reports, contracts, supabase/types, .starcistacks, .starciwork, package-lock.json]
|
|
33
|
+
|
|
34
|
+
# The gate limits of the Sonar gate (knowledge/sonar-gate.yaml): a floor is a number that may not be lower, a ceiling a number that may not be higher.
|
|
35
|
+
gateLimits:
|
|
36
|
+
file: knowledge/sonar-gate.yaml
|
|
37
|
+
cite: {ruling: design-truths-confirmed}
|
|
38
|
+
floors: {minPercent: 100, minReviewedPercent: 100}
|
|
39
|
+
ceilings: {maxPercent: 3, max: 0, unreviewedMax: 0, ignoreBelowChangedLines: 0}
|
|
40
|
+
|
|
41
|
+
# The numeric budgets of the slot manifests, pinned: a ceiling raised, a floor lowered or a budget removed there is red. An app or example config
|
|
42
|
+
# never states a budget (hfs.json keys, ESLint max-* options): the canon owns them.
|
|
43
|
+
budgets:
|
|
44
|
+
- file: knowledge/hfs/slots.yaml
|
|
45
|
+
cite: {ruling: design-truths-confirmed}
|
|
46
|
+
params:
|
|
47
|
+
under: ruleParams.common
|
|
48
|
+
ceilings: {fileLines.soft: 500, functionLines: 80, featureFiles: 250}
|
|
49
|
+
floors: {duplicateBlock.lines: 8, duplicateBlock.tokens: 60}
|
|
50
|
+
equals: {fileLines.hardGrowth: true}
|
|
51
|
+
slots:
|
|
52
|
+
repo.docs-media: {"bytes": 512000}
|
|
53
|
+
be.app.api: {"app.module.ts": 250, "main.ts": 80, "<app>.env.ts": 150, "<app>.options.ts": 200, "compose/<area>.ts": 120}
|
|
54
|
+
be.app.worker: {"app.module.ts": 250, "main.ts": 80, "<app>.env.ts": 150, "<app>.options.ts": 200, "compose/<area>.ts": 120}
|
|
55
|
+
be.app.cli: {"app.module.ts": 250, "main.ts": 80, "<app>.env.ts": 150, "<app>.options.ts": 200, "compose/<area>.ts": 120}
|
|
56
|
+
be.feature: {"files": 250, "indexExports": 60}
|
|
57
|
+
be.domain: {"indexExports": 60}
|
|
58
|
+
be.platform: {"indexExports": 60}
|
|
59
|
+
be.platform.event-bus: {"indexExports": 60}
|
|
60
|
+
be.platform.queue: {"indexExports": 60}
|
|
61
|
+
be.platform.jobs: {"indexExports": 60}
|
|
62
|
+
be.integrations: {"indexExports": 80}
|
|
63
|
+
fe.feature: {"component.tsx": 300, "index.tsx": 200, "dataHooks": 6, "useState": 6}
|
|
64
|
+
fe.components: {"component.tsx": 300, "index.tsx": 200, "dataHooks": 6, "useState": 6}
|
|
65
|
+
fe.hooks: {"file": 200, "barrel": 400, "dataHooks": 6, "useState": 6}
|
|
66
|
+
fe.hooks.swr: {"file": 200, "barrel": 400}
|
|
67
|
+
fe.hooks.rhf: {"file": 200, "barrel": 400}
|
|
68
|
+
fe.hooks.zustand: {"file": 200, "barrel": 400}
|
|
69
|
+
fe.hooks.socketio: {"file": 200, "barrel": 400}
|
|
70
|
+
fe.hooks.effects: {"file": 200, "barrel": 400}
|
|
71
|
+
fe.hooks.reuseables: {"file": 200, "barrel": 400}
|
|
72
|
+
fe.redux: {"file": 400}
|
|
73
|
+
fe.modules: {"file": 400}
|
|
74
|
+
fe.package.ui: {"component.tsx": 300, "index.tsx": 200, "dataHooks": 6, "useState": 6}
|
|
75
|
+
- file: knowledge/hfs/runtime-slots.yaml
|
|
76
|
+
cite: {ruling: design-truths-confirmed}
|
|
77
|
+
params:
|
|
78
|
+
under: ruleParams.runtime
|
|
79
|
+
ceilings: {fileLines.soft: 500}
|
|
80
|
+
equals: {fileLines.hardGrowth: true}
|
|
81
|
+
- file: modules/kernel/hook-input.yaml
|
|
82
|
+
cite: {ruling: hook-input-budget-pins}
|
|
83
|
+
params:
|
|
84
|
+
under: ""
|
|
85
|
+
ceilings: {maxBytes: 1048576, outputTimeoutMs: 1000, verdictTimeoutMs: 20000, teardownTimeoutMs: 1000, hookTimeoutSeconds: 30}
|
|
86
|
+
floors: {minInputWindowMs: 5000}
|
|
87
|
+
|
|
88
|
+
truths:
|
|
89
|
+
- id: fe-has-no-specs
|
|
90
|
+
cite: {ruling: design-truths-standing}
|
|
91
|
+
says: The front end has no tests, so it is never a coverage target and a front end folder is outside every coverage measure.
|
|
92
|
+
allows:
|
|
93
|
+
- {list: coverage-exclusions, file: "{**/codecov.yml,**/sonar-project.properties}", entries: ["fe/**"]}
|
|
94
|
+
- id: runtime-has-no-specs
|
|
95
|
+
cite: {ruling: no-runtime-specs}
|
|
96
|
+
says: The .claude runtime has no specs of its own (specs for bundled libraries live in packages/*), so Sonar analyses the runtime without a coverage report and its own specs are not analysed as source.
|
|
97
|
+
allows:
|
|
98
|
+
- {list: sonar-exclusions, derivedBy: runtime-coverage-scope, file: sonar-project.properties, entries: ["**/*.spec.mjs"]}
|
|
99
|
+
- {list: coverage-exclusions, derivedBy: runtime-coverage-scope}
|
|
100
|
+
- {list: sonar-scope, derivedBy: runtime-coverage-scope}
|
|
101
|
+
- id: thin-wiring-roles-outside-coverage
|
|
102
|
+
cite: {ruling: design-truths-standing}
|
|
103
|
+
says: Back end unit coverage is 100 per file on the logic roles only; the files of a thin wiring role (module, controller, resolver, port, options, entity and the like) and the slots marked coverage none are outside coverage, derived once from the slot manifest.
|
|
104
|
+
allows:
|
|
105
|
+
- {list: coverage-exclusions, derivedBy: coverage-scope}
|
|
106
|
+
- id: app-config-renders-from-the-canon
|
|
107
|
+
cite: {ruling: design-truths-standing}
|
|
108
|
+
says: The ignore and exclude lists of a rendered app file (sonar.exclusions, sonar.cpd.exclusions, a tsconfig exclude, a prettier ignore, the jest excludes) are what the canon template renders for that file; an entry the render does not hold is a loosening.
|
|
109
|
+
allows:
|
|
110
|
+
- {list: sonar-exclusions, derivedBy: template-render}
|
|
111
|
+
- {list: cpd-exclusions, derivedBy: template-render}
|
|
112
|
+
- {list: sonar-scope, derivedBy: template-render}
|
|
113
|
+
- {list: path-ignores, derivedBy: template-render}
|
|
114
|
+
- id: message-catalogs-are-not-duplicate-code
|
|
115
|
+
cite: {ruling: message-catalogs-not-duplicate-code}
|
|
116
|
+
says: The message catalogs are left out of Sonar copy-paste detection and out of the formatter, and nothing else is.
|
|
117
|
+
allows:
|
|
118
|
+
- {list: cpd-exclusions, file: "{**/sonar-project.properties,packages/hfs/templates/app/quality-config/*.properties}", entries: ["**/messages/*.messages.ts", "**/messages/*.json"]}
|
|
119
|
+
- {list: path-ignores, file: "{**/.prettierignore,packages/hfs/templates/app/tool-config*/prettierignore}", entries: ["**/i18n/messages/**"]}
|
|
120
|
+
- id: be-tests-have-their-own-tsconfig
|
|
121
|
+
cite: {ruling: design-truths-confirmed}
|
|
122
|
+
says: The app and build tsconfig of a back end exclude the test folders and the specs because src/tests/tsconfig.json compiles them, so every test is still type-checked.
|
|
123
|
+
allows:
|
|
124
|
+
- {list: path-ignores, file: "{**/be/tsconfig.json,**/be/tsconfig.build.json,packages/hfs/templates/be/tool-config/tsconfig*.json}", entries: [src/tests, src/tests/contract, src/tests/e2e, src/tests/integration, src/tests/world, "**/*.spec.ts"]}
|
|
125
|
+
- id: grammar-stories-are-not-the-package
|
|
126
|
+
cite: {ruling: design-truths-confirmed}
|
|
127
|
+
says: The grammar package build leaves its stories out of the shipped bundle; the stories are compiled by their own tsconfig in the same script, so no story is unchecked.
|
|
128
|
+
allows:
|
|
129
|
+
- {list: path-ignores, file: packages/grammar/tsconfig.build.json, entries: ["src/**/*.stories.ts", "src/**/*.stories.tsx", "src/stories/**"]}
|
|
130
|
+
- id: jest-preset-ignores-node-modules
|
|
131
|
+
cite: {ruling: design-truths-confirmed}
|
|
132
|
+
says: The jest preset skips the installed dependencies when it looks for tests; nothing else is skipped, and a jest pattern is compared as the exact text.
|
|
133
|
+
allows:
|
|
134
|
+
- {list: jest-patterns, file: packages/jest-preset/index.cjs, entries: [/node_modules/]}
|
|
135
|
+
- id: require-ci-defaults-false
|
|
136
|
+
cite: {ruling: release-require-ci-per-project}
|
|
137
|
+
says: release.requireCi defaults to false; every local gate row runs either way, so a project that does not wait for its candidate CI loosens nothing.
|
|
138
|
+
allows:
|
|
139
|
+
- {setting: requireCi, value: false}
|
|
140
|
+
- id: one-allowlist-holds-no-entries
|
|
141
|
+
cite: {ruling: loosening-always-red}
|
|
142
|
+
says: The runtime has one allowlist file, with its reserved sections empty. An entry added to it is a loosening.
|
|
143
|
+
allows:
|
|
144
|
+
- {exceptionFile: modules/kernel/allowlist.yaml, maxEntries: 0}
|
|
145
|
+
- id: skip-lib-check-skips-third-party-declarations
|
|
146
|
+
cite: {ruling: design-truths-confirmed}
|
|
147
|
+
says: skipLibCheck true skips type-checking of third-party declaration files only and never app code; it is a design truth of the canon base tsconfig and of no other file, so a tsconfig that sets it, or turns any other strictness option off, is red.
|
|
148
|
+
allows:
|
|
149
|
+
- {compilerOption: skipLibCheck, value: true, files: [packages/tsconfig/base.json]}
|
|
@@ -19,7 +19,14 @@ concerns:
|
|
|
19
19
|
home: [fe.modules.api, fe.transport.client, fe.transport.outcome]
|
|
20
20
|
pattern: FE-API-GRAPHQL
|
|
21
21
|
forbids: [urql, graphql-request, '@urql/core', graphql-hooks, apollo-boost]
|
|
22
|
-
why: one file per operation under modules/api/graphql/{queries,mutations}, run by the auth or no-auth Apollo client with the link chain.
|
|
22
|
+
why: one file per operation under modules/api/graphql/{queries,mutations,subscriptions}, run by the auth or no-auth Apollo client with the link chain.
|
|
23
|
+
- id: graphql-subscriptions
|
|
24
|
+
tier: opt
|
|
25
|
+
packages: [graphql-ws]
|
|
26
|
+
home: [fe.transport.client, fe.package.api.client]
|
|
27
|
+
pattern: FE-REALTIME
|
|
28
|
+
forbids: []
|
|
29
|
+
why: the subscription transport of a GraphQL subscription door (be.feature.realtime.graphql); only the Apollo clients folder imports it (GraphQLWsLink of @apollo/client/link/subscriptions), a subscription operation runs on that client and a useSubscribe hook of hooks/swr reads it.
|
|
23
30
|
- id: codegen
|
|
24
31
|
tier: core
|
|
25
32
|
packages: ['@graphql-codegen/cli', '@graphql-codegen/client-preset']
|
|
@@ -74,8 +81,8 @@ concerns:
|
|
|
74
81
|
packages: [socket.io-client, eventemitter2]
|
|
75
82
|
home: [fe.hooks.socketio]
|
|
76
83
|
pattern: FE-REALTIME
|
|
77
|
-
forbids: [
|
|
78
|
-
why: one socket.io-client singleton per namespace and one side-effect component that dispatches to redux and SWR;
|
|
84
|
+
forbids: [subscriptions-transport-ws, '@supabase/realtime-js', pusher-js, ably]
|
|
85
|
+
why: one socket.io-client singleton per namespace and one side-effect component that dispatches to redux and SWR; both editions run the gateway in the be api process. A one-way channel served as server-sent events needs no package, only a stream reader in modules/api/sse/clients, a stream operation in modules/api/sse and a useSubscribe<Channel>Swr hook (FE-REALTIME).
|
|
79
86
|
- id: auth
|
|
80
87
|
tier: core
|
|
81
88
|
packages: []
|
|
@@ -89,7 +96,7 @@ concerns:
|
|
|
89
96
|
home: [fe.modules.i18n]
|
|
90
97
|
pattern: FE-I18N
|
|
91
98
|
forbids: [i18next, react-i18next, next-i18next, react-intl, '@lingui/react']
|
|
92
|
-
why: useTranslations for copy and the next-intl formatter for numbers, dates and currency.
|
|
99
|
+
why: useTranslations for copy and the next-intl formatter for numbers, fixed dates and currency; FE-DATE owns live time display.
|
|
93
100
|
- id: ui
|
|
94
101
|
tier: core
|
|
95
102
|
packages: ['@heroui/react', '@heroui/styles', tailwindcss, '@starci/grammar']
|
|
@@ -107,6 +114,17 @@ concerns:
|
|
|
107
114
|
one application icon set, the heroicons family (owner ruling 2026-10-13), on the 24/outline and 16/solid cuts. @heroicons/react
|
|
108
115
|
is the base set and is used first; @starci/heroicons holds only the glyphs heroicons lacks (brand or domain glyphs drawn in
|
|
109
116
|
heroicons style), never duplicates a heroicons glyph, and a missing glyph is added to it.
|
|
117
|
+
- id: avatar-illustration
|
|
118
|
+
tier: opt
|
|
119
|
+
packages: ['@starci/grammar']
|
|
120
|
+
home: [fe.components]
|
|
121
|
+
pattern: FE-UI
|
|
122
|
+
forbids: ['@dicebear/*', boring-avatars, 'react-nice-avatar', multiavatar]
|
|
123
|
+
why: >-
|
|
124
|
+
Grammar owns circle avatars: pass the uploaded avatar as src, otherwise pass the user or identity id as seed on
|
|
125
|
+
Avatar, AvatarButton or AvatarGroup members. Grammar renders deterministic DiceBear images with its fixed DNA style;
|
|
126
|
+
@dicebear/core and @dicebear/styles are Grammar runtime dependencies pinned in canon-pins.yaml. Apps declare and
|
|
127
|
+
import @starci/grammar, never @dicebear/*, and draw no avatar visuals. With neither src nor seed, initials remain.
|
|
110
128
|
- id: theme
|
|
111
129
|
tier: core
|
|
112
130
|
packages: [next-themes]
|
|
@@ -127,7 +145,7 @@ concerns:
|
|
|
127
145
|
home: [fe.modules]
|
|
128
146
|
pattern: FE-DATE
|
|
129
147
|
forbids: [moment, moment-timezone, date-fns, luxon]
|
|
130
|
-
why:
|
|
148
|
+
why: FE-DATE owns application date math, fixed date formatting and Grammar's live time display.
|
|
131
149
|
- id: numbers
|
|
132
150
|
tier: opt
|
|
133
151
|
packages: [decimal.js]
|