@rules-as-tests/meta-factory — the research→rule factory umbrella package (G4)
Workspace-private umbrella package whose four src layers re-export @rules-as-tests/core implementations; its meta-factory bin is a Phase-3 placeholder, and the deterministic factory that runs at install is core's rule-bootstrap CLI.
@rules-as-tests/meta-factory — the research→rule factory umbrella package (G4)
Status: experimental (umbrella + placeholder bin; the working factory path lives in @rules-as-tests/core) · Ships to: clone only — workspace-private, never published, not in the dist payload · Fires at: nothing today via its own bin; the pipeline it fronts runs at install time on --full npm-lane installs (stage 80)
What it is
A minimal package — bin/meta-factory.mjs, four one-file src/ layers, package.json, tsconfig.json — declared private: true with a peer dependency on the core package: «"@rules-as-tests/core": "*"» (packages/meta-factory/package.json:14). It declares the deterministic research→rule factory as an umbrella: a meta-factory bin («"meta-factory": "./bin/meta-factory.mjs"», packages/meta-factory/package.json:8) plus four src layers — detector/, research/, synthesizer/, installer/ — each of which is a re-export shim, not an implementation: «// Keeps meta-factory the umbrella package; core owns the implementation.» (the header comment of all four layer files; e.g. the synthesizer layer re-exports synthesize from @rules-as-tests/core/synthesizer, the installer layer install from @rules-as-tests/core/installer).
The bin itself is a skeleton, stated in its own second line: «// meta-factory CLI — placeholder skeleton (Phase 3)» — running it prints «console.error('meta-factory: not yet implemented (Phase 4+)');» and exits 1 (packages/meta-factory/bin/meta-factory.mjs:4-5).
How it works
The deterministic factory that actually fires on a consumer install is NOT this package's bin. Stage 80 (setup.d/80-rule-bootstrap.sh, A18) executes the core CLI: the pipeline is «# FileResearchClient + FileGenerateClient → generate.ts factory → install() → rules-lock.json» with the payload named one line later: «# Payload: packages/core/install/rule-bootstrap-cli.ts (the shared entry).» The umbrella's role on that path is indirect: the stage first heals workspace package resolution with ensure_workspace_pkg_links (setup.d/80-rule-bootstrap.sh:65), because the factory's @rules-as-tests/* imports must resolve from PKG_ROOT (setup.d/lib.sh:2122-2136 — the self-heal links the worktree's own workspace packages into a worktree-local node_modules/@rules-as-tests/).
Gating and degrade behavior belong to stage 80, not to this package: the stage runs only on the --full carrier (setup.d/80-rule-bootstrap.sh:25-27 — if [ -z "${FULL:-}" ]; then return 0), degrades silently when the payload or node is absent, and never aborts the install (rc=0).
Asymmetry: nothing in the framework imports @rules-as-tests/meta-factory today — the only references to the package name outside its own directory are its own package.json and the lockfile (repo-wide grep at the pin). It is a structural placeholder for the Phase-4+ factory front-end; consumers interact with the factory through the rule-research protocol (B3) plus stage 80, never through this bin.
Satellites & companions
ADDS nothing executable over core — each layer is a type-level re-export surface over @rules-as-tests/core/{detector,research,synthesizer,installer}. DEPENDS on core as a peer dependency (*). The consumer path it fronts is A18 (rule-bootstrapping stage) + B3 (rule-research skill authoring the two committed JSONs) + F42 (the core rule-bootstrap CLI the census rows as the factory entry). Not to be confused with the shipped research→rule flow: the CLI the stage runs, the JSONs it reads (.ai-factory/rules-research/<stack>.{research,selection}.json), and the rules-lock.json it writes are all core/stage-80 artifacts.
Anchors
At framework pin aa87d0a47a6d8502f983cc9fe7284bd5dcb3d650:
packages/meta-factory/package.json:4— «"private": true,»packages/meta-factory/package.json:8— «"meta-factory": "./bin/meta-factory.mjs"»packages/meta-factory/package.json:14— «"@rules-as-tests/core": "*"»packages/meta-factory/bin/meta-factory.mjs:2— «// meta-factory CLI — placeholder skeleton (Phase 3)»packages/meta-factory/bin/meta-factory.mjs:4— «console.error('meta-factory: not yet implemented (Phase 4+)');»packages/meta-factory/src/synthesizer/index.ts:2— «// Keeps meta-factory the umbrella package; core owns the implementation.»packages/meta-factory/src/installer/index.ts:1— «// Installer Layer — re-export from @rules-as-tests/core/installer (Phase 7).»setup.d/80-rule-bootstrap.sh:7— «# FileResearchClient + FileGenerateClient → generate.ts factory → install() → rules-lock.json»setup.d/80-rule-bootstrap.sh:8— «# Payload: packages/core/install/rule-bootstrap-cli.ts (the shared entry).»
@rules-as-tests/lint-config — the shared markdownlint structural config (G3)
Workspace-private three-file package defining the hand-rolled structural-only markdownlint rule set applied to the framework repo's own staged Markdown by its pre-commit hook.
@rules-as-tests/preset-next-15-canonical — the frozen Next-15 snapshot preset (G5)
Workspace-private preset package freezing a Next-15 snapshot (one handwritten ESLint rule, RULES docs, audit script, six templates) with staleness pins that drive the #811 install-time WARN; the fallback baseline behind live-research delivery.