@astrale-os/sdk 0.6.0-beta.43 → 0.6.0-beta.44
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/README.md +6 -6
- package/dist/application/action/authoring.d.ts +1 -1
- package/dist/application/action/context.d.ts +9 -8
- package/dist/application/error/error.d.ts +7 -7
- package/dist/application/error/error.js +12 -12
- package/dist/application/error/index.d.ts +1 -1
- package/dist/application/error/index.js +1 -1
- package/dist/application/mutation/authoring/builder.d.ts +12 -12
- package/dist/application/mutation/authoring/builder.js +3 -3
- package/dist/application/mutation/authoring/guard.d.ts +2 -2
- package/dist/application/mutation/authoring/index.d.ts +1 -1
- package/dist/application/mutation/define.d.ts +8 -8
- package/dist/application/mutation/define.js +12 -12
- package/dist/application/mutation/execution/execute.d.ts +2 -2
- package/dist/application/mutation/execution/execute.js +10 -10
- package/dist/application/mutation/execution/executor.d.ts +2 -2
- package/dist/application/mutation/execution/executor.js +2 -2
- package/dist/application/mutation/index.d.ts +2 -2
- package/dist/application/mutation/legacy/v6/define.d.ts +1 -1
- package/dist/application/mutation/legacy/v6/mutation.d.ts +1 -1
- package/dist/application/mutation/mutation.d.ts +12 -12
- package/dist/application/query/composite/builder.js +1 -1
- package/dist/application/query/define.d.ts +1 -1
- package/dist/application/query/define.js +3 -3
- package/dist/application/query/defined/define.d.ts +45 -0
- package/dist/application/query/defined/define.js +96 -0
- package/dist/application/query/{recipe/recipe.d.ts → defined/query.d.ts} +21 -20
- package/dist/application/query/definition.d.ts +5 -5
- package/dist/application/query/definition.js +4 -4
- package/dist/application/query/execution/bounds.d.ts +5 -5
- package/dist/application/query/execution/bounds.js +2 -2
- package/dist/application/query/execution/client.d.ts +20 -0
- package/dist/application/query/execution/client.js +1 -0
- package/dist/application/query/execution/crossings.d.ts +3 -3
- package/dist/application/query/execution/crossings.js +23 -23
- package/dist/application/query/execution/error.d.ts +8 -8
- package/dist/application/query/execution/error.js +5 -5
- package/dist/application/query/execution/execute.d.ts +4 -4
- package/dist/application/query/execution/executor.d.ts +2 -2
- package/dist/application/query/execution/rows.d.ts +5 -5
- package/dist/application/query/execution/rows.js +42 -30
- package/dist/application/query/execution/{recipe.d.ts → run.d.ts} +21 -31
- package/dist/application/query/execution/{recipe.js → run.js} +49 -49
- package/dist/application/query/execution/split.d.ts +3 -3
- package/dist/application/query/execution/split.js +1 -1
- package/dist/application/query/handles/build.d.ts +1 -1
- package/dist/application/query/handles/domain.d.ts +1 -1
- package/dist/application/query/handles/handles.d.ts +14 -12
- package/dist/application/query/handles/plan.d.ts +10 -9
- package/dist/application/query/handles/plan.js +1 -1
- package/dist/application/query/handles/reads.js +4 -4
- package/dist/application/query/handles/rows.d.ts +1 -1
- package/dist/application/query/index.d.ts +8 -5
- package/dist/application/query/index.js +3 -3
- package/dist/application/query/language/index.d.ts +1 -1
- package/dist/application/query/language/query.d.ts +5 -5
- package/dist/application/query/legacy/v6/collection/union.d.ts +1 -1
- package/dist/application/query/legacy/v6/collection/union.js +3 -3
- package/dist/application/query/legacy/v6/define.d.ts +1 -1
- package/dist/application/query/legacy/v6/define.js +3 -3
- package/dist/application/query/legacy/v6/execution/execute.d.ts +6 -4
- package/dist/application/query/legacy/v6/index.d.ts +1 -1
- package/dist/application/query/legacy/v6/index.js +1 -1
- package/dist/application/query/query.d.ts +3 -3
- package/dist/application/routes/admission.d.ts +1 -1
- package/dist/application/routes/admission.js +2 -2
- package/dist/application/routes/index.d.ts +3 -2
- package/dist/application/routes/route.d.ts +1 -1
- package/dist/application/runtime/declarations.d.ts +6 -6
- package/dist/application/runtime/define.d.ts +5 -5
- package/dist/application/workflow/durable.d.ts +9 -9
- package/dist/execution/invocation/capabilities/bind.d.ts +1 -1
- package/dist/execution/invocation/capabilities/bind.js +8 -8
- package/dist/execution/invocation/dispatch/action.js +2 -2
- package/dist/execution/invocation/dispatch/workflow.js +2 -2
- package/dist/execution/invocation/result/index.d.ts +1 -1
- package/dist/execution/invocation/result/index.js +1 -1
- package/dist/execution/invocation/result/undeclared.d.ts +7 -0
- package/dist/execution/invocation/result/undeclared.js +18 -0
- package/dist/execution/workflows/failure.d.ts +7 -7
- package/dist/execution/workflows/failure.js +19 -18
- package/dist/execution/workflows/receiver.d.ts +1 -1
- package/dist/execution/workflows/run.js +2 -2
- package/dist/execution/workflows/steps.d.ts +1 -1
- package/dist/platform/schema/class-authoring.d.ts +2 -8
- package/dist/platform/schema/index.d.ts +1 -1
- package/dist/platform/schema/kernel-compiled.d.ts +1 -1
- package/dist/platform/schema/kernel-compiled.js +1 -1
- package/dist/platform/schema/kernel.d.ts +4 -2
- package/dist/testing/index.d.ts +2 -2
- package/dist/testing/index.js +1 -1
- package/dist/testing/{recipe.d.ts → query.d.ts} +5 -5
- package/dist/testing/{recipe.js → query.js} +9 -9
- package/dist/tooling/cli/orchestrate.js +7 -6
- package/dist/tooling/linter/adapters/typescript/{recipe-definitions.d.ts → definition-calls.d.ts} +10 -10
- package/dist/tooling/linter/adapters/typescript/{recipe-definitions.js → definition-calls.js} +10 -10
- package/dist/tooling/linter/adapters/typescript/index.d.ts +1 -1
- package/dist/tooling/linter/adapters/typescript/index.js +1 -1
- package/dist/tooling/linter/adapters/typescript/query-observation.js +6 -6
- package/dist/tooling/linter/implementations/source/definitions.d.ts +2 -0
- package/dist/tooling/linter/implementations/source/{recipes.js → definitions.js} +27 -27
- package/dist/tooling/linter/implementations/source/global.js +8 -6
- package/dist/tooling/linter/implementations/source/mutations.js +5 -5
- package/dist/tooling/linter/implementations/source/shared.d.ts +2 -2
- package/dist/tooling/linter/implementations/source/shared.js +7 -7
- package/dist/tooling/linter/implementations/source/verifiers.js +2 -2
- package/dist/tooling/linter/policy/generated.js +3 -3
- package/dist/tooling/linter/requirements/registry.js +4 -4
- package/docs/durable-workflows.md +8 -8
- package/docs/handler-dependencies.md +1 -1
- package/docs/legacy/query-v6.md +6 -6
- package/docs/queries.md +38 -38
- package/package.json +6 -6
- package/dist/application/query/recipe/define.d.ts +0 -44
- package/dist/application/query/recipe/define.js +0 -95
- package/dist/execution/invocation/result/recipe.d.ts +0 -6
- package/dist/execution/invocation/result/recipe.js +0 -17
- package/dist/tooling/linter/implementations/source/recipes.d.ts +0 -2
- /package/dist/application/query/{recipe/recipe.js → defined/query.js} +0 -0
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/** Generated from the validated Domain knowledge catalog. Regenerate with pnpm sync:linter-policy. */
|
|
2
|
-
export const domainPolicyDigest = '
|
|
2
|
+
export const domainPolicyDigest = '29e28297047ecdd98b0d0a35d5ce2fbeaea0a7693d3aa2fd4b2a2a0c6cd2756d';
|
|
3
3
|
export const domainPolicySource = Object.freeze({
|
|
4
|
-
rules: "id\tscope\tkind\tseverity\tmessage\tverification\texample\nOWN-SEMANTIC\townership\tarchitecture\terror\tEvery semantic fact, rule, representation, transition, and failure meaning has exactly one owner\tInventory declarations by meaning and report each duplicate authority or ownerless concept\tsemantic-owner.md\nMOD-SUBMODULE\tmodules\tstructure\terror\tEvery semantic source file lives in a dedicated semantic submodule or its registered layer facade\tClassify every layer-root source file and report files outside the registered facade or public index\tsemantic-owner.md\nMOD-REQUIRED\tmodules\tstructure\terror\tEvery required layer and root file declared by the injected layout exists\tCompare admitted project entries with required layout entries and report each missing path\trequired-layout.md\nMOD-GOVERNED\tmodules\tstructure\terror\tEvery source file admitted by the Domain compilation scope belongs to a declared layer or supported root\tClassify admitted source paths after declared workspace and tooling delegation and report each unowned path\tgoverned-source.md\nROOT-FACADE\troots\tstructure\terror\tEvery registered layer facade is exposed through a curated public index\tInspect each layer index and facade and report private-owner behavior or misplaced facade declarations\tpackage-facade.md\nROOT-COMPOSE\troots\tstructure\terror\tPackage roots compose only policy-backed Schema, Runtime, frontend deployment, native Routes, Provider-backed Integrations, and supported package journeys\tInspect declared composition and package roots and report behavior, provider protocol logic, recursive barrels, or unsupported exports\tcomposition-root.md\nROOT-PACKAGE\troots\tevidence\terror\tEvery public Schema package subpath maps one admitted source entrypoint to its deterministic published declaration and JavaScript targets\tCompare source and publish exports and reject missing duplicate non-Schema locally linked generated or Kernel-leaking package artifacts\tmulti-domain-package.md\nDEP-ALLOWLIST\tdependencies\tdependency\terror\tEvery direct cross-layer import and its runtime or type-only kind appears in the dependency allowlist and dependencies between distinct layers are acyclic\tResolve source imports, reject every absent or kind-mismatched edge, and detect cycles after excluding evidence edges\tsemantic-owner.md\nIMP-FACADE\timports\tdependency\terror\tEvery cross-submodule import uses the semantic owner's facade and every foreign Domain import uses its public package facade\tResolve imports and report private deep paths outside the importing submodule\tcross-domain.md\nIMP-SDK-BOUNDARY\timports\tdependency\terror\tDomain source imports Kernel Core and DSL authoring values only through semantic SDK subpaths\tInspect every static and literal dynamic import and report module specifiers rooted at @astrale-os/kernel-core or @astrale-os/kernel-dsl\tsdk-boundary.md\nIMP-LAYER-ALIAS\timports\tdependency\terror\tEvery local import crossing a layer or semantic-submodule boundary uses the registered # layer alias\tResolve relative imports and report each one whose target leaves the importing semantic submodule\tlayer-aliases.md\nIMP-ALIAS-CFG\timports\tdependency\terror\tPackage and TypeScript resolution exactly implement each active layer-facade and semantic-submodule alias\tCompare active and required layers with the injected alias registry and report missing, undeclared, or drifted mappings\talias-configuration.md\nIMP-STATIC\timports\tdependency\terror\tProduction dependency edges use analyzable static ESM declarations or literal import calls\tReject require calls, import-equals declarations, nonliteral import calls, and unresolved static dependency forms\tstatic-imports.md\nTYP-OWNER\ttypes\tarchitecture\terror\tEvery type and reusable expected error is colocated with the semantic concept that defines its meaning\tTrace each declaration to its semantic authority and report catch-all or remotely owned values\texpected-failure.md\nERR-EXPECTED\terrors\tdataflow\terror\tBoundaries map only declared expected failures and propagate unexpected defects\tInspect catches and result mappings and report broad fallback, swallowed defects, or mappings without a declared source failure\texpected-failure.md\nTST-NO-PROD-IMP\ttests\tdependency\terror\tProduction source imports no root or colocated Test artifact\tResolve production imports and report targets under Root Tests, __tests__, or test, spec, bench, and perf source files\ttest-import-boundary.md\nABS-EARNED\tabstractions\tarchitecture\terror\tAn invariant or real boundary earns an abstraction; reuse alone requires two independent consumers and no duplicated semantic behavior\tIdentify the invariant, boundary, or independent consumers for each abstraction and report reuse wrappers that duplicate an owner's semantics\tsemantic-owner.md\nABS-NO-REPO\tabstractions\tarchitecture\terror\tDomain source places no collection-shaped persistence facade between business code and canonical Query or Mutation definitions\tInspect persistence-facing contracts and report abstractions that replace graph identity, traversal, observation, or atomic change semantics\tsemantic-owner.md\nABS-CANON-GRAPH\tabstractions\tdeclaration\terror\tDomain source declares no alternate Query or Mutation language, AST, compiler, planner, or wire representation\tInspect graph-related declarations and report semantics not identical to canonical Kernel Query or Mutation values\tsemantic-owner.md\nTRUST-ADMIT-ONCE\ttrust\tdataflow\terror\tEvery untrusted value is admitted or translated exactly once at its owning boundary\tTrace values from each external boundary and report missing admission or repeated structural validation\texpected-failure.md\nQLT-EXHAUSTIVE\tquality\tbehavior\terror\tEvery closed alternative is handled exhaustively and no required failure becomes placeholder success\tTrace closed unions and failure paths and report permissive defaults, placeholder success, or catch-and-continue behavior\texpected-failure.md\nQLT-CANON-VALUES\tquality\tdataflow\terror\tNo unchecked cast fabricates a canonical Kernel identity, QueryAST, MutationAST, or admitted schema value\tScan casts to canonical values and require an owning constructor or decoder for each\tsemantic-owner.md\nQLT-DEF-IDS\tquality\tdeclaration\terror\tEvery top-level Query and Mutation definition has a stable literal ID unique in its owning namespace\tExtract top-level definition IDs and report missing, dynamic, malformed, or duplicate values\tdefinition-identities.md\nQLT-TYPED-COORD\tquality\tdeclaration\terror\tQueries and Mutations derive graph coordinates from resolved DSL definitions instead of raw string or structural reconstruction\tReject raw PropertyKey calls and structural ClassPath objects; require canonical resolved Classes Properties and keys at graph boundaries\ttyped-coordinates.md\nNODE-INHERITED\tnodes\tdeclaration\terror\tNo Node Class redeclares name, description, createdAt, or updatedAt inherited from Named, Descriptable, and Timestamped\tScan Node Class Properties and report each inherited field redeclaration\tsemantic-owner.md\nDOM-PUBLIC-DEPS\tdomains\tdependency\terror\tEvery directly referenced foreign-Domain graph declaration has one exact Schema dependency\tResolve foreign Schema, Query, and Mutation graph references and report each package without one exact declared Schema dependency\tcross-domain.md\nDOM-CALL-DECLARED\tdomains\tdependency\terror\tCross-Domain calls use exact declared public Schema dependencies and typed invocation; Integrations are optional consumer-owned boundaries\tTrace remote invocations and reject undeclared targets, private imports, forged references, and missing exact Domain Function requirements\tremote-domain-call.md\nDOM-ATOMICITY\tdomains\tbehavior\terror\tA cross-Domain change claims atomicity only when it is one MutationAST on one graph; calls combined with other effects are Workflow steps\tTrace atomicity and effect claims and report multiple commits, service boundaries, or foreign calls combined in a Action\tcross-domain.md\nSCH-SUBMODULE\tschema\tstructure\terror\tEvery Schema source path belongs to the registered facade, one canonical shared declaration kind, or one business-module facade or canonical declaration kind\tClassify admitted Schema source paths including shared and module-owned errors directories and report flat files or source-bearing directories outside the canonical Schema vocabulary\tschema-facade.md\nSCH-ONE-DECL\tschema\tdeclaration\terror\tEvery Schema declaration leaf file exports exactly one locally authored declaration of its directory kind and every declaration-kind index is a curated facade\tInspect runtime exports in Classes, Functions, Policies, States, and Views; resolve canonical SDK constructor origins and report zero, several, re-exported, aggregated, wrong-kind, or index-owned values\tdeclaration-file.md\nSCH-DECL-ONLY\tschema\tdeclaration\terror\tSchema performs no handler execution, Query execution, Mutation submission, Integration call, Workflow step, or Provider call\tResolve Schema imports and call graphs and require zero excluded operations\tpublication-callables.md\nSCH-EXACT-TYPES\tschema\tdeclaration\terror\tSchema authoring values preserve their exact inferred DSL types instead of widening to generic builder contracts\tScan Schema declarations and action returns for explicit generic builder authoring annotations\tschema-facade.md\nSCH-ICON-REQUIRED\tschema\tdeclaration\terror\tEvery Node Class must explicitly declare one admitted SVG icon\tInspect each SDK nodeClass and Node-kind defineClass declaration and report statically proven missing icon values while preserving opaque configurations as indeterminate\tclass-icon.md\nSCH-ICON-NEUTRAL\tschema\tdeclaration\twarning\tEvery neutral Node Class icon should be replaced with a meaningful icon\tInspect each SDK nodeClass and Node-kind defineClass declaration and report explicit classIcon.neutral or exact neutral SVG values\tclass-icon.md\nSCH-POLICY-AUTH\tschema\tdeclaration\terror\tCallable authority and existential Node scope are declared explicitly through Policy and Action implementations add no private authorization rule\tTrace callable admission and existential Node binders; report hidden authority or an ambiguous Node extent\tpolicy.md\nSCH-POLICY-NAME\tschema\tdeclaration\twarning\tEvery Policy is named as the sentence its subject completes, in the Domain's words: each business hop to the object in order, the object last\tRead each Policy name against its match and report a permission prefix such as can or may, a graph mechanics word such as source, target, sub, super, subject, object, or caller, or a business hop of the match the name omits\tpolicy.md\nSCH-STATE-SOURCE\tschema\tdeclaration\terror\tEvery persisted StateMachine vocabulary originates from an exported authority in the same Schema business module rather than a copied literal set\tResolve exact StateMachine and stateProperty origins; report same-owner copied literals and reject cross-module association\tarticle-schema.md\nSCH-STATE-RELATION\tschema\tdeclaration\terror\tEvery StateMachine is one exported static immutable finite relation without parallel vocabulary authorities\tInspect Schema module machines and exported sibling values for split or copied topology\tarticle-status.md\nSCH-STATE-PURE\tschema\tdeclaration\terror\tStateMachine topology contains no behavior, effects, guards, clocks, retry, recovery, or orchestration\tInspect files that declare StateMachine authorities for behavioral exports, boundary imports, and effectful calls\tstate-pure.md\nSCH-EDGE-KEY-ORDER\tschema\tdeclaration\terror\tA Policy edge in role form lists the source's role first\tResolve the Edge Class's declaration and report ends whose first key is another role than the source's; an unresolved Class or a spread or computed key proves nothing\tpolicy-edge.md\nRUL-SYNC\trules\tbehavior\terror\tEvery Rule is synchronous and returns no Promise, continuation, generator, or asynchronous iterator\tInspect Rule signatures and result types and reject asynchronous forms\tnormalization.md\nRUL-PURE\trules\tbehavior\terror\tRules perform no I/O and depend on no graph executor or Domain execution boundary\tResolve imports and effect origins, permitting pure standard value transformations while reporting conclusive I/O and Domain execution dependencies\tpublish-eligibility.md\nRUL-EXPL-FACTS\trules\tbehavior\terror\tEvery clock value, random value, identity, limit, and environmental observation used by a Rule is an explicit input\tTrace every value source and report reads from ambient state, globals, process state, or hidden singletons\ttime-facts.md\nRUL-CLOSED-DEC\trules\tbehavior\terror\tEvery expected business alternative is represented by a closed decision value rather than thrown control flow\tInspect Rule branches and report expected alternatives represented by exceptions or open optional fields\tpublish-eligibility.md\nQRY-CANON\tqueries\tdataflow\terror\tQuery V6: Every graph request produced by a Query definition is one canonical QueryAST built through Kernel Query APIs\tTrace request construction and reject every non-canonical graph document\tv6-filtered-query.md\nQRY-CONTRACT\tqueries\tdataflow\terror\tA Query owns its input, observation, optional business projection, pagination, and expected failures\tInspect each Query definition and report a required concern owned elsewhere or omitted\trecipe-errors.md\nQRY-SINGLE\tqueries\tdataflow\terror\tQuery V6: Every authored single Query definition declares exactly one build callback and at most one project callback\tInspect definition properties and canonical roots; report opaque helper origins as ambiguity rather than assuming cardinality\tv6-single-query.md\nQRY-COMPOSE-TYPED\tqueries\tdataflow\terror\tQuery V6: A composite Query constructs one closed QueryPlan containing only typed single-Query leaves, symbolic output references, and explicit result composition\tInspect plan construction, report unresolved call origins as ambiguity, and reject nested composites, raw sessions, graph clients, result-time callbacks, arbitrary promises, or Domain effects\tv6-dependent-query.md\nQRY-COMPOSE-STABLE\tqueries\tdeclaration\terror\tQuery V6: Every composite Query leaf has a stable semantic literal ID unique within its definition\tInspect declared Query leaves and reject dynamic, malformed, or duplicate leaf identifiers\tv6-dependent-query.md\nQRY-COLL-FANOUT\tqueries\tdataflow\twarning\tQuery V6: Three or more independent same-kind complete-Class collection leaves use one explicit query.union group\tInfer collection kind from canonical definition types and print the direct named replacement plus logical and physical plan counts\tv6-collection-union.md\nQRY-PROJECT-PURE\tqueries\tdataflow\terror\tEvery Query project or output callback is synchronous and performs only pure value transformation\tInspect project and output callback syntax and call graphs and report asynchronous continuation, I/O, mutation, nondeterminism, hidden query execution, or effects\tprojection.md\nQRY-SNAPSHOT\tqueries\tdataflow\terror\tA recipe of several reads or steps, a composite, or a paginated Query makes no point-in-time graph snapshot claim beyond one Kernel invocation\tReject shared-snapshot claims across recipe facets, steps or split reads, composite leaves, unions or continuations and route stronger consistency to an explicit Kernel facility\tsteps.md\nQRY-RECIPE-CLOCK\tqueries\tdataflow\terror\tA recipe's build and output read no clock: a recipe that depends on the time takes now in its input\tInspect build, each of its steps, and output written inline, their callbacks included, and report Date.now, Date, performance.now, process.hrtime or process.uptime called, new Date() without arguments, or Temporal.Now\trecipe.md\nQRY-RECIPE-ROWS\tqueries\tdataflow\twarning\tA recipe's bounds multiply to at most 10,000 rows\tCount each read's rows as a call counts them, from constant bounds only, and report a recipe past 10,000 rows with its count\trecipe.md\nQRY-RECIPE-FALSY\tqueries\tdataflow\twarning\tA condition entry that compares with a value that may be false or 0 tests the value with !== undefined, or states that false or 0 means no filter: gated on the value itself, the entry is falsy and skipped\tInspect the condition entries of build and its steps wherever falsy entries are skipped: what a where, is, some, none, every, atLeast, atMost or exactly callback returns, and the arguments of and and or. Report an entry A && B, or A ? B : a falsy literal, whose B passes the value A reads to eq, in, gt, gte, lt, lte, between, startsWith, atMost or exactly when the type of A admits false or a number\tfiltered-query.md\nMUT-PLAN-REQ\tmutations\tdependency\terror\tEvery identity operation and foreign Mutation plan declares the exact Kernel Function and foreign Class authority it uses\tInspect SDK MutationAST builders and Kernel Provision or Register calls and match every foreign Class operation and identity syscall invocation to Domain requirements\tprovision-plan.md\nMUT-LOCAL-ALIAS\tmutations\tdeclaration\terror\tEvery literal Mutation createNode alias is a canonical local binding accepted by the Kernel\tInspect statically resolved createNode as values and reject invalid local binding literals before runtime\tatomic-mutation.md\nMUT-CANON\tmutations\tdataflow\terror\tEvery Mutation definition builds one synchronous change through the canonical builder and constructs no alternate or nested graph document\tInspect every definition build callback and reject missing, asynchronous, alternate, or nested Mutation construction\tatomic-mutation.md\nMUT-CONTRACT\tmutations\tdataflow\terror\tA Mutation owns its input, preconditions, operations, optional business projection, and expected failures\tInspect each definition and report required mutation semantics owned elsewhere or omitted\tcreate-aggregate.md\nMUT-PRECONDS\tmutations\tdataflow\terror\tRules decide eligibility and every live graph condition required for safety is encoded as a precondition in the same MutationAST\tMap decisions to preconditions and report duplicated eligibility or safety enforced only by an earlier observation\tconditional-update.md\nMUT-FRAGMENTS\tmutations\tdataflow\terror\tReusable fragments receive the callback-scoped MutationBuilder and contribute only to the same MutationAST\tResolve fragment signatures and calls and reject escaped builders, opaque documents, or nested MutationAST construction\tmutation-fragments.md\nMUT-PURE\tmutations\tdataflow\terror\tMutation definitions perform no session call, external effect, retry, compensation, or second submission\tScan definition call graphs and require zero excluded operations\tedge-change.md\nMUT-MULTI-WFL\tmutations\tdataflow\terror\tA change requiring several MutationAST values is a Workflow and is never exposed as one atomic Mutation\tTrace multi-commit changes and report definitions or names claiming single-mutation atomicity\tdelete-node.md\nMUT-STATE-INITIAL\tmutations\tdataflow\terror\tEvery StateMachine-backed node is created from its machine's initial state\tResolve machine-backed Property initializers and require the canonical machine.initial value rather than a copied state literal\tstate-transition.md\nMUT-STATE-ATOMIC\tmutations\tdataflow\terror\tEvery persisted machine-state change consumes one allowed decision and commits its stale-state precondition and update in the same MutationAST\tInspect machine-backed writes and require transition with the canonical Schema module machine and one allowed decision; reject direct target writes and split precondition updates\tstate-transition.md\nFNC-ONE-IMPL\tfunctions\tbehavior\terror\tEvery registered handler binding resolves to exactly one implementation owned by one semantic Functions submodule\tResolve the handler registry and report non-Action owners or duplicate registrations; SDK typing owns callable exhaustiveness\tsynchronous-result.md\nFNC-ONE-EFFECT\tfunctions\tbehavior\terror\tEvery Action performs at most one effect, as its terminal operation; the Queries and read-only calls it needs precede that effect\tTrace every path and report two effects, an operation after the effect, or hidden orchestration\tmutation-operation.md\nFNC-OP-KINDS\tfunctions\tbehavior\terror\tA semantic asynchronous operation is one Query, Mutation, Integration call, dependency invocation, or canonical Kernel operation; a Query or a call that changes no state is an observation, every other operation is an effect\tClassify every awaited operation including dependency and Kernel calls as an observation or an effect; report undeclared kinds and hidden multiple effects\tintegration-operation.md\nFNC-BOUNDARIES\tfunctions\tbehavior\terror\tHandlers use self-default kernel and graph capabilities, query and mutate under the authority as names, explicit-authority direct dependencies, and optional declared Integrations; explicit Kernel and graph authority modes are available\tInspect context use, authority selection, dependencies, imports and failure mapping; reject raw unbound graph executors, foreign handler imports, implicit authority changes and swallowed defects\tremote-integration.md\nFNC-BINARY-RESULT\tfunctions\tbehavior\terror\tA binary Action returns detached buffered bytes or streaming bytes with admitted media type status and application headers without collecting or value-framing a provider stream\tExercise buffered and streaming results through their native route; verify exact bytes status headers cancellation and invalid output rejection\tnative-byte-response.md\nFNC-MULTISTEP\tfunctions\tbehavior\terror\tEvery Workflow definition contains at least two effect sites that cannot commit together\tInventory effect sites in the definition and report fewer than two or effects one Mutation could commit; early exit, rejection, and recovery paths may execute fewer\tpublication-workflow.md\nFNC-STEP-EFFECTS\tfunctions\tbehavior\terror\tEvery semantic asynchronous operation runs inside a named step: step.run, or the durable step.query and step.mutate shorthands\tTrace operations and report each one outside a named step\tpublication-workflow.md\nFNC-STEP-IDS\tfunctions\tbehavior\terror\tEvery step identifier is a stable non-empty kebab-case literal unique within its Workflow\tExtract step identifiers and reject dynamic, malformed, empty, or duplicate values\tpublication-workflow.md\nFNC-NO-NEST\tfunctions\tbehavior\terror\tNo step.run callback starts another step, whether step.run, step.query or step.mutate, directly or through a reachable helper\tInspect callback call graphs and report every nested step path\tpublication-workflow.md\nFNC-INT-TYPES\tfunctions\tdeclaration\terror\tWorkflow Integration requirements derive from declared Integration definitions and the SDK projects their clients\tReject Workflow-owned operation interfaces and require its definition generic to reference the declared Integration registry\tcross-domain-workflow.md\nFNC-STEP-READS\tfunctions\tbehavior\terror\tA durable step reads nothing before its effect: the effect builds its request and guards only from the Workflow input and earlier step results, so a retried step resends the same request\tIn a durable Workflow, report a step.run callback, inline or a named local function, whose read precedes an effect or builds its arguments unless the two take exclusive branches, where a local helper's operations run where the step calls it, a read is a Query or a raw Kernel read and an effect is a Mutation or a call its types prove durable; a call of unprovable kind is not counted\tpublication-workflow.md\nFNC-EFFECT-STEP\tfunctions\tbehavior\twarning\tEvery step makes at most one effect, so a step that fails leaves no committed effect the Workflow cannot see\tIn a durable Workflow, report a step.run callback, inline or a named local function, where one run can make two effects, counting an effect a local helper runs on each of its calls and an effect in a loop or an iterating Array callback as several, and effects in exclusive branches of the step's body as one run each, where an effect is a Mutation or a call its types prove durable; a call of unprovable kind is not counted\tpublication-workflow.md\nFNC-STEP-RETRY\tfunctions\tbehavior\twarning\tEvery effect a durable step repeats when it is retried survives the repetition: Mutations, durable calls and keyed Integration operations carry the step key, and any other effect is idempotent\tIn a durable Workflow, report a step.run callback, inline or a named local function, that invokes a callable its types prove not durable, invokes an untyped Path, written as a string or typed as one, or calls global fetch\tpublication-workflow.md\nFNC-REPLAY-VALUES\tfunctions\tbehavior\twarning\tCode of a durable Workflow outside its steps reads no value that differs on replay: the clock and randomness are read inside a step\tIn a durable Workflow, report a read of the global clock or randomness, Date.now, new Date() or Date() without argument, Math.random, crypto.randomUUID, crypto.getRandomValues or performance.now, in the run's own body, in a function it invokes immediately or an iterating Array callback there, including the arguments of a step call; a step callback and any other nested function are not inspected\tpublication-workflow.md\nFNC-STATE-CODEC\tfunctions\tbehavior\terror\tEvery step result and inter-step value is undefined or portable JSON data\tInspect step values and report actions, clients, symbols, bigint, cycles, or class instances\tpublication-workflow.md\nFNC-RECOVERY\tfunctions\tbehavior\terror\tWhen compensation or unknown-outcome branches exist, they are explicit and rely only on declared operation semantics\tInspect existing recovery branches and report guessed outcomes or compensation without exact evidence\tpublication-workflow.md\nFNC-XDOM-DECLARED\tfunctions\tbehavior\terror\tActions and Workflows invoke direct declared Domain dependencies through explicit-authority dependency invokers or canonical typed kernel.invoke references and import no foreign handler\tResolve handler imports, direct dependency aliases, explicit caller/self authority, selectors, and typed references; reject foreign imports, implicit or chained authority, undeclared aliases and forged references, and report opaque bindings as indeterminate\tcross-domain-workflow.md\nFNC-XDOM-REQ\tfunctions\tbehavior\terror\tEvery selected remote callable has one exact Domain Function requirement including its defining Class and static or instance kind\tCompare each statically selected remote callable with exact Domain Function requirements; report missing requirements and mark opaque selectors or requirement lists indeterminate\tcross-domain-workflow.md\nINT-BOUNDARY\tintegrations\tarchitecture\terror\tEvery Integration represents required behavior across an external, remote-Domain, substitution, process, or trust boundary\tIdentify the boundary for every contract and report behavior that can remain ordinary local Domain code\tpayment-authorization.md\nINT-NEUTRAL\tintegrations\tdeclaration\terror\tEvery Integration owns provider-neutral requests, evidence, correlation, idempotency, trust, and expected failure semantics needed by consumers\tInspect consumers and contracts and report provider fields or missing stable boundary semantics\tid-allocation.md\nINT-PURE\tintegrations\tdependency\terror\tIntegrations remain provider- and execution-boundary-neutral and import no concrete client, credential, configuration, Provider, Action, or Workflow\tResolve runtime and provider imports and report every conclusive concrete or execution-boundary dependency\tdocument-signing.md\nINT-ABILITY-NAME\tintegrations\tstructure\terror\tIntegration submodules are named by required ability and never mirror Schema entities mechanically\tCompare Integration and Schema submodules and report a contract without an independent boundary ability\tobject-storage.md\nRTE-RECIPE\troutes\tdeclaration\terror\tEvery native HTTP Route targets exactly one admitted Action or Workflow recipe\tResolve every route target and report forged missing or several recipes\taction-route.md\nRTE-MAPPING\troutes\tdataflow\terror\tEvery callable input field and instance receiver is mapped exactly once from path query header method or body input\tCompile each route against its resolved callable and reject incomplete ambiguous or unknown mappings\tinstance-route.md\nRTE-CREDENTIAL\troutes\tdataflow\terror\tEvery external credential source is explicit and is never also mapped as callable input\tCompile credential and input mappings and reject duplicate reserved or implicit authority sources\tcredential-route.md\nRTE-ONE-FILE\troutes\tstructure\terror\tEvery Route declaration has one business-intent kebab-case file and Routes composition contains no inline declaration\tInventory route declarations and report generic grouped or inline ownership\tapplication-routes.md\nPRV-INT-IMPL\tproviders\tarchitecture\terror\tEvery Provider implements one or more declared Integrations across a named external or remote-Domain boundary\tIdentify the boundary and implemented contracts and report a Provider without both\tpayment-provider.md\nPRV-BOUNDARY-NAME\tproviders\tstructure\terror\tProvider submodules are named by external system, protocol, or trust boundary rather than Domain entity\tInspect every submodule name and report one justified only by Schema vocabulary\tobject-storage-provider.md\nPRV-ADMIT-RESULT\tproviders\tdataflow\terror\tEvery boundary value is admitted before Integration evidence and recognized boundary failures become stable Integration failures\tTrace input and failure paths and report missing admission, leaked boundary errors, broad mapping, or swallowed defects\twebhook-admission.md\nPRV-NO-DOMAIN\tproviders\tdependency\terror\tProviders perform no local Domain graph operation, business decision, local Action call, or Workflow orchestration\tResolve Provider imports and call graphs and require zero excluded operations\tboundary-composition.md\nPRV-XDOM-TYPED\tproviders\tdependency\terror\tRemote-Domain Providers pass SDK-derived typed callable references to the caller-bound invocation capability without never casts\tInspect Provider execution invoke calls and reject references not constructed through SDK reference, opaque or fabricated references, and never-cast arguments\tremote-domain.md\nPRV-XDOM-REQ\tproviders\tdependency\terror\tEvery statically resolved remote-Domain Provider invocation has one exact Domain Function requirement\tMatch each invocation-bound public callable reference to the same foreign facade and Function selector under Domain requirements; preserve opaque references or composition as indeterminate\tremote-domain.md\nPRV-XDOM-PUBLIC\tproviders\tdependency\terror\tA remote-Domain Provider uses the remote public facade and invokes at most one public callable per Integration operation\tResolve receiver and facade origins for each remote operation and report private access, missing Integration ownership, unrelated calls, or several public invocations\tremote-domain.md\nVIW-PROJECTION\tviews\tdeclaration\terror\tEvery View converts public Domain values or named Query observations into UI props and connects each action to a named bounded Mutation or public callable contract\tInspect View outputs and actions and report behavior without a Schema, Query, UI, Mutation, Rule, or public callable owner\tdetail-view.md\nVIW-SCHEMA-DECL\tviews\tdeclaration\terror\tSchema owns every DSL View declaration and Views declares no Domain schema construct\tScan View declarations and reject Classes, Properties, Policies, Methods, Actions, or DSL Views\tarticle-list.md\nVIW-NO-COMPOSE\tviews\tdeclaration\terror\tThe Domain definition owns frontend deployment composition and Views never calls defineFrontend\tResolve direct imported defineFrontend calls in Views and report SDK constructor calls while ignoring unrelated local functions\tfrontend-composition.md\nVIW-DEPS\tviews\tdependency\terror\tViews import only Schema and its StateMachines, pure Rules, named Queries, bounded named Mutations, UI, shell-react primitives, public callable contracts, and presentation libraries\tInspect resolved imports and report dependencies or raw graph APIs outside the allowlist\tnavigation.md\nVIW-ACTIONS\tviews\tdataflow\terror\tEvery View action executes a named caller-authorized atomic Mutation or invokes a public callable; presentation state is never authorization evidence\tTrace action and authority paths and report inline or raw graph documents, elevated or effectful Mutation use, private Action imports, direct Integration calls, or authority derived from presentation\tform-actions.md\nUI-PRES-DEPS\tui\tdependency\terror\tEvery UI import is a sibling UI module or an external library used only for presentation\tInspect resolved imports and used APIs and report Domain, I/O, persistence, authorization, routing, or provider behavior\tstatus-panel.md\nUI-NO-DOMAIN\tui\tdependency\terror\tUI imports no Domain layer or Domain package facade\tResolve the UI import graph and require zero Domain paths\tresult-list.md\nUI-PURE\tui\tbehavior\terror\tUI performs no I/O, graph access, storage, authorization, business validation, provider call, routing, or Domain result mapping\tInspect components and hooks and report the exact excluded call or branch\tconfirmation-dialog.md\nUI-CALLBACKS\tui\tdataflow\terror\tUI accepts presentation props and forwards intent through callbacks without constructing Domain commands\tInspect props and event handlers and report Domain identities, command construction, or business decisions\tform.md\nUTL-DOM-AGNOSTIC\tutils\tarchitecture\terror\tEvery Utils export is Domain-agnostic and contains no Domain declaration, identity, decision, graph definition, or Workflow step\tInspect signatures and implementations and report the exact Domain concept or business behavior\tresult.md\nUTL-REUSED\tutils\tarchitecture\terror\tEvery Utils extension serves two independent semantic consumers or one package-wide execution boundary\tList direct consumers and report an extension satisfying neither condition\tjson-codec.md\nUTL-PUBLIC-DEPS\tutils\tdependency\terror\tUtils imports only public Kernel, DSL, SDK, standard-library, and sibling Utils modules\tResolve the Utils import graph and reject Domain layers, Providers, or private package paths\tjson-codec.md\nUTL-LIGHTWEIGHT\tutils\tarchitecture\terror\tUtils is private and owns no durable engine, planner, compiler, Repository, service locator, or dependency container\tInspect package exports and declarations and report public exposure or any forbidden framework machinery\tresult.md\nSCR-OPERATOR\tscripts\tbehavior\terror\tEvery root Script implements a supported operator workflow with declared inputs, outcomes, failures, and proof\tInspect each Script contract and report disposable tasks or missing operator semantics\tbackup.md\nSCR-PUBLIC-DEPS\tscripts\tbehavior\terror\tScripts import only dependency-DAG-authorized public facades, standard libraries, and operator libraries and define no Domain behavior\tResolve imports and inspect branches and report private paths, business decisions, graph definitions, or callable behavior\tupgrade.md\nSCR-TEST-DRIVERS\tscripts\tbehavior\terror\tDisposable setup, fixtures, resets, and scenario drivers live under tests/scripts rather than root Scripts\tClassify every Script by supported operator contract and report evidence-only programs at the root\trestore.md\nTST-SYS-OWNER\ttests\tevidence\terror\tRoot Tests owns cross-layer journeys, environments, harnesses, scenarios, seeds, fixtures, and disposable scripts\tInventory evidence support code and report cross-layer artifacts outside Tests or production semantics inside Tests\tinterruption-scenario.md\nTST-COLOCATED\ttests\tevidence\terror\tEvery semantic production submodule owns focused evidence in its local __tests__ directory\tJoin production submodules to focused test directories and report missing owners\tfocused-rule.md\n",
|
|
4
|
+
rules: "id\tscope\tkind\tseverity\tmessage\tverification\texample\nOWN-SEMANTIC\townership\tarchitecture\terror\tEvery semantic fact, rule, representation, transition, and failure meaning has exactly one owner\tInventory declarations by meaning and report each duplicate authority or ownerless concept\tsemantic-owner.md\nMOD-SUBMODULE\tmodules\tstructure\terror\tEvery semantic source file lives in a dedicated semantic submodule or its registered layer facade\tClassify every layer-root source file and report files outside the registered facade or public index\tsemantic-owner.md\nMOD-REQUIRED\tmodules\tstructure\terror\tEvery required layer and root file declared by the injected layout exists\tCompare admitted project entries with required layout entries and report each missing path\trequired-layout.md\nMOD-GOVERNED\tmodules\tstructure\terror\tEvery source file admitted by the Domain compilation scope belongs to a declared layer or supported root\tClassify admitted source paths after declared workspace and tooling delegation and report each unowned path\tgoverned-source.md\nROOT-FACADE\troots\tstructure\terror\tEvery registered layer facade is exposed through a curated public index\tInspect each layer index and facade and report private-owner behavior or misplaced facade declarations\tpackage-facade.md\nROOT-COMPOSE\troots\tstructure\terror\tPackage roots compose only policy-backed Schema, Runtime, frontend deployment, native Routes, Provider-backed Integrations, and supported package journeys\tInspect declared composition and package roots and report behavior, provider protocol logic, recursive barrels, or unsupported exports\tcomposition-root.md\nROOT-PACKAGE\troots\tevidence\terror\tEvery public Schema package subpath maps one admitted source entrypoint to its deterministic published declaration and JavaScript targets\tCompare source and publish exports and reject missing duplicate non-Schema locally linked generated or Kernel-leaking package artifacts\tmulti-domain-package.md\nDEP-ALLOWLIST\tdependencies\tdependency\terror\tEvery direct cross-layer import and its runtime or type-only kind appears in the dependency allowlist and dependencies between distinct layers are acyclic\tResolve source imports, reject every absent or kind-mismatched edge, and detect cycles after excluding evidence edges\tsemantic-owner.md\nIMP-FACADE\timports\tdependency\terror\tEvery cross-submodule import uses the semantic owner's facade and every foreign Domain import uses its public package facade\tResolve imports and report private deep paths outside the importing submodule\tcross-domain.md\nIMP-SDK-BOUNDARY\timports\tdependency\terror\tDomain source imports Kernel Core and DSL authoring values only through semantic SDK subpaths\tInspect every static and literal dynamic import and report module specifiers rooted at @astrale-os/kernel-core or @astrale-os/kernel-dsl\tsdk-boundary.md\nIMP-LAYER-ALIAS\timports\tdependency\terror\tEvery local import crossing a layer or semantic-submodule boundary uses the registered # layer alias\tResolve relative imports and report each one whose target leaves the importing semantic submodule\tlayer-aliases.md\nIMP-ALIAS-CFG\timports\tdependency\terror\tPackage and TypeScript resolution exactly implement each active layer-facade and semantic-submodule alias\tCompare active and required layers with the injected alias registry and report missing, undeclared, or drifted mappings\talias-configuration.md\nIMP-STATIC\timports\tdependency\terror\tProduction dependency edges use analyzable static ESM declarations or literal import calls\tReject require calls, import-equals declarations, nonliteral import calls, and unresolved static dependency forms\tstatic-imports.md\nTYP-OWNER\ttypes\tarchitecture\terror\tEvery type and reusable expected error is colocated with the semantic concept that defines its meaning\tTrace each declaration to its semantic authority and report catch-all or remotely owned values\texpected-failure.md\nERR-EXPECTED\terrors\tdataflow\terror\tBoundaries map only declared expected failures and propagate unexpected defects\tInspect catches and result mappings and report broad fallback, swallowed defects, or mappings without a declared source failure\texpected-failure.md\nTST-NO-PROD-IMP\ttests\tdependency\terror\tProduction source imports no root or colocated Test artifact\tResolve production imports and report targets under Root Tests, __tests__, or test, spec, bench, and perf source files\ttest-import-boundary.md\nABS-EARNED\tabstractions\tarchitecture\terror\tAn invariant or real boundary earns an abstraction; reuse alone requires two independent consumers and no duplicated semantic behavior\tIdentify the invariant, boundary, or independent consumers for each abstraction and report reuse wrappers that duplicate an owner's semantics\tsemantic-owner.md\nABS-NO-REPO\tabstractions\tarchitecture\terror\tDomain source places no collection-shaped persistence facade between business code and canonical Query or Mutation definitions\tInspect persistence-facing contracts and report abstractions that replace graph identity, traversal, observation, or atomic change semantics\tsemantic-owner.md\nABS-CANON-GRAPH\tabstractions\tdeclaration\terror\tDomain source declares no alternate Query or Mutation language, AST, compiler, planner, or wire representation\tInspect graph-related declarations and report semantics not identical to canonical Kernel Query or Mutation values\tsemantic-owner.md\nTRUST-ADMIT-ONCE\ttrust\tdataflow\terror\tEvery untrusted value is admitted or translated exactly once at its owning boundary\tTrace values from each external boundary and report missing admission or repeated structural validation\texpected-failure.md\nQLT-EXHAUSTIVE\tquality\tbehavior\terror\tEvery closed alternative is handled exhaustively and no required failure becomes placeholder success\tTrace closed unions and failure paths and report permissive defaults, placeholder success, or catch-and-continue behavior\texpected-failure.md\nQLT-CANON-VALUES\tquality\tdataflow\terror\tNo unchecked cast fabricates a canonical Kernel identity, QueryAST, MutationAST, or admitted schema value\tScan casts to canonical values and require an owning constructor or decoder for each\tsemantic-owner.md\nQLT-DEF-IDS\tquality\tdeclaration\terror\tEvery top-level Query and Mutation definition has a stable literal ID unique in its owning namespace\tExtract top-level definition IDs and report missing, dynamic, malformed, or duplicate values\tdefinition-identities.md\nQLT-TYPED-COORD\tquality\tdeclaration\terror\tQueries and Mutations derive graph coordinates from resolved DSL definitions instead of raw string or structural reconstruction\tReject raw PropertyKey calls and structural ClassPath objects; require canonical resolved Classes Properties and keys at graph boundaries\ttyped-coordinates.md\nNODE-INHERITED\tnodes\tdeclaration\terror\tNo Node Class redeclares name, description, createdAt, or updatedAt inherited from Named, Descriptable, and Timestamped\tScan Node Class Properties and report each inherited field redeclaration\tsemantic-owner.md\nDOM-PUBLIC-DEPS\tdomains\tdependency\terror\tEvery directly referenced foreign-Domain graph declaration has one exact Schema dependency\tResolve foreign Schema, Query, and Mutation graph references and report each package without one exact declared Schema dependency\tcross-domain.md\nDOM-CALL-DECLARED\tdomains\tdependency\terror\tCross-Domain calls use exact declared public Schema dependencies and typed invocation; Integrations are optional consumer-owned boundaries\tTrace remote invocations and reject undeclared targets, private imports, forged references, and missing exact Domain Function requirements\tremote-domain-call.md\nDOM-ATOMICITY\tdomains\tbehavior\terror\tA cross-Domain change claims atomicity only when it is one MutationAST on one graph; calls combined with other effects are Workflow steps\tTrace atomicity and effect claims and report multiple commits, service boundaries, or foreign calls combined in a Action\tcross-domain.md\nSCH-SUBMODULE\tschema\tstructure\terror\tEvery Schema source path belongs to the registered facade, one canonical shared declaration kind, or one business-module facade or canonical declaration kind\tClassify admitted Schema source paths including shared and module-owned errors directories and report flat files or source-bearing directories outside the canonical Schema vocabulary\tschema-facade.md\nSCH-ONE-DECL\tschema\tdeclaration\terror\tEvery Schema declaration leaf file exports exactly one locally authored declaration of its directory kind and every declaration-kind index is a curated facade\tInspect runtime exports in Classes, Functions, Policies, States, and Views; resolve canonical SDK constructor origins and report zero, several, re-exported, aggregated, wrong-kind, or index-owned values\tdeclaration-file.md\nSCH-DECL-ONLY\tschema\tdeclaration\terror\tSchema performs no handler execution, Query execution, Mutation submission, Integration call, Workflow step, or Provider call\tResolve Schema imports and call graphs and require zero excluded operations\tpublication-callables.md\nSCH-EXACT-TYPES\tschema\tdeclaration\terror\tSchema authoring values preserve their exact inferred DSL types instead of widening to generic builder contracts\tScan Schema declarations and action returns for explicit generic builder authoring annotations\tschema-facade.md\nSCH-ICON-REQUIRED\tschema\tdeclaration\terror\tEvery Node Class must explicitly declare one admitted SVG icon\tInspect each SDK nodeClass and Node-kind defineClass declaration and report statically proven missing icon values while preserving opaque configurations as indeterminate\tclass-icon.md\nSCH-ICON-NEUTRAL\tschema\tdeclaration\twarning\tEvery neutral Node Class icon should be replaced with a meaningful icon\tInspect each SDK nodeClass and Node-kind defineClass declaration and report explicit classIcon.neutral or exact neutral SVG values\tclass-icon.md\nSCH-POLICY-AUTH\tschema\tdeclaration\terror\tCallable authority and existential Node scope are declared explicitly through Policy and Action implementations add no private authorization rule\tTrace callable admission and existential Node binders; report hidden authority or an ambiguous Node extent\tpolicy.md\nSCH-POLICY-NAME\tschema\tdeclaration\twarning\tEvery Policy is named as the sentence its subject completes, in the Domain's words: each business hop to the object in order, the object last\tRead each Policy name against its match and report a permission prefix such as can or may, a graph mechanics word such as source, target, sub, super, subject, object, or caller, or a business hop of the match the name omits\tpolicy.md\nSCH-STATE-SOURCE\tschema\tdeclaration\terror\tEvery persisted StateMachine vocabulary originates from an exported authority in the same Schema business module rather than a copied literal set\tResolve exact StateMachine and stateProperty origins; report same-owner copied literals and reject cross-module association\tarticle-schema.md\nSCH-STATE-RELATION\tschema\tdeclaration\terror\tEvery StateMachine is one exported static immutable finite relation without parallel vocabulary authorities\tInspect Schema module machines and exported sibling values for split or copied topology\tarticle-status.md\nSCH-STATE-PURE\tschema\tdeclaration\terror\tStateMachine topology contains no behavior, effects, guards, clocks, retry, recovery, or orchestration\tInspect files that declare StateMachine authorities for behavioral exports, boundary imports, and effectful calls\tstate-pure.md\nSCH-EDGE-KEY-ORDER\tschema\tdeclaration\terror\tA Policy edge in role form lists the source's role first\tResolve the Edge Class's declaration and report ends whose first key is another role than the source's; an unresolved Class or a spread or computed key proves nothing\tpolicy-edge.md\nRUL-SYNC\trules\tbehavior\terror\tEvery Rule is synchronous and returns no Promise, continuation, generator, or asynchronous iterator\tInspect Rule signatures and result types and reject asynchronous forms\tnormalization.md\nRUL-PURE\trules\tbehavior\terror\tRules perform no I/O and depend on no graph executor or Domain execution boundary\tResolve imports and effect origins, permitting pure standard value transformations while reporting conclusive I/O and Domain execution dependencies\tpublish-eligibility.md\nRUL-EXPL-FACTS\trules\tbehavior\terror\tEvery clock value, random value, identity, limit, and environmental observation used by a Rule is an explicit input\tTrace every value source and report reads from ambient state, globals, process state, or hidden singletons\ttime-facts.md\nRUL-CLOSED-DEC\trules\tbehavior\terror\tEvery expected business alternative is represented by a closed decision value rather than thrown control flow\tInspect Rule branches and report expected alternatives represented by exceptions or open optional fields\tpublish-eligibility.md\nQRY-CANON\tqueries\tdataflow\terror\tQuery V6: Every graph request produced by a Query definition is one canonical QueryAST built through Kernel Query APIs\tTrace request construction and reject every non-canonical graph document\tv6-filtered-query.md\nQRY-CONTRACT\tqueries\tdataflow\terror\tA Query owns its input, observation, optional business projection, pagination, and expected failures\tInspect each Query definition and report a required concern owned elsewhere or omitted\tquery-errors.md\nQRY-SINGLE\tqueries\tdataflow\terror\tQuery V6: Every authored single Query definition declares exactly one build callback and at most one project callback\tInspect definition properties and canonical roots; report opaque helper origins as ambiguity rather than assuming cardinality\tv6-single-query.md\nQRY-COMPOSE-TYPED\tqueries\tdataflow\terror\tQuery V6: A composite Query constructs one closed QueryPlan containing only typed single-Query leaves, symbolic output references, and explicit result composition\tInspect plan construction, report unresolved call origins as ambiguity, and reject nested composites, raw sessions, graph clients, result-time callbacks, arbitrary promises, or Domain effects\tv6-dependent-query.md\nQRY-COMPOSE-STABLE\tqueries\tdeclaration\terror\tQuery V6: Every composite Query leaf has a stable semantic literal ID unique within its definition\tInspect declared Query leaves and reject dynamic, malformed, or duplicate leaf identifiers\tv6-dependent-query.md\nQRY-COLL-FANOUT\tqueries\tdataflow\twarning\tQuery V6: Three or more independent same-kind complete-Class collection leaves use one explicit query.union group\tInfer collection kind from canonical definition types and print the direct named replacement plus logical and physical plan counts\tv6-collection-union.md\nQRY-PROJECT-PURE\tqueries\tdataflow\terror\tEvery Query project or output callback is synchronous and performs only pure value transformation\tInspect project and output callback syntax and call graphs and report asynchronous continuation, I/O, mutation, nondeterminism, hidden query execution, or effects\tprojection.md\nQRY-SNAPSHOT\tqueries\tdataflow\terror\tA Query of several reads or steps, a composite, or a paginated Query makes no point-in-time graph snapshot claim beyond one Kernel invocation\tReject shared-snapshot claims across a Query's facets, steps or split reads, composite leaves, unions or continuations and route stronger consistency to an explicit Kernel facility\tsteps.md\nQRY-CLOCK\tqueries\tdataflow\terror\tA Query's build and output read no clock: a Query that depends on the time takes now in its input\tInspect build, each of its steps, and output written inline, their callbacks included, and report Date.now, Date, performance.now, process.hrtime or process.uptime called, new Date() without arguments, or Temporal.Now\tdefined-query.md\nQRY-ROWS\tqueries\tdataflow\twarning\tA Query's bounds multiply to at most 10,000 rows\tCount each read's rows as a call counts them, from constant bounds only, and report a Query past 10,000 rows with its count\tdefined-query.md\nQRY-FALSY\tqueries\tdataflow\twarning\tA condition entry that compares with a value that may be false or 0 tests the value with !== undefined, or states that false or 0 means no filter: gated on the value itself, the entry is falsy and skipped\tInspect the condition entries of build and its steps wherever falsy entries are skipped: what a where, is, some, none, every, atLeast, atMost or exactly callback returns, and the arguments of and and or. Report an entry A && B, or A ? B : a falsy literal, whose B passes the value A reads to eq, in, gt, gte, lt, lte, between, startsWith, atMost or exactly when the type of A admits false or a number\tfiltered-query.md\nMUT-PLAN-REQ\tmutations\tdependency\terror\tEvery identity operation and foreign Mutation plan declares the exact Kernel Function and foreign Class authority it uses\tInspect SDK MutationAST builders and Kernel Provision or Register calls and match every foreign Class operation and identity syscall invocation to Domain requirements\tprovision-plan.md\nMUT-LOCAL-ALIAS\tmutations\tdeclaration\terror\tEvery literal Mutation createNode alias is a canonical local binding accepted by the Kernel\tInspect statically resolved createNode as values and reject invalid local binding literals before runtime\tatomic-mutation.md\nMUT-CANON\tmutations\tdataflow\terror\tEvery Mutation definition builds one synchronous change through the canonical builder and constructs no alternate or nested graph document\tInspect every definition build callback and reject missing, asynchronous, alternate, or nested Mutation construction\tatomic-mutation.md\nMUT-CONTRACT\tmutations\tdataflow\terror\tA Mutation owns its input, preconditions, operations, optional business projection, and expected failures\tInspect each definition and report required mutation semantics owned elsewhere or omitted\tcreate-aggregate.md\nMUT-PRECONDS\tmutations\tdataflow\terror\tRules decide eligibility and every live graph condition required for safety is encoded as a precondition in the same MutationAST\tMap decisions to preconditions and report duplicated eligibility or safety enforced only by an earlier observation\tconditional-update.md\nMUT-FRAGMENTS\tmutations\tdataflow\terror\tReusable fragments receive the callback-scoped MutationBuilder and contribute only to the same MutationAST\tResolve fragment signatures and calls and reject escaped builders, opaque documents, or nested MutationAST construction\tmutation-fragments.md\nMUT-PURE\tmutations\tdataflow\terror\tMutation definitions perform no session call, external effect, retry, compensation, or second submission\tScan definition call graphs and require zero excluded operations\tedge-change.md\nMUT-MULTI-WFL\tmutations\tdataflow\terror\tA change requiring several MutationAST values is a Workflow and is never exposed as one atomic Mutation\tTrace multi-commit changes and report definitions or names claiming single-mutation atomicity\tdelete-node.md\nMUT-STATE-INITIAL\tmutations\tdataflow\terror\tEvery StateMachine-backed node is created from its machine's initial state\tResolve machine-backed Property initializers and require the canonical machine.initial value rather than a copied state literal\tstate-transition.md\nMUT-STATE-ATOMIC\tmutations\tdataflow\terror\tEvery persisted machine-state change consumes one allowed decision and commits its stale-state precondition and update in the same MutationAST\tInspect machine-backed writes and require transition with the canonical Schema module machine and one allowed decision; reject direct target writes and split precondition updates\tstate-transition.md\nFNC-ONE-IMPL\tfunctions\tbehavior\terror\tEvery registered handler binding resolves to exactly one implementation owned by one semantic Functions submodule\tResolve the handler registry and report non-Action owners or duplicate registrations; SDK typing owns callable exhaustiveness\tsynchronous-result.md\nFNC-ONE-EFFECT\tfunctions\tbehavior\terror\tEvery Action performs at most one effect, as its terminal operation; the Queries and read-only calls it needs precede that effect\tTrace every path and report two effects, an operation after the effect, or hidden orchestration\tmutation-operation.md\nFNC-OP-KINDS\tfunctions\tbehavior\terror\tA semantic asynchronous operation is one Query, Mutation, Integration call, dependency invocation, or canonical Kernel operation; a Query or a call that changes no state is an observation, every other operation is an effect\tClassify every awaited operation including dependency and Kernel calls as an observation or an effect; report undeclared kinds and hidden multiple effects\tintegration-operation.md\nFNC-BOUNDARIES\tfunctions\tbehavior\terror\tHandlers use self-default kernel and graph capabilities, query and mutate under the authority as names, explicit-authority direct dependencies, and optional declared Integrations; explicit Kernel and graph authority modes are available\tInspect context use, authority selection, dependencies, imports and failure mapping; reject raw unbound graph executors, foreign handler imports, implicit authority changes and swallowed defects\tremote-integration.md\nFNC-BINARY-RESULT\tfunctions\tbehavior\terror\tA binary Action returns detached buffered bytes or streaming bytes with admitted media type status and application headers without collecting or value-framing a provider stream\tExercise buffered and streaming results through their native route; verify exact bytes status headers cancellation and invalid output rejection\tnative-byte-response.md\nFNC-MULTISTEP\tfunctions\tbehavior\terror\tEvery Workflow definition contains at least two effect sites that cannot commit together\tInventory effect sites in the definition and report fewer than two or effects one Mutation could commit; early exit, rejection, and recovery paths may execute fewer\tpublication-workflow.md\nFNC-STEP-EFFECTS\tfunctions\tbehavior\terror\tEvery semantic asynchronous operation runs inside a named step: step.run, or the durable step.query and step.mutate shorthands\tTrace operations and report each one outside a named step\tpublication-workflow.md\nFNC-STEP-IDS\tfunctions\tbehavior\terror\tEvery step identifier is a stable non-empty kebab-case literal unique within its Workflow\tExtract step identifiers and reject dynamic, malformed, empty, or duplicate values\tpublication-workflow.md\nFNC-NO-NEST\tfunctions\tbehavior\terror\tNo step.run callback starts another step, whether step.run, step.query or step.mutate, directly or through a reachable helper\tInspect callback call graphs and report every nested step path\tpublication-workflow.md\nFNC-INT-TYPES\tfunctions\tdeclaration\terror\tWorkflow Integration requirements derive from declared Integration definitions and the SDK projects their clients\tReject Workflow-owned operation interfaces and require its definition generic to reference the declared Integration registry\tcross-domain-workflow.md\nFNC-STEP-READS\tfunctions\tbehavior\terror\tA durable step reads nothing before its effect: the effect builds its request and guards only from the Workflow input and earlier step results, so a retried step resends the same request\tIn a durable Workflow, report a step.run callback, inline or a named local function, whose read precedes an effect or builds its arguments unless the two take exclusive branches, where a local helper's operations run where the step calls it, a read is a Query or a raw Kernel read and an effect is a Mutation or a call its types prove durable; a call of unprovable kind is not counted\tpublication-workflow.md\nFNC-EFFECT-STEP\tfunctions\tbehavior\twarning\tEvery step makes at most one effect, so a step that fails leaves no committed effect the Workflow cannot see\tIn a durable Workflow, report a step.run callback, inline or a named local function, where one run can make two effects, counting an effect a local helper runs on each of its calls and an effect in a loop or an iterating Array callback as several, and effects in exclusive branches of the step's body as one run each, where an effect is a Mutation or a call its types prove durable; a call of unprovable kind is not counted\tpublication-workflow.md\nFNC-STEP-RETRY\tfunctions\tbehavior\twarning\tEvery effect a durable step repeats when it is retried survives the repetition: Mutations, durable calls and keyed Integration operations carry the step key, and any other effect is idempotent\tIn a durable Workflow, report a step.run callback, inline or a named local function, that invokes a callable its types prove not durable, invokes an untyped Path, written as a string or typed as one, or calls global fetch\tpublication-workflow.md\nFNC-REPLAY-VALUES\tfunctions\tbehavior\twarning\tCode of a durable Workflow outside its steps reads no value that differs on replay: the clock and randomness are read inside a step\tIn a durable Workflow, report a read of the global clock or randomness, Date.now, new Date() or Date() without argument, Math.random, crypto.randomUUID, crypto.getRandomValues or performance.now, in the run's own body, in a function it invokes immediately or an iterating Array callback there, including the arguments of a step call; a step callback and any other nested function are not inspected\tpublication-workflow.md\nFNC-STATE-CODEC\tfunctions\tbehavior\terror\tEvery step result and inter-step value is undefined or portable JSON data\tInspect step values and report actions, clients, symbols, bigint, cycles, or class instances\tpublication-workflow.md\nFNC-RECOVERY\tfunctions\tbehavior\terror\tWhen compensation or unknown-outcome branches exist, they are explicit and rely only on declared operation semantics\tInspect existing recovery branches and report guessed outcomes or compensation without exact evidence\tpublication-workflow.md\nFNC-XDOM-DECLARED\tfunctions\tbehavior\terror\tActions and Workflows invoke direct declared Domain dependencies through explicit-authority dependency invokers or canonical typed kernel.invoke references and import no foreign handler\tResolve handler imports, direct dependency aliases, explicit caller/self authority, selectors, and typed references; reject foreign imports, implicit or chained authority, undeclared aliases and forged references, and report opaque bindings as indeterminate\tcross-domain-workflow.md\nFNC-XDOM-REQ\tfunctions\tbehavior\terror\tEvery selected remote callable has one exact Domain Function requirement including its defining Class and static or instance kind\tCompare each statically selected remote callable with exact Domain Function requirements; report missing requirements and mark opaque selectors or requirement lists indeterminate\tcross-domain-workflow.md\nINT-BOUNDARY\tintegrations\tarchitecture\terror\tEvery Integration represents required behavior across an external, remote-Domain, substitution, process, or trust boundary\tIdentify the boundary for every contract and report behavior that can remain ordinary local Domain code\tpayment-authorization.md\nINT-NEUTRAL\tintegrations\tdeclaration\terror\tEvery Integration owns provider-neutral requests, evidence, correlation, idempotency, trust, and expected failure semantics needed by consumers\tInspect consumers and contracts and report provider fields or missing stable boundary semantics\tid-allocation.md\nINT-PURE\tintegrations\tdependency\terror\tIntegrations remain provider- and execution-boundary-neutral and import no concrete client, credential, configuration, Provider, Action, or Workflow\tResolve runtime and provider imports and report every conclusive concrete or execution-boundary dependency\tdocument-signing.md\nINT-ABILITY-NAME\tintegrations\tstructure\terror\tIntegration submodules are named by required ability and never mirror Schema entities mechanically\tCompare Integration and Schema submodules and report a contract without an independent boundary ability\tobject-storage.md\nRTE-CALLABLE\troutes\tdeclaration\terror\tEvery native HTTP Route targets exactly one admitted Action or Workflow definition\tResolve every route target and report forged missing or several definitions\taction-route.md\nRTE-MAPPING\troutes\tdataflow\terror\tEvery callable input field and instance receiver is mapped exactly once from path query header method or body input\tCompile each route against its resolved callable and reject incomplete ambiguous or unknown mappings\tinstance-route.md\nRTE-CREDENTIAL\troutes\tdataflow\terror\tEvery external credential source is explicit and is never also mapped as callable input\tCompile credential and input mappings and reject duplicate reserved or implicit authority sources\tcredential-route.md\nRTE-ONE-FILE\troutes\tstructure\terror\tEvery Route declaration has one business-intent kebab-case file and Routes composition contains no inline declaration\tInventory route declarations and report generic grouped or inline ownership\tapplication-routes.md\nPRV-INT-IMPL\tproviders\tarchitecture\terror\tEvery Provider implements one or more declared Integrations across a named external or remote-Domain boundary\tIdentify the boundary and implemented contracts and report a Provider without both\tpayment-provider.md\nPRV-BOUNDARY-NAME\tproviders\tstructure\terror\tProvider submodules are named by external system, protocol, or trust boundary rather than Domain entity\tInspect every submodule name and report one justified only by Schema vocabulary\tobject-storage-provider.md\nPRV-ADMIT-RESULT\tproviders\tdataflow\terror\tEvery boundary value is admitted before Integration evidence and recognized boundary failures become stable Integration failures\tTrace input and failure paths and report missing admission, leaked boundary errors, broad mapping, or swallowed defects\twebhook-admission.md\nPRV-NO-DOMAIN\tproviders\tdependency\terror\tProviders perform no local Domain graph operation, business decision, local Action call, or Workflow orchestration\tResolve Provider imports and call graphs and require zero excluded operations\tboundary-composition.md\nPRV-XDOM-TYPED\tproviders\tdependency\terror\tRemote-Domain Providers pass SDK-derived typed callable references to the caller-bound invocation capability without never casts\tInspect Provider execution invoke calls and reject references not constructed through SDK reference, opaque or fabricated references, and never-cast arguments\tremote-domain.md\nPRV-XDOM-REQ\tproviders\tdependency\terror\tEvery statically resolved remote-Domain Provider invocation has one exact Domain Function requirement\tMatch each invocation-bound public callable reference to the same foreign facade and Function selector under Domain requirements; preserve opaque references or composition as indeterminate\tremote-domain.md\nPRV-XDOM-PUBLIC\tproviders\tdependency\terror\tA remote-Domain Provider uses the remote public facade and invokes at most one public callable per Integration operation\tResolve receiver and facade origins for each remote operation and report private access, missing Integration ownership, unrelated calls, or several public invocations\tremote-domain.md\nVIW-PROJECTION\tviews\tdeclaration\terror\tEvery View converts public Domain values or named Query observations into UI props and connects each action to a named bounded Mutation or public callable contract\tInspect View outputs and actions and report behavior without a Schema, Query, UI, Mutation, Rule, or public callable owner\tdetail-view.md\nVIW-SCHEMA-DECL\tviews\tdeclaration\terror\tSchema owns every DSL View declaration and Views declares no Domain schema construct\tScan View declarations and reject Classes, Properties, Policies, Methods, Actions, or DSL Views\tarticle-list.md\nVIW-NO-COMPOSE\tviews\tdeclaration\terror\tThe Domain definition owns frontend deployment composition and Views never calls defineFrontend\tResolve direct imported defineFrontend calls in Views and report SDK constructor calls while ignoring unrelated local functions\tfrontend-composition.md\nVIW-DEPS\tviews\tdependency\terror\tViews import only Schema and its StateMachines, pure Rules, named Queries, bounded named Mutations, UI, shell-react primitives, public callable contracts, and presentation libraries\tInspect resolved imports and report dependencies or raw graph APIs outside the allowlist\tnavigation.md\nVIW-ACTIONS\tviews\tdataflow\terror\tEvery View action executes a named caller-authorized atomic Mutation or invokes a public callable; presentation state is never authorization evidence\tTrace action and authority paths and report inline or raw graph documents, elevated or effectful Mutation use, private Action imports, direct Integration calls, or authority derived from presentation\tform-actions.md\nUI-PRES-DEPS\tui\tdependency\terror\tEvery UI import is a sibling UI module or an external library used only for presentation\tInspect resolved imports and used APIs and report Domain, I/O, persistence, authorization, routing, or provider behavior\tstatus-panel.md\nUI-NO-DOMAIN\tui\tdependency\terror\tUI imports no Domain layer or Domain package facade\tResolve the UI import graph and require zero Domain paths\tresult-list.md\nUI-PURE\tui\tbehavior\terror\tUI performs no I/O, graph access, storage, authorization, business validation, provider call, routing, or Domain result mapping\tInspect components and hooks and report the exact excluded call or branch\tconfirmation-dialog.md\nUI-CALLBACKS\tui\tdataflow\terror\tUI accepts presentation props and forwards intent through callbacks without constructing Domain commands\tInspect props and event handlers and report Domain identities, command construction, or business decisions\tform.md\nUTL-DOM-AGNOSTIC\tutils\tarchitecture\terror\tEvery Utils export is Domain-agnostic and contains no Domain declaration, identity, decision, graph definition, or Workflow step\tInspect signatures and implementations and report the exact Domain concept or business behavior\tresult.md\nUTL-REUSED\tutils\tarchitecture\terror\tEvery Utils extension serves two independent semantic consumers or one package-wide execution boundary\tList direct consumers and report an extension satisfying neither condition\tjson-codec.md\nUTL-PUBLIC-DEPS\tutils\tdependency\terror\tUtils imports only public Kernel, DSL, SDK, standard-library, and sibling Utils modules\tResolve the Utils import graph and reject Domain layers, Providers, or private package paths\tjson-codec.md\nUTL-LIGHTWEIGHT\tutils\tarchitecture\terror\tUtils is private and owns no durable engine, planner, compiler, Repository, service locator, or dependency container\tInspect package exports and declarations and report public exposure or any forbidden framework machinery\tresult.md\nSCR-OPERATOR\tscripts\tbehavior\terror\tEvery root Script implements a supported operator workflow with declared inputs, outcomes, failures, and proof\tInspect each Script contract and report disposable tasks or missing operator semantics\tbackup.md\nSCR-PUBLIC-DEPS\tscripts\tbehavior\terror\tScripts import only dependency-DAG-authorized public facades, standard libraries, and operator libraries and define no Domain behavior\tResolve imports and inspect branches and report private paths, business decisions, graph definitions, or callable behavior\tupgrade.md\nSCR-TEST-DRIVERS\tscripts\tbehavior\terror\tDisposable setup, fixtures, resets, and scenario drivers live under tests/scripts rather than root Scripts\tClassify every Script by supported operator contract and report evidence-only programs at the root\trestore.md\nTST-SYS-OWNER\ttests\tevidence\terror\tRoot Tests owns cross-layer journeys, environments, harnesses, scenarios, seeds, fixtures, and disposable scripts\tInventory evidence support code and report cross-layer artifacts outside Tests or production semantics inside Tests\tinterruption-scenario.md\nTST-COLOCATED\ttests\tevidence\terror\tEvery semantic production submodule owns focused evidence in its local __tests__ directory\tJoin production submodules to focused test directories and report missing owners\tfocused-rule.md\n",
|
|
5
5
|
layers: frozenRows([
|
|
6
6
|
{
|
|
7
7
|
id: 'schema',
|
|
@@ -166,7 +166,7 @@ export const domainPolicySource = Object.freeze({
|
|
|
166
166
|
source: 'routes',
|
|
167
167
|
target: 'functions',
|
|
168
168
|
kind: 'runtime',
|
|
169
|
-
condition: 'Routes target admitted Action and Workflow
|
|
169
|
+
condition: 'Routes target admitted Action and Workflow definitions',
|
|
170
170
|
},
|
|
171
171
|
{
|
|
172
172
|
source: 'providers',
|
|
@@ -118,9 +118,9 @@ export const domainRuleRequirements = Object.freeze([
|
|
|
118
118
|
row('QRY-COLL-FANOUT', DATAFLOW),
|
|
119
119
|
row('QRY-PROJECT-PURE', DATAFLOW),
|
|
120
120
|
row('QRY-SNAPSHOT', DATAFLOW),
|
|
121
|
-
row('QRY-
|
|
122
|
-
row('QRY-
|
|
123
|
-
row('QRY-
|
|
121
|
+
row('QRY-CLOCK', DATAFLOW),
|
|
122
|
+
row('QRY-ROWS', DATAFLOW),
|
|
123
|
+
row('QRY-FALSY', DATAFLOW),
|
|
124
124
|
row('MUT-PLAN-REQ', DATAFLOW),
|
|
125
125
|
row('MUT-LOCAL-ALIAS', DECLARATION),
|
|
126
126
|
row('MUT-CANON', DATAFLOW),
|
|
@@ -153,7 +153,7 @@ export const domainRuleRequirements = Object.freeze([
|
|
|
153
153
|
row('INT-NEUTRAL', DECLARATION),
|
|
154
154
|
row('INT-PURE', DEPENDENCY),
|
|
155
155
|
row('INT-ABILITY-NAME', STRUCTURE),
|
|
156
|
-
row('RTE-
|
|
156
|
+
row('RTE-CALLABLE', DECLARATION_FLOW),
|
|
157
157
|
row('RTE-MAPPING', DATAFLOW),
|
|
158
158
|
row('RTE-CREDENTIAL', DATAFLOW),
|
|
159
159
|
row('RTE-ONE-FILE', STRUCTURE),
|
|
@@ -48,8 +48,8 @@ export const remind = defineWorkflow<typeof schema>()(
|
|
|
48
48
|
| `input`, `self`, `domain` | As for any Workflow; `self` is the receiver of an instance Method. |
|
|
49
49
|
| `execution` | Attested facts: `id`, `function {id, version}`, `kernel`, `initiator {principal, caller}`, `receiver`. Data, never authority. |
|
|
50
50
|
| `step.run(step, execute)` | Runs `execute` once and journals its portable output; a replay returns the journaled output. `execute` receives the capabilities of an Action, acting as the executor alone: `kernel`, `graph`, `query`, `mutate`, `dependencies` and `integrations`. `step` is the Step's id, or `{ id, retry, timeoutMs }` (see [Retry budgets and timeouts](#retry-budgets-and-timeouts)). |
|
|
51
|
-
| `step.query(step,
|
|
52
|
-
| `step.mutate(step,
|
|
51
|
+
| `step.query(step, query, input, { as: 'executor' })` | One journaled [Query](queries.md), read as the executor; a replay returns the result of its first run. A Query V6 definition takes `step.query(step, query, input?)`. |
|
|
52
|
+
| `step.mutate(step, mutation, input, { as: 'executor' })` | One journaled [defined Mutation](queries.md#defining-a-mutation), written as the executor; a replay returns the result of its first commit. A Mutation of the closure form takes `step.mutate(step, mutation, input)`. |
|
|
53
53
|
| `step.parallel(declare)` | Runs the Steps `declare` declares together, in one round trip to the engine; see [Parallel Steps](#parallel-steps). |
|
|
54
54
|
| `sleep(ms)` | Durable timer, kept by the engine even while the Domain is down. |
|
|
55
55
|
| `awaitSignal(name)` | Waits for the value `Execution.signal({ name, value })` delivers once under `name`, sent before or during the wait. |
|
|
@@ -302,18 +302,18 @@ details: { step: 'archive', refusal: { code: 2002, reason: 'AUTH_INVALID' } }
|
|
|
302
302
|
`code` is the Kernel error code; `reason`, when the Kernel gave one, its reason code. A refusal
|
|
303
303
|
behind another error, as its `cause`, counts as well; any other failure leaves `refusal` out.
|
|
304
304
|
|
|
305
|
-
A
|
|
305
|
+
A Query read that fails in `step.query` throws its `QueryError` into the Workflow at once, from the
|
|
306
306
|
journal on a replay: what it met will not change on a retry. A read the Kernel refused is the
|
|
307
|
-
exception, a failed attempt like any refusal. Uncaught, the outcome names the
|
|
308
|
-
|
|
307
|
+
exception, a failed attempt like any refusal. Uncaught, the outcome names the `QueryError`'s code
|
|
308
|
+
and the Query's id, never its details:
|
|
309
309
|
|
|
310
310
|
```ts
|
|
311
|
-
details: { step: 'invoice', query: { code: 'NOT_FOUND',
|
|
311
|
+
details: { step: 'invoice', query: { code: 'NOT_FOUND', id: 'billing.invoice.find' } }
|
|
312
312
|
```
|
|
313
313
|
|
|
314
|
-
A
|
|
314
|
+
A Query whose relation crosses a dependency's Class the Domain does not require fails its Step
|
|
315
315
|
the same way, with the `TypeError` that names the requirement it needs. Uncaught, the outcome's
|
|
316
|
-
message carries that requirement, and `query` names the
|
|
316
|
+
message carries that requirement, and `query` names the Query's id alone.
|
|
317
317
|
|
|
318
318
|
A failed Execution is never resumed: a new attempt is a new Execution, under a new key, so its Steps
|
|
319
319
|
run their effects again under new keys.
|
|
@@ -8,7 +8,7 @@ select `caller` or `self` explicitly.
|
|
|
8
8
|
| --- | --- | --- |
|
|
9
9
|
| `kernel` | Executing Domain | `.caller`, `.self` |
|
|
10
10
|
| `graph` | Executing Domain | `.caller`, `.self` |
|
|
11
|
-
| `query`, `mutate` | None for a
|
|
11
|
+
| `query`, `mutate` | None for a Query v7 or a defined Mutation; executing Domain for a V6 Query, and for a Mutation without `as` | `{ as: 'executor' }`, `{ as: 'caller' }`; a V6 Query through `graph` |
|
|
12
12
|
| `dependencies.alias` | Explicit selection required | `.caller.invoke`, `.self.invoke` |
|
|
13
13
|
|
|
14
14
|
`self` executes as the Domain. `caller` executes with the Domain as principal on behalf of the one
|
package/docs/legacy/query-v6.md
CHANGED
|
@@ -2,11 +2,11 @@
|
|
|
2
2
|
|
|
3
3
|
Query V6 is the Query form that builds a `QueryAST` with `Query.from(…)` inside a definition
|
|
4
4
|
projected from the Domain. Its definitions keep their names, types and behaviour, and are
|
|
5
|
-
deprecated in favour of [Query v7
|
|
5
|
+
deprecated in favour of [Query v7](../queries.md). Two places read with V6 only:
|
|
6
6
|
|
|
7
7
|
- a maintenance or repair session, where Query v7 is not served, so a migration reads with V6;
|
|
8
8
|
- a Host whose Kernel does not serve Query v7 and the Class of each row; [the Query
|
|
9
|
-
guide](../queries.md) says what a
|
|
9
|
+
guide](../queries.md) says what a Query v7 raises there.
|
|
10
10
|
|
|
11
11
|
## What V6 looks like
|
|
12
12
|
|
|
@@ -27,7 +27,7 @@ const tasks = await query(openTasks)
|
|
|
27
27
|
```
|
|
28
28
|
|
|
29
29
|
- `defineQuery<Schema>()` applied to one projector from the Domain makes a V6 definition. Applied
|
|
30
|
-
to an id and a spec, it makes a v7
|
|
30
|
+
to an id and a spec, it makes a Query v7.
|
|
31
31
|
- `query(definition, input?)` reads as the installed Domain; a V6 call takes no `as`.
|
|
32
32
|
- `page.size` is 256 when omitted. `pagination: { maximumPages }` follows every page and runs
|
|
33
33
|
`project` over the completed chain.
|
|
@@ -53,10 +53,10 @@ const tasks = await query(openTasks)
|
|
|
53
53
|
| `project(result)` | `output(results, input, { error, is })` |
|
|
54
54
|
| `defineCompositeQuery` and dependent leaves | A record of facets, or `steps(first, (earlier) => next, …)` |
|
|
55
55
|
| `defineCollectionQuery`, `query.union` | `.all({ max })`, `d.A.union(d.B)` |
|
|
56
|
-
| `query(definition, input)` | `query(
|
|
57
|
-
| `step.query(step, definition, input)` | `step.query(step,
|
|
56
|
+
| `query(definition, input)` | `query(query, input, { as: 'executor' \| 'caller' })` |
|
|
57
|
+
| `step.query(step, definition, input)` | `step.query(step, query, input, { as: 'executor' })` |
|
|
58
58
|
| `expect.query({ query, equals })` | `expect.none`, `expect.exists`, `expect.count`, `expect.unchanged` |
|
|
59
59
|
|
|
60
|
-
A V6 read that v7 cannot express is bridged inside the
|
|
60
|
+
A V6 read that v7 cannot express is bridged inside the Query v7; see
|
|
61
61
|
[Beyond v7](../queries.md#beyond-v7). A V6 definition moves to v7 once every Host it runs against
|
|
62
62
|
serves Query v7 and the Class of each row.
|
package/docs/queries.md
CHANGED
|
@@ -1,23 +1,23 @@
|
|
|
1
1
|
# Queries
|
|
2
2
|
|
|
3
|
-
A Query
|
|
3
|
+
A Query is a typed business observation over the graph. Its guarantees:
|
|
4
4
|
|
|
5
5
|
- **Typed by the Domain.** Handles, conditions, rows and answers are typed from the Domain's
|
|
6
6
|
Schema. A Class, Property or relation the Domain cannot name does not compile.
|
|
7
7
|
- **Bounded before it reads.** Every verb carries its bound. Before anything is sent, the SDK
|
|
8
|
-
refuses a
|
|
8
|
+
refuses a Query past its bounds, and a relation that crosses a dependency Class the Domain does
|
|
9
9
|
not declare.
|
|
10
10
|
- **One snapshot per read.** Each read is one Kernel invocation at its own snapshot. Facets,
|
|
11
|
-
steps and pages of one
|
|
11
|
+
steps and pages of one Query share none. A read whose root lists more than 32,768 ids in
|
|
12
12
|
`id.in` is the exception: the SDK sends it in consecutive parts, each at its own snapshot, and
|
|
13
13
|
merges their rows in the Kernel's order.
|
|
14
|
-
- **Authority-neutral.** A
|
|
14
|
+
- **Authority-neutral.** A Query names no authority; each call names the authority it reads
|
|
15
15
|
under.
|
|
16
16
|
- **One error per refusal.** A read the SDK or the Kernel refuses raises one `QueryError` by code.
|
|
17
17
|
A network failure, and a refusal that says when to retry, pass as they came. Business refusals
|
|
18
|
-
are the
|
|
18
|
+
are the Query's declared errors.
|
|
19
19
|
|
|
20
|
-
A
|
|
20
|
+
A Query reads on a Host whose Kernel serves Query v7 and the Class of each row. A Kernel that
|
|
21
21
|
refuses Query v7 by name raises `QueryError` `UNSUPPORTED` with `feature: 'v7'`; a Runtime that
|
|
22
22
|
does not name that refusal answers `REFUSED`, with `kernelCode: 'INTERNAL_ERROR'`. An answer that
|
|
23
23
|
leaves out a row's Class raises `UNSUPPORTED` with `feature: 'classes'`. Query v7 is not served
|
|
@@ -86,7 +86,7 @@ relations with `with`, and ends with the verb that says how much it reads:
|
|
|
86
86
|
| `first()` | The first row, or `undefined` | |
|
|
87
87
|
| `first(n)` | Up to `n` rows | |
|
|
88
88
|
| `first(n, { more: true })` | `{ rows, more }`, reading `n + 1` rows | |
|
|
89
|
-
| `page({ max })` | `{ rows, next? }`; only as a
|
|
89
|
+
| `page({ max })` | `{ rows, next? }`; only as a Query's single read | |
|
|
90
90
|
| `all({ max })` | Every row | Past `max`: `TOO_MANY`. |
|
|
91
91
|
| `exists(id?)` | `boolean` | |
|
|
92
92
|
| `count({ upTo })` | `{ count, more }`; `more` says the count reached `upTo` | |
|
|
@@ -163,7 +163,7 @@ and `withEdge()`, which adds the Edge's Class and Properties to each row under `
|
|
|
163
163
|
|
|
164
164
|
`.with((a) => ({ name: read }))` adds each relation's answer to the row under the name given. A
|
|
165
165
|
name a row already carries does not compile, and neither does a `.with` that reads another root:
|
|
166
|
-
read it as a facet of the
|
|
166
|
+
read it as a facet of the Query.
|
|
167
167
|
|
|
168
168
|
### Rows
|
|
169
169
|
|
|
@@ -183,9 +183,9 @@ and both ends' rows under their roles. `edgeKey(row)` gives the `{ source, targe
|
|
|
183
183
|
Mutation or a guard names an Edge by. An Edge root's `get()`, `find()` and `exists()` take no id,
|
|
184
184
|
and its `first(n)` takes no `{ more }`.
|
|
185
185
|
|
|
186
|
-
##
|
|
186
|
+
## Defining a Query
|
|
187
187
|
|
|
188
|
-
`defineQuery<Schema>()(id, { build, output?, errors? })` defines a
|
|
188
|
+
`defineQuery<Schema>()(id, { build, output?, errors? })` defines a Query. Its id is unique in the
|
|
189
189
|
Domain: dot-separated segments of lowercase letters, digits and `-`.
|
|
190
190
|
|
|
191
191
|
`build` returns one read, or a record of facets read together:
|
|
@@ -204,7 +204,7 @@ Reads that wait for others are chained with `steps`, `build`'s third parameter.
|
|
|
204
204
|
`steps(first, (earlier) => next, …)` takes two to eight steps and reads them in order. The first
|
|
205
205
|
is a record of facets; each next one is a function of the merged results of the steps before it,
|
|
206
206
|
and returns a record of facets none of them read. A facet name read again does not compile, and
|
|
207
|
-
throws a `TypeError` before the step reads. A
|
|
207
|
+
throws a `TypeError` before the step reads. A Query whose reads wait for none returns them
|
|
208
208
|
without `steps`. These steps order the reads of one call: they are not a Workflow's durable
|
|
209
209
|
Steps, and nothing of them is journaled or replayed.
|
|
210
210
|
|
|
@@ -220,18 +220,18 @@ build: (id: NodeId, { Article, Comment }, steps) =>
|
|
|
220
220
|
})),
|
|
221
221
|
```
|
|
222
222
|
|
|
223
|
-
`output(results, input, { error, is })` maps the results to the
|
|
224
|
-
synchronous and pure, and returns portable JSON. Without it, the
|
|
223
|
+
`output(results, input, { error, is })` maps the results to the Query's answer. It is
|
|
224
|
+
synchronous and pure, and returns portable JSON. Without it, the Query answers what `build` read.
|
|
225
225
|
`is(row, classKey)` narrows a row to a Class or its subclasses. An expected case is a union in the
|
|
226
226
|
output, not an error.
|
|
227
227
|
|
|
228
|
-
## Calling a
|
|
228
|
+
## Calling a Query
|
|
229
229
|
|
|
230
|
-
An Action calls `query(
|
|
230
|
+
An Action calls `query(query, input, { as })`, where `as` is `executor` (the authority the handler
|
|
231
231
|
executes with) or `caller` (the incoming caller). An `auth: 'anonymous'` callable reads as
|
|
232
|
-
`executor` only. A
|
|
232
|
+
`executor` only. A Query with no input is called with `undefined`.
|
|
233
233
|
|
|
234
|
-
A page
|
|
234
|
+
A page Query, whose single read is `.page({ max })`, takes the page size and the cursor at the
|
|
235
235
|
call and answers `{ rows, next? }`; its `output` keeps `rows` and `next`. `size` is a whole number
|
|
236
236
|
from 1 to `max`, `max` when omitted; any other value throws a `TypeError`:
|
|
237
237
|
|
|
@@ -247,12 +247,12 @@ A durable Workflow reads in a Step, as its executor:
|
|
|
247
247
|
journaled, and a replay returns it. A `QueryError` other than `REFUSED`, or the `TypeError` of an
|
|
248
248
|
undeclared crossing (S12), fails the Step at once, and a replay throws it again. A `REFUSED` read
|
|
249
249
|
is a failed attempt like any Kernel refusal: a permanent one exhausts the Step at once, and a
|
|
250
|
-
stale snapshot spends no attempt. An inline Workflow calls `query(
|
|
250
|
+
stale snapshot spends no attempt. An inline Workflow calls `query(query, input, { as })` from its
|
|
251
251
|
context, as an Action does, inside a named `step.run`.
|
|
252
252
|
|
|
253
253
|
## Errors
|
|
254
254
|
|
|
255
|
-
A read that cannot be answered raises `QueryError`, with the
|
|
255
|
+
A read that cannot be answered raises `QueryError`, with the Query's id, a code and the details
|
|
256
256
|
of that code:
|
|
257
257
|
|
|
258
258
|
| Code | When | Details |
|
|
@@ -260,9 +260,9 @@ of that code:
|
|
|
260
260
|
| `NOT_FOUND` | A root `get` found nothing. | `class`; `target` when the read named one |
|
|
261
261
|
| `NOT_READABLE` | `get` or `find` met a fact the reader may not read. | `class`; `id`, a Node's id or an Edge's key |
|
|
262
262
|
| `INTEGRITY` | A relation's `get` found none, or a second row came where one is allowed. | `relation`; `parent` for a relation; `found: 0 \| 2` |
|
|
263
|
-
| `TOO_MANY` | Past a verb's `max`, a verb bound of 83,332, the
|
|
263
|
+
| `TOO_MANY` | Past a verb's `max`, a verb bound of 83,332, the Query's 100,000 rows or its 32 reads. | `limit: 'max' \| 'rows' \| 'reads'`; `bound` |
|
|
264
264
|
| `REFUSED` | The Kernel refused the read. | `kernelCode`; `retryable`, whether a retry may succeed |
|
|
265
|
-
| `INPUT_INVALID` | The SDK or the Kernel refused the
|
|
265
|
+
| `INPUT_INVALID` | The SDK or the Kernel refused the document the Query built, before reading anything. | `kernelCode`, `phase` and `path` when the Kernel names them; `limit: 'in'` for an `in` past 16 values |
|
|
266
266
|
| `OUTDATED` | The Host's Registry does not match the Domain's build. | `kernelCode: 'QUERY_EXPECTATION_MISMATCH'` |
|
|
267
267
|
| `UNSUPPORTED` | The Kernel does not serve Query v7, or its answer leaves out a row's Class. | `feature: 'v7' \| 'classes'` |
|
|
268
268
|
|
|
@@ -290,35 +290,35 @@ export const articleAuthor = defineQuery<typeof schema>()('publishing.article.au
|
|
|
290
290
|
})
|
|
291
291
|
```
|
|
292
292
|
|
|
293
|
-
A Function lets a
|
|
293
|
+
A Function lets a Query's error reach its own caller by declaring it again:
|
|
294
294
|
`{ errors: { ...articleAuthor.errors } }`.
|
|
295
295
|
|
|
296
296
|
## Bounds and checks
|
|
297
297
|
|
|
298
298
|
Before a step sends anything, the SDK checks:
|
|
299
299
|
|
|
300
|
-
- **Bounds (S11).** A
|
|
300
|
+
- **Bounds (S11).** A Query makes at most 32 reads and reads at most 100,000 rows, counted from
|
|
301
301
|
its verbs' bounds and its relations per parent row. A verb's bound is at most 83,332. Past one,
|
|
302
302
|
the read raises `TOO_MANY`. An `in` takes at most 16 values; past them, it raises
|
|
303
303
|
`INPUT_INVALID`. Fewer than 2 or more than 8 steps do not compile, and `steps` throws a
|
|
304
304
|
`TypeError` when `build` calls it.
|
|
305
305
|
- **Requirements (S12).** A relation that crosses a Class of a direct dependency needs `read` and
|
|
306
306
|
`traverse` on that Class in the Domain's `requirements({ classes })`. A requirement on a parent
|
|
307
|
-
covers its children. Otherwise the call throws a `TypeError` naming the
|
|
307
|
+
covers its children. Otherwise the call throws a `TypeError` naming the Query, the relation and
|
|
308
308
|
the requirement to add. Roots, Kernel Classes and the Domain's own Classes need nothing. A
|
|
309
309
|
relation an empty list folds away is checked as if the list were not empty. A condition the
|
|
310
310
|
input leaves unbuilt, such as a falsy `where` entry or an `undefined` facet, is not checked.
|
|
311
311
|
|
|
312
|
-
`
|
|
312
|
+
`checkQuery(query, sampleInput, { domain })` from `@astrale-os/sdk/testing` runs both checks in
|
|
313
313
|
a test, without a Kernel, on the first step it builds for its sample input. Give it an input that
|
|
314
314
|
builds every optional condition, and test later steps through a call. Given the Domain's
|
|
315
315
|
definition it checks S12; given the Schema alone it skips S12.
|
|
316
316
|
|
|
317
|
-
The Domain linter also reads
|
|
317
|
+
The Domain linter also reads Queries:
|
|
318
318
|
|
|
319
|
-
- `QRY-
|
|
320
|
-
- `QRY-
|
|
321
|
-
- `QRY-
|
|
319
|
+
- `QRY-CLOCK` refuses a clock read in `build` or `output`. Take now in the input.
|
|
320
|
+
- `QRY-ROWS` warns when a Query's constant bounds multiply past 10,000 rows.
|
|
321
|
+
- `QRY-FALSY` warns on a condition entry `x && p.eq(x)` or `x ? p.eq(x) : undefined`
|
|
322
322
|
whose `x` may be `false` or `0`, wherever falsy entries are skipped. Write
|
|
323
323
|
`x !== undefined && p.eq(x)` to compare whenever `x` is set, or say that `false` or `0` means no
|
|
324
324
|
filter: `x ? p.eq(true) : undefined` for a flag, `x !== undefined && x !== 0 && p.gte(x)` for a
|
|
@@ -326,19 +326,19 @@ The Domain linter also reads recipes:
|
|
|
326
326
|
|
|
327
327
|
## Beyond v7
|
|
328
328
|
|
|
329
|
-
What v7 cannot express is bridged inside the
|
|
330
|
-
and steps count toward the
|
|
329
|
+
What v7 cannot express is bridged inside the Query, with a step or in `output`. A bridge's bound
|
|
330
|
+
and steps count toward the Query's bounds, and its callers never see it. When the Kernel serves
|
|
331
331
|
the construct, the bridge moves into the read and the output type does not change. Beyond a long
|
|
332
332
|
root `id.in`, the SDK never splits a read behind its author.
|
|
333
333
|
|
|
334
|
-
| The business asks | Bridge inside the
|
|
334
|
+
| The business asks | Bridge inside the Query |
|
|
335
335
|
| --- | --- |
|
|
336
336
|
| A value compared with a parent's | A first step reads the parent and the next compares with its value; or read both and filter in `output`. |
|
|
337
337
|
| Two parts of a pattern meeting at one Node | Read both with `.with`, compare in `output`. |
|
|
338
338
|
| Ancestors, a sub-tree at any depth | One step per level reads the next with `id.in`, up to 8 steps. |
|
|
339
339
|
| Sums, averages, groups | Read the values with `all({ max })`, compute in `output`. |
|
|
340
340
|
| Case-insensitive search, locale sorting | A normalized Property the Domain writes, or filter and sort in `output`. |
|
|
341
|
-
| Several unrelated lists | Facets of one
|
|
341
|
+
| Several unrelated lists | Facets of one Query, each read at its own snapshot. |
|
|
342
342
|
|
|
343
343
|
A filter in `output` runs after the Kernel applied the verb's bound.
|
|
344
344
|
|
|
@@ -360,7 +360,7 @@ export const recentArticles = defineQuery<typeof schema>()('publishing.article.r
|
|
|
360
360
|
})
|
|
361
361
|
```
|
|
362
362
|
|
|
363
|
-
## Mutation
|
|
363
|
+
## Defining a Mutation
|
|
364
364
|
|
|
365
365
|
A Mutation takes the same form, over the same handles:
|
|
366
366
|
`defineMutation<Schema>()(id, { build, output?, reject?, errors? })`. `build(input, d, mutation)`
|
|
@@ -386,12 +386,12 @@ export const createWorkspace = defineMutation<typeof schema>()('workspace.create
|
|
|
386
386
|
await mutate(createWorkspace, { slug }, { as: 'caller' })
|
|
387
387
|
```
|
|
388
388
|
|
|
389
|
-
`output(result, input)` maps the committed `MutationResult`, which the
|
|
389
|
+
`output(result, input)` maps the committed `MutationResult`, which the Mutation answers without it.
|
|
390
390
|
`reject(failure, input, { error, is })` maps an expected refusal to the same output, or raises a
|
|
391
391
|
declared error: here the Kernel refuses a second Workspace with the slug, `duplicate-key`, on every
|
|
392
|
-
write that could make one, and the
|
|
393
|
-
|
|
394
|
-
`step.mutate(id,
|
|
392
|
+
write that could make one, and the Mutation names that refusal. A defined Mutation's id shares
|
|
393
|
+
the Queries' namespace, and every call names its authority: `mutate(mutation, input, { as })`,
|
|
394
|
+
`step.mutate(id, mutation, input, { as: 'executor' })`. The closure form,
|
|
395
395
|
`defineMutation<Schema>()((domain) => ({ id, build, project? }))`, is deprecated.
|
|
396
396
|
|
|
397
397
|
## Guards
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@astrale-os/sdk",
|
|
3
|
-
"version": "0.6.0-beta.
|
|
3
|
+
"version": "0.6.0-beta.44",
|
|
4
4
|
"description": "Schema-first SDK for defining, composing, and deploying Astrale domains",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"astrale",
|
|
@@ -258,11 +258,11 @@
|
|
|
258
258
|
"registry": "https://registry.npmjs.org/"
|
|
259
259
|
},
|
|
260
260
|
"dependencies": {
|
|
261
|
-
"@astrale-os/kernel-client": "1.0.0-beta.
|
|
262
|
-
"@astrale-os/kernel-core": "1.0.0-beta.
|
|
263
|
-
"@astrale-os/kernel-dsl": "1.0.0-beta.
|
|
264
|
-
"@astrale-os/kernel-protocol": "1.0.0-beta.
|
|
265
|
-
"@astrale-os/kernel-server": "1.0.0-beta.
|
|
261
|
+
"@astrale-os/kernel-client": "1.0.0-beta.29",
|
|
262
|
+
"@astrale-os/kernel-core": "1.0.0-beta.26",
|
|
263
|
+
"@astrale-os/kernel-dsl": "1.0.0-beta.18",
|
|
264
|
+
"@astrale-os/kernel-protocol": "1.0.0-beta.26",
|
|
265
|
+
"@astrale-os/kernel-server": "1.0.0-beta.26",
|
|
266
266
|
"@lucide/icons": "1.34.0",
|
|
267
267
|
"@typescript/native-preview": "7.0.0-dev.20260707.2",
|
|
268
268
|
"cross-spawn": "7.0.6",
|
|
@@ -1,44 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* `defineQuery<Schema>()`: one name for both forms. A string id first defines a v7 recipe; a
|
|
3
|
-
* function first defines a V6 Query, which stays in `legacy/v6`. A recipe is inert: its id and
|
|
4
|
-
* the errors it declares are public, and what it reads is kept for the runtime (WP-S3).
|
|
5
|
-
*/
|
|
6
|
-
import type { schema } from '../../../platform/schema/index.js';
|
|
7
|
-
import type { SingleQueryProjector } from '../legacy/v6/define.js';
|
|
8
|
-
import type { Recipe, RecipeDefinitions } from './recipe.js';
|
|
9
|
-
/** A recipe id: lowercase segments of letters, digits and hyphens, joined by dots. */
|
|
10
|
-
export declare const RECIPE_ID: RegExp;
|
|
11
|
-
export declare const MAXIMUM_RECIPE_ID = 128;
|
|
12
|
-
type Callback = (...parameters: never[]) => unknown;
|
|
13
|
-
/** What a recipe reads and answers: its `build`, of `(input, d, steps)`, and its `output`. */
|
|
14
|
-
export interface RecipeSpec {
|
|
15
|
-
readonly build: Callback;
|
|
16
|
-
readonly output?: Callback;
|
|
17
|
-
}
|
|
18
|
-
/** The build and the output of a v7 recipe; `undefined` for anything else. */
|
|
19
|
-
export declare function recipeSpecOf(recipe: unknown): RecipeSpec | undefined;
|
|
20
|
-
/** A recipe of the Domain's namespace, a Query's or a Mutation's: its id, and its errors. */
|
|
21
|
-
export type NamedRecipe = Pick<Recipe, 'id' | 'errors'>;
|
|
22
|
-
/**
|
|
23
|
-
* Keep the errors a recipe declares, a Query's or a Mutation's, and collect it into the
|
|
24
|
-
* collections open: a Mutation recipe shares its Domain's recipe ids and error definitions.
|
|
25
|
-
*/
|
|
26
|
-
export declare function collectRecipe(recipe: NamedRecipe): void;
|
|
27
|
-
/**
|
|
28
|
-
* Collect into `recipes` each recipe defined while `load` runs: a build collects the recipes that
|
|
29
|
-
* loading its Domain defines, and checks them with `admitRecipes`. A module an earlier load of
|
|
30
|
-
* the same process evaluated defines nothing again, so its recipes were checked with that load.
|
|
31
|
-
*/
|
|
32
|
-
export declare function collectRecipes<T>(recipes: NamedRecipe[], load: () => Promise<T>): Promise<T>;
|
|
33
|
-
/**
|
|
34
|
-
* Refuse two recipes of one Domain under one id: a refusal and a call name a recipe by its id.
|
|
35
|
-
* Refuse two that declare one code with different definitions: a Function that spreads both
|
|
36
|
-
* recipes' errors keeps one of them, and would redact the other recipe's error.
|
|
37
|
-
*/
|
|
38
|
-
export declare function admitRecipes(recipes: readonly NamedRecipe[]): void;
|
|
39
|
-
/**
|
|
40
|
-
* Define a recipe: `defineQuery<Schema>()('services.service.owner', { build, output?, errors? })`.
|
|
41
|
-
* The V6 form, `defineQuery<Schema>()((domain) => ({ id, build, project? }))`, stays.
|
|
42
|
-
*/
|
|
43
|
-
export declare function defineQuery<Schema extends schema.DomainSchema>(): SingleQueryProjector<Schema> & RecipeDefinitions<Schema>;
|
|
44
|
-
export {};
|