DDL remains under docs_build/database/ddl/.
--Setup review DML is grouped under docs_build/database/dml/. Runtime setup checks run through the server API.
-+DDL remains under dev/docs_build/database/ddl/.
-+Setup review DML is grouped under dev/docs_build/database/dml/. Runtime setup checks run through the server API.
-Dev-only notes loaded from docs_build/dev/admin-notes/.
-+Dev-only notes loaded from dev/archive/docs_build/dev/admin-notes/.
-Loading docs_build/dev/admin-notes/index.txt.
-+Loading dev/archive/docs_build/dev/admin-notes/index.txt.
- - - -diff --git a/src/dev-runtime/seed/server-seed-loader.mjs b/src/dev-runtime/seed/server-seed-loader.mjs -index f67e53065..c7691d741 100644 ---- a/src/dev-runtime/seed/server-seed-loader.mjs -+++ b/src/dev-runtime/seed/server-seed-loader.mjs -@@ -15,7 +15,7 @@ import { REQUIRED_LEGAL_DOCUMENTS } from "../legal/legal-document-service.mjs"; - import { SEED_DB_KEYS } from "./seed-db-keys.mjs"; - - const ULID_ALPHABET = "0123456789ABCDEFGHJKMNPQRSTVWXYZ"; --const SEED_SOURCE_DIRECTORY = path.join("docs_build", "database", "seed"); -+const SEED_SOURCE_DIRECTORY = path.join("dev", "docs_build", "database", "seed"); - const DEV_SEED_AUDIT_USER_KEY = SEED_DB_KEYS.users.admin; - - function encodeBase32(value, length) { -diff --git a/src/dev-runtime/server/local-api-router.mjs b/src/dev-runtime/server/local-api-router.mjs -index b1c8e6852..34586b819 100644 ---- a/src/dev-runtime/server/local-api-router.mjs -+++ b/src/dev-runtime/server/local-api-router.mjs -@@ -723,7 +723,7 @@ function systemHealthPostgresMetrics(databaseStatus = {}, checkedAt = new Date() + function helperAllowedForManifest(helperPath) { +- return normalizeRelativePath(helperPath).startsWith("tests/helpers/"); ++ return normalizeRelativePath(helperPath).startsWith("dev/tests/helpers/"); } - function projectPackageReadinessStatus() { -- const decisionPath = path.join(process.cwd(), "docs_build", "codex", "decisions", "project-packages.md"); -+ const decisionPath = path.join(process.cwd(), "dev", "docs_build", "codex", "decisions", "project-packages.md"); - const contract = projectPackageReadinessContract(); - try { - const contents = readFileSync(decisionPath, "utf8"); -@@ -742,7 +742,7 @@ function projectPackageReadinessStatus() { - const missing = requiredContent.filter((item) => !contents.includes(item)); - return { - contract, -- decisionPath: "docs_build/codex/decisions/project-packages.md", -+ decisionPath: "dev/docs_build/codex/decisions/project-packages.md", - message: missing.length - ? `Project package decision note is missing: ${missing.join(", ")}.` - : "Project package decision note and runtime scaffold are ready for .gfsp export/import/validate package workflows.", -@@ -751,8 +751,8 @@ function projectPackageReadinessStatus() { - } catch { - return { - contract, -- decisionPath: "docs_build/codex/decisions/project-packages.md", -- message: "Project package decision note is missing. Restore docs_build/codex/decisions/project-packages.md.", -+ decisionPath: "dev/docs_build/codex/decisions/project-packages.md", -+ message: "Project package decision note is missing. Restore dev/docs_build/codex/decisions/project-packages.md.", - status: "WARN", - }; + function manifestCore({ definition, fileHashes, fixtures, helpers, imports, lane, laneDefinitionHash, tests }) { +@@ -2046,10 +2046,10 @@ async function buildScopedDiscoveryPlan({ includeSamples, laneDefinitionHash, la + continue; + } + laneImportFiles.add(resolvedPath); +- if (isUnderPath(resolvedPath, "tests/helpers") && !laneHelperFiles.has(resolvedPath)) { ++ if (isUnderPath(resolvedPath, "dev/tests/helpers") && !laneHelperFiles.has(resolvedPath)) { + laneHelperFiles.add(resolvedPath); + helperQueue.push(resolvedPath); +- } else if (isUnderPath(resolvedPath, "tests/fixtures")) { ++ } else if (isUnderPath(resolvedPath, "dev/tests/fixtures")) { + laneFixtureFiles.add(resolvedPath); + } + } +@@ -2263,19 +2263,19 @@ function validateScopedDiscoveryPlan({ includeSamples, lanes, scopedDiscovery }) + for (const targetFile of scopedDiscovery.targetFiles) { + const matchingLane = [...laneOwnership.entries()] + .find(([lane, prefixes]) => selectedLaneSet.has(lane) && prefixes.some((prefix) => targetFile.startsWith(prefix))); +- const isDirectoryTarget = targetFile === "tests/playwright" ++ const isDirectoryTarget = targetFile === "dev/tests/playwright" + || targetFile.endsWith("/") + || [ +- "tests/playwright/tools", +- "tests/playwright/games", +- "tests/playwright/integration", +- "tests/playwright/engine", +- "tests/core", +- "tests/assets", +- "tests/audio", +- "tests/input", +- "tests/render", +- "tests/samples" ++ "dev/tests/playwright/tools", ++ "dev/tests/playwright/games", ++ "dev/tests/playwright/integration", ++ "dev/tests/playwright/engine", ++ "dev/tests/core", ++ "dev/tests/assets", ++ "dev/tests/audio", ++ "dev/tests/input", ++ "dev/tests/render", ++ "dev/tests/samples" + ].includes(targetFile); + const status = matchingLane && !isDirectoryTarget ? "PASS" : "FAIL"; + targetRows.push({ +@@ -2292,8 +2292,8 @@ function validateScopedDiscoveryPlan({ includeSamples, lanes, scopedDiscovery }) } -@@ -2235,7 +2235,7 @@ function providerFailureMessage(providerContract, providerId) { - } - function readDocsBuildGuestSeedPackages() { -- const guestSeedDir = path.join(process.cwd(), "docs_build", "database", "seed", "guest"); -+ const guestSeedDir = path.join(process.cwd(), "dev", "docs_build", "database", "seed", "guest"); - try { - return readdirSync(guestSeedDir) - .filter((fileName) => fileName.endsWith(".json")) -@@ -2248,7 +2248,7 @@ function readDocsBuildGuestSeedPackages() { - group: seed.group, - groupKey: seed.groupKey, - readOnly: true, -- source: `docs_build/database/seed/guest/${fileName}`, -+ source: `dev/docs_build/database/seed/guest/${fileName}`, - writableByGuest: false, - })); - }); -@@ -3914,7 +3914,7 @@ class ApiRuntimeDataSource { - } catch (error) { - const rawMessage = String(error?.message || error || ""); - const setupDiagnostic = rawMessage.includes("Supabase Postgres") && rawMessage.includes("HTTP 404") -- ? "Identity tables are missing. Run docs_build/database/ddl/account/supabase-identity-tables.sql through the approved Supabase SQL setup path." -+ ? "Identity tables are missing. Run dev/docs_build/database/ddl/account/supabase-identity-tables.sql through the approved Supabase SQL setup path." - : ""; - const diagnostic = sanitizedAuthErrorDiagnostic(error); - const fallbackDiagnostic = diagnostic.httpStatus -@@ -5942,10 +5942,10 @@ SELECT pg_database_size(current_database()) AS database_size_bytes, - return { - readOnly: true, - route: "/api/guest/seed", -- source: "docs_build/database/seed/guest/", -+ source: "dev/docs_build/database/seed/guest/", - packages, - status: packages.length ? "PASS" : "WARN", -- warning: packages.length ? "" : "No docs_build guest seed packages were found.", -+ warning: packages.length ? "" : "No dev/docs_build guest seed packages were found.", - }; + for (const helperFile of scopedDiscovery.helperFiles) { +- if (!helperFile.startsWith("tests/helpers/")) { +- findings.push(`Scoped helper is outside tests/helpers: ${helperFile}.`); ++ if (!helperFile.startsWith("dev/tests/helpers/")) { ++ findings.push(`Scoped helper is outside dev/tests/helpers: ${helperFile}.`); + } } -diff --git a/tests/dev-runtime/AdminNotesBoundary.test.mjs b/tests/dev-runtime/AdminNotesBoundary.test.mjs -index 3bbc6e06b..66c1bbf97 100644 ---- a/tests/dev-runtime/AdminNotesBoundary.test.mjs -+++ b/tests/dev-runtime/AdminNotesBoundary.test.mjs -@@ -24,14 +24,14 @@ const productionRoots = [ - ]; - - const expectedDevNotes = [ -- "docs_build/dev/admin-notes/BusinessPlan.txt", -- "docs_build/dev/admin-notes/index.txt", -- "docs_build/dev/admin-notes/notes/index.txt", -- "docs_build/dev/admin-notes/other/index.txt", -- "docs_build/dev/admin-notes/PS_commands.txt", -- "docs_build/dev/admin-notes/roadmap2MVP.txt", -- "docs_build/dev/admin-notes/sample.txt", -- "docs_build/dev/admin-notes/tools/index.txt", -+ "dev/archive/docs_build/dev/admin-notes/BusinessPlan.txt", -+ "dev/archive/docs_build/dev/admin-notes/index.txt", -+ "dev/archive/docs_build/dev/admin-notes/notes/index.txt", -+ "dev/archive/docs_build/dev/admin-notes/other/index.txt", -+ "dev/archive/docs_build/dev/admin-notes/PS_commands.txt", -+ "dev/archive/docs_build/dev/admin-notes/roadmap2MVP.txt", -+ "dev/archive/docs_build/dev/admin-notes/sample.txt", -+ "dev/archive/docs_build/dev/admin-notes/tools/index.txt", - "src/dev-runtime/admin/notes.html", - ]; - -@@ -40,7 +40,7 @@ const retiredProductionFiles = [ - "src/dev-runtime/admin/admin-notes.html", - "admin/notes/index.txt", - "admin/notes/other/index.txt", -- "docs_build/dev/admin-notes/notes/Other/index.txt", -+ "dev/archive/docs_build/dev/admin-notes/notes/Other/index.txt", - ]; - - const devOnlyAdminLabels = [ -@@ -220,16 +220,16 @@ test("production-facing paths only expose Admin Notes through Owner Notes", () = - assert.deepEqual(violations, [], "production-facing paths must not expose Admin Notes"); - }); - --test("Admin Notes directory API is read-only, sorted, and restricted to docs_build/dev/admin-notes", async () => { -- assert.equal(fs.existsSync(repoPath("docs_build/dev/admin-notes")), true, "Admin Notes source directory exists"); -+test("Admin Notes directory API is read-only, sorted, and restricted to dev/archive/docs_build/dev/admin-notes", async () => { -+ assert.equal(fs.existsSync(repoPath("dev/archive/docs_build/dev/admin-notes")), true, "Admin Notes source directory exists"); - -- const rootListing = await adminNotesDirectoryPayload("docs_build/dev/admin-notes"); -+ const rootListing = await adminNotesDirectoryPayload("dev/archive/docs_build/dev/admin-notes"); - assert.equal(rootListing.statusCode, 200); - assert.equal(rootListing.payload.ok, true); -- assert.equal(rootListing.payload.folderPath, "docs_build/dev/admin-notes"); -+ assert.equal(rootListing.payload.folderPath, "dev/archive/docs_build/dev/admin-notes"); - assert.ok(rootListing.payload.entries.length > 0, "Admin Notes directory has entries"); - assert.ok( -- rootListing.payload.entries.every((entry) => entry.path.startsWith("docs_build/dev/admin-notes/")), -+ rootListing.payload.entries.every((entry) => entry.path.startsWith("dev/archive/docs_build/dev/admin-notes/")), - "Admin Notes entries stay under the source folder", - ); - assert.deepEqual( -@@ -238,22 +238,22 @@ test("Admin Notes directory API is read-only, sorted, and restricted to docs_bui - "Admin Notes entries are sorted alphabetically", - ); - assert.ok( -- rootListing.payload.entries.some((entry) => entry.path === "docs_build/dev/admin-notes/sample.txt"), -+ rootListing.payload.entries.some((entry) => entry.path === "dev/archive/docs_build/dev/admin-notes/sample.txt"), - "Admin Notes list includes an existing text file from the source folder", - ); - assert.ok( -- rootListing.payload.entries.some((entry) => entry.path === "docs_build/dev/admin-notes/notes/index.txt"), -+ rootListing.payload.entries.some((entry) => entry.path === "dev/archive/docs_build/dev/admin-notes/notes/index.txt"), - "Admin Notes list includes a folder index from the source folder", - ); - -- const traversal = await adminNotesDirectoryPayload("docs_build/dev/admin-notes/../../reports"); -+ const traversal = await adminNotesDirectoryPayload("dev/archive/docs_build/dev/admin-notes/../../reports"); - assert.equal(traversal.statusCode, 403); - assert.equal(traversal.payload.ok, false); -- assert.match(traversal.payload.error, /restricted to docs_build\/dev\/admin-notes/); -+ assert.match(traversal.payload.error, /restricted to dev\/archive\/docs_build\/dev\/admin-notes/); - - const missingRoot = makeTempRepoRoot(); - try { -- const missing = await adminNotesDirectoryPayload("docs_build/dev/admin-notes", missingRoot); -+ const missing = await adminNotesDirectoryPayload("dev/archive/docs_build/dev/admin-notes", missingRoot); - assert.equal(missing.statusCode, 404); - assert.equal(missing.payload.ok, false); - assert.match(missing.payload.error, /folder not found/i); -@@ -263,8 +263,8 @@ test("Admin Notes directory API is read-only, sorted, and restricted to docs_bui - - const emptyRoot = makeTempRepoRoot(); - try { -- fs.mkdirSync(path.join(emptyRoot, "docs_build/dev/admin-notes"), { recursive: true }); -- const empty = await adminNotesDirectoryPayload("docs_build/dev/admin-notes", emptyRoot); -+ fs.mkdirSync(path.join(emptyRoot, "dev/archive/docs_build/dev/admin-notes"), { recursive: true }); -+ const empty = await adminNotesDirectoryPayload("dev/archive/docs_build/dev/admin-notes", emptyRoot); - assert.equal(empty.statusCode, 200); - assert.equal(empty.payload.ok, true); - assert.deepEqual(empty.payload.entries, []); -diff --git a/tests/dev-runtime/DbSeedIntegrity.test.mjs b/tests/dev-runtime/DbSeedIntegrity.test.mjs -index aecb59368..0376b3b66 100644 ---- a/tests/dev-runtime/DbSeedIntegrity.test.mjs -+++ b/tests/dev-runtime/DbSeedIntegrity.test.mjs -@@ -192,7 +192,7 @@ test("server Local DB seed includes runtime timestamps, read-only guest packages - - assert.deepEqual(guestToolKeys, GUEST_SEED_GROUP_KEYS, "guest seed data should include every required grouped seed file"); - assert.equal(guestSeed.readOnly, true); -- assert.equal(guestSeed.source, "docs_build/database/seed/guest/"); -+ assert.equal(guestSeed.source, "dev/docs_build/database/seed/guest/"); - assert.equal((guestSeed.packages || []).every((sample) => sample.loadablePath && sample.sampleKind === "toolSeed"), true); - assert.equal((guestSeed.packages || []).every((sample) => sample.readOnly === true && sample.writableByGuest === false), true); - assert.equal(samples.some((sample) => sample.audience === "guest"), false); -diff --git a/tests/helpers/playwrightV8CoverageReporter.mjs b/tests/helpers/playwrightV8CoverageReporter.mjs -index fffd23a70..861869633 100644 ---- a/tests/helpers/playwrightV8CoverageReporter.mjs -+++ b/tests/helpers/playwrightV8CoverageReporter.mjs -@@ -6,8 +6,8 @@ import path from "node:path"; - export class PlaywrightV8CoverageReporter { - constructor({ - repoRoot = process.cwd(), -- reportPath = "docs_build/dev/reports/playwright_v8_coverage_report.txt", -- guardrailReportPath = "docs_build/dev/reports/coverage_changed_js_guardrail.txt", -+ reportPath = "dev/docs_build/dev/reports/playwright_v8_coverage_report.txt", -+ guardrailReportPath = "dev/docs_build/dev/reports/coverage_changed_js_guardrail.txt", - advisoryLowCoveragePercent = 50 - } = {}) { - this.repoRoot = repoRoot; -diff --git a/tests/index.html b/tests/index.html -index 42add0ef6..ab65a1bb0 100644 ---- a/tests/index.html -+++ b/tests/index.html -@@ -48,7 +48,7 @@ npm run test:launch-smoke -- --games --tools -[launch-smoke ...] summary: PASS=220 FAIL=4 TOTAL=224 --[launch-smoke ...] report: <project>/docs_build/dev/reports/launch_smoke_report.md -+[launch-smoke ...] report: <project>/dev/docs_build/dev/reports/launch_smoke_report.md - [launch-smoke ...] isolated node_modules: <project>/tmp/node_modules - [launch-smoke ...] failed entries: none-