Skip to content

T-PJ8G-the-tool-and-product-tiers-get-their-gates

State: closed/done · Impact: medium · Complexity: medium

Three tiers of the moon graph carry no gate at all. sdlc and determined-root are layer: tool and match neither ts-lib.yml nor any other aspect, so they have no check, test, format, format:check or lint task of their own — the root project compensates by widening its own check/test inputs to reach directly into solutions/ontological. The 21 untagged solutions/determined/products/* and the experience layers under solutions/determined/experiences/* are not registered as moon projects at all, so they carry no gate either, even though they hold real source files that need formatting and linting. And one bun install invocation is hand-typed in 9 moon.yml files with two silently different shapes. This task gives the tool tier its own gates, gives the untagged product/experience tier the two verbs it can actually support, and collapses the install duplication into shared aspects — closing the last three gaps in the task vocabulary before the conformance guard (task 11) can assert the rule end to end.

LocationRole today
moon.ymlRoot project, layer: 'tool'. Its check task inputs list solutions/ontological/**/*.ts directly (via tsconfig.json’s own include) and its test task command is bun test solutions/ontological scripts — the root project is doing sdlc’s typecheck and test run for it.
solutions/ontological/moon.ymlsdlc project, layer: 'tool'. No check, test, format, format:check or lint task; only a doc-site task.
solutions/determined/moon.ymldetermined-root project, layer: 'tool'. No check, test, format, format:check or lint task; its package.json typecheck script (moon run product-workbench:check product-agent-pants:check) is invoked by hand, never by a moon task.
.moon/tasks/nuxt-product.ymlGives check to the 3 nuxt-product-tagged products (product-workbench, product-agent-pants, product-agent-chat) only. Documents that those 3 together compose every live experience, so checking the rest would re-prove the same files.
.moon/workspace.ymlRegisters only the 3 nuxt-product-tagged products plus a curated list of solutions/determined/apps/* and packages/* as explicit sources:. No glob or source covers the other 21 solutions/determined/products/* directories or solutions/determined/experiences/* — they are not moon projects at all today.
apps/legacy-polish/moon.ymlpolish project. Hand-writes install: command: 'bun install' with cache: false, runFromWorkspaceRoot: true and mutex: 'root-bun-install' — the same shape as root’s, because its src-nuxt/ is a root Bun workspace member.
sites/df-docs/moon.yml, packages/ts/intersect/docs-site/moon.yml, packages/ts/flowline/docs-site/moon.yml, packages/ts/waypost/docs-site/moon.yml, solutions/augmented/apps/augmented_dot_com/moon.yml, solutions/augmented/apps/augmented-books/moon.yml, solutions/augmented/apps/vimit/moon.ymlEach hand-writes install: command: 'bun install' with cache: false only — no runFromWorkspaceRoot, no mutex. Correct as written (root package.json workspaces excludes augmented-books, vimit and augmented_dot_com by name, and never lists sites/* or the three docs-site directories), but the shape is retyped by hand in 7 places instead of shared.

sdlc and determined-root each carry their own check, test, format, format:check and lint tasks — reached through a new layer: 'tool' aspect for the two verbs every tracked manifest gets, plus project-level check/test tasks for the two verbs a tool-tier project can genuinely support. Root’s own check/test inputs narrow to drop the direct reach into solutions/ontological, depending on sdlc:check/sdlc:test instead — the same aggregation shape check already has in the target vocabulary. determined-root:check aggregates its existing per-product nuxt-product checks plus its own fmt-check/lint, so it asserts real coverage rather than a typecheck it cannot perform standalone.

The 21 untagged solutions/determined/products/* and the experience layers under solutions/determined/experiences/* are registered as moon projects and carry format, format:check and lint — never check — via a new tag-based aspect, sibling to nuxt-product.yml. nuxt-product.yml’s own reasoning (checking one layer in isolation drops the generated types and reports errors that are not real) is why this task never adds a check task to them.

The bun install command exists in exactly two places: a layer: 'tool'-adjacent tag aspect for the root-anchored shape (root, polish — the two Bun-workspace-member installs needing the shared root-bun-install mutex), and a second tag aspect for the standalone shape (df-docs, the three docs-site projects, augmented_dot_com, augmented-books, vimit — projects with their own lockfile, no mutex needed). No project moon.yml hand-writes command: 'bun install' any more.

  1. Add .moon/tasks/tool.yml, inheritedBy: { layer: 'tool' }, giving format, format:check and lint, each delegating to the `bun run
  2. Give solutions/ontological/moon.yml its own check task (the same bunx tsc --noEmit command root runs today, since solutions/ontological, tests/ and scripts/ still compile as one tsconfig.json program — this is not a per-directory split, just moving where the task is declared) and test task (bun test solutions/ontological scripts …, root’s command verbatim). Give solutions/determined/moon.yml a check task that depends on product-workbench:check, product-agent-pants:check and product-agent-chat:check plus its own ~:fmt-check/~:lint — the Rust check shape (deps-only aggregate), not a typecheck it cannot run itself.
  3. Update root moon.yml: check and test gain deps: ['sdlc:check'] / deps: ['sdlc:test'] and drop the solutions/ontological/**/* entries from their inputs: (the dependency edge now carries the staleness signal). Leave dashboard-client:check and the packages/ts/**/*.ts edge glob as they are — a different, already-documented gap.
  4. Add .moon/tasks/determined-product.yml (or equivalent name), a nuxt-product-adjacent aspect keyed on a new tag (e.g. determined-app) giving format, format:check, lint and nothing else. In .moon/workspace.yml, register the 21 untagged solutions/determined/products/* directories and the solutions/determined/experiences/* directories as moon projects and apply the tag. Verify against real moon behavior whether a bare solutions/determined/products/* glob double-registers the 3 already-explicit product-* sources under a second folder-derived id (the documented polish/legacy-polish trap in .moon/workspace.yml) — if it does, register the 21 as explicit sources: entries instead of a glob, or split the glob to exclude the 3 tagged directories.
  5. Add .moon/tasks/bun-workspace-install.yml (tag, e.g. bun-workspace-install) with the root/polish shape (cache: false, runFromWorkspaceRoot: true, mutex: 'root-bun-install') and .moon/tasks/standalone-install.yml (tag, e.g. standalone-install) with the simpler shape (cache: false only). Apply the first tag to root and polish, the second to df-docs, intersect-docs, flowline-docs, waypost-docs, augmented_dot_com, augmented-books and vimit. Delete each project’s local install: block.
  6. Run moon task <target> (prints the resolved command) against sdlc:check, determined-root:check, one collapsed install target of each shape, and one newly-registered product’s format — confirming delegation actually happened, per the plan’s verification method.
LocationKindChange
moon.ymlmodifyNarrow check/test inputs; add deps on sdlc:check/sdlc:test; replace the local install task with the bun-workspace-install tag.
solutions/ontological/moon.ymlmodifyAdd check/test tasks; apply layer: 'tool' aspect (already the declared layer) for format/format:check/lint.
solutions/determined/moon.ymlmodifyAdd check (deps-only aggregate) task; pick up format/format:check/lint from the tool aspect.
apps/legacy-polish/moon.ymlmodifyReplace the local install task with the bun-workspace-install tag.
sites/df-docs/moon.ymlmodifyReplace the local install task with the standalone-install tag.
packages/ts/intersect/docs-site/moon.ymlmodifyReplace the local install task with the standalone-install tag.
packages/ts/flowline/docs-site/moon.ymlmodifyReplace the local install task with the standalone-install tag.
packages/ts/waypost/docs-site/moon.ymlmodifyReplace the local install task with the standalone-install tag.
solutions/augmented/apps/augmented_dot_com/moon.ymlmodifyReplace the local install task with the standalone-install tag.
solutions/augmented/apps/augmented-books/moon.ymlmodifyReplace the local install task with the standalone-install tag.
solutions/augmented/apps/vimit/moon.ymlmodifyReplace the local install task with the standalone-install tag.
.moon/workspace.ymlmodifyRegister the 21 untagged solutions/determined/products/* and the solutions/determined/experiences/* directories as moon projects, tagged for the new determined-product aspect.
.moon/tasks/tool.ymlnewlayer: 'tool' aspect: format, format:check, lint.
.moon/tasks/determined-product.ymlnewTag aspect for untagged determined products/experiences: format, format:check, lint only.
.moon/tasks/bun-workspace-install.ymlnewTag aspect for the root-anchored install shape (mutex + runFromWorkspaceRoot).
.moon/tasks/standalone-install.ymlnewTag aspect for the standalone install shape (no mutex).
  • AC-1: moon query tasks --json reports a non-null sdlc:check, sdlc:test, sdlc:format, sdlc:lint, determined-root:check, determined-root:format and determined-root:lint — all absent today.
  • AC-2: moon run sdlc:check, moon run sdlc:test and moon run determined-root:check each exit 0.
  • AC-3: grep -rL "^tags:" --include=moon.yml -l "command: 'bun install'" finds no project moon.yml — the literal command exists only inside .moon/tasks/bun-workspace-install.yml and .moon/tasks/standalone-install.yml.
  • AC-4: moon query projects --json | jq '.projects | length' is at least 43 higher than today’s count (21 untagged products + the registered experience layers).
  • AC-5: moon query tasks --json shows format, format:check and lint for a sampled untagged product (e.g. one solutions/determined/products/* directory outside the 3 nuxt-product-tagged ones) and no check task for it.
  • AC-6: moon run :fmt-check and moon run :lint each return sdlc and determined-root in their target list (grep the run output), where today neither appears.
  • Rewriting ts-lib.yml itself to delegate through bun run — T-0DSA.
  • The Rust aspect’s per-crate override collapse — T-7VPK.
  • The repo-wide prettier reformat and the lefthook auto-format wiring.
  • The conformance guard script (scripts/guard-project-shape.ts) — T-0G2O.
  • Deleting app-local justfile/Makefile runners — T-TB73.
  • Adding typecheck to the publish-channel standalone lane — T-ZFM9.
  • T-VAF5 — the standard defining the baseline vocabulary and the which-verb-which-project rule this task applies to the tool and product/experience tiers.
  • T-076A and T-9FH9 — the Layer A tasks that add the format, format:check and lint package.json scripts this task’s moon aspects delegate to (solutions/ontological and solutions/determined both fall under T-9FH9’s scope).

T-VAF5-a-standard-for-the-baseline-task-vocabulary, T-076A-the-script-vocabulary-lands-in-packages-apps-and-sites, T-9FH9-the-script-vocabulary-lands-across-solutions


← Back to Tasks