From f14445bb0036d8bddc76a81ce216760e774aca88 Mon Sep 17 00:00:00 2001 From: Sinabina Date: Mon, 20 Jul 2026 14:16:23 -0700 Subject: [PATCH] feat: componentize GStack 2 runtime and release integrity --- .../create-runtime-release-manifest.mjs | 87 + .github/scripts/gate-secret-scan.mjs | 31 + .github/scripts/smoke-packed-package.mjs | 63 + .github/scripts/stage-runtime-components.mjs | 82 + .github/workflows/actionlint.yml | 8 +- .github/workflows/ci-image.yml | 9 +- .github/workflows/evals-periodic.yml | 13 +- .github/workflows/evals.yml | 22 +- .github/workflows/gstack2-gate.yml | 21 +- .github/workflows/make-pdf-gate.yml | 9 +- .github/workflows/pr-title-sync.yml | 5 +- .github/workflows/quality-gate.yml | 75 + .github/workflows/release-artifacts.yml | 198 ++ .github/workflows/skill-docs.yml | 8 +- .github/workflows/version-gate.yml | 7 +- .github/workflows/windows-free-tests.yml | 9 +- .github/workflows/windows-setup-e2e.yml | 77 +- README.md | 48 +- bin/gstack-config | 4 +- bin/gstack-update-check | 18 +- browse/src/browser-manager.ts | 20 +- browse/src/cli.ts | 35 +- browse/src/path-security.ts | 29 +- browse/test/cli-setsid-daemonize.test.ts | 19 +- browse/test/path-validation.test.ts | 12 +- bun.lock | 141 -- docs/gstack-2/ARCHITECTURE.md | 16 +- docs/gstack-2/HOST-COMPATIBILITY.md | 14 +- docs/gstack-2/IOS-PHYSICAL-DEVICE.md | 61 +- docs/gstack-2/JUDGMENT-PARITY.md | 6 +- docs/gstack-2/JUDGMENT-PROVENANCE.json | 1558 ++++-------- docs/gstack-2/PRIVACY.md | 6 + docs/gstack-2/RELEASE-INTEGRITY.md | 118 + docs/gstack-2/SKILL-MIGRATION.md | 6 +- docs/gstack-2/STATUS.md | 48 +- docs/gstack-2/TEST-EVIDENCE.md | 10 +- docs/gstack-2/UPGRADE-AND-ROLLBACK.md | 14 +- .../adr/0001-public-infrastructure-tools.md | 48 + ...sical-device-2026-07-20T17-49-19-302Z.json | 277 +++ evals/parity/contracts/autoplan.json | 2 +- evals/parity/contracts/benchmark-models.json | 2 +- evals/parity/contracts/benchmark.json | 2 +- evals/parity/contracts/browse.json | 2 +- evals/parity/contracts/canary.json | 2 +- evals/parity/contracts/careful.json | 2 +- evals/parity/contracts/claude.json | 2 +- evals/parity/contracts/codex.json | 2 +- evals/parity/contracts/context-restore.json | 2 +- evals/parity/contracts/context-save.json | 2 +- evals/parity/contracts/cso.json | 2 +- .../parity/contracts/design-consultation.json | 2 +- evals/parity/contracts/design-html.json | 2 +- evals/parity/contracts/design-review.json | 2 +- evals/parity/contracts/design-shotgun.json | 2 +- evals/parity/contracts/devex-review.json | 2 +- evals/parity/contracts/diagram.json | 2 +- evals/parity/contracts/document-generate.json | 2 +- evals/parity/contracts/document-release.json | 2 +- evals/parity/contracts/freeze.json | 2 +- evals/parity/contracts/gstack.json | 2 +- evals/parity/contracts/guard.json | 2 +- evals/parity/contracts/health.json | 2 +- evals/parity/contracts/investigate.json | 2 +- evals/parity/contracts/ios-clean.json | 2 +- evals/parity/contracts/ios-design-review.json | 2 +- evals/parity/contracts/ios-fix.json | 2 +- evals/parity/contracts/ios-qa.json | 2 +- evals/parity/contracts/ios-sync.json | 2 +- evals/parity/contracts/land-and-deploy.json | 2 +- evals/parity/contracts/landing-report.json | 2 +- evals/parity/contracts/learn.json | 2 +- evals/parity/contracts/make-pdf.json | 2 +- evals/parity/contracts/office-hours.json | 2 +- .../parity/contracts/open-gstack-browser.json | 2 +- evals/parity/contracts/pair-agent.json | 2 +- evals/parity/contracts/plan-ceo-review.json | 2 +- .../parity/contracts/plan-design-review.json | 2 +- evals/parity/contracts/plan-devex-review.json | 2 +- evals/parity/contracts/plan-eng-review.json | 2 +- evals/parity/contracts/plan-tune.json | 2 +- evals/parity/contracts/qa-only.json | 2 +- evals/parity/contracts/qa.json | 2 +- evals/parity/contracts/retro.json | 2 +- evals/parity/contracts/review.json | 2 +- evals/parity/contracts/scrape.json | 2 +- .../contracts/setup-browser-cookies.json | 2 +- evals/parity/contracts/setup-deploy.json | 2 +- evals/parity/contracts/setup-gbrain.json | 2 +- evals/parity/contracts/ship.json | 2 +- evals/parity/contracts/skillify.json | 2 +- evals/parity/contracts/spec.json | 2 +- evals/parity/contracts/sync-gbrain.json | 2 +- evals/parity/contracts/unfreeze.json | 2 +- evals/parity/manifest.json | 1558 ++++-------- evals/parity/runtime-helper-closure.json | 872 +------ .../transcripts/deterministic/ceo-review.json | 48 +- .../deterministic/code-review.json | 48 +- .../transcripts/deterministic/debug.json | 48 +- .../deterministic/design-alternatives.json | 48 +- .../deterministic/design-consultation.json | 48 +- .../deterministic/design-review.json | 48 +- .../transcripts/deterministic/dx-review.json | 48 +- .../deterministic/engineering-review.json | 48 +- .../deterministic/office-hours.json | 48 +- .../deterministic/physical-ios-qa.json | 48 +- .../deterministic/qa-fix-verify.json | 48 +- .../deterministic/qa-report-only.json | 48 +- .../deterministic/security-review.json | 48 +- .../transcripts/deterministic/ship.json | 48 +- .../deterministic/specification.json | 48 +- evals/parity/transcripts/policy-units.json | 18 +- evals/parity/transcripts/sections.json | 90 +- ios-qa/scripts/physical-device-smoke.ts | 11 +- make-pdf/src/browseClient.ts | 4 +- make-pdf/src/diagram-prepass.ts | 2 +- make-pdf/src/setup.ts | 4 +- make-pdf/test/browseClient.test.ts | 3 +- package.json | 23 +- runtime/cli.js | 116 +- runtime/config.js | 14 +- runtime/context.js | 7 +- runtime/doctor.js | 197 +- runtime/install.js | 1009 +++++++- runtime/licenses/BUN-LICENSE-1.3.14.md | 82 + runtime/licenses/BUN-SOURCE.md | 21 + runtime/managed-home.js | 26 + runtime/runtime-bootstrap.mjs | 422 ++++ runtime/storage.js | 11 +- runtime/tooling.js | 30 + runtime/upgrade.js | 32 +- scripts/gstack2/generate-skill-tree.ts | 75 +- scripts/gstack2/render-legacy.ts | 186 +- scripts/gstack2/route.ts | 9 +- scripts/gstack2/run-parity.ts | 45 +- scripts/gstack2/semantic-parity.ts | 17 +- setup | 23 +- skills/debug/SKILL.md | 8 +- skills/debug/references/COMPATIBILITY.md | 2 +- skills/debug/references/RUNTIME.md | 16 + skills/debug/references/WEB-CONTEXT.md | 2 +- skills/debug/references/legacy/careful.md | 12 +- skills/debug/references/legacy/freeze.md | 27 +- .../debug/references/legacy/gstack-upgrade.md | 27 - skills/debug/references/legacy/guard.md | 39 +- skills/debug/references/legacy/investigate.md | 738 +----- skills/debug/references/legacy/ios-fix.md | 754 +----- skills/debug/references/legacy/unfreeze.md | 24 +- .../references/support/runtime-bootstrap.mjs | 359 +++ .../references/support/runtime-contract.json | 5 + skills/design/SKILL.md | 8 +- skills/design/references/COMPATIBILITY.md | 2 +- skills/design/references/RUNTIME.md | 16 + skills/design/references/WEB-CONTEXT.md | 2 +- .../references/legacy/design-consultation.md | 1165 +-------- .../design/references/legacy/design-html.md | 759 +----- .../design/references/legacy/design-review.md | 767 +----- .../references/legacy/design-shotgun.md | 743 +----- skills/design/references/legacy/diagram.md | 757 +----- .../references/legacy/gstack-upgrade.md | 27 - .../references/legacy/ios-design-review.md | 754 +----- skills/design/references/legacy/make-pdf.md | 531 +--- .../references/legacy/plan-design-review.md | 1350 +--------- .../proposal-and-preview.md | 4 +- .../plan-design-review/review-sections.md | 34 +- .../references/support/runtime-bootstrap.mjs | 359 +++ .../references/support/runtime-contract.json | 5 + skills/plan/SKILL.md | 8 +- skills/plan/references/ASSETS.md | 2 +- skills/plan/references/COMPATIBILITY.md | 2 +- skills/plan/references/RUNTIME.md | 16 + skills/plan/references/WEB-CONTEXT.md | 2 +- .../artifacts/review/TODOS-format.md | 2 +- skills/plan/references/legacy/autoplan.md | 793 +----- .../plan/references/legacy/context-restore.md | 757 +----- skills/plan/references/legacy/context-save.md | 759 +----- .../plan/references/legacy/gstack-upgrade.md | 27 - skills/plan/references/legacy/gstack.md | 568 +---- skills/plan/references/legacy/learn.md | 749 +----- skills/plan/references/legacy/office-hours.md | 1341 +--------- .../plan/references/legacy/plan-ceo-review.md | 1570 +----------- .../references/legacy/plan-design-review.md | 1350 +--------- .../references/legacy/plan-devex-review.md | 1469 +---------- .../plan/references/legacy/plan-eng-review.md | 1523 +----------- skills/plan/references/legacy/plan-tune.md | 755 +----- skills/plan/references/legacy/retro.md | 789 +----- skills/plan/references/legacy/setup-gbrain.md | 787 +----- skills/plan/references/legacy/spec.md | 1543 +----------- skills/plan/references/legacy/sync-gbrain.md | 813 +----- .../office-hours/design-and-handoff.md | 36 +- .../plan-ceo-review/review-sections.md | 26 +- .../plan-design-review/review-sections.md | 34 +- .../plan-devex-review/review-sections.md | 28 +- .../plan-eng-review/review-sections.md | 26 +- .../references/support/runtime-bootstrap.mjs | 359 +++ .../references/support/runtime-contract.json | 5 + skills/qa/SKILL.md | 8 +- skills/qa/references/COMPATIBILITY.md | 2 +- skills/qa/references/RUNTIME.md | 16 + skills/qa/references/WEB-CONTEXT.md | 2 +- .../qa/references/legacy/benchmark-models.md | 496 +--- skills/qa/references/legacy/benchmark.md | 510 +--- skills/qa/references/legacy/browse.md | 492 +--- skills/qa/references/legacy/canary.md | 753 +----- skills/qa/references/legacy/devex-review.md | 773 +----- skills/qa/references/legacy/gstack-upgrade.md | 27 - skills/qa/references/legacy/investigate.md | 738 +----- skills/qa/references/legacy/ios-qa.md | 757 +----- .../references/legacy/open-gstack-browser.md | 763 +----- skills/qa/references/legacy/pair-agent.md | 761 +----- skills/qa/references/legacy/qa-only.md | 761 +----- skills/qa/references/legacy/qa.md | 759 +----- skills/qa/references/legacy/scrape.md | 769 +----- .../legacy/setup-browser-cookies.md | 494 +--- skills/qa/references/legacy/skillify.md | 787 +----- .../references/support/runtime-bootstrap.mjs | 359 +++ .../references/support/runtime-contract.json | 5 + skills/review/SKILL.md | 8 +- skills/review/references/ASSETS.md | 4 +- skills/review/references/COMPATIBILITY.md | 2 +- skills/review/references/RUNTIME.md | 16 + skills/review/references/WEB-CONTEXT.md | 2 +- .../artifacts/cso/ACKNOWLEDGEMENTS.md | 2 +- .../artifacts/review/TODOS-format.md | 2 +- .../artifacts/review/design-checklist.md | 6 +- skills/review/references/legacy/claude.md | 762 +----- skills/review/references/legacy/codex.md | 806 +----- skills/review/references/legacy/cso.md | 1022 +------- .../references/legacy/gstack-upgrade.md | 27 - skills/review/references/legacy/health.md | 743 +----- skills/review/references/legacy/review.md | 757 +----- .../references/sections/cso/audit-phases.md | 4 +- .../references/support/runtime-bootstrap.mjs | 359 +++ .../references/support/runtime-contract.json | 5 + skills/ship/SKILL.md | 8 +- skills/ship/references/ASSETS.md | 2 +- skills/ship/references/COMPATIBILITY.md | 2 +- skills/ship/references/RUNTIME.md | 16 + skills/ship/references/WEB-CONTEXT.md | 2 +- .../artifacts/review/TODOS-format.md | 2 +- .../artifacts/review/design-checklist.md | 6 +- skills/ship/references/legacy/canary.md | 753 +----- .../ship/references/legacy/context-restore.md | 757 +----- .../references/legacy/document-generate.md | 741 +----- .../references/legacy/document-release.md | 1102 +------- skills/ship/references/legacy/ios-clean.md | 756 +----- skills/ship/references/legacy/ios-sync.md | 757 +----- .../ship/references/legacy/land-and-deploy.md | 819 +----- .../ship/references/legacy/landing-report.md | 751 +----- skills/ship/references/legacy/qa-only.md | 1213 --------- skills/ship/references/legacy/setup-deploy.md | 756 +----- skills/ship/references/legacy/ship.md | 2205 +---------------- .../sections/document-release/release-body.md | 2 +- .../sections/ship/plan-completion.md | 10 +- .../ship/references/sections/ship/pr-body.md | 12 +- .../references/sections/ship/review-army.md | 2 +- .../references/sections/ship/test-coverage.md | 2 +- skills/ship/references/sections/ship/tests.md | 2 +- .../references/support/runtime-bootstrap.mjs | 359 +++ .../references/support/runtime-contract.json | 5 + .../Sources/FixtureApp/FixtureAppApp.swift | 48 +- test/gstack2-runtime-cleanup-boundary.test.ts | 17 + test/gstack2-runtime-context.test.ts | 57 +- test/gstack2-runtime-install.test.ts | 305 ++- test/gstack2-runtime-safety-config.test.ts | 71 +- test/gstack2-runtime-setup-ux.test.ts | 415 ++++ test/gstack2-runtime-upgrade.test.ts | 16 + test/gstack2-skill-ux.test.ts | 176 ++ test/gstack2-skills-routing.test.ts | 11 + test/release-hardening.test.ts | 120 + test/skill-e2e-ios-device.test.ts | 14 + 270 files changed, 9681 insertions(+), 51572 deletions(-) create mode 100644 .github/scripts/create-runtime-release-manifest.mjs create mode 100644 .github/scripts/gate-secret-scan.mjs create mode 100644 .github/scripts/smoke-packed-package.mjs create mode 100644 .github/scripts/stage-runtime-components.mjs create mode 100644 .github/workflows/quality-gate.yml create mode 100644 .github/workflows/release-artifacts.yml create mode 100644 docs/gstack-2/RELEASE-INTEGRITY.md create mode 100644 docs/gstack-2/adr/0001-public-infrastructure-tools.md create mode 100644 docs/gstack-2/evidence/ios-physical-device-2026-07-20T17-49-19-302Z.json create mode 100644 runtime/licenses/BUN-LICENSE-1.3.14.md create mode 100644 runtime/licenses/BUN-SOURCE.md create mode 100644 runtime/runtime-bootstrap.mjs create mode 100644 runtime/tooling.js create mode 100644 skills/debug/references/RUNTIME.md delete mode 100644 skills/debug/references/legacy/gstack-upgrade.md create mode 100644 skills/debug/references/support/runtime-bootstrap.mjs create mode 100644 skills/debug/references/support/runtime-contract.json create mode 100644 skills/design/references/RUNTIME.md delete mode 100644 skills/design/references/legacy/gstack-upgrade.md create mode 100644 skills/design/references/support/runtime-bootstrap.mjs create mode 100644 skills/design/references/support/runtime-contract.json create mode 100644 skills/plan/references/RUNTIME.md delete mode 100644 skills/plan/references/legacy/gstack-upgrade.md create mode 100644 skills/plan/references/support/runtime-bootstrap.mjs create mode 100644 skills/plan/references/support/runtime-contract.json create mode 100644 skills/qa/references/RUNTIME.md delete mode 100644 skills/qa/references/legacy/gstack-upgrade.md create mode 100644 skills/qa/references/support/runtime-bootstrap.mjs create mode 100644 skills/qa/references/support/runtime-contract.json create mode 100644 skills/review/references/RUNTIME.md delete mode 100644 skills/review/references/legacy/gstack-upgrade.md create mode 100644 skills/review/references/support/runtime-bootstrap.mjs create mode 100644 skills/review/references/support/runtime-contract.json create mode 100644 skills/ship/references/RUNTIME.md delete mode 100644 skills/ship/references/legacy/qa-only.md create mode 100644 skills/ship/references/support/runtime-bootstrap.mjs create mode 100644 skills/ship/references/support/runtime-contract.json create mode 100644 test/gstack2-runtime-setup-ux.test.ts create mode 100644 test/gstack2-skill-ux.test.ts create mode 100644 test/release-hardening.test.ts diff --git a/.github/scripts/create-runtime-release-manifest.mjs b/.github/scripts/create-runtime-release-manifest.mjs new file mode 100644 index 000000000..4fd487bac --- /dev/null +++ b/.github/scripts/create-runtime-release-manifest.mjs @@ -0,0 +1,87 @@ +#!/usr/bin/env node +import fs from "node:fs/promises"; +import path from "node:path"; + +const [directory, repository = process.env.GITHUB_REPOSITORY, version = "2.0.0"] = process.argv.slice(2); +if (!directory || !repository) { + console.error("Usage: create-runtime-release-manifest.mjs [version]"); + process.exit(2); +} + +const targets = [ + "darwin-arm64", + "darwin-x64", + "linux-arm64", + "linux-x64", + "windows-arm64", + "windows-x64", +]; +const componentDependencies = { + core: [], + "browser-code": ["core"], + "browser-headless": ["browser-code"], + "browser-visible": ["browser-code"], + design: ["core"], + diagram: ["browser-headless"], + pdf: ["diagram"], + ios: ["core"], +}; +const capabilityComponents = { + browser: ["browser-code", "browser-headless"], + "browser-visible": ["browser-code", "browser-visible"], + design: ["design"], + diagram: ["diagram"], + pdf: ["pdf"], + ios: ["ios"], +}; +const commonComponents = ["core", "browser-code", "browser-headless", "browser-visible", "design", "diagram", "pdf"]; +const release = `https://github.com/${repository}/releases/download/v${version}`; +const certificateIdentity = `https://github.com/${repository}/.github/workflows/release-artifacts.yml@refs/tags/v${version}`; +const targetRecords = {}; + +for (const target of targets) { + const ids = [...commonComponents, ...(target.startsWith("darwin-") ? ["ios"] : [])]; + const components = {}; + for (const component of ids) { + const name = `gstack-runtime-${version}-${target}-${component}.tar.gz`; + const archive = path.join(directory, name); + const bundle = `${archive}.sigstore.json`; + const digestFile = `${archive}.sha256`; + const [stat, digest, bundleStat] = await Promise.all([ + fs.stat(archive), + fs.readFile(digestFile, "utf8"), + fs.stat(bundle), + ]); + const sha256 = digest.trim().split(/\s+/)[0]; + if (!stat.isFile() || stat.size <= 0 || stat.size > 2 * 1024 * 1024 * 1024) { + throw new Error(`Invalid artifact size for ${name}: ${stat.size}`); + } + if (!bundleStat.isFile() || bundleStat.size <= 0) throw new Error(`Missing Sigstore bundle for ${name}`); + if (!/^[a-f0-9]{64}$/.test(sha256)) throw new Error(`Invalid SHA-256 for ${name}`); + components[component] = { + url: `${release}/${name}`, + sha256, + bytes: stat.size, + format: "tar.gz", + root: "gstack", + cosignBundleUrl: `${release}/${name}.sigstore.json`, + certificateIdentity, + certificateOidcIssuer: "https://token.actions.githubusercontent.com", + }; + } + targetRecords[target] = { components }; +} + +const manifest = { + schemaVersion: 2, + version, + skillApi: "2.0", + capabilityComponents, + componentDependencies, + targets: targetRecords, +}; +await fs.writeFile( + path.join(directory, "gstack-runtime-manifest.json"), + `${JSON.stringify(manifest, null, 2)}\n`, + { flag: "wx", mode: 0o644 }, +); diff --git a/.github/scripts/gate-secret-scan.mjs b/.github/scripts/gate-secret-scan.mjs new file mode 100644 index 000000000..21014f505 --- /dev/null +++ b/.github/scripts/gate-secret-scan.mjs @@ -0,0 +1,31 @@ +#!/usr/bin/env node +import { spawn } from "node:child_process"; + +const child = spawn("bun", [ + "bin/gstack-redact", + "--repo-visibility", "public", + "--json", + "--max-bytes", "16000000", +], { shell: false, windowsHide: true, stdio: ["pipe", "pipe", "inherit"] }); +let diff = ""; +process.stdin.setEncoding("utf8"); +process.stdin.on("data", (chunk) => { diff += chunk; }); +process.stdin.once("end", () => { + const additions = diff + .split(/\r?\n/) + .filter((line) => line.startsWith("+") && !line.startsWith("+++")) + .map((line) => line.slice(1)) + .join("\n"); + child.stdin.end(additions); +}); +let stdout = ""; +child.stdout.setEncoding("utf8"); +child.stdout.on("data", (chunk) => { stdout += chunk; }); +child.once("error", (error) => { throw error; }); +child.once("close", (code) => { + const report = JSON.parse(stdout); + const high = Number(report.counts?.HIGH ?? 0); + const medium = Number(report.counts?.MEDIUM ?? 0); + console.log(`credential scan: ${high} high, ${medium} advisory`); + process.exitCode = high > 0 || report.oversize || ![0, 2, 3].includes(code) ? 1 : 0; +}); diff --git a/.github/scripts/smoke-packed-package.mjs b/.github/scripts/smoke-packed-package.mjs new file mode 100644 index 000000000..5cb78ea08 --- /dev/null +++ b/.github/scripts/smoke-packed-package.mjs @@ -0,0 +1,63 @@ +#!/usr/bin/env node +import fs from "node:fs/promises"; +import os from "node:os"; +import path from "node:path"; +import { spawn } from "node:child_process"; + +const root = path.resolve(process.argv[2] ?? process.cwd()); +const temporary = await fs.mkdtemp(path.join(os.tmpdir(), "gstack-npm-smoke-")); +try { + const pack = await run("npm", ["pack", "--json", "--ignore-scripts", "--pack-destination", temporary], root); + const [metadata] = JSON.parse(pack.stdout); + if (!metadata?.filename || metadata.size > 2_000_000 || metadata.entryCount > 80) { + throw new Error(`Unexpected npm package shape: ${JSON.stringify(metadata)}`); + } + const archive = path.join(temporary, metadata.filename); + const project = path.join(temporary, "consumer"); + await fs.mkdir(project); + await fs.writeFile(path.join(project, "package.json"), '{"private":true}\n'); + await run("npm", ["install", "--ignore-scripts", "--no-audit", "--no-fund", "--package-lock=false", archive], project); + + const installed = path.join(project, "node_modules", "gstack"); + const pkg = JSON.parse(await fs.readFile(path.join(installed, "package.json"), "utf8")); + if (pkg.gstack?.packageRole !== "runtime-control") throw new Error("Packed role metadata is missing"); + for (const excluded of ["skills", "browse", "design", "make-pdf", "setup"]) { + if (await exists(path.join(installed, excluded))) throw new Error(`Packed package unexpectedly contains ${excluded}`); + } + + const state = path.join(temporary, "state"); + const env = { ...process.env, GSTACK_HOME: state }; + const version = await run(process.execPath, [path.join(installed, "bin", "gstack"), "--version"], project, env); + if (!version.stdout.includes(`gstack runtime ${pkg.gstack.runtimeVersion}`)) throw new Error("Packed gstack version mismatch"); + await run(process.execPath, [path.join(installed, "bin", "gstack"), "setup"], project, env); + const doctor = await run(process.execPath, [path.join(installed, "bin", "gstack"), "doctor", "--json"], project, env, [0, 1]); + const report = JSON.parse(doctor.stdout); + if (!Array.isArray(report.checks) || !report.checks.some((check) => check.id === "config" && check.status === "pass")) { + throw new Error("Packed setup/doctor did not initialize isolated runtime state"); + } + const help = await run(process.execPath, [path.join(installed, "runtime", "runtime-bootstrap.mjs"), "--help"], project, env); + if (!help.stdout.includes("Usage:")) { + throw new Error(`Packed runtime bootstrap help is unavailable: ${JSON.stringify(help)}`); + } + console.log(JSON.stringify({ ok: true, size: metadata.size, entryCount: metadata.entryCount, version: pkg.version })); +} finally { + await fs.rm(temporary, { recursive: true, force: true }); +} + +async function exists(target) { + return fs.access(target).then(() => true, () => false); +} + +function run(command, args, cwd, env = process.env, allowed = [0]) { + return new Promise((resolve, reject) => { + const child = spawn(command, args, { cwd, env, shell: false, windowsHide: true, stdio: ["ignore", "pipe", "pipe"] }); + let stdout = ""; + let stderr = ""; + child.stdout.setEncoding("utf8"); + child.stderr.setEncoding("utf8"); + child.stdout.on("data", (chunk) => { stdout += chunk; }); + child.stderr.on("data", (chunk) => { stderr += chunk; }); + child.once("error", reject); + child.once("close", (code) => allowed.includes(code) ? resolve({ stdout, stderr, code }) : reject(new Error(`${command} ${args.join(" ")} failed (${code})\n${stderr}`))); + }); +} diff --git a/.github/scripts/stage-runtime-components.mjs b/.github/scripts/stage-runtime-components.mjs new file mode 100644 index 000000000..04e53d221 --- /dev/null +++ b/.github/scripts/stage-runtime-components.mjs @@ -0,0 +1,82 @@ +#!/usr/bin/env node +import { createHash } from "node:crypto"; +import { constants as fsConstants, createReadStream } from "node:fs"; +import fs from "node:fs/promises"; +import path from "node:path"; +import { + RUNTIME_COMPONENT_DEPENDENCIES, + runtimeReleaseComponentForPath, +} from "../../runtime/install.js"; + +const [activeInput, outputInput] = process.argv.slice(2); +if (!activeInput || !outputInput) { + console.error("Usage: stage-runtime-components.mjs "); + process.exit(2); +} + +const active = await fs.realpath(path.resolve(activeInput)); +const output = path.resolve(outputInput); +const manifest = JSON.parse(await fs.readFile(path.join(active, ".gstack-bundle.json"), "utf8")); +if (manifest?.schemaVersion !== 2 || !Array.isArray(manifest.files)) { + throw new Error("Active runtime has no supported bundle manifest"); +} + +const componentIds = Object.keys(RUNTIME_COMPONENT_DEPENDENCIES).sort(); +const summary = Object.fromEntries(componentIds.map((id) => [id, { files: 0, bytes: 0 }])); +for (const id of componentIds) await fs.mkdir(path.join(output, id, "gstack"), { recursive: true, mode: 0o700 }); + +for (const file of manifest.files) { + if (!file || typeof file.path !== "string" || !/^[a-f0-9]{64}$/.test(file.sha256) || + !Number.isSafeInteger(file.size) || file.size < 0) { + throw new Error("Bundle manifest contains an invalid file record"); + } + const relative = normalizeRelative(file.path); + const component = runtimeReleaseComponentForPath(relative); + if (component == null) continue; // Playwright's local GC bookkeeping is not runtime input. + if (!summary[component]) throw new Error(`No release component declared for ${relative}`); + const source = safeJoin(active, relative); + const stat = await fs.lstat(source); + if (!stat.isFile() || stat.isSymbolicLink()) throw new Error(`Unsafe runtime source file: ${relative}`); + if (stat.size !== file.size || await sha256File(source) !== file.sha256) { + throw new Error(`Runtime file changed before component staging: ${relative}`); + } + const destination = safeJoin(path.join(output, component, "gstack"), relative); + await fs.mkdir(path.dirname(destination), { recursive: true, mode: 0o700 }); + await fs.copyFile(source, destination, fsConstants.COPYFILE_EXCL); + if (process.platform !== "win32") await fs.chmod(destination, stat.mode & 0o777); + summary[component].files += 1; + summary[component].bytes += stat.size; +} + +for (const [component, details] of Object.entries(summary)) { + if (details.files === 0) throw new Error(`Release component is empty: ${component}`); +} +await fs.writeFile(path.join(output, "components.json"), `${JSON.stringify(summary, null, 2)}\n`, { flag: "wx", mode: 0o644 }); +process.stdout.write(`${JSON.stringify(summary)}\n`); + +function normalizeRelative(value) { + const normalized = path.posix.normalize(value.replaceAll("\\", "/")); + if (!normalized || normalized === "." || normalized === ".." || normalized.startsWith("../") || path.posix.isAbsolute(normalized)) { + throw new Error(`Unsafe manifest path: ${value}`); + } + return normalized; +} + +function safeJoin(root, relative) { + const target = path.resolve(root, ...relative.split("/")); + const relation = path.relative(root, target); + if (relation === ".." || relation.startsWith(`..${path.sep}`) || path.isAbsolute(relation)) { + throw new Error(`Path escaped component root: ${relative}`); + } + return target; +} + +function sha256File(file) { + return new Promise((resolve, reject) => { + const hash = createHash("sha256"); + const stream = createReadStream(file); + stream.on("data", (chunk) => hash.update(chunk)); + stream.once("error", reject); + stream.once("end", () => resolve(hash.digest("hex"))); + }); +} diff --git a/.github/workflows/actionlint.yml b/.github/workflows/actionlint.yml index 1fb654aa8..59c615933 100644 --- a/.github/workflows/actionlint.yml +++ b/.github/workflows/actionlint.yml @@ -1,8 +1,12 @@ name: Workflow Lint on: [push, pull_request] + +permissions: + contents: read + jobs: actionlint: runs-on: ubicloud-standard-8 steps: - - uses: actions/checkout@v4 - - uses: rhysd/actionlint@v1.7.11 + - uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4 + - uses: rhysd/actionlint@393031adb9afb225ee52ae2ccd7a5af5525e03e8 # v1.7.11 diff --git a/.github/workflows/ci-image.yml b/.github/workflows/ci-image.yml index e36092d4c..3f8debe02 100644 --- a/.github/workflows/ci-image.yml +++ b/.github/workflows/ci-image.yml @@ -1,4 +1,7 @@ name: Build CI Image +permissions: + contents: read + on: # Rebuild weekly (Monday 6am UTC) to pick up CLI updates schedule: @@ -20,18 +23,18 @@ jobs: contents: read packages: write steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4 # Copy lockfile + package.json into Docker build context - run: cp package.json bun.lock .github/docker/ - - uses: docker/login-action@v3 + - uses: docker/login-action@c94ce9fb468520275223c153574b00df6fe4bcc9 # v3 with: registry: ghcr.io username: ${{ github.actor }} password: ${{ secrets.GITHUB_TOKEN }} - - uses: docker/build-push-action@v6 + - uses: docker/build-push-action@10e90e3645eae34f1e60eeb005ba3a3d33f178e8 # v6 with: context: .github/docker file: .github/docker/Dockerfile.ci diff --git a/.github/workflows/evals-periodic.yml b/.github/workflows/evals-periodic.yml index 25fd76d01..ec512a5f2 100644 --- a/.github/workflows/evals-periodic.yml +++ b/.github/workflows/evals-periodic.yml @@ -1,4 +1,7 @@ name: Periodic Evals +permissions: + contents: read + on: schedule: - cron: '0 6 * * 1' # Monday 6 AM UTC @@ -22,12 +25,12 @@ jobs: outputs: image-tag: ${{ steps.meta.outputs.tag }} steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4 - id: meta run: echo "tag=${{ env.IMAGE }}:${{ hashFiles('.github/docker/Dockerfile.ci', 'package.json', 'bun.lock') }}" >> "$GITHUB_OUTPUT" - - uses: docker/login-action@v3 + - uses: docker/login-action@c94ce9fb468520275223c153574b00df6fe4bcc9 # v3 with: registry: ghcr.io username: ${{ github.actor }} @@ -46,7 +49,7 @@ jobs: run: cp package.json bun.lock .github/docker/ - if: steps.check.outputs.exists == 'false' - uses: docker/build-push-action@v6 + uses: docker/build-push-action@10e90e3645eae34f1e60eeb005ba3a3d33f178e8 # v6 with: context: .github/docker file: .github/docker/Dockerfile.ci @@ -88,7 +91,7 @@ jobs: - name: e2e-gemini file: test/gemini-e2e.test.ts steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4 with: fetch-depth: 0 @@ -126,7 +129,7 @@ jobs: - name: Upload eval results if: always() - uses: actions/upload-artifact@v4 + uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4 with: name: eval-periodic-${{ matrix.suite.name }} path: ~/.gstack-dev/evals/*.json diff --git a/.github/workflows/evals.yml b/.github/workflows/evals.yml index f5a0d9e40..d96a74c3e 100644 --- a/.github/workflows/evals.yml +++ b/.github/workflows/evals.yml @@ -1,4 +1,7 @@ name: E2E Evals +permissions: + contents: read + on: pull_request: branches: [main] @@ -15,6 +18,8 @@ env: jobs: # Build Docker image with pre-baked toolchain (cached — only rebuilds on Dockerfile/lockfile change) build-image: + # Paid secrets and package-write credentials never run on fork code. + if: github.event_name != 'pull_request' || github.event.pull_request.head.repo.full_name == github.repository runs-on: ubicloud-standard-8 permissions: contents: read @@ -22,12 +27,12 @@ jobs: outputs: image-tag: ${{ steps.meta.outputs.tag }} steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4 - id: meta run: echo "tag=${{ env.IMAGE }}:${{ hashFiles('.github/docker/Dockerfile.ci', 'package.json', 'bun.lock') }}" >> "$GITHUB_OUTPUT" - - uses: docker/login-action@v3 + - uses: docker/login-action@c94ce9fb468520275223c153574b00df6fe4bcc9 # v3 with: registry: ghcr.io username: ${{ github.actor }} @@ -46,7 +51,7 @@ jobs: run: cp package.json bun.lock .github/docker/ - if: steps.check.outputs.exists == 'false' - uses: docker/build-push-action@v6 + uses: docker/build-push-action@10e90e3645eae34f1e60eeb005ba3a3d33f178e8 # v6 with: context: .github/docker file: .github/docker/Dockerfile.ci @@ -56,6 +61,7 @@ jobs: ${{ env.IMAGE }}:latest evals: + if: github.event_name != 'pull_request' || github.event.pull_request.head.repo.full_name == github.repository runs-on: ${{ matrix.suite.runner || 'ubicloud-standard-8' }} needs: build-image container: @@ -105,7 +111,7 @@ jobs: file: test/skill-e2e-office-hours-auto-mode.test.ts test/skill-e2e-plan-mode-no-op.test.ts timeout: 35 steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4 with: fetch-depth: 0 @@ -254,7 +260,7 @@ jobs: - name: Upload eval results if: always() - uses: actions/upload-artifact@v4 + uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4 with: name: eval-${{ matrix.suite.name }} path: ~/.gstack-dev/evals/*.json @@ -263,7 +269,7 @@ jobs: report: runs-on: ubicloud-standard-8 needs: evals - if: always() && github.event_name == 'pull_request' + if: always() && github.event_name == 'pull_request' && github.event.pull_request.head.repo.full_name == github.repository timeout-minutes: 5 permissions: contents: read @@ -275,12 +281,12 @@ jobs: # early and never hit it, which is why this stayed hidden). See #1802 CI fix. issues: write steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4 with: fetch-depth: 1 - name: Download all eval artifacts - uses: actions/download-artifact@v4 + uses: actions/download-artifact@d3f86a106a0bac45b974a628896c90dbdf5c8093 # v4 with: pattern: eval-* path: /tmp/eval-results diff --git a/.github/workflows/gstack2-gate.yml b/.github/workflows/gstack2-gate.yml index c849ca027..6c0cbf9c6 100644 --- a/.github/workflows/gstack2-gate.yml +++ b/.github/workflows/gstack2-gate.yml @@ -30,7 +30,7 @@ jobs: bun-version: 1.3.14 - uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4 with: - node-version: 22 + node-version: 22.23.1 - name: Configure isolated test identity run: | git config --global user.email "gstack2-ci@example.invalid" @@ -56,10 +56,27 @@ jobs: bun-version: 1.3.14 - uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4 with: - node-version: 22 + node-version: 22.23.1 - run: bun install --frozen-lockfile - run: bun run test:gstack2:install + installed-first-use: + name: Installed six-skill first use + runs-on: ubuntu-24.04 + timeout-minutes: 15 + steps: + - uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4 + - uses: oven-sh/setup-bun@0c5077e51419868618aeaa5fe8019c62421857d6 # v2 + with: + bun-version: 1.3.14 + - uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4 + with: + node-version: 22.23.1 + - run: bun install --frozen-lockfile --ignore-scripts + - run: bun run gen:gstack2 + - name: Prove consent-first capability setup continues after approval + run: bun test --timeout 30000 test/gstack2-installation.test.ts test/gstack2-skill-ux.test.ts + dev-container: runs-on: ubuntu-24.04 timeout-minutes: 25 diff --git a/.github/workflows/make-pdf-gate.yml b/.github/workflows/make-pdf-gate.yml index cd07e26bc..9a3d13538 100644 --- a/.github/workflows/make-pdf-gate.yml +++ b/.github/workflows/make-pdf-gate.yml @@ -1,4 +1,7 @@ name: make-pdf copy-paste gate +permissions: + contents: read + on: pull_request: branches: [main] @@ -36,11 +39,11 @@ jobs: runs-on: ${{ matrix.os }} steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4 - - uses: oven-sh/setup-bun@v2 + - uses: oven-sh/setup-bun@0c5077e51419868618aeaa5fe8019c62421857d6 # v2 with: - bun-version: latest + bun-version: 1.3.14 - name: Install dependencies run: bun install --frozen-lockfile diff --git a/.github/workflows/pr-title-sync.yml b/.github/workflows/pr-title-sync.yml index 4f94d4db9..403dfc133 100644 --- a/.github/workflows/pr-title-sync.yml +++ b/.github/workflows/pr-title-sync.yml @@ -1,5 +1,8 @@ name: PR Title Sync +permissions: + contents: read + # WHY pull_request_target (not pull_request): the default GITHUB_TOKEN is # READ-ONLY on fork PRs under `pull_request`, so the title-sync backstop could # never `gh pr edit` a fork/agent PR. `pull_request_target` runs in the base-repo @@ -39,7 +42,7 @@ jobs: steps: # Base repo only — trusted infra (the rewrite helper). No PR-head checkout. - name: Checkout base repo (trusted) - uses: actions/checkout@v4 + uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4 with: fetch-depth: 1 diff --git a/.github/workflows/quality-gate.yml b/.github/workflows/quality-gate.yml new file mode 100644 index 000000000..932a82c14 --- /dev/null +++ b/.github/workflows/quality-gate.yml @@ -0,0 +1,75 @@ +name: Release quality gate + +on: + pull_request: + branches: [main] + push: + branches: [main] + workflow_dispatch: + +permissions: + contents: read + +jobs: + quality: + runs-on: ubuntu-24.04 + timeout-minutes: 20 + steps: + - uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4 + with: + fetch-depth: 0 + - uses: oven-sh/setup-bun@0c5077e51419868618aeaa5fe8019c62421857d6 # v2 + with: + bun-version: 1.3.14 + - uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4 + with: + node-version: 22.23.1 + + - name: Install frozen dependencies + run: bun install --frozen-lockfile --ignore-scripts + + - name: Release and package contract tests + run: bun run check:release + + - name: Scan changed production text for credentials + env: + BASE_SHA: ${{ github.event.pull_request.base.sha || github.event.before }} + HEAD_SHA: ${{ github.event.pull_request.head.sha || github.sha }} + run: | + set -euo pipefail + if ! git cat-file -e "${BASE_SHA}^{commit}" 2>/dev/null; then + BASE_SHA=$(git rev-parse HEAD^) + fi + git diff --unified=0 --no-color "$BASE_SHA" "$HEAD_SHA" -- \ + . \ + ':(exclude)test/**' \ + ':(exclude)evals/**' \ + ':(exclude)outputs/**' \ + ':(exclude)lib/diagram-render/dist/**' \ + ':(exclude)skills/*/references/support/**' \ + ':(exclude)docs/gstack-2/BACKLOG-MAP.json' \ + | node .github/scripts/gate-secret-scan.mjs + + - name: Pack, install, and invoke the npm runtime-control package + run: node .github/scripts/smoke-packed-package.mjs "$GITHUB_WORKSPACE" + + - name: Gate critical dependency advisories + run: bun audit --audit-level=critical + + - name: Syntax-check runtime JavaScript + run: find runtime -type f \( -name '*.js' -o -name '*.mjs' \) -print0 | xargs -0 -n1 node --check + + - name: Install ShellCheck + run: | + sudo apt-get update + sudo apt-get install -y shellcheck=0.9.0-1 + shellcheck --version + + - name: ShellCheck release and setup boundaries + run: >- + shellcheck --severity=error + setup + scripts/build.sh + scripts/write-version-files.sh + scripts/gstack2/runtime-install-smoke.sh + browse/scripts/build-node-server.sh diff --git a/.github/workflows/release-artifacts.yml b/.github/workflows/release-artifacts.yml new file mode 100644 index 000000000..4ef821ebd --- /dev/null +++ b/.github/workflows/release-artifacts.yml @@ -0,0 +1,198 @@ +name: Release runtime artifacts + +on: + push: + tags: [v2.0.0] + workflow_dispatch: + +permissions: + contents: read + +concurrency: + group: runtime-release-${{ github.ref }} + cancel-in-progress: false + +jobs: + build: + name: Build ${{ matrix.target }} + permissions: + contents: read + id-token: write + attestations: write + strategy: + fail-fast: false + matrix: + include: + - os: macos-15 + target: darwin-arm64 + capabilities: browser,browser-visible,design,pdf,diagram,ios + - os: macos-15-intel + target: darwin-x64 + capabilities: browser,browser-visible,design,pdf,diagram,ios + - os: ubuntu-24.04-arm + target: linux-arm64 + capabilities: browser,browser-visible,design,pdf,diagram + - os: ubuntu-24.04 + target: linux-x64 + capabilities: browser,browser-visible,design,pdf,diagram + - os: windows-11-arm + target: windows-arm64 + capabilities: browser,browser-visible,design,pdf,diagram + - os: windows-2025 + target: windows-x64 + capabilities: browser,browser-visible,design,pdf,diagram + runs-on: ${{ matrix.os }} + timeout-minutes: 35 + steps: + - uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4 + - uses: oven-sh/setup-bun@0c5077e51419868618aeaa5fe8019c62421857d6 # v2 + with: + bun-version: 1.3.14 + - uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4 + with: + node-version: 22.23.1 + - uses: sigstore/cosign-installer@d7543c93d881b35a8faa02e8e3605f69b7a1ce62 # v3.10.0 + + - name: Install frozen dependencies + run: bun install --frozen-lockfile --ignore-scripts + shell: bash + + - name: Build and stage the complete managed runtime + env: + GSTACK_HOME: ${{ runner.temp }}/gstack-release-home + TARGET: ${{ matrix.target }} + CAPABILITIES: ${{ matrix.capabilities }} + run: | + set -euo pipefail + node runtime/install.js \ + --source "$GITHUB_WORKSPACE" \ + --home "$GSTACK_HOME" \ + --version 2.0.0 \ + --install-now \ + --yes \ + --capabilities "$CAPABILITIES" + active_slot=$(node -e 'const fs=require("fs"),p=process.argv[1];const v=JSON.parse(fs.readFileSync(p,"utf8")).current;if(typeof v!=="string"||!/^[A-Za-z0-9][A-Za-z0-9._-]{0,127}$/.test(v))process.exit(1);process.stdout.write(v)' "$GSTACK_HOME/versions/current.json") + active="$GSTACK_HOME/versions/$active_slot" + test -f "$active/.gstack-bundle.json" + case "$TARGET" in + windows-*) managed_bun_rel=".gstack-runtime-tools/bun.exe" ;; + *) managed_bun_rel=".gstack-runtime-tools/bun" ;; + esac + managed_bun="$active/$managed_bun_rel" + test -f "$managed_bun" + test "$("$managed_bun" --version)" = "1.3.14" + test -f "$active/runtime/licenses/BUN-LICENSE-1.3.14.md" + test -f "$active/runtime/licenses/BUN-SOURCE.md" + node -e 'const fs=require("fs"),c=require("crypto"),root=process.argv[1],rel=process.argv[2];const m=JSON.parse(fs.readFileSync(root+"/.gstack-bundle.json","utf8"));if(m.tools?.bun?.path!==rel||m.tools?.bun?.version!=="1.3.14")process.exit(1);const license=fs.readFileSync(root+"/runtime/licenses/BUN-LICENSE-1.3.14.md");if(c.createHash("sha256").update(license).digest("hex")!=="2cb858b2db8fc793bca2093489c5bc8eee615d002cc4924254904044c27a0afa")process.exit(1)' "$active" "$managed_bun_rel" + test -d "$active/.gstack-runtime-browsers" + ( + cd "$active" + PLAYWRIGHT_BROWSERS_PATH="$active/.gstack-runtime-browsers" \ + node --input-type=module --eval \ + 'const { chromium } = await import("./node_modules/playwright/index.mjs"); for (const options of [{ headless: true }, { headless: true, channel: "chromium" }]) { const browser = await chromium.launch(options); await browser.close(); }' + ) + node_command=$(node -p 'process.execPath') + host_bun=$(command -v bun) + host_bun_dir=$(cd "$(dirname "$host_bun")" && pwd -P) + clean_path="" + IFS=: read -r -a path_parts <<< "$PATH" + for part in "${path_parts[@]}"; do + physical=$(cd "$part" 2>/dev/null && pwd -P || printf '%s' "$part") + if [ "$physical" != "$host_bun_dir" ]; then + clean_path="${clean_path:+$clean_path:}$part" + fi + done + if (PATH="$clean_path"; command -v bun >/dev/null 2>&1); then + echo "Host-global Bun remained available after removing setup-bun from PATH" >&2 + exit 1 + fi + test "$(PATH="$clean_path" GSTACK_NODE="$node_command" "$GSTACK_HOME/bin/bun" --version)" = "1.3.14" + browser_cleanup() { + PATH="$clean_path" GSTACK_NODE="$node_command" BROWSE_PARENT_PID=0 \ + "$GSTACK_HOME/bin/browse" stop >/dev/null 2>&1 || true + } + trap browser_cleanup EXIT + PATH="$clean_path" GSTACK_NODE="$node_command" BROWSE_PARENT_PID=0 \ + "$GSTACK_HOME/bin/browse" goto about:blank + PATH="$clean_path" GSTACK_NODE="$node_command" BROWSE_PARENT_PID=0 \ + "$GSTACK_HOME/bin/browse" status + browser_cleanup + trap - EXIT + stage="$RUNNER_TEMP/runtime-components" + mkdir -p "$stage" "$GITHUB_WORKSPACE/release-output" + node .github/scripts/stage-runtime-components.mjs "$active" "$stage" + for component_dir in "$stage"/*; do + test -d "$component_dir" || continue + component=$(basename "$component_dir") + archive="$GITHUB_WORKSPACE/release-output/gstack-runtime-2.0.0-$TARGET-$component.tar.gz" + tar -czf "$archive" -C "$component_dir" gstack + node -e 'const fs=require("fs"),c=require("crypto"),p=process.argv[1];const b=fs.readFileSync(p);fs.writeFileSync(p+".sha256",c.createHash("sha256").update(b).digest("hex")+" "+require("path").basename(p)+"\n")' "$archive" + done + shell: bash + + - name: Keyless-sign component archives + run: | + set -euo pipefail + for archive in release-output/*.tar.gz; do + cosign sign-blob --yes --bundle "$archive.sigstore.json" "$archive" + done + shell: bash + + - name: Attest component archive provenance + uses: actions/attest-build-provenance@e8998f949152b193b063cb0ec769d69d929409be # v2 + with: + subject-path: release-output/*.tar.gz + + - name: Upload signed archive + uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4 + with: + name: runtime-${{ matrix.target }} + path: release-output/* + if-no-files-found: error + retention-days: 14 + + manifest: + name: Assemble manifest and GitHub Release + needs: build + runs-on: ubuntu-24.04 + if: startsWith(github.ref, 'refs/tags/v') + permissions: + contents: write + id-token: write + attestations: write + steps: + - uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4 + - uses: actions/download-artifact@d3f86a106a0bac45b974a628896c90dbdf5c8093 # v4 + with: + pattern: runtime-* + path: release-output + merge-multiple: true + - uses: sigstore/cosign-installer@d7543c93d881b35a8faa02e8e3605f69b7a1ce62 # v3.10.0 + + - name: Create strict six-target manifest + run: node .github/scripts/create-runtime-release-manifest.mjs release-output "$GITHUB_REPOSITORY" 2.0.0 + + - name: Checksum and keyless-sign manifest + run: | + set -euo pipefail + cd release-output + sha256sum gstack-runtime-manifest.json > gstack-runtime-manifest.json.sha256 + cosign sign-blob --yes --bundle gstack-runtime-manifest.json.sigstore.json gstack-runtime-manifest.json + shell: bash + + - name: Attest manifest provenance + uses: actions/attest-build-provenance@e8998f949152b193b063cb0ec769d69d929409be # v2 + with: + subject-path: release-output/gstack-runtime-manifest.json + + - name: Publish immutable release assets + env: + GH_TOKEN: ${{ github.token }} + run: | + set -euo pipefail + gh release create "$GITHUB_REF_NAME" \ + --verify-tag \ + --title "GStack runtime 2.0.0" \ + --notes "Signed optional runtime artifacts for the six portable GStack skills." \ + release-output/* + shell: bash diff --git a/.github/workflows/skill-docs.yml b/.github/workflows/skill-docs.yml index 700a8222a..2757f5e3a 100644 --- a/.github/workflows/skill-docs.yml +++ b/.github/workflows/skill-docs.yml @@ -1,11 +1,15 @@ name: Skill Docs Freshness on: [push, pull_request] + +permissions: + contents: read + jobs: check-freshness: runs-on: ubicloud-standard-8 steps: - - uses: actions/checkout@v4 - - uses: oven-sh/setup-bun@v2 + - uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4 + - uses: oven-sh/setup-bun@0c5077e51419868618aeaa5fe8019c62421857d6 # v2 - run: bun install - name: Check Claude host freshness run: bun run gen:skill-docs diff --git a/.github/workflows/version-gate.yml b/.github/workflows/version-gate.yml index 2c60d9d76..7f539b84f 100644 --- a/.github/workflows/version-gate.yml +++ b/.github/workflows/version-gate.yml @@ -1,5 +1,8 @@ name: Version Gate +permissions: + contents: read + on: pull_request: paths: @@ -20,13 +23,13 @@ jobs: pull-requests: read steps: - name: Checkout PR head - uses: actions/checkout@v4 + uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4 with: fetch-depth: 0 ref: ${{ github.event.pull_request.head.sha }} - name: Setup Bun - uses: oven-sh/setup-bun@v2 + uses: oven-sh/setup-bun@0c5077e51419868618aeaa5fe8019c62421857d6 # v2 - name: Read versions id: versions diff --git a/.github/workflows/windows-free-tests.yml b/.github/workflows/windows-free-tests.yml index c05a7d002..3bed5f6aa 100644 --- a/.github/workflows/windows-free-tests.yml +++ b/.github/workflows/windows-free-tests.yml @@ -1,5 +1,8 @@ name: Windows Free Tests +permissions: + contents: read + # Curated subset of the free test suite that runs on a paid faster Windows runner. # # Codex's v1.18.0.0 review flagged that the existing evals.yml workflow uses @@ -39,11 +42,11 @@ jobs: timeout-minutes: 15 steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4 - - uses: oven-sh/setup-bun@v1 + - uses: oven-sh/setup-bun@0c5077e51419868618aeaa5fe8019c62421857d6 # v2 with: - bun-version: latest + bun-version: 1.3.14 - name: Configure git identity (required by tests that init temp repos) run: | diff --git a/.github/workflows/windows-setup-e2e.yml b/.github/workflows/windows-setup-e2e.yml index ddc5051af..53fae3b00 100644 --- a/.github/workflows/windows-setup-e2e.yml +++ b/.github/workflows/windows-setup-e2e.yml @@ -1,10 +1,12 @@ name: Windows Setup E2E -# End-to-end fresh-install gate for Windows. Runs `./setup` on a clean -# windows-latest checkout and asserts the build completes, binaries -# resolve via find-browse, and the gstack-paths state root resolves -# cleanly. Catches Bun shell-parser regressions in package.json's build -# chain (#1538, #1537, #1530, #1457, #1561) before they reach users. +permissions: + contents: read + +# End-to-end optional-runtime gate for Windows. It first proves dry-run is +# non-mutating, then performs an explicit browser-capability install, checks +# doctor and the native artifact, and uninstalls. Agent Skills host placement +# is deliberately outside this workflow and is covered by gstack2-gate.yml. # # Separate from windows-free-tests.yml because that one runs a curated # unit-test subset; this one exercises the install path itself. @@ -19,6 +21,7 @@ on: - 'scripts/build.sh' - 'scripts/write-version-files.sh' - 'setup' + - 'runtime/**' - 'browse/src/cli.ts' - 'browse/src/find-browse.ts' - 'bin/gstack-paths' @@ -35,11 +38,18 @@ jobs: timeout-minutes: 15 steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4 - - uses: oven-sh/setup-bun@v1 + - name: Configure isolated runtime home + run: echo "GSTACK_HOME=$RUNNER_TEMP/gstack-setup-e2e" >> "$GITHUB_ENV" + shell: bash + + - uses: oven-sh/setup-bun@0c5077e51419868618aeaa5fe8019c62421857d6 # v2 with: - bun-version: latest + bun-version: 1.3.14 + - uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4 + with: + node-version: 22.23.1 - name: Configure git identity run: | @@ -52,45 +62,34 @@ jobs: run: bun install --frozen-lockfile shell: bash - - name: Run bun run build (the previously-broken path) - # This is the regression gate. Bun's Windows shell parser rejected - # multiple constructs the old inline build chain used; the wave - # moved the build to scripts/build.sh. If this step fails on - # Windows, the build chain regressed. - run: bun run build - shell: bash - env: - GSTACK_SKIP_PLAYWRIGHT: '1' - - - name: Verify binaries exist (with .exe extension on Windows) + - name: Preview without mutating state run: | set -e - test -f browse/dist/browse.exe || test -f browse/dist/browse || (echo "MISSING: browse" && exit 1) - test -f browse/dist/find-browse.exe || test -f browse/dist/find-browse || (echo "MISSING: find-browse" && exit 1) - test -f design/dist/design.exe || test -f design/dist/design || (echo "MISSING: design" && exit 1) - test -f bin/gstack-global-discover.exe || test -f bin/gstack-global-discover || (echo "MISSING: gstack-global-discover" && exit 1) - echo "All binaries present" + bash ./setup --dry-run --capabilities browser + test ! -e "$GSTACK_HOME" || (echo "dry-run mutated GSTACK_HOME" && exit 1) shell: bash - - name: Verify find-browse resolves to the .exe variant + - name: Explicitly install the browser capability run: | set -e - OUT=$(bun browse/src/find-browse.ts 2>&1) || true - echo "find-browse output: $OUT" - # On Windows, find-browse should successfully resolve to a binary, - # whether or not it has the .exe extension on disk. Empty output - # or "not found" means the .exe extension resolver regressed. - echo "$OUT" | grep -qE '(browse\.exe|browse)$' || (echo "find-browse failed to resolve binary on Windows" && exit 1) + bash ./setup --install-now --yes --capabilities browser + test -f "$GSTACK_HOME/versions/current.json" + test -f "$GSTACK_HOME/bin/gstack.cmd" shell: bash - - name: Verify gstack-paths state root resolves + - name: Verify doctor and installed native browser run: | set -e - eval "$(bash bin/gstack-paths)" - test -n "$GSTACK_STATE_ROOT" || (echo "GSTACK_STATE_ROOT empty" && exit 1) - test -n "$PLAN_ROOT" || (echo "PLAN_ROOT empty" && exit 1) - test -n "$TMP_ROOT" || (echo "TMP_ROOT empty" && exit 1) - echo "GSTACK_STATE_ROOT=$GSTACK_STATE_ROOT" - echo "PLAN_ROOT=$PLAN_ROOT" - echo "TMP_ROOT=$TMP_ROOT" + node runtime/cli.js doctor --json > doctor.json + node -e 'const r=require("./doctor.json");if(!r.checks.some(x=>x.id==="managed-runtime"&&x.status==="pass"))process.exit(1);if(!r.checks.some(x=>x.id==="capability:browser"&&x.status==="pass"))process.exit(1)' + browser=$(node runtime/cli.js runtime path browse/dist/browse.exe) + test -f "$browser" + shell: bash + + - name: Uninstall the runtime and preserve user state + run: | + set -e + node runtime/cli.js uninstall + test ! -e "$GSTACK_HOME/versions/current.json" + test -d "$GSTACK_HOME/projects" shell: bash diff --git a/README.md b/README.md index e62e12c6c..6eb80d3aa 100644 --- a/README.md +++ b/README.md @@ -42,20 +42,40 @@ That installs the six judgment skills. Install a subset with the installer's `--skill` option, or use `-g` for its global scope. GStack does not silently enroll detected hosts. +The standard installer also owns the complete skill lifecycle: + +```bash +npx skills list # inspect installed skills +npx skills check # report available updates +npx skills update # update while preserving source and scope +npx skills remove plan # remove a selected skill +``` + +GStack's verified installer matrix pins `skills` CLI 1.5.19. Those commands +are installer behavior, not a GStack background updater. The upstream CLI +collects anonymous command-usage telemetry by default; set +`DISABLE_TELEMETRY=1` or `DO_NOT_TRACK=1` before invoking it to opt out. GStack +does not proxy or add fields to that telemetry. + The candidate installer matrix passes project/global placement for Claude Code, Codex, Cursor, Pi, OpenClaw, and GitHub Copilot. This verifies files and canonical hashes; host UI execution remains a separate release gate. Start with `/plan`, or invoke the skill syntax your host displays. Pure judgment modes work without a shared executable. Capability-dependent modes -may offer the optional, host-neutral runtime. From a repository checkout, -`./setup` installs that runtime once per user without placing host skills. Its -real default-capability lifecycle and 383-file broad suite pass on macOS. The -declared Linux Dev Container passes the 136-test GStack 2 suite, and a clean -Linux arm64 install/build/browser/uninstall smoke also passes. Native-host -Linux and Windows remain release gates, so consult -[`HOST-COMPATIBILITY.md`](docs/gstack-2/HOST-COMPATIBILITY.md) before relying on -it. +may offer the optional, host-neutral runtime only when the selected work needs +one. The skill explains the local capability and network/download boundary, +then asks whether to install now or later. Nothing is downloaded before that +approval, and installing a capability never enrolls another coding host. +Approved installs fetch the pinned official GitHub Release artifact, verify its +declared byte count and SHA-256, and use Sigstore metadata when Cosign is +already available. Cosign is not an end-user prerequisite. + +The npm package is deliberately not the skill installer and does not contain +the six skill tree or compiled browser/design/PDF payloads. It is the small +host-neutral runtime control/bootstrap surface used by release tooling. New +users should install skills with `npx skills add time-attack/gstack`; optional +capabilities are downloaded by a skill after consent. Public web research is optional. Context.dev is the only new external service, is disabled until explicit consent, and may receive only public URLs. If it is @@ -101,8 +121,14 @@ Fork it. Improve it. Make it yours. And if you want to hate on free open source - **First-time Claude Code users** — structured roles instead of a blank prompt - **Tech leads and staff engineers** — rigorous review, QA, and release automation on every PR +
+Legacy 1.x workflow and host-specific documentation + ## Legacy 1.x workflow example +Everything from this heading through the old host tables is a compatibility +archive. It is not the GStack 2 installation or first-run path. + 1. Install gstack (30 seconds — see below) 2. Run `/office-hours` — describe what you're building 3. Run `/plan-ceo-review` on any feature idea @@ -555,7 +581,7 @@ The retained 1.x compatibility tooling includes **opt-in** usage telemetry: - **What's sent (if you opt in):** skill name, duration, success/fail, gstack version, OS. That's it. - **What's never sent:** code, file paths, repo names, branch names, prompts, or any user-generated content. - **Change anytime:** `gstack-config set telemetry off` disables everything instantly. -- **Legacy update checks:** 1.x can fetch the current version number from `raw.githubusercontent.com`. Set `update_check: false` in `~/.gstack/config.yaml` to disable this legacy path. It is not the GStack 2 runtime's default behavior. +- **Updates are installer-owned:** GStack skill preambles perform no passive release request. Use `npx skills update` (optionally `-p` or `-g`) so the Agent Skills installer preserves the source, scope, host placement, and selected-skill set. The retained 1.x `gstack-update-check --force` path runs only when explicitly requested. Data is stored in [Supabase](https://supabase.com) (open source Firebase alternative). The schema is in [`supabase/migrations/`](supabase/migrations/) — you can verify exactly what's collected. The Supabase publishable key in the repo is a public key (like a Firebase API key) — row-level security policies deny all direct access. Telemetry flows through validated edge functions that enforce schema checks, event type allowlists, and field length limits. @@ -572,7 +598,7 @@ entries below apply to legacy 1.x installations. **`/browse` fails?** `cd ~/.claude/skills/gstack && bun install && bun run build` -**Stale install?** Run `/gstack-upgrade` — or set `auto_upgrade: true` in `~/.gstack/config.yaml` +**Stale GStack 2 skills?** Run `npx skills update` (`-p` for project scope or `-g` for global scope). The installer owns host placement and selection. `/gstack-upgrade` is retained only for legacy 1.x installations. **Want shorter commands?** `cd ~/.claude/skills/gstack && ./setup --no-prefix` — switches from `/gstack-qa` to `/qa`. Your choice is remembered for future upgrades. @@ -597,6 +623,8 @@ Available skills: /office-hours, /plan-ceo-review, /plan-eng-review, /plan-desig /guard, /unfreeze, /gstack-upgrade, /learn. ``` +
+ ## License MIT. Free forever. Go build something. diff --git a/bin/gstack-config b/bin/gstack-config index 3e37ae41d..062a1b47f 100755 --- a/bin/gstack-config +++ b/bin/gstack-config @@ -34,7 +34,9 @@ const defaults = Object.freeze({ routing_declined: false, telemetry: "off", auto_upgrade: false, - update_check: true, + // Skill installation and update discovery belong to the Agent Skills CLI. + // GStack never performs a passive network update check by default. + update_check: false, skill_prefix: false, checkpoint_mode: "explicit", checkpoint_push: false, diff --git a/bin/gstack-update-check b/bin/gstack-update-check index 3ec464531..69fdc5839 100755 --- a/bin/gstack-update-check +++ b/bin/gstack-update-check @@ -23,18 +23,18 @@ VERSION_FILE="$GSTACK_DIR/VERSION" REMOTE_URL="${GSTACK_REMOTE_URL:-https://raw.githubusercontent.com/garrytan/gstack/main/VERSION}" REMOTE_REPO="${GSTACK_REMOTE_REPO:-https://github.com/garrytan/gstack.git}" -# ─── Force flag (busts cache + snooze for standalone /gstack-upgrade) ── -if [ "${1:-}" = "--force" ]; then - rm -f "$CACHE_FILE" - rm -f "$SNOOZE_FILE" -fi - -# ─── Step 0: Check if updates are disabled ──────────────────── -_UC=$("$GSTACK_DIR/bin/gstack-config" get update_check 2>/dev/null || true) -if [ "$_UC" = "false" ]; then +# Agent Skills owns normal update discovery and installation (`npx skills +# update`). Skill preambles still call this compatibility +# helper, so fail closed before any state mutation or network access unless a +# user explicitly invoked the legacy forced check. +if [ "${1:-}" != "--force" ]; then exit 0 fi +# ─── Explicit legacy check: bust cache + snooze ─────────────── +rm -f "$CACHE_FILE" +rm -f "$SNOOZE_FILE" + # ─── Migration: fix stale Codex descriptions (one-time) ─────── # Existing installs may have .agents/skills/gstack/SKILL.md with oversized # descriptions (>1024 chars) that Codex rejects. We can't regenerate from diff --git a/browse/src/browser-manager.ts b/browse/src/browser-manager.ts index a61048987..8774d9b17 100644 --- a/browse/src/browser-manager.ts +++ b/browse/src/browser-manager.ts @@ -16,6 +16,7 @@ */ import { chromium, type Browser, type BrowserContext, type BrowserContextOptions, type Page, type Locator, type Cookie } from 'playwright'; +import { readdirSync } from 'node:fs'; import { writeSecureFile, mkdirSecure } from './file-permissions'; import { addConsoleEntry, addNetworkEntry, addDialogEntry, networkBuffer, type DialogEntry } from './buffers'; import { emitActivity } from './activity'; @@ -73,6 +74,21 @@ export function shouldEnableChromiumSandbox(): boolean { return !(process.env.CI || process.env.CONTAINER || isRoot); } +/** Select full Chromium only when a managed visible-only cache has no shell. */ +export function managedHeadlessChannel(env: NodeJS.ProcessEnv = process.env): 'chromium' | undefined { + const root = env.PLAYWRIGHT_BROWSERS_PATH; + if (!root) return undefined; + try { + const names = readdirSync(root, { withFileTypes: true }) + .filter((entry) => entry.isDirectory()) + .map((entry) => entry.name); + if (names.some((name) => name.startsWith('chromium_headless_shell-'))) return undefined; + return names.some((name) => /^chromium-\d/.test(name)) ? 'chromium' : undefined; + } catch { + return undefined; + } +} + /** * Resolve why the underlying Chromium ChildProcess is going away. * @@ -371,6 +387,7 @@ export class BrowserManager { this.browser = await chromium.launch({ headless: useHeadless, + ...(useHeadless && managedHeadlessChannel() ? { channel: 'chromium' as const } : {}), // On Windows, Chromium's sandbox fails when the server is spawned through // the Bun→Node process chain (GitHub #276). Disable it — local daemon // browsing user-specified URLs has marginal sandbox benefit. Also disabled @@ -585,7 +602,7 @@ export class BrowserManager { args: launchArgs, viewport: null, // Use browser's default viewport (real window size) userAgent: this.customUserAgent || customUA, - ...(executablePath ? { executablePath } : {}), + ...(executablePath ? { executablePath } : { channel: 'chromium' }), ...(this.proxyConfig ? { proxy: this.proxyConfig } : {}), ignoreDefaultArgs: STEALTH_IGNORE_DEFAULT_ARGS, }); @@ -1588,6 +1605,7 @@ export class BrowserManager { const { STEALTH_IGNORE_DEFAULT_ARGS } = await import('./stealth'); newContext = await chromium.launchPersistentContext(userDataDir, { headless: false, + channel: 'chromium', // Match the sandbox policy used by launchHeaded() / launch(). The // handoff path is the headless→headed re-launch and shares the same // anti-detection posture, including no spurious --no-sandbox infobar. diff --git a/browse/src/cli.ts b/browse/src/cli.ts index 59327b792..ad2dc5333 100644 --- a/browse/src/cli.ts +++ b/browse/src/cli.ts @@ -80,12 +80,15 @@ export function resolveNodeServerScript( return null; } -const NODE_SERVER_SCRIPT = IS_WINDOWS ? resolveNodeServerScript() : null; +const NODE_SERVER_SCRIPT = resolveNodeServerScript(); +const IS_COMPILED = import.meta.dir.includes('$bunfs'); -// On Windows, hard-fail if server-node.mjs is missing — the Bun path is known broken. -if (IS_WINDOWS && !NODE_SERVER_SCRIPT) { +// Every installed/compiled client must use the adjacent Node-compatible daemon. +// Source development may fall back to `bun run server.ts` when dist has not +// been built yet, but an installed capability must never require host-global Bun. +if (IS_COMPILED && !NODE_SERVER_SCRIPT) { throw new Error( - 'server-node.mjs not found. Run `bun run build` to generate the Windows server bundle.' + 'server-node.mjs not found. Rebuild the managed browser runtime and run `gstack doctor --skill-api 2.0`.' ); } @@ -314,30 +317,20 @@ async function startServer(extraEnv?: Record): Promise isPathWithin(realTarget, dir)); - if (!isSafe) { - throw new Error(`Path must be within: ${SAFE_DIRECTORIES.join(', ')}`); - } - return; // symlink target verified, no need to check parent - } + stat = fs.lstatSync(resolved); } catch (e: any) { - // ENOENT = file doesn't exist yet, fall through to parent-dir check + // ENOENT from lstat means the output file itself does not exist yet. + // Do not put realpathSync in this catch: ENOENT there means an existing + // dangling symlink, which must fail closed instead of being treated as a + // new file whose parent is safe. if (e.code !== 'ENOENT') throw e; } + if (stat?.isSymbolicLink()) { + let realTarget: string; + try { + realTarget = fs.realpathSync(resolved); + } catch { + throw new Error(`Path must be within: ${SAFE_DIRECTORIES.join(', ')}`); + } + const isSafe = SAFE_DIRECTORIES.some(dir => isPathWithin(realTarget, dir)); + if (!isSafe) { + throw new Error(`Path must be within: ${SAFE_DIRECTORIES.join(', ')}`); + } + return; // symlink target verified, no need to check parent + } // For new files (no existing symlink), verify the parent directory. // The file itself may not exist yet (e.g., screenshot output). diff --git a/browse/test/cli-setsid-daemonize.test.ts b/browse/test/cli-setsid-daemonize.test.ts index fb425c1b0..0e29e2d03 100644 --- a/browse/test/cli-setsid-daemonize.test.ts +++ b/browse/test/cli-setsid-daemonize.test.ts @@ -55,7 +55,7 @@ describe("#1612 macOS/Linux daemonize via Node setsid path", () => { expect(body).toMatch(/SIGHUP/); }); - test("the spawn call on macOS/Linux is nodeSpawn, not Bun.spawn", () => { + test("installed clients prefer the adjacent Node daemon and source development keeps a detached Bun fallback", () => { const body = read(); // Strip line comments before regex matching, so the "Bun.spawn().unref()" // mentions inside the explanatory comment don't trigger false positives. @@ -63,13 +63,14 @@ describe("#1612 macOS/Linux daemonize via Node setsid path", () => { .split("\n") .filter((line) => !line.trim().startsWith("//")) .join("\n"); - // Find the non-Windows branch. The `} else {` block following the - // Windows branch. We then require its first ~400 chars contain a - // nodeSpawn() call and NOT a Bun.spawn() call (excluding the comment). - const nonWindowsStart = codeOnly.indexOf("nodeSpawn('bun'"); - expect(nonWindowsStart).toBeGreaterThan(-1); - const slice = codeOnly.slice(nonWindowsStart, nonWindowsStart + 400); - expect(slice).toMatch(/nodeSpawn\(/); - expect(slice).not.toMatch(/Bun\.spawn\(/); + expect(codeOnly).toContain("if (NODE_SERVER_SCRIPT)"); + expect(codeOnly).toContain("spawn(process.execPath"); + expect(codeOnly).toContain("nodeSpawn('bun', ['run', SERVER_SCRIPT]"); + expect(codeOnly).not.toMatch(/Bun\.spawn\([^\n]*SERVER_SCRIPT/); + }); + + test("installed daemon detachment honors the bootstrap-selected Node executable", () => { + const body = read(); + expect(body).toContain("process.env.GSTACK_NODE || 'node'"); }); }); diff --git a/browse/test/path-validation.test.ts b/browse/test/path-validation.test.ts index fd8ff8991..838d22098 100644 --- a/browse/test/path-validation.test.ts +++ b/browse/test/path-validation.test.ts @@ -112,10 +112,16 @@ describe('validateReadPath', () => { }); describe('validateOutputPath — symlink resolution', () => { - it('blocks symlink inside /tmp pointing outside safe dirs', () => { - const linkPath = join(tmpdir(), 'test-output-symlink-' + Date.now() + '.png'); + it('blocks a dangling symlink inside /tmp pointing outside safe dirs', () => { + // Keep the link in the validator's canonical safe temp root instead of + // os.tmpdir(), which is /var/folders/... on default macOS test runs. The + // missing target makes this a regression test for realpathSync ENOENT. + const realTmp = realpathSync('/tmp'); + const unique = `${process.pid}-${Date.now()}`; + const linkPath = join(realTmp, `test-output-dangling-${unique}.png`); + const missingTarget = `/etc/gstack-missing-output-${unique}`; try { - symlinkSync('/etc/crontab', linkPath); + symlinkSync(missingTarget, linkPath); expect(() => validateOutputPath(linkPath)).toThrow(/Path must be within/); } finally { try { unlinkSync(linkPath); } catch {} diff --git a/bun.lock b/bun.lock index 9a599f4b6..1dd1ec869 100644 --- a/bun.lock +++ b/bun.lock @@ -11,7 +11,6 @@ "html-to-docx": "1.8.0", "marked": "^18.0.2", "playwright": "^1.58.2", - "puppeteer-core": "^24.40.0", "sharp": "^0.34.5", "socks": "^2.8.8", "xterm": "5", @@ -164,54 +163,22 @@ "@protobufjs/utf8": ["@protobufjs/utf8@1.1.0", "", {}, "sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw=="], - "@puppeteer/browsers": ["@puppeteer/browsers@2.13.0", "", { "dependencies": { "debug": "^4.4.3", "extract-zip": "^2.0.1", "progress": "^2.0.3", "proxy-agent": "^6.5.0", "semver": "^7.7.4", "tar-fs": "^3.1.1", "yargs": "^17.7.2" }, "bin": { "browsers": "lib/cjs/main-cli.js" } }, "sha512-46BZJYJjc/WwmKjsvDFykHtXrtomsCIrwYQPOP7VfMJoZY2bsDF9oROBABR3paDjDcmkUye1Pb1BqdcdiipaWA=="], - - "@tootallnate/quickjs-emscripten": ["@tootallnate/quickjs-emscripten@0.23.0", "", {}, "sha512-C5Mc6rdnsaJDjO3UpGW/CQTHtCKaYlScZTly4JIu97Jxo/odCiH0ITnDXSJPTOrEKk/ycSZ0AOgTmkDtkOsvIA=="], - "@types/node": ["@types/node@25.5.0", "", { "dependencies": { "undici-types": "~7.18.0" } }, "sha512-jp2P3tQMSxWugkCUKLRPVUpGaL5MVFwF8RDuSRztfwgN1wmqJeMSbKlnEtQqU8UrhTmzEmZdu2I6v2dpp7XIxw=="], - "@types/yauzl": ["@types/yauzl@2.10.3", "", { "dependencies": { "@types/node": "*" } }, "sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q=="], - "accepts": ["accepts@2.0.0", "", { "dependencies": { "mime-types": "^3.0.0", "negotiator": "^1.0.0" } }, "sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng=="], "adm-zip": ["adm-zip@0.5.17", "", {}, "sha512-+Ut8d9LLqwEvHHJl1+PIHqoyDxFgVN847JTVM3Izi3xHDWPE4UtzzXysMZQs64DMcrJfBeS/uoEP4AD3HQHnQQ=="], - "agent-base": ["agent-base@7.1.4", "", {}, "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ=="], - "ajv": ["ajv@8.18.0", "", { "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", "json-schema-traverse": "^1.0.0", "require-from-string": "^2.0.2" } }, "sha512-PlXPeEWMXMZ7sPYOHqmDyCJzcfNrUr3fGNKtezX14ykXOEIvyK81d+qydx89KY5O71FKMPaQ2vBfBFI5NHR63A=="], "ajv-formats": ["ajv-formats@3.0.1", "", { "dependencies": { "ajv": "^8.0.0" } }, "sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ=="], - "ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="], - - "ansi-styles": ["ansi-styles@4.3.0", "", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="], - - "ast-types": ["ast-types@0.13.4", "", { "dependencies": { "tslib": "^2.0.1" } }, "sha512-x1FCFnFifvYDDzTaLII71vG5uvDwgtmDTEVWAxrgeiR8VjMONcCXJx7E+USjDtHlwFmt9MysbqgF9b9Vjr6w+w=="], - - "b4a": ["b4a@1.8.0", "", { "peerDependencies": { "react-native-b4a": "*" }, "optionalPeers": ["react-native-b4a"] }, "sha512-qRuSmNSkGQaHwNbM7J78Wwy+ghLEYF1zNrSeMxj4Kgw6y33O3mXcQ6Ie9fRvfU/YnxWkOchPXbaLb73TkIsfdg=="], - - "bare-events": ["bare-events@2.8.2", "", { "peerDependencies": { "bare-abort-controller": "*" }, "optionalPeers": ["bare-abort-controller"] }, "sha512-riJjyv1/mHLIPX4RwiK+oW9/4c3TEUeORHKefKAKnZ5kyslbN+HXowtbaVEqt4IMUB7OXlfixcs6gsFeo/jhiQ=="], - - "bare-fs": ["bare-fs@4.5.6", "", { "dependencies": { "bare-events": "^2.5.4", "bare-path": "^3.0.0", "bare-stream": "^2.6.4", "bare-url": "^2.2.2", "fast-fifo": "^1.3.2" }, "peerDependencies": { "bare-buffer": "*" }, "optionalPeers": ["bare-buffer"] }, "sha512-1QovqDrR80Pmt5HPAsMsXTCFcDYr+NSUKW6nd6WO5v0JBmnItc/irNRzm2KOQ5oZ69P37y+AMujNyNtG+1Rggw=="], - - "bare-os": ["bare-os@3.8.1", "", {}, "sha512-6g8rIdyQqYL6XbghpOgS8AOSvWQUf0zT0XaYUrJIX5VugpCGUyJaz1zfcKCecOnUkI76oVJXuHg1LMGYVXTvKw=="], - - "bare-path": ["bare-path@3.0.0", "", { "dependencies": { "bare-os": "^3.0.1" } }, "sha512-tyfW2cQcB5NN8Saijrhqn0Zh7AnFNsnczRcuWODH0eYAXBsJ5gVxAUuNr7tsHSC6IZ77cA0SitzT+s47kot8Mw=="], - - "bare-stream": ["bare-stream@2.11.0", "", { "dependencies": { "streamx": "^2.25.0", "teex": "^1.0.1" }, "peerDependencies": { "bare-abort-controller": "*", "bare-buffer": "*", "bare-events": "*" }, "optionalPeers": ["bare-abort-controller", "bare-buffer", "bare-events"] }, "sha512-Y/+iQ49fL3rIn6w/AVxI/2+BRrpmzJvdWt5Jv8Za6Ngqc6V227c+pYjYYgLdpR3MwQ9ObVXD0ZrqoBztakM0rw=="], - - "bare-url": ["bare-url@2.4.0", "", { "dependencies": { "bare-path": "^3.0.0" } }, "sha512-NSTU5WN+fy/L0DDenfE8SXQna4voXuW0FHM7wH8i3/q9khUSchfPbPezO4zSFMnDGIf9YE+mt/RWhZgNRKRIXA=="], - - "basic-ftp": ["basic-ftp@5.2.0", "", {}, "sha512-VoMINM2rqJwJgfdHq6RiUudKt2BV+FY5ZFezP/ypmwayk68+NzzAQy4XXLlqsGD4MCzq3DrmNFD/uUmBJuGoXw=="], - "body-parser": ["body-parser@2.2.2", "", { "dependencies": { "bytes": "^3.1.2", "content-type": "^1.0.5", "debug": "^4.4.3", "http-errors": "^2.0.0", "iconv-lite": "^0.7.0", "on-finished": "^2.4.1", "qs": "^6.14.1", "raw-body": "^3.0.1", "type-is": "^2.0.1" } }, "sha512-oP5VkATKlNwcgvxi0vM0p/D3n2C3EReYVX+DNYs5TjZFn/oQt2j+4sVJtSMr18pdRr8wjTcBl6LoV+FUwzPmNA=="], "boolean": ["boolean@3.2.0", "", {}, "sha512-d0II/GO9uf9lfUHH2BQsjxzRJZBdsjgsBiW4BvhWk/3qoKwQFjIDVN19PfX8F2D/r9PCMTtLWjYVCFrpeYUzsw=="], "browser-split": ["browser-split@0.0.1", "", {}, "sha512-JhvgRb2ihQhsljNda3BI8/UcRHVzrVwo3Q+P8vDtSiyobXuFpuZ9mq+MbRGMnC22CjW3RrfXdg6j6ITX8M+7Ow=="], - "buffer-crc32": ["buffer-crc32@0.2.13", "", {}, "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ=="], - "bytes": ["bytes@3.1.2", "", {}, "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg=="], "call-bind-apply-helpers": ["call-bind-apply-helpers@1.0.2", "", { "dependencies": { "es-errors": "^1.3.0", "function-bind": "^1.1.2" } }, "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ=="], @@ -220,12 +187,6 @@ "camelize": ["camelize@1.0.1", "", {}, "sha512-dU+Tx2fsypxTgtLoE36npi3UqcjSSMNYfkqgmoEhtZrraP5VWq0K7FkWVTYa8eMPtnU/G2txVsfdCJTn9uzpuQ=="], - "chromium-bidi": ["chromium-bidi@14.0.0", "", { "dependencies": { "mitt": "^3.0.1", "zod": "^3.24.1" }, "peerDependencies": { "devtools-protocol": "*" } }, "sha512-9gYlLtS6tStdRWzrtXaTMnqcM4dudNegMXJxkR0I/CXObHalYeYcAMPrL19eroNZHtJ8DQmu1E+ZNOYu/IXMXw=="], - - "cliui": ["cliui@8.0.1", "", { "dependencies": { "string-width": "^4.2.0", "strip-ansi": "^6.0.1", "wrap-ansi": "^7.0.0" } }, "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ=="], - - "color-convert": ["color-convert@2.0.1", "", { "dependencies": { "color-name": "~1.1.4" } }, "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ=="], - "color-name": ["color-name@1.1.4", "", {}, "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="], "content-disposition": ["content-disposition@1.1.0", "", {}, "sha512-5jRCH9Z/+DRP7rkvY83B+yGIGX96OYdJmzngqnw2SBSxqCFPd0w2km3s5iawpGX8krnwSGmF0FW5Nhr0Hfai3g=="], @@ -242,24 +203,18 @@ "cross-spawn": ["cross-spawn@7.0.6", "", { "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", "which": "^2.0.1" } }, "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA=="], - "data-uri-to-buffer": ["data-uri-to-buffer@6.0.2", "", {}, "sha512-7hvf7/GW8e86rW0ptuwS3OcBGDjIi6SZva7hCyWC0yYry2cOPmLIjXAUHI6DK2HsnwJd9ifmt57i8eV2n4YNpw=="], - "debug": ["debug@4.4.3", "", { "dependencies": { "ms": "^2.1.3" } }, "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA=="], "define-data-property": ["define-data-property@1.1.4", "", { "dependencies": { "es-define-property": "^1.0.0", "es-errors": "^1.3.0", "gopd": "^1.0.1" } }, "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A=="], "define-properties": ["define-properties@1.2.1", "", { "dependencies": { "define-data-property": "^1.0.1", "has-property-descriptors": "^1.0.0", "object-keys": "^1.1.1" } }, "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg=="], - "degenerator": ["degenerator@5.0.1", "", { "dependencies": { "ast-types": "^0.13.4", "escodegen": "^2.1.0", "esprima": "^4.0.1" } }, "sha512-TllpMR/t0M5sqCXfj85i4XaAzxmS5tVA16dqvdkMwGmzI+dXLXnw3J+3Vdv7VKw+ThlTMboK6i9rnZ6Nntj5CQ=="], - "depd": ["depd@2.0.0", "", {}, "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw=="], "detect-libc": ["detect-libc@2.1.2", "", {}, "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ=="], "detect-node": ["detect-node@2.1.0", "", {}, "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g=="], - "devtools-protocol": ["devtools-protocol@0.0.1581282", "", {}, "sha512-nv7iKtNZQshSW2hKzYNr46nM/Cfh5SEvE2oV0/SEGgc9XupIY5ggf84Cz8eJIkBce7S3bmTAauFD6aysMpnqsQ=="], - "diff": ["diff@9.0.0", "", {}, "sha512-svtcdpS8CgJyqAjEQIXdb3OjhFVVYjzGAPO8WGCmRbrml64SPw/jJD4GoE98aR7r25A0XcgrK3F02yw9R/vhQw=="], "dom-serializer": ["dom-serializer@0.2.2", "", { "dependencies": { "domelementtype": "^2.0.1", "entities": "^2.0.0" } }, "sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g=="], @@ -276,12 +231,8 @@ "ee-first": ["ee-first@1.1.1", "", {}, "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow=="], - "emoji-regex": ["emoji-regex@8.0.0", "", {}, "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="], - "encodeurl": ["encodeurl@2.0.0", "", {}, "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg=="], - "end-of-stream": ["end-of-stream@1.4.5", "", { "dependencies": { "once": "^1.4.0" } }, "sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg=="], - "ent": ["ent@2.2.2", "", { "dependencies": { "call-bound": "^1.0.3", "es-errors": "^1.3.0", "punycode": "^1.4.1", "safe-regex-test": "^1.1.0" } }, "sha512-kKvD1tO6BM+oK9HzCPpUdRb4vKFQY/FPTFmurMvh6LlN68VMrdj77w8yp51/kDbpkFOS9J8w5W6zIzgM2H8/hw=="], "entities": ["entities@1.1.2", "", {}, "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w=="], @@ -296,26 +247,14 @@ "es6-error": ["es6-error@4.1.1", "", {}, "sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg=="], - "escalade": ["escalade@3.2.0", "", {}, "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA=="], - "escape-html": ["escape-html@1.0.3", "", {}, "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow=="], "escape-string-regexp": ["escape-string-regexp@4.0.0", "", {}, "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA=="], - "escodegen": ["escodegen@2.1.0", "", { "dependencies": { "esprima": "^4.0.1", "estraverse": "^5.2.0", "esutils": "^2.0.2" }, "optionalDependencies": { "source-map": "~0.6.1" }, "bin": { "esgenerate": "bin/esgenerate.js", "escodegen": "bin/escodegen.js" } }, "sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w=="], - - "esprima": ["esprima@4.0.1", "", { "bin": { "esparse": "./bin/esparse.js", "esvalidate": "./bin/esvalidate.js" } }, "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A=="], - - "estraverse": ["estraverse@5.3.0", "", {}, "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA=="], - - "esutils": ["esutils@2.0.3", "", {}, "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g=="], - "etag": ["etag@1.8.1", "", {}, "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg=="], "ev-store": ["ev-store@7.0.0", "", { "dependencies": { "individual": "^3.0.0" } }, "sha512-otazchNRnGzp2YarBJ+GXKVGvhxVATB1zmaStxJBYet0Dyq7A9VhH8IUEB/gRcL6Ch52lfpgPTRJ2m49epyMsQ=="], - "events-universal": ["events-universal@1.0.1", "", { "dependencies": { "bare-events": "^2.7.0" } }, "sha512-LUd5euvbMLpwOF8m6ivPCbhQeSiYVNb8Vs0fQ8QjXo0JTkEHpz8pxdQf0gStltaPpw0Cca8b39KxvK9cfKRiAw=="], - "eventsource": ["eventsource@3.0.7", "", { "dependencies": { "eventsource-parser": "^3.0.1" } }, "sha512-CRT1WTyuQoD771GW56XEZFQ/ZoSfWid1alKGDYMmkt2yl8UXrVR4pspqWNEcqKvVIzg6PAltWjxcSSPrboA4iA=="], "eventsource-parser": ["eventsource-parser@3.0.8", "", {}, "sha512-70QWGkr4snxr0OXLRWsFLeRBIRPuQOvt4s8QYjmUlmlkyTZkRqS7EDVRZtzU3TiyDbXSzaOeF0XUKy8PchzukQ=="], @@ -324,16 +263,10 @@ "express-rate-limit": ["express-rate-limit@8.3.2", "", { "dependencies": { "ip-address": "10.1.0" }, "peerDependencies": { "express": ">= 4.11" } }, "sha512-77VmFeJkO0/rvimEDuUC5H30oqUC4EyOhyGccfqoLebB0oiEYfM7nwPrsDsBL1gsTpwfzX8SFy2MT3TDyRq+bg=="], - "extract-zip": ["extract-zip@2.0.1", "", { "dependencies": { "debug": "^4.1.1", "get-stream": "^5.1.0", "yauzl": "^2.10.0" }, "optionalDependencies": { "@types/yauzl": "^2.9.1" }, "bin": { "extract-zip": "cli.js" } }, "sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg=="], - "fast-deep-equal": ["fast-deep-equal@3.1.3", "", {}, "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q=="], - "fast-fifo": ["fast-fifo@1.3.2", "", {}, "sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ=="], - "fast-uri": ["fast-uri@3.1.0", "", {}, "sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA=="], - "fd-slicer": ["fd-slicer@1.1.0", "", { "dependencies": { "pend": "~1.2.0" } }, "sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g=="], - "finalhandler": ["finalhandler@2.1.1", "", { "dependencies": { "debug": "^4.4.0", "encodeurl": "^2.0.0", "escape-html": "^1.0.3", "on-finished": "^2.4.1", "parseurl": "^1.3.3", "statuses": "^2.0.1" } }, "sha512-S8KoZgRZN+a5rNwqTxlZZePjT/4cnm0ROV70LedRHZ0p8u9fRID0hJUZQpkKLzro8LfmC8sx23bY6tVNxv8pQA=="], "flatbuffers": ["flatbuffers@25.9.23", "", {}, "sha512-MI1qs7Lo4Syw0EOzUl0xjs2lsoeqFku44KpngfIduHBYvzm8h2+7K8YMQh1JtVVVrUvhLpNwqVi4DERegUJhPQ=="], @@ -346,16 +279,10 @@ "function-bind": ["function-bind@1.1.2", "", {}, "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA=="], - "get-caller-file": ["get-caller-file@2.0.5", "", {}, "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg=="], - "get-intrinsic": ["get-intrinsic@1.3.0", "", { "dependencies": { "call-bind-apply-helpers": "^1.0.2", "es-define-property": "^1.0.1", "es-errors": "^1.3.0", "es-object-atoms": "^1.1.1", "function-bind": "^1.1.2", "get-proto": "^1.0.1", "gopd": "^1.2.0", "has-symbols": "^1.1.0", "hasown": "^2.0.2", "math-intrinsics": "^1.1.0" } }, "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ=="], "get-proto": ["get-proto@1.0.1", "", { "dependencies": { "dunder-proto": "^1.0.1", "es-object-atoms": "^1.0.0" } }, "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g=="], - "get-stream": ["get-stream@5.2.0", "", { "dependencies": { "pump": "^3.0.0" } }, "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA=="], - - "get-uri": ["get-uri@6.0.5", "", { "dependencies": { "basic-ftp": "^5.0.2", "data-uri-to-buffer": "^6.0.2", "debug": "^4.3.4" } }, "sha512-b1O07XYq8eRuVzBNgJLstU6FYc1tS6wnMtF1I1D9lE8LxZSOGZ7LhxN54yPP6mGw5f2CkXY2BQUL9Fx41qvcIg=="], - "global": ["global@4.4.0", "", { "dependencies": { "min-document": "^2.19.0", "process": "^0.11.10" } }, "sha512-wv/LAoHdRE3BeTGz53FAamhGlPLhlssK45usmGFThIi4XqnBmjKQ16u+RNbP7WvigRZDxUsM0J3gcQ5yicaL0w=="], "global-agent": ["global-agent@3.0.0", "", { "dependencies": { "boolean": "^3.0.1", "es6-error": "^4.1.1", "matcher": "^3.0.0", "roarr": "^2.15.3", "semver": "^7.3.2", "serialize-error": "^7.0.1" } }, "sha512-PT6XReJ+D07JvGoxQMkT6qji/jVNfX/h364XHZOWeRzy64sSFr+xJ5OX7LI3b4MPQzdL4H8Y8M0xzPpsVMwA8Q=="], @@ -386,10 +313,6 @@ "http-errors": ["http-errors@2.0.1", "", { "dependencies": { "depd": "~2.0.0", "inherits": "~2.0.4", "setprototypeof": "~1.2.0", "statuses": "~2.0.2", "toidentifier": "~1.0.1" } }, "sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ=="], - "http-proxy-agent": ["http-proxy-agent@7.0.2", "", { "dependencies": { "agent-base": "^7.1.0", "debug": "^4.3.4" } }, "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig=="], - - "https-proxy-agent": ["https-proxy-agent@7.0.6", "", { "dependencies": { "agent-base": "^7.1.2", "debug": "4" } }, "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw=="], - "iconv-lite": ["iconv-lite@0.7.2", "", { "dependencies": { "safer-buffer": ">= 2.1.2 < 3.0.0" } }, "sha512-im9DjEDQ55s9fL4EYzOAv0yMqmMBSZp6G0VvFyTMPKWxiSBHUj9NW/qqLmXUwXrrM7AvqSlTCfvqRb0cM8yYqw=="], "image-size": ["image-size@1.2.1", "", { "dependencies": { "queue": "6.0.2" }, "bin": { "image-size": "bin/image-size.js" } }, "sha512-rH+46sQJ2dlwfjfhCyNx5thzrv+dtmBIhPHk0zgRUukHzZ/kRueTJXoYYsclBaKcSMBWuGbOFXtioLpzTb5euw=="], @@ -406,8 +329,6 @@ "ipaddr.js": ["ipaddr.js@1.9.1", "", {}, "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g=="], - "is-fullwidth-code-point": ["is-fullwidth-code-point@3.0.0", "", {}, "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg=="], - "is-object": ["is-object@1.0.2", "", {}, "sha512-2rRIahhZr2UWb45fIOuvZGpFtz0TyOZLf32KxBbSoUCeZR495zCKlWUKKUByk3geS2eAs7ZAABt0Y/Rx0GiQGA=="], "is-promise": ["is-promise@4.0.0", "", {}, "sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ=="], @@ -436,8 +357,6 @@ "long": ["long@5.3.2", "", {}, "sha512-mNAgZ1GmyNhD7AuqnTG3/VQ26o760+ZYBPKjPvugO8+nLbYfX6TVpJPseBvopbdY+qpZ/lKUnmEc1LeZYS3QAA=="], - "lru-cache": ["lru-cache@7.18.3", "", {}, "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA=="], - "marked": ["marked@18.0.2", "", { "bin": { "marked": "bin/marked.js" } }, "sha512-NsmlUYBS/Zg57rgDWMYdnre6OTj4e+qq/JS2ot3KrYLSoHLw+sDu0Nm1ZGpRgYAq6c+b1ekaY5NzVchMCQnzcg=="], "matcher": ["matcher@3.0.0", "", { "dependencies": { "escape-string-regexp": "^4.0.0" } }, "sha512-OkeDaAZ/bQCxeFAozM55PKcKU0yJMPGifLwV4Qgjitu+5MoAfSQN4lsLJeXZ1b8w0x+/Emda6MZgXS1jvsapng=="], @@ -454,16 +373,12 @@ "min-document": ["min-document@2.19.2", "", { "dependencies": { "dom-walk": "^0.1.0" } }, "sha512-8S5I8db/uZN8r9HSLFVWPdJCvYOejMcEC82VIzNUc6Zkklf/d1gg2psfE79/vyhWOj4+J8MtwmoOz3TmvaGu5A=="], - "mitt": ["mitt@3.0.1", "", {}, "sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw=="], - "ms": ["ms@2.1.3", "", {}, "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="], "nanoid": ["nanoid@3.3.12", "", { "bin": { "nanoid": "bin/nanoid.cjs" } }, "sha512-ZB9RH/39qpq5Vu6Y+NmUaFhQR6pp+M2Xt76XBnEwDaGcVAqhlvxrl3B2bKS5D3NH3QR76v3aSrKaF/Kiy7lEtQ=="], "negotiator": ["negotiator@1.0.0", "", {}, "sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg=="], - "netmask": ["netmask@2.0.2", "", {}, "sha512-dBpDMdxv9Irdq66304OLfEmQ9tbNRFnFTuZiLo+bD+r332bBmMJ8GBLXklIXXgxd3+v9+KUnZaUR5PJMa75Gsg=="], - "next-tick": ["next-tick@0.2.2", "", {}, "sha512-f7h4svPtl+QidoBv4taKXUjJ70G2asaZ8G28nS0OkqaalX8dwwrtWtyxEDPK62AC00ur/+/E0pUwBwY5EPn15Q=="], "node-fetch": ["node-fetch@2.7.0", "", { "dependencies": { "whatwg-url": "^5.0.0" }, "peerDependencies": { "encoding": "^0.1.0" }, "optionalPeers": ["encoding"] }, "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A=="], @@ -484,10 +399,6 @@ "onnxruntime-web": ["onnxruntime-web@1.26.0-dev.20260410-5e55544225", "", { "dependencies": { "flatbuffers": "^25.1.24", "guid-typescript": "^1.0.9", "long": "^5.2.3", "onnxruntime-common": "1.24.0-dev.20251116-b39e144322", "platform": "^1.3.6", "protobufjs": "^7.2.4" } }, "sha512-hHd9n8DzIfGSAjM4Dvslesc8i6h9HEEcl8qt7X3LfhUxMgls6FBJ32j2xrDtJjKJFEehFeJmyB/pvad1I8KS8w=="], - "pac-proxy-agent": ["pac-proxy-agent@7.2.0", "", { "dependencies": { "@tootallnate/quickjs-emscripten": "^0.23.0", "agent-base": "^7.1.2", "debug": "^4.3.4", "get-uri": "^6.0.1", "http-proxy-agent": "^7.0.0", "https-proxy-agent": "^7.0.6", "pac-resolver": "^7.0.1", "socks-proxy-agent": "^8.0.5" } }, "sha512-TEB8ESquiLMc0lV8vcd5Ql/JAKAoyzHFXaStwjkzpOpC5Yv+pIzLfHvjTSdf3vpa2bMiUQrg9i6276yn8666aA=="], - - "pac-resolver": ["pac-resolver@7.0.1", "", { "dependencies": { "degenerator": "^5.0.0", "netmask": "^2.0.2" } }, "sha512-5NPgf87AT2STgwa2ntRMr45jTKrYBGkVU36yT0ig/n/GMAa3oPqhZfIQ2kMEimReg0+t9kZViDVZ83qfVUlckg=="], - "pako": ["pako@1.0.11", "", {}, "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw=="], "parseurl": ["parseurl@1.3.3", "", {}, "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ=="], @@ -496,8 +407,6 @@ "path-to-regexp": ["path-to-regexp@8.4.2", "", {}, "sha512-qRcuIdP69NPm4qbACK+aDogI5CBDMi1jKe0ry5rSQJz8JVLsC7jV8XpiJjGRLLol3N+R5ihGYcrPLTno6pAdBA=="], - "pend": ["pend@1.2.0", "", {}, "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg=="], - "pkce-challenge": ["pkce-challenge@5.0.1", "", {}, "sha512-wQ0b/W4Fr01qtpHlqSqspcj3EhBvimsdh0KlHhH8HRZnMsEa0ea2fTULOXOS9ccQr3om+GcGRk4e+isrZWV8qQ=="], "platform": ["platform@1.3.6", "", {}, "sha512-fnWVljUchTro6RiCFvCXBbNhJc2NijN7oIQxbwsyL0buWJPG85v81ehlHI9fXrJsMNgTofEoWIQeClKpgxFLrg=="], @@ -510,22 +419,12 @@ "process-nextick-args": ["process-nextick-args@2.0.1", "", {}, "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag=="], - "progress": ["progress@2.0.3", "", {}, "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA=="], - "protobufjs": ["protobufjs@7.5.5", "", { "dependencies": { "@protobufjs/aspromise": "^1.1.2", "@protobufjs/base64": "^1.1.2", "@protobufjs/codegen": "^2.0.4", "@protobufjs/eventemitter": "^1.1.0", "@protobufjs/fetch": "^1.1.0", "@protobufjs/float": "^1.0.2", "@protobufjs/inquire": "^1.1.0", "@protobufjs/path": "^1.1.2", "@protobufjs/pool": "^1.1.0", "@protobufjs/utf8": "^1.1.0", "@types/node": ">=13.7.0", "long": "^5.0.0" } }, "sha512-3wY1AxV+VBNW8Yypfd1yQY9pXnqTAN+KwQxL8iYm3/BjKYMNg4i0owhEe26PWDOMaIrzeeF98Lqd5NGz4omiIg=="], "proxy-addr": ["proxy-addr@2.0.7", "", { "dependencies": { "forwarded": "0.2.0", "ipaddr.js": "1.9.1" } }, "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg=="], - "proxy-agent": ["proxy-agent@6.5.0", "", { "dependencies": { "agent-base": "^7.1.2", "debug": "^4.3.4", "http-proxy-agent": "^7.0.1", "https-proxy-agent": "^7.0.6", "lru-cache": "^7.14.1", "pac-proxy-agent": "^7.1.0", "proxy-from-env": "^1.1.0", "socks-proxy-agent": "^8.0.5" } }, "sha512-TmatMXdr2KlRiA2CyDu8GqR8EjahTG3aY3nXjdzFyoZbmB8hrBsTyMezhULIXKnC0jpfjlmiZ3+EaCzoInSu/A=="], - - "proxy-from-env": ["proxy-from-env@1.1.0", "", {}, "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg=="], - - "pump": ["pump@3.0.4", "", { "dependencies": { "end-of-stream": "^1.1.0", "once": "^1.3.1" } }, "sha512-VS7sjc6KR7e1ukRFhQSY5LM2uBWAUPiOPa/A3mkKmiMwSmRFUITt0xuj+/lesgnCv+dPIEYlkzrcyXgquIHMcA=="], - "punycode": ["punycode@1.4.1", "", {}, "sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ=="], - "puppeteer-core": ["puppeteer-core@24.40.0", "", { "dependencies": { "@puppeteer/browsers": "2.13.0", "chromium-bidi": "14.0.0", "debug": "^4.4.3", "devtools-protocol": "0.0.1581282", "typed-query-selector": "^2.12.1", "webdriver-bidi-protocol": "0.4.1", "ws": "^8.19.0" } }, "sha512-MWL3XbUCfVgGR0gRsidzT6oKJT2QydPLhMITU6HoVWiiv4gkb6gJi3pcdAa8q4HwjBTbqISOWVP4aJiiyUJvag=="], - "qs": ["qs@6.15.1", "", { "dependencies": { "side-channel": "^1.1.0" } }, "sha512-6YHEFRL9mfgcAvql/XhwTvf5jKcOiiupt2FiJxHkiX1z4j7WL8J/jRHYLluORvc1XxB5rV20KoeK00gVJamspg=="], "queue": ["queue@6.0.2", "", { "dependencies": { "inherits": "~2.0.3" } }, "sha512-iHZWu+q3IdFZFX36ro/lKBkSvfkztY5Y7HMiPlOUjhupPcG2JMfst2KKEpu5XndviX/3UhFbRngUPNKtgvtZiA=="], @@ -536,8 +435,6 @@ "readable-stream": ["readable-stream@2.3.8", "", { "dependencies": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", "isarray": "~1.0.0", "process-nextick-args": "~2.0.0", "safe-buffer": "~5.1.1", "string_decoder": "~1.1.1", "util-deprecate": "~1.0.1" } }, "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA=="], - "require-directory": ["require-directory@2.1.1", "", {}, "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q=="], - "require-from-string": ["require-from-string@2.0.2", "", {}, "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw=="], "roarr": ["roarr@2.15.4", "", { "dependencies": { "boolean": "^3.0.1", "detect-node": "^2.0.4", "globalthis": "^1.0.1", "json-stringify-safe": "^5.0.1", "semver-compare": "^1.0.0", "sprintf-js": "^1.1.2" } }, "sha512-CHhPh+UNHD2GTXNYhPWLnU8ONHdI+5DI+4EYIAOaiD63rHeYlZvyh8P+in5999TTSFgUYuKUAjzRI4mdh/p+2A=="], @@ -582,32 +479,14 @@ "socks": ["socks@2.8.8", "", { "dependencies": { "ip-address": "^10.1.1", "smart-buffer": "^4.2.0" } }, "sha512-NlGELfPrgX2f1TAAcz0WawlLn+0r3FyhhCRpFFK2CemXenPYvzMWWZINv3eDNo9ucdwme7oCHRY0Jnbs4aIkog=="], - "socks-proxy-agent": ["socks-proxy-agent@8.0.5", "", { "dependencies": { "agent-base": "^7.1.2", "debug": "^4.3.4", "socks": "^2.8.3" } }, "sha512-HehCEsotFqbPW9sJ8WVYB6UbmIMv7kUUORIF2Nncq4VQvBfNBLibW9YZR5dlYCSUhwcD628pRllm7n+E+YTzJw=="], - - "source-map": ["source-map@0.6.1", "", {}, "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="], - "sprintf-js": ["sprintf-js@1.1.3", "", {}, "sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA=="], "statuses": ["statuses@2.0.2", "", {}, "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw=="], - "streamx": ["streamx@2.25.0", "", { "dependencies": { "events-universal": "^1.0.0", "fast-fifo": "^1.3.2", "text-decoder": "^1.1.0" } }, "sha512-0nQuG6jf1w+wddNEEXCF4nTg3LtufWINB5eFEN+5TNZW7KWJp6x87+JFL43vaAUPyCfH1wID+mNVyW6OHtFamg=="], - "string-template": ["string-template@0.2.1", "", {}, "sha512-Yptehjogou2xm4UJbxJ4CxgZx12HBfeystp0y3x7s4Dj32ltVVG1Gg8YhKjHZkHicuKpZX/ffilA8505VbUbpw=="], - "string-width": ["string-width@4.2.3", "", { "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" } }, "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g=="], - "string_decoder": ["string_decoder@1.1.1", "", { "dependencies": { "safe-buffer": "~5.1.0" } }, "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg=="], - "strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], - - "tar-fs": ["tar-fs@3.1.2", "", { "dependencies": { "pump": "^3.0.0", "tar-stream": "^3.1.5" }, "optionalDependencies": { "bare-fs": "^4.0.1", "bare-path": "^3.0.0" } }, "sha512-QGxxTxxyleAdyM3kpFs14ymbYmNFrfY+pHj7Z8FgtbZ7w2//VAgLMac7sT6nRpIHjppXO2AwwEOg0bPFVRcmXw=="], - - "tar-stream": ["tar-stream@3.1.8", "", { "dependencies": { "b4a": "^1.6.4", "bare-fs": "^4.5.5", "fast-fifo": "^1.2.0", "streamx": "^2.15.0" } }, "sha512-U6QpVRyCGHva435KoNWy9PRoi2IFYCgtEhq9nmrPPpbRacPs9IH4aJ3gbrFC8dPcXvdSZ4XXfXT5Fshbp2MtlQ=="], - - "teex": ["teex@1.0.1", "", { "dependencies": { "streamx": "^2.12.5" } }, "sha512-eYE6iEI62Ni1H8oIa7KlDU6uQBtqr4Eajni3wX7rpfXD8ysFx8z0+dri+KWEPWpBsxXfxu58x/0jvTVT1ekOSg=="], - - "text-decoder": ["text-decoder@1.2.7", "", { "dependencies": { "b4a": "^1.6.4" } }, "sha512-vlLytXkeP4xvEq2otHeJfSQIRyWxo/oZGEbXrtEEF9Hnmrdly59sUbzZ/QgyWuLYHctCHxFF4tRQZNQ9k60ExQ=="], - "toidentifier": ["toidentifier@1.0.1", "", {}, "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA=="], "tr46": ["tr46@0.0.3", "", {}, "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw=="], @@ -620,8 +499,6 @@ "type-is": ["type-is@2.0.1", "", { "dependencies": { "content-type": "^1.0.5", "media-typer": "^1.1.0", "mime-types": "^3.0.0" } }, "sha512-OZs6gsjF4vMp32qrCbiVSkrFmXtG/AZhY3t0iAMrMBiAZyV9oALtXO8hsrHbMXF9x6L3grlFuwW2oAz7cav+Gw=="], - "typed-query-selector": ["typed-query-selector@2.12.1", "", {}, "sha512-uzR+FzI8qrUEIu96oaeBJmd9E7CFEiQ3goA5qCVgc4s5llSubcfGHq9yUstZx/k4s9dXHVKsE35YWoFyvEqEHA=="], - "undici-types": ["undici-types@7.18.2", "", {}, "sha512-AsuCzffGHJybSaRrmr5eHr81mwJU3kjw6M+uprWvCXiNeN9SOGwQ3Jn8jb8m3Z6izVgknn1R0FTCEAP2QrLY/w=="], "unpipe": ["unpipe@1.0.0", "", {}, "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ=="], @@ -632,20 +509,14 @@ "virtual-dom": ["virtual-dom@2.1.1", "", { "dependencies": { "browser-split": "0.0.1", "error": "^4.3.0", "ev-store": "^7.0.0", "global": "^4.3.0", "is-object": "^1.0.1", "next-tick": "^0.2.2", "x-is-array": "0.1.0", "x-is-string": "0.1.0" } }, "sha512-wb6Qc9Lbqug0kRqo/iuApfBpJJAq14Sk1faAnSmtqXiwahg7PVTvWMs9L02Z8nNIMqbwsxzBAA90bbtRLbw0zg=="], - "webdriver-bidi-protocol": ["webdriver-bidi-protocol@0.4.1", "", {}, "sha512-ARrjNjtWRRs2w4Tk7nqrf2gBI0QXWuOmMCx2hU+1jUt6d00MjMxURrhxhGbrsoiZKJrhTSTzbIrc554iKI10qw=="], - "webidl-conversions": ["webidl-conversions@3.0.1", "", {}, "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ=="], "whatwg-url": ["whatwg-url@5.0.0", "", { "dependencies": { "tr46": "~0.0.3", "webidl-conversions": "^3.0.0" } }, "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw=="], "which": ["which@2.0.2", "", { "dependencies": { "isexe": "^2.0.0" }, "bin": { "node-which": "./bin/node-which" } }, "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA=="], - "wrap-ansi": ["wrap-ansi@7.0.0", "", { "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", "strip-ansi": "^6.0.0" } }, "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q=="], - "wrappy": ["wrappy@1.0.2", "", {}, "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ=="], - "ws": ["ws@8.20.0", "", { "peerDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": ">=5.0.2" }, "optionalPeers": ["bufferutil", "utf-8-validate"] }, "sha512-sAt8BhgNbzCtgGbt2OxmpuryO63ZoDk/sqaB/znQm94T4fCEsy/yV+7CdC1kJhOU9lboAEU7R3kquuycDoibVA=="], - "x-is-array": ["x-is-array@0.1.0", "", {}, "sha512-goHPif61oNrr0jJgsXRfc8oqtYzvfiMJpTqwE7Z4y9uH+T3UozkGqQ4d2nX9mB9khvA8U2o/UbPOFjgC7hLWIA=="], "x-is-string": ["x-is-string@0.1.0", "", {}, "sha512-GojqklwG8gpzOVEVki5KudKNoq7MbbjYZCbyWzEz7tyPA7eleiE0+ePwOWQQRb5fm86rD3S8Tc0tSFf3AOv50w=="], @@ -658,14 +529,6 @@ "xterm-addon-fit": ["xterm-addon-fit@0.8.0", "", { "peerDependencies": { "xterm": "^5.0.0" } }, "sha512-yj3Np7XlvxxhYF/EJ7p3KHaMt6OdwQ+HDu573Vx1lRXsVxOcnVJs51RgjZOouIZOczTsskaS+CpXspK81/DLqw=="], - "y18n": ["y18n@5.0.8", "", {}, "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA=="], - - "yargs": ["yargs@17.7.2", "", { "dependencies": { "cliui": "^8.0.1", "escalade": "^3.1.1", "get-caller-file": "^2.0.5", "require-directory": "^2.1.1", "string-width": "^4.2.3", "y18n": "^5.0.5", "yargs-parser": "^21.1.1" } }, "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w=="], - - "yargs-parser": ["yargs-parser@21.1.1", "", {}, "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw=="], - - "yauzl": ["yauzl@2.10.0", "", { "dependencies": { "buffer-crc32": "~0.2.3", "fd-slicer": "~1.1.0" } }, "sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g=="], - "zod": ["zod@3.25.76", "", {}, "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ=="], "zod-to-json-schema": ["zod-to-json-schema@3.25.2", "", { "peerDependencies": { "zod": "^3.25.28 || ^4" } }, "sha512-O/PgfnpT1xKSDeQYSCfRI5Gy3hPf91mKVDuYLUHZJMiDFptvP41MSnWofm8dnCm0256ZNfZIM7DSzuSMAFnjHA=="], @@ -694,8 +557,6 @@ "send/mime-types": ["mime-types@3.0.2", "", { "dependencies": { "mime-db": "^1.54.0" } }, "sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A=="], - "socks-proxy-agent/socks": ["socks@2.8.7", "", { "dependencies": { "ip-address": "^10.0.1", "smart-buffer": "^4.2.0" } }, "sha512-HLpt+uLy/pxB+bum/9DzAgiKS8CX1EvbWxI4zlmgGCExImLdiad2iCwXT5Z4c9c3Eq8rP2318mPW2c+QbtjK8A=="], - "type-is/mime-types": ["mime-types@3.0.2", "", { "dependencies": { "mime-db": "^1.54.0" } }, "sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A=="], "xmlbuilder2/@oozcitak/dom": ["@oozcitak/dom@1.15.5", "", { "dependencies": { "@oozcitak/infra": "1.0.5", "@oozcitak/url": "1.0.0", "@oozcitak/util": "8.0.0" } }, "sha512-L6v3Mwb0TaYBYgeYlIeBaHnc+2ZEaDSbFiRm5KmqZQSoBlbPlf+l6aIH/sD5GUf2MYwULw00LT7+dOnEuAEC0A=="], @@ -710,8 +571,6 @@ "send/mime-types/mime-db": ["mime-db@1.54.0", "", {}, "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ=="], - "socks-proxy-agent/socks/ip-address": ["ip-address@10.1.0", "", {}, "sha512-XXADHxXmvT9+CRxhXg56LJovE+bmWnEWB78LB83VZTprKTmaC5QfruXocxzTZ2Kl0DNwKuBdlIhjL8LeY8Sf8Q=="], - "type-is/mime-types/mime-db": ["mime-db@1.54.0", "", {}, "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ=="], "xmlbuilder2/@oozcitak/dom/@oozcitak/util": ["@oozcitak/util@8.0.0", "", {}, "sha512-+9Hq6yuoq/3TRV/n/xcpydGBq2qN2/DEDMqNTG7rm95K6ZE2/YY/sPyx62+1n8QsE9O26e5M1URlXsk+AnN9Jw=="], diff --git a/docs/gstack-2/ARCHITECTURE.md b/docs/gstack-2/ARCHITECTURE.md index 4e83c7c77..94c2177ee 100644 --- a/docs/gstack-2/ARCHITECTURE.md +++ b/docs/gstack-2/ARCHITECTURE.md @@ -213,13 +213,13 @@ backend. The candidate distinguishes hardware UDID from CoreDevice UUID, returns bounded 504 responses for a suspended app, asserts the expected bundle around coordinate mutations, preserves typed snapshot/mutation/restoration, and keeps bridge symbols debug-only. Device signing, provisioning, and -CoreDevice compatibility are setup gates, not product failures. A live -signed-device pass is still required before release. The earlier target's -preflight evidence is 9 pass / 0 fail / 1 deploy skip and 29 assertions; its -direct smoke returned `signing_unavailable`. The latest explicitly selected -target returned `device_not_wired` because iOS 16.7.10 exposes no supported -CoreDevice service. Neither attempt installed or launched an app, and no pass -artifact was written. +CoreDevice compatibility are setup gates, not product failures. Earlier +`signing_unavailable`, `device_not_wired`, and partial session-acquire results +remain retained as failures. After explicit re-authorization, the live lane +passed 12/12 harness checks and all five required iterations on a wired paired +`iPhone17,1`, including Release-symbol exclusion, ten screenshots, session +cleanup, tunnel shutdown, and workspace cleanup. The redacted artifact is +[`evidence/ios-physical-device-2026-07-20T17-49-19-302Z.json`](./evidence/ios-physical-device-2026-07-20T17-49-19-302Z.json). PDF rendering and Mermaid/Excalidraw remain internal capabilities. GStack does not add Typst, hosted document rendering, alternate diagram services, local @@ -254,7 +254,7 @@ means the replacement still lacks its required release evidence. | 19 | State identity crosses worktrees | **Implemented:** repo plus stable worktree identity selects state. | Linked-worktree core test passes. | | 20 | Partial ship failures are not reliably idempotent | **Implemented at runtime primitive:** claimed effects become uncertain and are not automatically repeated. | Crash/resume and completed-effect tests pass. End-to-end ship resume remains pending. | | 21 | Parser failures become empty success | **Implemented in iOS device discovery:** parse/tool failures are typed errors. | `tunnel-bootstrap.test.ts` malformed-JSON regression passes in the focused daemon suite. | -| 22 | Setup failures become product failures | **Partly implemented:** iOS discovery/setup categories and runtime doctor return actionable setup state. | Automated categories exist; live signing/build/install/launch/tunnel passed, while session acquisition and the five-check loop remain open and user-waived. | +| 22 | Setup failures become product failures | **Implemented for the tested paths:** iOS discovery/setup categories and runtime doctor return actionable setup state. | Earlier setup failures stayed typed and unpromoted; the separately authorized live lane later passed signing through five iterations and cleanup. | | 23 | Runtime network activity is not obvious | **Implemented for Context runtime:** selection, mode, and consent are explicit; status/doctor report them; zero lookup/fetch before Context selection+consent. | Context contract: 22 pass / 0 fail / 139 assertions, including persisted non-export fallbacks; verified-key official-endpoint live smoke passed. | | 24 | Context restore selects another worktree | **Implemented for canonical state resume:** current repo+worktree project ID scopes inspection/resume. | Linked-worktree identity test passes; compatibility end-to-end restore test pending. | | 25 | Preambles repeat large sections in every skill | **Implemented structurally:** six thin lazy dispatchers share infrastructure and load one preserved module on demand. | Current generated six-name/description catalog is 982 characters, about 246 token-equivalents versus the correctly parsed baseline of about 1,100 (77.6% lower). Re-measure if frontmatter changes. | diff --git a/docs/gstack-2/HOST-COMPATIBILITY.md b/docs/gstack-2/HOST-COMPATIBILITY.md index 06b8e2ac2..13d4b547c 100644 --- a/docs/gstack-2/HOST-COMPATIBILITY.md +++ b/docs/gstack-2/HOST-COMPATIBILITY.md @@ -162,6 +162,14 @@ activates the version, and writes stable POSIX and Windows launchers under Windows and includes the CoreDevice/iOS bundle only on Darwin. Add the bin directory to `PATH` if the short `gstack` command is desired. +Official bundles capture the pinned Bun 1.3.14 executable inside the immutable +runtime and expose it as `$GSTACK_HOME/bin/bun`; browser/design/PDF launchers do +not use host-global Bun. Node remains the bootstrap/launcher floor. On Windows, +Git for Windows Bash is required only for retained shell helpers and is a +separate doctor check. Python 3 is an optional prerequisite only for specialist +flows that name it. Doctor reports both tools independently of native +browser/design/PDF readiness. + Twenty-five focused installer tests pass with 341 assertions. They cover manifests, paths with spaces, source-root symlinks, internal-link/path-escape rejection, failed build/ @@ -181,9 +189,9 @@ nor model weights and reports the L4 capability unavailable. | Platform | Source-level target | Candidate evidence | |---|---|---| -| macOS | Node runtime + local browser + physical iOS where applicable | Runtime installer 25/341 and the deterministic clean macOS arm64 bundle audit pass. The final native job passed 150/0 with 1,189 assertions. The uninterrupted broad singleton run is green at 6,255 pass / 226 expected skips / 0 fail and 25,509 assertions across 384 files. The signed-device gate is open but user-waived; no further device access is authorized. | -| Linux | Node runtime + local browser | Final native Ubuntu passed 150/0 with 1,189 assertions across 16 files. A clean Linux arm64 container also passed the production-only runtime/browser lifecycle. | -| Native Windows | Node runtime; curated free tests; browser fallback where retained | Final native Windows passed 150/0 with 1,145 assertions across 16 files and standard-installer discovery found exactly six skills. The local Windows-safe singleton lane also passed 2,829 / 57 expected skips / 0 fail with 8,648 assertions across all 214 selected files. | +| macOS | Node runtime + local browser + physical iOS where applicable | Runtime installer 25/341 and the deterministic clean macOS arm64 bundle audit pass. The final native job passed 150/0 with 1,189 assertions. The uninterrupted broad singleton run is green at 6,255 pass / 226 expected skips / 0 fail and 25,509 assertions across 384 files. The physical lane later passed 12/12 harness checks and five-of-five live iterations on an explicitly authorized wired paired `iPhone17,1`; this is device-specific evidence, not universal iOS coverage. Artifact: [`ios-physical-device-2026-07-20T17-49-19-302Z.json`](./evidence/ios-physical-device-2026-07-20T17-49-19-302Z.json). | +| Linux | Node runtime + local browser | Official release artifacts currently target glibc on x64 and arm64; musl is rejected before network and is not claimed. Final native Ubuntu passed 150/0 with 1,189 assertions across 16 files. A clean glibc Linux arm64 container also passed the production-only runtime/browser lifecycle. | +| Native Windows | Node bootstrap/launcher; managed Bun; native browser/design/PDF. Git for Windows Bash only for retained shell helpers; Python 3 only for labeled specialist flows. | Doctor verifies and discloses Bun, Bash, and Python separately. Final native Windows passed 150/0 with 1,145 assertions across 16 files and standard-installer discovery found exactly six skills. The local Windows-safe singleton lane also passed 2,829 / 57 expected skips / 0 fail with 8,648 assertions across all 214 selected files. The older run predates the managed-Bun release artifact, so the new six-target release workflow remains the evidence gate for that layer. | | Dev Container | Pure skills and optional runtime; browser only when container supports it | The declared image built; the GStack 2 suite passed 150/0 with 1,188 assertions across 16 files, followed by the clean runtime install/browser smoke and state-preserving uninstall. | Native CI run [`29615621805`](https://github.com/time-attack/gstack/actions/runs/29615621805) diff --git a/docs/gstack-2/IOS-PHYSICAL-DEVICE.md b/docs/gstack-2/IOS-PHYSICAL-DEVICE.md index e6091a3b2..b561e9626 100644 --- a/docs/gstack-2/IOS-PHYSICAL-DEVICE.md +++ b/docs/gstack-2/IOS-PHYSICAL-DEVICE.md @@ -6,8 +6,7 @@ The harness is intentionally fail-closed. A setup problem is not a product failu ## Current validation status -The earlier target was validated locally at the July 17, 2026 checkpoint with -Xcode 26.6: +The live lane was validated locally on July 20, 2026 with Xcode 26.6: | Identifier kind | Example form | Used for | |---|---|---| @@ -16,46 +15,28 @@ Xcode 26.6: Exact local identifiers are deliberately not committed. Successful evidence stores only a SHA-256 fingerprint derived from both identifiers and omits the user-assigned device name. -The daemon suite is green at 95 pass / 0 fail and 229 assertions. For that -earlier target, the physical E2E preflight records 9 pass / 0 fail / 1 deploy -skip and 29 assertions. Its host, pairing/trust, Developer Mode, wired -transport, `devicectl`, `xcodegen`, and DevToolsSecurity gates pass. The -unsigned Release build also passes and contains no DebugBridge module symbols -or artifacts. +The daemon suite is green at 95 pass / 0 fail and 229 assertions. The final +physical lane passed 12/12 harness checks and all five required live iterations +on an explicitly authorized wired, paired `iPhone17,1` with Developer Mode +enabled. The existing Apple development identity signed the reserved fixture; +the harness did not generate or fabricate a profile. The Release guard found no +DebugBridge symbols. Safe in-place install, launch, CoreDevice IPv6 bootstrap, +boot-token rotation, five session acquire/release cycles, ten 1206×2622 PNG +screenshots, accessibility reads, coordinate taps, bundle checks, state +cleanup, tunnel shutdown, and temporary-workspace cleanup all passed. The +fixture was not uninstalled and app data was not deleted. -The earlier direct physical-device smoke was externally blocked at automatic -signing. It returned typed code `signing_unavailable`, category `setup_gate`. The -underlying Xcode diagnostic is: +The redacted atomic evidence is +[`evidence/ios-physical-device-2026-07-20T17-49-19-302Z.json`](./evidence/ios-physical-device-2026-07-20T17-49-19-302Z.json). +It stores only a SHA-256 fingerprint of the local identifiers, plus the device +model and non-secret verification results. -```text -Signing for "FixtureApp" requires a development team. -``` - -That is a setup gate, not a DebugBridge failure. No app was installed or -launched, and no pass artifact was written. The deploy skip and typed smoke -failure must not be represented as a physical-device pass. - -The next user-selected target was a legacy iPhone (`iPhone10,6`) on iOS -16.7.10. Its lockdown/USB pairing validates, but `devicectl` reports -`pairingState=unsupported`, no wired CoreDevice transport, and pairing fails -with CoreDevice error 1011. The harness therefore returns typed code -`device_not_wired` before build or deploy. Because CoreDevice is the locked -backend, substituting a legacy or third-party device driver would not satisfy -this gate; a CoreDevice-compatible iPhone is required. - -The user then explicitly authorized the other connected, CoreDevice-compatible -iPhone. That run passed pairing, signing, build, install, launch, and tunnel -setup. The full five-check loop did not complete: `POST /session/acquire` -closed the socket before returning a session. At harness stop, the fixture app -was left installed with its data intact and no console/device session remained -attached. This is a retained operator observation, not a pass artifact; no pass -artifact was written. - -The user then explicitly stopped and waived further iPhone testing. No more -device access is authorized for this checkpoint. The preflight, Release guard, -typed setup-gate failures, and partial signed deployment above remain valid -evidence, but the waiver does not convert them into a P0 pass: the five-check -loop did not complete and no pass artifact exists. +Earlier attempts remain part of the record and are not relabeled by the later +pass: one target returned `signing_unavailable`; an `iPhone10,6` on iOS 16.7.10 +returned `device_not_wired` / CoreDevice error 1011; and one authorized run +reached tunnel setup before its first session-acquire socket closed. Those were +correctly classified as setup or partial evidence and produced no pass +artifact. ## Hardware UDID versus CoreDevice UUID diff --git a/docs/gstack-2/JUDGMENT-PARITY.md b/docs/gstack-2/JUDGMENT-PARITY.md index 8f7e15086..56d55cbb2 100644 --- a/docs/gstack-2/JUDGMENT-PARITY.md +++ b/docs/gstack-2/JUDGMENT-PARITY.md @@ -2,17 +2,17 @@ Parity is executable, not a prose claim. Run `bun run scripts/gstack2/run-parity.ts` or the dedicated Bun tests. -The pinned release inventory passes **4,681 checks** across 55 specialist sources, 16 carved sections, 25 routing scenarios, 16 regression ports, and **78 assets**. +The pinned release inventory passes **4,697 checks** across 55 specialist sources, 16 carved sections, 25 routing scenarios, 16 regression ports, and **78 assets**. The suite verifies: - exactly six discoverable public skills and 55 internal legacy modules; - 55 canonical templates plus 16 carved section templates at base `bb57306d98c97011b0919c6132705a15b1579781`; -- normalized legacy-body SHA-256 equality between source rendering and generated references; +- immutable full 1.x render hashes plus canonical specialist-render equality, with the excluded onboarding wrapper and lazy section references asserted explicitly; - preservation of nine behavioral contract dimensions per module; - 25 structured non-keyword routing fixtures with active/skipped modules, depth, mutation, and web context; - 16 upstream judgment-port regression fixtures and anchors; - all linked asset copies against their pinned Git blobs; - frontmatter and `agents/openai.yaml` schema for each public skill. -Golden normalization removes only generated provenance wrappers, bug-fix overlays, and irrelevant whitespace. It never removes legacy workflow prose, gates, questions, evidence requirements, artifacts, or exit behavior. +Golden normalization removes only generated provenance wrappers, bug-fix overlays, and irrelevant whitespace. Canonical rendering separately excludes the retired shared onboarding wrapper and packages large specialist phases as lazy references; parity checks both decisions explicitly without claiming full-body byte equality. diff --git a/docs/gstack-2/JUDGMENT-PROVENANCE.json b/docs/gstack-2/JUDGMENT-PROVENANCE.json index cebc6210d..d2999fa5c 100644 --- a/docs/gstack-2/JUDGMENT-PROVENANCE.json +++ b/docs/gstack-2/JUDGMENT-PROVENANCE.json @@ -19,8 +19,8 @@ "scenarios": 25, "bug_fix_ports": 16, "assets": 78, - "dependency_copies": 10, - "runtime_helpers": 51 + "dependency_copies": 4, + "runtime_helpers": 40 }, "sources": [ { @@ -31,7 +31,7 @@ "source_path": "SKILL.md.tmpl", "base_sha": "bb57306d98c97011b0919c6132705a15b1579781", "blob_sha": "402bd0d7b0f2bf02f6c9e4754e0e2a655f5f4057", - "normalized_render_sha256": "8e28cf7aa8c1c858ffaa4936d05a66bd4522bd6c6438be719f569b01c5afbcd8", + "normalized_render_sha256": "daa2b069d1945c1e1bf8eef23417899b4eacb98087f6c146c0b726eb21fd2776", "target": "skills/plan/references/legacy/gstack.md", "disposition": "BUG_FIX", "overlays": [ @@ -46,7 +46,7 @@ "legacy_alias": "catalog" }, "question_sequence": "Preserve the source workflow order; gather prerequisites before consequential questions.", - "follow_up_behavior": "The complete source follow-up sequence is preserved verbatim inside new_location and hash-compared to the pinned base.", + "follow_up_behavior": "Specialist follow-up order is preserved from the pinned source. The retired 1.x shared onboarding wrapper is excluded, and carved specialist phases are package-local lazy references loaded at their original workflow point.", "smart_skip_rules": "Skip only when the source condition is false, and name every skipped module with evidence.", "pushback_rules": "Preserve the source forcing questions, recommendation pressure, and one-question-at-a-time cadence.", "stop_gates": "Preserve every STOP, hard gate, approval boundary, and no-mutation-before-approval rule.", @@ -73,7 +73,7 @@ "voice": "Direct builder voice; match the user language and retain source-specific tone constraints.", "response_posture": "Direct, evidence-first builder language; preserve source-specific recommendations and constructive pressure.", "new_location": "skills/plan/references/legacy/gstack.md", - "parity_test": "evals/parity/contracts/gstack.json + scripts/gstack2/run-parity.ts normalized full-body equality" + "parity_test": "evals/parity/contracts/gstack.json + scripts/gstack2/run-parity.ts canonical specialist render, excluded-wrapper, lazy-section, and pinned-source provenance checks" }, { "source": "office-hours", @@ -83,7 +83,7 @@ "source_path": "office-hours/SKILL.md.tmpl", "base_sha": "bb57306d98c97011b0919c6132705a15b1579781", "blob_sha": "8568fe73cca76a80805fab3092cacd10db7e1d7f", - "normalized_render_sha256": "0f0017a3752dd58d013c11d4d19af956724b6eeea89899f045dc3f41a3aa89b1", + "normalized_render_sha256": "b633a6ef87928ca2434f3a2b1ce88946cbe528a9e3659469e0f9cbbe8a7b146b", "target": "skills/plan/references/legacy/office-hours.md", "disposition": "BUG_FIX", "overlays": [ @@ -99,7 +99,7 @@ "legacy_alias": "product" }, "question_sequence": "Preserve the source workflow order; gather prerequisites before consequential questions.", - "follow_up_behavior": "The complete source follow-up sequence is preserved verbatim inside new_location and hash-compared to the pinned base.", + "follow_up_behavior": "Specialist follow-up order is preserved from the pinned source. The retired 1.x shared onboarding wrapper is excluded, and carved specialist phases are package-local lazy references loaded at their original workflow point.", "smart_skip_rules": "Skip only when the source condition is false, and name every skipped module with evidence.", "pushback_rules": "Preserve the source forcing questions, recommendation pressure, and one-question-at-a-time cadence.", "stop_gates": "Preserve every STOP, hard gate, approval boundary, and no-mutation-before-approval rule.", @@ -187,7 +187,7 @@ "voice": "Direct builder voice; match the user language and retain source-specific tone constraints.", "response_posture": "Direct, evidence-first builder language; preserve source-specific recommendations and constructive pressure.", "new_location": "skills/plan/references/legacy/office-hours.md", - "parity_test": "evals/parity/contracts/office-hours.json + scripts/gstack2/run-parity.ts normalized full-body equality" + "parity_test": "evals/parity/contracts/office-hours.json + scripts/gstack2/run-parity.ts canonical specialist render, excluded-wrapper, lazy-section, and pinned-source provenance checks" }, { "source": "plan-ceo-review", @@ -197,7 +197,7 @@ "source_path": "plan-ceo-review/SKILL.md.tmpl", "base_sha": "bb57306d98c97011b0919c6132705a15b1579781", "blob_sha": "c43cfe64146fe79df74a974f1673fe36defcce00", - "normalized_render_sha256": "eb1199228d8db2107eb7c4cbf889e2116117fcd54e63d5e2b9eceddacbc3bb50", + "normalized_render_sha256": "b2f811568920dfdbd500372df13855041ecb2b8b73e3629f3c71d87c5a78e034", "target": "skills/plan/references/legacy/plan-ceo-review.md", "disposition": "BUG_FIX", "overlays": [ @@ -213,7 +213,7 @@ "legacy_alias": "ceo" }, "question_sequence": "Preserve the source workflow order; gather prerequisites before consequential questions.", - "follow_up_behavior": "The complete source follow-up sequence is preserved verbatim inside new_location and hash-compared to the pinned base.", + "follow_up_behavior": "Specialist follow-up order is preserved from the pinned source. The retired 1.x shared onboarding wrapper is excluded, and carved specialist phases are package-local lazy references loaded at their original workflow point.", "smart_skip_rules": "Skip only when the source condition is false, and name every skipped module with evidence.", "pushback_rules": "Preserve the source forcing questions, recommendation pressure, and one-question-at-a-time cadence.", "stop_gates": "Preserve every STOP, hard gate, approval boundary, and no-mutation-before-approval rule.", @@ -327,7 +327,7 @@ "voice": "Direct builder voice; match the user language and retain source-specific tone constraints.", "response_posture": "Direct, evidence-first builder language; preserve source-specific recommendations and constructive pressure.", "new_location": "skills/plan/references/legacy/plan-ceo-review.md", - "parity_test": "evals/parity/contracts/plan-ceo-review.json + scripts/gstack2/run-parity.ts normalized full-body equality" + "parity_test": "evals/parity/contracts/plan-ceo-review.json + scripts/gstack2/run-parity.ts canonical specialist render, excluded-wrapper, lazy-section, and pinned-source provenance checks" }, { "source": "plan-eng-review", @@ -337,7 +337,7 @@ "source_path": "plan-eng-review/SKILL.md.tmpl", "base_sha": "bb57306d98c97011b0919c6132705a15b1579781", "blob_sha": "1d5be0e6f47f0896ee831b53c56818850b1dcfe4", - "normalized_render_sha256": "02dad060f44bffacc9cbc16532816930dbd0f2aa21466d0e97eaf36250a80833", + "normalized_render_sha256": "ee268f1d24769509b89b7db998372a773d9e7bc376306a68319af4f74c6fe713", "target": "skills/plan/references/legacy/plan-eng-review.md", "disposition": "BUG_FIX", "overlays": [ @@ -354,7 +354,7 @@ "legacy_alias": "eng" }, "question_sequence": "Preserve the source workflow order; gather prerequisites before consequential questions.", - "follow_up_behavior": "The complete source follow-up sequence is preserved verbatim inside new_location and hash-compared to the pinned base.", + "follow_up_behavior": "Specialist follow-up order is preserved from the pinned source. The retired 1.x shared onboarding wrapper is excluded, and carved specialist phases are package-local lazy references loaded at their original workflow point.", "smart_skip_rules": "Skip only when the source condition is false, and name every skipped module with evidence.", "pushback_rules": "Preserve the source forcing questions, recommendation pressure, and one-question-at-a-time cadence.", "stop_gates": "Preserve every STOP, hard gate, approval boundary, and no-mutation-before-approval rule.", @@ -447,7 +447,7 @@ "voice": "Direct builder voice; match the user language and retain source-specific tone constraints.", "response_posture": "Direct, evidence-first builder language; preserve source-specific recommendations and constructive pressure.", "new_location": "skills/plan/references/legacy/plan-eng-review.md", - "parity_test": "evals/parity/contracts/plan-eng-review.json + scripts/gstack2/run-parity.ts normalized full-body equality" + "parity_test": "evals/parity/contracts/plan-eng-review.json + scripts/gstack2/run-parity.ts canonical specialist render, excluded-wrapper, lazy-section, and pinned-source provenance checks" }, { "source": "plan-devex-review", @@ -457,7 +457,7 @@ "source_path": "plan-devex-review/SKILL.md.tmpl", "base_sha": "bb57306d98c97011b0919c6132705a15b1579781", "blob_sha": "1ef723c10997a08ef87940daceb08bf8d60dd810", - "normalized_render_sha256": "5be964b8b6e8ddf87df7b44bb7713e0c31a3de32cf261682793bc7db45c7cba1", + "normalized_render_sha256": "fff989dcab1f37d0c219378caef6b1e627c23c2537a717564be0d8567229bccc", "target": "skills/plan/references/legacy/plan-devex-review.md", "disposition": "BUG_FIX", "overlays": [ @@ -473,7 +473,7 @@ "legacy_alias": "dx" }, "question_sequence": "Preserve the source workflow order; gather prerequisites before consequential questions.", - "follow_up_behavior": "The complete source follow-up sequence is preserved verbatim inside new_location and hash-compared to the pinned base.", + "follow_up_behavior": "Specialist follow-up order is preserved from the pinned source. The retired 1.x shared onboarding wrapper is excluded, and carved specialist phases are package-local lazy references loaded at their original workflow point.", "smart_skip_rules": "Skip only when the source condition is false, and name every skipped module with evidence.", "pushback_rules": "Preserve the source forcing questions, recommendation pressure, and one-question-at-a-time cadence.", "stop_gates": "Preserve every STOP, hard gate, approval boundary, and no-mutation-before-approval rule.", @@ -580,7 +580,7 @@ "voice": "Direct builder voice; match the user language and retain source-specific tone constraints.", "response_posture": "Direct, evidence-first builder language; preserve source-specific recommendations and constructive pressure.", "new_location": "skills/plan/references/legacy/plan-devex-review.md", - "parity_test": "evals/parity/contracts/plan-devex-review.json + scripts/gstack2/run-parity.ts normalized full-body equality" + "parity_test": "evals/parity/contracts/plan-devex-review.json + scripts/gstack2/run-parity.ts canonical specialist render, excluded-wrapper, lazy-section, and pinned-source provenance checks" }, { "source": "autoplan", @@ -590,7 +590,7 @@ "source_path": "autoplan/SKILL.md.tmpl", "base_sha": "bb57306d98c97011b0919c6132705a15b1579781", "blob_sha": "b2eaca9fde8f46001bea9961b8ed651d0f6f9e13", - "normalized_render_sha256": "706dd2fb1b3f3c7e6f446b268bd5a513fc7d2560ca12f702d670907402843a11", + "normalized_render_sha256": "b11bef3e060400cd59a16e41c9b6f8395ace065867a1c2a70329319153a2c4dc", "target": "skills/plan/references/legacy/autoplan.md", "disposition": "BUG_FIX", "overlays": [ @@ -607,7 +607,7 @@ "legacy_alias": "auto" }, "question_sequence": "Preserve the source workflow order; gather prerequisites before consequential questions.", - "follow_up_behavior": "The complete source follow-up sequence is preserved verbatim inside new_location and hash-compared to the pinned base.", + "follow_up_behavior": "Specialist follow-up order is preserved from the pinned source. The retired 1.x shared onboarding wrapper is excluded, and carved specialist phases are package-local lazy references loaded at their original workflow point.", "smart_skip_rules": "Skip only when the source condition is false, and name every skipped module with evidence.", "pushback_rules": "Preserve the source forcing questions, recommendation pressure, and one-question-at-a-time cadence.", "stop_gates": "Preserve every STOP, hard gate, approval boundary, and no-mutation-before-approval rule.", @@ -671,7 +671,7 @@ "voice": "Direct builder voice; match the user language and retain source-specific tone constraints.", "response_posture": "Direct, evidence-first builder language; preserve source-specific recommendations and constructive pressure.", "new_location": "skills/plan/references/legacy/autoplan.md", - "parity_test": "evals/parity/contracts/autoplan.json + scripts/gstack2/run-parity.ts normalized full-body equality" + "parity_test": "evals/parity/contracts/autoplan.json + scripts/gstack2/run-parity.ts canonical specialist render, excluded-wrapper, lazy-section, and pinned-source provenance checks" }, { "source": "spec", @@ -681,7 +681,7 @@ "source_path": "spec/SKILL.md.tmpl", "base_sha": "bb57306d98c97011b0919c6132705a15b1579781", "blob_sha": "6c0c14e1b37e1e56d85427e9c8d080a6df908992", - "normalized_render_sha256": "1693c430139d43e80d2981d95a61dc9d3674435690d5d838f4ca92f4d592694a", + "normalized_render_sha256": "059ec7a95791f6fc559f4e2321d7340ef5ae7e4ba89949df401f74d91411bfd3", "target": "skills/plan/references/legacy/spec.md", "disposition": "BUG_FIX", "overlays": [ @@ -696,7 +696,7 @@ "legacy_alias": "spec" }, "question_sequence": "Preserve the source workflow order; gather prerequisites before consequential questions.", - "follow_up_behavior": "The complete source follow-up sequence is preserved verbatim inside new_location and hash-compared to the pinned base.", + "follow_up_behavior": "Specialist follow-up order is preserved from the pinned source. The retired 1.x shared onboarding wrapper is excluded, and carved specialist phases are package-local lazy references loaded at their original workflow point.", "smart_skip_rules": "Skip only when the source condition is false, and name every skipped module with evidence.", "pushback_rules": "Preserve the source forcing questions, recommendation pressure, and one-question-at-a-time cadence.", "stop_gates": "Preserve every STOP, hard gate, approval boundary, and no-mutation-before-approval rule.", @@ -804,7 +804,7 @@ "voice": "Direct builder voice; match the user language and retain source-specific tone constraints.", "response_posture": "Direct, evidence-first builder language; preserve source-specific recommendations and constructive pressure.", "new_location": "skills/plan/references/legacy/spec.md", - "parity_test": "evals/parity/contracts/spec.json + scripts/gstack2/run-parity.ts normalized full-body equality" + "parity_test": "evals/parity/contracts/spec.json + scripts/gstack2/run-parity.ts canonical specialist render, excluded-wrapper, lazy-section, and pinned-source provenance checks" }, { "source": "plan-tune", @@ -814,7 +814,7 @@ "source_path": "plan-tune/SKILL.md.tmpl", "base_sha": "bb57306d98c97011b0919c6132705a15b1579781", "blob_sha": "dc1214d4c023ed2b126aca8aedb4153b222e73c5", - "normalized_render_sha256": "3b683319cf88f0d0b082654a45050d313d227fca16811aa1b859097a141f40f8", + "normalized_render_sha256": "306bbf971a2867e1f39cce82d64289d6c457bceb07439ddd6f4a3ff8f8ae5e9a", "target": "skills/plan/references/legacy/plan-tune.md", "disposition": "BUG_FIX", "overlays": [ @@ -829,7 +829,7 @@ "legacy_alias": "preferences" }, "question_sequence": "Preserve the source workflow order; gather prerequisites before consequential questions.", - "follow_up_behavior": "The complete source follow-up sequence is preserved verbatim inside new_location and hash-compared to the pinned base.", + "follow_up_behavior": "Specialist follow-up order is preserved from the pinned source. The retired 1.x shared onboarding wrapper is excluded, and carved specialist phases are package-local lazy references loaded at their original workflow point.", "smart_skip_rules": "Skip only when the source condition is false, and name every skipped module with evidence.", "pushback_rules": "Preserve the source forcing questions, recommendation pressure, and one-question-at-a-time cadence.", "stop_gates": "Preserve every STOP, hard gate, approval boundary, and no-mutation-before-approval rule.", @@ -883,7 +883,7 @@ "voice": "Direct builder voice; match the user language and retain source-specific tone constraints.", "response_posture": "Direct, evidence-first builder language; preserve source-specific recommendations and constructive pressure.", "new_location": "skills/plan/references/legacy/plan-tune.md", - "parity_test": "evals/parity/contracts/plan-tune.json + scripts/gstack2/run-parity.ts normalized full-body equality" + "parity_test": "evals/parity/contracts/plan-tune.json + scripts/gstack2/run-parity.ts canonical specialist render, excluded-wrapper, lazy-section, and pinned-source provenance checks" }, { "source": "context-save", @@ -893,7 +893,7 @@ "source_path": "context-save/SKILL.md.tmpl", "base_sha": "bb57306d98c97011b0919c6132705a15b1579781", "blob_sha": "a3702bc95439cddd87841aba836708bf511ef55d", - "normalized_render_sha256": "06a3ef8d7c9d361e7497252b69082ee51786ef4fd2bb62d9e7c5d97817bfdb0d", + "normalized_render_sha256": "348b840c60cecd8818d75f63ebb8e3effae659437137ce75c1ba6124177120b6", "target": "skills/plan/references/legacy/context-save.md", "disposition": "BUG_FIX", "overlays": [ @@ -908,7 +908,7 @@ "legacy_alias": "context-save" }, "question_sequence": "Preserve the source workflow order; gather prerequisites before consequential questions.", - "follow_up_behavior": "The complete source follow-up sequence is preserved verbatim inside new_location and hash-compared to the pinned base.", + "follow_up_behavior": "Specialist follow-up order is preserved from the pinned source. The retired 1.x shared onboarding wrapper is excluded, and carved specialist phases are package-local lazy references loaded at their original workflow point.", "smart_skip_rules": "Skip only when the source condition is false, and name every skipped module with evidence.", "pushback_rules": "Preserve the source forcing questions, recommendation pressure, and one-question-at-a-time cadence.", "stop_gates": "Preserve every STOP, hard gate, approval boundary, and no-mutation-before-approval rule.", @@ -958,7 +958,7 @@ "voice": "Direct builder voice; match the user language and retain source-specific tone constraints.", "response_posture": "Direct, evidence-first builder language; preserve source-specific recommendations and constructive pressure.", "new_location": "skills/plan/references/legacy/context-save.md", - "parity_test": "evals/parity/contracts/context-save.json + scripts/gstack2/run-parity.ts normalized full-body equality" + "parity_test": "evals/parity/contracts/context-save.json + scripts/gstack2/run-parity.ts canonical specialist render, excluded-wrapper, lazy-section, and pinned-source provenance checks" }, { "source": "context-restore", @@ -968,7 +968,7 @@ "source_path": "context-restore/SKILL.md.tmpl", "base_sha": "bb57306d98c97011b0919c6132705a15b1579781", "blob_sha": "55889f6e06d3ba896f33a16969959c700bc24f1e", - "normalized_render_sha256": "33b0cb3f2f23ef913eafd18b73c34aafe879c22cf7c23ceed7a5b5324ac79d3a", + "normalized_render_sha256": "c14726232c67616485c115dd7ca0898992bab9c7990629b40dc3b6f1c0dec0ee", "target": "skills/plan/references/legacy/context-restore.md", "disposition": "BUG_FIX", "overlays": [ @@ -983,7 +983,7 @@ "legacy_alias": "context-restore" }, "question_sequence": "Preserve the source workflow order; gather prerequisites before consequential questions.", - "follow_up_behavior": "The complete source follow-up sequence is preserved verbatim inside new_location and hash-compared to the pinned base.", + "follow_up_behavior": "Specialist follow-up order is preserved from the pinned source. The retired 1.x shared onboarding wrapper is excluded, and carved specialist phases are package-local lazy references loaded at their original workflow point.", "smart_skip_rules": "Skip only when the source condition is false, and name every skipped module with evidence.", "pushback_rules": "Preserve the source forcing questions, recommendation pressure, and one-question-at-a-time cadence.", "stop_gates": "Preserve every STOP, hard gate, approval boundary, and no-mutation-before-approval rule.", @@ -1030,7 +1030,7 @@ "voice": "Direct builder voice; match the user language and retain source-specific tone constraints.", "response_posture": "Direct, evidence-first builder language; preserve source-specific recommendations and constructive pressure.", "new_location": "skills/plan/references/legacy/context-restore.md", - "parity_test": "evals/parity/contracts/context-restore.json + scripts/gstack2/run-parity.ts normalized full-body equality" + "parity_test": "evals/parity/contracts/context-restore.json + scripts/gstack2/run-parity.ts canonical specialist render, excluded-wrapper, lazy-section, and pinned-source provenance checks" }, { "source": "learn", @@ -1040,7 +1040,7 @@ "source_path": "learn/SKILL.md.tmpl", "base_sha": "bb57306d98c97011b0919c6132705a15b1579781", "blob_sha": "90d08d2298cccd0d5090f194a2cd76a5361b4323", - "normalized_render_sha256": "0a155c2ed222aeb6d730583f4f9ce27ad6ad6c917a0bf583079da39a10e148d8", + "normalized_render_sha256": "0d1bbdf1bba2eaae206a350d47fb25ab50d49611262cb376861e83f78822f762", "target": "skills/plan/references/legacy/learn.md", "disposition": "BUG_FIX", "overlays": [ @@ -1056,7 +1056,7 @@ "legacy_alias": "learning" }, "question_sequence": "Preserve the source workflow order; gather prerequisites before consequential questions.", - "follow_up_behavior": "The complete source follow-up sequence is preserved verbatim inside new_location and hash-compared to the pinned base.", + "follow_up_behavior": "Specialist follow-up order is preserved from the pinned source. The retired 1.x shared onboarding wrapper is excluded, and carved specialist phases are package-local lazy references loaded at their original workflow point.", "smart_skip_rules": "Skip only when the source condition is false, and name every skipped module with evidence.", "pushback_rules": "Preserve the source forcing questions, recommendation pressure, and one-question-at-a-time cadence.", "stop_gates": "Preserve every STOP, hard gate, approval boundary, and no-mutation-before-approval rule.", @@ -1103,7 +1103,7 @@ "voice": "Direct builder voice; match the user language and retain source-specific tone constraints.", "response_posture": "Direct, evidence-first builder language; preserve source-specific recommendations and constructive pressure.", "new_location": "skills/plan/references/legacy/learn.md", - "parity_test": "evals/parity/contracts/learn.json + scripts/gstack2/run-parity.ts normalized full-body equality" + "parity_test": "evals/parity/contracts/learn.json + scripts/gstack2/run-parity.ts canonical specialist render, excluded-wrapper, lazy-section, and pinned-source provenance checks" }, { "source": "retro", @@ -1113,7 +1113,7 @@ "source_path": "retro/SKILL.md.tmpl", "base_sha": "bb57306d98c97011b0919c6132705a15b1579781", "blob_sha": "b0819c8a6b736baf489179ba587442cf9973b9d2", - "normalized_render_sha256": "3cfdcdab3560e38aa04d3079b6707080d3859cd05e4d4aecfb68267367d4e8f7", + "normalized_render_sha256": "c92e69da5c62e4bb5a426f4fb5623b41215e538315e2faebece8ba118cacaf71", "target": "skills/plan/references/legacy/retro.md", "disposition": "BUG_FIX", "overlays": [ @@ -1130,7 +1130,7 @@ "legacy_alias": "retro" }, "question_sequence": "Preserve the source workflow order; gather prerequisites before consequential questions.", - "follow_up_behavior": "The complete source follow-up sequence is preserved verbatim inside new_location and hash-compared to the pinned base.", + "follow_up_behavior": "Specialist follow-up order is preserved from the pinned source. The retired 1.x shared onboarding wrapper is excluded, and carved specialist phases are package-local lazy references loaded at their original workflow point.", "smart_skip_rules": "Skip only when the source condition is false, and name every skipped module with evidence.", "pushback_rules": "Preserve the source forcing questions, recommendation pressure, and one-question-at-a-time cadence.", "stop_gates": "Preserve every STOP, hard gate, approval boundary, and no-mutation-before-approval rule.", @@ -1230,7 +1230,7 @@ "voice": "Direct builder voice; match the user language and retain source-specific tone constraints.", "response_posture": "Direct, evidence-first builder language; preserve source-specific recommendations and constructive pressure.", "new_location": "skills/plan/references/legacy/retro.md", - "parity_test": "evals/parity/contracts/retro.json + scripts/gstack2/run-parity.ts normalized full-body equality" + "parity_test": "evals/parity/contracts/retro.json + scripts/gstack2/run-parity.ts canonical specialist render, excluded-wrapper, lazy-section, and pinned-source provenance checks" }, { "source": "setup-gbrain", @@ -1240,7 +1240,7 @@ "source_path": "setup-gbrain/SKILL.md.tmpl", "base_sha": "bb57306d98c97011b0919c6132705a15b1579781", "blob_sha": "f48581543b46ecf889f4f86fb7a0d9e75d0bd6ca", - "normalized_render_sha256": "3f87c1e0d75bd5c5cbe6848751271185e216b38945c93fddba7c7ac022fed982", + "normalized_render_sha256": "244ebee93e8871d59c1b0eac040bed362783e48a9b134171d743750ce9a59b29", "target": "skills/plan/references/legacy/setup-gbrain.md", "disposition": "BUG_FIX", "overlays": [ @@ -1255,7 +1255,7 @@ "legacy_alias": "memory-setup" }, "question_sequence": "Preserve the source workflow order; gather prerequisites before consequential questions.", - "follow_up_behavior": "The complete source follow-up sequence is preserved verbatim inside new_location and hash-compared to the pinned base.", + "follow_up_behavior": "Specialist follow-up order is preserved from the pinned source. The retired 1.x shared onboarding wrapper is excluded, and carved specialist phases are package-local lazy references loaded at their original workflow point.", "smart_skip_rules": "Skip only when the source condition is false, and name every skipped module with evidence.", "pushback_rules": "Preserve the source forcing questions, recommendation pressure, and one-question-at-a-time cadence.", "stop_gates": "Preserve every STOP, hard gate, approval boundary, and no-mutation-before-approval rule.", @@ -1330,7 +1330,7 @@ "voice": "Direct builder voice; match the user language and retain source-specific tone constraints.", "response_posture": "Direct, evidence-first builder language; preserve source-specific recommendations and constructive pressure.", "new_location": "skills/plan/references/legacy/setup-gbrain.md", - "parity_test": "evals/parity/contracts/setup-gbrain.json + scripts/gstack2/run-parity.ts normalized full-body equality" + "parity_test": "evals/parity/contracts/setup-gbrain.json + scripts/gstack2/run-parity.ts canonical specialist render, excluded-wrapper, lazy-section, and pinned-source provenance checks" }, { "source": "sync-gbrain", @@ -1340,7 +1340,7 @@ "source_path": "sync-gbrain/SKILL.md.tmpl", "base_sha": "bb57306d98c97011b0919c6132705a15b1579781", "blob_sha": "2ec065472e263a07f3818ed87ee9a6a2e13ca3ae", - "normalized_render_sha256": "b33fb4a5fadaf6bcf71363b4e8d9b1f3fd56336f47d23eb8e8594d534d76b55b", + "normalized_render_sha256": "175e7d0d2998bd4c8ddcd9a84228c41ba4a5cf3aca3a8bc09ddfc5a303c1df30", "target": "skills/plan/references/legacy/sync-gbrain.md", "disposition": "BUG_FIX", "overlays": [ @@ -1355,7 +1355,7 @@ "legacy_alias": "memory-sync" }, "question_sequence": "Preserve the source workflow order; gather prerequisites before consequential questions.", - "follow_up_behavior": "The complete source follow-up sequence is preserved verbatim inside new_location and hash-compared to the pinned base.", + "follow_up_behavior": "Specialist follow-up order is preserved from the pinned source. The retired 1.x shared onboarding wrapper is excluded, and carved specialist phases are package-local lazy references loaded at their original workflow point.", "smart_skip_rules": "Skip only when the source condition is false, and name every skipped module with evidence.", "pushback_rules": "Preserve the source forcing questions, recommendation pressure, and one-question-at-a-time cadence.", "stop_gates": "Preserve every STOP, hard gate, approval boundary, and no-mutation-before-approval rule.", @@ -1406,7 +1406,7 @@ "voice": "Direct builder voice; match the user language and retain source-specific tone constraints.", "response_posture": "Direct, evidence-first builder language; preserve source-specific recommendations and constructive pressure.", "new_location": "skills/plan/references/legacy/sync-gbrain.md", - "parity_test": "evals/parity/contracts/sync-gbrain.json + scripts/gstack2/run-parity.ts normalized full-body equality" + "parity_test": "evals/parity/contracts/sync-gbrain.json + scripts/gstack2/run-parity.ts canonical specialist render, excluded-wrapper, lazy-section, and pinned-source provenance checks" }, { "source": "design-consultation", @@ -1416,7 +1416,7 @@ "source_path": "design-consultation/SKILL.md.tmpl", "base_sha": "bb57306d98c97011b0919c6132705a15b1579781", "blob_sha": "64af56ecdbd132cb7c28344e8e4ecb2e5dacf811", - "normalized_render_sha256": "2753c3423f22f9ef2b3baf31069bd2ac6951e7bc69cc70f28c8da5c07580ab26", + "normalized_render_sha256": "afa1f2b58d22d9f0f9064336ce7e9836430a298e1deb56f5330390f91df3f680", "target": "skills/design/references/legacy/design-consultation.md", "disposition": "BUG_FIX", "overlays": [ @@ -1433,7 +1433,7 @@ "legacy_alias": "consult" }, "question_sequence": "Preserve the source workflow order; gather prerequisites before consequential questions.", - "follow_up_behavior": "The complete source follow-up sequence is preserved verbatim inside new_location and hash-compared to the pinned base.", + "follow_up_behavior": "Specialist follow-up order is preserved from the pinned source. The retired 1.x shared onboarding wrapper is excluded, and carved specialist phases are package-local lazy references loaded at their original workflow point.", "smart_skip_rules": "Skip only when the source condition is false, and name every skipped module with evidence.", "pushback_rules": "Preserve the source forcing questions, recommendation pressure, and one-question-at-a-time cadence.", "stop_gates": "Preserve every STOP, hard gate, approval boundary, and no-mutation-before-approval rule.", @@ -1494,7 +1494,7 @@ "voice": "Direct builder voice; match the user language and retain source-specific tone constraints.", "response_posture": "Direct, evidence-first builder language; preserve source-specific recommendations and constructive pressure.", "new_location": "skills/design/references/legacy/design-consultation.md", - "parity_test": "evals/parity/contracts/design-consultation.json + scripts/gstack2/run-parity.ts normalized full-body equality" + "parity_test": "evals/parity/contracts/design-consultation.json + scripts/gstack2/run-parity.ts canonical specialist render, excluded-wrapper, lazy-section, and pinned-source provenance checks" }, { "source": "design-shotgun", @@ -1504,7 +1504,7 @@ "source_path": "design-shotgun/SKILL.md.tmpl", "base_sha": "bb57306d98c97011b0919c6132705a15b1579781", "blob_sha": "230dbc2922f05bf272bf5168a958a12604fac1bc", - "normalized_render_sha256": "2ffa676332b91cb2f4f0ae4a08d917dd43a767995b33d960895c15e93fb7c73c", + "normalized_render_sha256": "1db4cd23ee115ce841d2db898cc442141588635d43018393703aa28ce40d48f2", "target": "skills/design/references/legacy/design-shotgun.md", "disposition": "BUG_FIX", "overlays": [ @@ -1520,7 +1520,7 @@ "legacy_alias": "alternatives" }, "question_sequence": "Preserve the source workflow order; gather prerequisites before consequential questions.", - "follow_up_behavior": "The complete source follow-up sequence is preserved verbatim inside new_location and hash-compared to the pinned base.", + "follow_up_behavior": "Specialist follow-up order is preserved from the pinned source. The retired 1.x shared onboarding wrapper is excluded, and carved specialist phases are package-local lazy references loaded at their original workflow point.", "smart_skip_rules": "Skip only when the source condition is false, and name every skipped module with evidence.", "pushback_rules": "Preserve the source forcing questions, recommendation pressure, and one-question-at-a-time cadence.", "stop_gates": "Preserve every STOP, hard gate, approval boundary, and no-mutation-before-approval rule.", @@ -1581,7 +1581,7 @@ "voice": "Direct builder voice; match the user language and retain source-specific tone constraints.", "response_posture": "Direct, evidence-first builder language; preserve source-specific recommendations and constructive pressure.", "new_location": "skills/design/references/legacy/design-shotgun.md", - "parity_test": "evals/parity/contracts/design-shotgun.json + scripts/gstack2/run-parity.ts normalized full-body equality" + "parity_test": "evals/parity/contracts/design-shotgun.json + scripts/gstack2/run-parity.ts canonical specialist render, excluded-wrapper, lazy-section, and pinned-source provenance checks" }, { "source": "design-html", @@ -1591,7 +1591,7 @@ "source_path": "design-html/SKILL.md.tmpl", "base_sha": "bb57306d98c97011b0919c6132705a15b1579781", "blob_sha": "3cdec9a14d62d2e046ed924c972efc30a7d43aca", - "normalized_render_sha256": "f6dd88ea765653cd49bac6479c8212977bb578afca4c900153a9c646c260b943", + "normalized_render_sha256": "cbb1b4357bedbb0fffe23c3e0ad31ee8c2a198a31443edb660e5c836e67e94e6", "target": "skills/design/references/legacy/design-html.md", "disposition": "BUG_FIX", "overlays": [ @@ -1606,7 +1606,7 @@ "legacy_alias": "html" }, "question_sequence": "Preserve the source workflow order; gather prerequisites before consequential questions.", - "follow_up_behavior": "The complete source follow-up sequence is preserved verbatim inside new_location and hash-compared to the pinned base.", + "follow_up_behavior": "Specialist follow-up order is preserved from the pinned source. The retired 1.x shared onboarding wrapper is excluded, and carved specialist phases are package-local lazy references loaded at their original workflow point.", "smart_skip_rules": "Skip only when the source condition is false, and name every skipped module with evidence.", "pushback_rules": "Preserve the source forcing questions, recommendation pressure, and one-question-at-a-time cadence.", "stop_gates": "Preserve every STOP, hard gate, approval boundary, and no-mutation-before-approval rule.", @@ -1677,7 +1677,7 @@ "voice": "Direct builder voice; match the user language and retain source-specific tone constraints.", "response_posture": "Direct, evidence-first builder language; preserve source-specific recommendations and constructive pressure.", "new_location": "skills/design/references/legacy/design-html.md", - "parity_test": "evals/parity/contracts/design-html.json + scripts/gstack2/run-parity.ts normalized full-body equality" + "parity_test": "evals/parity/contracts/design-html.json + scripts/gstack2/run-parity.ts canonical specialist render, excluded-wrapper, lazy-section, and pinned-source provenance checks" }, { "source": "plan-design-review", @@ -1687,7 +1687,7 @@ "source_path": "plan-design-review/SKILL.md.tmpl", "base_sha": "bb57306d98c97011b0919c6132705a15b1579781", "blob_sha": "7178c991e41277410de500298cf81372543861af", - "normalized_render_sha256": "05fdb5d63dc6007307c74493f0597251fb9d203b310f7c80b5921b94666f3d99", + "normalized_render_sha256": "2f7a5d113c466d75ca4524e424c072044d92ae7ab93009f1fbe3ae5965e8aa34", "target": "skills/design/references/legacy/plan-design-review.md", "disposition": "BUG_FIX", "overlays": [ @@ -1704,7 +1704,7 @@ "legacy_alias": "plan-review" }, "question_sequence": "Preserve the source workflow order; gather prerequisites before consequential questions.", - "follow_up_behavior": "The complete source follow-up sequence is preserved verbatim inside new_location and hash-compared to the pinned base.", + "follow_up_behavior": "Specialist follow-up order is preserved from the pinned source. The retired 1.x shared onboarding wrapper is excluded, and carved specialist phases are package-local lazy references loaded at their original workflow point.", "smart_skip_rules": "Skip only when the source condition is false, and name every skipped module with evidence.", "pushback_rules": "Preserve the source forcing questions, recommendation pressure, and one-question-at-a-time cadence.", "stop_gates": "Preserve every STOP, hard gate, approval boundary, and no-mutation-before-approval rule.", @@ -1810,7 +1810,7 @@ "voice": "Direct builder voice; match the user language and retain source-specific tone constraints.", "response_posture": "Direct, evidence-first builder language; preserve source-specific recommendations and constructive pressure.", "new_location": "skills/design/references/legacy/plan-design-review.md", - "parity_test": "evals/parity/contracts/plan-design-review.json + scripts/gstack2/run-parity.ts normalized full-body equality" + "parity_test": "evals/parity/contracts/plan-design-review.json + scripts/gstack2/run-parity.ts canonical specialist render, excluded-wrapper, lazy-section, and pinned-source provenance checks" }, { "source": "design-review", @@ -1820,7 +1820,7 @@ "source_path": "design-review/SKILL.md.tmpl", "base_sha": "bb57306d98c97011b0919c6132705a15b1579781", "blob_sha": "bdcda48e29b489a1cc49faa333922412251d4b41", - "normalized_render_sha256": "8711f4910f9cb9d022d024c432093bccbcf8d4e74250a3a25f915eb086de6c5a", + "normalized_render_sha256": "33584047a11aa46a1b6a2bef5bf97a4d0b443bb6c9542685732e7d4dff795a2e", "target": "skills/design/references/legacy/design-review.md", "disposition": "BUG_FIX", "overlays": [ @@ -1838,7 +1838,7 @@ "legacy_alias": "live-review" }, "question_sequence": "Preserve the source workflow order; gather prerequisites before consequential questions.", - "follow_up_behavior": "The complete source follow-up sequence is preserved verbatim inside new_location and hash-compared to the pinned base.", + "follow_up_behavior": "Specialist follow-up order is preserved from the pinned source. The retired 1.x shared onboarding wrapper is excluded, and carved specialist phases are package-local lazy references loaded at their original workflow point.", "smart_skip_rules": "Skip only when the source condition is false, and name every skipped module with evidence.", "pushback_rules": "Preserve the source forcing questions, recommendation pressure, and one-question-at-a-time cadence.", "stop_gates": "Preserve every STOP, hard gate, approval boundary, and no-mutation-before-approval rule.", @@ -1940,7 +1940,7 @@ "voice": "Direct builder voice; match the user language and retain source-specific tone constraints.", "response_posture": "Direct, evidence-first builder language; preserve source-specific recommendations and constructive pressure.", "new_location": "skills/design/references/legacy/design-review.md", - "parity_test": "evals/parity/contracts/design-review.json + scripts/gstack2/run-parity.ts normalized full-body equality" + "parity_test": "evals/parity/contracts/design-review.json + scripts/gstack2/run-parity.ts canonical specialist render, excluded-wrapper, lazy-section, and pinned-source provenance checks" }, { "source": "ios-design-review", @@ -1950,7 +1950,7 @@ "source_path": "ios-design-review/SKILL.md.tmpl", "base_sha": "bb57306d98c97011b0919c6132705a15b1579781", "blob_sha": "dd9e2518f53edf939a1e425806abc871a9b33022", - "normalized_render_sha256": "38bb6ba7876611f5ae63566820f67a48f9b1797c33d000c866540a4e6f766d50", + "normalized_render_sha256": "53741f7f044faa413f1725bada27514d2528d834f327e83f040de67668d24dae", "target": "skills/design/references/legacy/ios-design-review.md", "disposition": "BUG_FIX", "overlays": [ @@ -1965,7 +1965,7 @@ "legacy_alias": "ios-review" }, "question_sequence": "Preserve the source workflow order; gather prerequisites before consequential questions.", - "follow_up_behavior": "The complete source follow-up sequence is preserved verbatim inside new_location and hash-compared to the pinned base.", + "follow_up_behavior": "Specialist follow-up order is preserved from the pinned source. The retired 1.x shared onboarding wrapper is excluded, and carved specialist phases are package-local lazy references loaded at their original workflow point.", "smart_skip_rules": "Skip only when the source condition is false, and name every skipped module with evidence.", "pushback_rules": "Preserve the source forcing questions, recommendation pressure, and one-question-at-a-time cadence.", "stop_gates": "Preserve every STOP, hard gate, approval boundary, and no-mutation-before-approval rule.", @@ -2012,7 +2012,7 @@ "voice": "Direct builder voice; match the user language and retain source-specific tone constraints.", "response_posture": "Direct, evidence-first builder language; preserve source-specific recommendations and constructive pressure.", "new_location": "skills/design/references/legacy/ios-design-review.md", - "parity_test": "evals/parity/contracts/ios-design-review.json + scripts/gstack2/run-parity.ts normalized full-body equality" + "parity_test": "evals/parity/contracts/ios-design-review.json + scripts/gstack2/run-parity.ts canonical specialist render, excluded-wrapper, lazy-section, and pinned-source provenance checks" }, { "source": "diagram", @@ -2022,7 +2022,7 @@ "source_path": "diagram/SKILL.md.tmpl", "base_sha": "bb57306d98c97011b0919c6132705a15b1579781", "blob_sha": "9e19a52c6b7f727ce4faf5c1f9c14514ecb52f50", - "normalized_render_sha256": "88d1b8810d6ae95c6cf984825e2fe96712dfe4a7f7dba3e03d8a3634cf9e97ca", + "normalized_render_sha256": "21f18fa4957b79bf5941abfebd1b222dee3eb960520e0deac1c32d0b6fd62a38", "target": "skills/design/references/legacy/diagram.md", "disposition": "BUG_FIX", "overlays": [ @@ -2037,7 +2037,7 @@ "legacy_alias": "diagram" }, "question_sequence": "Preserve the source workflow order; gather prerequisites before consequential questions.", - "follow_up_behavior": "The complete source follow-up sequence is preserved verbatim inside new_location and hash-compared to the pinned base.", + "follow_up_behavior": "Specialist follow-up order is preserved from the pinned source. The retired 1.x shared onboarding wrapper is excluded, and carved specialist phases are package-local lazy references loaded at their original workflow point.", "smart_skip_rules": "Skip only when the source condition is false, and name every skipped module with evidence.", "pushback_rules": "Preserve the source forcing questions, recommendation pressure, and one-question-at-a-time cadence.", "stop_gates": "Preserve every STOP, hard gate, approval boundary, and no-mutation-before-approval rule.", @@ -2085,7 +2085,7 @@ "voice": "Direct builder voice; match the user language and retain source-specific tone constraints.", "response_posture": "Direct, evidence-first builder language; preserve source-specific recommendations and constructive pressure.", "new_location": "skills/design/references/legacy/diagram.md", - "parity_test": "evals/parity/contracts/diagram.json + scripts/gstack2/run-parity.ts normalized full-body equality" + "parity_test": "evals/parity/contracts/diagram.json + scripts/gstack2/run-parity.ts canonical specialist render, excluded-wrapper, lazy-section, and pinned-source provenance checks" }, { "source": "make-pdf", @@ -2095,7 +2095,7 @@ "source_path": "make-pdf/SKILL.md.tmpl", "base_sha": "bb57306d98c97011b0919c6132705a15b1579781", "blob_sha": "9133a711d4f3d056a21f790e8ec3b98f13fbaa50", - "normalized_render_sha256": "7901a455bf36750224e05468d0123c32e8b9bc98c7334fb0973228bdbba80997", + "normalized_render_sha256": "c092bc644ff9b8929d9cbdfedb6f2761b40ce8e1fca53d13ad350ba91195104d", "target": "skills/design/references/legacy/make-pdf.md", "disposition": "BUG_FIX", "overlays": [ @@ -2110,7 +2110,7 @@ "legacy_alias": "pdf" }, "question_sequence": "Preserve the source workflow order; gather prerequisites before consequential questions.", - "follow_up_behavior": "The complete source follow-up sequence is preserved verbatim inside new_location and hash-compared to the pinned base.", + "follow_up_behavior": "Specialist follow-up order is preserved from the pinned source. The retired 1.x shared onboarding wrapper is excluded, and carved specialist phases are package-local lazy references loaded at their original workflow point.", "smart_skip_rules": "Skip only when the source condition is false, and name every skipped module with evidence.", "pushback_rules": "Preserve the source forcing questions, recommendation pressure, and one-question-at-a-time cadence.", "stop_gates": "Preserve every STOP, hard gate, approval boundary, and no-mutation-before-approval rule.", @@ -2152,7 +2152,7 @@ "voice": "Direct builder voice; match the user language and retain source-specific tone constraints.", "response_posture": "Direct, evidence-first builder language; preserve source-specific recommendations and constructive pressure.", "new_location": "skills/design/references/legacy/make-pdf.md", - "parity_test": "evals/parity/contracts/make-pdf.json + scripts/gstack2/run-parity.ts normalized full-body equality" + "parity_test": "evals/parity/contracts/make-pdf.json + scripts/gstack2/run-parity.ts canonical specialist render, excluded-wrapper, lazy-section, and pinned-source provenance checks" }, { "source": "qa", @@ -2162,7 +2162,7 @@ "source_path": "qa/SKILL.md.tmpl", "base_sha": "bb57306d98c97011b0919c6132705a15b1579781", "blob_sha": "11997f7b878282c34b6bfd3d4b7a8131f9ad4da8", - "normalized_render_sha256": "025c1fbca58477248afb826cde24766904749129177e2bc60fbf2370207d1da5", + "normalized_render_sha256": "b1387290067842593297c8d64dc578a890a336ce5a8b60085e51b52c55ebaade", "target": "skills/qa/references/legacy/qa.md", "disposition": "BUG_FIX", "overlays": [ @@ -2180,7 +2180,7 @@ "legacy_alias": "fix" }, "question_sequence": "Preserve the source workflow order; gather prerequisites before consequential questions.", - "follow_up_behavior": "The complete source follow-up sequence is preserved verbatim inside new_location and hash-compared to the pinned base.", + "follow_up_behavior": "Specialist follow-up order is preserved from the pinned source. The retired 1.x shared onboarding wrapper is excluded, and carved specialist phases are package-local lazy references loaded at their original workflow point.", "smart_skip_rules": "Skip only when the source condition is false, and name every skipped module with evidence.", "pushback_rules": "Preserve the source forcing questions, recommendation pressure, and one-question-at-a-time cadence.", "stop_gates": "Preserve every STOP, hard gate, approval boundary, and no-mutation-before-approval rule.", @@ -2278,7 +2278,7 @@ "voice": "Direct builder voice; match the user language and retain source-specific tone constraints.", "response_posture": "Direct, evidence-first builder language; preserve source-specific recommendations and constructive pressure.", "new_location": "skills/qa/references/legacy/qa.md", - "parity_test": "evals/parity/contracts/qa.json + scripts/gstack2/run-parity.ts normalized full-body equality" + "parity_test": "evals/parity/contracts/qa.json + scripts/gstack2/run-parity.ts canonical specialist render, excluded-wrapper, lazy-section, and pinned-source provenance checks" }, { "source": "qa-only", @@ -2288,7 +2288,7 @@ "source_path": "qa-only/SKILL.md.tmpl", "base_sha": "bb57306d98c97011b0919c6132705a15b1579781", "blob_sha": "75c4123cc5c406ffdd36c71a094335c137135b1e", - "normalized_render_sha256": "90f138a7ded37476397e3399ed686a92f9317161ba6e2256d6c7ed7c2893e273", + "normalized_render_sha256": "e360ea826399287e00b030c9aa0bcda16e06ab004f5dcdb14db309bad0ccea25", "target": "skills/qa/references/legacy/qa-only.md", "disposition": "BUG_FIX", "overlays": [ @@ -2305,7 +2305,7 @@ "legacy_alias": "report" }, "question_sequence": "Preserve the source workflow order; gather prerequisites before consequential questions.", - "follow_up_behavior": "The complete source follow-up sequence is preserved verbatim inside new_location and hash-compared to the pinned base.", + "follow_up_behavior": "Specialist follow-up order is preserved from the pinned source. The retired 1.x shared onboarding wrapper is excluded, and carved specialist phases are package-local lazy references loaded at their original workflow point.", "smart_skip_rules": "Skip only when the source condition is false, and name every skipped module with evidence.", "pushback_rules": "Preserve the source forcing questions, recommendation pressure, and one-question-at-a-time cadence.", "stop_gates": "Preserve every STOP, hard gate, approval boundary, and no-mutation-before-approval rule.", @@ -2379,7 +2379,7 @@ "voice": "Direct builder voice; match the user language and retain source-specific tone constraints.", "response_posture": "Direct, evidence-first builder language; preserve source-specific recommendations and constructive pressure.", "new_location": "skills/qa/references/legacy/qa-only.md", - "parity_test": "evals/parity/contracts/qa-only.json + scripts/gstack2/run-parity.ts normalized full-body equality" + "parity_test": "evals/parity/contracts/qa-only.json + scripts/gstack2/run-parity.ts canonical specialist render, excluded-wrapper, lazy-section, and pinned-source provenance checks" }, { "source": "ios-qa", @@ -2389,7 +2389,7 @@ "source_path": "ios-qa/SKILL.md.tmpl", "base_sha": "bb57306d98c97011b0919c6132705a15b1579781", "blob_sha": "e93d2831a31df65ec8e4e8693919ef5bf148457f", - "normalized_render_sha256": "37b9baf014dcfa6ed3266ae3241dad17956a0b6b3f332dc44bdb728daa3c8f01", + "normalized_render_sha256": "a9353a4d837240f85c0e13144e66575f9e267926090cfc0f344a08b5fb09b98c", "target": "skills/qa/references/legacy/ios-qa.md", "disposition": "BUG_FIX", "overlays": [ @@ -2404,7 +2404,7 @@ "legacy_alias": "ios" }, "question_sequence": "Preserve the source workflow order; gather prerequisites before consequential questions.", - "follow_up_behavior": "The complete source follow-up sequence is preserved verbatim inside new_location and hash-compared to the pinned base.", + "follow_up_behavior": "Specialist follow-up order is preserved from the pinned source. The retired 1.x shared onboarding wrapper is excluded, and carved specialist phases are package-local lazy references loaded at their original workflow point.", "smart_skip_rules": "Skip only when the source condition is false, and name every skipped module with evidence.", "pushback_rules": "Preserve the source forcing questions, recommendation pressure, and one-question-at-a-time cadence.", "stop_gates": "Preserve every STOP, hard gate, approval boundary, and no-mutation-before-approval rule.", @@ -2456,7 +2456,7 @@ "voice": "Direct builder voice; match the user language and retain source-specific tone constraints.", "response_posture": "Direct, evidence-first builder language; preserve source-specific recommendations and constructive pressure.", "new_location": "skills/qa/references/legacy/ios-qa.md", - "parity_test": "evals/parity/contracts/ios-qa.json + scripts/gstack2/run-parity.ts normalized full-body equality" + "parity_test": "evals/parity/contracts/ios-qa.json + scripts/gstack2/run-parity.ts canonical specialist render, excluded-wrapper, lazy-section, and pinned-source provenance checks" }, { "source": "devex-review", @@ -2466,7 +2466,7 @@ "source_path": "devex-review/SKILL.md.tmpl", "base_sha": "bb57306d98c97011b0919c6132705a15b1579781", "blob_sha": "081d4f35bbdec0c6b3da8ae71615ec4d41a84551", - "normalized_render_sha256": "849895ef49f7c855bfa819620e94d41da9909eb5baf214719b004130ecd741d6", + "normalized_render_sha256": "9fbc11b3fe252c281581512d67f6915c72e34bb2fdc7bc795e3077ee0e48d34e", "target": "skills/qa/references/legacy/devex-review.md", "disposition": "BUG_FIX", "overlays": [ @@ -2482,7 +2482,7 @@ "legacy_alias": "dx" }, "question_sequence": "Preserve the source workflow order; gather prerequisites before consequential questions.", - "follow_up_behavior": "The complete source follow-up sequence is preserved verbatim inside new_location and hash-compared to the pinned base.", + "follow_up_behavior": "Specialist follow-up order is preserved from the pinned source. The retired 1.x shared onboarding wrapper is excluded, and carved specialist phases are package-local lazy references loaded at their original workflow point.", "smart_skip_rules": "Skip only when the source condition is false, and name every skipped module with evidence.", "pushback_rules": "Preserve the source forcing questions, recommendation pressure, and one-question-at-a-time cadence.", "stop_gates": "Preserve every STOP, hard gate, approval boundary, and no-mutation-before-approval rule.", @@ -2555,7 +2555,7 @@ "voice": "Direct builder voice; match the user language and retain source-specific tone constraints.", "response_posture": "Direct, evidence-first builder language; preserve source-specific recommendations and constructive pressure.", "new_location": "skills/qa/references/legacy/devex-review.md", - "parity_test": "evals/parity/contracts/devex-review.json + scripts/gstack2/run-parity.ts normalized full-body equality" + "parity_test": "evals/parity/contracts/devex-review.json + scripts/gstack2/run-parity.ts canonical specialist render, excluded-wrapper, lazy-section, and pinned-source provenance checks" }, { "source": "benchmark", @@ -2565,7 +2565,7 @@ "source_path": "benchmark/SKILL.md.tmpl", "base_sha": "bb57306d98c97011b0919c6132705a15b1579781", "blob_sha": "038f16f5fba4ae4e9eae922e3276bba8ef88149e", - "normalized_render_sha256": "c579dad9e78a12bf7547a6dd752daaa3299c66c55d8170290c075caa5d1fa660", + "normalized_render_sha256": "a4554b8b139ee95c9f25c2e747f9e2214b2f0db64401057529e5ec775be323cd", "target": "skills/qa/references/legacy/benchmark.md", "disposition": "BUG_FIX", "overlays": [ @@ -2580,7 +2580,7 @@ "legacy_alias": "performance" }, "question_sequence": "Preserve the source workflow order; gather prerequisites before consequential questions.", - "follow_up_behavior": "The complete source follow-up sequence is preserved verbatim inside new_location and hash-compared to the pinned base.", + "follow_up_behavior": "Specialist follow-up order is preserved from the pinned source. The retired 1.x shared onboarding wrapper is excluded, and carved specialist phases are package-local lazy references loaded at their original workflow point.", "smart_skip_rules": "Skip only when the source condition is false, and name every skipped module with evidence.", "pushback_rules": "Preserve the source forcing questions, recommendation pressure, and one-question-at-a-time cadence.", "stop_gates": "Preserve every STOP, hard gate, approval boundary, and no-mutation-before-approval rule.", @@ -2621,7 +2621,7 @@ "voice": "Direct builder voice; match the user language and retain source-specific tone constraints.", "response_posture": "Direct, evidence-first builder language; preserve source-specific recommendations and constructive pressure.", "new_location": "skills/qa/references/legacy/benchmark.md", - "parity_test": "evals/parity/contracts/benchmark.json + scripts/gstack2/run-parity.ts normalized full-body equality" + "parity_test": "evals/parity/contracts/benchmark.json + scripts/gstack2/run-parity.ts canonical specialist render, excluded-wrapper, lazy-section, and pinned-source provenance checks" }, { "source": "canary", @@ -2631,7 +2631,7 @@ "source_path": "canary/SKILL.md.tmpl", "base_sha": "bb57306d98c97011b0919c6132705a15b1579781", "blob_sha": "d1eb2950aba2fa2b09d90f13143492c60d46793c", - "normalized_render_sha256": "551c32a7bbbdc5dec6f88751e885869df9d1a26286df233cb78b51beb2e0987a", + "normalized_render_sha256": "329b61120f60893d023533cbc493389d1c7476819fb785422de0e7d34e0c2c0b", "target": "skills/qa/references/legacy/canary.md", "disposition": "BUG_FIX", "overlays": [ @@ -2647,7 +2647,7 @@ "legacy_alias": "canary" }, "question_sequence": "Preserve the source workflow order; gather prerequisites before consequential questions.", - "follow_up_behavior": "The complete source follow-up sequence is preserved verbatim inside new_location and hash-compared to the pinned base.", + "follow_up_behavior": "Specialist follow-up order is preserved from the pinned source. The retired 1.x shared onboarding wrapper is excluded, and carved specialist phases are package-local lazy references loaded at their original workflow point.", "smart_skip_rules": "Skip only when the source condition is false, and name every skipped module with evidence.", "pushback_rules": "Preserve the source forcing questions, recommendation pressure, and one-question-at-a-time cadence.", "stop_gates": "Preserve every STOP, hard gate, approval boundary, and no-mutation-before-approval rule.", @@ -2700,7 +2700,7 @@ "voice": "Direct builder voice; match the user language and retain source-specific tone constraints.", "response_posture": "Direct, evidence-first builder language; preserve source-specific recommendations and constructive pressure.", "new_location": "skills/qa/references/legacy/canary.md", - "parity_test": "evals/parity/contracts/canary.json + scripts/gstack2/run-parity.ts normalized full-body equality" + "parity_test": "evals/parity/contracts/canary.json + scripts/gstack2/run-parity.ts canonical specialist render, excluded-wrapper, lazy-section, and pinned-source provenance checks" }, { "source": "browse", @@ -2710,7 +2710,7 @@ "source_path": "browse/SKILL.md.tmpl", "base_sha": "bb57306d98c97011b0919c6132705a15b1579781", "blob_sha": "9a159e4c9820172c229e2174d4a62a8f9668ab93", - "normalized_render_sha256": "9d5a75a6e20d40bf2d275ca39375899bb6c51abd4e8ce1042e8db4450e891196", + "normalized_render_sha256": "b7fd526a00444003cad654abb15c2d17606cc5295f38533754e95108038d3467", "target": "skills/qa/references/legacy/browse.md", "disposition": "BUG_FIX", "overlays": [ @@ -2726,7 +2726,7 @@ "legacy_alias": "browser" }, "question_sequence": "Preserve the source workflow order; gather prerequisites before consequential questions.", - "follow_up_behavior": "The complete source follow-up sequence is preserved verbatim inside new_location and hash-compared to the pinned base.", + "follow_up_behavior": "Specialist follow-up order is preserved from the pinned source. The retired 1.x shared onboarding wrapper is excluded, and carved specialist phases are package-local lazy references loaded at their original workflow point.", "smart_skip_rules": "Skip only when the source condition is false, and name every skipped module with evidence.", "pushback_rules": "Preserve the source forcing questions, recommendation pressure, and one-question-at-a-time cadence.", "stop_gates": "Preserve every STOP, hard gate, approval boundary, and no-mutation-before-approval rule.", @@ -2788,7 +2788,7 @@ "voice": "Direct builder voice; match the user language and retain source-specific tone constraints.", "response_posture": "Direct, evidence-first builder language; preserve source-specific recommendations and constructive pressure.", "new_location": "skills/qa/references/legacy/browse.md", - "parity_test": "evals/parity/contracts/browse.json + scripts/gstack2/run-parity.ts normalized full-body equality" + "parity_test": "evals/parity/contracts/browse.json + scripts/gstack2/run-parity.ts canonical specialist render, excluded-wrapper, lazy-section, and pinned-source provenance checks" }, { "source": "open-gstack-browser", @@ -2798,7 +2798,7 @@ "source_path": "open-gstack-browser/SKILL.md.tmpl", "base_sha": "bb57306d98c97011b0919c6132705a15b1579781", "blob_sha": "ef91a527890a3ac3622cc7dc84bad1ff7b64443b", - "normalized_render_sha256": "54c16f55549393a6a2080c5d3f4c0055ce92ca63bdb3966965d96ec5cae3f405", + "normalized_render_sha256": "9e4a08db3e17badfc67703f7c5e66f80a7f05e0b96fad31fc48b8216964d7449", "target": "skills/qa/references/legacy/open-gstack-browser.md", "disposition": "BUG_FIX", "overlays": [ @@ -2813,7 +2813,7 @@ "legacy_alias": "browser-visible" }, "question_sequence": "Preserve the source workflow order; gather prerequisites before consequential questions.", - "follow_up_behavior": "The complete source follow-up sequence is preserved verbatim inside new_location and hash-compared to the pinned base.", + "follow_up_behavior": "Specialist follow-up order is preserved from the pinned source. The retired 1.x shared onboarding wrapper is excluded, and carved specialist phases are package-local lazy references loaded at their original workflow point.", "smart_skip_rules": "Skip only when the source condition is false, and name every skipped module with evidence.", "pushback_rules": "Preserve the source forcing questions, recommendation pressure, and one-question-at-a-time cadence.", "stop_gates": "Preserve every STOP, hard gate, approval boundary, and no-mutation-before-approval rule.", @@ -2863,7 +2863,7 @@ "voice": "Direct builder voice; match the user language and retain source-specific tone constraints.", "response_posture": "Direct, evidence-first builder language; preserve source-specific recommendations and constructive pressure.", "new_location": "skills/qa/references/legacy/open-gstack-browser.md", - "parity_test": "evals/parity/contracts/open-gstack-browser.json + scripts/gstack2/run-parity.ts normalized full-body equality" + "parity_test": "evals/parity/contracts/open-gstack-browser.json + scripts/gstack2/run-parity.ts canonical specialist render, excluded-wrapper, lazy-section, and pinned-source provenance checks" }, { "source": "setup-browser-cookies", @@ -2873,7 +2873,7 @@ "source_path": "setup-browser-cookies/SKILL.md.tmpl", "base_sha": "bb57306d98c97011b0919c6132705a15b1579781", "blob_sha": "f812d9f56f27c32fb5f102083bbe418344c1a652", - "normalized_render_sha256": "5e27829f87a537e233ac1d0b2fe96cfe21ad6263c70044d8672b1f14c83e7506", + "normalized_render_sha256": "8ab5dfb05136a637ce41067d9e50ade76c4a8b957587e4eab134eaa260b29ac3", "target": "skills/qa/references/legacy/setup-browser-cookies.md", "disposition": "BUG_FIX", "overlays": [ @@ -2888,7 +2888,7 @@ "legacy_alias": "browser-auth" }, "question_sequence": "Preserve the source workflow order; gather prerequisites before consequential questions.", - "follow_up_behavior": "The complete source follow-up sequence is preserved verbatim inside new_location and hash-compared to the pinned base.", + "follow_up_behavior": "Specialist follow-up order is preserved from the pinned source. The retired 1.x shared onboarding wrapper is excluded, and carved specialist phases are package-local lazy references loaded at their original workflow point.", "smart_skip_rules": "Skip only when the source condition is false, and name every skipped module with evidence.", "pushback_rules": "Preserve the source forcing questions, recommendation pressure, and one-question-at-a-time cadence.", "stop_gates": "Preserve every STOP, hard gate, approval boundary, and no-mutation-before-approval rule.", @@ -2924,7 +2924,7 @@ "voice": "Direct builder voice; match the user language and retain source-specific tone constraints.", "response_posture": "Direct, evidence-first builder language; preserve source-specific recommendations and constructive pressure.", "new_location": "skills/qa/references/legacy/setup-browser-cookies.md", - "parity_test": "evals/parity/contracts/setup-browser-cookies.json + scripts/gstack2/run-parity.ts normalized full-body equality" + "parity_test": "evals/parity/contracts/setup-browser-cookies.json + scripts/gstack2/run-parity.ts canonical specialist render, excluded-wrapper, lazy-section, and pinned-source provenance checks" }, { "source": "pair-agent", @@ -2934,7 +2934,7 @@ "source_path": "pair-agent/SKILL.md.tmpl", "base_sha": "bb57306d98c97011b0919c6132705a15b1579781", "blob_sha": "75ed42d590f99c46cd0883c37bb1f2f9f499211c", - "normalized_render_sha256": "27e34ef8e4157d94866d5f0c8ab9aff747483d86acd9702bf721cfb8962c07e5", + "normalized_render_sha256": "6882bc549c689ff50fb06d5e72a597939aa651926c50067330d1e6fd86cd6b58", "target": "skills/qa/references/legacy/pair-agent.md", "disposition": "BUG_FIX", "overlays": [ @@ -2949,7 +2949,7 @@ "legacy_alias": "browser-pair" }, "question_sequence": "Preserve the source workflow order; gather prerequisites before consequential questions.", - "follow_up_behavior": "The complete source follow-up sequence is preserved verbatim inside new_location and hash-compared to the pinned base.", + "follow_up_behavior": "Specialist follow-up order is preserved from the pinned source. The retired 1.x shared onboarding wrapper is excluded, and carved specialist phases are package-local lazy references loaded at their original workflow point.", "smart_skip_rules": "Skip only when the source condition is false, and name every skipped module with evidence.", "pushback_rules": "Preserve the source forcing questions, recommendation pressure, and one-question-at-a-time cadence.", "stop_gates": "Preserve every STOP, hard gate, approval boundary, and no-mutation-before-approval rule.", @@ -3007,7 +3007,7 @@ "voice": "Direct builder voice; match the user language and retain source-specific tone constraints.", "response_posture": "Direct, evidence-first builder language; preserve source-specific recommendations and constructive pressure.", "new_location": "skills/qa/references/legacy/pair-agent.md", - "parity_test": "evals/parity/contracts/pair-agent.json + scripts/gstack2/run-parity.ts normalized full-body equality" + "parity_test": "evals/parity/contracts/pair-agent.json + scripts/gstack2/run-parity.ts canonical specialist render, excluded-wrapper, lazy-section, and pinned-source provenance checks" }, { "source": "scrape", @@ -3017,7 +3017,7 @@ "source_path": "scrape/SKILL.md.tmpl", "base_sha": "bb57306d98c97011b0919c6132705a15b1579781", "blob_sha": "4cb4f17c074edcdce0bc8d133f19a6a739964851", - "normalized_render_sha256": "bc7d6ed483f239a45d137ca790c23f3c3add4aaab028ca4950e83e25936ebc79", + "normalized_render_sha256": "03ef708a4c9a1f3de961c48767617502c564690faa7240b3ca39b20496a17f98", "target": "skills/qa/references/legacy/scrape.md", "disposition": "BUG_FIX", "overlays": [ @@ -3033,7 +3033,7 @@ "legacy_alias": "scrape" }, "question_sequence": "Preserve the source workflow order; gather prerequisites before consequential questions.", - "follow_up_behavior": "The complete source follow-up sequence is preserved verbatim inside new_location and hash-compared to the pinned base.", + "follow_up_behavior": "Specialist follow-up order is preserved from the pinned source. The retired 1.x shared onboarding wrapper is excluded, and carved specialist phases are package-local lazy references loaded at their original workflow point.", "smart_skip_rules": "Skip only when the source condition is false, and name every skipped module with evidence.", "pushback_rules": "Preserve the source forcing questions, recommendation pressure, and one-question-at-a-time cadence.", "stop_gates": "Preserve every STOP, hard gate, approval boundary, and no-mutation-before-approval rule.", @@ -3084,7 +3084,7 @@ "voice": "Direct builder voice; match the user language and retain source-specific tone constraints.", "response_posture": "Direct, evidence-first builder language; preserve source-specific recommendations and constructive pressure.", "new_location": "skills/qa/references/legacy/scrape.md", - "parity_test": "evals/parity/contracts/scrape.json + scripts/gstack2/run-parity.ts normalized full-body equality" + "parity_test": "evals/parity/contracts/scrape.json + scripts/gstack2/run-parity.ts canonical specialist render, excluded-wrapper, lazy-section, and pinned-source provenance checks" }, { "source": "skillify", @@ -3094,7 +3094,7 @@ "source_path": "skillify/SKILL.md.tmpl", "base_sha": "bb57306d98c97011b0919c6132705a15b1579781", "blob_sha": "21fb2f503e3d40683fa782b21abf05a8f0fef69b", - "normalized_render_sha256": "13920affe83c53e5d459a077b68433682fd6c445389bf2024d2e5f4d5a021994", + "normalized_render_sha256": "b0743c957157e19bd90b457fd3ac9d6924c3aedce969c10af8d7973c2bcd6c9f", "target": "skills/qa/references/legacy/skillify.md", "disposition": "BUG_FIX", "overlays": [ @@ -3110,7 +3110,7 @@ "legacy_alias": "skillify" }, "question_sequence": "Preserve the source workflow order; gather prerequisites before consequential questions.", - "follow_up_behavior": "The complete source follow-up sequence is preserved verbatim inside new_location and hash-compared to the pinned base.", + "follow_up_behavior": "Specialist follow-up order is preserved from the pinned source. The retired 1.x shared onboarding wrapper is excluded, and carved specialist phases are package-local lazy references loaded at their original workflow point.", "smart_skip_rules": "Skip only when the source condition is false, and name every skipped module with evidence.", "pushback_rules": "Preserve the source forcing questions, recommendation pressure, and one-question-at-a-time cadence.", "stop_gates": "Preserve every STOP, hard gate, approval boundary, and no-mutation-before-approval rule.", @@ -3167,7 +3167,7 @@ "voice": "Direct builder voice; match the user language and retain source-specific tone constraints.", "response_posture": "Direct, evidence-first builder language; preserve source-specific recommendations and constructive pressure.", "new_location": "skills/qa/references/legacy/skillify.md", - "parity_test": "evals/parity/contracts/skillify.json + scripts/gstack2/run-parity.ts normalized full-body equality" + "parity_test": "evals/parity/contracts/skillify.json + scripts/gstack2/run-parity.ts canonical specialist render, excluded-wrapper, lazy-section, and pinned-source provenance checks" }, { "source": "benchmark-models", @@ -3177,7 +3177,7 @@ "source_path": "benchmark-models/SKILL.md.tmpl", "base_sha": "bb57306d98c97011b0919c6132705a15b1579781", "blob_sha": "034cda182406dc04a82c4336ac3ebc36b5fc41b1", - "normalized_render_sha256": "d67d1f22c7f65c286a905ec60143d057e3b8b29a548ac53a88272b886ef26b31", + "normalized_render_sha256": "2ef0679d45f21bacc09cd774ff96bb3b82853a8e89d8606847c4f9416a47a48b", "target": "skills/qa/references/legacy/benchmark-models.md", "disposition": "BUG_FIX", "overlays": [ @@ -3192,7 +3192,7 @@ "legacy_alias": "model-benchmark" }, "question_sequence": "Preserve the source workflow order; gather prerequisites before consequential questions.", - "follow_up_behavior": "The complete source follow-up sequence is preserved verbatim inside new_location and hash-compared to the pinned base.", + "follow_up_behavior": "Specialist follow-up order is preserved from the pinned source. The retired 1.x shared onboarding wrapper is excluded, and carved specialist phases are package-local lazy references loaded at their original workflow point.", "smart_skip_rules": "Skip only when the source condition is false, and name every skipped module with evidence.", "pushback_rules": "Preserve the source forcing questions, recommendation pressure, and one-question-at-a-time cadence.", "stop_gates": "Preserve every STOP, hard gate, approval boundary, and no-mutation-before-approval rule.", @@ -3227,7 +3227,7 @@ "voice": "Direct builder voice; match the user language and retain source-specific tone constraints.", "response_posture": "Direct, evidence-first builder language; preserve source-specific recommendations and constructive pressure.", "new_location": "skills/qa/references/legacy/benchmark-models.md", - "parity_test": "evals/parity/contracts/benchmark-models.json + scripts/gstack2/run-parity.ts normalized full-body equality" + "parity_test": "evals/parity/contracts/benchmark-models.json + scripts/gstack2/run-parity.ts canonical specialist render, excluded-wrapper, lazy-section, and pinned-source provenance checks" }, { "source": "investigate", @@ -3237,7 +3237,7 @@ "source_path": "investigate/SKILL.md.tmpl", "base_sha": "bb57306d98c97011b0919c6132705a15b1579781", "blob_sha": "67e254d743ffb9060f48e3f6d4b715c077ee688d", - "normalized_render_sha256": "23e220a2d61b665f9e48b094855336fac3ca9187be12675cb721db2bc27f7c30", + "normalized_render_sha256": "91f19c8d736a9a6077941f63f52853634325059e5ac4d8808c4ba6dbceca1a30", "target": "skills/debug/references/legacy/investigate.md", "disposition": "BUG_FIX", "overlays": [ @@ -3254,7 +3254,7 @@ "legacy_alias": "investigate" }, "question_sequence": "Preserve the source workflow order; gather prerequisites before consequential questions.", - "follow_up_behavior": "The complete source follow-up sequence is preserved verbatim inside new_location and hash-compared to the pinned base.", + "follow_up_behavior": "Specialist follow-up order is preserved from the pinned source. The retired 1.x shared onboarding wrapper is excluded, and carved specialist phases are package-local lazy references loaded at their original workflow point.", "smart_skip_rules": "Skip only when the source condition is false, and name every skipped module with evidence.", "pushback_rules": "Preserve the source forcing questions, recommendation pressure, and one-question-at-a-time cadence.", "stop_gates": "Preserve every STOP, hard gate, approval boundary, and no-mutation-before-approval rule.", @@ -3305,7 +3305,7 @@ "voice": "Direct builder voice; match the user language and retain source-specific tone constraints.", "response_posture": "Direct, evidence-first builder language; preserve source-specific recommendations and constructive pressure.", "new_location": "skills/debug/references/legacy/investigate.md", - "parity_test": "evals/parity/contracts/investigate.json + scripts/gstack2/run-parity.ts normalized full-body equality" + "parity_test": "evals/parity/contracts/investigate.json + scripts/gstack2/run-parity.ts canonical specialist render, excluded-wrapper, lazy-section, and pinned-source provenance checks" }, { "source": "ios-fix", @@ -3315,7 +3315,7 @@ "source_path": "ios-fix/SKILL.md.tmpl", "base_sha": "bb57306d98c97011b0919c6132705a15b1579781", "blob_sha": "94655e282f535b846eada11143e95df58d29263b", - "normalized_render_sha256": "1a94ad8852821684d4806b10c5464f7adef80cb28817800f1e88dfe808f0a26d", + "normalized_render_sha256": "cc38b71471c1fefc015419e768c5b40f060f03b232cbad850cd7d9c985a6cc90", "target": "skills/debug/references/legacy/ios-fix.md", "disposition": "BUG_FIX", "overlays": [ @@ -3330,7 +3330,7 @@ "legacy_alias": "ios-fix" }, "question_sequence": "Preserve the source workflow order; gather prerequisites before consequential questions.", - "follow_up_behavior": "The complete source follow-up sequence is preserved verbatim inside new_location and hash-compared to the pinned base.", + "follow_up_behavior": "Specialist follow-up order is preserved from the pinned source. The retired 1.x shared onboarding wrapper is excluded, and carved specialist phases are package-local lazy references loaded at their original workflow point.", "smart_skip_rules": "Skip only when the source condition is false, and name every skipped module with evidence.", "pushback_rules": "Preserve the source forcing questions, recommendation pressure, and one-question-at-a-time cadence.", "stop_gates": "Preserve every STOP, hard gate, approval boundary, and no-mutation-before-approval rule.", @@ -3379,7 +3379,7 @@ "voice": "Direct builder voice; match the user language and retain source-specific tone constraints.", "response_posture": "Direct, evidence-first builder language; preserve source-specific recommendations and constructive pressure.", "new_location": "skills/debug/references/legacy/ios-fix.md", - "parity_test": "evals/parity/contracts/ios-fix.json + scripts/gstack2/run-parity.ts normalized full-body equality" + "parity_test": "evals/parity/contracts/ios-fix.json + scripts/gstack2/run-parity.ts canonical specialist render, excluded-wrapper, lazy-section, and pinned-source provenance checks" }, { "source": "careful", @@ -3389,7 +3389,7 @@ "source_path": "careful/SKILL.md.tmpl", "base_sha": "bb57306d98c97011b0919c6132705a15b1579781", "blob_sha": "5c128a00e180bec4fad281486d3ca8c02dc67e7e", - "normalized_render_sha256": "9c806d1102794aeab5c83990c72dcadc7bdad7134f3962da5609ab13bc7feb0f", + "normalized_render_sha256": "f5fe3aa0755e04ad328ed67a4e42c21d9f9b5509167a69d91158a59cce8111ea", "target": "skills/debug/references/legacy/careful.md", "disposition": "BUG_FIX", "overlays": [ @@ -3404,7 +3404,7 @@ "legacy_alias": "careful" }, "question_sequence": "Preserve the source workflow order; gather prerequisites before consequential questions.", - "follow_up_behavior": "The complete source follow-up sequence is preserved verbatim inside new_location and hash-compared to the pinned base.", + "follow_up_behavior": "Specialist follow-up order is preserved from the pinned source. The retired 1.x shared onboarding wrapper is excluded, and carved specialist phases are package-local lazy references loaded at their original workflow point.", "smart_skip_rules": "Skip only when the source condition is false, and name every skipped module with evidence.", "pushback_rules": "Preserve the source forcing questions, recommendation pressure, and one-question-at-a-time cadence.", "stop_gates": "Preserve every STOP, hard gate, approval boundary, and no-mutation-before-approval rule.", @@ -3423,7 +3423,7 @@ "voice": "Direct builder voice; match the user language and retain source-specific tone constraints.", "response_posture": "Direct, evidence-first builder language; preserve source-specific recommendations and constructive pressure.", "new_location": "skills/debug/references/legacy/careful.md", - "parity_test": "evals/parity/contracts/careful.json + scripts/gstack2/run-parity.ts normalized full-body equality" + "parity_test": "evals/parity/contracts/careful.json + scripts/gstack2/run-parity.ts canonical specialist render, excluded-wrapper, lazy-section, and pinned-source provenance checks" }, { "source": "freeze", @@ -3433,7 +3433,7 @@ "source_path": "freeze/SKILL.md.tmpl", "base_sha": "bb57306d98c97011b0919c6132705a15b1579781", "blob_sha": "c0b31aa7f9f216fc5a351d91f4bcff68c828d090", - "normalized_render_sha256": "8beec3080fd0d6566b6ecf188d110d7283fb808fbc7c7201ee234191f9d3c5cd", + "normalized_render_sha256": "433bb7c1909852c83978ae282c582590c5136abe56020e7d0be39749822c345b", "target": "skills/debug/references/legacy/freeze.md", "disposition": "BUG_FIX", "overlays": [ @@ -3448,7 +3448,7 @@ "legacy_alias": "freeze" }, "question_sequence": "Preserve the source workflow order; gather prerequisites before consequential questions.", - "follow_up_behavior": "The complete source follow-up sequence is preserved verbatim inside new_location and hash-compared to the pinned base.", + "follow_up_behavior": "Specialist follow-up order is preserved from the pinned source. The retired 1.x shared onboarding wrapper is excluded, and carved specialist phases are package-local lazy references loaded at their original workflow point.", "smart_skip_rules": "Skip only when the source condition is false, and name every skipped module with evidence.", "pushback_rules": "Preserve the source forcing questions, recommendation pressure, and one-question-at-a-time cadence.", "stop_gates": "Preserve every STOP, hard gate, approval boundary, and no-mutation-before-approval rule.", @@ -3467,7 +3467,7 @@ "voice": "Direct builder voice; match the user language and retain source-specific tone constraints.", "response_posture": "Direct, evidence-first builder language; preserve source-specific recommendations and constructive pressure.", "new_location": "skills/debug/references/legacy/freeze.md", - "parity_test": "evals/parity/contracts/freeze.json + scripts/gstack2/run-parity.ts normalized full-body equality" + "parity_test": "evals/parity/contracts/freeze.json + scripts/gstack2/run-parity.ts canonical specialist render, excluded-wrapper, lazy-section, and pinned-source provenance checks" }, { "source": "guard", @@ -3477,7 +3477,7 @@ "source_path": "guard/SKILL.md.tmpl", "base_sha": "bb57306d98c97011b0919c6132705a15b1579781", "blob_sha": "3d34ee0c181ec7b263bf6092ba8f384619c5efb6", - "normalized_render_sha256": "2040b2d9c7e587f254296abb394c655da37fe25305f4e44dc2d736053595cdfb", + "normalized_render_sha256": "ff8170babcc9ad20f6de292db838d2c4545f0ed98dddd184ab5e7c52c073dc7e", "target": "skills/debug/references/legacy/guard.md", "disposition": "BUG_FIX", "overlays": [ @@ -3492,7 +3492,7 @@ "legacy_alias": "guard" }, "question_sequence": "Preserve the source workflow order; gather prerequisites before consequential questions.", - "follow_up_behavior": "The complete source follow-up sequence is preserved verbatim inside new_location and hash-compared to the pinned base.", + "follow_up_behavior": "Specialist follow-up order is preserved from the pinned source. The retired 1.x shared onboarding wrapper is excluded, and carved specialist phases are package-local lazy references loaded at their original workflow point.", "smart_skip_rules": "Skip only when the source condition is false, and name every skipped module with evidence.", "pushback_rules": "Preserve the source forcing questions, recommendation pressure, and one-question-at-a-time cadence.", "stop_gates": "Preserve every STOP, hard gate, approval boundary, and no-mutation-before-approval rule.", @@ -3510,7 +3510,7 @@ "voice": "Direct builder voice; match the user language and retain source-specific tone constraints.", "response_posture": "Direct, evidence-first builder language; preserve source-specific recommendations and constructive pressure.", "new_location": "skills/debug/references/legacy/guard.md", - "parity_test": "evals/parity/contracts/guard.json + scripts/gstack2/run-parity.ts normalized full-body equality" + "parity_test": "evals/parity/contracts/guard.json + scripts/gstack2/run-parity.ts canonical specialist render, excluded-wrapper, lazy-section, and pinned-source provenance checks" }, { "source": "unfreeze", @@ -3520,7 +3520,7 @@ "source_path": "unfreeze/SKILL.md.tmpl", "base_sha": "bb57306d98c97011b0919c6132705a15b1579781", "blob_sha": "88e413fe5a49a45d46d8867b2d80ace30b3b45aa", - "normalized_render_sha256": "9128912f4c79a423d4e52a7a27a9c560bf7ab58e85bcf32db1442f4ded6576ae", + "normalized_render_sha256": "51d6183901e866697382b7e900e2154e8bfb6a9ebf4f3e1bb3ad29925fad0e20", "target": "skills/debug/references/legacy/unfreeze.md", "disposition": "BUG_FIX", "overlays": [ @@ -3535,7 +3535,7 @@ "legacy_alias": "unfreeze" }, "question_sequence": "Preserve the source workflow order; gather prerequisites before consequential questions.", - "follow_up_behavior": "The complete source follow-up sequence is preserved verbatim inside new_location and hash-compared to the pinned base.", + "follow_up_behavior": "Specialist follow-up order is preserved from the pinned source. The retired 1.x shared onboarding wrapper is excluded, and carved specialist phases are package-local lazy references loaded at their original workflow point.", "smart_skip_rules": "Skip only when the source condition is false, and name every skipped module with evidence.", "pushback_rules": "Preserve the source forcing questions, recommendation pressure, and one-question-at-a-time cadence.", "stop_gates": "Preserve every STOP, hard gate, approval boundary, and no-mutation-before-approval rule.", @@ -3552,7 +3552,7 @@ "voice": "Direct builder voice; match the user language and retain source-specific tone constraints.", "response_posture": "Direct, evidence-first builder language; preserve source-specific recommendations and constructive pressure.", "new_location": "skills/debug/references/legacy/unfreeze.md", - "parity_test": "evals/parity/contracts/unfreeze.json + scripts/gstack2/run-parity.ts normalized full-body equality" + "parity_test": "evals/parity/contracts/unfreeze.json + scripts/gstack2/run-parity.ts canonical specialist render, excluded-wrapper, lazy-section, and pinned-source provenance checks" }, { "source": "review", @@ -3562,7 +3562,7 @@ "source_path": "review/SKILL.md.tmpl", "base_sha": "bb57306d98c97011b0919c6132705a15b1579781", "blob_sha": "ba1ea88068de4b09cf717eb4ae42aa247d198314", - "normalized_render_sha256": "25e07cb6ea0831bd9e7bd7d4606714ba38b743107a970f2b6491a246b90c7dd4", + "normalized_render_sha256": "9d6398fe0d2900fcce8ae1eb0b390e21f05c94d6ae3a4e21c911025cdc1fd963", "target": "skills/review/references/legacy/review.md", "disposition": "BUG_FIX", "overlays": [ @@ -3581,7 +3581,7 @@ "legacy_alias": "diff" }, "question_sequence": "Preserve the source workflow order; gather prerequisites before consequential questions.", - "follow_up_behavior": "The complete source follow-up sequence is preserved verbatim inside new_location and hash-compared to the pinned base.", + "follow_up_behavior": "Specialist follow-up order is preserved from the pinned source. The retired 1.x shared onboarding wrapper is excluded, and carved specialist phases are package-local lazy references loaded at their original workflow point.", "smart_skip_rules": "Skip only when the source condition is false, and name every skipped module with evidence.", "pushback_rules": "Preserve the source forcing questions, recommendation pressure, and one-question-at-a-time cadence.", "stop_gates": "Preserve every STOP, hard gate, approval boundary, and no-mutation-before-approval rule.", @@ -3657,7 +3657,7 @@ "voice": "Direct builder voice; match the user language and retain source-specific tone constraints.", "response_posture": "Direct, evidence-first builder language; preserve source-specific recommendations and constructive pressure.", "new_location": "skills/review/references/legacy/review.md", - "parity_test": "evals/parity/contracts/review.json + scripts/gstack2/run-parity.ts normalized full-body equality" + "parity_test": "evals/parity/contracts/review.json + scripts/gstack2/run-parity.ts canonical specialist render, excluded-wrapper, lazy-section, and pinned-source provenance checks" }, { "source": "cso", @@ -3667,7 +3667,7 @@ "source_path": "cso/SKILL.md.tmpl", "base_sha": "bb57306d98c97011b0919c6132705a15b1579781", "blob_sha": "413fb099597b55dadca116e45a202aa693a94b74", - "normalized_render_sha256": "59017ba27aaa93a62bda7ddca3c995f7231edb3fa86009e555b724b43fc1afd7", + "normalized_render_sha256": "2cecaf39e950a0ec848f85c11f9678b6a7644c0251c07be42cd52d4b2e6b61a6", "target": "skills/review/references/legacy/cso.md", "disposition": "BUG_FIX", "overlays": [ @@ -3683,7 +3683,7 @@ "legacy_alias": "security" }, "question_sequence": "Preserve the source workflow order; gather prerequisites before consequential questions.", - "follow_up_behavior": "The complete source follow-up sequence is preserved verbatim inside new_location and hash-compared to the pinned base.", + "follow_up_behavior": "Specialist follow-up order is preserved from the pinned source. The retired 1.x shared onboarding wrapper is excluded, and carved specialist phases are package-local lazy references loaded at their original workflow point.", "smart_skip_rules": "Skip only when the source condition is false, and name every skipped module with evidence.", "pushback_rules": "Preserve the source forcing questions, recommendation pressure, and one-question-at-a-time cadence.", "stop_gates": "Preserve every STOP, hard gate, approval boundary, and no-mutation-before-approval rule.", @@ -3759,7 +3759,7 @@ "voice": "Direct builder voice; match the user language and retain source-specific tone constraints.", "response_posture": "Direct, evidence-first builder language; preserve source-specific recommendations and constructive pressure.", "new_location": "skills/review/references/legacy/cso.md", - "parity_test": "evals/parity/contracts/cso.json + scripts/gstack2/run-parity.ts normalized full-body equality" + "parity_test": "evals/parity/contracts/cso.json + scripts/gstack2/run-parity.ts canonical specialist render, excluded-wrapper, lazy-section, and pinned-source provenance checks" }, { "source": "health", @@ -3769,7 +3769,7 @@ "source_path": "health/SKILL.md.tmpl", "base_sha": "bb57306d98c97011b0919c6132705a15b1579781", "blob_sha": "f92eb7347ec4f77dd8dbf464d63fcdf6a3459908", - "normalized_render_sha256": "3e478e5673d54ce0e227e589ab0800bd14de65cb8df4e12661e330b57018465c", + "normalized_render_sha256": "ff664221e7de57e66c1b45d719982d90f38e0288914b34731ba4dd73541347e8", "target": "skills/review/references/legacy/health.md", "disposition": "BUG_FIX", "overlays": [ @@ -3784,7 +3784,7 @@ "legacy_alias": "health" }, "question_sequence": "Preserve the source workflow order; gather prerequisites before consequential questions.", - "follow_up_behavior": "The complete source follow-up sequence is preserved verbatim inside new_location and hash-compared to the pinned base.", + "follow_up_behavior": "Specialist follow-up order is preserved from the pinned source. The retired 1.x shared onboarding wrapper is excluded, and carved specialist phases are package-local lazy references loaded at their original workflow point.", "smart_skip_rules": "Skip only when the source condition is false, and name every skipped module with evidence.", "pushback_rules": "Preserve the source forcing questions, recommendation pressure, and one-question-at-a-time cadence.", "stop_gates": "Preserve every STOP, hard gate, approval boundary, and no-mutation-before-approval rule.", @@ -3832,7 +3832,7 @@ "voice": "Direct builder voice; match the user language and retain source-specific tone constraints.", "response_posture": "Direct, evidence-first builder language; preserve source-specific recommendations and constructive pressure.", "new_location": "skills/review/references/legacy/health.md", - "parity_test": "evals/parity/contracts/health.json + scripts/gstack2/run-parity.ts normalized full-body equality" + "parity_test": "evals/parity/contracts/health.json + scripts/gstack2/run-parity.ts canonical specialist render, excluded-wrapper, lazy-section, and pinned-source provenance checks" }, { "source": "codex", @@ -3842,7 +3842,7 @@ "source_path": "codex/SKILL.md.tmpl", "base_sha": "bb57306d98c97011b0919c6132705a15b1579781", "blob_sha": "333de7d8d590cc78184b0e2371171f6121408f73", - "normalized_render_sha256": "5621d3e33242350806eb3489b5c933c5ebaa5105f250e941c4205962c447b28d", + "normalized_render_sha256": "0df6ff685d230f87763b4c43f957e20854fe1319d78247d683e5250e2accb188", "target": "skills/review/references/legacy/codex.md", "disposition": "BUG_FIX", "overlays": [ @@ -3857,7 +3857,7 @@ "legacy_alias": "outside-codex" }, "question_sequence": "Preserve the source workflow order; gather prerequisites before consequential questions.", - "follow_up_behavior": "The complete source follow-up sequence is preserved verbatim inside new_location and hash-compared to the pinned base.", + "follow_up_behavior": "Specialist follow-up order is preserved from the pinned source. The retired 1.x shared onboarding wrapper is excluded, and carved specialist phases are package-local lazy references loaded at their original workflow point.", "smart_skip_rules": "Skip only when the source condition is false, and name every skipped module with evidence.", "pushback_rules": "Preserve the source forcing questions, recommendation pressure, and one-question-at-a-time cadence.", "stop_gates": "Preserve every STOP, hard gate, approval boundary, and no-mutation-before-approval rule.", @@ -3914,7 +3914,7 @@ "voice": "Direct builder voice; match the user language and retain source-specific tone constraints.", "response_posture": "Direct, evidence-first builder language; preserve source-specific recommendations and constructive pressure.", "new_location": "skills/review/references/legacy/codex.md", - "parity_test": "evals/parity/contracts/codex.json + scripts/gstack2/run-parity.ts normalized full-body equality" + "parity_test": "evals/parity/contracts/codex.json + scripts/gstack2/run-parity.ts canonical specialist render, excluded-wrapper, lazy-section, and pinned-source provenance checks" }, { "source": "claude", @@ -3924,7 +3924,7 @@ "source_path": "claude/SKILL.md.tmpl", "base_sha": "bb57306d98c97011b0919c6132705a15b1579781", "blob_sha": "94552cbe4efebc908f70f03880e584879db80aca", - "normalized_render_sha256": "f8b5964bf630d0716ad5cfd729f6d4e62bb89d4eab64a210090fb0e875f0b59d", + "normalized_render_sha256": "e0257ec3df4432da9b0fb10e6af66da8ed15548a3fae987778fc14a6747f4b30", "target": "skills/review/references/legacy/claude.md", "disposition": "BUG_FIX", "overlays": [ @@ -3939,7 +3939,7 @@ "legacy_alias": "outside-claude" }, "question_sequence": "Preserve the source workflow order; gather prerequisites before consequential questions.", - "follow_up_behavior": "The complete source follow-up sequence is preserved verbatim inside new_location and hash-compared to the pinned base.", + "follow_up_behavior": "Specialist follow-up order is preserved from the pinned source. The retired 1.x shared onboarding wrapper is excluded, and carved specialist phases are package-local lazy references loaded at their original workflow point.", "smart_skip_rules": "Skip only when the source condition is false, and name every skipped module with evidence.", "pushback_rules": "Preserve the source forcing questions, recommendation pressure, and one-question-at-a-time cadence.", "stop_gates": "Preserve every STOP, hard gate, approval boundary, and no-mutation-before-approval rule.", @@ -3991,7 +3991,7 @@ "voice": "Direct builder voice; match the user language and retain source-specific tone constraints.", "response_posture": "Direct, evidence-first builder language; preserve source-specific recommendations and constructive pressure.", "new_location": "skills/review/references/legacy/claude.md", - "parity_test": "evals/parity/contracts/claude.json + scripts/gstack2/run-parity.ts normalized full-body equality" + "parity_test": "evals/parity/contracts/claude.json + scripts/gstack2/run-parity.ts canonical specialist render, excluded-wrapper, lazy-section, and pinned-source provenance checks" }, { "source": "ship", @@ -4001,7 +4001,7 @@ "source_path": "ship/SKILL.md.tmpl", "base_sha": "bb57306d98c97011b0919c6132705a15b1579781", "blob_sha": "068ac4fe54bcb46572295d48263b11bd38fcde18", - "normalized_render_sha256": "b2f1d5bc59ec1a35fb367cc242131dc288ca1c9cf1baa8cefe9165b45f9841bc", + "normalized_render_sha256": "ab7a7219653b0fc5cdad0bb2959394798bc50ae4db4dc24b76c0454dd1b1397a", "target": "skills/ship/references/legacy/ship.md", "disposition": "BUG_FIX", "overlays": [ @@ -4019,7 +4019,7 @@ "legacy_alias": "ship" }, "question_sequence": "Preserve the source workflow order; gather prerequisites before consequential questions.", - "follow_up_behavior": "The complete source follow-up sequence is preserved verbatim inside new_location and hash-compared to the pinned base.", + "follow_up_behavior": "Specialist follow-up order is preserved from the pinned source. The retired 1.x shared onboarding wrapper is excluded, and carved specialist phases are package-local lazy references loaded at their original workflow point.", "smart_skip_rules": "Skip only when the source condition is false, and name every skipped module with evidence.", "pushback_rules": "Preserve the source forcing questions, recommendation pressure, and one-question-at-a-time cadence.", "stop_gates": "Preserve every STOP, hard gate, approval boundary, and no-mutation-before-approval rule.", @@ -4126,7 +4126,7 @@ "voice": "Direct builder voice; match the user language and retain source-specific tone constraints.", "response_posture": "Direct, evidence-first builder language; preserve source-specific recommendations and constructive pressure.", "new_location": "skills/ship/references/legacy/ship.md", - "parity_test": "evals/parity/contracts/ship.json + scripts/gstack2/run-parity.ts normalized full-body equality" + "parity_test": "evals/parity/contracts/ship.json + scripts/gstack2/run-parity.ts canonical specialist render, excluded-wrapper, lazy-section, and pinned-source provenance checks" }, { "source": "land-and-deploy", @@ -4136,7 +4136,7 @@ "source_path": "land-and-deploy/SKILL.md.tmpl", "base_sha": "bb57306d98c97011b0919c6132705a15b1579781", "blob_sha": "98976ad020d541d251cc7e34802a13458ddc88e2", - "normalized_render_sha256": "d17a1d9f397b57f59c5cced24c07c35e3950050612dba9c36bb68c4997f03a2f", + "normalized_render_sha256": "3fab0678a9a7a76664330c74db2bd25b56c335ac72ce4e691c2f2564a7ede819", "target": "skills/ship/references/legacy/land-and-deploy.md", "disposition": "BUG_FIX", "overlays": [ @@ -4152,7 +4152,7 @@ "legacy_alias": "land" }, "question_sequence": "Preserve the source workflow order; gather prerequisites before consequential questions.", - "follow_up_behavior": "The complete source follow-up sequence is preserved verbatim inside new_location and hash-compared to the pinned base.", + "follow_up_behavior": "Specialist follow-up order is preserved from the pinned source. The retired 1.x shared onboarding wrapper is excluded, and carved specialist phases are package-local lazy references loaded at their original workflow point.", "smart_skip_rules": "Skip only when the source condition is false, and name every skipped module with evidence.", "pushback_rules": "Preserve the source forcing questions, recommendation pressure, and one-question-at-a-time cadence.", "stop_gates": "Preserve every STOP, hard gate, approval boundary, and no-mutation-before-approval rule.", @@ -4234,7 +4234,7 @@ "voice": "Direct builder voice; match the user language and retain source-specific tone constraints.", "response_posture": "Direct, evidence-first builder language; preserve source-specific recommendations and constructive pressure.", "new_location": "skills/ship/references/legacy/land-and-deploy.md", - "parity_test": "evals/parity/contracts/land-and-deploy.json + scripts/gstack2/run-parity.ts normalized full-body equality" + "parity_test": "evals/parity/contracts/land-and-deploy.json + scripts/gstack2/run-parity.ts canonical specialist render, excluded-wrapper, lazy-section, and pinned-source provenance checks" }, { "source": "landing-report", @@ -4244,7 +4244,7 @@ "source_path": "landing-report/SKILL.md.tmpl", "base_sha": "bb57306d98c97011b0919c6132705a15b1579781", "blob_sha": "32a8cc1ab036b1ff8692f0400b68d8b56224a251", - "normalized_render_sha256": "64c9e05978be3c8d900dc9b9b4dd77e495776718d77e7b926ff6c5250b825a01", + "normalized_render_sha256": "4f9512bafcfd995c4c35cdff869ed60f8a9a9ef12f20bc18bf7b898cbd2faa53", "target": "skills/ship/references/legacy/landing-report.md", "disposition": "BUG_FIX", "overlays": [ @@ -4259,7 +4259,7 @@ "legacy_alias": "queue" }, "question_sequence": "Preserve the source workflow order; gather prerequisites before consequential questions.", - "follow_up_behavior": "The complete source follow-up sequence is preserved verbatim inside new_location and hash-compared to the pinned base.", + "follow_up_behavior": "Specialist follow-up order is preserved from the pinned source. The retired 1.x shared onboarding wrapper is excluded, and carved specialist phases are package-local lazy references loaded at their original workflow point.", "smart_skip_rules": "Skip only when the source condition is false, and name every skipped module with evidence.", "pushback_rules": "Preserve the source forcing questions, recommendation pressure, and one-question-at-a-time cadence.", "stop_gates": "Preserve every STOP, hard gate, approval boundary, and no-mutation-before-approval rule.", @@ -4308,7 +4308,7 @@ "voice": "Direct builder voice; match the user language and retain source-specific tone constraints.", "response_posture": "Direct, evidence-first builder language; preserve source-specific recommendations and constructive pressure.", "new_location": "skills/ship/references/legacy/landing-report.md", - "parity_test": "evals/parity/contracts/landing-report.json + scripts/gstack2/run-parity.ts normalized full-body equality" + "parity_test": "evals/parity/contracts/landing-report.json + scripts/gstack2/run-parity.ts canonical specialist render, excluded-wrapper, lazy-section, and pinned-source provenance checks" }, { "source": "document-release", @@ -4318,7 +4318,7 @@ "source_path": "document-release/SKILL.md.tmpl", "base_sha": "bb57306d98c97011b0919c6132705a15b1579781", "blob_sha": "7621cb31290217b5c7cc8fb000e910b3dd38128f", - "normalized_render_sha256": "369c595ec2fac76f441d008401929295898e98a5c521d176bafbe4af0e6054f9", + "normalized_render_sha256": "e5aa85ac93b36b638d075d152f9d7108c0108727056f61331b25fe33de569a59", "target": "skills/ship/references/legacy/document-release.md", "disposition": "BUG_FIX", "overlays": [ @@ -4333,7 +4333,7 @@ "legacy_alias": "docs" }, "question_sequence": "Preserve the source workflow order; gather prerequisites before consequential questions.", - "follow_up_behavior": "The complete source follow-up sequence is preserved verbatim inside new_location and hash-compared to the pinned base.", + "follow_up_behavior": "Specialist follow-up order is preserved from the pinned source. The retired 1.x shared onboarding wrapper is excluded, and carved specialist phases are package-local lazy references loaded at their original workflow point.", "smart_skip_rules": "Skip only when the source condition is false, and name every skipped module with evidence.", "pushback_rules": "Preserve the source forcing questions, recommendation pressure, and one-question-at-a-time cadence.", "stop_gates": "Preserve every STOP, hard gate, approval boundary, and no-mutation-before-approval rule.", @@ -4385,7 +4385,7 @@ "voice": "Direct builder voice; match the user language and retain source-specific tone constraints.", "response_posture": "Direct, evidence-first builder language; preserve source-specific recommendations and constructive pressure.", "new_location": "skills/ship/references/legacy/document-release.md", - "parity_test": "evals/parity/contracts/document-release.json + scripts/gstack2/run-parity.ts normalized full-body equality" + "parity_test": "evals/parity/contracts/document-release.json + scripts/gstack2/run-parity.ts canonical specialist render, excluded-wrapper, lazy-section, and pinned-source provenance checks" }, { "source": "setup-deploy", @@ -4395,7 +4395,7 @@ "source_path": "setup-deploy/SKILL.md.tmpl", "base_sha": "bb57306d98c97011b0919c6132705a15b1579781", "blob_sha": "587a993c01b6964b5437534527f25368cc265ec9", - "normalized_render_sha256": "796e0aefff64a98a33fd93028247bf76b8073121487cae13b66ad3081f551a87", + "normalized_render_sha256": "6c5998d60249939fd09253e55f8e66338b2223083e8b3329df745553fbdeeda0", "target": "skills/ship/references/legacy/setup-deploy.md", "disposition": "BUG_FIX", "overlays": [ @@ -4410,7 +4410,7 @@ "legacy_alias": "setup" }, "question_sequence": "Preserve the source workflow order; gather prerequisites before consequential questions.", - "follow_up_behavior": "The complete source follow-up sequence is preserved verbatim inside new_location and hash-compared to the pinned base.", + "follow_up_behavior": "Specialist follow-up order is preserved from the pinned source. The retired 1.x shared onboarding wrapper is excluded, and carved specialist phases are package-local lazy references loaded at their original workflow point.", "smart_skip_rules": "Skip only when the source condition is false, and name every skipped module with evidence.", "pushback_rules": "Preserve the source forcing questions, recommendation pressure, and one-question-at-a-time cadence.", "stop_gates": "Preserve every STOP, hard gate, approval boundary, and no-mutation-before-approval rule.", @@ -4465,7 +4465,7 @@ "voice": "Direct builder voice; match the user language and retain source-specific tone constraints.", "response_posture": "Direct, evidence-first builder language; preserve source-specific recommendations and constructive pressure.", "new_location": "skills/ship/references/legacy/setup-deploy.md", - "parity_test": "evals/parity/contracts/setup-deploy.json + scripts/gstack2/run-parity.ts normalized full-body equality" + "parity_test": "evals/parity/contracts/setup-deploy.json + scripts/gstack2/run-parity.ts canonical specialist render, excluded-wrapper, lazy-section, and pinned-source provenance checks" }, { "source": "document-generate", @@ -4475,7 +4475,7 @@ "source_path": "document-generate/SKILL.md.tmpl", "base_sha": "bb57306d98c97011b0919c6132705a15b1579781", "blob_sha": "d3ef0cbc3786c4010b3c692fb94246f56a7e1d7b", - "normalized_render_sha256": "aa5092d5c96e73aa97bcebd200d08d2ce8abcaabae534711162d29444f780229", + "normalized_render_sha256": "71726ef3082b6c00a5cad19d28da4d830f8e9b261d213a7938c4e1ce3b8c54bb", "target": "skills/ship/references/legacy/document-generate.md", "disposition": "BUG_FIX", "overlays": [ @@ -4490,7 +4490,7 @@ "legacy_alias": "docs-generate" }, "question_sequence": "Preserve the source workflow order; gather prerequisites before consequential questions.", - "follow_up_behavior": "The complete source follow-up sequence is preserved verbatim inside new_location and hash-compared to the pinned base.", + "follow_up_behavior": "Specialist follow-up order is preserved from the pinned source. The retired 1.x shared onboarding wrapper is excluded, and carved specialist phases are package-local lazy references loaded at their original workflow point.", "smart_skip_rules": "Skip only when the source condition is false, and name every skipped module with evidence.", "pushback_rules": "Preserve the source forcing questions, recommendation pressure, and one-question-at-a-time cadence.", "stop_gates": "Preserve every STOP, hard gate, approval boundary, and no-mutation-before-approval rule.", @@ -4542,7 +4542,7 @@ "voice": "Direct builder voice; match the user language and retain source-specific tone constraints.", "response_posture": "Direct, evidence-first builder language; preserve source-specific recommendations and constructive pressure.", "new_location": "skills/ship/references/legacy/document-generate.md", - "parity_test": "evals/parity/contracts/document-generate.json + scripts/gstack2/run-parity.ts normalized full-body equality" + "parity_test": "evals/parity/contracts/document-generate.json + scripts/gstack2/run-parity.ts canonical specialist render, excluded-wrapper, lazy-section, and pinned-source provenance checks" }, { "source": "gstack-upgrade", @@ -4567,7 +4567,7 @@ "legacy_alias": "upgrade" }, "question_sequence": "Preserve the source workflow order; gather prerequisites before consequential questions.", - "follow_up_behavior": "The complete source follow-up sequence is preserved verbatim inside new_location and hash-compared to the pinned base.", + "follow_up_behavior": "Specialist follow-up order is preserved from the pinned source. The retired 1.x shared onboarding wrapper is excluded, and carved specialist phases are package-local lazy references loaded at their original workflow point.", "smart_skip_rules": "Skip only when the source condition is false, and name every skipped module with evidence.", "pushback_rules": "Preserve the source forcing questions, recommendation pressure, and one-question-at-a-time cadence.", "stop_gates": "Preserve every STOP, hard gate, approval boundary, and no-mutation-before-approval rule.", @@ -4594,7 +4594,7 @@ "voice": "Direct builder voice; match the user language and retain source-specific tone constraints.", "response_posture": "Direct, evidence-first builder language; preserve source-specific recommendations and constructive pressure.", "new_location": "skills/ship/references/legacy/gstack-upgrade.md", - "parity_test": "evals/parity/contracts/gstack-upgrade.json + scripts/gstack2/run-parity.ts normalized full-body equality" + "parity_test": "evals/parity/contracts/gstack-upgrade.json + scripts/gstack2/run-parity.ts canonical specialist render, excluded-wrapper, lazy-section, and pinned-source provenance checks" }, { "source": "ios-clean", @@ -4604,7 +4604,7 @@ "source_path": "ios-clean/SKILL.md.tmpl", "base_sha": "bb57306d98c97011b0919c6132705a15b1579781", "blob_sha": "3a64481a99fab0d7247c23df0a07c428c1c5f3da", - "normalized_render_sha256": "4616b4a2f3def37440add4010a89426e85bd3f2786fd71d199063a60ce073615", + "normalized_render_sha256": "6a0080b7678f9e1df7ae2da27c4a7e3e85e7bfb83525a2c5651c24c0ab024b4b", "target": "skills/ship/references/legacy/ios-clean.md", "disposition": "BUG_FIX", "overlays": [ @@ -4619,7 +4619,7 @@ "legacy_alias": "ios-clean" }, "question_sequence": "Preserve the source workflow order; gather prerequisites before consequential questions.", - "follow_up_behavior": "The complete source follow-up sequence is preserved verbatim inside new_location and hash-compared to the pinned base.", + "follow_up_behavior": "Specialist follow-up order is preserved from the pinned source. The retired 1.x shared onboarding wrapper is excluded, and carved specialist phases are package-local lazy references loaded at their original workflow point.", "smart_skip_rules": "Skip only when the source condition is false, and name every skipped module with evidence.", "pushback_rules": "Preserve the source forcing questions, recommendation pressure, and one-question-at-a-time cadence.", "stop_gates": "Preserve every STOP, hard gate, approval boundary, and no-mutation-before-approval rule.", @@ -4667,7 +4667,7 @@ "voice": "Direct builder voice; match the user language and retain source-specific tone constraints.", "response_posture": "Direct, evidence-first builder language; preserve source-specific recommendations and constructive pressure.", "new_location": "skills/ship/references/legacy/ios-clean.md", - "parity_test": "evals/parity/contracts/ios-clean.json + scripts/gstack2/run-parity.ts normalized full-body equality" + "parity_test": "evals/parity/contracts/ios-clean.json + scripts/gstack2/run-parity.ts canonical specialist render, excluded-wrapper, lazy-section, and pinned-source provenance checks" }, { "source": "ios-sync", @@ -4677,7 +4677,7 @@ "source_path": "ios-sync/SKILL.md.tmpl", "base_sha": "bb57306d98c97011b0919c6132705a15b1579781", "blob_sha": "156a33c4c35d3bad804e44c93ae4c931878489f3", - "normalized_render_sha256": "6d1fa485d589dff65412cdd855b683f09cb442e35b8a40ee0db3451241016ea9", + "normalized_render_sha256": "c51e8865876efae833e92d54b37780afd4fa6240c13231dfb7d4635948fbc73f", "target": "skills/ship/references/legacy/ios-sync.md", "disposition": "BUG_FIX", "overlays": [ @@ -4692,7 +4692,7 @@ "legacy_alias": "ios-sync" }, "question_sequence": "Preserve the source workflow order; gather prerequisites before consequential questions.", - "follow_up_behavior": "The complete source follow-up sequence is preserved verbatim inside new_location and hash-compared to the pinned base.", + "follow_up_behavior": "Specialist follow-up order is preserved from the pinned source. The retired 1.x shared onboarding wrapper is excluded, and carved specialist phases are package-local lazy references loaded at their original workflow point.", "smart_skip_rules": "Skip only when the source condition is false, and name every skipped module with evidence.", "pushback_rules": "Preserve the source forcing questions, recommendation pressure, and one-question-at-a-time cadence.", "stop_gates": "Preserve every STOP, hard gate, approval boundary, and no-mutation-before-approval rule.", @@ -4739,7 +4739,7 @@ "voice": "Direct builder voice; match the user language and retain source-specific tone constraints.", "response_posture": "Direct, evidence-first builder language; preserve source-specific recommendations and constructive pressure.", "new_location": "skills/ship/references/legacy/ios-sync.md", - "parity_test": "evals/parity/contracts/ios-sync.json + scripts/gstack2/run-parity.ts normalized full-body equality" + "parity_test": "evals/parity/contracts/ios-sync.json + scripts/gstack2/run-parity.ts canonical specialist render, excluded-wrapper, lazy-section, and pinned-source provenance checks" } ], "sections": [ @@ -4749,27 +4749,27 @@ "base_sha": "bb57306d98c97011b0919c6132705a15b1579781", "blob_sha": "e2e9db0a7688ee80e2f82d55eb73633e6c038375", "normalized_render_sha256": "c38fd2a45788de0fefde11f46b5defc8e389a466baaefa49c81f250ee16d7a31", - "ported_render_sha256": "3cdacdfacc9cd3b494cfa89613ad74c7702c2f3ed10dbd88ed66bf1220f04260", + "ported_render_sha256": "7d9b74faf4ec5f215fda7bd9704ae7a2a20b5a0d06df722d776725b313128e8e", "target": "skills/review/references/sections/cso/audit-phases.md", - "inlined_module_target": "skills/review/references/legacy/cso.md", + "lazy_reference_module_target": "skills/review/references/legacy/cso.md", "packaged_targets": [ "skills/review/references/sections/cso/audit-phases.md" ], - "disposition": "MECHANICAL_PORT", + "disposition": "JUDGMENT_PRESERVING_CARVE", "original_source_file": "cso/sections/audit-phases.md.tmpl", "original_line_range": "1-252", - "purpose": "Carved specialist section from cso, mechanically inlined into its preserved module.", + "purpose": "Carved specialist section from cso, packaged behind a lazy reference at its original workflow point.", "invocation_conditions": "Loaded only when the parent cso workflow reaches this carved section.", "modes": { "parent": "cso" }, - "question_sequence": "Preserved verbatim in the inlined section.", - "follow_up_behavior": "Preserved verbatim in the inlined section.", + "question_sequence": "Preserved verbatim in the package-local lazy section.", + "follow_up_behavior": "Preserved verbatim in the package-local lazy section and loaded only when its original phase is reached.", "smart_skip_rules": "Inherited unchanged from the parent specialist workflow.", "pushback_rules": "Inherited unchanged from the parent specialist workflow.", "stop_gates": "Inherited unchanged from the parent specialist workflow.", "approval_gates": "Inherited unchanged from the parent specialist workflow.", - "rubrics_and_scoring": "Preserved verbatim in the inlined section.", + "rubrics_and_scoring": "Preserved verbatim in the package-local lazy section.", "cognitive_frameworks": [ "Phase 2: Secrets Archaeology", "Phase 3: Dependency Supply Chain", @@ -4799,7 +4799,7 @@ "voice": "Inherited unchanged from the parent specialist workflow.", "response_posture": "Inherited unchanged from the parent specialist workflow.", "new_location": "skills/review/references/sections/cso/audit-phases.md", - "parity_test": "scripts/gstack2/run-parity.ts exact packaged-section, inline inclusion, and Git-blob checks" + "parity_test": "scripts/gstack2/run-parity.ts exact packaged-section, lazy-reference, and Git-blob checks" }, { "source_path": "design-consultation/sections/proposal-and-preview.md.tmpl", @@ -4807,27 +4807,27 @@ "base_sha": "bb57306d98c97011b0919c6132705a15b1579781", "blob_sha": "5d2d13a7024365d24f926cc49e99f3a980d57059", "normalized_render_sha256": "232f019dead6cb913c6b0845f265fd9993383a05147ac4260369853053492d8b", - "ported_render_sha256": "2ca1a8fff531a5ff46c16b786eb139c31994a874f24d47d8f8bb8b4e8771f0b5", + "ported_render_sha256": "802acbf180b3720e15685f22e798083f6d480658a2072fc50c176413e7d5708d", "target": "skills/design/references/sections/design-consultation/proposal-and-preview.md", - "inlined_module_target": "skills/design/references/legacy/design-consultation.md", + "lazy_reference_module_target": "skills/design/references/legacy/design-consultation.md", "packaged_targets": [ "skills/design/references/sections/design-consultation/proposal-and-preview.md" ], - "disposition": "MECHANICAL_PORT", + "disposition": "JUDGMENT_PRESERVING_CARVE", "original_source_file": "design-consultation/sections/proposal-and-preview.md.tmpl", "original_line_range": "1-295", - "purpose": "Carved specialist section from design-consultation, mechanically inlined into its preserved module.", + "purpose": "Carved specialist section from design-consultation, packaged behind a lazy reference at its original workflow point.", "invocation_conditions": "Loaded only when the parent design-consultation workflow reaches this carved section.", "modes": { "parent": "design-consultation" }, - "question_sequence": "Preserved verbatim in the inlined section.", - "follow_up_behavior": "Preserved verbatim in the inlined section.", + "question_sequence": "Preserved verbatim in the package-local lazy section.", + "follow_up_behavior": "Preserved verbatim in the package-local lazy section and loaded only when its original phase is reached.", "smart_skip_rules": "Inherited unchanged from the parent specialist workflow.", "pushback_rules": "Inherited unchanged from the parent specialist workflow.", "stop_gates": "Inherited unchanged from the parent specialist workflow.", "approval_gates": "Inherited unchanged from the parent specialist workflow.", - "rubrics_and_scoring": "Preserved verbatim in the inlined section.", + "rubrics_and_scoring": "Preserved verbatim in the package-local lazy section.", "cognitive_frameworks": [ "Phase 3: The Complete Proposal", "Your Design Knowledge (use to inform proposals — do NOT display as tables)", @@ -4847,7 +4847,7 @@ "voice": "Inherited unchanged from the parent specialist workflow.", "response_posture": "Inherited unchanged from the parent specialist workflow.", "new_location": "skills/design/references/sections/design-consultation/proposal-and-preview.md", - "parity_test": "scripts/gstack2/run-parity.ts exact packaged-section, inline inclusion, and Git-blob checks" + "parity_test": "scripts/gstack2/run-parity.ts exact packaged-section, lazy-reference, and Git-blob checks" }, { "source_path": "document-release/sections/release-body.md.tmpl", @@ -4855,27 +4855,27 @@ "base_sha": "bb57306d98c97011b0919c6132705a15b1579781", "blob_sha": "475e8b258ae06c1ddc2269275a5d85e2dc09eddf", "normalized_render_sha256": "68c4d42fce344fc9d834e1cd2bbe21dea119d416668ebb32ebe9e7c52b130f32", - "ported_render_sha256": "18629e13adba829b14ace992e523431733b1b383863fefff640a1c53dbe34fbe", + "ported_render_sha256": "83c9315922fc6cef23701f720fa7eeff0cfccc000c05db0570a6483326857b08", "target": "skills/ship/references/sections/document-release/release-body.md", - "inlined_module_target": "skills/ship/references/legacy/document-release.md", + "lazy_reference_module_target": "skills/ship/references/legacy/document-release.md", "packaged_targets": [ "skills/ship/references/sections/document-release/release-body.md" ], - "disposition": "MECHANICAL_PORT", + "disposition": "JUDGMENT_PRESERVING_CARVE", "original_source_file": "document-release/sections/release-body.md.tmpl", "original_line_range": "1-363", - "purpose": "Carved specialist section from document-release, mechanically inlined into its preserved module.", + "purpose": "Carved specialist section from document-release, packaged behind a lazy reference at its original workflow point.", "invocation_conditions": "Loaded only when the parent document-release workflow reaches this carved section.", "modes": { "parent": "document-release" }, - "question_sequence": "Preserved verbatim in the inlined section.", - "follow_up_behavior": "Preserved verbatim in the inlined section.", + "question_sequence": "Preserved verbatim in the package-local lazy section.", + "follow_up_behavior": "Preserved verbatim in the package-local lazy section and loaded only when its original phase is reached.", "smart_skip_rules": "Inherited unchanged from the parent specialist workflow.", "pushback_rules": "Inherited unchanged from the parent specialist workflow.", "stop_gates": "Inherited unchanged from the parent specialist workflow.", "approval_gates": "Inherited unchanged from the parent specialist workflow.", - "rubrics_and_scoring": "Preserved verbatim in the inlined section.", + "rubrics_and_scoring": "Preserved verbatim in the package-local lazy section.", "cognitive_frameworks": [ "Step 2: Per-File Documentation Audit", "Step 3: Apply Auto-Updates", @@ -4893,7 +4893,7 @@ "voice": "Inherited unchanged from the parent specialist workflow.", "response_posture": "Inherited unchanged from the parent specialist workflow.", "new_location": "skills/ship/references/sections/document-release/release-body.md", - "parity_test": "scripts/gstack2/run-parity.ts exact packaged-section, inline inclusion, and Git-blob checks" + "parity_test": "scripts/gstack2/run-parity.ts exact packaged-section, lazy-reference, and Git-blob checks" }, { "source_path": "office-hours/sections/design-and-handoff.md.tmpl", @@ -4901,27 +4901,27 @@ "base_sha": "bb57306d98c97011b0919c6132705a15b1579781", "blob_sha": "a8f8c5aac4b39b87d222c25201475b5f1ab9bf15", "normalized_render_sha256": "ca4ffc09d9515971a9c116e3acf12ae7d6ab2b93c79da0e69ac5f5105b4527b5", - "ported_render_sha256": "8ff3b11362cb41ca336651af3a2bb2561a2f788fac59fbb59d41ed41925a859f", + "ported_render_sha256": "6e5d16c2f9fcc658f4a77c679ba971577dfc91418d84146815be86bb4207f591", "target": "skills/plan/references/sections/office-hours/design-and-handoff.md", - "inlined_module_target": "skills/plan/references/legacy/office-hours.md", + "lazy_reference_module_target": "skills/plan/references/legacy/office-hours.md", "packaged_targets": [ "skills/plan/references/sections/office-hours/design-and-handoff.md" ], - "disposition": "MECHANICAL_PORT", + "disposition": "JUDGMENT_PRESERVING_CARVE", "original_source_file": "office-hours/sections/design-and-handoff.md.tmpl", "original_line_range": "1-474", - "purpose": "Carved specialist section from office-hours, mechanically inlined into its preserved module.", + "purpose": "Carved specialist section from office-hours, packaged behind a lazy reference at its original workflow point.", "invocation_conditions": "Loaded only when the parent office-hours workflow reaches this carved section.", "modes": { "parent": "office-hours" }, - "question_sequence": "Preserved verbatim in the inlined section.", - "follow_up_behavior": "Preserved verbatim in the inlined section.", + "question_sequence": "Preserved verbatim in the package-local lazy section.", + "follow_up_behavior": "Preserved verbatim in the package-local lazy section and loaded only when its original phase is reached.", "smart_skip_rules": "Inherited unchanged from the parent specialist workflow.", "pushback_rules": "Inherited unchanged from the parent specialist workflow.", "stop_gates": "Inherited unchanged from the parent specialist workflow.", "approval_gates": "Inherited unchanged from the parent specialist workflow.", - "rubrics_and_scoring": "Preserved verbatim in the inlined section.", + "rubrics_and_scoring": "Preserved verbatim in the package-local lazy section.", "cognitive_frameworks": [ "Phase 5: Design Doc", "Startup mode design doc template:", @@ -4946,7 +4946,7 @@ "voice": "Inherited unchanged from the parent specialist workflow.", "response_posture": "Inherited unchanged from the parent specialist workflow.", "new_location": "skills/plan/references/sections/office-hours/design-and-handoff.md", - "parity_test": "scripts/gstack2/run-parity.ts exact packaged-section, inline inclusion, and Git-blob checks" + "parity_test": "scripts/gstack2/run-parity.ts exact packaged-section, lazy-reference, and Git-blob checks" }, { "source_path": "plan-ceo-review/sections/review-sections.md.tmpl", @@ -4954,27 +4954,27 @@ "base_sha": "bb57306d98c97011b0919c6132705a15b1579781", "blob_sha": "73262a9588ebe94532e1bd10505d8ea49fdb57dc", "normalized_render_sha256": "5df219bd5d3f838021964cf93170feddf1564b90894424de51931e2de184f444", - "ported_render_sha256": "0e0b90a422094f019e42f90be5bc4bc2aa6469449fd4a08e7a33d6883ac12c79", + "ported_render_sha256": "6f1f4b1dc3ae01231b5328e864f15d746f03325e074f04bbcf2f0a0df180ac99", "target": "skills/plan/references/sections/plan-ceo-review/review-sections.md", - "inlined_module_target": "skills/plan/references/legacy/plan-ceo-review.md", + "lazy_reference_module_target": "skills/plan/references/legacy/plan-ceo-review.md", "packaged_targets": [ "skills/plan/references/sections/plan-ceo-review/review-sections.md" ], - "disposition": "MECHANICAL_PORT", + "disposition": "JUDGMENT_PRESERVING_CARVE", "original_source_file": "plan-ceo-review/sections/review-sections.md.tmpl", "original_line_range": "1-493", - "purpose": "Carved specialist section from plan-ceo-review, mechanically inlined into its preserved module.", + "purpose": "Carved specialist section from plan-ceo-review, packaged behind a lazy reference at its original workflow point.", "invocation_conditions": "Loaded only when the parent plan-ceo-review workflow reaches this carved section.", "modes": { "parent": "plan-ceo-review" }, - "question_sequence": "Preserved verbatim in the inlined section.", - "follow_up_behavior": "Preserved verbatim in the inlined section.", + "question_sequence": "Preserved verbatim in the package-local lazy section.", + "follow_up_behavior": "Preserved verbatim in the package-local lazy section and loaded only when its original phase is reached.", "smart_skip_rules": "Inherited unchanged from the parent specialist workflow.", "pushback_rules": "Inherited unchanged from the parent specialist workflow.", "stop_gates": "Inherited unchanged from the parent specialist workflow.", "approval_gates": "Inherited unchanged from the parent specialist workflow.", - "rubrics_and_scoring": "Preserved verbatim in the inlined section.", + "rubrics_and_scoring": "Preserved verbatim in the package-local lazy section.", "cognitive_frameworks": [ "Review Sections (11 sections, after scope and mode are agreed)", "Section 1: Architecture Review", @@ -5029,7 +5029,7 @@ "voice": "Inherited unchanged from the parent specialist workflow.", "response_posture": "Inherited unchanged from the parent specialist workflow.", "new_location": "skills/plan/references/sections/plan-ceo-review/review-sections.md", - "parity_test": "scripts/gstack2/run-parity.ts exact packaged-section, inline inclusion, and Git-blob checks" + "parity_test": "scripts/gstack2/run-parity.ts exact packaged-section, lazy-reference, and Git-blob checks" }, { "source_path": "plan-design-review/sections/review-sections.md.tmpl", @@ -5037,28 +5037,28 @@ "base_sha": "bb57306d98c97011b0919c6132705a15b1579781", "blob_sha": "8b9c0c4bc37bf056319fdfa5e6e64df7e2c63232", "normalized_render_sha256": "f70fee1c656304193e213adb3aa12b882f4b4841826652fc7df4defcd00994f9", - "ported_render_sha256": "6768a45e4f168bac7fb9af348cf221fec54bf55465c545577893415849c35ea8", + "ported_render_sha256": "78801f52c5bd12e4709089d892d24f82db4b5f767befb8ba02389d4307fa38da", "target": "skills/design/references/sections/plan-design-review/review-sections.md", - "inlined_module_target": "skills/design/references/legacy/plan-design-review.md", + "lazy_reference_module_target": "skills/design/references/legacy/plan-design-review.md", "packaged_targets": [ "skills/design/references/sections/plan-design-review/review-sections.md", "skills/plan/references/sections/plan-design-review/review-sections.md" ], - "disposition": "MECHANICAL_PORT", + "disposition": "JUDGMENT_PRESERVING_CARVE", "original_source_file": "plan-design-review/sections/review-sections.md.tmpl", "original_line_range": "1-224", - "purpose": "Carved specialist section from plan-design-review, mechanically inlined into its preserved module.", + "purpose": "Carved specialist section from plan-design-review, packaged behind a lazy reference at its original workflow point.", "invocation_conditions": "Loaded only when the parent plan-design-review workflow reaches this carved section.", "modes": { "parent": "plan-design-review" }, - "question_sequence": "Preserved verbatim in the inlined section.", - "follow_up_behavior": "Preserved verbatim in the inlined section.", + "question_sequence": "Preserved verbatim in the package-local lazy section.", + "follow_up_behavior": "Preserved verbatim in the package-local lazy section and loaded only when its original phase is reached.", "smart_skip_rules": "Inherited unchanged from the parent specialist workflow.", "pushback_rules": "Inherited unchanged from the parent specialist workflow.", "stop_gates": "Inherited unchanged from the parent specialist workflow.", "approval_gates": "Inherited unchanged from the parent specialist workflow.", - "rubrics_and_scoring": "Preserved verbatim in the inlined section.", + "rubrics_and_scoring": "Preserved verbatim in the package-local lazy section.", "cognitive_frameworks": [ "Review Sections (7 passes, after scope is agreed)", "Prior Learnings", @@ -5102,7 +5102,7 @@ "voice": "Inherited unchanged from the parent specialist workflow.", "response_posture": "Inherited unchanged from the parent specialist workflow.", "new_location": "skills/design/references/sections/plan-design-review/review-sections.md", - "parity_test": "scripts/gstack2/run-parity.ts exact packaged-section, inline inclusion, and Git-blob checks" + "parity_test": "scripts/gstack2/run-parity.ts exact packaged-section, lazy-reference, and Git-blob checks" }, { "source_path": "plan-devex-review/sections/review-sections.md.tmpl", @@ -5110,27 +5110,27 @@ "base_sha": "bb57306d98c97011b0919c6132705a15b1579781", "blob_sha": "eca5dbccaab17ef1f1ecd6b624df6762b8e596fe", "normalized_render_sha256": "4567898687b5b4566e5566735e86e0a71db1e6d69e1b55006d599794401f89aa", - "ported_render_sha256": "9be109595821a4674f116c79060bc65d87606c3c07c31c4cd014040f3e802676", + "ported_render_sha256": "f74e7e8054cbda01f5a80493495428d5a181e7b2009eabbe81498147d37f1420", "target": "skills/plan/references/sections/plan-devex-review/review-sections.md", - "inlined_module_target": "skills/plan/references/legacy/plan-devex-review.md", + "lazy_reference_module_target": "skills/plan/references/legacy/plan-devex-review.md", "packaged_targets": [ "skills/plan/references/sections/plan-devex-review/review-sections.md" ], - "disposition": "MECHANICAL_PORT", + "disposition": "JUDGMENT_PRESERVING_CARVE", "original_source_file": "plan-devex-review/sections/review-sections.md.tmpl", "original_line_range": "1-403", - "purpose": "Carved specialist section from plan-devex-review, mechanically inlined into its preserved module.", + "purpose": "Carved specialist section from plan-devex-review, packaged behind a lazy reference at its original workflow point.", "invocation_conditions": "Loaded only when the parent plan-devex-review workflow reaches this carved section.", "modes": { "parent": "plan-devex-review" }, - "question_sequence": "Preserved verbatim in the inlined section.", - "follow_up_behavior": "Preserved verbatim in the inlined section.", + "question_sequence": "Preserved verbatim in the package-local lazy section.", + "follow_up_behavior": "Preserved verbatim in the package-local lazy section and loaded only when its original phase is reached.", "smart_skip_rules": "Inherited unchanged from the parent specialist workflow.", "pushback_rules": "Inherited unchanged from the parent specialist workflow.", "stop_gates": "Inherited unchanged from the parent specialist workflow.", "approval_gates": "Inherited unchanged from the parent specialist workflow.", - "rubrics_and_scoring": "Preserved verbatim in the inlined section.", + "rubrics_and_scoring": "Preserved verbatim in the package-local lazy section.", "cognitive_frameworks": [ "Review Sections (8 passes, after Step 0 is complete)", "Prior Learnings", @@ -5182,7 +5182,7 @@ "voice": "Inherited unchanged from the parent specialist workflow.", "response_posture": "Inherited unchanged from the parent specialist workflow.", "new_location": "skills/plan/references/sections/plan-devex-review/review-sections.md", - "parity_test": "scripts/gstack2/run-parity.ts exact packaged-section, inline inclusion, and Git-blob checks" + "parity_test": "scripts/gstack2/run-parity.ts exact packaged-section, lazy-reference, and Git-blob checks" }, { "source_path": "plan-eng-review/sections/review-sections.md.tmpl", @@ -5190,27 +5190,27 @@ "base_sha": "bb57306d98c97011b0919c6132705a15b1579781", "blob_sha": "64562a6b1ff51a9c528d34aef1a7447e18576c13", "normalized_render_sha256": "780b427bfd6b28886538f8eccbfed8f600cf532fc102d81f7499f37469dcb61d", - "ported_render_sha256": "dadb7aede4f2fc530e45be2df1c147375acec488d9861b6ac6ace9aacc1d5d43", + "ported_render_sha256": "249494f052cc853f9ea99e0d06afcf9f783e7f5666e4abb5d760c3260f3c10fc", "target": "skills/plan/references/sections/plan-eng-review/review-sections.md", - "inlined_module_target": "skills/plan/references/legacy/plan-eng-review.md", + "lazy_reference_module_target": "skills/plan/references/legacy/plan-eng-review.md", "packaged_targets": [ "skills/plan/references/sections/plan-eng-review/review-sections.md" ], - "disposition": "MECHANICAL_PORT", + "disposition": "JUDGMENT_PRESERVING_CARVE", "original_source_file": "plan-eng-review/sections/review-sections.md.tmpl", "original_line_range": "1-227", - "purpose": "Carved specialist section from plan-eng-review, mechanically inlined into its preserved module.", + "purpose": "Carved specialist section from plan-eng-review, packaged behind a lazy reference at its original workflow point.", "invocation_conditions": "Loaded only when the parent plan-eng-review workflow reaches this carved section.", "modes": { "parent": "plan-eng-review" }, - "question_sequence": "Preserved verbatim in the inlined section.", - "follow_up_behavior": "Preserved verbatim in the inlined section.", + "question_sequence": "Preserved verbatim in the package-local lazy section.", + "follow_up_behavior": "Preserved verbatim in the package-local lazy section and loaded only when its original phase is reached.", "smart_skip_rules": "Inherited unchanged from the parent specialist workflow.", "pushback_rules": "Inherited unchanged from the parent specialist workflow.", "stop_gates": "Inherited unchanged from the parent specialist workflow.", "approval_gates": "Inherited unchanged from the parent specialist workflow.", - "rubrics_and_scoring": "Preserved verbatim in the inlined section.", + "rubrics_and_scoring": "Preserved verbatim in the package-local lazy section.", "cognitive_frameworks": [ "Review Sections (after scope is agreed)", "Prior Learnings", @@ -5259,7 +5259,7 @@ "voice": "Inherited unchanged from the parent specialist workflow.", "response_posture": "Inherited unchanged from the parent specialist workflow.", "new_location": "skills/plan/references/sections/plan-eng-review/review-sections.md", - "parity_test": "scripts/gstack2/run-parity.ts exact packaged-section, inline inclusion, and Git-blob checks" + "parity_test": "scripts/gstack2/run-parity.ts exact packaged-section, lazy-reference, and Git-blob checks" }, { "source_path": "ship/sections/adversarial.md.tmpl", @@ -5269,25 +5269,25 @@ "normalized_render_sha256": "c3ee106fbb6513ae45ddf0cb9498ad72a63f6b63c1af6807420d7ee7cf3abc80", "ported_render_sha256": "80c5b8c8b833e895479360ade3227a956ea2eba41c183840f163064e9d35dc5b", "target": "skills/ship/references/sections/ship/adversarial.md", - "inlined_module_target": "skills/ship/references/legacy/ship.md", + "lazy_reference_module_target": "skills/ship/references/legacy/ship.md", "packaged_targets": [ "skills/ship/references/sections/ship/adversarial.md" ], - "disposition": "MECHANICAL_PORT", + "disposition": "JUDGMENT_PRESERVING_CARVE", "original_source_file": "ship/sections/adversarial.md.tmpl", "original_line_range": "1-20", - "purpose": "Carved specialist section from ship, mechanically inlined into its preserved module.", + "purpose": "Carved specialist section from ship, packaged behind a lazy reference at its original workflow point.", "invocation_conditions": "Loaded only when the parent ship workflow reaches this carved section.", "modes": { "parent": "ship" }, - "question_sequence": "Preserved verbatim in the inlined section.", - "follow_up_behavior": "Preserved verbatim in the inlined section.", + "question_sequence": "Preserved verbatim in the package-local lazy section.", + "follow_up_behavior": "Preserved verbatim in the package-local lazy section and loaded only when its original phase is reached.", "smart_skip_rules": "Inherited unchanged from the parent specialist workflow.", "pushback_rules": "Inherited unchanged from the parent specialist workflow.", "stop_gates": "Inherited unchanged from the parent specialist workflow.", "approval_gates": "Inherited unchanged from the parent specialist workflow.", - "rubrics_and_scoring": "Preserved verbatim in the inlined section.", + "rubrics_and_scoring": "Preserved verbatim in the package-local lazy section.", "cognitive_frameworks": [ "Capture Learnings", "Refresh learnings for the headline feature on this branch" @@ -5299,7 +5299,7 @@ "voice": "Inherited unchanged from the parent specialist workflow.", "response_posture": "Inherited unchanged from the parent specialist workflow.", "new_location": "skills/ship/references/sections/ship/adversarial.md", - "parity_test": "scripts/gstack2/run-parity.ts exact packaged-section, inline inclusion, and Git-blob checks" + "parity_test": "scripts/gstack2/run-parity.ts exact packaged-section, lazy-reference, and Git-blob checks" }, { "source_path": "ship/sections/changelog.md.tmpl", @@ -5309,25 +5309,25 @@ "normalized_render_sha256": "e84b0e33f0dab6bef8cc66b8088630dbfa2d1868bd02c2c938ebfe3cccaeb970", "ported_render_sha256": "e84b0e33f0dab6bef8cc66b8088630dbfa2d1868bd02c2c938ebfe3cccaeb970", "target": "skills/ship/references/sections/ship/changelog.md", - "inlined_module_target": "skills/ship/references/legacy/ship.md", + "lazy_reference_module_target": "skills/ship/references/legacy/ship.md", "packaged_targets": [ "skills/ship/references/sections/ship/changelog.md" ], - "disposition": "MECHANICAL_PORT", + "disposition": "JUDGMENT_PRESERVING_CARVE", "original_source_file": "ship/sections/changelog.md.tmpl", "original_line_range": "1-4", - "purpose": "Carved specialist section from ship, mechanically inlined into its preserved module.", + "purpose": "Carved specialist section from ship, packaged behind a lazy reference at its original workflow point.", "invocation_conditions": "Loaded only when the parent ship workflow reaches this carved section.", "modes": { "parent": "ship" }, - "question_sequence": "Preserved verbatim in the inlined section.", - "follow_up_behavior": "Preserved verbatim in the inlined section.", + "question_sequence": "Preserved verbatim in the package-local lazy section.", + "follow_up_behavior": "Preserved verbatim in the package-local lazy section and loaded only when its original phase is reached.", "smart_skip_rules": "Inherited unchanged from the parent specialist workflow.", "pushback_rules": "Inherited unchanged from the parent specialist workflow.", "stop_gates": "Inherited unchanged from the parent specialist workflow.", "approval_gates": "Inherited unchanged from the parent specialist workflow.", - "rubrics_and_scoring": "Preserved verbatim in the inlined section.", + "rubrics_and_scoring": "Preserved verbatim in the package-local lazy section.", "cognitive_frameworks": [ "Step 13: CHANGELOG (auto-generate)" ], @@ -5338,7 +5338,7 @@ "voice": "Inherited unchanged from the parent specialist workflow.", "response_posture": "Inherited unchanged from the parent specialist workflow.", "new_location": "skills/ship/references/sections/ship/changelog.md", - "parity_test": "scripts/gstack2/run-parity.ts exact packaged-section, inline inclusion, and Git-blob checks" + "parity_test": "scripts/gstack2/run-parity.ts exact packaged-section, lazy-reference, and Git-blob checks" }, { "source_path": "ship/sections/greptile.md.tmpl", @@ -5348,25 +5348,25 @@ "normalized_render_sha256": "48c59e532a5878215272cebfa1feecf466a35c44aee1fc1cbbf1691b6bfcd6a7", "ported_render_sha256": "2d457433edd3bd049a63aae9aac5d93701b3b141f2c6b03ca434173238854e06", "target": "skills/ship/references/sections/ship/greptile.md", - "inlined_module_target": "skills/ship/references/legacy/ship.md", + "lazy_reference_module_target": "skills/ship/references/legacy/ship.md", "packaged_targets": [ "skills/ship/references/sections/ship/greptile.md" ], - "disposition": "MECHANICAL_PORT", + "disposition": "JUDGMENT_PRESERVING_CARVE", "original_source_file": "ship/sections/greptile.md.tmpl", "original_line_range": "1-50", - "purpose": "Carved specialist section from ship, mechanically inlined into its preserved module.", + "purpose": "Carved specialist section from ship, packaged behind a lazy reference at its original workflow point.", "invocation_conditions": "Loaded only when the parent ship workflow reaches this carved section.", "modes": { "parent": "ship" }, - "question_sequence": "Preserved verbatim in the inlined section.", - "follow_up_behavior": "Preserved verbatim in the inlined section.", + "question_sequence": "Preserved verbatim in the package-local lazy section.", + "follow_up_behavior": "Preserved verbatim in the package-local lazy section and loaded only when its original phase is reached.", "smart_skip_rules": "Inherited unchanged from the parent specialist workflow.", "pushback_rules": "Inherited unchanged from the parent specialist workflow.", "stop_gates": "Inherited unchanged from the parent specialist workflow.", "approval_gates": "Inherited unchanged from the parent specialist workflow.", - "rubrics_and_scoring": "Preserved verbatim in the inlined section.", + "rubrics_and_scoring": "Preserved verbatim in the package-local lazy section.", "cognitive_frameworks": [ "Step 10: Address Greptile review comments (if PR exists)" ], @@ -5377,7 +5377,7 @@ "voice": "Inherited unchanged from the parent specialist workflow.", "response_posture": "Inherited unchanged from the parent specialist workflow.", "new_location": "skills/ship/references/sections/ship/greptile.md", - "parity_test": "scripts/gstack2/run-parity.ts exact packaged-section, inline inclusion, and Git-blob checks" + "parity_test": "scripts/gstack2/run-parity.ts exact packaged-section, lazy-reference, and Git-blob checks" }, { "source_path": "ship/sections/plan-completion.md.tmpl", @@ -5385,27 +5385,27 @@ "base_sha": "bb57306d98c97011b0919c6132705a15b1579781", "blob_sha": "357cec24b6e7261b2451dee48c259fb6b0ae497a", "normalized_render_sha256": "7aef2bc76d8a43d5618017d7b12482b341bd5691b4183271b0027f6a8055b1b2", - "ported_render_sha256": "9ad216289c2fdbcf2f7e1f8a5ca2257ab2875ea86b0681174a4065132a32c171", + "ported_render_sha256": "f6b79e888d69c68cd9a22fad9bb6b2f98e9eec2465813b3c006baca3a3f51958", "target": "skills/ship/references/sections/ship/plan-completion.md", - "inlined_module_target": "skills/ship/references/legacy/ship.md", + "lazy_reference_module_target": "skills/ship/references/legacy/ship.md", "packaged_targets": [ "skills/ship/references/sections/ship/plan-completion.md" ], - "disposition": "MECHANICAL_PORT", + "disposition": "JUDGMENT_PRESERVING_CARVE", "original_source_file": "ship/sections/plan-completion.md.tmpl", "original_line_range": "1-32", - "purpose": "Carved specialist section from ship, mechanically inlined into its preserved module.", + "purpose": "Carved specialist section from ship, packaged behind a lazy reference at its original workflow point.", "invocation_conditions": "Loaded only when the parent ship workflow reaches this carved section.", "modes": { "parent": "ship" }, - "question_sequence": "Preserved verbatim in the inlined section.", - "follow_up_behavior": "Preserved verbatim in the inlined section.", + "question_sequence": "Preserved verbatim in the package-local lazy section.", + "follow_up_behavior": "Preserved verbatim in the package-local lazy section and loaded only when its original phase is reached.", "smart_skip_rules": "Inherited unchanged from the parent specialist workflow.", "pushback_rules": "Inherited unchanged from the parent specialist workflow.", "stop_gates": "Inherited unchanged from the parent specialist workflow.", "approval_gates": "Inherited unchanged from the parent specialist workflow.", - "rubrics_and_scoring": "Preserved verbatim in the inlined section.", + "rubrics_and_scoring": "Preserved verbatim in the package-local lazy section.", "cognitive_frameworks": [ "Step 8: Plan Completion Audit", "Actionable Item Extraction", @@ -5429,7 +5429,7 @@ "voice": "Inherited unchanged from the parent specialist workflow.", "response_posture": "Inherited unchanged from the parent specialist workflow.", "new_location": "skills/ship/references/sections/ship/plan-completion.md", - "parity_test": "scripts/gstack2/run-parity.ts exact packaged-section, inline inclusion, and Git-blob checks" + "parity_test": "scripts/gstack2/run-parity.ts exact packaged-section, lazy-reference, and Git-blob checks" }, { "source_path": "ship/sections/pr-body.md.tmpl", @@ -5437,27 +5437,27 @@ "base_sha": "bb57306d98c97011b0919c6132705a15b1579781", "blob_sha": "22ac0d668ba8f2a15c7f9416508d81727c5114e0", "normalized_render_sha256": "813c4c75f1cc8c85ab3121f0a76966673118cf759d283c3ef5f6aa1ba64dd764", - "ported_render_sha256": "650dc896bf54eb2ab86a0fa1f4a1d759fb951452553581d5c685318cf6e8fa66", + "ported_render_sha256": "c45be8e6407b208154b0123c3d9e10658030c1b74067a1218d4a0115b0a1c83d", "target": "skills/ship/references/sections/ship/pr-body.md", - "inlined_module_target": "skills/ship/references/legacy/ship.md", + "lazy_reference_module_target": "skills/ship/references/legacy/ship.md", "packaged_targets": [ "skills/ship/references/sections/ship/pr-body.md" ], - "disposition": "MECHANICAL_PORT", + "disposition": "JUDGMENT_PRESERVING_CARVE", "original_source_file": "ship/sections/pr-body.md.tmpl", "original_line_range": "1-206", - "purpose": "Carved specialist section from ship, mechanically inlined into its preserved module.", + "purpose": "Carved specialist section from ship, packaged behind a lazy reference at its original workflow point.", "invocation_conditions": "Loaded only when the parent ship workflow reaches this carved section.", "modes": { "parent": "ship" }, - "question_sequence": "Preserved verbatim in the inlined section.", - "follow_up_behavior": "Preserved verbatim in the inlined section.", + "question_sequence": "Preserved verbatim in the package-local lazy section.", + "follow_up_behavior": "Preserved verbatim in the package-local lazy section and loaded only when its original phase is reached.", "smart_skip_rules": "Inherited unchanged from the parent specialist workflow.", "pushback_rules": "Inherited unchanged from the parent specialist workflow.", "stop_gates": "Inherited unchanged from the parent specialist workflow.", "approval_gates": "Inherited unchanged from the parent specialist workflow.", - "rubrics_and_scoring": "Preserved verbatim in the inlined section.", + "rubrics_and_scoring": "Preserved verbatim in the package-local lazy section.", "cognitive_frameworks": [ "Step 18: Documentation sync (via subagent, before PR creation)", "Step 19: Create PR/MR", @@ -5470,7 +5470,7 @@ "voice": "Inherited unchanged from the parent specialist workflow.", "response_posture": "Inherited unchanged from the parent specialist workflow.", "new_location": "skills/ship/references/sections/ship/pr-body.md", - "parity_test": "scripts/gstack2/run-parity.ts exact packaged-section, inline inclusion, and Git-blob checks" + "parity_test": "scripts/gstack2/run-parity.ts exact packaged-section, lazy-reference, and Git-blob checks" }, { "source_path": "ship/sections/review-army.md.tmpl", @@ -5478,27 +5478,27 @@ "base_sha": "bb57306d98c97011b0919c6132705a15b1579781", "blob_sha": "e55db627e629ec501f1073dd383a7f13499c93ae", "normalized_render_sha256": "21cbb6b729ac4069fb1c9626979ad821e5227463d783b16b70f67526208d697b", - "ported_render_sha256": "cbfee41463032434762b1c6abcbb6372b841832f733f102f4e8c6c49f1407bb2", + "ported_render_sha256": "655ffbe7d5f662bf333dc06143001a7746f6cc35993b29cb7d942135973fd1c8", "target": "skills/ship/references/sections/ship/review-army.md", - "inlined_module_target": "skills/ship/references/legacy/ship.md", + "lazy_reference_module_target": "skills/ship/references/legacy/ship.md", "packaged_targets": [ "skills/ship/references/sections/ship/review-army.md" ], - "disposition": "MECHANICAL_PORT", + "disposition": "JUDGMENT_PRESERVING_CARVE", "original_source_file": "ship/sections/review-army.md.tmpl", "original_line_range": "1-56", - "purpose": "Carved specialist section from ship, mechanically inlined into its preserved module.", + "purpose": "Carved specialist section from ship, packaged behind a lazy reference at its original workflow point.", "invocation_conditions": "Loaded only when the parent ship workflow reaches this carved section.", "modes": { "parent": "ship" }, - "question_sequence": "Preserved verbatim in the inlined section.", - "follow_up_behavior": "Preserved verbatim in the inlined section.", + "question_sequence": "Preserved verbatim in the package-local lazy section.", + "follow_up_behavior": "Preserved verbatim in the package-local lazy section and loaded only when its original phase is reached.", "smart_skip_rules": "Inherited unchanged from the parent specialist workflow.", "pushback_rules": "Inherited unchanged from the parent specialist workflow.", "stop_gates": "Inherited unchanged from the parent specialist workflow.", "approval_gates": "Inherited unchanged from the parent specialist workflow.", - "rubrics_and_scoring": "Preserved verbatim in the inlined section.", + "rubrics_and_scoring": "Preserved verbatim in the package-local lazy section.", "cognitive_frameworks": [ "Step 9: Pre-Landing Review", "Confidence Calibration", @@ -5513,7 +5513,7 @@ "voice": "Inherited unchanged from the parent specialist workflow.", "response_posture": "Inherited unchanged from the parent specialist workflow.", "new_location": "skills/ship/references/sections/ship/review-army.md", - "parity_test": "scripts/gstack2/run-parity.ts exact packaged-section, inline inclusion, and Git-blob checks" + "parity_test": "scripts/gstack2/run-parity.ts exact packaged-section, lazy-reference, and Git-blob checks" }, { "source_path": "ship/sections/test-coverage.md.tmpl", @@ -5521,27 +5521,27 @@ "base_sha": "bb57306d98c97011b0919c6132705a15b1579781", "blob_sha": "8f00d0304f243a630c1920d9be0e3574dd2512aa", "normalized_render_sha256": "e60f59bd59b913c3092734f538b446a52dcccaa00ff69277e0551b13ac8ac1cd", - "ported_render_sha256": "50e493e72caa15cd5e5cf91db9557b7d861571dc583a84b76a73eb557f90dce0", + "ported_render_sha256": "3eeac50d8e6aef9e402926af2c35352cab640cdaafb3ff5eb63c9d54e907c800", "target": "skills/ship/references/sections/ship/test-coverage.md", - "inlined_module_target": "skills/ship/references/legacy/ship.md", + "lazy_reference_module_target": "skills/ship/references/legacy/ship.md", "packaged_targets": [ "skills/ship/references/sections/ship/test-coverage.md" ], - "disposition": "MECHANICAL_PORT", + "disposition": "JUDGMENT_PRESERVING_CARVE", "original_source_file": "ship/sections/test-coverage.md.tmpl", "original_line_range": "1-24", - "purpose": "Carved specialist section from ship, mechanically inlined into its preserved module.", + "purpose": "Carved specialist section from ship, packaged behind a lazy reference at its original workflow point.", "invocation_conditions": "Loaded only when the parent ship workflow reaches this carved section.", "modes": { "parent": "ship" }, - "question_sequence": "Preserved verbatim in the inlined section.", - "follow_up_behavior": "Preserved verbatim in the inlined section.", + "question_sequence": "Preserved verbatim in the package-local lazy section.", + "follow_up_behavior": "Preserved verbatim in the package-local lazy section and loaded only when its original phase is reached.", "smart_skip_rules": "Inherited unchanged from the parent specialist workflow.", "pushback_rules": "Inherited unchanged from the parent specialist workflow.", "stop_gates": "Inherited unchanged from the parent specialist workflow.", "approval_gates": "Inherited unchanged from the parent specialist workflow.", - "rubrics_and_scoring": "Preserved verbatim in the inlined section.", + "rubrics_and_scoring": "Preserved verbatim in the package-local lazy section.", "cognitive_frameworks": [ "Step 7: Test Coverage Audit", "Test Framework Detection", @@ -5556,7 +5556,7 @@ "voice": "Inherited unchanged from the parent specialist workflow.", "response_posture": "Inherited unchanged from the parent specialist workflow.", "new_location": "skills/ship/references/sections/ship/test-coverage.md", - "parity_test": "scripts/gstack2/run-parity.ts exact packaged-section, inline inclusion, and Git-blob checks" + "parity_test": "scripts/gstack2/run-parity.ts exact packaged-section, lazy-reference, and Git-blob checks" }, { "source_path": "ship/sections/tests.md.tmpl", @@ -5564,27 +5564,27 @@ "base_sha": "bb57306d98c97011b0919c6132705a15b1579781", "blob_sha": "e6d53d495f7868e93e06fde68ad2ca8c2fcab315", "normalized_render_sha256": "4335d2e4bf76e164cc767330d96dc69ce7478ec2298690ee6fe873b654c6cb3e", - "ported_render_sha256": "34f688383d85bc0cc76f9e4a669554a4b5c799b374c56b491f86c5daf1ff74b4", + "ported_render_sha256": "9cc20f7d1a99ff7200a6eac240b3d5c1cdbe2772422f7ee15a4752f4b2f22f0a", "target": "skills/ship/references/sections/ship/tests.md", - "inlined_module_target": "skills/ship/references/legacy/ship.md", + "lazy_reference_module_target": "skills/ship/references/legacy/ship.md", "packaged_targets": [ "skills/ship/references/sections/ship/tests.md" ], - "disposition": "MECHANICAL_PORT", + "disposition": "JUDGMENT_PRESERVING_CARVE", "original_source_file": "ship/sections/tests.md.tmpl", "original_line_range": "1-110", - "purpose": "Carved specialist section from ship, mechanically inlined into its preserved module.", + "purpose": "Carved specialist section from ship, packaged behind a lazy reference at its original workflow point.", "invocation_conditions": "Loaded only when the parent ship workflow reaches this carved section.", "modes": { "parent": "ship" }, - "question_sequence": "Preserved verbatim in the inlined section.", - "follow_up_behavior": "Preserved verbatim in the inlined section.", + "question_sequence": "Preserved verbatim in the package-local lazy section.", + "follow_up_behavior": "Preserved verbatim in the package-local lazy section and loaded only when its original phase is reached.", "smart_skip_rules": "Inherited unchanged from the parent specialist workflow.", "pushback_rules": "Inherited unchanged from the parent specialist workflow.", "stop_gates": "Inherited unchanged from the parent specialist workflow.", "approval_gates": "Inherited unchanged from the parent specialist workflow.", - "rubrics_and_scoring": "Preserved verbatim in the inlined section.", + "rubrics_and_scoring": "Preserved verbatim in the package-local lazy section.", "cognitive_frameworks": [ "Step 4: Test Framework Bootstrap", "Test Framework Bootstrap", @@ -5612,7 +5612,7 @@ "voice": "Inherited unchanged from the parent specialist workflow.", "response_posture": "Inherited unchanged from the parent specialist workflow.", "new_location": "skills/ship/references/sections/ship/tests.md", - "parity_test": "scripts/gstack2/run-parity.ts exact packaged-section, inline inclusion, and Git-blob checks" + "parity_test": "scripts/gstack2/run-parity.ts exact packaged-section, lazy-reference, and Git-blob checks" } ], "section_copies": [ @@ -5622,7 +5622,7 @@ "source_path": "design-consultation/sections/proposal-and-preview.md.tmpl", "target_path": "skills/design/references/sections/design-consultation/proposal-and-preview.md", "blob_sha": "5d2d13a7024365d24f926cc49e99f3a980d57059", - "sha256": "2ca1a8fff531a5ff46c16b786eb139c31994a874f24d47d8f8bb8b4e8771f0b5" + "sha256": "802acbf180b3720e15685f22e798083f6d480658a2072fc50c176413e7d5708d" }, { "tree": "design", @@ -5630,7 +5630,7 @@ "source_path": "plan-design-review/sections/review-sections.md.tmpl", "target_path": "skills/design/references/sections/plan-design-review/review-sections.md", "blob_sha": "8b9c0c4bc37bf056319fdfa5e6e64df7e2c63232", - "sha256": "6768a45e4f168bac7fb9af348cf221fec54bf55465c545577893415849c35ea8" + "sha256": "78801f52c5bd12e4709089d892d24f82db4b5f767befb8ba02389d4307fa38da" }, { "tree": "plan", @@ -5638,7 +5638,7 @@ "source_path": "office-hours/sections/design-and-handoff.md.tmpl", "target_path": "skills/plan/references/sections/office-hours/design-and-handoff.md", "blob_sha": "a8f8c5aac4b39b87d222c25201475b5f1ab9bf15", - "sha256": "8ff3b11362cb41ca336651af3a2bb2561a2f788fac59fbb59d41ed41925a859f" + "sha256": "6e5d16c2f9fcc658f4a77c679ba971577dfc91418d84146815be86bb4207f591" }, { "tree": "plan", @@ -5646,7 +5646,7 @@ "source_path": "plan-ceo-review/sections/review-sections.md.tmpl", "target_path": "skills/plan/references/sections/plan-ceo-review/review-sections.md", "blob_sha": "73262a9588ebe94532e1bd10505d8ea49fdb57dc", - "sha256": "0e0b90a422094f019e42f90be5bc4bc2aa6469449fd4a08e7a33d6883ac12c79" + "sha256": "6f1f4b1dc3ae01231b5328e864f15d746f03325e074f04bbcf2f0a0df180ac99" }, { "tree": "plan", @@ -5654,7 +5654,7 @@ "source_path": "plan-design-review/sections/review-sections.md.tmpl", "target_path": "skills/plan/references/sections/plan-design-review/review-sections.md", "blob_sha": "8b9c0c4bc37bf056319fdfa5e6e64df7e2c63232", - "sha256": "6768a45e4f168bac7fb9af348cf221fec54bf55465c545577893415849c35ea8" + "sha256": "78801f52c5bd12e4709089d892d24f82db4b5f767befb8ba02389d4307fa38da" }, { "tree": "plan", @@ -5662,7 +5662,7 @@ "source_path": "plan-devex-review/sections/review-sections.md.tmpl", "target_path": "skills/plan/references/sections/plan-devex-review/review-sections.md", "blob_sha": "eca5dbccaab17ef1f1ecd6b624df6762b8e596fe", - "sha256": "9be109595821a4674f116c79060bc65d87606c3c07c31c4cd014040f3e802676" + "sha256": "f74e7e8054cbda01f5a80493495428d5a181e7b2009eabbe81498147d37f1420" }, { "tree": "plan", @@ -5670,7 +5670,7 @@ "source_path": "plan-eng-review/sections/review-sections.md.tmpl", "target_path": "skills/plan/references/sections/plan-eng-review/review-sections.md", "blob_sha": "64562a6b1ff51a9c528d34aef1a7447e18576c13", - "sha256": "dadb7aede4f2fc530e45be2df1c147375acec488d9861b6ac6ace9aacc1d5d43" + "sha256": "249494f052cc853f9ea99e0d06afcf9f783e7f5666e4abb5d760c3260f3c10fc" }, { "tree": "review", @@ -5678,7 +5678,7 @@ "source_path": "cso/sections/audit-phases.md.tmpl", "target_path": "skills/review/references/sections/cso/audit-phases.md", "blob_sha": "e2e9db0a7688ee80e2f82d55eb73633e6c038375", - "sha256": "3cdacdfacc9cd3b494cfa89613ad74c7702c2f3ed10dbd88ed66bf1220f04260" + "sha256": "7d9b74faf4ec5f215fda7bd9704ae7a2a20b5a0d06df722d776725b313128e8e" }, { "tree": "ship", @@ -5686,7 +5686,7 @@ "source_path": "document-release/sections/release-body.md.tmpl", "target_path": "skills/ship/references/sections/document-release/release-body.md", "blob_sha": "475e8b258ae06c1ddc2269275a5d85e2dc09eddf", - "sha256": "18629e13adba829b14ace992e523431733b1b383863fefff640a1c53dbe34fbe" + "sha256": "83c9315922fc6cef23701f720fa7eeff0cfccc000c05db0570a6483326857b08" }, { "tree": "ship", @@ -5718,7 +5718,7 @@ "source_path": "ship/sections/plan-completion.md.tmpl", "target_path": "skills/ship/references/sections/ship/plan-completion.md", "blob_sha": "357cec24b6e7261b2451dee48c259fb6b0ae497a", - "sha256": "9ad216289c2fdbcf2f7e1f8a5ca2257ab2875ea86b0681174a4065132a32c171" + "sha256": "f6b79e888d69c68cd9a22fad9bb6b2f98e9eec2465813b3c006baca3a3f51958" }, { "tree": "ship", @@ -5726,7 +5726,7 @@ "source_path": "ship/sections/pr-body.md.tmpl", "target_path": "skills/ship/references/sections/ship/pr-body.md", "blob_sha": "22ac0d668ba8f2a15c7f9416508d81727c5114e0", - "sha256": "650dc896bf54eb2ab86a0fa1f4a1d759fb951452553581d5c685318cf6e8fa66" + "sha256": "c45be8e6407b208154b0123c3d9e10658030c1b74067a1218d4a0115b0a1c83d" }, { "tree": "ship", @@ -5734,7 +5734,7 @@ "source_path": "ship/sections/review-army.md.tmpl", "target_path": "skills/ship/references/sections/ship/review-army.md", "blob_sha": "e55db627e629ec501f1073dd383a7f13499c93ae", - "sha256": "cbfee41463032434762b1c6abcbb6372b841832f733f102f4e8c6c49f1407bb2" + "sha256": "655ffbe7d5f662bf333dc06143001a7746f6cc35993b29cb7d942135973fd1c8" }, { "tree": "ship", @@ -5742,7 +5742,7 @@ "source_path": "ship/sections/test-coverage.md.tmpl", "target_path": "skills/ship/references/sections/ship/test-coverage.md", "blob_sha": "8f00d0304f243a630c1920d9be0e3574dd2512aa", - "sha256": "50e493e72caa15cd5e5cf91db9557b7d861571dc583a84b76a73eb557f90dce0" + "sha256": "3eeac50d8e6aef9e402926af2c35352cab640cdaafb3ff5eb63c9d54e907c800" }, { "tree": "ship", @@ -5750,40 +5750,16 @@ "source_path": "ship/sections/tests.md.tmpl", "target_path": "skills/ship/references/sections/ship/tests.md", "blob_sha": "e6d53d495f7868e93e06fde68ad2ca8c2fcab315", - "sha256": "34f688383d85bc0cc76f9e4a669554a4b5c799b374c56b491f86c5daf1ff74b4" + "sha256": "9cc20f7d1a99ff7200a6eac240b3d5c1cdbe2772422f7ee15a4752f4b2f22f0a" } ], "dependency_copies": [ - { - "source": "gstack-upgrade", - "owner_tree": "ship", - "consumer_tree": "plan", - "target": "skills/plan/references/legacy/gstack-upgrade.md", - "sha256": "0664ec29f1619d08ba296c2160c8c9b9f8a8116131cca8d96f6a9c8ec0f0fcef", - "disposition": "SHARED_MODULE" - }, { "source": "plan-design-review", "owner_tree": "design", "consumer_tree": "plan", "target": "skills/plan/references/legacy/plan-design-review.md", - "sha256": "7b041d51147ffaeaf7bc0ed34e07a3b7b6baf9e62d921f4d94f59e1c89d886ea", - "disposition": "SHARED_MODULE" - }, - { - "source": "gstack-upgrade", - "owner_tree": "ship", - "consumer_tree": "design", - "target": "skills/design/references/legacy/gstack-upgrade.md", - "sha256": "0664ec29f1619d08ba296c2160c8c9b9f8a8116131cca8d96f6a9c8ec0f0fcef", - "disposition": "SHARED_MODULE" - }, - { - "source": "gstack-upgrade", - "owner_tree": "ship", - "consumer_tree": "qa", - "target": "skills/qa/references/legacy/gstack-upgrade.md", - "sha256": "0664ec29f1619d08ba296c2160c8c9b9f8a8116131cca8d96f6a9c8ec0f0fcef", + "sha256": "0c9930db5c50e873318cbbf00b9147edff82a210fdbdf2aacb2a8edfdf1f6463", "disposition": "SHARED_MODULE" }, { @@ -5791,23 +5767,7 @@ "owner_tree": "debug", "consumer_tree": "qa", "target": "skills/qa/references/legacy/investigate.md", - "sha256": "d77dc18a2796f217ff20c84947236b05be730818a0430413a0d3d6bd9b6f0c08", - "disposition": "SHARED_MODULE" - }, - { - "source": "gstack-upgrade", - "owner_tree": "ship", - "consumer_tree": "debug", - "target": "skills/debug/references/legacy/gstack-upgrade.md", - "sha256": "0664ec29f1619d08ba296c2160c8c9b9f8a8116131cca8d96f6a9c8ec0f0fcef", - "disposition": "SHARED_MODULE" - }, - { - "source": "gstack-upgrade", - "owner_tree": "ship", - "consumer_tree": "review", - "target": "skills/review/references/legacy/gstack-upgrade.md", - "sha256": "0664ec29f1619d08ba296c2160c8c9b9f8a8116131cca8d96f6a9c8ec0f0fcef", + "sha256": "abc5ef0411163a0959605f259e54623033f0936942a347e74ed82f13af001a3c", "disposition": "SHARED_MODULE" }, { @@ -5815,7 +5775,7 @@ "owner_tree": "qa", "consumer_tree": "ship", "target": "skills/ship/references/legacy/canary.md", - "sha256": "c5cfaf6a835b62d59d590d37c7965204cb18961b2cc090570847a4a445270694", + "sha256": "21252c073bfa2c90f5ad6883feb8ee63d893febbd981a842ec5f7611b8807f2e", "disposition": "SHARED_MODULE" }, { @@ -5823,15 +5783,7 @@ "owner_tree": "plan", "consumer_tree": "ship", "target": "skills/ship/references/legacy/context-restore.md", - "sha256": "8e564653aa951d7067dc1218b74b229e75ef16f1b32b49307c439c8f56d62930", - "disposition": "SHARED_MODULE" - }, - { - "source": "qa-only", - "owner_tree": "qa", - "consumer_tree": "ship", - "target": "skills/ship/references/legacy/qa-only.md", - "sha256": "4f52daf45353af555fd910b960ae295653c141eb80cc024c55dc0a9607baeb10", + "sha256": "8658c29bfbe2097aa9e3cc4e6b04fd0c15f77fd3c256c238415dffa93e120982", "disposition": "SHARED_MODULE" } ], @@ -5950,8 +5902,8 @@ "target_path": "skills/plan/references/artifacts/review/TODOS-format.md", "blob_sha": "eb2f4d9418f9930f0ca6af7f8eed6ca5f1685628", "baseline_sha256": "faf7774c45356ee7990cba0289ca71bf77491394608052e4f711f5436046613c", - "sha256": "faf7774c45356ee7990cba0289ca71bf77491394608052e4f711f5436046613c", - "disposition": "VERBATIM_PORT" + "sha256": "16ff74a3e74669aa53bb3a9e34d464a5768e91618c38591b170e2d285f010a37", + "disposition": "MECHANICAL_PORT" }, { "tree": "plan", @@ -6193,8 +6145,8 @@ "target_path": "skills/review/references/artifacts/cso/ACKNOWLEDGEMENTS.md", "blob_sha": "c4b89aebd4d6d129bc508215f2b07ce21014e933", "baseline_sha256": "9988a37eb79023ad162f52c5eacb4a77d0654d912a3a7555914bbb3dcd4a4815", - "sha256": "9988a37eb79023ad162f52c5eacb4a77d0654d912a3a7555914bbb3dcd4a4815", - "disposition": "VERBATIM_PORT" + "sha256": "85fbfa9eb9d5d1dc3f105b17033c50078720c8526b3edba8d93a0259fef3309b", + "disposition": "MECHANICAL_PORT" }, { "tree": "review", @@ -6211,7 +6163,7 @@ "target_path": "skills/review/references/artifacts/review/design-checklist.md", "blob_sha": "e9d2b7117c039f82b78daec8f7db63998ee1480c", "baseline_sha256": "e6f4ac34f034005c7fc91e4008bb8101a0973a26230b86b50c4f580182e6c8bb", - "sha256": "c54596fca160b6f1a1f53e7652eee144f57c95c2ea7d13aca25620a971cbfbde", + "sha256": "ad38ac65300f2b44980816f80e0cb70e9d3c169e9ebf1055f723b0716812f191", "disposition": "MECHANICAL_PORT" }, { @@ -6292,8 +6244,8 @@ "target_path": "skills/review/references/artifacts/review/TODOS-format.md", "blob_sha": "eb2f4d9418f9930f0ca6af7f8eed6ca5f1685628", "baseline_sha256": "faf7774c45356ee7990cba0289ca71bf77491394608052e4f711f5436046613c", - "sha256": "faf7774c45356ee7990cba0289ca71bf77491394608052e4f711f5436046613c", - "disposition": "VERBATIM_PORT" + "sha256": "16ff74a3e74669aa53bb3a9e34d464a5768e91618c38591b170e2d285f010a37", + "disposition": "MECHANICAL_PORT" }, { "tree": "review", @@ -6472,7 +6424,7 @@ "target_path": "skills/ship/references/artifacts/review/design-checklist.md", "blob_sha": "e9d2b7117c039f82b78daec8f7db63998ee1480c", "baseline_sha256": "e6f4ac34f034005c7fc91e4008bb8101a0973a26230b86b50c4f580182e6c8bb", - "sha256": "c54596fca160b6f1a1f53e7652eee144f57c95c2ea7d13aca25620a971cbfbde", + "sha256": "ad38ac65300f2b44980816f80e0cb70e9d3c169e9ebf1055f723b0716812f191", "disposition": "MECHANICAL_PORT" }, { @@ -6490,8 +6442,8 @@ "target_path": "skills/ship/references/artifacts/review/TODOS-format.md", "blob_sha": "eb2f4d9418f9930f0ca6af7f8eed6ca5f1685628", "baseline_sha256": "faf7774c45356ee7990cba0289ca71bf77491394608052e4f711f5436046613c", - "sha256": "faf7774c45356ee7990cba0289ca71bf77491394608052e4f711f5436046613c", - "disposition": "VERBATIM_PORT" + "sha256": "16ff74a3e74669aa53bb3a9e34d464a5768e91618c38591b170e2d285f010a37", + "disposition": "MECHANICAL_PORT" }, { "tree": "ship", @@ -6548,22 +6500,53 @@ "win32": "browse/dist/browse.exe" }, "consumer_modules": [ + "autoplan", "benchmark", + "benchmark-models", "browse", "canary", + "codex", + "context-restore", + "context-save", + "cso", "design-consultation", "design-html", "design-review", "design-shotgun", "devex-review", + "diagram", + "document-generate", + "document-release", + "freeze", + "guard", + "health", + "investigate", + "ios-qa", + "ios-sync", "land-and-deploy", + "landing-report", + "learn", + "make-pdf", "office-hours", "open-gstack-browser", "pair-agent", + "plan-ceo-review", "plan-design-review", + "plan-devex-review", + "plan-eng-review", + "plan-tune", "qa", "qa-only", - "setup-browser-cookies" + "retro", + "review", + "scrape", + "setup-browser-cookies", + "setup-gbrain", + "ship", + "skillify", + "spec", + "sync-gbrain", + "unfreeze" ], "stable_path": "${GSTACK_HOME:-$HOME/.gstack}/bin/browse" }, @@ -6599,71 +6582,6 @@ ], "stable_path": "${GSTACK_HOME:-$HOME/.gstack}/bin/gstack-brain-cache" }, - { - "name": "gstack-brain-sync", - "source_path": "bin/gstack-brain-sync", - "consumer_modules": [ - "autoplan", - "benchmark", - "benchmark-models", - "browse", - "canary", - "claude", - "codex", - "context-restore", - "context-save", - "cso", - "design-consultation", - "design-html", - "design-review", - "design-shotgun", - "devex-review", - "diagram", - "document-generate", - "document-release", - "gstack", - "health", - "investigate", - "ios-clean", - "ios-design-review", - "ios-fix", - "ios-qa", - "ios-sync", - "land-and-deploy", - "landing-report", - "learn", - "make-pdf", - "office-hours", - "open-gstack-browser", - "pair-agent", - "plan-ceo-review", - "plan-design-review", - "plan-devex-review", - "plan-eng-review", - "plan-tune", - "qa", - "qa-only", - "retro", - "review", - "scrape", - "setup-browser-cookies", - "setup-deploy", - "setup-gbrain", - "ship", - "skillify", - "spec", - "sync-gbrain" - ], - "stable_path": "${GSTACK_HOME:-$HOME/.gstack}/bin/gstack-brain-sync" - }, - { - "name": "gstack-builder-profile", - "source_path": "bin/gstack-builder-profile", - "consumer_modules": [ - "office-hours" - ], - "stable_path": "${GSTACK_HOME:-$HOME/.gstack}/bin/gstack-builder-profile" - }, { "name": "gstack-codex-probe", "source_path": "bin/gstack-codex-probe", @@ -6676,13 +6594,39 @@ { "name": "gstack-config", "source_path": "bin/gstack-config", + "consumer_modules": [ + "autoplan", + "document-generate", + "plan-tune", + "setup-gbrain", + "ship", + "spec", + "sync-gbrain" + ], + "stable_path": "${GSTACK_HOME:-$HOME/.gstack}/bin/gstack-config" + }, + { + "name": "gstack-decision-log", + "source_path": "bin/gstack-decision-log", + "consumer_modules": [ + "ship", + "spec" + ], + "stable_path": "${GSTACK_HOME:-$HOME/.gstack}/bin/gstack-decision-log" + }, + { + "name": "gstack-design", + "source_path": "design/dist/design", + "platform_source_paths": { + "posix": "design/dist/design", + "win32": "design/dist/design.exe" + }, "consumer_modules": [ "autoplan", "benchmark", "benchmark-models", "browse", "canary", - "claude", "codex", "context-restore", "context-save", @@ -6695,12 +6639,10 @@ "diagram", "document-generate", "document-release", - "gstack", + "freeze", + "guard", "health", "investigate", - "ios-clean", - "ios-design-review", - "ios-fix", "ios-qa", "ios-sync", "land-and-deploy", @@ -6721,142 +6663,15 @@ "review", "scrape", "setup-browser-cookies", - "setup-deploy", "setup-gbrain", "ship", "skillify", "spec", - "sync-gbrain" - ], - "stable_path": "${GSTACK_HOME:-$HOME/.gstack}/bin/gstack-config" - }, - { - "name": "gstack-decision-log", - "source_path": "bin/gstack-decision-log", - "consumer_modules": [ - "autoplan", - "canary", - "claude", - "codex", - "context-restore", - "context-save", - "cso", - "design-consultation", - "design-html", - "design-review", - "design-shotgun", - "devex-review", - "diagram", - "document-generate", - "document-release", - "health", - "investigate", - "ios-clean", - "ios-design-review", - "ios-fix", - "ios-qa", - "ios-sync", - "land-and-deploy", - "landing-report", - "learn", - "office-hours", - "open-gstack-browser", - "pair-agent", - "plan-ceo-review", - "plan-design-review", - "plan-devex-review", - "plan-eng-review", - "plan-tune", - "qa", - "qa-only", - "retro", - "review", - "scrape", - "setup-deploy", - "setup-gbrain", - "ship", - "skillify", - "spec", - "sync-gbrain" - ], - "stable_path": "${GSTACK_HOME:-$HOME/.gstack}/bin/gstack-decision-log" - }, - { - "name": "gstack-decision-search", - "source_path": "bin/gstack-decision-search", - "consumer_modules": [ - "autoplan", - "canary", - "claude", - "codex", - "context-restore", - "context-save", - "cso", - "design-consultation", - "design-html", - "design-review", - "design-shotgun", - "devex-review", - "diagram", - "document-generate", - "document-release", - "health", - "investigate", - "ios-clean", - "ios-design-review", - "ios-fix", - "ios-qa", - "ios-sync", - "land-and-deploy", - "landing-report", - "learn", - "office-hours", - "open-gstack-browser", - "pair-agent", - "plan-ceo-review", - "plan-design-review", - "plan-devex-review", - "plan-eng-review", - "plan-tune", - "qa", - "qa-only", - "retro", - "review", - "scrape", - "setup-deploy", - "setup-gbrain", - "ship", - "skillify", - "spec", - "sync-gbrain" - ], - "stable_path": "${GSTACK_HOME:-$HOME/.gstack}/bin/gstack-decision-search" - }, - { - "name": "gstack-design", - "source_path": "design/dist/design", - "platform_source_paths": { - "posix": "design/dist/design", - "win32": "design/dist/design.exe" - }, - "consumer_modules": [ - "design-consultation", - "design-html", - "design-review", - "design-shotgun", - "office-hours", - "plan-design-review" + "sync-gbrain", + "unfreeze" ], "stable_path": "${GSTACK_HOME:-$HOME/.gstack}/bin/gstack-design" }, - { - "name": "gstack-detach", - "source_path": "bin/gstack-detach", - "consumer_modules": [ - "ship" - ], - "stable_path": "${GSTACK_HOME:-$HOME/.gstack}/bin/gstack-detach" - }, { "name": "gstack-developer-profile", "source_path": "bin/gstack-developer-profile", @@ -6891,63 +6706,6 @@ ], "stable_path": "${GSTACK_HOME:-$HOME/.gstack}/bin/gstack-distill-free-text" }, - { - "name": "gstack-first-task-detect", - "source_path": "bin/gstack-first-task-detect", - "consumer_modules": [ - "autoplan", - "benchmark", - "benchmark-models", - "browse", - "canary", - "claude", - "codex", - "context-restore", - "context-save", - "cso", - "design-consultation", - "design-html", - "design-review", - "design-shotgun", - "devex-review", - "diagram", - "document-generate", - "document-release", - "gstack", - "health", - "investigate", - "ios-clean", - "ios-design-review", - "ios-fix", - "ios-qa", - "ios-sync", - "land-and-deploy", - "landing-report", - "learn", - "make-pdf", - "office-hours", - "open-gstack-browser", - "pair-agent", - "plan-ceo-review", - "plan-design-review", - "plan-devex-review", - "plan-eng-review", - "plan-tune", - "qa", - "qa-only", - "retro", - "review", - "scrape", - "setup-browser-cookies", - "setup-deploy", - "setup-gbrain", - "ship", - "skillify", - "spec", - "sync-gbrain" - ], - "stable_path": "${GSTACK_HOME:-$HOME/.gstack}/bin/gstack-first-task-detect" - }, { "name": "gstack-gbrain-detect", "source_path": "bin/gstack-gbrain-detect", @@ -7041,56 +6799,19 @@ "name": "gstack-learnings-log", "source_path": "bin/gstack-learnings-log", "consumer_modules": [ - "autoplan", - "benchmark", - "benchmark-models", - "browse", - "canary", - "claude", - "codex", - "context-restore", - "context-save", "cso", "design-consultation", - "design-html", "design-review", - "design-shotgun", "devex-review", - "diagram", - "document-generate", - "document-release", - "gstack", - "health", "investigate", - "ios-clean", - "ios-design-review", - "ios-fix", - "ios-qa", - "ios-sync", - "land-and-deploy", - "landing-report", "learn", - "make-pdf", "office-hours", - "open-gstack-browser", - "pair-agent", - "plan-ceo-review", - "plan-design-review", - "plan-devex-review", - "plan-eng-review", - "plan-tune", "qa", "qa-only", "retro", "review", "scrape", - "setup-browser-cookies", - "setup-deploy", - "setup-gbrain", - "ship", - "skillify", - "spec", - "sync-gbrain" + "skillify" ], "stable_path": "${GSTACK_HOME:-$HOME/.gstack}/bin/gstack-learnings-log" }, @@ -7098,56 +6819,17 @@ "name": "gstack-learnings-search", "source_path": "bin/gstack-learnings-search", "consumer_modules": [ - "autoplan", - "benchmark", - "benchmark-models", - "browse", - "canary", - "claude", - "codex", - "context-restore", - "context-save", "cso", "design-consultation", - "design-html", "design-review", - "design-shotgun", - "devex-review", - "diagram", - "document-generate", - "document-release", - "gstack", - "health", "investigate", - "ios-clean", - "ios-design-review", - "ios-fix", - "ios-qa", - "ios-sync", - "land-and-deploy", - "landing-report", "learn", - "make-pdf", "office-hours", - "open-gstack-browser", - "pair-agent", "plan-ceo-review", - "plan-design-review", - "plan-devex-review", - "plan-eng-review", - "plan-tune", "qa", "qa-only", "retro", - "review", - "scrape", - "setup-browser-cookies", - "setup-deploy", - "setup-gbrain", - "ship", - "skillify", - "spec", - "sync-gbrain" + "review" ], "stable_path": "${GSTACK_HOME:-$HOME/.gstack}/bin/gstack-learnings-search" }, @@ -7189,9 +6871,7 @@ "guard", "investigate", "learn", - "office-hours", "plan-tune", - "ship", "spec", "unfreeze" ], @@ -7201,110 +6881,15 @@ "name": "gstack-pr-title-rewrite.sh", "source_path": "bin/gstack-pr-title-rewrite.sh", "consumer_modules": [ - "document-release", "ship" ], "stable_path": "${GSTACK_HOME:-$HOME/.gstack}/bin/gstack-pr-title-rewrite.sh" }, - { - "name": "gstack-question-log", - "source_path": "bin/gstack-question-log", - "consumer_modules": [ - "autoplan", - "canary", - "claude", - "codex", - "context-restore", - "context-save", - "cso", - "design-consultation", - "design-html", - "design-review", - "design-shotgun", - "devex-review", - "diagram", - "document-generate", - "document-release", - "health", - "investigate", - "ios-clean", - "ios-design-review", - "ios-fix", - "ios-qa", - "ios-sync", - "land-and-deploy", - "landing-report", - "learn", - "office-hours", - "open-gstack-browser", - "pair-agent", - "plan-ceo-review", - "plan-design-review", - "plan-devex-review", - "plan-eng-review", - "plan-tune", - "qa", - "qa-only", - "retro", - "review", - "scrape", - "setup-deploy", - "setup-gbrain", - "ship", - "skillify", - "spec", - "sync-gbrain" - ], - "stable_path": "${GSTACK_HOME:-$HOME/.gstack}/bin/gstack-question-log" - }, { "name": "gstack-question-preference", "source_path": "bin/gstack-question-preference", "consumer_modules": [ - "autoplan", - "canary", - "claude", - "codex", - "context-restore", - "context-save", - "cso", - "design-consultation", - "design-html", - "design-review", - "design-shotgun", - "devex-review", - "diagram", - "document-generate", - "document-release", - "health", - "investigate", - "ios-clean", - "ios-design-review", - "ios-fix", - "ios-qa", - "ios-sync", - "land-and-deploy", - "landing-report", - "learn", - "office-hours", - "open-gstack-browser", - "pair-agent", - "plan-ceo-review", - "plan-design-review", - "plan-devex-review", - "plan-eng-review", - "plan-tune", - "qa", - "qa-only", - "retro", - "review", - "scrape", - "setup-deploy", - "setup-gbrain", - "ship", - "skillify", - "spec", - "sync-gbrain" + "plan-tune" ], "stable_path": "${GSTACK_HOME:-$HOME/.gstack}/bin/gstack-question-preference" }, @@ -7313,7 +6898,6 @@ "source_path": "bin/gstack-redact", "consumer_modules": [ "document-generate", - "document-release", "ship", "spec" ], @@ -7327,63 +6911,6 @@ ], "stable_path": "${GSTACK_HOME:-$HOME/.gstack}/bin/gstack-redact-audit-log" }, - { - "name": "gstack-repo-mode", - "source_path": "bin/gstack-repo-mode", - "consumer_modules": [ - "autoplan", - "benchmark", - "benchmark-models", - "browse", - "canary", - "claude", - "codex", - "context-restore", - "context-save", - "cso", - "design-consultation", - "design-html", - "design-review", - "design-shotgun", - "devex-review", - "diagram", - "document-generate", - "document-release", - "gstack", - "health", - "investigate", - "ios-clean", - "ios-design-review", - "ios-fix", - "ios-qa", - "ios-sync", - "land-and-deploy", - "landing-report", - "learn", - "make-pdf", - "office-hours", - "open-gstack-browser", - "pair-agent", - "plan-ceo-review", - "plan-design-review", - "plan-devex-review", - "plan-eng-review", - "plan-tune", - "qa", - "qa-only", - "retro", - "review", - "scrape", - "setup-browser-cookies", - "setup-deploy", - "setup-gbrain", - "ship", - "skillify", - "spec", - "sync-gbrain" - ], - "stable_path": "${GSTACK_HOME:-$HOME/.gstack}/bin/gstack-repo-mode" - }, { "name": "gstack-review-log", "source_path": "bin/gstack-review-log", @@ -7391,12 +6918,7 @@ "autoplan", "codex", "devex-review", - "plan-ceo-review", - "plan-design-review", - "plan-devex-review", - "plan-eng-review", - "review", - "ship" + "review" ], "stable_path": "${GSTACK_HOME:-$HOME/.gstack}/bin/gstack-review-log" }, @@ -7406,109 +6928,29 @@ "consumer_modules": [ "devex-review", "land-and-deploy", - "plan-ceo-review", - "plan-design-review", - "plan-devex-review", - "plan-eng-review", "review", "ship" ], "stable_path": "${GSTACK_HOME:-$HOME/.gstack}/bin/gstack-review-read" }, - { - "name": "gstack-session-kind", - "source_path": "bin/gstack-session-kind", - "consumer_modules": [ - "autoplan", - "benchmark", - "benchmark-models", - "browse", - "canary", - "claude", - "codex", - "context-restore", - "context-save", - "cso", - "design-consultation", - "design-html", - "design-review", - "design-shotgun", - "devex-review", - "diagram", - "document-generate", - "document-release", - "gstack", - "health", - "investigate", - "ios-clean", - "ios-design-review", - "ios-fix", - "ios-qa", - "ios-sync", - "land-and-deploy", - "landing-report", - "learn", - "make-pdf", - "office-hours", - "open-gstack-browser", - "pair-agent", - "plan-ceo-review", - "plan-design-review", - "plan-devex-review", - "plan-eng-review", - "plan-tune", - "qa", - "qa-only", - "retro", - "review", - "scrape", - "setup-browser-cookies", - "setup-deploy", - "setup-gbrain", - "ship", - "skillify", - "spec", - "sync-gbrain" - ], - "stable_path": "${GSTACK_HOME:-$HOME/.gstack}/bin/gstack-session-kind" - }, { "name": "gstack-slug", "source_path": "bin/gstack-slug", "consumer_modules": [ "autoplan", "benchmark", - "benchmark-models", - "browse", "canary", - "claude", - "codex", "context-restore", "context-save", - "cso", "design-consultation", "design-html", "design-review", "design-shotgun", "devex-review", - "diagram", - "document-generate", - "document-release", - "gstack", "health", - "investigate", - "ios-clean", - "ios-design-review", - "ios-fix", - "ios-qa", - "ios-sync", "land-and-deploy", - "landing-report", "learn", - "make-pdf", "office-hours", - "open-gstack-browser", - "pair-agent", "plan-ceo-review", "plan-design-review", "plan-devex-review", @@ -7517,15 +6959,8 @@ "qa", "qa-only", "retro", - "review", - "scrape", - "setup-browser-cookies", - "setup-deploy", - "setup-gbrain", "ship", - "skillify", - "spec", - "sync-gbrain" + "spec" ], "stable_path": "${GSTACK_HOME:-$HOME/.gstack}/bin/gstack-slug" }, @@ -7538,177 +6973,6 @@ ], "stable_path": "${GSTACK_HOME:-$HOME/.gstack}/bin/gstack-taste-update" }, - { - "name": "gstack-telemetry-log", - "source_path": "bin/gstack-telemetry-log", - "consumer_modules": [ - "autoplan", - "benchmark", - "benchmark-models", - "browse", - "canary", - "claude", - "codex", - "context-restore", - "context-save", - "cso", - "design-consultation", - "design-html", - "design-review", - "design-shotgun", - "devex-review", - "diagram", - "document-generate", - "document-release", - "gstack", - "health", - "investigate", - "ios-clean", - "ios-design-review", - "ios-fix", - "ios-qa", - "ios-sync", - "land-and-deploy", - "landing-report", - "learn", - "make-pdf", - "office-hours", - "open-gstack-browser", - "pair-agent", - "plan-ceo-review", - "plan-design-review", - "plan-devex-review", - "plan-eng-review", - "plan-tune", - "qa", - "qa-only", - "retro", - "review", - "scrape", - "setup-browser-cookies", - "setup-deploy", - "setup-gbrain", - "ship", - "skillify", - "spec", - "sync-gbrain" - ], - "stable_path": "${GSTACK_HOME:-$HOME/.gstack}/bin/gstack-telemetry-log" - }, - { - "name": "gstack-timeline-log", - "source_path": "bin/gstack-timeline-log", - "consumer_modules": [ - "autoplan", - "benchmark", - "benchmark-models", - "browse", - "canary", - "claude", - "codex", - "context-restore", - "context-save", - "cso", - "design-consultation", - "design-html", - "design-review", - "design-shotgun", - "devex-review", - "diagram", - "document-generate", - "document-release", - "gstack", - "health", - "investigate", - "ios-clean", - "ios-design-review", - "ios-fix", - "ios-qa", - "ios-sync", - "land-and-deploy", - "landing-report", - "learn", - "make-pdf", - "office-hours", - "open-gstack-browser", - "pair-agent", - "plan-ceo-review", - "plan-design-review", - "plan-devex-review", - "plan-eng-review", - "plan-tune", - "qa", - "qa-only", - "retro", - "review", - "scrape", - "setup-browser-cookies", - "setup-deploy", - "setup-gbrain", - "ship", - "skillify", - "spec", - "sync-gbrain" - ], - "stable_path": "${GSTACK_HOME:-$HOME/.gstack}/bin/gstack-timeline-log" - }, - { - "name": "gstack-update-check", - "source_path": "bin/gstack-update-check", - "consumer_modules": [ - "autoplan", - "benchmark", - "benchmark-models", - "browse", - "canary", - "claude", - "codex", - "context-restore", - "context-save", - "cso", - "design-consultation", - "design-html", - "design-review", - "design-shotgun", - "devex-review", - "diagram", - "document-generate", - "document-release", - "gstack", - "health", - "investigate", - "ios-clean", - "ios-design-review", - "ios-fix", - "ios-qa", - "ios-sync", - "land-and-deploy", - "landing-report", - "learn", - "make-pdf", - "office-hours", - "open-gstack-browser", - "pair-agent", - "plan-ceo-review", - "plan-design-review", - "plan-devex-review", - "plan-eng-review", - "plan-tune", - "qa", - "qa-only", - "retro", - "review", - "scrape", - "setup-browser-cookies", - "setup-deploy", - "setup-gbrain", - "ship", - "skillify", - "spec", - "sync-gbrain" - ], - "stable_path": "${GSTACK_HOME:-$HOME/.gstack}/bin/gstack-update-check" - }, { "name": "gstack-version-bump", "source_path": "bin/gstack-version-bump", @@ -7725,7 +6989,53 @@ "win32": "make-pdf/dist/pdf.exe" }, "consumer_modules": [ - "make-pdf" + "autoplan", + "benchmark", + "benchmark-models", + "browse", + "canary", + "codex", + "context-restore", + "context-save", + "cso", + "design-consultation", + "design-html", + "design-review", + "design-shotgun", + "devex-review", + "diagram", + "document-generate", + "document-release", + "freeze", + "guard", + "health", + "investigate", + "ios-qa", + "ios-sync", + "land-and-deploy", + "landing-report", + "learn", + "make-pdf", + "office-hours", + "open-gstack-browser", + "pair-agent", + "plan-ceo-review", + "plan-design-review", + "plan-devex-review", + "plan-eng-review", + "plan-tune", + "qa", + "qa-only", + "retro", + "review", + "scrape", + "setup-browser-cookies", + "setup-gbrain", + "ship", + "skillify", + "spec", + "sync-gbrain", + "unfreeze" ], "stable_path": "${GSTACK_HOME:-$HOME/.gstack}/bin/make-pdf" }, diff --git a/docs/gstack-2/PRIVACY.md b/docs/gstack-2/PRIVACY.md index c672500b3..4a43ddcd5 100644 --- a/docs/gstack-2/PRIVACY.md +++ b/docs/gstack-2/PRIVACY.md @@ -17,6 +17,12 @@ unit test is not a substitute for the remaining live egress audit listed in | Physical iPhone | local Mac/device bridge | optional pre-existing Tailscale path only when explicitly configured | device session to a cloud-device farm or alternate driver provider | | Telemetry | off in the GStack 2 contract | minimal legacy telemetry only after its independent opt-in | code, prompts, paths, repo/branch names, user content | +Skill update discovery and installation belong to the user-invoked Agent +Skills installer (`npx skills update`). GStack preambles make no passive +release request. The retained `gstack-update-check` compatibility helper exits +before state or network access unless the operator explicitly passes +`--force`; `update_check` also defaults to false. + Network installation is not Context.dev consent. Browser navigation is not Context.dev consent. A key present in the environment is not consent. The Context client requires persisted selection `context`, mode `context`, and diff --git a/docs/gstack-2/RELEASE-INTEGRITY.md b/docs/gstack-2/RELEASE-INTEGRITY.md new file mode 100644 index 000000000..4ae6659fc --- /dev/null +++ b/docs/gstack-2/RELEASE-INTEGRITY.md @@ -0,0 +1,118 @@ +# Release integrity + +GStack has two explicit version identities during the 2.0 migration: + +- `VERSION` and `package.json.version` are the repository/package release + counter. They remain byte-equal and retain the existing four-slot format so + the 1.x compatibility ship queue does not silently fail open. +- `package.json.gstack.runtimeVersion`, `runtime/index.js`, + `runtime/install.js`, and every standards-installed bootstrap declare the + managed-runtime protocol release `2.0.0`. The official artifact tag and + manifest use that value. + +They are intentionally different namespaces. CI fails if either identity +drifts inside its own namespace. + +## Runtime release + +The `Release runtime artifacts` workflow builds the complete managed bundle on +six native targets: + +```text +darwin-arm64 darwin-x64 +linux-arm64 linux-x64 (glibc) +windows-arm64 windows-x64 +``` + +Each archive has one `gstack/` root and no symlinks. CI records an exact byte +count and SHA-256, signs the archive keylessly with Cosign, emits a Sigstore +bundle, and also creates a GitHub build-provenance attestation. The release +manifest contains only official GitHub Release URLs and the fixed workflow +certificate identity. + +Browser-capable archives include the Playwright-managed Chromium directory at +`.gstack-runtime-browsers`. The builder runs `playwright install chromium` +only—never `--with-deps` or `sudo`—copies physical files into the immutable +slot, and launch-smokes that exact Chromium on every native release runner. +The stable capability launcher sets `PLAYWRIGHT_BROWSERS_PATH` to the active +slot; it does not rely on an operator's global Playwright cache. + +Each official artifact also owns its Bun executable. Release CI pins Bun +1.3.14, copies that physical executable into +`.gstack-runtime-tools/bun[.exe]`, records its relative path and probed version +in `.gstack-bundle.json`, and exposes it through the stable `$GSTACK_HOME/bin/bun` +launcher. The tagged Bun license inventory and source/relink notice are +vendored under `runtime/licenses/` and their expected hashes are release-gated. + +The native release smoke removes the `setup-bun` directory from `PATH`, supplies +only an explicit `GSTACK_NODE`, runs the stable managed-Bun launcher, and opens +`about:blank` through the installed browser before cleanup. Compiled browser +clients use their adjacent `server-node.mjs` on every platform, so browser, +design, and PDF readiness does not depend on a host-global Bun installation. + +The bootstrap always verifies the manifest schema, target, exact byte count, +and SHA-256 before extraction. If Cosign is already installed it additionally +verifies the Sigstore bundle, certificate identity, and GitHub Actions OIDC +issuer. Cosign is not downloaded or required on an end-user machine. + +The official Linux archives are glibc builds. The bootstrap detects a musl +host before any network request and returns a typed unsupported-platform error; +it does not download a glibc archive that cannot validate on Alpine. Musl is +not claimed by the current six-artifact release matrix. + +Runtime tool requirements are capability-scoped. Node is the bootstrap and +stable-launcher floor. On Windows, retained shell-based helpers additionally +require Git for Windows Bash; doctor reports that check explicitly. Python 3 is +only required by specialist flows that label it as a prerequisite. Missing +Bash or Python does not change the native browser/design/PDF payload or turn +those capabilities into host-global Bun consumers. + +## npm package + +The npm tarball is a small runtime-control/bootstrap package, not a second +GStack installer. Its allowlist contains the Node-only runtime control plane, +the `gstack` launcher, documentation, license, and version marker. It excludes +the six skills and large compiled capability payloads. Skills come from the +Agent Skills installer; optional capability payloads come from the verified +runtime release only after approval. + +CI packs the tarball, installs it into an isolated directory, invokes +`gstack --version`, initializes isolated state through `gstack setup`, and +invokes `gstack-runtime-bootstrap --help`. It also enforces conservative packed +size and entry-count ceilings. + +## Dependency audit policy + +`puppeteer-core` was unused and removed. Playwright remains the only browser +manager. Bun's current audit command does not distinguish production from +development dependencies, so CI gates critical advisories across the entire +lockfile and reports the complete audit. At the 2026-07-20 checkpoint, the +remaining high advisories are under the retained development-only Claude Agent +SDK and Hugging Face evaluation stack; neither is copied into the managed +runtime. They must be re-audited before changing those test SDKs or promoting +the release status. + +## Static-analysis disposition + +- Shell syntax and high-confidence ShellCheck errors are gated on setup and + release/build boundaries. Runtime JavaScript is syntax-checked with the + supported Node floor. Workflow actions are pinned and actionlint remains its + own gate. +- Added production/docs lines are scanned by GStack's deterministic redaction + engine. Removed lines do not block credential cleanup. Known synthetic-secret + fixture/evaluation paths are excluded so the gate stays meaningful; those + paths retain dedicated redaction tests. +- The repository has no TypeScript compiler dependency or `tsconfig.json`. + Calling Bun transpilation a typecheck would be false, while enabling `tsc` + across the legacy mixed JS/TS/generated tree is a separate migration. This + candidate records typecheck as not yet enforceable rather than a green gate. +- There is no repository formatter or general source-linter configuration. + Introducing one during release hardening would mechanically rewrite + byte-pinned generated and parity corpora. Actionlint, ShellCheck, runtime + syntax, existing tests, and generated-freshness checks are enforced now; a + formatter/linter migration remains explicit follow-up work. +- No `CODEOWNERS` file is invented. Git history identifies contributors but + does not prove the current GitHub user/team with review authority in the + `time-attack` organization. Repository administrators must name a real team + and enable required CODEOWNER review together; until then ownership review + is an open governance control, not a fabricated file. diff --git a/docs/gstack-2/SKILL-MIGRATION.md b/docs/gstack-2/SKILL-MIGRATION.md index 1b30505ce..663aef0b0 100644 --- a/docs/gstack-2/SKILL-MIGRATION.md +++ b/docs/gstack-2/SKILL-MIGRATION.md @@ -2,7 +2,7 @@ Pinned baseline: `bb57306d98c97011b0919c6132705a15b1579781`. -GStack 2 exposes exactly six public Codex skills: `plan`, `design`, `qa`, `debug`, `review`, and `ship`. The 55 legacy templates remain mechanically rendered as internal reference modules; all 16 carved section templates are inlined with the canonical Codex resolver path. Thirty-one primary modules are mandatory specialist inputs, and 24 supporting modules remain reachable through compatibility routing. +GStack 2 exposes exactly six public skills: `plan`, `design`, `qa`, `debug`, `review`, and `ship`. The specialist bodies from 55 legacy templates remain provenance-pinned internal reference modules. The retired 1.x shared onboarding wrapper is excluded from canonical execution, and all 16 carved specialist sections are package-local lazy references loaded only at their original workflow point. Thirty-one primary modules are mandatory specialist inputs, and 24 supporting modules remain reachable through compatibility routing. The fixed public modes are: Design = `Explore | Generate | Critique | Implement`; QA = `Report | Fix`; Debug = `Diagnose-only | Fix`; Review = `Normal | Security | Performance | Deep`; Ship = `Prepare | Land | Deploy | Monitor | Resume`. Richer legacy modes are internal aliases only. @@ -74,6 +74,6 @@ The fixed public modes are: Design = `Explore | Generate | Critique | Implement` ## Mechanical versus judgment changes -- `MECHANICAL_PORT`: canonical Codex resolver expansion, section inlining, safety prose, and path rewrites only. -- `BUG_FIX`: the mechanical body plus a clearly delimited judgment overlay sourced from one of the 16 upstream PRs and its regression fixture. +- `JUDGMENT_PRESERVING_CARVE`: pinned specialist workflow with the retired shared onboarding wrapper excluded, retired invocations resolved to six public routes, host/runtime paths normalized, and large carved phases loaded lazily from package-local pinned references. +- `BUG_FIX`: the canonical carved body plus a clearly delimited judgment overlay sourced from one of the 16 upstream PRs and its regression fixture. - Asset relocation is byte-for-byte from the pinned Git blob and is indexed per tree. diff --git a/docs/gstack-2/STATUS.md b/docs/gstack-2/STATUS.md index 4a120dffe..99340175b 100644 --- a/docs/gstack-2/STATUS.md +++ b/docs/gstack-2/STATUS.md @@ -1,11 +1,11 @@ # GStack 2 status -**Status at the 2026-07-17 documentation checkpoint: `BLOCKED`.** +**Status at the 2026-07-20 documentation checkpoint: `BLOCKED`.** The candidate contains substantial implementation, but it is not a released or verified GStack 2. `DONE` is prohibited until every P0 gate is backed by the -required evidence layer. Current blockers include the waived physical-iPhone P0 -gate and the failed live v3 installed-host adversarial gate, including +required evidence layer. The physical-iPhone P0 gate is now green. The current +blocker is the failed live v3 installed-host adversarial gate, including incomplete representative host UI/process coverage. Native CI is green on macOS, Ubuntu, Windows, and the Dev Container. No release-branch push, draft PR, or PR-ready claim is authorized by this status. @@ -57,8 +57,8 @@ PR, or PR-ready claim is authorized by this status. three retained Claude Haiku live samples are classified `REGRESSION`; they are preserved as noisy supplemental evidence, never cherry-picked as a primary gate or represented as green. -- [x] The current macOS GStack 2 suite is green at commit `a8a5fa1a`: 150 pass - / 0 fail and 1,189 assertions across 16 files. +- [x] The current macOS GStack 2 suite is green: 151 pass / 0 fail and 1,194 + assertions across 16 files. - [x] Optional host-neutral runtime implemented with canonical paths, repo/worktree state identity, locks, atomic writes, effect claims, doctor/config/state/cleanup, migrations, upgrade/rollback, and uninstall. @@ -75,6 +75,15 @@ PR, or PR-ready claim is authorized by this status. production-only install with the development SDK absent, completed a local browser journey and Sharp full-page screenshot, and uninstalled while preserving state. +- [x] The current candidate additionally captures a runtime-owned Bun 1.3.14 + executable under `.gstack-runtime-tools`, records its path/version in the + bundle manifest, vendors the tagged license/source notices, and routes the + compiled browser to adjacent `server-node.mjs` on every platform. Focused + tests cover managed-Bun launch with host Bun absent. The older native-CI and + bundle-size evidence above predates this payload; the new six-target signed + release workflow must execute before this layer is called verified. Windows + Bash and specialist Python checks are reported separately and are not native + browser/design/PDF dependencies. - [x] Filesystem lifecycle coverage passes for clean install/uninstall, paths with spaces, source symlinks with internal-link rejection, read-only destination reporting on macOS, interrupted-pointer rollback, crash-journal @@ -98,20 +107,14 @@ PR, or PR-ready claim is authorized by this status. fail / 398 assertions; and diagram 51 pass / 0 fail / 1 skip / 120 assertions. The opt-in paid diagram lane recorded two skips and is not live provider evidence. -- [x] Physical-iOS preflight recorded 9 pass / 0 fail / 1 deploy skip and 29 - assertions. The direct smoke then returned typed code - `signing_unavailable`, category `setup_gate`; it installed no app and wrote no - pass artifact. A later attempt against the explicitly selected iPhone10,6 on - iOS 16.7.10 returned `device_not_wired`; legacy USB pairing validates, but - CoreDevice pairing is unsupported. After the user explicitly authorized the - other connected phone, pairing/signing/build/install/launch/tunnel setup - passed, but `POST /session/acquire` closed its socket before the five-check - loop completed. At harness stop, no device session remained attached and the - fixture app was left installed. These are retained operator observations; - no pass artifact exists. -- [x] The user explicitly stopped and waived further physical-iPhone testing. - No more device access is authorized. The earlier partial/setup-gate evidence - remains retained, but it is not a physical-device P0 pass. +- [x] After the user re-authorized the connected test phone, the physical-iOS + lane passed 12/12. The existing Apple-signed wildcard development profile and + matching private key signed the reserved fixture; no fabricated profile was + needed. Release guard, safe in-place install, launch, CoreDevice bootstrap, + boot-token rotation, all five session acquire/release cycles, ten live + screenshots, accessibility elements, coordinate taps, bundle checks, state + cleanup, tunnel shutdown, and temporary-workspace cleanup passed. Artifact: + [`evidence/ios-physical-device-2026-07-20T17-49-19-302Z.json`](./evidence/ios-physical-device-2026-07-20T17-49-19-302Z.json). - [x] Installed-host adversarial evidence is retained without relabeling: v1 **failed**; immutable v2 **failed** even though QA passed because the classifier produced false negatives for debug, review, and ship; v3 offline @@ -153,11 +156,6 @@ PR, or PR-ready claim is authorized by this status. the immutable one-shot result is **3/4**, with review failing compound inspection. Do not retry or relabel it. The six hosts remain **Verified at the installer layer only**; representative UI/process coverage is incomplete. -- [ ] The physical-iPhone five-check loop remains incomplete and is explicitly - waived by the user. No further device access is authorized. The unsigned - Release guard and earlier preflight/setup-gate observations remain useful - partial evidence. A signed fixture was later installed and launched, but its - session-acquire request failed; no pass artifact exists and P0 remains open. - [ ] Finish final evidence-linked disposition for every infrastructure item; see the 25-row table in [ARCHITECTURE.md](./ARCHITECTURE.md). Current focused evidence does not replace the remaining live gates. @@ -179,7 +177,7 @@ PR, or PR-ready claim is authorized by this status. | Context integration | [CONTEXT-DEV.md](./CONTEXT-DEV.md) | Automated contract 22/139 green; verified-key official-endpoint live smoke passed | | Host matrix | [HOST-COMPATIBILITY.md](./HOST-COMPATIBILITY.md) | 470/470 checks; Codex runtime-absent run passed; live v3 failed; other UI launches pending | | Privacy boundary | [PRIVACY.md](./PRIVACY.md) | Implemented contract; full retained-tool egress audit pending | -| Physical iOS | [IOS-PHYSICAL-DEVICE.md](./IOS-PHYSICAL-DEVICE.md) | Partial setup evidence only; user stopped/waived further device testing; no P0 pass artifact | +| Physical iOS | [IOS-PHYSICAL-DEVICE.md](./IOS-PHYSICAL-DEVICE.md), [live artifact](./evidence/ios-physical-device-2026-07-20T17-49-19-302Z.json) | 12/12 harness tests and five-of-five live iterations passed on a wired paired iPhone | | Upgrade/recovery | [UPGRADE-AND-ROLLBACK.md](./UPGRADE-AND-ROLLBACK.md) | Runtime installer 25 pass / 341 assertions; deterministic clean macOS arm64 bundle audit recorded | ## Interpretation rules diff --git a/docs/gstack-2/TEST-EVIDENCE.md b/docs/gstack-2/TEST-EVIDENCE.md index de27cf050..dc46ccee4 100644 --- a/docs/gstack-2/TEST-EVIDENCE.md +++ b/docs/gstack-2/TEST-EVIDENCE.md @@ -1,6 +1,6 @@ # GStack 2.0 test evidence -## Candidate checkpoint — 2026-07-17 +## Candidate checkpoint — 2026-07-20 These results describe the working tree at the documentation checkpoint. They are deliberately narrower than the P0 release matrix. Commands that need a @@ -10,7 +10,7 @@ pass from deterministic, offline, or filesystem-only evidence. | Command / probe | Observed result | What it proves / does not prove | |---|---|---| | Earlier focused macOS `bun test test/gstack2-*.test.ts` candidate run | **Exit 0: 136 pass / 0 fail**, 1,128 assertions across 15 files. Log: `/tmp/gstack2-test-command-candidate-final2.log`. | Historical focused checkpoint retained rather than overwritten. | -| Current macOS `bun run test:gstack2`, commit `a8a5fa1a` | **Exit 0: 150 pass / 0 fail**, 1,189 assertions across 16 files. | Current generated freshness, routing, runtime, privacy, installer, upgrade, parity, and adversarial-harness surface is green. Native and broad evidence are recorded separately. | +| Current macOS `bun run test:gstack2` | **Exit 0: 151 pass / 0 fail**, 1,194 assertions across 16 files. | Current generated freshness, routing, runtime, privacy, installer, upgrade, parity, and adversarial-harness surface is green. Native and broad evidence are recorded separately; this working-tree result is not attributed to the earlier native-CI commit. | | `bun test --timeout 30000 test/gstack2-skills.test.ts test/gstack2-skills-routing.test.ts` after regeneration | **Exit 0: 3 pass / 0 fail**, 81 assertions. | The pinned corpus/parity test and both 25-scenario structured-routing tests are green. This remains structural/fixture evidence, not specialist live execution. | | `bun run scripts/gstack2/run-parity.ts`, 2026-07-17 rerun | **Exit 0: 4,681 checks passed**; 55 modules, 16 sections, 25 scenarios, 16 regressions, 78 assets. | Current source/render/provenance/contract/asset/fixture parity is green. It is deterministic parity, not live-host behavior. | | Earlier regenerated structural parity checkpoint | **Exit 0: 2,403 checks passed** with the then-current 55/16/25/16/45 inventory. | Historical candidate checkpoint before later thin-prelude and asset coverage; superseded by the current 4,681-check rerun. | @@ -24,8 +24,8 @@ pass from deterministic, offline, or filesystem-only evidence. | Six-skill catalog measurement after regeneration | Six names/descriptions total 982 characters, about 246 four-character token-equivalents; baseline correctly parsed catalog was about 1,100. | 77.6% reduction, above the 75% gate. Re-measure if frontmatter changes. The buggy 4,214 baseline estimate is not used. | | `bun test ios-qa/daemon/test` | **95 pass / 0 fail**, 229 assertions. | Covers daemon regressions including malformed device JSON, hardware-UDID/CoreDevice selection, bounded proxy timeout, and expected-bundle mutation header. It is not a signed-app live pass. | | Focused DebugBridge/template build tests | **33 pass / 0 fail** in the candidate run, including Swift debug compilation/XCTest and Release symbol absence. | Static/build evidence for debug-only bridge wiring; still not an installed physical-app journey. | -| Physical-iOS E2E preflight | **9 pass / 0 fail / 1 deploy check skipped**, 29 assertions. | The earlier connected-device/setup and unsigned Release checks pass. The deploy skip leaves the signed-device P0 gate open. | -| Direct physical-device smoke | **Incomplete, not a pass:** one target returned `signing_unavailable`; the legacy iPhone10,6 target returned `device_not_wired` / CoreDevice error 1011; the subsequently authorized CoreDevice-compatible phone passed pairing, signing, build, install, launch, and tunnel setup but `POST /session/acquire` closed its socket before the five-check loop completed. | The harness process was stopped at the user's request. At harness stop, the signed fixture was left installed with data intact and no device session remained attached. These are retained operator observations; no pass artifact was written. Further iPhone testing is waived and unauthorized for this checkpoint. | +| Earlier physical-iOS setup attempts | **Incomplete, not passes:** the preflight recorded 9 pass / 0 fail / 1 deploy check skipped and 29 assertions; one target returned `signing_unavailable`; the legacy iPhone10,6 target returned `device_not_wired` / CoreDevice error 1011; a later authorized phone reached tunnel setup but its first session-acquire socket closed. | Immutable historical setup/partial evidence. The later pass does not erase or relabel these attempts. | +| Physical-device smoke, 2026-07-20 | **PASS:** 12/12 harness checks and all five required live iterations. Release symbols were absent; signing, safe in-place install, launch, CoreDevice bootstrap, boot-token rotation, five session acquire/release cycles, ten screenshots, accessibility reads, coordinate taps, bundle checks, state cleanup, tunnel shutdown, and temporary-workspace cleanup passed. | Closes the physical-iPhone evidence layer for the tested wired paired `iPhone17,1`; it is not a claim about every iPhone or iOS release. Redacted artifact: [`ios-physical-device-2026-07-20T17-49-19-302Z.json`](./evidence/ios-physical-device-2026-07-20T17-49-19-302Z.json). | | Context.dev contract (`gstack2-runtime-context.test.ts`) | **22 pass / 0 fail**, 139 assertions. | Persists explicit host/local-browser/none choices without consent, rejects private/credential URLs and request material plus private DNS, proves zero lookup/fetch before mode+consent, validates documented endpoint paths and exact failure taxonomy, and makes search typed unsupported without network. | | `gstack context smoke --url https://www.context.dev --json` | **PASS:** the official `/web/scrape/markdown` endpoint returned `ok: true` and credit metadata. | The verified key entered through protected stdin/environment worked. The temporary secrets file was mode `0600`, the isolated home was removed, and the safe output did not contain the key. Committed redacted artifact: [`evals/context-dev/live-smoke-2026-07-17.json`](../../evals/context-dev/live-smoke-2026-07-17.json). | | Standard installer matrix | **PASS: 470/470 checks**, 16 install cases, two removal cases, `skills` CLI 1.5.19. | Project/global installs pass for six hosts, selected-skill and opt-in compatibility-alias cases, copies, and hashes. This remains installer/filesystem evidence. Committed artifact: [`evals/installation/install-matrix.json`](../../evals/installation/install-matrix.json). | @@ -70,7 +70,7 @@ macOS + Linux + native Windows + Dev Container local browser live journey + cancellation/leak cleanup (passed) PDF strict + diagram suites Context.dev verified-key public-page smoke -physical signed-iPhone five-check loop + Release symbol check (waived; partial evidence is not a pass) +physical signed-iPhone five-check loop + Release symbol check (passed on 2026-07-20; retain earlier failures separately) upgrade/fail/recover/rollback/uninstall end-to-end ``` diff --git a/docs/gstack-2/UPGRADE-AND-ROLLBACK.md b/docs/gstack-2/UPGRADE-AND-ROLLBACK.md index 1076de59f..2aa00fa4d 100644 --- a/docs/gstack-2/UPGRADE-AND-ROLLBACK.md +++ b/docs/gstack-2/UPGRADE-AND-ROLLBACK.md @@ -6,11 +6,15 @@ remains Markdown-only; runtime dependencies are never smuggled into that path. ## Skill updates -Install and update the canonical Agent Skills source with the same standard -installer that placed it: +Install the canonical Agent Skills source, then use that installer's tracked +source and lock metadata for discovery, updates, and removal: ```bash npx skills add time-attack/gstack +npx skills update # interactive scope +npx skills update -p # project installs only +npx skills update -g # global installs only +npx skills remove # interactive removal ``` Use that installer's update/remove commands and scope. It owns project/global @@ -18,6 +22,12 @@ placement, host destination paths, and selected-skill choices. GStack must not re-detect hosts during an update or enroll a host/skill the user did not previously select. +The current installer exposes update rather than a separate dry-run/check +command. GStack skill preambles do not phone GitHub for releases. The retained +`gstack-update-check --force` path exists only for an explicitly requested 1.x +compatibility check; it is never run passively by GStack 2. Optional runtime +activation remains the separate reviewed-source transaction documented below. + Before accepting an update, list the source and confirm that the defaults are still exactly `plan`, `design`, `qa`, `debug`, `review`, and `ship`. Pure judgment must remain usable even if the optional runtime update fails. diff --git a/docs/gstack-2/adr/0001-public-infrastructure-tools.md b/docs/gstack-2/adr/0001-public-infrastructure-tools.md new file mode 100644 index 000000000..a0b53fe8a --- /dev/null +++ b/docs/gstack-2/adr/0001-public-infrastructure-tools.md @@ -0,0 +1,48 @@ +# ADR 0001: public infrastructure tools + +- Status: accepted for the GStack 2 candidate +- Date: 2026-07-20 +- Scope: installation, first-use UX, browser binaries, release integrity, and + updater ownership + +## Decision + +Use public tools only where they have a narrow, replaceable responsibility: + +| Responsibility | Decision | Boundary | +|---|---|---| +| Skill discovery, host placement, project/global scope, selection, update, and removal | [Vercel Agent Skills CLI](https://github.com/vercel-labs/skills), pinned to 1.5.19 in verification | Canonical and exclusive skill lifecycle. GStack never silently enrolls a host. | +| Interactive terminal prompts | [Clack](https://github.com/bombshell-dev/clack), if adopted after the current zero-dependency prompt surface needs richer TTY UX | Presentation only; consent state, policy, transactions, and non-TTY flags stay in GStack. No dependency is added merely for styling. | +| Local browser binaries | [Playwright](https://playwright.dev/docs/browsers) | Existing local Chromium manager only. No cloud-browser provider. | +| Cross-platform launchers | [Bun compile](https://bun.sh/docs/bundler/executables) | Build-time native launcher production; the runtime remains host-neutral. | +| Release signing and verification metadata | [Sigstore Cosign](https://docs.sigstore.dev/cosign/signing/signing_with_blobs/) in release CI | CI signs immutable archives keylessly. Every client verifies byte count and SHA-256; Cosign verification is additional when already installed, never a mandatory end-user install. | +| Release attestations | [GitHub artifact attestations](https://docs.github.com/en/actions/security-for-github-actions/using-artifact-attestations/use-artifact-attestations) | Provenance for release artifacts, with actions pinned to immutable commits and `id-token: write` limited to the signing job. | + +GStack owns the product-specific remainder: the signed runtime manifest, +capability consent, atomic install journal, rollback, doctor output, and the +first-use prompt that appears only when a chosen skill needs an unavailable +capability. + +## Rejected as mandatory dependencies + +- `oclif`: a second CLI framework would not solve skill placement, consent, or + transactional updates and would expand the runtime dependency surface. +- `eget`: convenient binary download UX, but it does not encode GStack's fixed + artifact host, manifest, capability, rollback, or privacy policies. +- `mise` and `aqua`: useful optional environment/package managers, but requiring + either would add a package manager in front of the standard Agent Skills + installer. +- hosted browsers, device farms, alternate iOS drivers, ComfyUI, model weights, + and GPU runtimes: outside the accepted architecture. + +## Consequences + +The standard installer can evolve independently without GStack maintaining six +host adapters. The optional runtime has one auditable release format and no +automatic setup. Public-tool telemetry and network behavior must be disclosed +at the point of use; upstream Agent Skills telemetry can be disabled with +`DISABLE_TELEMETRY=1` or `DO_NOT_TRACK=1`. + +The repository keeps tests for the pinned installer behavior and release +contract. A future tool swap must preserve those contracts instead of leaking +the tool's own nouns into the six-skill public surface. diff --git a/docs/gstack-2/evidence/ios-physical-device-2026-07-20T17-49-19-302Z.json b/docs/gstack-2/evidence/ios-physical-device-2026-07-20T17-49-19-302Z.json new file mode 100644 index 000000000..eb6296a28 --- /dev/null +++ b/docs/gstack-2/evidence/ios-physical-device-2026-07-20T17-49-19-302Z.json @@ -0,0 +1,277 @@ +{ + "schemaVersion": 1, + "kind": "gstack-ios-qa-physical-device", + "passed": true, + "generatedAt": "2026-07-20T17:49:19.302Z", + "requiredIterations": 5, + "passedIterations": 5, + "toolchain": { + "developerDir": "/Applications/Xcode.app/Contents/Developer", + "xcodeVersion": "Xcode 26.6", + "xcodeBuildVersion": "Build version 17F113", + "xcodegenVersion": "Version: 2.45.4", + "devicectlPath": "/Applications/Xcode.app/Contents/Developer/usr/bin/devicectl", + "devToolsSecurity": "enabled" + }, + "device": { + "identifierSha256": "0f99cfc90afe9f65b2657efde10b259bfe6d1e12e8b4ee18a9123ff1a367bdda", + "model": "iPhone17,1", + "platform": "iOS", + "transportType": "wired", + "pairingState": "paired", + "developerModeStatus": "enabled" + }, + "bundleId": "com.gstack.iosqa.fixture.gstack2", + "signing": { + "automatic": true, + "explicitTeamFromEnvironment": true + }, + "installSafety": { + "existingBundle": "related_fixture", + "appDataDeleted": false, + "appUninstalled": false + }, + "releaseGuard": { + "built": true, + "debugBridgeSymbolsAbsent": true, + "executableSha256": "796a3e70e0a9a414018738e606b1bbf40d30de9d552eb497b41c2ac5cba4c6b8" + }, + "bootstrap": { + "transport": "CoreDevice IPv6", + "daemonBootstrap": true, + "tokenRotated": true, + "stateServerPort": 9999 + }, + "iterations": [ + { + "iteration": 1, + "passed": true, + "checks": { + "health_bundle": { + "passed": true, + "bundleBefore": "com.gstack.iosqa.fixture.gstack2", + "bundleAfter": "com.gstack.iosqa.fixture.gstack2" + }, + "token_rotation": { + "passed": true, + "originalBootTokenRejected": true + }, + "session_acquire": { + "passed": true, + "sessionIdIssued": true, + "released": true + }, + "screenshot_elements": { + "passed": true, + "elementCountBefore": 2, + "elementCountAfter": 2, + "screenshotBefore": { + "sha256": "79c12380fb2d917da3be02c642866ed6d0cb0b69daa835966e8c4791e153cb15", + "bytes": 101454, + "width": 1206, + "height": 2622 + }, + "screenshotAfter": { + "sha256": "3cbeef4d8909457b95321d94197a830ca394ba744d0a6e3d89058c98b5b6e72e", + "bytes": 102531, + "width": 1206, + "height": 2622 + } + }, + "coordinate_tap_state_cleanup": { + "passed": true, + "buttonLabelBefore": "Tap (0)", + "buttonLabelAfter": "Tap (1)", + "activeBundleBefore": "com.gstack.iosqa.fixture.gstack2", + "activeBundleAfter": "com.gstack.iosqa.fixture.gstack2", + "stateCleanup": "unchanged" + } + } + }, + { + "iteration": 2, + "passed": true, + "checks": { + "health_bundle": { + "passed": true, + "bundleBefore": "com.gstack.iosqa.fixture.gstack2", + "bundleAfter": "com.gstack.iosqa.fixture.gstack2" + }, + "token_rotation": { + "passed": true, + "originalBootTokenRejected": true + }, + "session_acquire": { + "passed": true, + "sessionIdIssued": true, + "released": true + }, + "screenshot_elements": { + "passed": true, + "elementCountBefore": 2, + "elementCountAfter": 2, + "screenshotBefore": { + "sha256": "53b4df2d0be8fdc02e9f27f878b717783869c3de17dd7883bdae2eb3fff3e7b6", + "bytes": 100757, + "width": 1206, + "height": 2622 + }, + "screenshotAfter": { + "sha256": "eb3d92cc191c017d1d5f83b0812959facb17679931f31cb0c2e922997b86c17a", + "bytes": 102447, + "width": 1206, + "height": 2622 + } + }, + "coordinate_tap_state_cleanup": { + "passed": true, + "buttonLabelBefore": "Tap (1)", + "buttonLabelAfter": "Tap (2)", + "activeBundleBefore": "com.gstack.iosqa.fixture.gstack2", + "activeBundleAfter": "com.gstack.iosqa.fixture.gstack2", + "stateCleanup": "unchanged" + } + } + }, + { + "iteration": 3, + "passed": true, + "checks": { + "health_bundle": { + "passed": true, + "bundleBefore": "com.gstack.iosqa.fixture.gstack2", + "bundleAfter": "com.gstack.iosqa.fixture.gstack2" + }, + "token_rotation": { + "passed": true, + "originalBootTokenRejected": true + }, + "session_acquire": { + "passed": true, + "sessionIdIssued": true, + "released": true + }, + "screenshot_elements": { + "passed": true, + "elementCountBefore": 2, + "elementCountAfter": 2, + "screenshotBefore": { + "sha256": "4656fc665904354173d8a427508e718f82cac1925fe9ad99b8f864fbb21a3157", + "bytes": 101174, + "width": 1206, + "height": 2622 + }, + "screenshotAfter": { + "sha256": "33249251e1616368eafdaea731765bac837deea42faa34372850d1119c69c53e", + "bytes": 101832, + "width": 1206, + "height": 2622 + } + }, + "coordinate_tap_state_cleanup": { + "passed": true, + "buttonLabelBefore": "Tap (2)", + "buttonLabelAfter": "Tap (3)", + "activeBundleBefore": "com.gstack.iosqa.fixture.gstack2", + "activeBundleAfter": "com.gstack.iosqa.fixture.gstack2", + "stateCleanup": "unchanged" + } + } + }, + { + "iteration": 4, + "passed": true, + "checks": { + "health_bundle": { + "passed": true, + "bundleBefore": "com.gstack.iosqa.fixture.gstack2", + "bundleAfter": "com.gstack.iosqa.fixture.gstack2" + }, + "token_rotation": { + "passed": true, + "originalBootTokenRejected": true + }, + "session_acquire": { + "passed": true, + "sessionIdIssued": true, + "released": true + }, + "screenshot_elements": { + "passed": true, + "elementCountBefore": 2, + "elementCountAfter": 2, + "screenshotBefore": { + "sha256": "51f8f4accf7672ffb8b6514573e01e5eac920fbd1969ee9e461af4deca61d517", + "bytes": 101364, + "width": 1206, + "height": 2622 + }, + "screenshotAfter": { + "sha256": "fdc38ca399448b6ae9e0d7c8f0309b41c760493e050fad540d334e0c7c75fd9c", + "bytes": 100190, + "width": 1206, + "height": 2622 + } + }, + "coordinate_tap_state_cleanup": { + "passed": true, + "buttonLabelBefore": "Tap (3)", + "buttonLabelAfter": "Tap (4)", + "activeBundleBefore": "com.gstack.iosqa.fixture.gstack2", + "activeBundleAfter": "com.gstack.iosqa.fixture.gstack2", + "stateCleanup": "unchanged" + } + } + }, + { + "iteration": 5, + "passed": true, + "checks": { + "health_bundle": { + "passed": true, + "bundleBefore": "com.gstack.iosqa.fixture.gstack2", + "bundleAfter": "com.gstack.iosqa.fixture.gstack2" + }, + "token_rotation": { + "passed": true, + "originalBootTokenRejected": true + }, + "session_acquire": { + "passed": true, + "sessionIdIssued": true, + "released": true + }, + "screenshot_elements": { + "passed": true, + "elementCountBefore": 2, + "elementCountAfter": 2, + "screenshotBefore": { + "sha256": "a69d045e493ca32f15646deed3e59da2873841171cde618236c03483299c40f9", + "bytes": 100881, + "width": 1206, + "height": 2622 + }, + "screenshotAfter": { + "sha256": "025a192e2e542836141fb85ef350d22e30362df1fbd4ddd15bae35b86a7b6f59", + "bytes": 102183, + "width": 1206, + "height": 2622 + } + }, + "coordinate_tap_state_cleanup": { + "passed": true, + "buttonLabelBefore": "Tap (4)", + "buttonLabelAfter": "Tap (5)", + "activeBundleBefore": "com.gstack.iosqa.fixture.gstack2", + "activeBundleAfter": "com.gstack.iosqa.fixture.gstack2", + "stateCleanup": "unchanged" + } + } + } + ], + "cleanup": { + "sessionsReleased": true, + "tunnelKeepaliveStopped": true, + "temporaryWorkspaceRemoved": true + } +} diff --git a/evals/parity/contracts/autoplan.json b/evals/parity/contracts/autoplan.json index 5d6122a24..cad2ab0a0 100644 --- a/evals/parity/contracts/autoplan.json +++ b/evals/parity/contracts/autoplan.json @@ -9,7 +9,7 @@ "source_path": "autoplan/SKILL.md.tmpl", "base_sha": "bb57306d98c97011b0919c6132705a15b1579781", "blob_sha": "b2eaca9fde8f46001bea9961b8ed651d0f6f9e13", - "normalized_render_sha256": "706dd2fb1b3f3c7e6f446b268bd5a513fc7d2560ca12f702d670907402843a11", + "normalized_render_sha256": "b11bef3e060400cd59a16e41c9b6f8395ace065867a1c2a70329319153a2c4dc", "target": "skills/plan/references/legacy/autoplan.md", "overlays": [ 679, diff --git a/evals/parity/contracts/benchmark-models.json b/evals/parity/contracts/benchmark-models.json index 5ff06c33d..fc36f977c 100644 --- a/evals/parity/contracts/benchmark-models.json +++ b/evals/parity/contracts/benchmark-models.json @@ -9,7 +9,7 @@ "source_path": "benchmark-models/SKILL.md.tmpl", "base_sha": "bb57306d98c97011b0919c6132705a15b1579781", "blob_sha": "034cda182406dc04a82c4336ac3ebc36b5fc41b1", - "normalized_render_sha256": "d67d1f22c7f65c286a905ec60143d057e3b8b29a548ac53a88272b886ef26b31", + "normalized_render_sha256": "2ef0679d45f21bacc09cd774ff96bb3b82853a8e89d8606847c4f9416a47a48b", "target": "skills/qa/references/legacy/benchmark-models.md", "overlays": [ 679 diff --git a/evals/parity/contracts/benchmark.json b/evals/parity/contracts/benchmark.json index 15fb56730..c69be08e5 100644 --- a/evals/parity/contracts/benchmark.json +++ b/evals/parity/contracts/benchmark.json @@ -9,7 +9,7 @@ "source_path": "benchmark/SKILL.md.tmpl", "base_sha": "bb57306d98c97011b0919c6132705a15b1579781", "blob_sha": "038f16f5fba4ae4e9eae922e3276bba8ef88149e", - "normalized_render_sha256": "c579dad9e78a12bf7547a6dd752daaa3299c66c55d8170290c075caa5d1fa660", + "normalized_render_sha256": "a4554b8b139ee95c9f25c2e747f9e2214b2f0db64401057529e5ec775be323cd", "target": "skills/qa/references/legacy/benchmark.md", "overlays": [ 679 diff --git a/evals/parity/contracts/browse.json b/evals/parity/contracts/browse.json index cab73dd3d..0eef9753d 100644 --- a/evals/parity/contracts/browse.json +++ b/evals/parity/contracts/browse.json @@ -9,7 +9,7 @@ "source_path": "browse/SKILL.md.tmpl", "base_sha": "bb57306d98c97011b0919c6132705a15b1579781", "blob_sha": "9a159e4c9820172c229e2174d4a62a8f9668ab93", - "normalized_render_sha256": "9d5a75a6e20d40bf2d275ca39375899bb6c51abd4e8ce1042e8db4450e891196", + "normalized_render_sha256": "b7fd526a00444003cad654abb15c2d17606cc5295f38533754e95108038d3467", "target": "skills/qa/references/legacy/browse.md", "overlays": [ 679, diff --git a/evals/parity/contracts/canary.json b/evals/parity/contracts/canary.json index 0b0bb3116..602a57153 100644 --- a/evals/parity/contracts/canary.json +++ b/evals/parity/contracts/canary.json @@ -9,7 +9,7 @@ "source_path": "canary/SKILL.md.tmpl", "base_sha": "bb57306d98c97011b0919c6132705a15b1579781", "blob_sha": "d1eb2950aba2fa2b09d90f13143492c60d46793c", - "normalized_render_sha256": "551c32a7bbbdc5dec6f88751e885869df9d1a26286df233cb78b51beb2e0987a", + "normalized_render_sha256": "329b61120f60893d023533cbc493389d1c7476819fb785422de0e7d34e0c2c0b", "target": "skills/qa/references/legacy/canary.md", "overlays": [ 679, diff --git a/evals/parity/contracts/careful.json b/evals/parity/contracts/careful.json index 2cd4b92a1..db81bf7f8 100644 --- a/evals/parity/contracts/careful.json +++ b/evals/parity/contracts/careful.json @@ -9,7 +9,7 @@ "source_path": "careful/SKILL.md.tmpl", "base_sha": "bb57306d98c97011b0919c6132705a15b1579781", "blob_sha": "5c128a00e180bec4fad281486d3ca8c02dc67e7e", - "normalized_render_sha256": "9c806d1102794aeab5c83990c72dcadc7bdad7134f3962da5609ab13bc7feb0f", + "normalized_render_sha256": "f5fe3aa0755e04ad328ed67a4e42c21d9f9b5509167a69d91158a59cce8111ea", "target": "skills/debug/references/legacy/careful.md", "overlays": [ 679 diff --git a/evals/parity/contracts/claude.json b/evals/parity/contracts/claude.json index d9dbca0e2..d2f1d9843 100644 --- a/evals/parity/contracts/claude.json +++ b/evals/parity/contracts/claude.json @@ -9,7 +9,7 @@ "source_path": "claude/SKILL.md.tmpl", "base_sha": "bb57306d98c97011b0919c6132705a15b1579781", "blob_sha": "94552cbe4efebc908f70f03880e584879db80aca", - "normalized_render_sha256": "f8b5964bf630d0716ad5cfd729f6d4e62bb89d4eab64a210090fb0e875f0b59d", + "normalized_render_sha256": "e0257ec3df4432da9b0fb10e6af66da8ed15548a3fae987778fc14a6747f4b30", "target": "skills/review/references/legacy/claude.md", "overlays": [ 679 diff --git a/evals/parity/contracts/codex.json b/evals/parity/contracts/codex.json index ccb50597d..6990d3f1e 100644 --- a/evals/parity/contracts/codex.json +++ b/evals/parity/contracts/codex.json @@ -9,7 +9,7 @@ "source_path": "codex/SKILL.md.tmpl", "base_sha": "bb57306d98c97011b0919c6132705a15b1579781", "blob_sha": "333de7d8d590cc78184b0e2371171f6121408f73", - "normalized_render_sha256": "5621d3e33242350806eb3489b5c933c5ebaa5105f250e941c4205962c447b28d", + "normalized_render_sha256": "0df6ff685d230f87763b4c43f957e20854fe1319d78247d683e5250e2accb188", "target": "skills/review/references/legacy/codex.md", "overlays": [ 679 diff --git a/evals/parity/contracts/context-restore.json b/evals/parity/contracts/context-restore.json index 9dfaf19d0..221d1a92e 100644 --- a/evals/parity/contracts/context-restore.json +++ b/evals/parity/contracts/context-restore.json @@ -9,7 +9,7 @@ "source_path": "context-restore/SKILL.md.tmpl", "base_sha": "bb57306d98c97011b0919c6132705a15b1579781", "blob_sha": "55889f6e06d3ba896f33a16969959c700bc24f1e", - "normalized_render_sha256": "33b0cb3f2f23ef913eafd18b73c34aafe879c22cf7c23ceed7a5b5324ac79d3a", + "normalized_render_sha256": "c14726232c67616485c115dd7ca0898992bab9c7990629b40dc3b6f1c0dec0ee", "target": "skills/plan/references/legacy/context-restore.md", "overlays": [ 679 diff --git a/evals/parity/contracts/context-save.json b/evals/parity/contracts/context-save.json index 872ef63c9..5707bd677 100644 --- a/evals/parity/contracts/context-save.json +++ b/evals/parity/contracts/context-save.json @@ -9,7 +9,7 @@ "source_path": "context-save/SKILL.md.tmpl", "base_sha": "bb57306d98c97011b0919c6132705a15b1579781", "blob_sha": "a3702bc95439cddd87841aba836708bf511ef55d", - "normalized_render_sha256": "06a3ef8d7c9d361e7497252b69082ee51786ef4fd2bb62d9e7c5d97817bfdb0d", + "normalized_render_sha256": "348b840c60cecd8818d75f63ebb8e3effae659437137ce75c1ba6124177120b6", "target": "skills/plan/references/legacy/context-save.md", "overlays": [ 679 diff --git a/evals/parity/contracts/cso.json b/evals/parity/contracts/cso.json index a57aedf78..9e4642474 100644 --- a/evals/parity/contracts/cso.json +++ b/evals/parity/contracts/cso.json @@ -9,7 +9,7 @@ "source_path": "cso/SKILL.md.tmpl", "base_sha": "bb57306d98c97011b0919c6132705a15b1579781", "blob_sha": "413fb099597b55dadca116e45a202aa693a94b74", - "normalized_render_sha256": "59017ba27aaa93a62bda7ddca3c995f7231edb3fa86009e555b724b43fc1afd7", + "normalized_render_sha256": "2cecaf39e950a0ec848f85c11f9678b6a7644c0251c07be42cd52d4b2e6b61a6", "target": "skills/review/references/legacy/cso.md", "overlays": [ 679, diff --git a/evals/parity/contracts/design-consultation.json b/evals/parity/contracts/design-consultation.json index 011f952e9..ab4a7f8c8 100644 --- a/evals/parity/contracts/design-consultation.json +++ b/evals/parity/contracts/design-consultation.json @@ -9,7 +9,7 @@ "source_path": "design-consultation/SKILL.md.tmpl", "base_sha": "bb57306d98c97011b0919c6132705a15b1579781", "blob_sha": "64af56ecdbd132cb7c28344e8e4ecb2e5dacf811", - "normalized_render_sha256": "2753c3423f22f9ef2b3baf31069bd2ac6951e7bc69cc70f28c8da5c07580ab26", + "normalized_render_sha256": "afa1f2b58d22d9f0f9064336ce7e9836430a298e1deb56f5330390f91df3f680", "target": "skills/design/references/legacy/design-consultation.md", "overlays": [ 679, diff --git a/evals/parity/contracts/design-html.json b/evals/parity/contracts/design-html.json index 37b7d757b..455ef6bb4 100644 --- a/evals/parity/contracts/design-html.json +++ b/evals/parity/contracts/design-html.json @@ -9,7 +9,7 @@ "source_path": "design-html/SKILL.md.tmpl", "base_sha": "bb57306d98c97011b0919c6132705a15b1579781", "blob_sha": "3cdec9a14d62d2e046ed924c972efc30a7d43aca", - "normalized_render_sha256": "f6dd88ea765653cd49bac6479c8212977bb578afca4c900153a9c646c260b943", + "normalized_render_sha256": "cbb1b4357bedbb0fffe23c3e0ad31ee8c2a198a31443edb660e5c836e67e94e6", "target": "skills/design/references/legacy/design-html.md", "overlays": [ 679 diff --git a/evals/parity/contracts/design-review.json b/evals/parity/contracts/design-review.json index 9907581ce..f150b887f 100644 --- a/evals/parity/contracts/design-review.json +++ b/evals/parity/contracts/design-review.json @@ -9,7 +9,7 @@ "source_path": "design-review/SKILL.md.tmpl", "base_sha": "bb57306d98c97011b0919c6132705a15b1579781", "blob_sha": "bdcda48e29b489a1cc49faa333922412251d4b41", - "normalized_render_sha256": "8711f4910f9cb9d022d024c432093bccbcf8d4e74250a3a25f915eb086de6c5a", + "normalized_render_sha256": "33584047a11aa46a1b6a2bef5bf97a4d0b443bb6c9542685732e7d4dff795a2e", "target": "skills/design/references/legacy/design-review.md", "overlays": [ 679, diff --git a/evals/parity/contracts/design-shotgun.json b/evals/parity/contracts/design-shotgun.json index daf466f03..ae9d59f9e 100644 --- a/evals/parity/contracts/design-shotgun.json +++ b/evals/parity/contracts/design-shotgun.json @@ -9,7 +9,7 @@ "source_path": "design-shotgun/SKILL.md.tmpl", "base_sha": "bb57306d98c97011b0919c6132705a15b1579781", "blob_sha": "230dbc2922f05bf272bf5168a958a12604fac1bc", - "normalized_render_sha256": "2ffa676332b91cb2f4f0ae4a08d917dd43a767995b33d960895c15e93fb7c73c", + "normalized_render_sha256": "1db4cd23ee115ce841d2db898cc442141588635d43018393703aa28ce40d48f2", "target": "skills/design/references/legacy/design-shotgun.md", "overlays": [ 679, diff --git a/evals/parity/contracts/devex-review.json b/evals/parity/contracts/devex-review.json index 670e32a99..87ff4e95d 100644 --- a/evals/parity/contracts/devex-review.json +++ b/evals/parity/contracts/devex-review.json @@ -9,7 +9,7 @@ "source_path": "devex-review/SKILL.md.tmpl", "base_sha": "bb57306d98c97011b0919c6132705a15b1579781", "blob_sha": "081d4f35bbdec0c6b3da8ae71615ec4d41a84551", - "normalized_render_sha256": "849895ef49f7c855bfa819620e94d41da9909eb5baf214719b004130ecd741d6", + "normalized_render_sha256": "9fbc11b3fe252c281581512d67f6915c72e34bb2fdc7bc795e3077ee0e48d34e", "target": "skills/qa/references/legacy/devex-review.md", "overlays": [ 679, diff --git a/evals/parity/contracts/diagram.json b/evals/parity/contracts/diagram.json index 125b35025..333247a52 100644 --- a/evals/parity/contracts/diagram.json +++ b/evals/parity/contracts/diagram.json @@ -9,7 +9,7 @@ "source_path": "diagram/SKILL.md.tmpl", "base_sha": "bb57306d98c97011b0919c6132705a15b1579781", "blob_sha": "9e19a52c6b7f727ce4faf5c1f9c14514ecb52f50", - "normalized_render_sha256": "88d1b8810d6ae95c6cf984825e2fe96712dfe4a7f7dba3e03d8a3634cf9e97ca", + "normalized_render_sha256": "21f18fa4957b79bf5941abfebd1b222dee3eb960520e0deac1c32d0b6fd62a38", "target": "skills/design/references/legacy/diagram.md", "overlays": [ 679 diff --git a/evals/parity/contracts/document-generate.json b/evals/parity/contracts/document-generate.json index 4601303cd..544f9cd50 100644 --- a/evals/parity/contracts/document-generate.json +++ b/evals/parity/contracts/document-generate.json @@ -9,7 +9,7 @@ "source_path": "document-generate/SKILL.md.tmpl", "base_sha": "bb57306d98c97011b0919c6132705a15b1579781", "blob_sha": "d3ef0cbc3786c4010b3c692fb94246f56a7e1d7b", - "normalized_render_sha256": "aa5092d5c96e73aa97bcebd200d08d2ce8abcaabae534711162d29444f780229", + "normalized_render_sha256": "71726ef3082b6c00a5cad19d28da4d830f8e9b261d213a7938c4e1ce3b8c54bb", "target": "skills/ship/references/legacy/document-generate.md", "overlays": [ 679 diff --git a/evals/parity/contracts/document-release.json b/evals/parity/contracts/document-release.json index 5a241ff99..8f9ac8572 100644 --- a/evals/parity/contracts/document-release.json +++ b/evals/parity/contracts/document-release.json @@ -9,7 +9,7 @@ "source_path": "document-release/SKILL.md.tmpl", "base_sha": "bb57306d98c97011b0919c6132705a15b1579781", "blob_sha": "7621cb31290217b5c7cc8fb000e910b3dd38128f", - "normalized_render_sha256": "369c595ec2fac76f441d008401929295898e98a5c521d176bafbe4af0e6054f9", + "normalized_render_sha256": "e5aa85ac93b36b638d075d152f9d7108c0108727056f61331b25fe33de569a59", "target": "skills/ship/references/legacy/document-release.md", "overlays": [ 679 diff --git a/evals/parity/contracts/freeze.json b/evals/parity/contracts/freeze.json index ac19ba851..ebeaa0b87 100644 --- a/evals/parity/contracts/freeze.json +++ b/evals/parity/contracts/freeze.json @@ -9,7 +9,7 @@ "source_path": "freeze/SKILL.md.tmpl", "base_sha": "bb57306d98c97011b0919c6132705a15b1579781", "blob_sha": "c0b31aa7f9f216fc5a351d91f4bcff68c828d090", - "normalized_render_sha256": "8beec3080fd0d6566b6ecf188d110d7283fb808fbc7c7201ee234191f9d3c5cd", + "normalized_render_sha256": "433bb7c1909852c83978ae282c582590c5136abe56020e7d0be39749822c345b", "target": "skills/debug/references/legacy/freeze.md", "overlays": [ 679 diff --git a/evals/parity/contracts/gstack.json b/evals/parity/contracts/gstack.json index 650bcf20e..d2e30402d 100644 --- a/evals/parity/contracts/gstack.json +++ b/evals/parity/contracts/gstack.json @@ -9,7 +9,7 @@ "source_path": "SKILL.md.tmpl", "base_sha": "bb57306d98c97011b0919c6132705a15b1579781", "blob_sha": "402bd0d7b0f2bf02f6c9e4754e0e2a655f5f4057", - "normalized_render_sha256": "8e28cf7aa8c1c858ffaa4936d05a66bd4522bd6c6438be719f569b01c5afbcd8", + "normalized_render_sha256": "daa2b069d1945c1e1bf8eef23417899b4eacb98087f6c146c0b726eb21fd2776", "target": "skills/plan/references/legacy/gstack.md", "overlays": [ 679 diff --git a/evals/parity/contracts/guard.json b/evals/parity/contracts/guard.json index fa5ec384f..df53b47e4 100644 --- a/evals/parity/contracts/guard.json +++ b/evals/parity/contracts/guard.json @@ -9,7 +9,7 @@ "source_path": "guard/SKILL.md.tmpl", "base_sha": "bb57306d98c97011b0919c6132705a15b1579781", "blob_sha": "3d34ee0c181ec7b263bf6092ba8f384619c5efb6", - "normalized_render_sha256": "2040b2d9c7e587f254296abb394c655da37fe25305f4e44dc2d736053595cdfb", + "normalized_render_sha256": "ff8170babcc9ad20f6de292db838d2c4545f0ed98dddd184ab5e7c52c073dc7e", "target": "skills/debug/references/legacy/guard.md", "overlays": [ 679 diff --git a/evals/parity/contracts/health.json b/evals/parity/contracts/health.json index 463f4fba8..0c82c14d4 100644 --- a/evals/parity/contracts/health.json +++ b/evals/parity/contracts/health.json @@ -9,7 +9,7 @@ "source_path": "health/SKILL.md.tmpl", "base_sha": "bb57306d98c97011b0919c6132705a15b1579781", "blob_sha": "f92eb7347ec4f77dd8dbf464d63fcdf6a3459908", - "normalized_render_sha256": "3e478e5673d54ce0e227e589ab0800bd14de65cb8df4e12661e330b57018465c", + "normalized_render_sha256": "ff664221e7de57e66c1b45d719982d90f38e0288914b34731ba4dd73541347e8", "target": "skills/review/references/legacy/health.md", "overlays": [ 679 diff --git a/evals/parity/contracts/investigate.json b/evals/parity/contracts/investigate.json index 13c84e207..305c3c185 100644 --- a/evals/parity/contracts/investigate.json +++ b/evals/parity/contracts/investigate.json @@ -9,7 +9,7 @@ "source_path": "investigate/SKILL.md.tmpl", "base_sha": "bb57306d98c97011b0919c6132705a15b1579781", "blob_sha": "67e254d743ffb9060f48e3f6d4b715c077ee688d", - "normalized_render_sha256": "23e220a2d61b665f9e48b094855336fac3ca9187be12675cb721db2bc27f7c30", + "normalized_render_sha256": "91f19c8d736a9a6077941f63f52853634325059e5ac4d8808c4ba6dbceca1a30", "target": "skills/debug/references/legacy/investigate.md", "overlays": [ 679, diff --git a/evals/parity/contracts/ios-clean.json b/evals/parity/contracts/ios-clean.json index 68d6a52a6..62c0d78e2 100644 --- a/evals/parity/contracts/ios-clean.json +++ b/evals/parity/contracts/ios-clean.json @@ -9,7 +9,7 @@ "source_path": "ios-clean/SKILL.md.tmpl", "base_sha": "bb57306d98c97011b0919c6132705a15b1579781", "blob_sha": "3a64481a99fab0d7247c23df0a07c428c1c5f3da", - "normalized_render_sha256": "4616b4a2f3def37440add4010a89426e85bd3f2786fd71d199063a60ce073615", + "normalized_render_sha256": "6a0080b7678f9e1df7ae2da27c4a7e3e85e7bfb83525a2c5651c24c0ab024b4b", "target": "skills/ship/references/legacy/ios-clean.md", "overlays": [ 679 diff --git a/evals/parity/contracts/ios-design-review.json b/evals/parity/contracts/ios-design-review.json index a6c52c863..3e485f9b2 100644 --- a/evals/parity/contracts/ios-design-review.json +++ b/evals/parity/contracts/ios-design-review.json @@ -9,7 +9,7 @@ "source_path": "ios-design-review/SKILL.md.tmpl", "base_sha": "bb57306d98c97011b0919c6132705a15b1579781", "blob_sha": "dd9e2518f53edf939a1e425806abc871a9b33022", - "normalized_render_sha256": "38bb6ba7876611f5ae63566820f67a48f9b1797c33d000c866540a4e6f766d50", + "normalized_render_sha256": "53741f7f044faa413f1725bada27514d2528d834f327e83f040de67668d24dae", "target": "skills/design/references/legacy/ios-design-review.md", "overlays": [ 679 diff --git a/evals/parity/contracts/ios-fix.json b/evals/parity/contracts/ios-fix.json index 8fb50569b..e478002f6 100644 --- a/evals/parity/contracts/ios-fix.json +++ b/evals/parity/contracts/ios-fix.json @@ -9,7 +9,7 @@ "source_path": "ios-fix/SKILL.md.tmpl", "base_sha": "bb57306d98c97011b0919c6132705a15b1579781", "blob_sha": "94655e282f535b846eada11143e95df58d29263b", - "normalized_render_sha256": "1a94ad8852821684d4806b10c5464f7adef80cb28817800f1e88dfe808f0a26d", + "normalized_render_sha256": "cc38b71471c1fefc015419e768c5b40f060f03b232cbad850cd7d9c985a6cc90", "target": "skills/debug/references/legacy/ios-fix.md", "overlays": [ 679 diff --git a/evals/parity/contracts/ios-qa.json b/evals/parity/contracts/ios-qa.json index fe9155343..88b17f567 100644 --- a/evals/parity/contracts/ios-qa.json +++ b/evals/parity/contracts/ios-qa.json @@ -9,7 +9,7 @@ "source_path": "ios-qa/SKILL.md.tmpl", "base_sha": "bb57306d98c97011b0919c6132705a15b1579781", "blob_sha": "e93d2831a31df65ec8e4e8693919ef5bf148457f", - "normalized_render_sha256": "37b9baf014dcfa6ed3266ae3241dad17956a0b6b3f332dc44bdb728daa3c8f01", + "normalized_render_sha256": "a9353a4d837240f85c0e13144e66575f9e267926090cfc0f344a08b5fb09b98c", "target": "skills/qa/references/legacy/ios-qa.md", "overlays": [ 679 diff --git a/evals/parity/contracts/ios-sync.json b/evals/parity/contracts/ios-sync.json index 37c497d32..2cb4f8235 100644 --- a/evals/parity/contracts/ios-sync.json +++ b/evals/parity/contracts/ios-sync.json @@ -9,7 +9,7 @@ "source_path": "ios-sync/SKILL.md.tmpl", "base_sha": "bb57306d98c97011b0919c6132705a15b1579781", "blob_sha": "156a33c4c35d3bad804e44c93ae4c931878489f3", - "normalized_render_sha256": "6d1fa485d589dff65412cdd855b683f09cb442e35b8a40ee0db3451241016ea9", + "normalized_render_sha256": "c51e8865876efae833e92d54b37780afd4fa6240c13231dfb7d4635948fbc73f", "target": "skills/ship/references/legacy/ios-sync.md", "overlays": [ 679 diff --git a/evals/parity/contracts/land-and-deploy.json b/evals/parity/contracts/land-and-deploy.json index bc21aaa33..a552d64b3 100644 --- a/evals/parity/contracts/land-and-deploy.json +++ b/evals/parity/contracts/land-and-deploy.json @@ -9,7 +9,7 @@ "source_path": "land-and-deploy/SKILL.md.tmpl", "base_sha": "bb57306d98c97011b0919c6132705a15b1579781", "blob_sha": "98976ad020d541d251cc7e34802a13458ddc88e2", - "normalized_render_sha256": "d17a1d9f397b57f59c5cced24c07c35e3950050612dba9c36bb68c4997f03a2f", + "normalized_render_sha256": "3fab0678a9a7a76664330c74db2bd25b56c335ac72ce4e691c2f2564a7ede819", "target": "skills/ship/references/legacy/land-and-deploy.md", "overlays": [ 679, diff --git a/evals/parity/contracts/landing-report.json b/evals/parity/contracts/landing-report.json index 271c55bd5..f59a3b6bf 100644 --- a/evals/parity/contracts/landing-report.json +++ b/evals/parity/contracts/landing-report.json @@ -9,7 +9,7 @@ "source_path": "landing-report/SKILL.md.tmpl", "base_sha": "bb57306d98c97011b0919c6132705a15b1579781", "blob_sha": "32a8cc1ab036b1ff8692f0400b68d8b56224a251", - "normalized_render_sha256": "64c9e05978be3c8d900dc9b9b4dd77e495776718d77e7b926ff6c5250b825a01", + "normalized_render_sha256": "4f9512bafcfd995c4c35cdff869ed60f8a9a9ef12f20bc18bf7b898cbd2faa53", "target": "skills/ship/references/legacy/landing-report.md", "overlays": [ 679 diff --git a/evals/parity/contracts/learn.json b/evals/parity/contracts/learn.json index 16979819d..8d6960984 100644 --- a/evals/parity/contracts/learn.json +++ b/evals/parity/contracts/learn.json @@ -9,7 +9,7 @@ "source_path": "learn/SKILL.md.tmpl", "base_sha": "bb57306d98c97011b0919c6132705a15b1579781", "blob_sha": "90d08d2298cccd0d5090f194a2cd76a5361b4323", - "normalized_render_sha256": "0a155c2ed222aeb6d730583f4f9ce27ad6ad6c917a0bf583079da39a10e148d8", + "normalized_render_sha256": "0d1bbdf1bba2eaae206a350d47fb25ab50d49611262cb376861e83f78822f762", "target": "skills/plan/references/legacy/learn.md", "overlays": [ 679, diff --git a/evals/parity/contracts/make-pdf.json b/evals/parity/contracts/make-pdf.json index a7c219ffd..fac92d46c 100644 --- a/evals/parity/contracts/make-pdf.json +++ b/evals/parity/contracts/make-pdf.json @@ -9,7 +9,7 @@ "source_path": "make-pdf/SKILL.md.tmpl", "base_sha": "bb57306d98c97011b0919c6132705a15b1579781", "blob_sha": "9133a711d4f3d056a21f790e8ec3b98f13fbaa50", - "normalized_render_sha256": "7901a455bf36750224e05468d0123c32e8b9bc98c7334fb0973228bdbba80997", + "normalized_render_sha256": "c092bc644ff9b8929d9cbdfedb6f2761b40ce8e1fca53d13ad350ba91195104d", "target": "skills/design/references/legacy/make-pdf.md", "overlays": [ 679 diff --git a/evals/parity/contracts/office-hours.json b/evals/parity/contracts/office-hours.json index d072ff976..309388904 100644 --- a/evals/parity/contracts/office-hours.json +++ b/evals/parity/contracts/office-hours.json @@ -9,7 +9,7 @@ "source_path": "office-hours/SKILL.md.tmpl", "base_sha": "bb57306d98c97011b0919c6132705a15b1579781", "blob_sha": "8568fe73cca76a80805fab3092cacd10db7e1d7f", - "normalized_render_sha256": "0f0017a3752dd58d013c11d4d19af956724b6eeea89899f045dc3f41a3aa89b1", + "normalized_render_sha256": "b633a6ef87928ca2434f3a2b1ce88946cbe528a9e3659469e0f9cbbe8a7b146b", "target": "skills/plan/references/legacy/office-hours.md", "overlays": [ 679, diff --git a/evals/parity/contracts/open-gstack-browser.json b/evals/parity/contracts/open-gstack-browser.json index ce5d13f31..6d77dfe28 100644 --- a/evals/parity/contracts/open-gstack-browser.json +++ b/evals/parity/contracts/open-gstack-browser.json @@ -9,7 +9,7 @@ "source_path": "open-gstack-browser/SKILL.md.tmpl", "base_sha": "bb57306d98c97011b0919c6132705a15b1579781", "blob_sha": "ef91a527890a3ac3622cc7dc84bad1ff7b64443b", - "normalized_render_sha256": "54c16f55549393a6a2080c5d3f4c0055ce92ca63bdb3966965d96ec5cae3f405", + "normalized_render_sha256": "9e4a08db3e17badfc67703f7c5e66f80a7f05e0b96fad31fc48b8216964d7449", "target": "skills/qa/references/legacy/open-gstack-browser.md", "overlays": [ 679 diff --git a/evals/parity/contracts/pair-agent.json b/evals/parity/contracts/pair-agent.json index 8ed7a832c..82e8bfc59 100644 --- a/evals/parity/contracts/pair-agent.json +++ b/evals/parity/contracts/pair-agent.json @@ -9,7 +9,7 @@ "source_path": "pair-agent/SKILL.md.tmpl", "base_sha": "bb57306d98c97011b0919c6132705a15b1579781", "blob_sha": "75ed42d590f99c46cd0883c37bb1f2f9f499211c", - "normalized_render_sha256": "27e34ef8e4157d94866d5f0c8ab9aff747483d86acd9702bf721cfb8962c07e5", + "normalized_render_sha256": "6882bc549c689ff50fb06d5e72a597939aa651926c50067330d1e6fd86cd6b58", "target": "skills/qa/references/legacy/pair-agent.md", "overlays": [ 679 diff --git a/evals/parity/contracts/plan-ceo-review.json b/evals/parity/contracts/plan-ceo-review.json index f93af5b27..b7ca90be9 100644 --- a/evals/parity/contracts/plan-ceo-review.json +++ b/evals/parity/contracts/plan-ceo-review.json @@ -9,7 +9,7 @@ "source_path": "plan-ceo-review/SKILL.md.tmpl", "base_sha": "bb57306d98c97011b0919c6132705a15b1579781", "blob_sha": "c43cfe64146fe79df74a974f1673fe36defcce00", - "normalized_render_sha256": "eb1199228d8db2107eb7c4cbf889e2116117fcd54e63d5e2b9eceddacbc3bb50", + "normalized_render_sha256": "b2f811568920dfdbd500372df13855041ecb2b8b73e3629f3c71d87c5a78e034", "target": "skills/plan/references/legacy/plan-ceo-review.md", "overlays": [ 679, diff --git a/evals/parity/contracts/plan-design-review.json b/evals/parity/contracts/plan-design-review.json index 8620ba057..eb8c96ccd 100644 --- a/evals/parity/contracts/plan-design-review.json +++ b/evals/parity/contracts/plan-design-review.json @@ -9,7 +9,7 @@ "source_path": "plan-design-review/SKILL.md.tmpl", "base_sha": "bb57306d98c97011b0919c6132705a15b1579781", "blob_sha": "7178c991e41277410de500298cf81372543861af", - "normalized_render_sha256": "05fdb5d63dc6007307c74493f0597251fb9d203b310f7c80b5921b94666f3d99", + "normalized_render_sha256": "2f7a5d113c466d75ca4524e424c072044d92ae7ab93009f1fbe3ae5965e8aa34", "target": "skills/design/references/legacy/plan-design-review.md", "overlays": [ 679, diff --git a/evals/parity/contracts/plan-devex-review.json b/evals/parity/contracts/plan-devex-review.json index c8ebde102..340fa643b 100644 --- a/evals/parity/contracts/plan-devex-review.json +++ b/evals/parity/contracts/plan-devex-review.json @@ -9,7 +9,7 @@ "source_path": "plan-devex-review/SKILL.md.tmpl", "base_sha": "bb57306d98c97011b0919c6132705a15b1579781", "blob_sha": "1ef723c10997a08ef87940daceb08bf8d60dd810", - "normalized_render_sha256": "5be964b8b6e8ddf87df7b44bb7713e0c31a3de32cf261682793bc7db45c7cba1", + "normalized_render_sha256": "fff989dcab1f37d0c219378caef6b1e627c23c2537a717564be0d8567229bccc", "target": "skills/plan/references/legacy/plan-devex-review.md", "overlays": [ 679, diff --git a/evals/parity/contracts/plan-eng-review.json b/evals/parity/contracts/plan-eng-review.json index 54a7a0759..90c78ae5f 100644 --- a/evals/parity/contracts/plan-eng-review.json +++ b/evals/parity/contracts/plan-eng-review.json @@ -9,7 +9,7 @@ "source_path": "plan-eng-review/SKILL.md.tmpl", "base_sha": "bb57306d98c97011b0919c6132705a15b1579781", "blob_sha": "1d5be0e6f47f0896ee831b53c56818850b1dcfe4", - "normalized_render_sha256": "02dad060f44bffacc9cbc16532816930dbd0f2aa21466d0e97eaf36250a80833", + "normalized_render_sha256": "ee268f1d24769509b89b7db998372a773d9e7bc376306a68319af4f74c6fe713", "target": "skills/plan/references/legacy/plan-eng-review.md", "overlays": [ 679, diff --git a/evals/parity/contracts/plan-tune.json b/evals/parity/contracts/plan-tune.json index 22fdf7cd1..fbf88ac97 100644 --- a/evals/parity/contracts/plan-tune.json +++ b/evals/parity/contracts/plan-tune.json @@ -9,7 +9,7 @@ "source_path": "plan-tune/SKILL.md.tmpl", "base_sha": "bb57306d98c97011b0919c6132705a15b1579781", "blob_sha": "dc1214d4c023ed2b126aca8aedb4153b222e73c5", - "normalized_render_sha256": "3b683319cf88f0d0b082654a45050d313d227fca16811aa1b859097a141f40f8", + "normalized_render_sha256": "306bbf971a2867e1f39cce82d64289d6c457bceb07439ddd6f4a3ff8f8ae5e9a", "target": "skills/plan/references/legacy/plan-tune.md", "overlays": [ 679 diff --git a/evals/parity/contracts/qa-only.json b/evals/parity/contracts/qa-only.json index 0d32e2021..3d2a99061 100644 --- a/evals/parity/contracts/qa-only.json +++ b/evals/parity/contracts/qa-only.json @@ -9,7 +9,7 @@ "source_path": "qa-only/SKILL.md.tmpl", "base_sha": "bb57306d98c97011b0919c6132705a15b1579781", "blob_sha": "75c4123cc5c406ffdd36c71a094335c137135b1e", - "normalized_render_sha256": "90f138a7ded37476397e3399ed686a92f9317161ba6e2256d6c7ed7c2893e273", + "normalized_render_sha256": "e360ea826399287e00b030c9aa0bcda16e06ab004f5dcdb14db309bad0ccea25", "target": "skills/qa/references/legacy/qa-only.md", "overlays": [ 679, diff --git a/evals/parity/contracts/qa.json b/evals/parity/contracts/qa.json index 88305ec98..2ea05cbc5 100644 --- a/evals/parity/contracts/qa.json +++ b/evals/parity/contracts/qa.json @@ -9,7 +9,7 @@ "source_path": "qa/SKILL.md.tmpl", "base_sha": "bb57306d98c97011b0919c6132705a15b1579781", "blob_sha": "11997f7b878282c34b6bfd3d4b7a8131f9ad4da8", - "normalized_render_sha256": "025c1fbca58477248afb826cde24766904749129177e2bc60fbf2370207d1da5", + "normalized_render_sha256": "b1387290067842593297c8d64dc578a890a336ce5a8b60085e51b52c55ebaade", "target": "skills/qa/references/legacy/qa.md", "overlays": [ 679, diff --git a/evals/parity/contracts/retro.json b/evals/parity/contracts/retro.json index db159b002..144bfe5a6 100644 --- a/evals/parity/contracts/retro.json +++ b/evals/parity/contracts/retro.json @@ -9,7 +9,7 @@ "source_path": "retro/SKILL.md.tmpl", "base_sha": "bb57306d98c97011b0919c6132705a15b1579781", "blob_sha": "b0819c8a6b736baf489179ba587442cf9973b9d2", - "normalized_render_sha256": "3cfdcdab3560e38aa04d3079b6707080d3859cd05e4d4aecfb68267367d4e8f7", + "normalized_render_sha256": "c92e69da5c62e4bb5a426f4fb5623b41215e538315e2faebece8ba118cacaf71", "target": "skills/plan/references/legacy/retro.md", "overlays": [ 679, diff --git a/evals/parity/contracts/review.json b/evals/parity/contracts/review.json index 60637b150..5c75cd791 100644 --- a/evals/parity/contracts/review.json +++ b/evals/parity/contracts/review.json @@ -9,7 +9,7 @@ "source_path": "review/SKILL.md.tmpl", "base_sha": "bb57306d98c97011b0919c6132705a15b1579781", "blob_sha": "ba1ea88068de4b09cf717eb4ae42aa247d198314", - "normalized_render_sha256": "25e07cb6ea0831bd9e7bd7d4606714ba38b743107a970f2b6491a246b90c7dd4", + "normalized_render_sha256": "9d6398fe0d2900fcce8ae1eb0b390e21f05c94d6ae3a4e21c911025cdc1fd963", "target": "skills/review/references/legacy/review.md", "overlays": [ 610, diff --git a/evals/parity/contracts/scrape.json b/evals/parity/contracts/scrape.json index 998024150..ea2e3cb0e 100644 --- a/evals/parity/contracts/scrape.json +++ b/evals/parity/contracts/scrape.json @@ -9,7 +9,7 @@ "source_path": "scrape/SKILL.md.tmpl", "base_sha": "bb57306d98c97011b0919c6132705a15b1579781", "blob_sha": "4cb4f17c074edcdce0bc8d133f19a6a739964851", - "normalized_render_sha256": "bc7d6ed483f239a45d137ca790c23f3c3add4aaab028ca4950e83e25936ebc79", + "normalized_render_sha256": "03ef708a4c9a1f3de961c48767617502c564690faa7240b3ca39b20496a17f98", "target": "skills/qa/references/legacy/scrape.md", "overlays": [ 679, diff --git a/evals/parity/contracts/setup-browser-cookies.json b/evals/parity/contracts/setup-browser-cookies.json index e049ed9dc..ae7d12a96 100644 --- a/evals/parity/contracts/setup-browser-cookies.json +++ b/evals/parity/contracts/setup-browser-cookies.json @@ -9,7 +9,7 @@ "source_path": "setup-browser-cookies/SKILL.md.tmpl", "base_sha": "bb57306d98c97011b0919c6132705a15b1579781", "blob_sha": "f812d9f56f27c32fb5f102083bbe418344c1a652", - "normalized_render_sha256": "5e27829f87a537e233ac1d0b2fe96cfe21ad6263c70044d8672b1f14c83e7506", + "normalized_render_sha256": "8ab5dfb05136a637ce41067d9e50ade76c4a8b957587e4eab134eaa260b29ac3", "target": "skills/qa/references/legacy/setup-browser-cookies.md", "overlays": [ 679 diff --git a/evals/parity/contracts/setup-deploy.json b/evals/parity/contracts/setup-deploy.json index c1ba9af61..c74d0c759 100644 --- a/evals/parity/contracts/setup-deploy.json +++ b/evals/parity/contracts/setup-deploy.json @@ -9,7 +9,7 @@ "source_path": "setup-deploy/SKILL.md.tmpl", "base_sha": "bb57306d98c97011b0919c6132705a15b1579781", "blob_sha": "587a993c01b6964b5437534527f25368cc265ec9", - "normalized_render_sha256": "796e0aefff64a98a33fd93028247bf76b8073121487cae13b66ad3081f551a87", + "normalized_render_sha256": "6c5998d60249939fd09253e55f8e66338b2223083e8b3329df745553fbdeeda0", "target": "skills/ship/references/legacy/setup-deploy.md", "overlays": [ 679 diff --git a/evals/parity/contracts/setup-gbrain.json b/evals/parity/contracts/setup-gbrain.json index 2d2c7c418..7a0a0dc4c 100644 --- a/evals/parity/contracts/setup-gbrain.json +++ b/evals/parity/contracts/setup-gbrain.json @@ -9,7 +9,7 @@ "source_path": "setup-gbrain/SKILL.md.tmpl", "base_sha": "bb57306d98c97011b0919c6132705a15b1579781", "blob_sha": "f48581543b46ecf889f4f86fb7a0d9e75d0bd6ca", - "normalized_render_sha256": "3f87c1e0d75bd5c5cbe6848751271185e216b38945c93fddba7c7ac022fed982", + "normalized_render_sha256": "244ebee93e8871d59c1b0eac040bed362783e48a9b134171d743750ce9a59b29", "target": "skills/plan/references/legacy/setup-gbrain.md", "overlays": [ 679 diff --git a/evals/parity/contracts/ship.json b/evals/parity/contracts/ship.json index 94e80970a..7ab717d27 100644 --- a/evals/parity/contracts/ship.json +++ b/evals/parity/contracts/ship.json @@ -9,7 +9,7 @@ "source_path": "ship/SKILL.md.tmpl", "base_sha": "bb57306d98c97011b0919c6132705a15b1579781", "blob_sha": "068ac4fe54bcb46572295d48263b11bd38fcde18", - "normalized_render_sha256": "b2f1d5bc59ec1a35fb367cc242131dc288ca1c9cf1baa8cefe9165b45f9841bc", + "normalized_render_sha256": "ab7a7219653b0fc5cdad0bb2959394798bc50ae4db4dc24b76c0454dd1b1397a", "target": "skills/ship/references/legacy/ship.md", "overlays": [ 679, diff --git a/evals/parity/contracts/skillify.json b/evals/parity/contracts/skillify.json index e64517ee6..08d7685c0 100644 --- a/evals/parity/contracts/skillify.json +++ b/evals/parity/contracts/skillify.json @@ -9,7 +9,7 @@ "source_path": "skillify/SKILL.md.tmpl", "base_sha": "bb57306d98c97011b0919c6132705a15b1579781", "blob_sha": "21fb2f503e3d40683fa782b21abf05a8f0fef69b", - "normalized_render_sha256": "13920affe83c53e5d459a077b68433682fd6c445389bf2024d2e5f4d5a021994", + "normalized_render_sha256": "b0743c957157e19bd90b457fd3ac9d6924c3aedce969c10af8d7973c2bcd6c9f", "target": "skills/qa/references/legacy/skillify.md", "overlays": [ 679, diff --git a/evals/parity/contracts/spec.json b/evals/parity/contracts/spec.json index ab9fb821a..2e86a6c3a 100644 --- a/evals/parity/contracts/spec.json +++ b/evals/parity/contracts/spec.json @@ -9,7 +9,7 @@ "source_path": "spec/SKILL.md.tmpl", "base_sha": "bb57306d98c97011b0919c6132705a15b1579781", "blob_sha": "6c0c14e1b37e1e56d85427e9c8d080a6df908992", - "normalized_render_sha256": "1693c430139d43e80d2981d95a61dc9d3674435690d5d838f4ca92f4d592694a", + "normalized_render_sha256": "059ec7a95791f6fc559f4e2321d7340ef5ae7e4ba89949df401f74d91411bfd3", "target": "skills/plan/references/legacy/spec.md", "overlays": [ 679 diff --git a/evals/parity/contracts/sync-gbrain.json b/evals/parity/contracts/sync-gbrain.json index d947af122..f53a53a95 100644 --- a/evals/parity/contracts/sync-gbrain.json +++ b/evals/parity/contracts/sync-gbrain.json @@ -9,7 +9,7 @@ "source_path": "sync-gbrain/SKILL.md.tmpl", "base_sha": "bb57306d98c97011b0919c6132705a15b1579781", "blob_sha": "2ec065472e263a07f3818ed87ee9a6a2e13ca3ae", - "normalized_render_sha256": "b33fb4a5fadaf6bcf71363b4e8d9b1f3fd56336f47d23eb8e8594d534d76b55b", + "normalized_render_sha256": "175e7d0d2998bd4c8ddcd9a84228c41ba4a5cf3aca3a8bc09ddfc5a303c1df30", "target": "skills/plan/references/legacy/sync-gbrain.md", "overlays": [ 679 diff --git a/evals/parity/contracts/unfreeze.json b/evals/parity/contracts/unfreeze.json index ce03a2275..e8c770377 100644 --- a/evals/parity/contracts/unfreeze.json +++ b/evals/parity/contracts/unfreeze.json @@ -9,7 +9,7 @@ "source_path": "unfreeze/SKILL.md.tmpl", "base_sha": "bb57306d98c97011b0919c6132705a15b1579781", "blob_sha": "88e413fe5a49a45d46d8867b2d80ace30b3b45aa", - "normalized_render_sha256": "9128912f4c79a423d4e52a7a27a9c560bf7ab58e85bcf32db1442f4ded6576ae", + "normalized_render_sha256": "51d6183901e866697382b7e900e2154e8bfb6a9ebf4f3e1bb3ad29925fad0e20", "target": "skills/debug/references/legacy/unfreeze.md", "overlays": [ 679 diff --git a/evals/parity/manifest.json b/evals/parity/manifest.json index cebc6210d..d2999fa5c 100644 --- a/evals/parity/manifest.json +++ b/evals/parity/manifest.json @@ -19,8 +19,8 @@ "scenarios": 25, "bug_fix_ports": 16, "assets": 78, - "dependency_copies": 10, - "runtime_helpers": 51 + "dependency_copies": 4, + "runtime_helpers": 40 }, "sources": [ { @@ -31,7 +31,7 @@ "source_path": "SKILL.md.tmpl", "base_sha": "bb57306d98c97011b0919c6132705a15b1579781", "blob_sha": "402bd0d7b0f2bf02f6c9e4754e0e2a655f5f4057", - "normalized_render_sha256": "8e28cf7aa8c1c858ffaa4936d05a66bd4522bd6c6438be719f569b01c5afbcd8", + "normalized_render_sha256": "daa2b069d1945c1e1bf8eef23417899b4eacb98087f6c146c0b726eb21fd2776", "target": "skills/plan/references/legacy/gstack.md", "disposition": "BUG_FIX", "overlays": [ @@ -46,7 +46,7 @@ "legacy_alias": "catalog" }, "question_sequence": "Preserve the source workflow order; gather prerequisites before consequential questions.", - "follow_up_behavior": "The complete source follow-up sequence is preserved verbatim inside new_location and hash-compared to the pinned base.", + "follow_up_behavior": "Specialist follow-up order is preserved from the pinned source. The retired 1.x shared onboarding wrapper is excluded, and carved specialist phases are package-local lazy references loaded at their original workflow point.", "smart_skip_rules": "Skip only when the source condition is false, and name every skipped module with evidence.", "pushback_rules": "Preserve the source forcing questions, recommendation pressure, and one-question-at-a-time cadence.", "stop_gates": "Preserve every STOP, hard gate, approval boundary, and no-mutation-before-approval rule.", @@ -73,7 +73,7 @@ "voice": "Direct builder voice; match the user language and retain source-specific tone constraints.", "response_posture": "Direct, evidence-first builder language; preserve source-specific recommendations and constructive pressure.", "new_location": "skills/plan/references/legacy/gstack.md", - "parity_test": "evals/parity/contracts/gstack.json + scripts/gstack2/run-parity.ts normalized full-body equality" + "parity_test": "evals/parity/contracts/gstack.json + scripts/gstack2/run-parity.ts canonical specialist render, excluded-wrapper, lazy-section, and pinned-source provenance checks" }, { "source": "office-hours", @@ -83,7 +83,7 @@ "source_path": "office-hours/SKILL.md.tmpl", "base_sha": "bb57306d98c97011b0919c6132705a15b1579781", "blob_sha": "8568fe73cca76a80805fab3092cacd10db7e1d7f", - "normalized_render_sha256": "0f0017a3752dd58d013c11d4d19af956724b6eeea89899f045dc3f41a3aa89b1", + "normalized_render_sha256": "b633a6ef87928ca2434f3a2b1ce88946cbe528a9e3659469e0f9cbbe8a7b146b", "target": "skills/plan/references/legacy/office-hours.md", "disposition": "BUG_FIX", "overlays": [ @@ -99,7 +99,7 @@ "legacy_alias": "product" }, "question_sequence": "Preserve the source workflow order; gather prerequisites before consequential questions.", - "follow_up_behavior": "The complete source follow-up sequence is preserved verbatim inside new_location and hash-compared to the pinned base.", + "follow_up_behavior": "Specialist follow-up order is preserved from the pinned source. The retired 1.x shared onboarding wrapper is excluded, and carved specialist phases are package-local lazy references loaded at their original workflow point.", "smart_skip_rules": "Skip only when the source condition is false, and name every skipped module with evidence.", "pushback_rules": "Preserve the source forcing questions, recommendation pressure, and one-question-at-a-time cadence.", "stop_gates": "Preserve every STOP, hard gate, approval boundary, and no-mutation-before-approval rule.", @@ -187,7 +187,7 @@ "voice": "Direct builder voice; match the user language and retain source-specific tone constraints.", "response_posture": "Direct, evidence-first builder language; preserve source-specific recommendations and constructive pressure.", "new_location": "skills/plan/references/legacy/office-hours.md", - "parity_test": "evals/parity/contracts/office-hours.json + scripts/gstack2/run-parity.ts normalized full-body equality" + "parity_test": "evals/parity/contracts/office-hours.json + scripts/gstack2/run-parity.ts canonical specialist render, excluded-wrapper, lazy-section, and pinned-source provenance checks" }, { "source": "plan-ceo-review", @@ -197,7 +197,7 @@ "source_path": "plan-ceo-review/SKILL.md.tmpl", "base_sha": "bb57306d98c97011b0919c6132705a15b1579781", "blob_sha": "c43cfe64146fe79df74a974f1673fe36defcce00", - "normalized_render_sha256": "eb1199228d8db2107eb7c4cbf889e2116117fcd54e63d5e2b9eceddacbc3bb50", + "normalized_render_sha256": "b2f811568920dfdbd500372df13855041ecb2b8b73e3629f3c71d87c5a78e034", "target": "skills/plan/references/legacy/plan-ceo-review.md", "disposition": "BUG_FIX", "overlays": [ @@ -213,7 +213,7 @@ "legacy_alias": "ceo" }, "question_sequence": "Preserve the source workflow order; gather prerequisites before consequential questions.", - "follow_up_behavior": "The complete source follow-up sequence is preserved verbatim inside new_location and hash-compared to the pinned base.", + "follow_up_behavior": "Specialist follow-up order is preserved from the pinned source. The retired 1.x shared onboarding wrapper is excluded, and carved specialist phases are package-local lazy references loaded at their original workflow point.", "smart_skip_rules": "Skip only when the source condition is false, and name every skipped module with evidence.", "pushback_rules": "Preserve the source forcing questions, recommendation pressure, and one-question-at-a-time cadence.", "stop_gates": "Preserve every STOP, hard gate, approval boundary, and no-mutation-before-approval rule.", @@ -327,7 +327,7 @@ "voice": "Direct builder voice; match the user language and retain source-specific tone constraints.", "response_posture": "Direct, evidence-first builder language; preserve source-specific recommendations and constructive pressure.", "new_location": "skills/plan/references/legacy/plan-ceo-review.md", - "parity_test": "evals/parity/contracts/plan-ceo-review.json + scripts/gstack2/run-parity.ts normalized full-body equality" + "parity_test": "evals/parity/contracts/plan-ceo-review.json + scripts/gstack2/run-parity.ts canonical specialist render, excluded-wrapper, lazy-section, and pinned-source provenance checks" }, { "source": "plan-eng-review", @@ -337,7 +337,7 @@ "source_path": "plan-eng-review/SKILL.md.tmpl", "base_sha": "bb57306d98c97011b0919c6132705a15b1579781", "blob_sha": "1d5be0e6f47f0896ee831b53c56818850b1dcfe4", - "normalized_render_sha256": "02dad060f44bffacc9cbc16532816930dbd0f2aa21466d0e97eaf36250a80833", + "normalized_render_sha256": "ee268f1d24769509b89b7db998372a773d9e7bc376306a68319af4f74c6fe713", "target": "skills/plan/references/legacy/plan-eng-review.md", "disposition": "BUG_FIX", "overlays": [ @@ -354,7 +354,7 @@ "legacy_alias": "eng" }, "question_sequence": "Preserve the source workflow order; gather prerequisites before consequential questions.", - "follow_up_behavior": "The complete source follow-up sequence is preserved verbatim inside new_location and hash-compared to the pinned base.", + "follow_up_behavior": "Specialist follow-up order is preserved from the pinned source. The retired 1.x shared onboarding wrapper is excluded, and carved specialist phases are package-local lazy references loaded at their original workflow point.", "smart_skip_rules": "Skip only when the source condition is false, and name every skipped module with evidence.", "pushback_rules": "Preserve the source forcing questions, recommendation pressure, and one-question-at-a-time cadence.", "stop_gates": "Preserve every STOP, hard gate, approval boundary, and no-mutation-before-approval rule.", @@ -447,7 +447,7 @@ "voice": "Direct builder voice; match the user language and retain source-specific tone constraints.", "response_posture": "Direct, evidence-first builder language; preserve source-specific recommendations and constructive pressure.", "new_location": "skills/plan/references/legacy/plan-eng-review.md", - "parity_test": "evals/parity/contracts/plan-eng-review.json + scripts/gstack2/run-parity.ts normalized full-body equality" + "parity_test": "evals/parity/contracts/plan-eng-review.json + scripts/gstack2/run-parity.ts canonical specialist render, excluded-wrapper, lazy-section, and pinned-source provenance checks" }, { "source": "plan-devex-review", @@ -457,7 +457,7 @@ "source_path": "plan-devex-review/SKILL.md.tmpl", "base_sha": "bb57306d98c97011b0919c6132705a15b1579781", "blob_sha": "1ef723c10997a08ef87940daceb08bf8d60dd810", - "normalized_render_sha256": "5be964b8b6e8ddf87df7b44bb7713e0c31a3de32cf261682793bc7db45c7cba1", + "normalized_render_sha256": "fff989dcab1f37d0c219378caef6b1e627c23c2537a717564be0d8567229bccc", "target": "skills/plan/references/legacy/plan-devex-review.md", "disposition": "BUG_FIX", "overlays": [ @@ -473,7 +473,7 @@ "legacy_alias": "dx" }, "question_sequence": "Preserve the source workflow order; gather prerequisites before consequential questions.", - "follow_up_behavior": "The complete source follow-up sequence is preserved verbatim inside new_location and hash-compared to the pinned base.", + "follow_up_behavior": "Specialist follow-up order is preserved from the pinned source. The retired 1.x shared onboarding wrapper is excluded, and carved specialist phases are package-local lazy references loaded at their original workflow point.", "smart_skip_rules": "Skip only when the source condition is false, and name every skipped module with evidence.", "pushback_rules": "Preserve the source forcing questions, recommendation pressure, and one-question-at-a-time cadence.", "stop_gates": "Preserve every STOP, hard gate, approval boundary, and no-mutation-before-approval rule.", @@ -580,7 +580,7 @@ "voice": "Direct builder voice; match the user language and retain source-specific tone constraints.", "response_posture": "Direct, evidence-first builder language; preserve source-specific recommendations and constructive pressure.", "new_location": "skills/plan/references/legacy/plan-devex-review.md", - "parity_test": "evals/parity/contracts/plan-devex-review.json + scripts/gstack2/run-parity.ts normalized full-body equality" + "parity_test": "evals/parity/contracts/plan-devex-review.json + scripts/gstack2/run-parity.ts canonical specialist render, excluded-wrapper, lazy-section, and pinned-source provenance checks" }, { "source": "autoplan", @@ -590,7 +590,7 @@ "source_path": "autoplan/SKILL.md.tmpl", "base_sha": "bb57306d98c97011b0919c6132705a15b1579781", "blob_sha": "b2eaca9fde8f46001bea9961b8ed651d0f6f9e13", - "normalized_render_sha256": "706dd2fb1b3f3c7e6f446b268bd5a513fc7d2560ca12f702d670907402843a11", + "normalized_render_sha256": "b11bef3e060400cd59a16e41c9b6f8395ace065867a1c2a70329319153a2c4dc", "target": "skills/plan/references/legacy/autoplan.md", "disposition": "BUG_FIX", "overlays": [ @@ -607,7 +607,7 @@ "legacy_alias": "auto" }, "question_sequence": "Preserve the source workflow order; gather prerequisites before consequential questions.", - "follow_up_behavior": "The complete source follow-up sequence is preserved verbatim inside new_location and hash-compared to the pinned base.", + "follow_up_behavior": "Specialist follow-up order is preserved from the pinned source. The retired 1.x shared onboarding wrapper is excluded, and carved specialist phases are package-local lazy references loaded at their original workflow point.", "smart_skip_rules": "Skip only when the source condition is false, and name every skipped module with evidence.", "pushback_rules": "Preserve the source forcing questions, recommendation pressure, and one-question-at-a-time cadence.", "stop_gates": "Preserve every STOP, hard gate, approval boundary, and no-mutation-before-approval rule.", @@ -671,7 +671,7 @@ "voice": "Direct builder voice; match the user language and retain source-specific tone constraints.", "response_posture": "Direct, evidence-first builder language; preserve source-specific recommendations and constructive pressure.", "new_location": "skills/plan/references/legacy/autoplan.md", - "parity_test": "evals/parity/contracts/autoplan.json + scripts/gstack2/run-parity.ts normalized full-body equality" + "parity_test": "evals/parity/contracts/autoplan.json + scripts/gstack2/run-parity.ts canonical specialist render, excluded-wrapper, lazy-section, and pinned-source provenance checks" }, { "source": "spec", @@ -681,7 +681,7 @@ "source_path": "spec/SKILL.md.tmpl", "base_sha": "bb57306d98c97011b0919c6132705a15b1579781", "blob_sha": "6c0c14e1b37e1e56d85427e9c8d080a6df908992", - "normalized_render_sha256": "1693c430139d43e80d2981d95a61dc9d3674435690d5d838f4ca92f4d592694a", + "normalized_render_sha256": "059ec7a95791f6fc559f4e2321d7340ef5ae7e4ba89949df401f74d91411bfd3", "target": "skills/plan/references/legacy/spec.md", "disposition": "BUG_FIX", "overlays": [ @@ -696,7 +696,7 @@ "legacy_alias": "spec" }, "question_sequence": "Preserve the source workflow order; gather prerequisites before consequential questions.", - "follow_up_behavior": "The complete source follow-up sequence is preserved verbatim inside new_location and hash-compared to the pinned base.", + "follow_up_behavior": "Specialist follow-up order is preserved from the pinned source. The retired 1.x shared onboarding wrapper is excluded, and carved specialist phases are package-local lazy references loaded at their original workflow point.", "smart_skip_rules": "Skip only when the source condition is false, and name every skipped module with evidence.", "pushback_rules": "Preserve the source forcing questions, recommendation pressure, and one-question-at-a-time cadence.", "stop_gates": "Preserve every STOP, hard gate, approval boundary, and no-mutation-before-approval rule.", @@ -804,7 +804,7 @@ "voice": "Direct builder voice; match the user language and retain source-specific tone constraints.", "response_posture": "Direct, evidence-first builder language; preserve source-specific recommendations and constructive pressure.", "new_location": "skills/plan/references/legacy/spec.md", - "parity_test": "evals/parity/contracts/spec.json + scripts/gstack2/run-parity.ts normalized full-body equality" + "parity_test": "evals/parity/contracts/spec.json + scripts/gstack2/run-parity.ts canonical specialist render, excluded-wrapper, lazy-section, and pinned-source provenance checks" }, { "source": "plan-tune", @@ -814,7 +814,7 @@ "source_path": "plan-tune/SKILL.md.tmpl", "base_sha": "bb57306d98c97011b0919c6132705a15b1579781", "blob_sha": "dc1214d4c023ed2b126aca8aedb4153b222e73c5", - "normalized_render_sha256": "3b683319cf88f0d0b082654a45050d313d227fca16811aa1b859097a141f40f8", + "normalized_render_sha256": "306bbf971a2867e1f39cce82d64289d6c457bceb07439ddd6f4a3ff8f8ae5e9a", "target": "skills/plan/references/legacy/plan-tune.md", "disposition": "BUG_FIX", "overlays": [ @@ -829,7 +829,7 @@ "legacy_alias": "preferences" }, "question_sequence": "Preserve the source workflow order; gather prerequisites before consequential questions.", - "follow_up_behavior": "The complete source follow-up sequence is preserved verbatim inside new_location and hash-compared to the pinned base.", + "follow_up_behavior": "Specialist follow-up order is preserved from the pinned source. The retired 1.x shared onboarding wrapper is excluded, and carved specialist phases are package-local lazy references loaded at their original workflow point.", "smart_skip_rules": "Skip only when the source condition is false, and name every skipped module with evidence.", "pushback_rules": "Preserve the source forcing questions, recommendation pressure, and one-question-at-a-time cadence.", "stop_gates": "Preserve every STOP, hard gate, approval boundary, and no-mutation-before-approval rule.", @@ -883,7 +883,7 @@ "voice": "Direct builder voice; match the user language and retain source-specific tone constraints.", "response_posture": "Direct, evidence-first builder language; preserve source-specific recommendations and constructive pressure.", "new_location": "skills/plan/references/legacy/plan-tune.md", - "parity_test": "evals/parity/contracts/plan-tune.json + scripts/gstack2/run-parity.ts normalized full-body equality" + "parity_test": "evals/parity/contracts/plan-tune.json + scripts/gstack2/run-parity.ts canonical specialist render, excluded-wrapper, lazy-section, and pinned-source provenance checks" }, { "source": "context-save", @@ -893,7 +893,7 @@ "source_path": "context-save/SKILL.md.tmpl", "base_sha": "bb57306d98c97011b0919c6132705a15b1579781", "blob_sha": "a3702bc95439cddd87841aba836708bf511ef55d", - "normalized_render_sha256": "06a3ef8d7c9d361e7497252b69082ee51786ef4fd2bb62d9e7c5d97817bfdb0d", + "normalized_render_sha256": "348b840c60cecd8818d75f63ebb8e3effae659437137ce75c1ba6124177120b6", "target": "skills/plan/references/legacy/context-save.md", "disposition": "BUG_FIX", "overlays": [ @@ -908,7 +908,7 @@ "legacy_alias": "context-save" }, "question_sequence": "Preserve the source workflow order; gather prerequisites before consequential questions.", - "follow_up_behavior": "The complete source follow-up sequence is preserved verbatim inside new_location and hash-compared to the pinned base.", + "follow_up_behavior": "Specialist follow-up order is preserved from the pinned source. The retired 1.x shared onboarding wrapper is excluded, and carved specialist phases are package-local lazy references loaded at their original workflow point.", "smart_skip_rules": "Skip only when the source condition is false, and name every skipped module with evidence.", "pushback_rules": "Preserve the source forcing questions, recommendation pressure, and one-question-at-a-time cadence.", "stop_gates": "Preserve every STOP, hard gate, approval boundary, and no-mutation-before-approval rule.", @@ -958,7 +958,7 @@ "voice": "Direct builder voice; match the user language and retain source-specific tone constraints.", "response_posture": "Direct, evidence-first builder language; preserve source-specific recommendations and constructive pressure.", "new_location": "skills/plan/references/legacy/context-save.md", - "parity_test": "evals/parity/contracts/context-save.json + scripts/gstack2/run-parity.ts normalized full-body equality" + "parity_test": "evals/parity/contracts/context-save.json + scripts/gstack2/run-parity.ts canonical specialist render, excluded-wrapper, lazy-section, and pinned-source provenance checks" }, { "source": "context-restore", @@ -968,7 +968,7 @@ "source_path": "context-restore/SKILL.md.tmpl", "base_sha": "bb57306d98c97011b0919c6132705a15b1579781", "blob_sha": "55889f6e06d3ba896f33a16969959c700bc24f1e", - "normalized_render_sha256": "33b0cb3f2f23ef913eafd18b73c34aafe879c22cf7c23ceed7a5b5324ac79d3a", + "normalized_render_sha256": "c14726232c67616485c115dd7ca0898992bab9c7990629b40dc3b6f1c0dec0ee", "target": "skills/plan/references/legacy/context-restore.md", "disposition": "BUG_FIX", "overlays": [ @@ -983,7 +983,7 @@ "legacy_alias": "context-restore" }, "question_sequence": "Preserve the source workflow order; gather prerequisites before consequential questions.", - "follow_up_behavior": "The complete source follow-up sequence is preserved verbatim inside new_location and hash-compared to the pinned base.", + "follow_up_behavior": "Specialist follow-up order is preserved from the pinned source. The retired 1.x shared onboarding wrapper is excluded, and carved specialist phases are package-local lazy references loaded at their original workflow point.", "smart_skip_rules": "Skip only when the source condition is false, and name every skipped module with evidence.", "pushback_rules": "Preserve the source forcing questions, recommendation pressure, and one-question-at-a-time cadence.", "stop_gates": "Preserve every STOP, hard gate, approval boundary, and no-mutation-before-approval rule.", @@ -1030,7 +1030,7 @@ "voice": "Direct builder voice; match the user language and retain source-specific tone constraints.", "response_posture": "Direct, evidence-first builder language; preserve source-specific recommendations and constructive pressure.", "new_location": "skills/plan/references/legacy/context-restore.md", - "parity_test": "evals/parity/contracts/context-restore.json + scripts/gstack2/run-parity.ts normalized full-body equality" + "parity_test": "evals/parity/contracts/context-restore.json + scripts/gstack2/run-parity.ts canonical specialist render, excluded-wrapper, lazy-section, and pinned-source provenance checks" }, { "source": "learn", @@ -1040,7 +1040,7 @@ "source_path": "learn/SKILL.md.tmpl", "base_sha": "bb57306d98c97011b0919c6132705a15b1579781", "blob_sha": "90d08d2298cccd0d5090f194a2cd76a5361b4323", - "normalized_render_sha256": "0a155c2ed222aeb6d730583f4f9ce27ad6ad6c917a0bf583079da39a10e148d8", + "normalized_render_sha256": "0d1bbdf1bba2eaae206a350d47fb25ab50d49611262cb376861e83f78822f762", "target": "skills/plan/references/legacy/learn.md", "disposition": "BUG_FIX", "overlays": [ @@ -1056,7 +1056,7 @@ "legacy_alias": "learning" }, "question_sequence": "Preserve the source workflow order; gather prerequisites before consequential questions.", - "follow_up_behavior": "The complete source follow-up sequence is preserved verbatim inside new_location and hash-compared to the pinned base.", + "follow_up_behavior": "Specialist follow-up order is preserved from the pinned source. The retired 1.x shared onboarding wrapper is excluded, and carved specialist phases are package-local lazy references loaded at their original workflow point.", "smart_skip_rules": "Skip only when the source condition is false, and name every skipped module with evidence.", "pushback_rules": "Preserve the source forcing questions, recommendation pressure, and one-question-at-a-time cadence.", "stop_gates": "Preserve every STOP, hard gate, approval boundary, and no-mutation-before-approval rule.", @@ -1103,7 +1103,7 @@ "voice": "Direct builder voice; match the user language and retain source-specific tone constraints.", "response_posture": "Direct, evidence-first builder language; preserve source-specific recommendations and constructive pressure.", "new_location": "skills/plan/references/legacy/learn.md", - "parity_test": "evals/parity/contracts/learn.json + scripts/gstack2/run-parity.ts normalized full-body equality" + "parity_test": "evals/parity/contracts/learn.json + scripts/gstack2/run-parity.ts canonical specialist render, excluded-wrapper, lazy-section, and pinned-source provenance checks" }, { "source": "retro", @@ -1113,7 +1113,7 @@ "source_path": "retro/SKILL.md.tmpl", "base_sha": "bb57306d98c97011b0919c6132705a15b1579781", "blob_sha": "b0819c8a6b736baf489179ba587442cf9973b9d2", - "normalized_render_sha256": "3cfdcdab3560e38aa04d3079b6707080d3859cd05e4d4aecfb68267367d4e8f7", + "normalized_render_sha256": "c92e69da5c62e4bb5a426f4fb5623b41215e538315e2faebece8ba118cacaf71", "target": "skills/plan/references/legacy/retro.md", "disposition": "BUG_FIX", "overlays": [ @@ -1130,7 +1130,7 @@ "legacy_alias": "retro" }, "question_sequence": "Preserve the source workflow order; gather prerequisites before consequential questions.", - "follow_up_behavior": "The complete source follow-up sequence is preserved verbatim inside new_location and hash-compared to the pinned base.", + "follow_up_behavior": "Specialist follow-up order is preserved from the pinned source. The retired 1.x shared onboarding wrapper is excluded, and carved specialist phases are package-local lazy references loaded at their original workflow point.", "smart_skip_rules": "Skip only when the source condition is false, and name every skipped module with evidence.", "pushback_rules": "Preserve the source forcing questions, recommendation pressure, and one-question-at-a-time cadence.", "stop_gates": "Preserve every STOP, hard gate, approval boundary, and no-mutation-before-approval rule.", @@ -1230,7 +1230,7 @@ "voice": "Direct builder voice; match the user language and retain source-specific tone constraints.", "response_posture": "Direct, evidence-first builder language; preserve source-specific recommendations and constructive pressure.", "new_location": "skills/plan/references/legacy/retro.md", - "parity_test": "evals/parity/contracts/retro.json + scripts/gstack2/run-parity.ts normalized full-body equality" + "parity_test": "evals/parity/contracts/retro.json + scripts/gstack2/run-parity.ts canonical specialist render, excluded-wrapper, lazy-section, and pinned-source provenance checks" }, { "source": "setup-gbrain", @@ -1240,7 +1240,7 @@ "source_path": "setup-gbrain/SKILL.md.tmpl", "base_sha": "bb57306d98c97011b0919c6132705a15b1579781", "blob_sha": "f48581543b46ecf889f4f86fb7a0d9e75d0bd6ca", - "normalized_render_sha256": "3f87c1e0d75bd5c5cbe6848751271185e216b38945c93fddba7c7ac022fed982", + "normalized_render_sha256": "244ebee93e8871d59c1b0eac040bed362783e48a9b134171d743750ce9a59b29", "target": "skills/plan/references/legacy/setup-gbrain.md", "disposition": "BUG_FIX", "overlays": [ @@ -1255,7 +1255,7 @@ "legacy_alias": "memory-setup" }, "question_sequence": "Preserve the source workflow order; gather prerequisites before consequential questions.", - "follow_up_behavior": "The complete source follow-up sequence is preserved verbatim inside new_location and hash-compared to the pinned base.", + "follow_up_behavior": "Specialist follow-up order is preserved from the pinned source. The retired 1.x shared onboarding wrapper is excluded, and carved specialist phases are package-local lazy references loaded at their original workflow point.", "smart_skip_rules": "Skip only when the source condition is false, and name every skipped module with evidence.", "pushback_rules": "Preserve the source forcing questions, recommendation pressure, and one-question-at-a-time cadence.", "stop_gates": "Preserve every STOP, hard gate, approval boundary, and no-mutation-before-approval rule.", @@ -1330,7 +1330,7 @@ "voice": "Direct builder voice; match the user language and retain source-specific tone constraints.", "response_posture": "Direct, evidence-first builder language; preserve source-specific recommendations and constructive pressure.", "new_location": "skills/plan/references/legacy/setup-gbrain.md", - "parity_test": "evals/parity/contracts/setup-gbrain.json + scripts/gstack2/run-parity.ts normalized full-body equality" + "parity_test": "evals/parity/contracts/setup-gbrain.json + scripts/gstack2/run-parity.ts canonical specialist render, excluded-wrapper, lazy-section, and pinned-source provenance checks" }, { "source": "sync-gbrain", @@ -1340,7 +1340,7 @@ "source_path": "sync-gbrain/SKILL.md.tmpl", "base_sha": "bb57306d98c97011b0919c6132705a15b1579781", "blob_sha": "2ec065472e263a07f3818ed87ee9a6a2e13ca3ae", - "normalized_render_sha256": "b33fb4a5fadaf6bcf71363b4e8d9b1f3fd56336f47d23eb8e8594d534d76b55b", + "normalized_render_sha256": "175e7d0d2998bd4c8ddcd9a84228c41ba4a5cf3aca3a8bc09ddfc5a303c1df30", "target": "skills/plan/references/legacy/sync-gbrain.md", "disposition": "BUG_FIX", "overlays": [ @@ -1355,7 +1355,7 @@ "legacy_alias": "memory-sync" }, "question_sequence": "Preserve the source workflow order; gather prerequisites before consequential questions.", - "follow_up_behavior": "The complete source follow-up sequence is preserved verbatim inside new_location and hash-compared to the pinned base.", + "follow_up_behavior": "Specialist follow-up order is preserved from the pinned source. The retired 1.x shared onboarding wrapper is excluded, and carved specialist phases are package-local lazy references loaded at their original workflow point.", "smart_skip_rules": "Skip only when the source condition is false, and name every skipped module with evidence.", "pushback_rules": "Preserve the source forcing questions, recommendation pressure, and one-question-at-a-time cadence.", "stop_gates": "Preserve every STOP, hard gate, approval boundary, and no-mutation-before-approval rule.", @@ -1406,7 +1406,7 @@ "voice": "Direct builder voice; match the user language and retain source-specific tone constraints.", "response_posture": "Direct, evidence-first builder language; preserve source-specific recommendations and constructive pressure.", "new_location": "skills/plan/references/legacy/sync-gbrain.md", - "parity_test": "evals/parity/contracts/sync-gbrain.json + scripts/gstack2/run-parity.ts normalized full-body equality" + "parity_test": "evals/parity/contracts/sync-gbrain.json + scripts/gstack2/run-parity.ts canonical specialist render, excluded-wrapper, lazy-section, and pinned-source provenance checks" }, { "source": "design-consultation", @@ -1416,7 +1416,7 @@ "source_path": "design-consultation/SKILL.md.tmpl", "base_sha": "bb57306d98c97011b0919c6132705a15b1579781", "blob_sha": "64af56ecdbd132cb7c28344e8e4ecb2e5dacf811", - "normalized_render_sha256": "2753c3423f22f9ef2b3baf31069bd2ac6951e7bc69cc70f28c8da5c07580ab26", + "normalized_render_sha256": "afa1f2b58d22d9f0f9064336ce7e9836430a298e1deb56f5330390f91df3f680", "target": "skills/design/references/legacy/design-consultation.md", "disposition": "BUG_FIX", "overlays": [ @@ -1433,7 +1433,7 @@ "legacy_alias": "consult" }, "question_sequence": "Preserve the source workflow order; gather prerequisites before consequential questions.", - "follow_up_behavior": "The complete source follow-up sequence is preserved verbatim inside new_location and hash-compared to the pinned base.", + "follow_up_behavior": "Specialist follow-up order is preserved from the pinned source. The retired 1.x shared onboarding wrapper is excluded, and carved specialist phases are package-local lazy references loaded at their original workflow point.", "smart_skip_rules": "Skip only when the source condition is false, and name every skipped module with evidence.", "pushback_rules": "Preserve the source forcing questions, recommendation pressure, and one-question-at-a-time cadence.", "stop_gates": "Preserve every STOP, hard gate, approval boundary, and no-mutation-before-approval rule.", @@ -1494,7 +1494,7 @@ "voice": "Direct builder voice; match the user language and retain source-specific tone constraints.", "response_posture": "Direct, evidence-first builder language; preserve source-specific recommendations and constructive pressure.", "new_location": "skills/design/references/legacy/design-consultation.md", - "parity_test": "evals/parity/contracts/design-consultation.json + scripts/gstack2/run-parity.ts normalized full-body equality" + "parity_test": "evals/parity/contracts/design-consultation.json + scripts/gstack2/run-parity.ts canonical specialist render, excluded-wrapper, lazy-section, and pinned-source provenance checks" }, { "source": "design-shotgun", @@ -1504,7 +1504,7 @@ "source_path": "design-shotgun/SKILL.md.tmpl", "base_sha": "bb57306d98c97011b0919c6132705a15b1579781", "blob_sha": "230dbc2922f05bf272bf5168a958a12604fac1bc", - "normalized_render_sha256": "2ffa676332b91cb2f4f0ae4a08d917dd43a767995b33d960895c15e93fb7c73c", + "normalized_render_sha256": "1db4cd23ee115ce841d2db898cc442141588635d43018393703aa28ce40d48f2", "target": "skills/design/references/legacy/design-shotgun.md", "disposition": "BUG_FIX", "overlays": [ @@ -1520,7 +1520,7 @@ "legacy_alias": "alternatives" }, "question_sequence": "Preserve the source workflow order; gather prerequisites before consequential questions.", - "follow_up_behavior": "The complete source follow-up sequence is preserved verbatim inside new_location and hash-compared to the pinned base.", + "follow_up_behavior": "Specialist follow-up order is preserved from the pinned source. The retired 1.x shared onboarding wrapper is excluded, and carved specialist phases are package-local lazy references loaded at their original workflow point.", "smart_skip_rules": "Skip only when the source condition is false, and name every skipped module with evidence.", "pushback_rules": "Preserve the source forcing questions, recommendation pressure, and one-question-at-a-time cadence.", "stop_gates": "Preserve every STOP, hard gate, approval boundary, and no-mutation-before-approval rule.", @@ -1581,7 +1581,7 @@ "voice": "Direct builder voice; match the user language and retain source-specific tone constraints.", "response_posture": "Direct, evidence-first builder language; preserve source-specific recommendations and constructive pressure.", "new_location": "skills/design/references/legacy/design-shotgun.md", - "parity_test": "evals/parity/contracts/design-shotgun.json + scripts/gstack2/run-parity.ts normalized full-body equality" + "parity_test": "evals/parity/contracts/design-shotgun.json + scripts/gstack2/run-parity.ts canonical specialist render, excluded-wrapper, lazy-section, and pinned-source provenance checks" }, { "source": "design-html", @@ -1591,7 +1591,7 @@ "source_path": "design-html/SKILL.md.tmpl", "base_sha": "bb57306d98c97011b0919c6132705a15b1579781", "blob_sha": "3cdec9a14d62d2e046ed924c972efc30a7d43aca", - "normalized_render_sha256": "f6dd88ea765653cd49bac6479c8212977bb578afca4c900153a9c646c260b943", + "normalized_render_sha256": "cbb1b4357bedbb0fffe23c3e0ad31ee8c2a198a31443edb660e5c836e67e94e6", "target": "skills/design/references/legacy/design-html.md", "disposition": "BUG_FIX", "overlays": [ @@ -1606,7 +1606,7 @@ "legacy_alias": "html" }, "question_sequence": "Preserve the source workflow order; gather prerequisites before consequential questions.", - "follow_up_behavior": "The complete source follow-up sequence is preserved verbatim inside new_location and hash-compared to the pinned base.", + "follow_up_behavior": "Specialist follow-up order is preserved from the pinned source. The retired 1.x shared onboarding wrapper is excluded, and carved specialist phases are package-local lazy references loaded at their original workflow point.", "smart_skip_rules": "Skip only when the source condition is false, and name every skipped module with evidence.", "pushback_rules": "Preserve the source forcing questions, recommendation pressure, and one-question-at-a-time cadence.", "stop_gates": "Preserve every STOP, hard gate, approval boundary, and no-mutation-before-approval rule.", @@ -1677,7 +1677,7 @@ "voice": "Direct builder voice; match the user language and retain source-specific tone constraints.", "response_posture": "Direct, evidence-first builder language; preserve source-specific recommendations and constructive pressure.", "new_location": "skills/design/references/legacy/design-html.md", - "parity_test": "evals/parity/contracts/design-html.json + scripts/gstack2/run-parity.ts normalized full-body equality" + "parity_test": "evals/parity/contracts/design-html.json + scripts/gstack2/run-parity.ts canonical specialist render, excluded-wrapper, lazy-section, and pinned-source provenance checks" }, { "source": "plan-design-review", @@ -1687,7 +1687,7 @@ "source_path": "plan-design-review/SKILL.md.tmpl", "base_sha": "bb57306d98c97011b0919c6132705a15b1579781", "blob_sha": "7178c991e41277410de500298cf81372543861af", - "normalized_render_sha256": "05fdb5d63dc6007307c74493f0597251fb9d203b310f7c80b5921b94666f3d99", + "normalized_render_sha256": "2f7a5d113c466d75ca4524e424c072044d92ae7ab93009f1fbe3ae5965e8aa34", "target": "skills/design/references/legacy/plan-design-review.md", "disposition": "BUG_FIX", "overlays": [ @@ -1704,7 +1704,7 @@ "legacy_alias": "plan-review" }, "question_sequence": "Preserve the source workflow order; gather prerequisites before consequential questions.", - "follow_up_behavior": "The complete source follow-up sequence is preserved verbatim inside new_location and hash-compared to the pinned base.", + "follow_up_behavior": "Specialist follow-up order is preserved from the pinned source. The retired 1.x shared onboarding wrapper is excluded, and carved specialist phases are package-local lazy references loaded at their original workflow point.", "smart_skip_rules": "Skip only when the source condition is false, and name every skipped module with evidence.", "pushback_rules": "Preserve the source forcing questions, recommendation pressure, and one-question-at-a-time cadence.", "stop_gates": "Preserve every STOP, hard gate, approval boundary, and no-mutation-before-approval rule.", @@ -1810,7 +1810,7 @@ "voice": "Direct builder voice; match the user language and retain source-specific tone constraints.", "response_posture": "Direct, evidence-first builder language; preserve source-specific recommendations and constructive pressure.", "new_location": "skills/design/references/legacy/plan-design-review.md", - "parity_test": "evals/parity/contracts/plan-design-review.json + scripts/gstack2/run-parity.ts normalized full-body equality" + "parity_test": "evals/parity/contracts/plan-design-review.json + scripts/gstack2/run-parity.ts canonical specialist render, excluded-wrapper, lazy-section, and pinned-source provenance checks" }, { "source": "design-review", @@ -1820,7 +1820,7 @@ "source_path": "design-review/SKILL.md.tmpl", "base_sha": "bb57306d98c97011b0919c6132705a15b1579781", "blob_sha": "bdcda48e29b489a1cc49faa333922412251d4b41", - "normalized_render_sha256": "8711f4910f9cb9d022d024c432093bccbcf8d4e74250a3a25f915eb086de6c5a", + "normalized_render_sha256": "33584047a11aa46a1b6a2bef5bf97a4d0b443bb6c9542685732e7d4dff795a2e", "target": "skills/design/references/legacy/design-review.md", "disposition": "BUG_FIX", "overlays": [ @@ -1838,7 +1838,7 @@ "legacy_alias": "live-review" }, "question_sequence": "Preserve the source workflow order; gather prerequisites before consequential questions.", - "follow_up_behavior": "The complete source follow-up sequence is preserved verbatim inside new_location and hash-compared to the pinned base.", + "follow_up_behavior": "Specialist follow-up order is preserved from the pinned source. The retired 1.x shared onboarding wrapper is excluded, and carved specialist phases are package-local lazy references loaded at their original workflow point.", "smart_skip_rules": "Skip only when the source condition is false, and name every skipped module with evidence.", "pushback_rules": "Preserve the source forcing questions, recommendation pressure, and one-question-at-a-time cadence.", "stop_gates": "Preserve every STOP, hard gate, approval boundary, and no-mutation-before-approval rule.", @@ -1940,7 +1940,7 @@ "voice": "Direct builder voice; match the user language and retain source-specific tone constraints.", "response_posture": "Direct, evidence-first builder language; preserve source-specific recommendations and constructive pressure.", "new_location": "skills/design/references/legacy/design-review.md", - "parity_test": "evals/parity/contracts/design-review.json + scripts/gstack2/run-parity.ts normalized full-body equality" + "parity_test": "evals/parity/contracts/design-review.json + scripts/gstack2/run-parity.ts canonical specialist render, excluded-wrapper, lazy-section, and pinned-source provenance checks" }, { "source": "ios-design-review", @@ -1950,7 +1950,7 @@ "source_path": "ios-design-review/SKILL.md.tmpl", "base_sha": "bb57306d98c97011b0919c6132705a15b1579781", "blob_sha": "dd9e2518f53edf939a1e425806abc871a9b33022", - "normalized_render_sha256": "38bb6ba7876611f5ae63566820f67a48f9b1797c33d000c866540a4e6f766d50", + "normalized_render_sha256": "53741f7f044faa413f1725bada27514d2528d834f327e83f040de67668d24dae", "target": "skills/design/references/legacy/ios-design-review.md", "disposition": "BUG_FIX", "overlays": [ @@ -1965,7 +1965,7 @@ "legacy_alias": "ios-review" }, "question_sequence": "Preserve the source workflow order; gather prerequisites before consequential questions.", - "follow_up_behavior": "The complete source follow-up sequence is preserved verbatim inside new_location and hash-compared to the pinned base.", + "follow_up_behavior": "Specialist follow-up order is preserved from the pinned source. The retired 1.x shared onboarding wrapper is excluded, and carved specialist phases are package-local lazy references loaded at their original workflow point.", "smart_skip_rules": "Skip only when the source condition is false, and name every skipped module with evidence.", "pushback_rules": "Preserve the source forcing questions, recommendation pressure, and one-question-at-a-time cadence.", "stop_gates": "Preserve every STOP, hard gate, approval boundary, and no-mutation-before-approval rule.", @@ -2012,7 +2012,7 @@ "voice": "Direct builder voice; match the user language and retain source-specific tone constraints.", "response_posture": "Direct, evidence-first builder language; preserve source-specific recommendations and constructive pressure.", "new_location": "skills/design/references/legacy/ios-design-review.md", - "parity_test": "evals/parity/contracts/ios-design-review.json + scripts/gstack2/run-parity.ts normalized full-body equality" + "parity_test": "evals/parity/contracts/ios-design-review.json + scripts/gstack2/run-parity.ts canonical specialist render, excluded-wrapper, lazy-section, and pinned-source provenance checks" }, { "source": "diagram", @@ -2022,7 +2022,7 @@ "source_path": "diagram/SKILL.md.tmpl", "base_sha": "bb57306d98c97011b0919c6132705a15b1579781", "blob_sha": "9e19a52c6b7f727ce4faf5c1f9c14514ecb52f50", - "normalized_render_sha256": "88d1b8810d6ae95c6cf984825e2fe96712dfe4a7f7dba3e03d8a3634cf9e97ca", + "normalized_render_sha256": "21f18fa4957b79bf5941abfebd1b222dee3eb960520e0deac1c32d0b6fd62a38", "target": "skills/design/references/legacy/diagram.md", "disposition": "BUG_FIX", "overlays": [ @@ -2037,7 +2037,7 @@ "legacy_alias": "diagram" }, "question_sequence": "Preserve the source workflow order; gather prerequisites before consequential questions.", - "follow_up_behavior": "The complete source follow-up sequence is preserved verbatim inside new_location and hash-compared to the pinned base.", + "follow_up_behavior": "Specialist follow-up order is preserved from the pinned source. The retired 1.x shared onboarding wrapper is excluded, and carved specialist phases are package-local lazy references loaded at their original workflow point.", "smart_skip_rules": "Skip only when the source condition is false, and name every skipped module with evidence.", "pushback_rules": "Preserve the source forcing questions, recommendation pressure, and one-question-at-a-time cadence.", "stop_gates": "Preserve every STOP, hard gate, approval boundary, and no-mutation-before-approval rule.", @@ -2085,7 +2085,7 @@ "voice": "Direct builder voice; match the user language and retain source-specific tone constraints.", "response_posture": "Direct, evidence-first builder language; preserve source-specific recommendations and constructive pressure.", "new_location": "skills/design/references/legacy/diagram.md", - "parity_test": "evals/parity/contracts/diagram.json + scripts/gstack2/run-parity.ts normalized full-body equality" + "parity_test": "evals/parity/contracts/diagram.json + scripts/gstack2/run-parity.ts canonical specialist render, excluded-wrapper, lazy-section, and pinned-source provenance checks" }, { "source": "make-pdf", @@ -2095,7 +2095,7 @@ "source_path": "make-pdf/SKILL.md.tmpl", "base_sha": "bb57306d98c97011b0919c6132705a15b1579781", "blob_sha": "9133a711d4f3d056a21f790e8ec3b98f13fbaa50", - "normalized_render_sha256": "7901a455bf36750224e05468d0123c32e8b9bc98c7334fb0973228bdbba80997", + "normalized_render_sha256": "c092bc644ff9b8929d9cbdfedb6f2761b40ce8e1fca53d13ad350ba91195104d", "target": "skills/design/references/legacy/make-pdf.md", "disposition": "BUG_FIX", "overlays": [ @@ -2110,7 +2110,7 @@ "legacy_alias": "pdf" }, "question_sequence": "Preserve the source workflow order; gather prerequisites before consequential questions.", - "follow_up_behavior": "The complete source follow-up sequence is preserved verbatim inside new_location and hash-compared to the pinned base.", + "follow_up_behavior": "Specialist follow-up order is preserved from the pinned source. The retired 1.x shared onboarding wrapper is excluded, and carved specialist phases are package-local lazy references loaded at their original workflow point.", "smart_skip_rules": "Skip only when the source condition is false, and name every skipped module with evidence.", "pushback_rules": "Preserve the source forcing questions, recommendation pressure, and one-question-at-a-time cadence.", "stop_gates": "Preserve every STOP, hard gate, approval boundary, and no-mutation-before-approval rule.", @@ -2152,7 +2152,7 @@ "voice": "Direct builder voice; match the user language and retain source-specific tone constraints.", "response_posture": "Direct, evidence-first builder language; preserve source-specific recommendations and constructive pressure.", "new_location": "skills/design/references/legacy/make-pdf.md", - "parity_test": "evals/parity/contracts/make-pdf.json + scripts/gstack2/run-parity.ts normalized full-body equality" + "parity_test": "evals/parity/contracts/make-pdf.json + scripts/gstack2/run-parity.ts canonical specialist render, excluded-wrapper, lazy-section, and pinned-source provenance checks" }, { "source": "qa", @@ -2162,7 +2162,7 @@ "source_path": "qa/SKILL.md.tmpl", "base_sha": "bb57306d98c97011b0919c6132705a15b1579781", "blob_sha": "11997f7b878282c34b6bfd3d4b7a8131f9ad4da8", - "normalized_render_sha256": "025c1fbca58477248afb826cde24766904749129177e2bc60fbf2370207d1da5", + "normalized_render_sha256": "b1387290067842593297c8d64dc578a890a336ce5a8b60085e51b52c55ebaade", "target": "skills/qa/references/legacy/qa.md", "disposition": "BUG_FIX", "overlays": [ @@ -2180,7 +2180,7 @@ "legacy_alias": "fix" }, "question_sequence": "Preserve the source workflow order; gather prerequisites before consequential questions.", - "follow_up_behavior": "The complete source follow-up sequence is preserved verbatim inside new_location and hash-compared to the pinned base.", + "follow_up_behavior": "Specialist follow-up order is preserved from the pinned source. The retired 1.x shared onboarding wrapper is excluded, and carved specialist phases are package-local lazy references loaded at their original workflow point.", "smart_skip_rules": "Skip only when the source condition is false, and name every skipped module with evidence.", "pushback_rules": "Preserve the source forcing questions, recommendation pressure, and one-question-at-a-time cadence.", "stop_gates": "Preserve every STOP, hard gate, approval boundary, and no-mutation-before-approval rule.", @@ -2278,7 +2278,7 @@ "voice": "Direct builder voice; match the user language and retain source-specific tone constraints.", "response_posture": "Direct, evidence-first builder language; preserve source-specific recommendations and constructive pressure.", "new_location": "skills/qa/references/legacy/qa.md", - "parity_test": "evals/parity/contracts/qa.json + scripts/gstack2/run-parity.ts normalized full-body equality" + "parity_test": "evals/parity/contracts/qa.json + scripts/gstack2/run-parity.ts canonical specialist render, excluded-wrapper, lazy-section, and pinned-source provenance checks" }, { "source": "qa-only", @@ -2288,7 +2288,7 @@ "source_path": "qa-only/SKILL.md.tmpl", "base_sha": "bb57306d98c97011b0919c6132705a15b1579781", "blob_sha": "75c4123cc5c406ffdd36c71a094335c137135b1e", - "normalized_render_sha256": "90f138a7ded37476397e3399ed686a92f9317161ba6e2256d6c7ed7c2893e273", + "normalized_render_sha256": "e360ea826399287e00b030c9aa0bcda16e06ab004f5dcdb14db309bad0ccea25", "target": "skills/qa/references/legacy/qa-only.md", "disposition": "BUG_FIX", "overlays": [ @@ -2305,7 +2305,7 @@ "legacy_alias": "report" }, "question_sequence": "Preserve the source workflow order; gather prerequisites before consequential questions.", - "follow_up_behavior": "The complete source follow-up sequence is preserved verbatim inside new_location and hash-compared to the pinned base.", + "follow_up_behavior": "Specialist follow-up order is preserved from the pinned source. The retired 1.x shared onboarding wrapper is excluded, and carved specialist phases are package-local lazy references loaded at their original workflow point.", "smart_skip_rules": "Skip only when the source condition is false, and name every skipped module with evidence.", "pushback_rules": "Preserve the source forcing questions, recommendation pressure, and one-question-at-a-time cadence.", "stop_gates": "Preserve every STOP, hard gate, approval boundary, and no-mutation-before-approval rule.", @@ -2379,7 +2379,7 @@ "voice": "Direct builder voice; match the user language and retain source-specific tone constraints.", "response_posture": "Direct, evidence-first builder language; preserve source-specific recommendations and constructive pressure.", "new_location": "skills/qa/references/legacy/qa-only.md", - "parity_test": "evals/parity/contracts/qa-only.json + scripts/gstack2/run-parity.ts normalized full-body equality" + "parity_test": "evals/parity/contracts/qa-only.json + scripts/gstack2/run-parity.ts canonical specialist render, excluded-wrapper, lazy-section, and pinned-source provenance checks" }, { "source": "ios-qa", @@ -2389,7 +2389,7 @@ "source_path": "ios-qa/SKILL.md.tmpl", "base_sha": "bb57306d98c97011b0919c6132705a15b1579781", "blob_sha": "e93d2831a31df65ec8e4e8693919ef5bf148457f", - "normalized_render_sha256": "37b9baf014dcfa6ed3266ae3241dad17956a0b6b3f332dc44bdb728daa3c8f01", + "normalized_render_sha256": "a9353a4d837240f85c0e13144e66575f9e267926090cfc0f344a08b5fb09b98c", "target": "skills/qa/references/legacy/ios-qa.md", "disposition": "BUG_FIX", "overlays": [ @@ -2404,7 +2404,7 @@ "legacy_alias": "ios" }, "question_sequence": "Preserve the source workflow order; gather prerequisites before consequential questions.", - "follow_up_behavior": "The complete source follow-up sequence is preserved verbatim inside new_location and hash-compared to the pinned base.", + "follow_up_behavior": "Specialist follow-up order is preserved from the pinned source. The retired 1.x shared onboarding wrapper is excluded, and carved specialist phases are package-local lazy references loaded at their original workflow point.", "smart_skip_rules": "Skip only when the source condition is false, and name every skipped module with evidence.", "pushback_rules": "Preserve the source forcing questions, recommendation pressure, and one-question-at-a-time cadence.", "stop_gates": "Preserve every STOP, hard gate, approval boundary, and no-mutation-before-approval rule.", @@ -2456,7 +2456,7 @@ "voice": "Direct builder voice; match the user language and retain source-specific tone constraints.", "response_posture": "Direct, evidence-first builder language; preserve source-specific recommendations and constructive pressure.", "new_location": "skills/qa/references/legacy/ios-qa.md", - "parity_test": "evals/parity/contracts/ios-qa.json + scripts/gstack2/run-parity.ts normalized full-body equality" + "parity_test": "evals/parity/contracts/ios-qa.json + scripts/gstack2/run-parity.ts canonical specialist render, excluded-wrapper, lazy-section, and pinned-source provenance checks" }, { "source": "devex-review", @@ -2466,7 +2466,7 @@ "source_path": "devex-review/SKILL.md.tmpl", "base_sha": "bb57306d98c97011b0919c6132705a15b1579781", "blob_sha": "081d4f35bbdec0c6b3da8ae71615ec4d41a84551", - "normalized_render_sha256": "849895ef49f7c855bfa819620e94d41da9909eb5baf214719b004130ecd741d6", + "normalized_render_sha256": "9fbc11b3fe252c281581512d67f6915c72e34bb2fdc7bc795e3077ee0e48d34e", "target": "skills/qa/references/legacy/devex-review.md", "disposition": "BUG_FIX", "overlays": [ @@ -2482,7 +2482,7 @@ "legacy_alias": "dx" }, "question_sequence": "Preserve the source workflow order; gather prerequisites before consequential questions.", - "follow_up_behavior": "The complete source follow-up sequence is preserved verbatim inside new_location and hash-compared to the pinned base.", + "follow_up_behavior": "Specialist follow-up order is preserved from the pinned source. The retired 1.x shared onboarding wrapper is excluded, and carved specialist phases are package-local lazy references loaded at their original workflow point.", "smart_skip_rules": "Skip only when the source condition is false, and name every skipped module with evidence.", "pushback_rules": "Preserve the source forcing questions, recommendation pressure, and one-question-at-a-time cadence.", "stop_gates": "Preserve every STOP, hard gate, approval boundary, and no-mutation-before-approval rule.", @@ -2555,7 +2555,7 @@ "voice": "Direct builder voice; match the user language and retain source-specific tone constraints.", "response_posture": "Direct, evidence-first builder language; preserve source-specific recommendations and constructive pressure.", "new_location": "skills/qa/references/legacy/devex-review.md", - "parity_test": "evals/parity/contracts/devex-review.json + scripts/gstack2/run-parity.ts normalized full-body equality" + "parity_test": "evals/parity/contracts/devex-review.json + scripts/gstack2/run-parity.ts canonical specialist render, excluded-wrapper, lazy-section, and pinned-source provenance checks" }, { "source": "benchmark", @@ -2565,7 +2565,7 @@ "source_path": "benchmark/SKILL.md.tmpl", "base_sha": "bb57306d98c97011b0919c6132705a15b1579781", "blob_sha": "038f16f5fba4ae4e9eae922e3276bba8ef88149e", - "normalized_render_sha256": "c579dad9e78a12bf7547a6dd752daaa3299c66c55d8170290c075caa5d1fa660", + "normalized_render_sha256": "a4554b8b139ee95c9f25c2e747f9e2214b2f0db64401057529e5ec775be323cd", "target": "skills/qa/references/legacy/benchmark.md", "disposition": "BUG_FIX", "overlays": [ @@ -2580,7 +2580,7 @@ "legacy_alias": "performance" }, "question_sequence": "Preserve the source workflow order; gather prerequisites before consequential questions.", - "follow_up_behavior": "The complete source follow-up sequence is preserved verbatim inside new_location and hash-compared to the pinned base.", + "follow_up_behavior": "Specialist follow-up order is preserved from the pinned source. The retired 1.x shared onboarding wrapper is excluded, and carved specialist phases are package-local lazy references loaded at their original workflow point.", "smart_skip_rules": "Skip only when the source condition is false, and name every skipped module with evidence.", "pushback_rules": "Preserve the source forcing questions, recommendation pressure, and one-question-at-a-time cadence.", "stop_gates": "Preserve every STOP, hard gate, approval boundary, and no-mutation-before-approval rule.", @@ -2621,7 +2621,7 @@ "voice": "Direct builder voice; match the user language and retain source-specific tone constraints.", "response_posture": "Direct, evidence-first builder language; preserve source-specific recommendations and constructive pressure.", "new_location": "skills/qa/references/legacy/benchmark.md", - "parity_test": "evals/parity/contracts/benchmark.json + scripts/gstack2/run-parity.ts normalized full-body equality" + "parity_test": "evals/parity/contracts/benchmark.json + scripts/gstack2/run-parity.ts canonical specialist render, excluded-wrapper, lazy-section, and pinned-source provenance checks" }, { "source": "canary", @@ -2631,7 +2631,7 @@ "source_path": "canary/SKILL.md.tmpl", "base_sha": "bb57306d98c97011b0919c6132705a15b1579781", "blob_sha": "d1eb2950aba2fa2b09d90f13143492c60d46793c", - "normalized_render_sha256": "551c32a7bbbdc5dec6f88751e885869df9d1a26286df233cb78b51beb2e0987a", + "normalized_render_sha256": "329b61120f60893d023533cbc493389d1c7476819fb785422de0e7d34e0c2c0b", "target": "skills/qa/references/legacy/canary.md", "disposition": "BUG_FIX", "overlays": [ @@ -2647,7 +2647,7 @@ "legacy_alias": "canary" }, "question_sequence": "Preserve the source workflow order; gather prerequisites before consequential questions.", - "follow_up_behavior": "The complete source follow-up sequence is preserved verbatim inside new_location and hash-compared to the pinned base.", + "follow_up_behavior": "Specialist follow-up order is preserved from the pinned source. The retired 1.x shared onboarding wrapper is excluded, and carved specialist phases are package-local lazy references loaded at their original workflow point.", "smart_skip_rules": "Skip only when the source condition is false, and name every skipped module with evidence.", "pushback_rules": "Preserve the source forcing questions, recommendation pressure, and one-question-at-a-time cadence.", "stop_gates": "Preserve every STOP, hard gate, approval boundary, and no-mutation-before-approval rule.", @@ -2700,7 +2700,7 @@ "voice": "Direct builder voice; match the user language and retain source-specific tone constraints.", "response_posture": "Direct, evidence-first builder language; preserve source-specific recommendations and constructive pressure.", "new_location": "skills/qa/references/legacy/canary.md", - "parity_test": "evals/parity/contracts/canary.json + scripts/gstack2/run-parity.ts normalized full-body equality" + "parity_test": "evals/parity/contracts/canary.json + scripts/gstack2/run-parity.ts canonical specialist render, excluded-wrapper, lazy-section, and pinned-source provenance checks" }, { "source": "browse", @@ -2710,7 +2710,7 @@ "source_path": "browse/SKILL.md.tmpl", "base_sha": "bb57306d98c97011b0919c6132705a15b1579781", "blob_sha": "9a159e4c9820172c229e2174d4a62a8f9668ab93", - "normalized_render_sha256": "9d5a75a6e20d40bf2d275ca39375899bb6c51abd4e8ce1042e8db4450e891196", + "normalized_render_sha256": "b7fd526a00444003cad654abb15c2d17606cc5295f38533754e95108038d3467", "target": "skills/qa/references/legacy/browse.md", "disposition": "BUG_FIX", "overlays": [ @@ -2726,7 +2726,7 @@ "legacy_alias": "browser" }, "question_sequence": "Preserve the source workflow order; gather prerequisites before consequential questions.", - "follow_up_behavior": "The complete source follow-up sequence is preserved verbatim inside new_location and hash-compared to the pinned base.", + "follow_up_behavior": "Specialist follow-up order is preserved from the pinned source. The retired 1.x shared onboarding wrapper is excluded, and carved specialist phases are package-local lazy references loaded at their original workflow point.", "smart_skip_rules": "Skip only when the source condition is false, and name every skipped module with evidence.", "pushback_rules": "Preserve the source forcing questions, recommendation pressure, and one-question-at-a-time cadence.", "stop_gates": "Preserve every STOP, hard gate, approval boundary, and no-mutation-before-approval rule.", @@ -2788,7 +2788,7 @@ "voice": "Direct builder voice; match the user language and retain source-specific tone constraints.", "response_posture": "Direct, evidence-first builder language; preserve source-specific recommendations and constructive pressure.", "new_location": "skills/qa/references/legacy/browse.md", - "parity_test": "evals/parity/contracts/browse.json + scripts/gstack2/run-parity.ts normalized full-body equality" + "parity_test": "evals/parity/contracts/browse.json + scripts/gstack2/run-parity.ts canonical specialist render, excluded-wrapper, lazy-section, and pinned-source provenance checks" }, { "source": "open-gstack-browser", @@ -2798,7 +2798,7 @@ "source_path": "open-gstack-browser/SKILL.md.tmpl", "base_sha": "bb57306d98c97011b0919c6132705a15b1579781", "blob_sha": "ef91a527890a3ac3622cc7dc84bad1ff7b64443b", - "normalized_render_sha256": "54c16f55549393a6a2080c5d3f4c0055ce92ca63bdb3966965d96ec5cae3f405", + "normalized_render_sha256": "9e4a08db3e17badfc67703f7c5e66f80a7f05e0b96fad31fc48b8216964d7449", "target": "skills/qa/references/legacy/open-gstack-browser.md", "disposition": "BUG_FIX", "overlays": [ @@ -2813,7 +2813,7 @@ "legacy_alias": "browser-visible" }, "question_sequence": "Preserve the source workflow order; gather prerequisites before consequential questions.", - "follow_up_behavior": "The complete source follow-up sequence is preserved verbatim inside new_location and hash-compared to the pinned base.", + "follow_up_behavior": "Specialist follow-up order is preserved from the pinned source. The retired 1.x shared onboarding wrapper is excluded, and carved specialist phases are package-local lazy references loaded at their original workflow point.", "smart_skip_rules": "Skip only when the source condition is false, and name every skipped module with evidence.", "pushback_rules": "Preserve the source forcing questions, recommendation pressure, and one-question-at-a-time cadence.", "stop_gates": "Preserve every STOP, hard gate, approval boundary, and no-mutation-before-approval rule.", @@ -2863,7 +2863,7 @@ "voice": "Direct builder voice; match the user language and retain source-specific tone constraints.", "response_posture": "Direct, evidence-first builder language; preserve source-specific recommendations and constructive pressure.", "new_location": "skills/qa/references/legacy/open-gstack-browser.md", - "parity_test": "evals/parity/contracts/open-gstack-browser.json + scripts/gstack2/run-parity.ts normalized full-body equality" + "parity_test": "evals/parity/contracts/open-gstack-browser.json + scripts/gstack2/run-parity.ts canonical specialist render, excluded-wrapper, lazy-section, and pinned-source provenance checks" }, { "source": "setup-browser-cookies", @@ -2873,7 +2873,7 @@ "source_path": "setup-browser-cookies/SKILL.md.tmpl", "base_sha": "bb57306d98c97011b0919c6132705a15b1579781", "blob_sha": "f812d9f56f27c32fb5f102083bbe418344c1a652", - "normalized_render_sha256": "5e27829f87a537e233ac1d0b2fe96cfe21ad6263c70044d8672b1f14c83e7506", + "normalized_render_sha256": "8ab5dfb05136a637ce41067d9e50ade76c4a8b957587e4eab134eaa260b29ac3", "target": "skills/qa/references/legacy/setup-browser-cookies.md", "disposition": "BUG_FIX", "overlays": [ @@ -2888,7 +2888,7 @@ "legacy_alias": "browser-auth" }, "question_sequence": "Preserve the source workflow order; gather prerequisites before consequential questions.", - "follow_up_behavior": "The complete source follow-up sequence is preserved verbatim inside new_location and hash-compared to the pinned base.", + "follow_up_behavior": "Specialist follow-up order is preserved from the pinned source. The retired 1.x shared onboarding wrapper is excluded, and carved specialist phases are package-local lazy references loaded at their original workflow point.", "smart_skip_rules": "Skip only when the source condition is false, and name every skipped module with evidence.", "pushback_rules": "Preserve the source forcing questions, recommendation pressure, and one-question-at-a-time cadence.", "stop_gates": "Preserve every STOP, hard gate, approval boundary, and no-mutation-before-approval rule.", @@ -2924,7 +2924,7 @@ "voice": "Direct builder voice; match the user language and retain source-specific tone constraints.", "response_posture": "Direct, evidence-first builder language; preserve source-specific recommendations and constructive pressure.", "new_location": "skills/qa/references/legacy/setup-browser-cookies.md", - "parity_test": "evals/parity/contracts/setup-browser-cookies.json + scripts/gstack2/run-parity.ts normalized full-body equality" + "parity_test": "evals/parity/contracts/setup-browser-cookies.json + scripts/gstack2/run-parity.ts canonical specialist render, excluded-wrapper, lazy-section, and pinned-source provenance checks" }, { "source": "pair-agent", @@ -2934,7 +2934,7 @@ "source_path": "pair-agent/SKILL.md.tmpl", "base_sha": "bb57306d98c97011b0919c6132705a15b1579781", "blob_sha": "75ed42d590f99c46cd0883c37bb1f2f9f499211c", - "normalized_render_sha256": "27e34ef8e4157d94866d5f0c8ab9aff747483d86acd9702bf721cfb8962c07e5", + "normalized_render_sha256": "6882bc549c689ff50fb06d5e72a597939aa651926c50067330d1e6fd86cd6b58", "target": "skills/qa/references/legacy/pair-agent.md", "disposition": "BUG_FIX", "overlays": [ @@ -2949,7 +2949,7 @@ "legacy_alias": "browser-pair" }, "question_sequence": "Preserve the source workflow order; gather prerequisites before consequential questions.", - "follow_up_behavior": "The complete source follow-up sequence is preserved verbatim inside new_location and hash-compared to the pinned base.", + "follow_up_behavior": "Specialist follow-up order is preserved from the pinned source. The retired 1.x shared onboarding wrapper is excluded, and carved specialist phases are package-local lazy references loaded at their original workflow point.", "smart_skip_rules": "Skip only when the source condition is false, and name every skipped module with evidence.", "pushback_rules": "Preserve the source forcing questions, recommendation pressure, and one-question-at-a-time cadence.", "stop_gates": "Preserve every STOP, hard gate, approval boundary, and no-mutation-before-approval rule.", @@ -3007,7 +3007,7 @@ "voice": "Direct builder voice; match the user language and retain source-specific tone constraints.", "response_posture": "Direct, evidence-first builder language; preserve source-specific recommendations and constructive pressure.", "new_location": "skills/qa/references/legacy/pair-agent.md", - "parity_test": "evals/parity/contracts/pair-agent.json + scripts/gstack2/run-parity.ts normalized full-body equality" + "parity_test": "evals/parity/contracts/pair-agent.json + scripts/gstack2/run-parity.ts canonical specialist render, excluded-wrapper, lazy-section, and pinned-source provenance checks" }, { "source": "scrape", @@ -3017,7 +3017,7 @@ "source_path": "scrape/SKILL.md.tmpl", "base_sha": "bb57306d98c97011b0919c6132705a15b1579781", "blob_sha": "4cb4f17c074edcdce0bc8d133f19a6a739964851", - "normalized_render_sha256": "bc7d6ed483f239a45d137ca790c23f3c3add4aaab028ca4950e83e25936ebc79", + "normalized_render_sha256": "03ef708a4c9a1f3de961c48767617502c564690faa7240b3ca39b20496a17f98", "target": "skills/qa/references/legacy/scrape.md", "disposition": "BUG_FIX", "overlays": [ @@ -3033,7 +3033,7 @@ "legacy_alias": "scrape" }, "question_sequence": "Preserve the source workflow order; gather prerequisites before consequential questions.", - "follow_up_behavior": "The complete source follow-up sequence is preserved verbatim inside new_location and hash-compared to the pinned base.", + "follow_up_behavior": "Specialist follow-up order is preserved from the pinned source. The retired 1.x shared onboarding wrapper is excluded, and carved specialist phases are package-local lazy references loaded at their original workflow point.", "smart_skip_rules": "Skip only when the source condition is false, and name every skipped module with evidence.", "pushback_rules": "Preserve the source forcing questions, recommendation pressure, and one-question-at-a-time cadence.", "stop_gates": "Preserve every STOP, hard gate, approval boundary, and no-mutation-before-approval rule.", @@ -3084,7 +3084,7 @@ "voice": "Direct builder voice; match the user language and retain source-specific tone constraints.", "response_posture": "Direct, evidence-first builder language; preserve source-specific recommendations and constructive pressure.", "new_location": "skills/qa/references/legacy/scrape.md", - "parity_test": "evals/parity/contracts/scrape.json + scripts/gstack2/run-parity.ts normalized full-body equality" + "parity_test": "evals/parity/contracts/scrape.json + scripts/gstack2/run-parity.ts canonical specialist render, excluded-wrapper, lazy-section, and pinned-source provenance checks" }, { "source": "skillify", @@ -3094,7 +3094,7 @@ "source_path": "skillify/SKILL.md.tmpl", "base_sha": "bb57306d98c97011b0919c6132705a15b1579781", "blob_sha": "21fb2f503e3d40683fa782b21abf05a8f0fef69b", - "normalized_render_sha256": "13920affe83c53e5d459a077b68433682fd6c445389bf2024d2e5f4d5a021994", + "normalized_render_sha256": "b0743c957157e19bd90b457fd3ac9d6924c3aedce969c10af8d7973c2bcd6c9f", "target": "skills/qa/references/legacy/skillify.md", "disposition": "BUG_FIX", "overlays": [ @@ -3110,7 +3110,7 @@ "legacy_alias": "skillify" }, "question_sequence": "Preserve the source workflow order; gather prerequisites before consequential questions.", - "follow_up_behavior": "The complete source follow-up sequence is preserved verbatim inside new_location and hash-compared to the pinned base.", + "follow_up_behavior": "Specialist follow-up order is preserved from the pinned source. The retired 1.x shared onboarding wrapper is excluded, and carved specialist phases are package-local lazy references loaded at their original workflow point.", "smart_skip_rules": "Skip only when the source condition is false, and name every skipped module with evidence.", "pushback_rules": "Preserve the source forcing questions, recommendation pressure, and one-question-at-a-time cadence.", "stop_gates": "Preserve every STOP, hard gate, approval boundary, and no-mutation-before-approval rule.", @@ -3167,7 +3167,7 @@ "voice": "Direct builder voice; match the user language and retain source-specific tone constraints.", "response_posture": "Direct, evidence-first builder language; preserve source-specific recommendations and constructive pressure.", "new_location": "skills/qa/references/legacy/skillify.md", - "parity_test": "evals/parity/contracts/skillify.json + scripts/gstack2/run-parity.ts normalized full-body equality" + "parity_test": "evals/parity/contracts/skillify.json + scripts/gstack2/run-parity.ts canonical specialist render, excluded-wrapper, lazy-section, and pinned-source provenance checks" }, { "source": "benchmark-models", @@ -3177,7 +3177,7 @@ "source_path": "benchmark-models/SKILL.md.tmpl", "base_sha": "bb57306d98c97011b0919c6132705a15b1579781", "blob_sha": "034cda182406dc04a82c4336ac3ebc36b5fc41b1", - "normalized_render_sha256": "d67d1f22c7f65c286a905ec60143d057e3b8b29a548ac53a88272b886ef26b31", + "normalized_render_sha256": "2ef0679d45f21bacc09cd774ff96bb3b82853a8e89d8606847c4f9416a47a48b", "target": "skills/qa/references/legacy/benchmark-models.md", "disposition": "BUG_FIX", "overlays": [ @@ -3192,7 +3192,7 @@ "legacy_alias": "model-benchmark" }, "question_sequence": "Preserve the source workflow order; gather prerequisites before consequential questions.", - "follow_up_behavior": "The complete source follow-up sequence is preserved verbatim inside new_location and hash-compared to the pinned base.", + "follow_up_behavior": "Specialist follow-up order is preserved from the pinned source. The retired 1.x shared onboarding wrapper is excluded, and carved specialist phases are package-local lazy references loaded at their original workflow point.", "smart_skip_rules": "Skip only when the source condition is false, and name every skipped module with evidence.", "pushback_rules": "Preserve the source forcing questions, recommendation pressure, and one-question-at-a-time cadence.", "stop_gates": "Preserve every STOP, hard gate, approval boundary, and no-mutation-before-approval rule.", @@ -3227,7 +3227,7 @@ "voice": "Direct builder voice; match the user language and retain source-specific tone constraints.", "response_posture": "Direct, evidence-first builder language; preserve source-specific recommendations and constructive pressure.", "new_location": "skills/qa/references/legacy/benchmark-models.md", - "parity_test": "evals/parity/contracts/benchmark-models.json + scripts/gstack2/run-parity.ts normalized full-body equality" + "parity_test": "evals/parity/contracts/benchmark-models.json + scripts/gstack2/run-parity.ts canonical specialist render, excluded-wrapper, lazy-section, and pinned-source provenance checks" }, { "source": "investigate", @@ -3237,7 +3237,7 @@ "source_path": "investigate/SKILL.md.tmpl", "base_sha": "bb57306d98c97011b0919c6132705a15b1579781", "blob_sha": "67e254d743ffb9060f48e3f6d4b715c077ee688d", - "normalized_render_sha256": "23e220a2d61b665f9e48b094855336fac3ca9187be12675cb721db2bc27f7c30", + "normalized_render_sha256": "91f19c8d736a9a6077941f63f52853634325059e5ac4d8808c4ba6dbceca1a30", "target": "skills/debug/references/legacy/investigate.md", "disposition": "BUG_FIX", "overlays": [ @@ -3254,7 +3254,7 @@ "legacy_alias": "investigate" }, "question_sequence": "Preserve the source workflow order; gather prerequisites before consequential questions.", - "follow_up_behavior": "The complete source follow-up sequence is preserved verbatim inside new_location and hash-compared to the pinned base.", + "follow_up_behavior": "Specialist follow-up order is preserved from the pinned source. The retired 1.x shared onboarding wrapper is excluded, and carved specialist phases are package-local lazy references loaded at their original workflow point.", "smart_skip_rules": "Skip only when the source condition is false, and name every skipped module with evidence.", "pushback_rules": "Preserve the source forcing questions, recommendation pressure, and one-question-at-a-time cadence.", "stop_gates": "Preserve every STOP, hard gate, approval boundary, and no-mutation-before-approval rule.", @@ -3305,7 +3305,7 @@ "voice": "Direct builder voice; match the user language and retain source-specific tone constraints.", "response_posture": "Direct, evidence-first builder language; preserve source-specific recommendations and constructive pressure.", "new_location": "skills/debug/references/legacy/investigate.md", - "parity_test": "evals/parity/contracts/investigate.json + scripts/gstack2/run-parity.ts normalized full-body equality" + "parity_test": "evals/parity/contracts/investigate.json + scripts/gstack2/run-parity.ts canonical specialist render, excluded-wrapper, lazy-section, and pinned-source provenance checks" }, { "source": "ios-fix", @@ -3315,7 +3315,7 @@ "source_path": "ios-fix/SKILL.md.tmpl", "base_sha": "bb57306d98c97011b0919c6132705a15b1579781", "blob_sha": "94655e282f535b846eada11143e95df58d29263b", - "normalized_render_sha256": "1a94ad8852821684d4806b10c5464f7adef80cb28817800f1e88dfe808f0a26d", + "normalized_render_sha256": "cc38b71471c1fefc015419e768c5b40f060f03b232cbad850cd7d9c985a6cc90", "target": "skills/debug/references/legacy/ios-fix.md", "disposition": "BUG_FIX", "overlays": [ @@ -3330,7 +3330,7 @@ "legacy_alias": "ios-fix" }, "question_sequence": "Preserve the source workflow order; gather prerequisites before consequential questions.", - "follow_up_behavior": "The complete source follow-up sequence is preserved verbatim inside new_location and hash-compared to the pinned base.", + "follow_up_behavior": "Specialist follow-up order is preserved from the pinned source. The retired 1.x shared onboarding wrapper is excluded, and carved specialist phases are package-local lazy references loaded at their original workflow point.", "smart_skip_rules": "Skip only when the source condition is false, and name every skipped module with evidence.", "pushback_rules": "Preserve the source forcing questions, recommendation pressure, and one-question-at-a-time cadence.", "stop_gates": "Preserve every STOP, hard gate, approval boundary, and no-mutation-before-approval rule.", @@ -3379,7 +3379,7 @@ "voice": "Direct builder voice; match the user language and retain source-specific tone constraints.", "response_posture": "Direct, evidence-first builder language; preserve source-specific recommendations and constructive pressure.", "new_location": "skills/debug/references/legacy/ios-fix.md", - "parity_test": "evals/parity/contracts/ios-fix.json + scripts/gstack2/run-parity.ts normalized full-body equality" + "parity_test": "evals/parity/contracts/ios-fix.json + scripts/gstack2/run-parity.ts canonical specialist render, excluded-wrapper, lazy-section, and pinned-source provenance checks" }, { "source": "careful", @@ -3389,7 +3389,7 @@ "source_path": "careful/SKILL.md.tmpl", "base_sha": "bb57306d98c97011b0919c6132705a15b1579781", "blob_sha": "5c128a00e180bec4fad281486d3ca8c02dc67e7e", - "normalized_render_sha256": "9c806d1102794aeab5c83990c72dcadc7bdad7134f3962da5609ab13bc7feb0f", + "normalized_render_sha256": "f5fe3aa0755e04ad328ed67a4e42c21d9f9b5509167a69d91158a59cce8111ea", "target": "skills/debug/references/legacy/careful.md", "disposition": "BUG_FIX", "overlays": [ @@ -3404,7 +3404,7 @@ "legacy_alias": "careful" }, "question_sequence": "Preserve the source workflow order; gather prerequisites before consequential questions.", - "follow_up_behavior": "The complete source follow-up sequence is preserved verbatim inside new_location and hash-compared to the pinned base.", + "follow_up_behavior": "Specialist follow-up order is preserved from the pinned source. The retired 1.x shared onboarding wrapper is excluded, and carved specialist phases are package-local lazy references loaded at their original workflow point.", "smart_skip_rules": "Skip only when the source condition is false, and name every skipped module with evidence.", "pushback_rules": "Preserve the source forcing questions, recommendation pressure, and one-question-at-a-time cadence.", "stop_gates": "Preserve every STOP, hard gate, approval boundary, and no-mutation-before-approval rule.", @@ -3423,7 +3423,7 @@ "voice": "Direct builder voice; match the user language and retain source-specific tone constraints.", "response_posture": "Direct, evidence-first builder language; preserve source-specific recommendations and constructive pressure.", "new_location": "skills/debug/references/legacy/careful.md", - "parity_test": "evals/parity/contracts/careful.json + scripts/gstack2/run-parity.ts normalized full-body equality" + "parity_test": "evals/parity/contracts/careful.json + scripts/gstack2/run-parity.ts canonical specialist render, excluded-wrapper, lazy-section, and pinned-source provenance checks" }, { "source": "freeze", @@ -3433,7 +3433,7 @@ "source_path": "freeze/SKILL.md.tmpl", "base_sha": "bb57306d98c97011b0919c6132705a15b1579781", "blob_sha": "c0b31aa7f9f216fc5a351d91f4bcff68c828d090", - "normalized_render_sha256": "8beec3080fd0d6566b6ecf188d110d7283fb808fbc7c7201ee234191f9d3c5cd", + "normalized_render_sha256": "433bb7c1909852c83978ae282c582590c5136abe56020e7d0be39749822c345b", "target": "skills/debug/references/legacy/freeze.md", "disposition": "BUG_FIX", "overlays": [ @@ -3448,7 +3448,7 @@ "legacy_alias": "freeze" }, "question_sequence": "Preserve the source workflow order; gather prerequisites before consequential questions.", - "follow_up_behavior": "The complete source follow-up sequence is preserved verbatim inside new_location and hash-compared to the pinned base.", + "follow_up_behavior": "Specialist follow-up order is preserved from the pinned source. The retired 1.x shared onboarding wrapper is excluded, and carved specialist phases are package-local lazy references loaded at their original workflow point.", "smart_skip_rules": "Skip only when the source condition is false, and name every skipped module with evidence.", "pushback_rules": "Preserve the source forcing questions, recommendation pressure, and one-question-at-a-time cadence.", "stop_gates": "Preserve every STOP, hard gate, approval boundary, and no-mutation-before-approval rule.", @@ -3467,7 +3467,7 @@ "voice": "Direct builder voice; match the user language and retain source-specific tone constraints.", "response_posture": "Direct, evidence-first builder language; preserve source-specific recommendations and constructive pressure.", "new_location": "skills/debug/references/legacy/freeze.md", - "parity_test": "evals/parity/contracts/freeze.json + scripts/gstack2/run-parity.ts normalized full-body equality" + "parity_test": "evals/parity/contracts/freeze.json + scripts/gstack2/run-parity.ts canonical specialist render, excluded-wrapper, lazy-section, and pinned-source provenance checks" }, { "source": "guard", @@ -3477,7 +3477,7 @@ "source_path": "guard/SKILL.md.tmpl", "base_sha": "bb57306d98c97011b0919c6132705a15b1579781", "blob_sha": "3d34ee0c181ec7b263bf6092ba8f384619c5efb6", - "normalized_render_sha256": "2040b2d9c7e587f254296abb394c655da37fe25305f4e44dc2d736053595cdfb", + "normalized_render_sha256": "ff8170babcc9ad20f6de292db838d2c4545f0ed98dddd184ab5e7c52c073dc7e", "target": "skills/debug/references/legacy/guard.md", "disposition": "BUG_FIX", "overlays": [ @@ -3492,7 +3492,7 @@ "legacy_alias": "guard" }, "question_sequence": "Preserve the source workflow order; gather prerequisites before consequential questions.", - "follow_up_behavior": "The complete source follow-up sequence is preserved verbatim inside new_location and hash-compared to the pinned base.", + "follow_up_behavior": "Specialist follow-up order is preserved from the pinned source. The retired 1.x shared onboarding wrapper is excluded, and carved specialist phases are package-local lazy references loaded at their original workflow point.", "smart_skip_rules": "Skip only when the source condition is false, and name every skipped module with evidence.", "pushback_rules": "Preserve the source forcing questions, recommendation pressure, and one-question-at-a-time cadence.", "stop_gates": "Preserve every STOP, hard gate, approval boundary, and no-mutation-before-approval rule.", @@ -3510,7 +3510,7 @@ "voice": "Direct builder voice; match the user language and retain source-specific tone constraints.", "response_posture": "Direct, evidence-first builder language; preserve source-specific recommendations and constructive pressure.", "new_location": "skills/debug/references/legacy/guard.md", - "parity_test": "evals/parity/contracts/guard.json + scripts/gstack2/run-parity.ts normalized full-body equality" + "parity_test": "evals/parity/contracts/guard.json + scripts/gstack2/run-parity.ts canonical specialist render, excluded-wrapper, lazy-section, and pinned-source provenance checks" }, { "source": "unfreeze", @@ -3520,7 +3520,7 @@ "source_path": "unfreeze/SKILL.md.tmpl", "base_sha": "bb57306d98c97011b0919c6132705a15b1579781", "blob_sha": "88e413fe5a49a45d46d8867b2d80ace30b3b45aa", - "normalized_render_sha256": "9128912f4c79a423d4e52a7a27a9c560bf7ab58e85bcf32db1442f4ded6576ae", + "normalized_render_sha256": "51d6183901e866697382b7e900e2154e8bfb6a9ebf4f3e1bb3ad29925fad0e20", "target": "skills/debug/references/legacy/unfreeze.md", "disposition": "BUG_FIX", "overlays": [ @@ -3535,7 +3535,7 @@ "legacy_alias": "unfreeze" }, "question_sequence": "Preserve the source workflow order; gather prerequisites before consequential questions.", - "follow_up_behavior": "The complete source follow-up sequence is preserved verbatim inside new_location and hash-compared to the pinned base.", + "follow_up_behavior": "Specialist follow-up order is preserved from the pinned source. The retired 1.x shared onboarding wrapper is excluded, and carved specialist phases are package-local lazy references loaded at their original workflow point.", "smart_skip_rules": "Skip only when the source condition is false, and name every skipped module with evidence.", "pushback_rules": "Preserve the source forcing questions, recommendation pressure, and one-question-at-a-time cadence.", "stop_gates": "Preserve every STOP, hard gate, approval boundary, and no-mutation-before-approval rule.", @@ -3552,7 +3552,7 @@ "voice": "Direct builder voice; match the user language and retain source-specific tone constraints.", "response_posture": "Direct, evidence-first builder language; preserve source-specific recommendations and constructive pressure.", "new_location": "skills/debug/references/legacy/unfreeze.md", - "parity_test": "evals/parity/contracts/unfreeze.json + scripts/gstack2/run-parity.ts normalized full-body equality" + "parity_test": "evals/parity/contracts/unfreeze.json + scripts/gstack2/run-parity.ts canonical specialist render, excluded-wrapper, lazy-section, and pinned-source provenance checks" }, { "source": "review", @@ -3562,7 +3562,7 @@ "source_path": "review/SKILL.md.tmpl", "base_sha": "bb57306d98c97011b0919c6132705a15b1579781", "blob_sha": "ba1ea88068de4b09cf717eb4ae42aa247d198314", - "normalized_render_sha256": "25e07cb6ea0831bd9e7bd7d4606714ba38b743107a970f2b6491a246b90c7dd4", + "normalized_render_sha256": "9d6398fe0d2900fcce8ae1eb0b390e21f05c94d6ae3a4e21c911025cdc1fd963", "target": "skills/review/references/legacy/review.md", "disposition": "BUG_FIX", "overlays": [ @@ -3581,7 +3581,7 @@ "legacy_alias": "diff" }, "question_sequence": "Preserve the source workflow order; gather prerequisites before consequential questions.", - "follow_up_behavior": "The complete source follow-up sequence is preserved verbatim inside new_location and hash-compared to the pinned base.", + "follow_up_behavior": "Specialist follow-up order is preserved from the pinned source. The retired 1.x shared onboarding wrapper is excluded, and carved specialist phases are package-local lazy references loaded at their original workflow point.", "smart_skip_rules": "Skip only when the source condition is false, and name every skipped module with evidence.", "pushback_rules": "Preserve the source forcing questions, recommendation pressure, and one-question-at-a-time cadence.", "stop_gates": "Preserve every STOP, hard gate, approval boundary, and no-mutation-before-approval rule.", @@ -3657,7 +3657,7 @@ "voice": "Direct builder voice; match the user language and retain source-specific tone constraints.", "response_posture": "Direct, evidence-first builder language; preserve source-specific recommendations and constructive pressure.", "new_location": "skills/review/references/legacy/review.md", - "parity_test": "evals/parity/contracts/review.json + scripts/gstack2/run-parity.ts normalized full-body equality" + "parity_test": "evals/parity/contracts/review.json + scripts/gstack2/run-parity.ts canonical specialist render, excluded-wrapper, lazy-section, and pinned-source provenance checks" }, { "source": "cso", @@ -3667,7 +3667,7 @@ "source_path": "cso/SKILL.md.tmpl", "base_sha": "bb57306d98c97011b0919c6132705a15b1579781", "blob_sha": "413fb099597b55dadca116e45a202aa693a94b74", - "normalized_render_sha256": "59017ba27aaa93a62bda7ddca3c995f7231edb3fa86009e555b724b43fc1afd7", + "normalized_render_sha256": "2cecaf39e950a0ec848f85c11f9678b6a7644c0251c07be42cd52d4b2e6b61a6", "target": "skills/review/references/legacy/cso.md", "disposition": "BUG_FIX", "overlays": [ @@ -3683,7 +3683,7 @@ "legacy_alias": "security" }, "question_sequence": "Preserve the source workflow order; gather prerequisites before consequential questions.", - "follow_up_behavior": "The complete source follow-up sequence is preserved verbatim inside new_location and hash-compared to the pinned base.", + "follow_up_behavior": "Specialist follow-up order is preserved from the pinned source. The retired 1.x shared onboarding wrapper is excluded, and carved specialist phases are package-local lazy references loaded at their original workflow point.", "smart_skip_rules": "Skip only when the source condition is false, and name every skipped module with evidence.", "pushback_rules": "Preserve the source forcing questions, recommendation pressure, and one-question-at-a-time cadence.", "stop_gates": "Preserve every STOP, hard gate, approval boundary, and no-mutation-before-approval rule.", @@ -3759,7 +3759,7 @@ "voice": "Direct builder voice; match the user language and retain source-specific tone constraints.", "response_posture": "Direct, evidence-first builder language; preserve source-specific recommendations and constructive pressure.", "new_location": "skills/review/references/legacy/cso.md", - "parity_test": "evals/parity/contracts/cso.json + scripts/gstack2/run-parity.ts normalized full-body equality" + "parity_test": "evals/parity/contracts/cso.json + scripts/gstack2/run-parity.ts canonical specialist render, excluded-wrapper, lazy-section, and pinned-source provenance checks" }, { "source": "health", @@ -3769,7 +3769,7 @@ "source_path": "health/SKILL.md.tmpl", "base_sha": "bb57306d98c97011b0919c6132705a15b1579781", "blob_sha": "f92eb7347ec4f77dd8dbf464d63fcdf6a3459908", - "normalized_render_sha256": "3e478e5673d54ce0e227e589ab0800bd14de65cb8df4e12661e330b57018465c", + "normalized_render_sha256": "ff664221e7de57e66c1b45d719982d90f38e0288914b34731ba4dd73541347e8", "target": "skills/review/references/legacy/health.md", "disposition": "BUG_FIX", "overlays": [ @@ -3784,7 +3784,7 @@ "legacy_alias": "health" }, "question_sequence": "Preserve the source workflow order; gather prerequisites before consequential questions.", - "follow_up_behavior": "The complete source follow-up sequence is preserved verbatim inside new_location and hash-compared to the pinned base.", + "follow_up_behavior": "Specialist follow-up order is preserved from the pinned source. The retired 1.x shared onboarding wrapper is excluded, and carved specialist phases are package-local lazy references loaded at their original workflow point.", "smart_skip_rules": "Skip only when the source condition is false, and name every skipped module with evidence.", "pushback_rules": "Preserve the source forcing questions, recommendation pressure, and one-question-at-a-time cadence.", "stop_gates": "Preserve every STOP, hard gate, approval boundary, and no-mutation-before-approval rule.", @@ -3832,7 +3832,7 @@ "voice": "Direct builder voice; match the user language and retain source-specific tone constraints.", "response_posture": "Direct, evidence-first builder language; preserve source-specific recommendations and constructive pressure.", "new_location": "skills/review/references/legacy/health.md", - "parity_test": "evals/parity/contracts/health.json + scripts/gstack2/run-parity.ts normalized full-body equality" + "parity_test": "evals/parity/contracts/health.json + scripts/gstack2/run-parity.ts canonical specialist render, excluded-wrapper, lazy-section, and pinned-source provenance checks" }, { "source": "codex", @@ -3842,7 +3842,7 @@ "source_path": "codex/SKILL.md.tmpl", "base_sha": "bb57306d98c97011b0919c6132705a15b1579781", "blob_sha": "333de7d8d590cc78184b0e2371171f6121408f73", - "normalized_render_sha256": "5621d3e33242350806eb3489b5c933c5ebaa5105f250e941c4205962c447b28d", + "normalized_render_sha256": "0df6ff685d230f87763b4c43f957e20854fe1319d78247d683e5250e2accb188", "target": "skills/review/references/legacy/codex.md", "disposition": "BUG_FIX", "overlays": [ @@ -3857,7 +3857,7 @@ "legacy_alias": "outside-codex" }, "question_sequence": "Preserve the source workflow order; gather prerequisites before consequential questions.", - "follow_up_behavior": "The complete source follow-up sequence is preserved verbatim inside new_location and hash-compared to the pinned base.", + "follow_up_behavior": "Specialist follow-up order is preserved from the pinned source. The retired 1.x shared onboarding wrapper is excluded, and carved specialist phases are package-local lazy references loaded at their original workflow point.", "smart_skip_rules": "Skip only when the source condition is false, and name every skipped module with evidence.", "pushback_rules": "Preserve the source forcing questions, recommendation pressure, and one-question-at-a-time cadence.", "stop_gates": "Preserve every STOP, hard gate, approval boundary, and no-mutation-before-approval rule.", @@ -3914,7 +3914,7 @@ "voice": "Direct builder voice; match the user language and retain source-specific tone constraints.", "response_posture": "Direct, evidence-first builder language; preserve source-specific recommendations and constructive pressure.", "new_location": "skills/review/references/legacy/codex.md", - "parity_test": "evals/parity/contracts/codex.json + scripts/gstack2/run-parity.ts normalized full-body equality" + "parity_test": "evals/parity/contracts/codex.json + scripts/gstack2/run-parity.ts canonical specialist render, excluded-wrapper, lazy-section, and pinned-source provenance checks" }, { "source": "claude", @@ -3924,7 +3924,7 @@ "source_path": "claude/SKILL.md.tmpl", "base_sha": "bb57306d98c97011b0919c6132705a15b1579781", "blob_sha": "94552cbe4efebc908f70f03880e584879db80aca", - "normalized_render_sha256": "f8b5964bf630d0716ad5cfd729f6d4e62bb89d4eab64a210090fb0e875f0b59d", + "normalized_render_sha256": "e0257ec3df4432da9b0fb10e6af66da8ed15548a3fae987778fc14a6747f4b30", "target": "skills/review/references/legacy/claude.md", "disposition": "BUG_FIX", "overlays": [ @@ -3939,7 +3939,7 @@ "legacy_alias": "outside-claude" }, "question_sequence": "Preserve the source workflow order; gather prerequisites before consequential questions.", - "follow_up_behavior": "The complete source follow-up sequence is preserved verbatim inside new_location and hash-compared to the pinned base.", + "follow_up_behavior": "Specialist follow-up order is preserved from the pinned source. The retired 1.x shared onboarding wrapper is excluded, and carved specialist phases are package-local lazy references loaded at their original workflow point.", "smart_skip_rules": "Skip only when the source condition is false, and name every skipped module with evidence.", "pushback_rules": "Preserve the source forcing questions, recommendation pressure, and one-question-at-a-time cadence.", "stop_gates": "Preserve every STOP, hard gate, approval boundary, and no-mutation-before-approval rule.", @@ -3991,7 +3991,7 @@ "voice": "Direct builder voice; match the user language and retain source-specific tone constraints.", "response_posture": "Direct, evidence-first builder language; preserve source-specific recommendations and constructive pressure.", "new_location": "skills/review/references/legacy/claude.md", - "parity_test": "evals/parity/contracts/claude.json + scripts/gstack2/run-parity.ts normalized full-body equality" + "parity_test": "evals/parity/contracts/claude.json + scripts/gstack2/run-parity.ts canonical specialist render, excluded-wrapper, lazy-section, and pinned-source provenance checks" }, { "source": "ship", @@ -4001,7 +4001,7 @@ "source_path": "ship/SKILL.md.tmpl", "base_sha": "bb57306d98c97011b0919c6132705a15b1579781", "blob_sha": "068ac4fe54bcb46572295d48263b11bd38fcde18", - "normalized_render_sha256": "b2f1d5bc59ec1a35fb367cc242131dc288ca1c9cf1baa8cefe9165b45f9841bc", + "normalized_render_sha256": "ab7a7219653b0fc5cdad0bb2959394798bc50ae4db4dc24b76c0454dd1b1397a", "target": "skills/ship/references/legacy/ship.md", "disposition": "BUG_FIX", "overlays": [ @@ -4019,7 +4019,7 @@ "legacy_alias": "ship" }, "question_sequence": "Preserve the source workflow order; gather prerequisites before consequential questions.", - "follow_up_behavior": "The complete source follow-up sequence is preserved verbatim inside new_location and hash-compared to the pinned base.", + "follow_up_behavior": "Specialist follow-up order is preserved from the pinned source. The retired 1.x shared onboarding wrapper is excluded, and carved specialist phases are package-local lazy references loaded at their original workflow point.", "smart_skip_rules": "Skip only when the source condition is false, and name every skipped module with evidence.", "pushback_rules": "Preserve the source forcing questions, recommendation pressure, and one-question-at-a-time cadence.", "stop_gates": "Preserve every STOP, hard gate, approval boundary, and no-mutation-before-approval rule.", @@ -4126,7 +4126,7 @@ "voice": "Direct builder voice; match the user language and retain source-specific tone constraints.", "response_posture": "Direct, evidence-first builder language; preserve source-specific recommendations and constructive pressure.", "new_location": "skills/ship/references/legacy/ship.md", - "parity_test": "evals/parity/contracts/ship.json + scripts/gstack2/run-parity.ts normalized full-body equality" + "parity_test": "evals/parity/contracts/ship.json + scripts/gstack2/run-parity.ts canonical specialist render, excluded-wrapper, lazy-section, and pinned-source provenance checks" }, { "source": "land-and-deploy", @@ -4136,7 +4136,7 @@ "source_path": "land-and-deploy/SKILL.md.tmpl", "base_sha": "bb57306d98c97011b0919c6132705a15b1579781", "blob_sha": "98976ad020d541d251cc7e34802a13458ddc88e2", - "normalized_render_sha256": "d17a1d9f397b57f59c5cced24c07c35e3950050612dba9c36bb68c4997f03a2f", + "normalized_render_sha256": "3fab0678a9a7a76664330c74db2bd25b56c335ac72ce4e691c2f2564a7ede819", "target": "skills/ship/references/legacy/land-and-deploy.md", "disposition": "BUG_FIX", "overlays": [ @@ -4152,7 +4152,7 @@ "legacy_alias": "land" }, "question_sequence": "Preserve the source workflow order; gather prerequisites before consequential questions.", - "follow_up_behavior": "The complete source follow-up sequence is preserved verbatim inside new_location and hash-compared to the pinned base.", + "follow_up_behavior": "Specialist follow-up order is preserved from the pinned source. The retired 1.x shared onboarding wrapper is excluded, and carved specialist phases are package-local lazy references loaded at their original workflow point.", "smart_skip_rules": "Skip only when the source condition is false, and name every skipped module with evidence.", "pushback_rules": "Preserve the source forcing questions, recommendation pressure, and one-question-at-a-time cadence.", "stop_gates": "Preserve every STOP, hard gate, approval boundary, and no-mutation-before-approval rule.", @@ -4234,7 +4234,7 @@ "voice": "Direct builder voice; match the user language and retain source-specific tone constraints.", "response_posture": "Direct, evidence-first builder language; preserve source-specific recommendations and constructive pressure.", "new_location": "skills/ship/references/legacy/land-and-deploy.md", - "parity_test": "evals/parity/contracts/land-and-deploy.json + scripts/gstack2/run-parity.ts normalized full-body equality" + "parity_test": "evals/parity/contracts/land-and-deploy.json + scripts/gstack2/run-parity.ts canonical specialist render, excluded-wrapper, lazy-section, and pinned-source provenance checks" }, { "source": "landing-report", @@ -4244,7 +4244,7 @@ "source_path": "landing-report/SKILL.md.tmpl", "base_sha": "bb57306d98c97011b0919c6132705a15b1579781", "blob_sha": "32a8cc1ab036b1ff8692f0400b68d8b56224a251", - "normalized_render_sha256": "64c9e05978be3c8d900dc9b9b4dd77e495776718d77e7b926ff6c5250b825a01", + "normalized_render_sha256": "4f9512bafcfd995c4c35cdff869ed60f8a9a9ef12f20bc18bf7b898cbd2faa53", "target": "skills/ship/references/legacy/landing-report.md", "disposition": "BUG_FIX", "overlays": [ @@ -4259,7 +4259,7 @@ "legacy_alias": "queue" }, "question_sequence": "Preserve the source workflow order; gather prerequisites before consequential questions.", - "follow_up_behavior": "The complete source follow-up sequence is preserved verbatim inside new_location and hash-compared to the pinned base.", + "follow_up_behavior": "Specialist follow-up order is preserved from the pinned source. The retired 1.x shared onboarding wrapper is excluded, and carved specialist phases are package-local lazy references loaded at their original workflow point.", "smart_skip_rules": "Skip only when the source condition is false, and name every skipped module with evidence.", "pushback_rules": "Preserve the source forcing questions, recommendation pressure, and one-question-at-a-time cadence.", "stop_gates": "Preserve every STOP, hard gate, approval boundary, and no-mutation-before-approval rule.", @@ -4308,7 +4308,7 @@ "voice": "Direct builder voice; match the user language and retain source-specific tone constraints.", "response_posture": "Direct, evidence-first builder language; preserve source-specific recommendations and constructive pressure.", "new_location": "skills/ship/references/legacy/landing-report.md", - "parity_test": "evals/parity/contracts/landing-report.json + scripts/gstack2/run-parity.ts normalized full-body equality" + "parity_test": "evals/parity/contracts/landing-report.json + scripts/gstack2/run-parity.ts canonical specialist render, excluded-wrapper, lazy-section, and pinned-source provenance checks" }, { "source": "document-release", @@ -4318,7 +4318,7 @@ "source_path": "document-release/SKILL.md.tmpl", "base_sha": "bb57306d98c97011b0919c6132705a15b1579781", "blob_sha": "7621cb31290217b5c7cc8fb000e910b3dd38128f", - "normalized_render_sha256": "369c595ec2fac76f441d008401929295898e98a5c521d176bafbe4af0e6054f9", + "normalized_render_sha256": "e5aa85ac93b36b638d075d152f9d7108c0108727056f61331b25fe33de569a59", "target": "skills/ship/references/legacy/document-release.md", "disposition": "BUG_FIX", "overlays": [ @@ -4333,7 +4333,7 @@ "legacy_alias": "docs" }, "question_sequence": "Preserve the source workflow order; gather prerequisites before consequential questions.", - "follow_up_behavior": "The complete source follow-up sequence is preserved verbatim inside new_location and hash-compared to the pinned base.", + "follow_up_behavior": "Specialist follow-up order is preserved from the pinned source. The retired 1.x shared onboarding wrapper is excluded, and carved specialist phases are package-local lazy references loaded at their original workflow point.", "smart_skip_rules": "Skip only when the source condition is false, and name every skipped module with evidence.", "pushback_rules": "Preserve the source forcing questions, recommendation pressure, and one-question-at-a-time cadence.", "stop_gates": "Preserve every STOP, hard gate, approval boundary, and no-mutation-before-approval rule.", @@ -4385,7 +4385,7 @@ "voice": "Direct builder voice; match the user language and retain source-specific tone constraints.", "response_posture": "Direct, evidence-first builder language; preserve source-specific recommendations and constructive pressure.", "new_location": "skills/ship/references/legacy/document-release.md", - "parity_test": "evals/parity/contracts/document-release.json + scripts/gstack2/run-parity.ts normalized full-body equality" + "parity_test": "evals/parity/contracts/document-release.json + scripts/gstack2/run-parity.ts canonical specialist render, excluded-wrapper, lazy-section, and pinned-source provenance checks" }, { "source": "setup-deploy", @@ -4395,7 +4395,7 @@ "source_path": "setup-deploy/SKILL.md.tmpl", "base_sha": "bb57306d98c97011b0919c6132705a15b1579781", "blob_sha": "587a993c01b6964b5437534527f25368cc265ec9", - "normalized_render_sha256": "796e0aefff64a98a33fd93028247bf76b8073121487cae13b66ad3081f551a87", + "normalized_render_sha256": "6c5998d60249939fd09253e55f8e66338b2223083e8b3329df745553fbdeeda0", "target": "skills/ship/references/legacy/setup-deploy.md", "disposition": "BUG_FIX", "overlays": [ @@ -4410,7 +4410,7 @@ "legacy_alias": "setup" }, "question_sequence": "Preserve the source workflow order; gather prerequisites before consequential questions.", - "follow_up_behavior": "The complete source follow-up sequence is preserved verbatim inside new_location and hash-compared to the pinned base.", + "follow_up_behavior": "Specialist follow-up order is preserved from the pinned source. The retired 1.x shared onboarding wrapper is excluded, and carved specialist phases are package-local lazy references loaded at their original workflow point.", "smart_skip_rules": "Skip only when the source condition is false, and name every skipped module with evidence.", "pushback_rules": "Preserve the source forcing questions, recommendation pressure, and one-question-at-a-time cadence.", "stop_gates": "Preserve every STOP, hard gate, approval boundary, and no-mutation-before-approval rule.", @@ -4465,7 +4465,7 @@ "voice": "Direct builder voice; match the user language and retain source-specific tone constraints.", "response_posture": "Direct, evidence-first builder language; preserve source-specific recommendations and constructive pressure.", "new_location": "skills/ship/references/legacy/setup-deploy.md", - "parity_test": "evals/parity/contracts/setup-deploy.json + scripts/gstack2/run-parity.ts normalized full-body equality" + "parity_test": "evals/parity/contracts/setup-deploy.json + scripts/gstack2/run-parity.ts canonical specialist render, excluded-wrapper, lazy-section, and pinned-source provenance checks" }, { "source": "document-generate", @@ -4475,7 +4475,7 @@ "source_path": "document-generate/SKILL.md.tmpl", "base_sha": "bb57306d98c97011b0919c6132705a15b1579781", "blob_sha": "d3ef0cbc3786c4010b3c692fb94246f56a7e1d7b", - "normalized_render_sha256": "aa5092d5c96e73aa97bcebd200d08d2ce8abcaabae534711162d29444f780229", + "normalized_render_sha256": "71726ef3082b6c00a5cad19d28da4d830f8e9b261d213a7938c4e1ce3b8c54bb", "target": "skills/ship/references/legacy/document-generate.md", "disposition": "BUG_FIX", "overlays": [ @@ -4490,7 +4490,7 @@ "legacy_alias": "docs-generate" }, "question_sequence": "Preserve the source workflow order; gather prerequisites before consequential questions.", - "follow_up_behavior": "The complete source follow-up sequence is preserved verbatim inside new_location and hash-compared to the pinned base.", + "follow_up_behavior": "Specialist follow-up order is preserved from the pinned source. The retired 1.x shared onboarding wrapper is excluded, and carved specialist phases are package-local lazy references loaded at their original workflow point.", "smart_skip_rules": "Skip only when the source condition is false, and name every skipped module with evidence.", "pushback_rules": "Preserve the source forcing questions, recommendation pressure, and one-question-at-a-time cadence.", "stop_gates": "Preserve every STOP, hard gate, approval boundary, and no-mutation-before-approval rule.", @@ -4542,7 +4542,7 @@ "voice": "Direct builder voice; match the user language and retain source-specific tone constraints.", "response_posture": "Direct, evidence-first builder language; preserve source-specific recommendations and constructive pressure.", "new_location": "skills/ship/references/legacy/document-generate.md", - "parity_test": "evals/parity/contracts/document-generate.json + scripts/gstack2/run-parity.ts normalized full-body equality" + "parity_test": "evals/parity/contracts/document-generate.json + scripts/gstack2/run-parity.ts canonical specialist render, excluded-wrapper, lazy-section, and pinned-source provenance checks" }, { "source": "gstack-upgrade", @@ -4567,7 +4567,7 @@ "legacy_alias": "upgrade" }, "question_sequence": "Preserve the source workflow order; gather prerequisites before consequential questions.", - "follow_up_behavior": "The complete source follow-up sequence is preserved verbatim inside new_location and hash-compared to the pinned base.", + "follow_up_behavior": "Specialist follow-up order is preserved from the pinned source. The retired 1.x shared onboarding wrapper is excluded, and carved specialist phases are package-local lazy references loaded at their original workflow point.", "smart_skip_rules": "Skip only when the source condition is false, and name every skipped module with evidence.", "pushback_rules": "Preserve the source forcing questions, recommendation pressure, and one-question-at-a-time cadence.", "stop_gates": "Preserve every STOP, hard gate, approval boundary, and no-mutation-before-approval rule.", @@ -4594,7 +4594,7 @@ "voice": "Direct builder voice; match the user language and retain source-specific tone constraints.", "response_posture": "Direct, evidence-first builder language; preserve source-specific recommendations and constructive pressure.", "new_location": "skills/ship/references/legacy/gstack-upgrade.md", - "parity_test": "evals/parity/contracts/gstack-upgrade.json + scripts/gstack2/run-parity.ts normalized full-body equality" + "parity_test": "evals/parity/contracts/gstack-upgrade.json + scripts/gstack2/run-parity.ts canonical specialist render, excluded-wrapper, lazy-section, and pinned-source provenance checks" }, { "source": "ios-clean", @@ -4604,7 +4604,7 @@ "source_path": "ios-clean/SKILL.md.tmpl", "base_sha": "bb57306d98c97011b0919c6132705a15b1579781", "blob_sha": "3a64481a99fab0d7247c23df0a07c428c1c5f3da", - "normalized_render_sha256": "4616b4a2f3def37440add4010a89426e85bd3f2786fd71d199063a60ce073615", + "normalized_render_sha256": "6a0080b7678f9e1df7ae2da27c4a7e3e85e7bfb83525a2c5651c24c0ab024b4b", "target": "skills/ship/references/legacy/ios-clean.md", "disposition": "BUG_FIX", "overlays": [ @@ -4619,7 +4619,7 @@ "legacy_alias": "ios-clean" }, "question_sequence": "Preserve the source workflow order; gather prerequisites before consequential questions.", - "follow_up_behavior": "The complete source follow-up sequence is preserved verbatim inside new_location and hash-compared to the pinned base.", + "follow_up_behavior": "Specialist follow-up order is preserved from the pinned source. The retired 1.x shared onboarding wrapper is excluded, and carved specialist phases are package-local lazy references loaded at their original workflow point.", "smart_skip_rules": "Skip only when the source condition is false, and name every skipped module with evidence.", "pushback_rules": "Preserve the source forcing questions, recommendation pressure, and one-question-at-a-time cadence.", "stop_gates": "Preserve every STOP, hard gate, approval boundary, and no-mutation-before-approval rule.", @@ -4667,7 +4667,7 @@ "voice": "Direct builder voice; match the user language and retain source-specific tone constraints.", "response_posture": "Direct, evidence-first builder language; preserve source-specific recommendations and constructive pressure.", "new_location": "skills/ship/references/legacy/ios-clean.md", - "parity_test": "evals/parity/contracts/ios-clean.json + scripts/gstack2/run-parity.ts normalized full-body equality" + "parity_test": "evals/parity/contracts/ios-clean.json + scripts/gstack2/run-parity.ts canonical specialist render, excluded-wrapper, lazy-section, and pinned-source provenance checks" }, { "source": "ios-sync", @@ -4677,7 +4677,7 @@ "source_path": "ios-sync/SKILL.md.tmpl", "base_sha": "bb57306d98c97011b0919c6132705a15b1579781", "blob_sha": "156a33c4c35d3bad804e44c93ae4c931878489f3", - "normalized_render_sha256": "6d1fa485d589dff65412cdd855b683f09cb442e35b8a40ee0db3451241016ea9", + "normalized_render_sha256": "c51e8865876efae833e92d54b37780afd4fa6240c13231dfb7d4635948fbc73f", "target": "skills/ship/references/legacy/ios-sync.md", "disposition": "BUG_FIX", "overlays": [ @@ -4692,7 +4692,7 @@ "legacy_alias": "ios-sync" }, "question_sequence": "Preserve the source workflow order; gather prerequisites before consequential questions.", - "follow_up_behavior": "The complete source follow-up sequence is preserved verbatim inside new_location and hash-compared to the pinned base.", + "follow_up_behavior": "Specialist follow-up order is preserved from the pinned source. The retired 1.x shared onboarding wrapper is excluded, and carved specialist phases are package-local lazy references loaded at their original workflow point.", "smart_skip_rules": "Skip only when the source condition is false, and name every skipped module with evidence.", "pushback_rules": "Preserve the source forcing questions, recommendation pressure, and one-question-at-a-time cadence.", "stop_gates": "Preserve every STOP, hard gate, approval boundary, and no-mutation-before-approval rule.", @@ -4739,7 +4739,7 @@ "voice": "Direct builder voice; match the user language and retain source-specific tone constraints.", "response_posture": "Direct, evidence-first builder language; preserve source-specific recommendations and constructive pressure.", "new_location": "skills/ship/references/legacy/ios-sync.md", - "parity_test": "evals/parity/contracts/ios-sync.json + scripts/gstack2/run-parity.ts normalized full-body equality" + "parity_test": "evals/parity/contracts/ios-sync.json + scripts/gstack2/run-parity.ts canonical specialist render, excluded-wrapper, lazy-section, and pinned-source provenance checks" } ], "sections": [ @@ -4749,27 +4749,27 @@ "base_sha": "bb57306d98c97011b0919c6132705a15b1579781", "blob_sha": "e2e9db0a7688ee80e2f82d55eb73633e6c038375", "normalized_render_sha256": "c38fd2a45788de0fefde11f46b5defc8e389a466baaefa49c81f250ee16d7a31", - "ported_render_sha256": "3cdacdfacc9cd3b494cfa89613ad74c7702c2f3ed10dbd88ed66bf1220f04260", + "ported_render_sha256": "7d9b74faf4ec5f215fda7bd9704ae7a2a20b5a0d06df722d776725b313128e8e", "target": "skills/review/references/sections/cso/audit-phases.md", - "inlined_module_target": "skills/review/references/legacy/cso.md", + "lazy_reference_module_target": "skills/review/references/legacy/cso.md", "packaged_targets": [ "skills/review/references/sections/cso/audit-phases.md" ], - "disposition": "MECHANICAL_PORT", + "disposition": "JUDGMENT_PRESERVING_CARVE", "original_source_file": "cso/sections/audit-phases.md.tmpl", "original_line_range": "1-252", - "purpose": "Carved specialist section from cso, mechanically inlined into its preserved module.", + "purpose": "Carved specialist section from cso, packaged behind a lazy reference at its original workflow point.", "invocation_conditions": "Loaded only when the parent cso workflow reaches this carved section.", "modes": { "parent": "cso" }, - "question_sequence": "Preserved verbatim in the inlined section.", - "follow_up_behavior": "Preserved verbatim in the inlined section.", + "question_sequence": "Preserved verbatim in the package-local lazy section.", + "follow_up_behavior": "Preserved verbatim in the package-local lazy section and loaded only when its original phase is reached.", "smart_skip_rules": "Inherited unchanged from the parent specialist workflow.", "pushback_rules": "Inherited unchanged from the parent specialist workflow.", "stop_gates": "Inherited unchanged from the parent specialist workflow.", "approval_gates": "Inherited unchanged from the parent specialist workflow.", - "rubrics_and_scoring": "Preserved verbatim in the inlined section.", + "rubrics_and_scoring": "Preserved verbatim in the package-local lazy section.", "cognitive_frameworks": [ "Phase 2: Secrets Archaeology", "Phase 3: Dependency Supply Chain", @@ -4799,7 +4799,7 @@ "voice": "Inherited unchanged from the parent specialist workflow.", "response_posture": "Inherited unchanged from the parent specialist workflow.", "new_location": "skills/review/references/sections/cso/audit-phases.md", - "parity_test": "scripts/gstack2/run-parity.ts exact packaged-section, inline inclusion, and Git-blob checks" + "parity_test": "scripts/gstack2/run-parity.ts exact packaged-section, lazy-reference, and Git-blob checks" }, { "source_path": "design-consultation/sections/proposal-and-preview.md.tmpl", @@ -4807,27 +4807,27 @@ "base_sha": "bb57306d98c97011b0919c6132705a15b1579781", "blob_sha": "5d2d13a7024365d24f926cc49e99f3a980d57059", "normalized_render_sha256": "232f019dead6cb913c6b0845f265fd9993383a05147ac4260369853053492d8b", - "ported_render_sha256": "2ca1a8fff531a5ff46c16b786eb139c31994a874f24d47d8f8bb8b4e8771f0b5", + "ported_render_sha256": "802acbf180b3720e15685f22e798083f6d480658a2072fc50c176413e7d5708d", "target": "skills/design/references/sections/design-consultation/proposal-and-preview.md", - "inlined_module_target": "skills/design/references/legacy/design-consultation.md", + "lazy_reference_module_target": "skills/design/references/legacy/design-consultation.md", "packaged_targets": [ "skills/design/references/sections/design-consultation/proposal-and-preview.md" ], - "disposition": "MECHANICAL_PORT", + "disposition": "JUDGMENT_PRESERVING_CARVE", "original_source_file": "design-consultation/sections/proposal-and-preview.md.tmpl", "original_line_range": "1-295", - "purpose": "Carved specialist section from design-consultation, mechanically inlined into its preserved module.", + "purpose": "Carved specialist section from design-consultation, packaged behind a lazy reference at its original workflow point.", "invocation_conditions": "Loaded only when the parent design-consultation workflow reaches this carved section.", "modes": { "parent": "design-consultation" }, - "question_sequence": "Preserved verbatim in the inlined section.", - "follow_up_behavior": "Preserved verbatim in the inlined section.", + "question_sequence": "Preserved verbatim in the package-local lazy section.", + "follow_up_behavior": "Preserved verbatim in the package-local lazy section and loaded only when its original phase is reached.", "smart_skip_rules": "Inherited unchanged from the parent specialist workflow.", "pushback_rules": "Inherited unchanged from the parent specialist workflow.", "stop_gates": "Inherited unchanged from the parent specialist workflow.", "approval_gates": "Inherited unchanged from the parent specialist workflow.", - "rubrics_and_scoring": "Preserved verbatim in the inlined section.", + "rubrics_and_scoring": "Preserved verbatim in the package-local lazy section.", "cognitive_frameworks": [ "Phase 3: The Complete Proposal", "Your Design Knowledge (use to inform proposals — do NOT display as tables)", @@ -4847,7 +4847,7 @@ "voice": "Inherited unchanged from the parent specialist workflow.", "response_posture": "Inherited unchanged from the parent specialist workflow.", "new_location": "skills/design/references/sections/design-consultation/proposal-and-preview.md", - "parity_test": "scripts/gstack2/run-parity.ts exact packaged-section, inline inclusion, and Git-blob checks" + "parity_test": "scripts/gstack2/run-parity.ts exact packaged-section, lazy-reference, and Git-blob checks" }, { "source_path": "document-release/sections/release-body.md.tmpl", @@ -4855,27 +4855,27 @@ "base_sha": "bb57306d98c97011b0919c6132705a15b1579781", "blob_sha": "475e8b258ae06c1ddc2269275a5d85e2dc09eddf", "normalized_render_sha256": "68c4d42fce344fc9d834e1cd2bbe21dea119d416668ebb32ebe9e7c52b130f32", - "ported_render_sha256": "18629e13adba829b14ace992e523431733b1b383863fefff640a1c53dbe34fbe", + "ported_render_sha256": "83c9315922fc6cef23701f720fa7eeff0cfccc000c05db0570a6483326857b08", "target": "skills/ship/references/sections/document-release/release-body.md", - "inlined_module_target": "skills/ship/references/legacy/document-release.md", + "lazy_reference_module_target": "skills/ship/references/legacy/document-release.md", "packaged_targets": [ "skills/ship/references/sections/document-release/release-body.md" ], - "disposition": "MECHANICAL_PORT", + "disposition": "JUDGMENT_PRESERVING_CARVE", "original_source_file": "document-release/sections/release-body.md.tmpl", "original_line_range": "1-363", - "purpose": "Carved specialist section from document-release, mechanically inlined into its preserved module.", + "purpose": "Carved specialist section from document-release, packaged behind a lazy reference at its original workflow point.", "invocation_conditions": "Loaded only when the parent document-release workflow reaches this carved section.", "modes": { "parent": "document-release" }, - "question_sequence": "Preserved verbatim in the inlined section.", - "follow_up_behavior": "Preserved verbatim in the inlined section.", + "question_sequence": "Preserved verbatim in the package-local lazy section.", + "follow_up_behavior": "Preserved verbatim in the package-local lazy section and loaded only when its original phase is reached.", "smart_skip_rules": "Inherited unchanged from the parent specialist workflow.", "pushback_rules": "Inherited unchanged from the parent specialist workflow.", "stop_gates": "Inherited unchanged from the parent specialist workflow.", "approval_gates": "Inherited unchanged from the parent specialist workflow.", - "rubrics_and_scoring": "Preserved verbatim in the inlined section.", + "rubrics_and_scoring": "Preserved verbatim in the package-local lazy section.", "cognitive_frameworks": [ "Step 2: Per-File Documentation Audit", "Step 3: Apply Auto-Updates", @@ -4893,7 +4893,7 @@ "voice": "Inherited unchanged from the parent specialist workflow.", "response_posture": "Inherited unchanged from the parent specialist workflow.", "new_location": "skills/ship/references/sections/document-release/release-body.md", - "parity_test": "scripts/gstack2/run-parity.ts exact packaged-section, inline inclusion, and Git-blob checks" + "parity_test": "scripts/gstack2/run-parity.ts exact packaged-section, lazy-reference, and Git-blob checks" }, { "source_path": "office-hours/sections/design-and-handoff.md.tmpl", @@ -4901,27 +4901,27 @@ "base_sha": "bb57306d98c97011b0919c6132705a15b1579781", "blob_sha": "a8f8c5aac4b39b87d222c25201475b5f1ab9bf15", "normalized_render_sha256": "ca4ffc09d9515971a9c116e3acf12ae7d6ab2b93c79da0e69ac5f5105b4527b5", - "ported_render_sha256": "8ff3b11362cb41ca336651af3a2bb2561a2f788fac59fbb59d41ed41925a859f", + "ported_render_sha256": "6e5d16c2f9fcc658f4a77c679ba971577dfc91418d84146815be86bb4207f591", "target": "skills/plan/references/sections/office-hours/design-and-handoff.md", - "inlined_module_target": "skills/plan/references/legacy/office-hours.md", + "lazy_reference_module_target": "skills/plan/references/legacy/office-hours.md", "packaged_targets": [ "skills/plan/references/sections/office-hours/design-and-handoff.md" ], - "disposition": "MECHANICAL_PORT", + "disposition": "JUDGMENT_PRESERVING_CARVE", "original_source_file": "office-hours/sections/design-and-handoff.md.tmpl", "original_line_range": "1-474", - "purpose": "Carved specialist section from office-hours, mechanically inlined into its preserved module.", + "purpose": "Carved specialist section from office-hours, packaged behind a lazy reference at its original workflow point.", "invocation_conditions": "Loaded only when the parent office-hours workflow reaches this carved section.", "modes": { "parent": "office-hours" }, - "question_sequence": "Preserved verbatim in the inlined section.", - "follow_up_behavior": "Preserved verbatim in the inlined section.", + "question_sequence": "Preserved verbatim in the package-local lazy section.", + "follow_up_behavior": "Preserved verbatim in the package-local lazy section and loaded only when its original phase is reached.", "smart_skip_rules": "Inherited unchanged from the parent specialist workflow.", "pushback_rules": "Inherited unchanged from the parent specialist workflow.", "stop_gates": "Inherited unchanged from the parent specialist workflow.", "approval_gates": "Inherited unchanged from the parent specialist workflow.", - "rubrics_and_scoring": "Preserved verbatim in the inlined section.", + "rubrics_and_scoring": "Preserved verbatim in the package-local lazy section.", "cognitive_frameworks": [ "Phase 5: Design Doc", "Startup mode design doc template:", @@ -4946,7 +4946,7 @@ "voice": "Inherited unchanged from the parent specialist workflow.", "response_posture": "Inherited unchanged from the parent specialist workflow.", "new_location": "skills/plan/references/sections/office-hours/design-and-handoff.md", - "parity_test": "scripts/gstack2/run-parity.ts exact packaged-section, inline inclusion, and Git-blob checks" + "parity_test": "scripts/gstack2/run-parity.ts exact packaged-section, lazy-reference, and Git-blob checks" }, { "source_path": "plan-ceo-review/sections/review-sections.md.tmpl", @@ -4954,27 +4954,27 @@ "base_sha": "bb57306d98c97011b0919c6132705a15b1579781", "blob_sha": "73262a9588ebe94532e1bd10505d8ea49fdb57dc", "normalized_render_sha256": "5df219bd5d3f838021964cf93170feddf1564b90894424de51931e2de184f444", - "ported_render_sha256": "0e0b90a422094f019e42f90be5bc4bc2aa6469449fd4a08e7a33d6883ac12c79", + "ported_render_sha256": "6f1f4b1dc3ae01231b5328e864f15d746f03325e074f04bbcf2f0a0df180ac99", "target": "skills/plan/references/sections/plan-ceo-review/review-sections.md", - "inlined_module_target": "skills/plan/references/legacy/plan-ceo-review.md", + "lazy_reference_module_target": "skills/plan/references/legacy/plan-ceo-review.md", "packaged_targets": [ "skills/plan/references/sections/plan-ceo-review/review-sections.md" ], - "disposition": "MECHANICAL_PORT", + "disposition": "JUDGMENT_PRESERVING_CARVE", "original_source_file": "plan-ceo-review/sections/review-sections.md.tmpl", "original_line_range": "1-493", - "purpose": "Carved specialist section from plan-ceo-review, mechanically inlined into its preserved module.", + "purpose": "Carved specialist section from plan-ceo-review, packaged behind a lazy reference at its original workflow point.", "invocation_conditions": "Loaded only when the parent plan-ceo-review workflow reaches this carved section.", "modes": { "parent": "plan-ceo-review" }, - "question_sequence": "Preserved verbatim in the inlined section.", - "follow_up_behavior": "Preserved verbatim in the inlined section.", + "question_sequence": "Preserved verbatim in the package-local lazy section.", + "follow_up_behavior": "Preserved verbatim in the package-local lazy section and loaded only when its original phase is reached.", "smart_skip_rules": "Inherited unchanged from the parent specialist workflow.", "pushback_rules": "Inherited unchanged from the parent specialist workflow.", "stop_gates": "Inherited unchanged from the parent specialist workflow.", "approval_gates": "Inherited unchanged from the parent specialist workflow.", - "rubrics_and_scoring": "Preserved verbatim in the inlined section.", + "rubrics_and_scoring": "Preserved verbatim in the package-local lazy section.", "cognitive_frameworks": [ "Review Sections (11 sections, after scope and mode are agreed)", "Section 1: Architecture Review", @@ -5029,7 +5029,7 @@ "voice": "Inherited unchanged from the parent specialist workflow.", "response_posture": "Inherited unchanged from the parent specialist workflow.", "new_location": "skills/plan/references/sections/plan-ceo-review/review-sections.md", - "parity_test": "scripts/gstack2/run-parity.ts exact packaged-section, inline inclusion, and Git-blob checks" + "parity_test": "scripts/gstack2/run-parity.ts exact packaged-section, lazy-reference, and Git-blob checks" }, { "source_path": "plan-design-review/sections/review-sections.md.tmpl", @@ -5037,28 +5037,28 @@ "base_sha": "bb57306d98c97011b0919c6132705a15b1579781", "blob_sha": "8b9c0c4bc37bf056319fdfa5e6e64df7e2c63232", "normalized_render_sha256": "f70fee1c656304193e213adb3aa12b882f4b4841826652fc7df4defcd00994f9", - "ported_render_sha256": "6768a45e4f168bac7fb9af348cf221fec54bf55465c545577893415849c35ea8", + "ported_render_sha256": "78801f52c5bd12e4709089d892d24f82db4b5f767befb8ba02389d4307fa38da", "target": "skills/design/references/sections/plan-design-review/review-sections.md", - "inlined_module_target": "skills/design/references/legacy/plan-design-review.md", + "lazy_reference_module_target": "skills/design/references/legacy/plan-design-review.md", "packaged_targets": [ "skills/design/references/sections/plan-design-review/review-sections.md", "skills/plan/references/sections/plan-design-review/review-sections.md" ], - "disposition": "MECHANICAL_PORT", + "disposition": "JUDGMENT_PRESERVING_CARVE", "original_source_file": "plan-design-review/sections/review-sections.md.tmpl", "original_line_range": "1-224", - "purpose": "Carved specialist section from plan-design-review, mechanically inlined into its preserved module.", + "purpose": "Carved specialist section from plan-design-review, packaged behind a lazy reference at its original workflow point.", "invocation_conditions": "Loaded only when the parent plan-design-review workflow reaches this carved section.", "modes": { "parent": "plan-design-review" }, - "question_sequence": "Preserved verbatim in the inlined section.", - "follow_up_behavior": "Preserved verbatim in the inlined section.", + "question_sequence": "Preserved verbatim in the package-local lazy section.", + "follow_up_behavior": "Preserved verbatim in the package-local lazy section and loaded only when its original phase is reached.", "smart_skip_rules": "Inherited unchanged from the parent specialist workflow.", "pushback_rules": "Inherited unchanged from the parent specialist workflow.", "stop_gates": "Inherited unchanged from the parent specialist workflow.", "approval_gates": "Inherited unchanged from the parent specialist workflow.", - "rubrics_and_scoring": "Preserved verbatim in the inlined section.", + "rubrics_and_scoring": "Preserved verbatim in the package-local lazy section.", "cognitive_frameworks": [ "Review Sections (7 passes, after scope is agreed)", "Prior Learnings", @@ -5102,7 +5102,7 @@ "voice": "Inherited unchanged from the parent specialist workflow.", "response_posture": "Inherited unchanged from the parent specialist workflow.", "new_location": "skills/design/references/sections/plan-design-review/review-sections.md", - "parity_test": "scripts/gstack2/run-parity.ts exact packaged-section, inline inclusion, and Git-blob checks" + "parity_test": "scripts/gstack2/run-parity.ts exact packaged-section, lazy-reference, and Git-blob checks" }, { "source_path": "plan-devex-review/sections/review-sections.md.tmpl", @@ -5110,27 +5110,27 @@ "base_sha": "bb57306d98c97011b0919c6132705a15b1579781", "blob_sha": "eca5dbccaab17ef1f1ecd6b624df6762b8e596fe", "normalized_render_sha256": "4567898687b5b4566e5566735e86e0a71db1e6d69e1b55006d599794401f89aa", - "ported_render_sha256": "9be109595821a4674f116c79060bc65d87606c3c07c31c4cd014040f3e802676", + "ported_render_sha256": "f74e7e8054cbda01f5a80493495428d5a181e7b2009eabbe81498147d37f1420", "target": "skills/plan/references/sections/plan-devex-review/review-sections.md", - "inlined_module_target": "skills/plan/references/legacy/plan-devex-review.md", + "lazy_reference_module_target": "skills/plan/references/legacy/plan-devex-review.md", "packaged_targets": [ "skills/plan/references/sections/plan-devex-review/review-sections.md" ], - "disposition": "MECHANICAL_PORT", + "disposition": "JUDGMENT_PRESERVING_CARVE", "original_source_file": "plan-devex-review/sections/review-sections.md.tmpl", "original_line_range": "1-403", - "purpose": "Carved specialist section from plan-devex-review, mechanically inlined into its preserved module.", + "purpose": "Carved specialist section from plan-devex-review, packaged behind a lazy reference at its original workflow point.", "invocation_conditions": "Loaded only when the parent plan-devex-review workflow reaches this carved section.", "modes": { "parent": "plan-devex-review" }, - "question_sequence": "Preserved verbatim in the inlined section.", - "follow_up_behavior": "Preserved verbatim in the inlined section.", + "question_sequence": "Preserved verbatim in the package-local lazy section.", + "follow_up_behavior": "Preserved verbatim in the package-local lazy section and loaded only when its original phase is reached.", "smart_skip_rules": "Inherited unchanged from the parent specialist workflow.", "pushback_rules": "Inherited unchanged from the parent specialist workflow.", "stop_gates": "Inherited unchanged from the parent specialist workflow.", "approval_gates": "Inherited unchanged from the parent specialist workflow.", - "rubrics_and_scoring": "Preserved verbatim in the inlined section.", + "rubrics_and_scoring": "Preserved verbatim in the package-local lazy section.", "cognitive_frameworks": [ "Review Sections (8 passes, after Step 0 is complete)", "Prior Learnings", @@ -5182,7 +5182,7 @@ "voice": "Inherited unchanged from the parent specialist workflow.", "response_posture": "Inherited unchanged from the parent specialist workflow.", "new_location": "skills/plan/references/sections/plan-devex-review/review-sections.md", - "parity_test": "scripts/gstack2/run-parity.ts exact packaged-section, inline inclusion, and Git-blob checks" + "parity_test": "scripts/gstack2/run-parity.ts exact packaged-section, lazy-reference, and Git-blob checks" }, { "source_path": "plan-eng-review/sections/review-sections.md.tmpl", @@ -5190,27 +5190,27 @@ "base_sha": "bb57306d98c97011b0919c6132705a15b1579781", "blob_sha": "64562a6b1ff51a9c528d34aef1a7447e18576c13", "normalized_render_sha256": "780b427bfd6b28886538f8eccbfed8f600cf532fc102d81f7499f37469dcb61d", - "ported_render_sha256": "dadb7aede4f2fc530e45be2df1c147375acec488d9861b6ac6ace9aacc1d5d43", + "ported_render_sha256": "249494f052cc853f9ea99e0d06afcf9f783e7f5666e4abb5d760c3260f3c10fc", "target": "skills/plan/references/sections/plan-eng-review/review-sections.md", - "inlined_module_target": "skills/plan/references/legacy/plan-eng-review.md", + "lazy_reference_module_target": "skills/plan/references/legacy/plan-eng-review.md", "packaged_targets": [ "skills/plan/references/sections/plan-eng-review/review-sections.md" ], - "disposition": "MECHANICAL_PORT", + "disposition": "JUDGMENT_PRESERVING_CARVE", "original_source_file": "plan-eng-review/sections/review-sections.md.tmpl", "original_line_range": "1-227", - "purpose": "Carved specialist section from plan-eng-review, mechanically inlined into its preserved module.", + "purpose": "Carved specialist section from plan-eng-review, packaged behind a lazy reference at its original workflow point.", "invocation_conditions": "Loaded only when the parent plan-eng-review workflow reaches this carved section.", "modes": { "parent": "plan-eng-review" }, - "question_sequence": "Preserved verbatim in the inlined section.", - "follow_up_behavior": "Preserved verbatim in the inlined section.", + "question_sequence": "Preserved verbatim in the package-local lazy section.", + "follow_up_behavior": "Preserved verbatim in the package-local lazy section and loaded only when its original phase is reached.", "smart_skip_rules": "Inherited unchanged from the parent specialist workflow.", "pushback_rules": "Inherited unchanged from the parent specialist workflow.", "stop_gates": "Inherited unchanged from the parent specialist workflow.", "approval_gates": "Inherited unchanged from the parent specialist workflow.", - "rubrics_and_scoring": "Preserved verbatim in the inlined section.", + "rubrics_and_scoring": "Preserved verbatim in the package-local lazy section.", "cognitive_frameworks": [ "Review Sections (after scope is agreed)", "Prior Learnings", @@ -5259,7 +5259,7 @@ "voice": "Inherited unchanged from the parent specialist workflow.", "response_posture": "Inherited unchanged from the parent specialist workflow.", "new_location": "skills/plan/references/sections/plan-eng-review/review-sections.md", - "parity_test": "scripts/gstack2/run-parity.ts exact packaged-section, inline inclusion, and Git-blob checks" + "parity_test": "scripts/gstack2/run-parity.ts exact packaged-section, lazy-reference, and Git-blob checks" }, { "source_path": "ship/sections/adversarial.md.tmpl", @@ -5269,25 +5269,25 @@ "normalized_render_sha256": "c3ee106fbb6513ae45ddf0cb9498ad72a63f6b63c1af6807420d7ee7cf3abc80", "ported_render_sha256": "80c5b8c8b833e895479360ade3227a956ea2eba41c183840f163064e9d35dc5b", "target": "skills/ship/references/sections/ship/adversarial.md", - "inlined_module_target": "skills/ship/references/legacy/ship.md", + "lazy_reference_module_target": "skills/ship/references/legacy/ship.md", "packaged_targets": [ "skills/ship/references/sections/ship/adversarial.md" ], - "disposition": "MECHANICAL_PORT", + "disposition": "JUDGMENT_PRESERVING_CARVE", "original_source_file": "ship/sections/adversarial.md.tmpl", "original_line_range": "1-20", - "purpose": "Carved specialist section from ship, mechanically inlined into its preserved module.", + "purpose": "Carved specialist section from ship, packaged behind a lazy reference at its original workflow point.", "invocation_conditions": "Loaded only when the parent ship workflow reaches this carved section.", "modes": { "parent": "ship" }, - "question_sequence": "Preserved verbatim in the inlined section.", - "follow_up_behavior": "Preserved verbatim in the inlined section.", + "question_sequence": "Preserved verbatim in the package-local lazy section.", + "follow_up_behavior": "Preserved verbatim in the package-local lazy section and loaded only when its original phase is reached.", "smart_skip_rules": "Inherited unchanged from the parent specialist workflow.", "pushback_rules": "Inherited unchanged from the parent specialist workflow.", "stop_gates": "Inherited unchanged from the parent specialist workflow.", "approval_gates": "Inherited unchanged from the parent specialist workflow.", - "rubrics_and_scoring": "Preserved verbatim in the inlined section.", + "rubrics_and_scoring": "Preserved verbatim in the package-local lazy section.", "cognitive_frameworks": [ "Capture Learnings", "Refresh learnings for the headline feature on this branch" @@ -5299,7 +5299,7 @@ "voice": "Inherited unchanged from the parent specialist workflow.", "response_posture": "Inherited unchanged from the parent specialist workflow.", "new_location": "skills/ship/references/sections/ship/adversarial.md", - "parity_test": "scripts/gstack2/run-parity.ts exact packaged-section, inline inclusion, and Git-blob checks" + "parity_test": "scripts/gstack2/run-parity.ts exact packaged-section, lazy-reference, and Git-blob checks" }, { "source_path": "ship/sections/changelog.md.tmpl", @@ -5309,25 +5309,25 @@ "normalized_render_sha256": "e84b0e33f0dab6bef8cc66b8088630dbfa2d1868bd02c2c938ebfe3cccaeb970", "ported_render_sha256": "e84b0e33f0dab6bef8cc66b8088630dbfa2d1868bd02c2c938ebfe3cccaeb970", "target": "skills/ship/references/sections/ship/changelog.md", - "inlined_module_target": "skills/ship/references/legacy/ship.md", + "lazy_reference_module_target": "skills/ship/references/legacy/ship.md", "packaged_targets": [ "skills/ship/references/sections/ship/changelog.md" ], - "disposition": "MECHANICAL_PORT", + "disposition": "JUDGMENT_PRESERVING_CARVE", "original_source_file": "ship/sections/changelog.md.tmpl", "original_line_range": "1-4", - "purpose": "Carved specialist section from ship, mechanically inlined into its preserved module.", + "purpose": "Carved specialist section from ship, packaged behind a lazy reference at its original workflow point.", "invocation_conditions": "Loaded only when the parent ship workflow reaches this carved section.", "modes": { "parent": "ship" }, - "question_sequence": "Preserved verbatim in the inlined section.", - "follow_up_behavior": "Preserved verbatim in the inlined section.", + "question_sequence": "Preserved verbatim in the package-local lazy section.", + "follow_up_behavior": "Preserved verbatim in the package-local lazy section and loaded only when its original phase is reached.", "smart_skip_rules": "Inherited unchanged from the parent specialist workflow.", "pushback_rules": "Inherited unchanged from the parent specialist workflow.", "stop_gates": "Inherited unchanged from the parent specialist workflow.", "approval_gates": "Inherited unchanged from the parent specialist workflow.", - "rubrics_and_scoring": "Preserved verbatim in the inlined section.", + "rubrics_and_scoring": "Preserved verbatim in the package-local lazy section.", "cognitive_frameworks": [ "Step 13: CHANGELOG (auto-generate)" ], @@ -5338,7 +5338,7 @@ "voice": "Inherited unchanged from the parent specialist workflow.", "response_posture": "Inherited unchanged from the parent specialist workflow.", "new_location": "skills/ship/references/sections/ship/changelog.md", - "parity_test": "scripts/gstack2/run-parity.ts exact packaged-section, inline inclusion, and Git-blob checks" + "parity_test": "scripts/gstack2/run-parity.ts exact packaged-section, lazy-reference, and Git-blob checks" }, { "source_path": "ship/sections/greptile.md.tmpl", @@ -5348,25 +5348,25 @@ "normalized_render_sha256": "48c59e532a5878215272cebfa1feecf466a35c44aee1fc1cbbf1691b6bfcd6a7", "ported_render_sha256": "2d457433edd3bd049a63aae9aac5d93701b3b141f2c6b03ca434173238854e06", "target": "skills/ship/references/sections/ship/greptile.md", - "inlined_module_target": "skills/ship/references/legacy/ship.md", + "lazy_reference_module_target": "skills/ship/references/legacy/ship.md", "packaged_targets": [ "skills/ship/references/sections/ship/greptile.md" ], - "disposition": "MECHANICAL_PORT", + "disposition": "JUDGMENT_PRESERVING_CARVE", "original_source_file": "ship/sections/greptile.md.tmpl", "original_line_range": "1-50", - "purpose": "Carved specialist section from ship, mechanically inlined into its preserved module.", + "purpose": "Carved specialist section from ship, packaged behind a lazy reference at its original workflow point.", "invocation_conditions": "Loaded only when the parent ship workflow reaches this carved section.", "modes": { "parent": "ship" }, - "question_sequence": "Preserved verbatim in the inlined section.", - "follow_up_behavior": "Preserved verbatim in the inlined section.", + "question_sequence": "Preserved verbatim in the package-local lazy section.", + "follow_up_behavior": "Preserved verbatim in the package-local lazy section and loaded only when its original phase is reached.", "smart_skip_rules": "Inherited unchanged from the parent specialist workflow.", "pushback_rules": "Inherited unchanged from the parent specialist workflow.", "stop_gates": "Inherited unchanged from the parent specialist workflow.", "approval_gates": "Inherited unchanged from the parent specialist workflow.", - "rubrics_and_scoring": "Preserved verbatim in the inlined section.", + "rubrics_and_scoring": "Preserved verbatim in the package-local lazy section.", "cognitive_frameworks": [ "Step 10: Address Greptile review comments (if PR exists)" ], @@ -5377,7 +5377,7 @@ "voice": "Inherited unchanged from the parent specialist workflow.", "response_posture": "Inherited unchanged from the parent specialist workflow.", "new_location": "skills/ship/references/sections/ship/greptile.md", - "parity_test": "scripts/gstack2/run-parity.ts exact packaged-section, inline inclusion, and Git-blob checks" + "parity_test": "scripts/gstack2/run-parity.ts exact packaged-section, lazy-reference, and Git-blob checks" }, { "source_path": "ship/sections/plan-completion.md.tmpl", @@ -5385,27 +5385,27 @@ "base_sha": "bb57306d98c97011b0919c6132705a15b1579781", "blob_sha": "357cec24b6e7261b2451dee48c259fb6b0ae497a", "normalized_render_sha256": "7aef2bc76d8a43d5618017d7b12482b341bd5691b4183271b0027f6a8055b1b2", - "ported_render_sha256": "9ad216289c2fdbcf2f7e1f8a5ca2257ab2875ea86b0681174a4065132a32c171", + "ported_render_sha256": "f6b79e888d69c68cd9a22fad9bb6b2f98e9eec2465813b3c006baca3a3f51958", "target": "skills/ship/references/sections/ship/plan-completion.md", - "inlined_module_target": "skills/ship/references/legacy/ship.md", + "lazy_reference_module_target": "skills/ship/references/legacy/ship.md", "packaged_targets": [ "skills/ship/references/sections/ship/plan-completion.md" ], - "disposition": "MECHANICAL_PORT", + "disposition": "JUDGMENT_PRESERVING_CARVE", "original_source_file": "ship/sections/plan-completion.md.tmpl", "original_line_range": "1-32", - "purpose": "Carved specialist section from ship, mechanically inlined into its preserved module.", + "purpose": "Carved specialist section from ship, packaged behind a lazy reference at its original workflow point.", "invocation_conditions": "Loaded only when the parent ship workflow reaches this carved section.", "modes": { "parent": "ship" }, - "question_sequence": "Preserved verbatim in the inlined section.", - "follow_up_behavior": "Preserved verbatim in the inlined section.", + "question_sequence": "Preserved verbatim in the package-local lazy section.", + "follow_up_behavior": "Preserved verbatim in the package-local lazy section and loaded only when its original phase is reached.", "smart_skip_rules": "Inherited unchanged from the parent specialist workflow.", "pushback_rules": "Inherited unchanged from the parent specialist workflow.", "stop_gates": "Inherited unchanged from the parent specialist workflow.", "approval_gates": "Inherited unchanged from the parent specialist workflow.", - "rubrics_and_scoring": "Preserved verbatim in the inlined section.", + "rubrics_and_scoring": "Preserved verbatim in the package-local lazy section.", "cognitive_frameworks": [ "Step 8: Plan Completion Audit", "Actionable Item Extraction", @@ -5429,7 +5429,7 @@ "voice": "Inherited unchanged from the parent specialist workflow.", "response_posture": "Inherited unchanged from the parent specialist workflow.", "new_location": "skills/ship/references/sections/ship/plan-completion.md", - "parity_test": "scripts/gstack2/run-parity.ts exact packaged-section, inline inclusion, and Git-blob checks" + "parity_test": "scripts/gstack2/run-parity.ts exact packaged-section, lazy-reference, and Git-blob checks" }, { "source_path": "ship/sections/pr-body.md.tmpl", @@ -5437,27 +5437,27 @@ "base_sha": "bb57306d98c97011b0919c6132705a15b1579781", "blob_sha": "22ac0d668ba8f2a15c7f9416508d81727c5114e0", "normalized_render_sha256": "813c4c75f1cc8c85ab3121f0a76966673118cf759d283c3ef5f6aa1ba64dd764", - "ported_render_sha256": "650dc896bf54eb2ab86a0fa1f4a1d759fb951452553581d5c685318cf6e8fa66", + "ported_render_sha256": "c45be8e6407b208154b0123c3d9e10658030c1b74067a1218d4a0115b0a1c83d", "target": "skills/ship/references/sections/ship/pr-body.md", - "inlined_module_target": "skills/ship/references/legacy/ship.md", + "lazy_reference_module_target": "skills/ship/references/legacy/ship.md", "packaged_targets": [ "skills/ship/references/sections/ship/pr-body.md" ], - "disposition": "MECHANICAL_PORT", + "disposition": "JUDGMENT_PRESERVING_CARVE", "original_source_file": "ship/sections/pr-body.md.tmpl", "original_line_range": "1-206", - "purpose": "Carved specialist section from ship, mechanically inlined into its preserved module.", + "purpose": "Carved specialist section from ship, packaged behind a lazy reference at its original workflow point.", "invocation_conditions": "Loaded only when the parent ship workflow reaches this carved section.", "modes": { "parent": "ship" }, - "question_sequence": "Preserved verbatim in the inlined section.", - "follow_up_behavior": "Preserved verbatim in the inlined section.", + "question_sequence": "Preserved verbatim in the package-local lazy section.", + "follow_up_behavior": "Preserved verbatim in the package-local lazy section and loaded only when its original phase is reached.", "smart_skip_rules": "Inherited unchanged from the parent specialist workflow.", "pushback_rules": "Inherited unchanged from the parent specialist workflow.", "stop_gates": "Inherited unchanged from the parent specialist workflow.", "approval_gates": "Inherited unchanged from the parent specialist workflow.", - "rubrics_and_scoring": "Preserved verbatim in the inlined section.", + "rubrics_and_scoring": "Preserved verbatim in the package-local lazy section.", "cognitive_frameworks": [ "Step 18: Documentation sync (via subagent, before PR creation)", "Step 19: Create PR/MR", @@ -5470,7 +5470,7 @@ "voice": "Inherited unchanged from the parent specialist workflow.", "response_posture": "Inherited unchanged from the parent specialist workflow.", "new_location": "skills/ship/references/sections/ship/pr-body.md", - "parity_test": "scripts/gstack2/run-parity.ts exact packaged-section, inline inclusion, and Git-blob checks" + "parity_test": "scripts/gstack2/run-parity.ts exact packaged-section, lazy-reference, and Git-blob checks" }, { "source_path": "ship/sections/review-army.md.tmpl", @@ -5478,27 +5478,27 @@ "base_sha": "bb57306d98c97011b0919c6132705a15b1579781", "blob_sha": "e55db627e629ec501f1073dd383a7f13499c93ae", "normalized_render_sha256": "21cbb6b729ac4069fb1c9626979ad821e5227463d783b16b70f67526208d697b", - "ported_render_sha256": "cbfee41463032434762b1c6abcbb6372b841832f733f102f4e8c6c49f1407bb2", + "ported_render_sha256": "655ffbe7d5f662bf333dc06143001a7746f6cc35993b29cb7d942135973fd1c8", "target": "skills/ship/references/sections/ship/review-army.md", - "inlined_module_target": "skills/ship/references/legacy/ship.md", + "lazy_reference_module_target": "skills/ship/references/legacy/ship.md", "packaged_targets": [ "skills/ship/references/sections/ship/review-army.md" ], - "disposition": "MECHANICAL_PORT", + "disposition": "JUDGMENT_PRESERVING_CARVE", "original_source_file": "ship/sections/review-army.md.tmpl", "original_line_range": "1-56", - "purpose": "Carved specialist section from ship, mechanically inlined into its preserved module.", + "purpose": "Carved specialist section from ship, packaged behind a lazy reference at its original workflow point.", "invocation_conditions": "Loaded only when the parent ship workflow reaches this carved section.", "modes": { "parent": "ship" }, - "question_sequence": "Preserved verbatim in the inlined section.", - "follow_up_behavior": "Preserved verbatim in the inlined section.", + "question_sequence": "Preserved verbatim in the package-local lazy section.", + "follow_up_behavior": "Preserved verbatim in the package-local lazy section and loaded only when its original phase is reached.", "smart_skip_rules": "Inherited unchanged from the parent specialist workflow.", "pushback_rules": "Inherited unchanged from the parent specialist workflow.", "stop_gates": "Inherited unchanged from the parent specialist workflow.", "approval_gates": "Inherited unchanged from the parent specialist workflow.", - "rubrics_and_scoring": "Preserved verbatim in the inlined section.", + "rubrics_and_scoring": "Preserved verbatim in the package-local lazy section.", "cognitive_frameworks": [ "Step 9: Pre-Landing Review", "Confidence Calibration", @@ -5513,7 +5513,7 @@ "voice": "Inherited unchanged from the parent specialist workflow.", "response_posture": "Inherited unchanged from the parent specialist workflow.", "new_location": "skills/ship/references/sections/ship/review-army.md", - "parity_test": "scripts/gstack2/run-parity.ts exact packaged-section, inline inclusion, and Git-blob checks" + "parity_test": "scripts/gstack2/run-parity.ts exact packaged-section, lazy-reference, and Git-blob checks" }, { "source_path": "ship/sections/test-coverage.md.tmpl", @@ -5521,27 +5521,27 @@ "base_sha": "bb57306d98c97011b0919c6132705a15b1579781", "blob_sha": "8f00d0304f243a630c1920d9be0e3574dd2512aa", "normalized_render_sha256": "e60f59bd59b913c3092734f538b446a52dcccaa00ff69277e0551b13ac8ac1cd", - "ported_render_sha256": "50e493e72caa15cd5e5cf91db9557b7d861571dc583a84b76a73eb557f90dce0", + "ported_render_sha256": "3eeac50d8e6aef9e402926af2c35352cab640cdaafb3ff5eb63c9d54e907c800", "target": "skills/ship/references/sections/ship/test-coverage.md", - "inlined_module_target": "skills/ship/references/legacy/ship.md", + "lazy_reference_module_target": "skills/ship/references/legacy/ship.md", "packaged_targets": [ "skills/ship/references/sections/ship/test-coverage.md" ], - "disposition": "MECHANICAL_PORT", + "disposition": "JUDGMENT_PRESERVING_CARVE", "original_source_file": "ship/sections/test-coverage.md.tmpl", "original_line_range": "1-24", - "purpose": "Carved specialist section from ship, mechanically inlined into its preserved module.", + "purpose": "Carved specialist section from ship, packaged behind a lazy reference at its original workflow point.", "invocation_conditions": "Loaded only when the parent ship workflow reaches this carved section.", "modes": { "parent": "ship" }, - "question_sequence": "Preserved verbatim in the inlined section.", - "follow_up_behavior": "Preserved verbatim in the inlined section.", + "question_sequence": "Preserved verbatim in the package-local lazy section.", + "follow_up_behavior": "Preserved verbatim in the package-local lazy section and loaded only when its original phase is reached.", "smart_skip_rules": "Inherited unchanged from the parent specialist workflow.", "pushback_rules": "Inherited unchanged from the parent specialist workflow.", "stop_gates": "Inherited unchanged from the parent specialist workflow.", "approval_gates": "Inherited unchanged from the parent specialist workflow.", - "rubrics_and_scoring": "Preserved verbatim in the inlined section.", + "rubrics_and_scoring": "Preserved verbatim in the package-local lazy section.", "cognitive_frameworks": [ "Step 7: Test Coverage Audit", "Test Framework Detection", @@ -5556,7 +5556,7 @@ "voice": "Inherited unchanged from the parent specialist workflow.", "response_posture": "Inherited unchanged from the parent specialist workflow.", "new_location": "skills/ship/references/sections/ship/test-coverage.md", - "parity_test": "scripts/gstack2/run-parity.ts exact packaged-section, inline inclusion, and Git-blob checks" + "parity_test": "scripts/gstack2/run-parity.ts exact packaged-section, lazy-reference, and Git-blob checks" }, { "source_path": "ship/sections/tests.md.tmpl", @@ -5564,27 +5564,27 @@ "base_sha": "bb57306d98c97011b0919c6132705a15b1579781", "blob_sha": "e6d53d495f7868e93e06fde68ad2ca8c2fcab315", "normalized_render_sha256": "4335d2e4bf76e164cc767330d96dc69ce7478ec2298690ee6fe873b654c6cb3e", - "ported_render_sha256": "34f688383d85bc0cc76f9e4a669554a4b5c799b374c56b491f86c5daf1ff74b4", + "ported_render_sha256": "9cc20f7d1a99ff7200a6eac240b3d5c1cdbe2772422f7ee15a4752f4b2f22f0a", "target": "skills/ship/references/sections/ship/tests.md", - "inlined_module_target": "skills/ship/references/legacy/ship.md", + "lazy_reference_module_target": "skills/ship/references/legacy/ship.md", "packaged_targets": [ "skills/ship/references/sections/ship/tests.md" ], - "disposition": "MECHANICAL_PORT", + "disposition": "JUDGMENT_PRESERVING_CARVE", "original_source_file": "ship/sections/tests.md.tmpl", "original_line_range": "1-110", - "purpose": "Carved specialist section from ship, mechanically inlined into its preserved module.", + "purpose": "Carved specialist section from ship, packaged behind a lazy reference at its original workflow point.", "invocation_conditions": "Loaded only when the parent ship workflow reaches this carved section.", "modes": { "parent": "ship" }, - "question_sequence": "Preserved verbatim in the inlined section.", - "follow_up_behavior": "Preserved verbatim in the inlined section.", + "question_sequence": "Preserved verbatim in the package-local lazy section.", + "follow_up_behavior": "Preserved verbatim in the package-local lazy section and loaded only when its original phase is reached.", "smart_skip_rules": "Inherited unchanged from the parent specialist workflow.", "pushback_rules": "Inherited unchanged from the parent specialist workflow.", "stop_gates": "Inherited unchanged from the parent specialist workflow.", "approval_gates": "Inherited unchanged from the parent specialist workflow.", - "rubrics_and_scoring": "Preserved verbatim in the inlined section.", + "rubrics_and_scoring": "Preserved verbatim in the package-local lazy section.", "cognitive_frameworks": [ "Step 4: Test Framework Bootstrap", "Test Framework Bootstrap", @@ -5612,7 +5612,7 @@ "voice": "Inherited unchanged from the parent specialist workflow.", "response_posture": "Inherited unchanged from the parent specialist workflow.", "new_location": "skills/ship/references/sections/ship/tests.md", - "parity_test": "scripts/gstack2/run-parity.ts exact packaged-section, inline inclusion, and Git-blob checks" + "parity_test": "scripts/gstack2/run-parity.ts exact packaged-section, lazy-reference, and Git-blob checks" } ], "section_copies": [ @@ -5622,7 +5622,7 @@ "source_path": "design-consultation/sections/proposal-and-preview.md.tmpl", "target_path": "skills/design/references/sections/design-consultation/proposal-and-preview.md", "blob_sha": "5d2d13a7024365d24f926cc49e99f3a980d57059", - "sha256": "2ca1a8fff531a5ff46c16b786eb139c31994a874f24d47d8f8bb8b4e8771f0b5" + "sha256": "802acbf180b3720e15685f22e798083f6d480658a2072fc50c176413e7d5708d" }, { "tree": "design", @@ -5630,7 +5630,7 @@ "source_path": "plan-design-review/sections/review-sections.md.tmpl", "target_path": "skills/design/references/sections/plan-design-review/review-sections.md", "blob_sha": "8b9c0c4bc37bf056319fdfa5e6e64df7e2c63232", - "sha256": "6768a45e4f168bac7fb9af348cf221fec54bf55465c545577893415849c35ea8" + "sha256": "78801f52c5bd12e4709089d892d24f82db4b5f767befb8ba02389d4307fa38da" }, { "tree": "plan", @@ -5638,7 +5638,7 @@ "source_path": "office-hours/sections/design-and-handoff.md.tmpl", "target_path": "skills/plan/references/sections/office-hours/design-and-handoff.md", "blob_sha": "a8f8c5aac4b39b87d222c25201475b5f1ab9bf15", - "sha256": "8ff3b11362cb41ca336651af3a2bb2561a2f788fac59fbb59d41ed41925a859f" + "sha256": "6e5d16c2f9fcc658f4a77c679ba971577dfc91418d84146815be86bb4207f591" }, { "tree": "plan", @@ -5646,7 +5646,7 @@ "source_path": "plan-ceo-review/sections/review-sections.md.tmpl", "target_path": "skills/plan/references/sections/plan-ceo-review/review-sections.md", "blob_sha": "73262a9588ebe94532e1bd10505d8ea49fdb57dc", - "sha256": "0e0b90a422094f019e42f90be5bc4bc2aa6469449fd4a08e7a33d6883ac12c79" + "sha256": "6f1f4b1dc3ae01231b5328e864f15d746f03325e074f04bbcf2f0a0df180ac99" }, { "tree": "plan", @@ -5654,7 +5654,7 @@ "source_path": "plan-design-review/sections/review-sections.md.tmpl", "target_path": "skills/plan/references/sections/plan-design-review/review-sections.md", "blob_sha": "8b9c0c4bc37bf056319fdfa5e6e64df7e2c63232", - "sha256": "6768a45e4f168bac7fb9af348cf221fec54bf55465c545577893415849c35ea8" + "sha256": "78801f52c5bd12e4709089d892d24f82db4b5f767befb8ba02389d4307fa38da" }, { "tree": "plan", @@ -5662,7 +5662,7 @@ "source_path": "plan-devex-review/sections/review-sections.md.tmpl", "target_path": "skills/plan/references/sections/plan-devex-review/review-sections.md", "blob_sha": "eca5dbccaab17ef1f1ecd6b624df6762b8e596fe", - "sha256": "9be109595821a4674f116c79060bc65d87606c3c07c31c4cd014040f3e802676" + "sha256": "f74e7e8054cbda01f5a80493495428d5a181e7b2009eabbe81498147d37f1420" }, { "tree": "plan", @@ -5670,7 +5670,7 @@ "source_path": "plan-eng-review/sections/review-sections.md.tmpl", "target_path": "skills/plan/references/sections/plan-eng-review/review-sections.md", "blob_sha": "64562a6b1ff51a9c528d34aef1a7447e18576c13", - "sha256": "dadb7aede4f2fc530e45be2df1c147375acec488d9861b6ac6ace9aacc1d5d43" + "sha256": "249494f052cc853f9ea99e0d06afcf9f783e7f5666e4abb5d760c3260f3c10fc" }, { "tree": "review", @@ -5678,7 +5678,7 @@ "source_path": "cso/sections/audit-phases.md.tmpl", "target_path": "skills/review/references/sections/cso/audit-phases.md", "blob_sha": "e2e9db0a7688ee80e2f82d55eb73633e6c038375", - "sha256": "3cdacdfacc9cd3b494cfa89613ad74c7702c2f3ed10dbd88ed66bf1220f04260" + "sha256": "7d9b74faf4ec5f215fda7bd9704ae7a2a20b5a0d06df722d776725b313128e8e" }, { "tree": "ship", @@ -5686,7 +5686,7 @@ "source_path": "document-release/sections/release-body.md.tmpl", "target_path": "skills/ship/references/sections/document-release/release-body.md", "blob_sha": "475e8b258ae06c1ddc2269275a5d85e2dc09eddf", - "sha256": "18629e13adba829b14ace992e523431733b1b383863fefff640a1c53dbe34fbe" + "sha256": "83c9315922fc6cef23701f720fa7eeff0cfccc000c05db0570a6483326857b08" }, { "tree": "ship", @@ -5718,7 +5718,7 @@ "source_path": "ship/sections/plan-completion.md.tmpl", "target_path": "skills/ship/references/sections/ship/plan-completion.md", "blob_sha": "357cec24b6e7261b2451dee48c259fb6b0ae497a", - "sha256": "9ad216289c2fdbcf2f7e1f8a5ca2257ab2875ea86b0681174a4065132a32c171" + "sha256": "f6b79e888d69c68cd9a22fad9bb6b2f98e9eec2465813b3c006baca3a3f51958" }, { "tree": "ship", @@ -5726,7 +5726,7 @@ "source_path": "ship/sections/pr-body.md.tmpl", "target_path": "skills/ship/references/sections/ship/pr-body.md", "blob_sha": "22ac0d668ba8f2a15c7f9416508d81727c5114e0", - "sha256": "650dc896bf54eb2ab86a0fa1f4a1d759fb951452553581d5c685318cf6e8fa66" + "sha256": "c45be8e6407b208154b0123c3d9e10658030c1b74067a1218d4a0115b0a1c83d" }, { "tree": "ship", @@ -5734,7 +5734,7 @@ "source_path": "ship/sections/review-army.md.tmpl", "target_path": "skills/ship/references/sections/ship/review-army.md", "blob_sha": "e55db627e629ec501f1073dd383a7f13499c93ae", - "sha256": "cbfee41463032434762b1c6abcbb6372b841832f733f102f4e8c6c49f1407bb2" + "sha256": "655ffbe7d5f662bf333dc06143001a7746f6cc35993b29cb7d942135973fd1c8" }, { "tree": "ship", @@ -5742,7 +5742,7 @@ "source_path": "ship/sections/test-coverage.md.tmpl", "target_path": "skills/ship/references/sections/ship/test-coverage.md", "blob_sha": "8f00d0304f243a630c1920d9be0e3574dd2512aa", - "sha256": "50e493e72caa15cd5e5cf91db9557b7d861571dc583a84b76a73eb557f90dce0" + "sha256": "3eeac50d8e6aef9e402926af2c35352cab640cdaafb3ff5eb63c9d54e907c800" }, { "tree": "ship", @@ -5750,40 +5750,16 @@ "source_path": "ship/sections/tests.md.tmpl", "target_path": "skills/ship/references/sections/ship/tests.md", "blob_sha": "e6d53d495f7868e93e06fde68ad2ca8c2fcab315", - "sha256": "34f688383d85bc0cc76f9e4a669554a4b5c799b374c56b491f86c5daf1ff74b4" + "sha256": "9cc20f7d1a99ff7200a6eac240b3d5c1cdbe2772422f7ee15a4752f4b2f22f0a" } ], "dependency_copies": [ - { - "source": "gstack-upgrade", - "owner_tree": "ship", - "consumer_tree": "plan", - "target": "skills/plan/references/legacy/gstack-upgrade.md", - "sha256": "0664ec29f1619d08ba296c2160c8c9b9f8a8116131cca8d96f6a9c8ec0f0fcef", - "disposition": "SHARED_MODULE" - }, { "source": "plan-design-review", "owner_tree": "design", "consumer_tree": "plan", "target": "skills/plan/references/legacy/plan-design-review.md", - "sha256": "7b041d51147ffaeaf7bc0ed34e07a3b7b6baf9e62d921f4d94f59e1c89d886ea", - "disposition": "SHARED_MODULE" - }, - { - "source": "gstack-upgrade", - "owner_tree": "ship", - "consumer_tree": "design", - "target": "skills/design/references/legacy/gstack-upgrade.md", - "sha256": "0664ec29f1619d08ba296c2160c8c9b9f8a8116131cca8d96f6a9c8ec0f0fcef", - "disposition": "SHARED_MODULE" - }, - { - "source": "gstack-upgrade", - "owner_tree": "ship", - "consumer_tree": "qa", - "target": "skills/qa/references/legacy/gstack-upgrade.md", - "sha256": "0664ec29f1619d08ba296c2160c8c9b9f8a8116131cca8d96f6a9c8ec0f0fcef", + "sha256": "0c9930db5c50e873318cbbf00b9147edff82a210fdbdf2aacb2a8edfdf1f6463", "disposition": "SHARED_MODULE" }, { @@ -5791,23 +5767,7 @@ "owner_tree": "debug", "consumer_tree": "qa", "target": "skills/qa/references/legacy/investigate.md", - "sha256": "d77dc18a2796f217ff20c84947236b05be730818a0430413a0d3d6bd9b6f0c08", - "disposition": "SHARED_MODULE" - }, - { - "source": "gstack-upgrade", - "owner_tree": "ship", - "consumer_tree": "debug", - "target": "skills/debug/references/legacy/gstack-upgrade.md", - "sha256": "0664ec29f1619d08ba296c2160c8c9b9f8a8116131cca8d96f6a9c8ec0f0fcef", - "disposition": "SHARED_MODULE" - }, - { - "source": "gstack-upgrade", - "owner_tree": "ship", - "consumer_tree": "review", - "target": "skills/review/references/legacy/gstack-upgrade.md", - "sha256": "0664ec29f1619d08ba296c2160c8c9b9f8a8116131cca8d96f6a9c8ec0f0fcef", + "sha256": "abc5ef0411163a0959605f259e54623033f0936942a347e74ed82f13af001a3c", "disposition": "SHARED_MODULE" }, { @@ -5815,7 +5775,7 @@ "owner_tree": "qa", "consumer_tree": "ship", "target": "skills/ship/references/legacy/canary.md", - "sha256": "c5cfaf6a835b62d59d590d37c7965204cb18961b2cc090570847a4a445270694", + "sha256": "21252c073bfa2c90f5ad6883feb8ee63d893febbd981a842ec5f7611b8807f2e", "disposition": "SHARED_MODULE" }, { @@ -5823,15 +5783,7 @@ "owner_tree": "plan", "consumer_tree": "ship", "target": "skills/ship/references/legacy/context-restore.md", - "sha256": "8e564653aa951d7067dc1218b74b229e75ef16f1b32b49307c439c8f56d62930", - "disposition": "SHARED_MODULE" - }, - { - "source": "qa-only", - "owner_tree": "qa", - "consumer_tree": "ship", - "target": "skills/ship/references/legacy/qa-only.md", - "sha256": "4f52daf45353af555fd910b960ae295653c141eb80cc024c55dc0a9607baeb10", + "sha256": "8658c29bfbe2097aa9e3cc4e6b04fd0c15f77fd3c256c238415dffa93e120982", "disposition": "SHARED_MODULE" } ], @@ -5950,8 +5902,8 @@ "target_path": "skills/plan/references/artifacts/review/TODOS-format.md", "blob_sha": "eb2f4d9418f9930f0ca6af7f8eed6ca5f1685628", "baseline_sha256": "faf7774c45356ee7990cba0289ca71bf77491394608052e4f711f5436046613c", - "sha256": "faf7774c45356ee7990cba0289ca71bf77491394608052e4f711f5436046613c", - "disposition": "VERBATIM_PORT" + "sha256": "16ff74a3e74669aa53bb3a9e34d464a5768e91618c38591b170e2d285f010a37", + "disposition": "MECHANICAL_PORT" }, { "tree": "plan", @@ -6193,8 +6145,8 @@ "target_path": "skills/review/references/artifacts/cso/ACKNOWLEDGEMENTS.md", "blob_sha": "c4b89aebd4d6d129bc508215f2b07ce21014e933", "baseline_sha256": "9988a37eb79023ad162f52c5eacb4a77d0654d912a3a7555914bbb3dcd4a4815", - "sha256": "9988a37eb79023ad162f52c5eacb4a77d0654d912a3a7555914bbb3dcd4a4815", - "disposition": "VERBATIM_PORT" + "sha256": "85fbfa9eb9d5d1dc3f105b17033c50078720c8526b3edba8d93a0259fef3309b", + "disposition": "MECHANICAL_PORT" }, { "tree": "review", @@ -6211,7 +6163,7 @@ "target_path": "skills/review/references/artifacts/review/design-checklist.md", "blob_sha": "e9d2b7117c039f82b78daec8f7db63998ee1480c", "baseline_sha256": "e6f4ac34f034005c7fc91e4008bb8101a0973a26230b86b50c4f580182e6c8bb", - "sha256": "c54596fca160b6f1a1f53e7652eee144f57c95c2ea7d13aca25620a971cbfbde", + "sha256": "ad38ac65300f2b44980816f80e0cb70e9d3c169e9ebf1055f723b0716812f191", "disposition": "MECHANICAL_PORT" }, { @@ -6292,8 +6244,8 @@ "target_path": "skills/review/references/artifacts/review/TODOS-format.md", "blob_sha": "eb2f4d9418f9930f0ca6af7f8eed6ca5f1685628", "baseline_sha256": "faf7774c45356ee7990cba0289ca71bf77491394608052e4f711f5436046613c", - "sha256": "faf7774c45356ee7990cba0289ca71bf77491394608052e4f711f5436046613c", - "disposition": "VERBATIM_PORT" + "sha256": "16ff74a3e74669aa53bb3a9e34d464a5768e91618c38591b170e2d285f010a37", + "disposition": "MECHANICAL_PORT" }, { "tree": "review", @@ -6472,7 +6424,7 @@ "target_path": "skills/ship/references/artifacts/review/design-checklist.md", "blob_sha": "e9d2b7117c039f82b78daec8f7db63998ee1480c", "baseline_sha256": "e6f4ac34f034005c7fc91e4008bb8101a0973a26230b86b50c4f580182e6c8bb", - "sha256": "c54596fca160b6f1a1f53e7652eee144f57c95c2ea7d13aca25620a971cbfbde", + "sha256": "ad38ac65300f2b44980816f80e0cb70e9d3c169e9ebf1055f723b0716812f191", "disposition": "MECHANICAL_PORT" }, { @@ -6490,8 +6442,8 @@ "target_path": "skills/ship/references/artifacts/review/TODOS-format.md", "blob_sha": "eb2f4d9418f9930f0ca6af7f8eed6ca5f1685628", "baseline_sha256": "faf7774c45356ee7990cba0289ca71bf77491394608052e4f711f5436046613c", - "sha256": "faf7774c45356ee7990cba0289ca71bf77491394608052e4f711f5436046613c", - "disposition": "VERBATIM_PORT" + "sha256": "16ff74a3e74669aa53bb3a9e34d464a5768e91618c38591b170e2d285f010a37", + "disposition": "MECHANICAL_PORT" }, { "tree": "ship", @@ -6548,22 +6500,53 @@ "win32": "browse/dist/browse.exe" }, "consumer_modules": [ + "autoplan", "benchmark", + "benchmark-models", "browse", "canary", + "codex", + "context-restore", + "context-save", + "cso", "design-consultation", "design-html", "design-review", "design-shotgun", "devex-review", + "diagram", + "document-generate", + "document-release", + "freeze", + "guard", + "health", + "investigate", + "ios-qa", + "ios-sync", "land-and-deploy", + "landing-report", + "learn", + "make-pdf", "office-hours", "open-gstack-browser", "pair-agent", + "plan-ceo-review", "plan-design-review", + "plan-devex-review", + "plan-eng-review", + "plan-tune", "qa", "qa-only", - "setup-browser-cookies" + "retro", + "review", + "scrape", + "setup-browser-cookies", + "setup-gbrain", + "ship", + "skillify", + "spec", + "sync-gbrain", + "unfreeze" ], "stable_path": "${GSTACK_HOME:-$HOME/.gstack}/bin/browse" }, @@ -6599,71 +6582,6 @@ ], "stable_path": "${GSTACK_HOME:-$HOME/.gstack}/bin/gstack-brain-cache" }, - { - "name": "gstack-brain-sync", - "source_path": "bin/gstack-brain-sync", - "consumer_modules": [ - "autoplan", - "benchmark", - "benchmark-models", - "browse", - "canary", - "claude", - "codex", - "context-restore", - "context-save", - "cso", - "design-consultation", - "design-html", - "design-review", - "design-shotgun", - "devex-review", - "diagram", - "document-generate", - "document-release", - "gstack", - "health", - "investigate", - "ios-clean", - "ios-design-review", - "ios-fix", - "ios-qa", - "ios-sync", - "land-and-deploy", - "landing-report", - "learn", - "make-pdf", - "office-hours", - "open-gstack-browser", - "pair-agent", - "plan-ceo-review", - "plan-design-review", - "plan-devex-review", - "plan-eng-review", - "plan-tune", - "qa", - "qa-only", - "retro", - "review", - "scrape", - "setup-browser-cookies", - "setup-deploy", - "setup-gbrain", - "ship", - "skillify", - "spec", - "sync-gbrain" - ], - "stable_path": "${GSTACK_HOME:-$HOME/.gstack}/bin/gstack-brain-sync" - }, - { - "name": "gstack-builder-profile", - "source_path": "bin/gstack-builder-profile", - "consumer_modules": [ - "office-hours" - ], - "stable_path": "${GSTACK_HOME:-$HOME/.gstack}/bin/gstack-builder-profile" - }, { "name": "gstack-codex-probe", "source_path": "bin/gstack-codex-probe", @@ -6676,13 +6594,39 @@ { "name": "gstack-config", "source_path": "bin/gstack-config", + "consumer_modules": [ + "autoplan", + "document-generate", + "plan-tune", + "setup-gbrain", + "ship", + "spec", + "sync-gbrain" + ], + "stable_path": "${GSTACK_HOME:-$HOME/.gstack}/bin/gstack-config" + }, + { + "name": "gstack-decision-log", + "source_path": "bin/gstack-decision-log", + "consumer_modules": [ + "ship", + "spec" + ], + "stable_path": "${GSTACK_HOME:-$HOME/.gstack}/bin/gstack-decision-log" + }, + { + "name": "gstack-design", + "source_path": "design/dist/design", + "platform_source_paths": { + "posix": "design/dist/design", + "win32": "design/dist/design.exe" + }, "consumer_modules": [ "autoplan", "benchmark", "benchmark-models", "browse", "canary", - "claude", "codex", "context-restore", "context-save", @@ -6695,12 +6639,10 @@ "diagram", "document-generate", "document-release", - "gstack", + "freeze", + "guard", "health", "investigate", - "ios-clean", - "ios-design-review", - "ios-fix", "ios-qa", "ios-sync", "land-and-deploy", @@ -6721,142 +6663,15 @@ "review", "scrape", "setup-browser-cookies", - "setup-deploy", "setup-gbrain", "ship", "skillify", "spec", - "sync-gbrain" - ], - "stable_path": "${GSTACK_HOME:-$HOME/.gstack}/bin/gstack-config" - }, - { - "name": "gstack-decision-log", - "source_path": "bin/gstack-decision-log", - "consumer_modules": [ - "autoplan", - "canary", - "claude", - "codex", - "context-restore", - "context-save", - "cso", - "design-consultation", - "design-html", - "design-review", - "design-shotgun", - "devex-review", - "diagram", - "document-generate", - "document-release", - "health", - "investigate", - "ios-clean", - "ios-design-review", - "ios-fix", - "ios-qa", - "ios-sync", - "land-and-deploy", - "landing-report", - "learn", - "office-hours", - "open-gstack-browser", - "pair-agent", - "plan-ceo-review", - "plan-design-review", - "plan-devex-review", - "plan-eng-review", - "plan-tune", - "qa", - "qa-only", - "retro", - "review", - "scrape", - "setup-deploy", - "setup-gbrain", - "ship", - "skillify", - "spec", - "sync-gbrain" - ], - "stable_path": "${GSTACK_HOME:-$HOME/.gstack}/bin/gstack-decision-log" - }, - { - "name": "gstack-decision-search", - "source_path": "bin/gstack-decision-search", - "consumer_modules": [ - "autoplan", - "canary", - "claude", - "codex", - "context-restore", - "context-save", - "cso", - "design-consultation", - "design-html", - "design-review", - "design-shotgun", - "devex-review", - "diagram", - "document-generate", - "document-release", - "health", - "investigate", - "ios-clean", - "ios-design-review", - "ios-fix", - "ios-qa", - "ios-sync", - "land-and-deploy", - "landing-report", - "learn", - "office-hours", - "open-gstack-browser", - "pair-agent", - "plan-ceo-review", - "plan-design-review", - "plan-devex-review", - "plan-eng-review", - "plan-tune", - "qa", - "qa-only", - "retro", - "review", - "scrape", - "setup-deploy", - "setup-gbrain", - "ship", - "skillify", - "spec", - "sync-gbrain" - ], - "stable_path": "${GSTACK_HOME:-$HOME/.gstack}/bin/gstack-decision-search" - }, - { - "name": "gstack-design", - "source_path": "design/dist/design", - "platform_source_paths": { - "posix": "design/dist/design", - "win32": "design/dist/design.exe" - }, - "consumer_modules": [ - "design-consultation", - "design-html", - "design-review", - "design-shotgun", - "office-hours", - "plan-design-review" + "sync-gbrain", + "unfreeze" ], "stable_path": "${GSTACK_HOME:-$HOME/.gstack}/bin/gstack-design" }, - { - "name": "gstack-detach", - "source_path": "bin/gstack-detach", - "consumer_modules": [ - "ship" - ], - "stable_path": "${GSTACK_HOME:-$HOME/.gstack}/bin/gstack-detach" - }, { "name": "gstack-developer-profile", "source_path": "bin/gstack-developer-profile", @@ -6891,63 +6706,6 @@ ], "stable_path": "${GSTACK_HOME:-$HOME/.gstack}/bin/gstack-distill-free-text" }, - { - "name": "gstack-first-task-detect", - "source_path": "bin/gstack-first-task-detect", - "consumer_modules": [ - "autoplan", - "benchmark", - "benchmark-models", - "browse", - "canary", - "claude", - "codex", - "context-restore", - "context-save", - "cso", - "design-consultation", - "design-html", - "design-review", - "design-shotgun", - "devex-review", - "diagram", - "document-generate", - "document-release", - "gstack", - "health", - "investigate", - "ios-clean", - "ios-design-review", - "ios-fix", - "ios-qa", - "ios-sync", - "land-and-deploy", - "landing-report", - "learn", - "make-pdf", - "office-hours", - "open-gstack-browser", - "pair-agent", - "plan-ceo-review", - "plan-design-review", - "plan-devex-review", - "plan-eng-review", - "plan-tune", - "qa", - "qa-only", - "retro", - "review", - "scrape", - "setup-browser-cookies", - "setup-deploy", - "setup-gbrain", - "ship", - "skillify", - "spec", - "sync-gbrain" - ], - "stable_path": "${GSTACK_HOME:-$HOME/.gstack}/bin/gstack-first-task-detect" - }, { "name": "gstack-gbrain-detect", "source_path": "bin/gstack-gbrain-detect", @@ -7041,56 +6799,19 @@ "name": "gstack-learnings-log", "source_path": "bin/gstack-learnings-log", "consumer_modules": [ - "autoplan", - "benchmark", - "benchmark-models", - "browse", - "canary", - "claude", - "codex", - "context-restore", - "context-save", "cso", "design-consultation", - "design-html", "design-review", - "design-shotgun", "devex-review", - "diagram", - "document-generate", - "document-release", - "gstack", - "health", "investigate", - "ios-clean", - "ios-design-review", - "ios-fix", - "ios-qa", - "ios-sync", - "land-and-deploy", - "landing-report", "learn", - "make-pdf", "office-hours", - "open-gstack-browser", - "pair-agent", - "plan-ceo-review", - "plan-design-review", - "plan-devex-review", - "plan-eng-review", - "plan-tune", "qa", "qa-only", "retro", "review", "scrape", - "setup-browser-cookies", - "setup-deploy", - "setup-gbrain", - "ship", - "skillify", - "spec", - "sync-gbrain" + "skillify" ], "stable_path": "${GSTACK_HOME:-$HOME/.gstack}/bin/gstack-learnings-log" }, @@ -7098,56 +6819,17 @@ "name": "gstack-learnings-search", "source_path": "bin/gstack-learnings-search", "consumer_modules": [ - "autoplan", - "benchmark", - "benchmark-models", - "browse", - "canary", - "claude", - "codex", - "context-restore", - "context-save", "cso", "design-consultation", - "design-html", "design-review", - "design-shotgun", - "devex-review", - "diagram", - "document-generate", - "document-release", - "gstack", - "health", "investigate", - "ios-clean", - "ios-design-review", - "ios-fix", - "ios-qa", - "ios-sync", - "land-and-deploy", - "landing-report", "learn", - "make-pdf", "office-hours", - "open-gstack-browser", - "pair-agent", "plan-ceo-review", - "plan-design-review", - "plan-devex-review", - "plan-eng-review", - "plan-tune", "qa", "qa-only", "retro", - "review", - "scrape", - "setup-browser-cookies", - "setup-deploy", - "setup-gbrain", - "ship", - "skillify", - "spec", - "sync-gbrain" + "review" ], "stable_path": "${GSTACK_HOME:-$HOME/.gstack}/bin/gstack-learnings-search" }, @@ -7189,9 +6871,7 @@ "guard", "investigate", "learn", - "office-hours", "plan-tune", - "ship", "spec", "unfreeze" ], @@ -7201,110 +6881,15 @@ "name": "gstack-pr-title-rewrite.sh", "source_path": "bin/gstack-pr-title-rewrite.sh", "consumer_modules": [ - "document-release", "ship" ], "stable_path": "${GSTACK_HOME:-$HOME/.gstack}/bin/gstack-pr-title-rewrite.sh" }, - { - "name": "gstack-question-log", - "source_path": "bin/gstack-question-log", - "consumer_modules": [ - "autoplan", - "canary", - "claude", - "codex", - "context-restore", - "context-save", - "cso", - "design-consultation", - "design-html", - "design-review", - "design-shotgun", - "devex-review", - "diagram", - "document-generate", - "document-release", - "health", - "investigate", - "ios-clean", - "ios-design-review", - "ios-fix", - "ios-qa", - "ios-sync", - "land-and-deploy", - "landing-report", - "learn", - "office-hours", - "open-gstack-browser", - "pair-agent", - "plan-ceo-review", - "plan-design-review", - "plan-devex-review", - "plan-eng-review", - "plan-tune", - "qa", - "qa-only", - "retro", - "review", - "scrape", - "setup-deploy", - "setup-gbrain", - "ship", - "skillify", - "spec", - "sync-gbrain" - ], - "stable_path": "${GSTACK_HOME:-$HOME/.gstack}/bin/gstack-question-log" - }, { "name": "gstack-question-preference", "source_path": "bin/gstack-question-preference", "consumer_modules": [ - "autoplan", - "canary", - "claude", - "codex", - "context-restore", - "context-save", - "cso", - "design-consultation", - "design-html", - "design-review", - "design-shotgun", - "devex-review", - "diagram", - "document-generate", - "document-release", - "health", - "investigate", - "ios-clean", - "ios-design-review", - "ios-fix", - "ios-qa", - "ios-sync", - "land-and-deploy", - "landing-report", - "learn", - "office-hours", - "open-gstack-browser", - "pair-agent", - "plan-ceo-review", - "plan-design-review", - "plan-devex-review", - "plan-eng-review", - "plan-tune", - "qa", - "qa-only", - "retro", - "review", - "scrape", - "setup-deploy", - "setup-gbrain", - "ship", - "skillify", - "spec", - "sync-gbrain" + "plan-tune" ], "stable_path": "${GSTACK_HOME:-$HOME/.gstack}/bin/gstack-question-preference" }, @@ -7313,7 +6898,6 @@ "source_path": "bin/gstack-redact", "consumer_modules": [ "document-generate", - "document-release", "ship", "spec" ], @@ -7327,63 +6911,6 @@ ], "stable_path": "${GSTACK_HOME:-$HOME/.gstack}/bin/gstack-redact-audit-log" }, - { - "name": "gstack-repo-mode", - "source_path": "bin/gstack-repo-mode", - "consumer_modules": [ - "autoplan", - "benchmark", - "benchmark-models", - "browse", - "canary", - "claude", - "codex", - "context-restore", - "context-save", - "cso", - "design-consultation", - "design-html", - "design-review", - "design-shotgun", - "devex-review", - "diagram", - "document-generate", - "document-release", - "gstack", - "health", - "investigate", - "ios-clean", - "ios-design-review", - "ios-fix", - "ios-qa", - "ios-sync", - "land-and-deploy", - "landing-report", - "learn", - "make-pdf", - "office-hours", - "open-gstack-browser", - "pair-agent", - "plan-ceo-review", - "plan-design-review", - "plan-devex-review", - "plan-eng-review", - "plan-tune", - "qa", - "qa-only", - "retro", - "review", - "scrape", - "setup-browser-cookies", - "setup-deploy", - "setup-gbrain", - "ship", - "skillify", - "spec", - "sync-gbrain" - ], - "stable_path": "${GSTACK_HOME:-$HOME/.gstack}/bin/gstack-repo-mode" - }, { "name": "gstack-review-log", "source_path": "bin/gstack-review-log", @@ -7391,12 +6918,7 @@ "autoplan", "codex", "devex-review", - "plan-ceo-review", - "plan-design-review", - "plan-devex-review", - "plan-eng-review", - "review", - "ship" + "review" ], "stable_path": "${GSTACK_HOME:-$HOME/.gstack}/bin/gstack-review-log" }, @@ -7406,109 +6928,29 @@ "consumer_modules": [ "devex-review", "land-and-deploy", - "plan-ceo-review", - "plan-design-review", - "plan-devex-review", - "plan-eng-review", "review", "ship" ], "stable_path": "${GSTACK_HOME:-$HOME/.gstack}/bin/gstack-review-read" }, - { - "name": "gstack-session-kind", - "source_path": "bin/gstack-session-kind", - "consumer_modules": [ - "autoplan", - "benchmark", - "benchmark-models", - "browse", - "canary", - "claude", - "codex", - "context-restore", - "context-save", - "cso", - "design-consultation", - "design-html", - "design-review", - "design-shotgun", - "devex-review", - "diagram", - "document-generate", - "document-release", - "gstack", - "health", - "investigate", - "ios-clean", - "ios-design-review", - "ios-fix", - "ios-qa", - "ios-sync", - "land-and-deploy", - "landing-report", - "learn", - "make-pdf", - "office-hours", - "open-gstack-browser", - "pair-agent", - "plan-ceo-review", - "plan-design-review", - "plan-devex-review", - "plan-eng-review", - "plan-tune", - "qa", - "qa-only", - "retro", - "review", - "scrape", - "setup-browser-cookies", - "setup-deploy", - "setup-gbrain", - "ship", - "skillify", - "spec", - "sync-gbrain" - ], - "stable_path": "${GSTACK_HOME:-$HOME/.gstack}/bin/gstack-session-kind" - }, { "name": "gstack-slug", "source_path": "bin/gstack-slug", "consumer_modules": [ "autoplan", "benchmark", - "benchmark-models", - "browse", "canary", - "claude", - "codex", "context-restore", "context-save", - "cso", "design-consultation", "design-html", "design-review", "design-shotgun", "devex-review", - "diagram", - "document-generate", - "document-release", - "gstack", "health", - "investigate", - "ios-clean", - "ios-design-review", - "ios-fix", - "ios-qa", - "ios-sync", "land-and-deploy", - "landing-report", "learn", - "make-pdf", "office-hours", - "open-gstack-browser", - "pair-agent", "plan-ceo-review", "plan-design-review", "plan-devex-review", @@ -7517,15 +6959,8 @@ "qa", "qa-only", "retro", - "review", - "scrape", - "setup-browser-cookies", - "setup-deploy", - "setup-gbrain", "ship", - "skillify", - "spec", - "sync-gbrain" + "spec" ], "stable_path": "${GSTACK_HOME:-$HOME/.gstack}/bin/gstack-slug" }, @@ -7538,177 +6973,6 @@ ], "stable_path": "${GSTACK_HOME:-$HOME/.gstack}/bin/gstack-taste-update" }, - { - "name": "gstack-telemetry-log", - "source_path": "bin/gstack-telemetry-log", - "consumer_modules": [ - "autoplan", - "benchmark", - "benchmark-models", - "browse", - "canary", - "claude", - "codex", - "context-restore", - "context-save", - "cso", - "design-consultation", - "design-html", - "design-review", - "design-shotgun", - "devex-review", - "diagram", - "document-generate", - "document-release", - "gstack", - "health", - "investigate", - "ios-clean", - "ios-design-review", - "ios-fix", - "ios-qa", - "ios-sync", - "land-and-deploy", - "landing-report", - "learn", - "make-pdf", - "office-hours", - "open-gstack-browser", - "pair-agent", - "plan-ceo-review", - "plan-design-review", - "plan-devex-review", - "plan-eng-review", - "plan-tune", - "qa", - "qa-only", - "retro", - "review", - "scrape", - "setup-browser-cookies", - "setup-deploy", - "setup-gbrain", - "ship", - "skillify", - "spec", - "sync-gbrain" - ], - "stable_path": "${GSTACK_HOME:-$HOME/.gstack}/bin/gstack-telemetry-log" - }, - { - "name": "gstack-timeline-log", - "source_path": "bin/gstack-timeline-log", - "consumer_modules": [ - "autoplan", - "benchmark", - "benchmark-models", - "browse", - "canary", - "claude", - "codex", - "context-restore", - "context-save", - "cso", - "design-consultation", - "design-html", - "design-review", - "design-shotgun", - "devex-review", - "diagram", - "document-generate", - "document-release", - "gstack", - "health", - "investigate", - "ios-clean", - "ios-design-review", - "ios-fix", - "ios-qa", - "ios-sync", - "land-and-deploy", - "landing-report", - "learn", - "make-pdf", - "office-hours", - "open-gstack-browser", - "pair-agent", - "plan-ceo-review", - "plan-design-review", - "plan-devex-review", - "plan-eng-review", - "plan-tune", - "qa", - "qa-only", - "retro", - "review", - "scrape", - "setup-browser-cookies", - "setup-deploy", - "setup-gbrain", - "ship", - "skillify", - "spec", - "sync-gbrain" - ], - "stable_path": "${GSTACK_HOME:-$HOME/.gstack}/bin/gstack-timeline-log" - }, - { - "name": "gstack-update-check", - "source_path": "bin/gstack-update-check", - "consumer_modules": [ - "autoplan", - "benchmark", - "benchmark-models", - "browse", - "canary", - "claude", - "codex", - "context-restore", - "context-save", - "cso", - "design-consultation", - "design-html", - "design-review", - "design-shotgun", - "devex-review", - "diagram", - "document-generate", - "document-release", - "gstack", - "health", - "investigate", - "ios-clean", - "ios-design-review", - "ios-fix", - "ios-qa", - "ios-sync", - "land-and-deploy", - "landing-report", - "learn", - "make-pdf", - "office-hours", - "open-gstack-browser", - "pair-agent", - "plan-ceo-review", - "plan-design-review", - "plan-devex-review", - "plan-eng-review", - "plan-tune", - "qa", - "qa-only", - "retro", - "review", - "scrape", - "setup-browser-cookies", - "setup-deploy", - "setup-gbrain", - "ship", - "skillify", - "spec", - "sync-gbrain" - ], - "stable_path": "${GSTACK_HOME:-$HOME/.gstack}/bin/gstack-update-check" - }, { "name": "gstack-version-bump", "source_path": "bin/gstack-version-bump", @@ -7725,7 +6989,53 @@ "win32": "make-pdf/dist/pdf.exe" }, "consumer_modules": [ - "make-pdf" + "autoplan", + "benchmark", + "benchmark-models", + "browse", + "canary", + "codex", + "context-restore", + "context-save", + "cso", + "design-consultation", + "design-html", + "design-review", + "design-shotgun", + "devex-review", + "diagram", + "document-generate", + "document-release", + "freeze", + "guard", + "health", + "investigate", + "ios-qa", + "ios-sync", + "land-and-deploy", + "landing-report", + "learn", + "make-pdf", + "office-hours", + "open-gstack-browser", + "pair-agent", + "plan-ceo-review", + "plan-design-review", + "plan-devex-review", + "plan-eng-review", + "plan-tune", + "qa", + "qa-only", + "retro", + "review", + "scrape", + "setup-browser-cookies", + "setup-gbrain", + "ship", + "skillify", + "spec", + "sync-gbrain", + "unfreeze" ], "stable_path": "${GSTACK_HOME:-$HOME/.gstack}/bin/make-pdf" }, diff --git a/evals/parity/runtime-helper-closure.json b/evals/parity/runtime-helper-closure.json index efa9dc8bc..42ca3c579 100644 --- a/evals/parity/runtime-helper-closure.json +++ b/evals/parity/runtime-helper-closure.json @@ -11,22 +11,53 @@ "win32": "browse/dist/browse.exe" }, "consumer_modules": [ + "autoplan", "benchmark", + "benchmark-models", "browse", "canary", + "codex", + "context-restore", + "context-save", + "cso", "design-consultation", "design-html", "design-review", "design-shotgun", "devex-review", + "diagram", + "document-generate", + "document-release", + "freeze", + "guard", + "health", + "investigate", + "ios-qa", + "ios-sync", "land-and-deploy", + "landing-report", + "learn", + "make-pdf", "office-hours", "open-gstack-browser", "pair-agent", + "plan-ceo-review", "plan-design-review", + "plan-devex-review", + "plan-eng-review", + "plan-tune", "qa", "qa-only", - "setup-browser-cookies" + "retro", + "review", + "scrape", + "setup-browser-cookies", + "setup-gbrain", + "ship", + "skillify", + "spec", + "sync-gbrain", + "unfreeze" ], "stable_path": "${GSTACK_HOME:-$HOME/.gstack}/bin/browse" }, @@ -62,71 +93,6 @@ ], "stable_path": "${GSTACK_HOME:-$HOME/.gstack}/bin/gstack-brain-cache" }, - { - "name": "gstack-brain-sync", - "source_path": "bin/gstack-brain-sync", - "consumer_modules": [ - "autoplan", - "benchmark", - "benchmark-models", - "browse", - "canary", - "claude", - "codex", - "context-restore", - "context-save", - "cso", - "design-consultation", - "design-html", - "design-review", - "design-shotgun", - "devex-review", - "diagram", - "document-generate", - "document-release", - "gstack", - "health", - "investigate", - "ios-clean", - "ios-design-review", - "ios-fix", - "ios-qa", - "ios-sync", - "land-and-deploy", - "landing-report", - "learn", - "make-pdf", - "office-hours", - "open-gstack-browser", - "pair-agent", - "plan-ceo-review", - "plan-design-review", - "plan-devex-review", - "plan-eng-review", - "plan-tune", - "qa", - "qa-only", - "retro", - "review", - "scrape", - "setup-browser-cookies", - "setup-deploy", - "setup-gbrain", - "ship", - "skillify", - "spec", - "sync-gbrain" - ], - "stable_path": "${GSTACK_HOME:-$HOME/.gstack}/bin/gstack-brain-sync" - }, - { - "name": "gstack-builder-profile", - "source_path": "bin/gstack-builder-profile", - "consumer_modules": [ - "office-hours" - ], - "stable_path": "${GSTACK_HOME:-$HOME/.gstack}/bin/gstack-builder-profile" - }, { "name": "gstack-codex-probe", "source_path": "bin/gstack-codex-probe", @@ -139,13 +105,39 @@ { "name": "gstack-config", "source_path": "bin/gstack-config", + "consumer_modules": [ + "autoplan", + "document-generate", + "plan-tune", + "setup-gbrain", + "ship", + "spec", + "sync-gbrain" + ], + "stable_path": "${GSTACK_HOME:-$HOME/.gstack}/bin/gstack-config" + }, + { + "name": "gstack-decision-log", + "source_path": "bin/gstack-decision-log", + "consumer_modules": [ + "ship", + "spec" + ], + "stable_path": "${GSTACK_HOME:-$HOME/.gstack}/bin/gstack-decision-log" + }, + { + "name": "gstack-design", + "source_path": "design/dist/design", + "platform_source_paths": { + "posix": "design/dist/design", + "win32": "design/dist/design.exe" + }, "consumer_modules": [ "autoplan", "benchmark", "benchmark-models", "browse", "canary", - "claude", "codex", "context-restore", "context-save", @@ -158,12 +150,10 @@ "diagram", "document-generate", "document-release", - "gstack", + "freeze", + "guard", "health", "investigate", - "ios-clean", - "ios-design-review", - "ios-fix", "ios-qa", "ios-sync", "land-and-deploy", @@ -184,142 +174,15 @@ "review", "scrape", "setup-browser-cookies", - "setup-deploy", "setup-gbrain", "ship", "skillify", "spec", - "sync-gbrain" - ], - "stable_path": "${GSTACK_HOME:-$HOME/.gstack}/bin/gstack-config" - }, - { - "name": "gstack-decision-log", - "source_path": "bin/gstack-decision-log", - "consumer_modules": [ - "autoplan", - "canary", - "claude", - "codex", - "context-restore", - "context-save", - "cso", - "design-consultation", - "design-html", - "design-review", - "design-shotgun", - "devex-review", - "diagram", - "document-generate", - "document-release", - "health", - "investigate", - "ios-clean", - "ios-design-review", - "ios-fix", - "ios-qa", - "ios-sync", - "land-and-deploy", - "landing-report", - "learn", - "office-hours", - "open-gstack-browser", - "pair-agent", - "plan-ceo-review", - "plan-design-review", - "plan-devex-review", - "plan-eng-review", - "plan-tune", - "qa", - "qa-only", - "retro", - "review", - "scrape", - "setup-deploy", - "setup-gbrain", - "ship", - "skillify", - "spec", - "sync-gbrain" - ], - "stable_path": "${GSTACK_HOME:-$HOME/.gstack}/bin/gstack-decision-log" - }, - { - "name": "gstack-decision-search", - "source_path": "bin/gstack-decision-search", - "consumer_modules": [ - "autoplan", - "canary", - "claude", - "codex", - "context-restore", - "context-save", - "cso", - "design-consultation", - "design-html", - "design-review", - "design-shotgun", - "devex-review", - "diagram", - "document-generate", - "document-release", - "health", - "investigate", - "ios-clean", - "ios-design-review", - "ios-fix", - "ios-qa", - "ios-sync", - "land-and-deploy", - "landing-report", - "learn", - "office-hours", - "open-gstack-browser", - "pair-agent", - "plan-ceo-review", - "plan-design-review", - "plan-devex-review", - "plan-eng-review", - "plan-tune", - "qa", - "qa-only", - "retro", - "review", - "scrape", - "setup-deploy", - "setup-gbrain", - "ship", - "skillify", - "spec", - "sync-gbrain" - ], - "stable_path": "${GSTACK_HOME:-$HOME/.gstack}/bin/gstack-decision-search" - }, - { - "name": "gstack-design", - "source_path": "design/dist/design", - "platform_source_paths": { - "posix": "design/dist/design", - "win32": "design/dist/design.exe" - }, - "consumer_modules": [ - "design-consultation", - "design-html", - "design-review", - "design-shotgun", - "office-hours", - "plan-design-review" + "sync-gbrain", + "unfreeze" ], "stable_path": "${GSTACK_HOME:-$HOME/.gstack}/bin/gstack-design" }, - { - "name": "gstack-detach", - "source_path": "bin/gstack-detach", - "consumer_modules": [ - "ship" - ], - "stable_path": "${GSTACK_HOME:-$HOME/.gstack}/bin/gstack-detach" - }, { "name": "gstack-developer-profile", "source_path": "bin/gstack-developer-profile", @@ -354,63 +217,6 @@ ], "stable_path": "${GSTACK_HOME:-$HOME/.gstack}/bin/gstack-distill-free-text" }, - { - "name": "gstack-first-task-detect", - "source_path": "bin/gstack-first-task-detect", - "consumer_modules": [ - "autoplan", - "benchmark", - "benchmark-models", - "browse", - "canary", - "claude", - "codex", - "context-restore", - "context-save", - "cso", - "design-consultation", - "design-html", - "design-review", - "design-shotgun", - "devex-review", - "diagram", - "document-generate", - "document-release", - "gstack", - "health", - "investigate", - "ios-clean", - "ios-design-review", - "ios-fix", - "ios-qa", - "ios-sync", - "land-and-deploy", - "landing-report", - "learn", - "make-pdf", - "office-hours", - "open-gstack-browser", - "pair-agent", - "plan-ceo-review", - "plan-design-review", - "plan-devex-review", - "plan-eng-review", - "plan-tune", - "qa", - "qa-only", - "retro", - "review", - "scrape", - "setup-browser-cookies", - "setup-deploy", - "setup-gbrain", - "ship", - "skillify", - "spec", - "sync-gbrain" - ], - "stable_path": "${GSTACK_HOME:-$HOME/.gstack}/bin/gstack-first-task-detect" - }, { "name": "gstack-gbrain-detect", "source_path": "bin/gstack-gbrain-detect", @@ -504,56 +310,19 @@ "name": "gstack-learnings-log", "source_path": "bin/gstack-learnings-log", "consumer_modules": [ - "autoplan", - "benchmark", - "benchmark-models", - "browse", - "canary", - "claude", - "codex", - "context-restore", - "context-save", "cso", "design-consultation", - "design-html", "design-review", - "design-shotgun", "devex-review", - "diagram", - "document-generate", - "document-release", - "gstack", - "health", "investigate", - "ios-clean", - "ios-design-review", - "ios-fix", - "ios-qa", - "ios-sync", - "land-and-deploy", - "landing-report", "learn", - "make-pdf", "office-hours", - "open-gstack-browser", - "pair-agent", - "plan-ceo-review", - "plan-design-review", - "plan-devex-review", - "plan-eng-review", - "plan-tune", "qa", "qa-only", "retro", "review", "scrape", - "setup-browser-cookies", - "setup-deploy", - "setup-gbrain", - "ship", - "skillify", - "spec", - "sync-gbrain" + "skillify" ], "stable_path": "${GSTACK_HOME:-$HOME/.gstack}/bin/gstack-learnings-log" }, @@ -561,56 +330,17 @@ "name": "gstack-learnings-search", "source_path": "bin/gstack-learnings-search", "consumer_modules": [ - "autoplan", - "benchmark", - "benchmark-models", - "browse", - "canary", - "claude", - "codex", - "context-restore", - "context-save", "cso", "design-consultation", - "design-html", "design-review", - "design-shotgun", - "devex-review", - "diagram", - "document-generate", - "document-release", - "gstack", - "health", "investigate", - "ios-clean", - "ios-design-review", - "ios-fix", - "ios-qa", - "ios-sync", - "land-and-deploy", - "landing-report", "learn", - "make-pdf", "office-hours", - "open-gstack-browser", - "pair-agent", "plan-ceo-review", - "plan-design-review", - "plan-devex-review", - "plan-eng-review", - "plan-tune", "qa", "qa-only", "retro", - "review", - "scrape", - "setup-browser-cookies", - "setup-deploy", - "setup-gbrain", - "ship", - "skillify", - "spec", - "sync-gbrain" + "review" ], "stable_path": "${GSTACK_HOME:-$HOME/.gstack}/bin/gstack-learnings-search" }, @@ -652,9 +382,7 @@ "guard", "investigate", "learn", - "office-hours", "plan-tune", - "ship", "spec", "unfreeze" ], @@ -664,110 +392,15 @@ "name": "gstack-pr-title-rewrite.sh", "source_path": "bin/gstack-pr-title-rewrite.sh", "consumer_modules": [ - "document-release", "ship" ], "stable_path": "${GSTACK_HOME:-$HOME/.gstack}/bin/gstack-pr-title-rewrite.sh" }, - { - "name": "gstack-question-log", - "source_path": "bin/gstack-question-log", - "consumer_modules": [ - "autoplan", - "canary", - "claude", - "codex", - "context-restore", - "context-save", - "cso", - "design-consultation", - "design-html", - "design-review", - "design-shotgun", - "devex-review", - "diagram", - "document-generate", - "document-release", - "health", - "investigate", - "ios-clean", - "ios-design-review", - "ios-fix", - "ios-qa", - "ios-sync", - "land-and-deploy", - "landing-report", - "learn", - "office-hours", - "open-gstack-browser", - "pair-agent", - "plan-ceo-review", - "plan-design-review", - "plan-devex-review", - "plan-eng-review", - "plan-tune", - "qa", - "qa-only", - "retro", - "review", - "scrape", - "setup-deploy", - "setup-gbrain", - "ship", - "skillify", - "spec", - "sync-gbrain" - ], - "stable_path": "${GSTACK_HOME:-$HOME/.gstack}/bin/gstack-question-log" - }, { "name": "gstack-question-preference", "source_path": "bin/gstack-question-preference", "consumer_modules": [ - "autoplan", - "canary", - "claude", - "codex", - "context-restore", - "context-save", - "cso", - "design-consultation", - "design-html", - "design-review", - "design-shotgun", - "devex-review", - "diagram", - "document-generate", - "document-release", - "health", - "investigate", - "ios-clean", - "ios-design-review", - "ios-fix", - "ios-qa", - "ios-sync", - "land-and-deploy", - "landing-report", - "learn", - "office-hours", - "open-gstack-browser", - "pair-agent", - "plan-ceo-review", - "plan-design-review", - "plan-devex-review", - "plan-eng-review", - "plan-tune", - "qa", - "qa-only", - "retro", - "review", - "scrape", - "setup-deploy", - "setup-gbrain", - "ship", - "skillify", - "spec", - "sync-gbrain" + "plan-tune" ], "stable_path": "${GSTACK_HOME:-$HOME/.gstack}/bin/gstack-question-preference" }, @@ -776,7 +409,6 @@ "source_path": "bin/gstack-redact", "consumer_modules": [ "document-generate", - "document-release", "ship", "spec" ], @@ -790,63 +422,6 @@ ], "stable_path": "${GSTACK_HOME:-$HOME/.gstack}/bin/gstack-redact-audit-log" }, - { - "name": "gstack-repo-mode", - "source_path": "bin/gstack-repo-mode", - "consumer_modules": [ - "autoplan", - "benchmark", - "benchmark-models", - "browse", - "canary", - "claude", - "codex", - "context-restore", - "context-save", - "cso", - "design-consultation", - "design-html", - "design-review", - "design-shotgun", - "devex-review", - "diagram", - "document-generate", - "document-release", - "gstack", - "health", - "investigate", - "ios-clean", - "ios-design-review", - "ios-fix", - "ios-qa", - "ios-sync", - "land-and-deploy", - "landing-report", - "learn", - "make-pdf", - "office-hours", - "open-gstack-browser", - "pair-agent", - "plan-ceo-review", - "plan-design-review", - "plan-devex-review", - "plan-eng-review", - "plan-tune", - "qa", - "qa-only", - "retro", - "review", - "scrape", - "setup-browser-cookies", - "setup-deploy", - "setup-gbrain", - "ship", - "skillify", - "spec", - "sync-gbrain" - ], - "stable_path": "${GSTACK_HOME:-$HOME/.gstack}/bin/gstack-repo-mode" - }, { "name": "gstack-review-log", "source_path": "bin/gstack-review-log", @@ -854,12 +429,7 @@ "autoplan", "codex", "devex-review", - "plan-ceo-review", - "plan-design-review", - "plan-devex-review", - "plan-eng-review", - "review", - "ship" + "review" ], "stable_path": "${GSTACK_HOME:-$HOME/.gstack}/bin/gstack-review-log" }, @@ -869,109 +439,29 @@ "consumer_modules": [ "devex-review", "land-and-deploy", - "plan-ceo-review", - "plan-design-review", - "plan-devex-review", - "plan-eng-review", "review", "ship" ], "stable_path": "${GSTACK_HOME:-$HOME/.gstack}/bin/gstack-review-read" }, - { - "name": "gstack-session-kind", - "source_path": "bin/gstack-session-kind", - "consumer_modules": [ - "autoplan", - "benchmark", - "benchmark-models", - "browse", - "canary", - "claude", - "codex", - "context-restore", - "context-save", - "cso", - "design-consultation", - "design-html", - "design-review", - "design-shotgun", - "devex-review", - "diagram", - "document-generate", - "document-release", - "gstack", - "health", - "investigate", - "ios-clean", - "ios-design-review", - "ios-fix", - "ios-qa", - "ios-sync", - "land-and-deploy", - "landing-report", - "learn", - "make-pdf", - "office-hours", - "open-gstack-browser", - "pair-agent", - "plan-ceo-review", - "plan-design-review", - "plan-devex-review", - "plan-eng-review", - "plan-tune", - "qa", - "qa-only", - "retro", - "review", - "scrape", - "setup-browser-cookies", - "setup-deploy", - "setup-gbrain", - "ship", - "skillify", - "spec", - "sync-gbrain" - ], - "stable_path": "${GSTACK_HOME:-$HOME/.gstack}/bin/gstack-session-kind" - }, { "name": "gstack-slug", "source_path": "bin/gstack-slug", "consumer_modules": [ "autoplan", "benchmark", - "benchmark-models", - "browse", "canary", - "claude", - "codex", "context-restore", "context-save", - "cso", "design-consultation", "design-html", "design-review", "design-shotgun", "devex-review", - "diagram", - "document-generate", - "document-release", - "gstack", "health", - "investigate", - "ios-clean", - "ios-design-review", - "ios-fix", - "ios-qa", - "ios-sync", "land-and-deploy", - "landing-report", "learn", - "make-pdf", "office-hours", - "open-gstack-browser", - "pair-agent", "plan-ceo-review", "plan-design-review", "plan-devex-review", @@ -980,15 +470,8 @@ "qa", "qa-only", "retro", - "review", - "scrape", - "setup-browser-cookies", - "setup-deploy", - "setup-gbrain", "ship", - "skillify", - "spec", - "sync-gbrain" + "spec" ], "stable_path": "${GSTACK_HOME:-$HOME/.gstack}/bin/gstack-slug" }, @@ -1001,177 +484,6 @@ ], "stable_path": "${GSTACK_HOME:-$HOME/.gstack}/bin/gstack-taste-update" }, - { - "name": "gstack-telemetry-log", - "source_path": "bin/gstack-telemetry-log", - "consumer_modules": [ - "autoplan", - "benchmark", - "benchmark-models", - "browse", - "canary", - "claude", - "codex", - "context-restore", - "context-save", - "cso", - "design-consultation", - "design-html", - "design-review", - "design-shotgun", - "devex-review", - "diagram", - "document-generate", - "document-release", - "gstack", - "health", - "investigate", - "ios-clean", - "ios-design-review", - "ios-fix", - "ios-qa", - "ios-sync", - "land-and-deploy", - "landing-report", - "learn", - "make-pdf", - "office-hours", - "open-gstack-browser", - "pair-agent", - "plan-ceo-review", - "plan-design-review", - "plan-devex-review", - "plan-eng-review", - "plan-tune", - "qa", - "qa-only", - "retro", - "review", - "scrape", - "setup-browser-cookies", - "setup-deploy", - "setup-gbrain", - "ship", - "skillify", - "spec", - "sync-gbrain" - ], - "stable_path": "${GSTACK_HOME:-$HOME/.gstack}/bin/gstack-telemetry-log" - }, - { - "name": "gstack-timeline-log", - "source_path": "bin/gstack-timeline-log", - "consumer_modules": [ - "autoplan", - "benchmark", - "benchmark-models", - "browse", - "canary", - "claude", - "codex", - "context-restore", - "context-save", - "cso", - "design-consultation", - "design-html", - "design-review", - "design-shotgun", - "devex-review", - "diagram", - "document-generate", - "document-release", - "gstack", - "health", - "investigate", - "ios-clean", - "ios-design-review", - "ios-fix", - "ios-qa", - "ios-sync", - "land-and-deploy", - "landing-report", - "learn", - "make-pdf", - "office-hours", - "open-gstack-browser", - "pair-agent", - "plan-ceo-review", - "plan-design-review", - "plan-devex-review", - "plan-eng-review", - "plan-tune", - "qa", - "qa-only", - "retro", - "review", - "scrape", - "setup-browser-cookies", - "setup-deploy", - "setup-gbrain", - "ship", - "skillify", - "spec", - "sync-gbrain" - ], - "stable_path": "${GSTACK_HOME:-$HOME/.gstack}/bin/gstack-timeline-log" - }, - { - "name": "gstack-update-check", - "source_path": "bin/gstack-update-check", - "consumer_modules": [ - "autoplan", - "benchmark", - "benchmark-models", - "browse", - "canary", - "claude", - "codex", - "context-restore", - "context-save", - "cso", - "design-consultation", - "design-html", - "design-review", - "design-shotgun", - "devex-review", - "diagram", - "document-generate", - "document-release", - "gstack", - "health", - "investigate", - "ios-clean", - "ios-design-review", - "ios-fix", - "ios-qa", - "ios-sync", - "land-and-deploy", - "landing-report", - "learn", - "make-pdf", - "office-hours", - "open-gstack-browser", - "pair-agent", - "plan-ceo-review", - "plan-design-review", - "plan-devex-review", - "plan-eng-review", - "plan-tune", - "qa", - "qa-only", - "retro", - "review", - "scrape", - "setup-browser-cookies", - "setup-deploy", - "setup-gbrain", - "ship", - "skillify", - "spec", - "sync-gbrain" - ], - "stable_path": "${GSTACK_HOME:-$HOME/.gstack}/bin/gstack-update-check" - }, { "name": "gstack-version-bump", "source_path": "bin/gstack-version-bump", @@ -1188,7 +500,53 @@ "win32": "make-pdf/dist/pdf.exe" }, "consumer_modules": [ - "make-pdf" + "autoplan", + "benchmark", + "benchmark-models", + "browse", + "canary", + "codex", + "context-restore", + "context-save", + "cso", + "design-consultation", + "design-html", + "design-review", + "design-shotgun", + "devex-review", + "diagram", + "document-generate", + "document-release", + "freeze", + "guard", + "health", + "investigate", + "ios-qa", + "ios-sync", + "land-and-deploy", + "landing-report", + "learn", + "make-pdf", + "office-hours", + "open-gstack-browser", + "pair-agent", + "plan-ceo-review", + "plan-design-review", + "plan-devex-review", + "plan-eng-review", + "plan-tune", + "qa", + "qa-only", + "retro", + "review", + "scrape", + "setup-browser-cookies", + "setup-gbrain", + "ship", + "skillify", + "spec", + "sync-gbrain", + "unfreeze" ], "stable_path": "${GSTACK_HOME:-$HOME/.gstack}/bin/make-pdf" }, diff --git a/evals/parity/transcripts/deterministic/ceo-review.json b/evals/parity/transcripts/deterministic/ceo-review.json index 78640e649..738633920 100644 --- a/evals/parity/transcripts/deterministic/ceo-review.json +++ b/evals/parity/transcripts/deterministic/ceo-review.json @@ -58,21 +58,21 @@ } }, "mechanical_port": { - "rendered_sha256": "eb1199228d8db2107eb7c4cbf889e2116117fcd54e63d5e2b9eceddacbc3bb50", + "rendered_sha256": "b2f811568920dfdbd500372df13855041ecb2b8b73e3629f3c71d87c5a78e034", "differs_from_baseline": true, - "allowed_difference": "Package-local skill, section, support-artifact, and stable runtime path relocation only." + "allowed_difference": "Canonical GStack 2 carve: exclude the retired shared onboarding wrapper and host hook advisory; resolve retired invocations to six public routes; relocate host/runtime paths; lazy-load pinned carved sections from package-local references." }, "candidate": { "target_path": "skills/plan/references/legacy/plan-ceo-review.md", - "rendered_legacy_body_sha256": "eb1199228d8db2107eb7c4cbf889e2116117fcd54e63d5e2b9eceddacbc3bb50", + "rendered_legacy_body_sha256": "b2f811568920dfdbd500372df13855041ecb2b8b73e3629f3c71d87c5a78e034", "semantic_signature": { - "normalized_sha256": "eb1199228d8db2107eb7c4cbf889e2116117fcd54e63d5e2b9eceddacbc3bb50", - "headings_sha256": "f676b247c2612dac933cdb2bf3fcb33bf0d0b494341b73306200ffa482da3f1c", - "questions_sha256": "2fdd700c0d8935a969720ad7e9e8229838886d5f24da8b6992ee8357c5d144c9", - "obligations_sha256": "71e569dd8ada96f70a46d67acfac9e531cab62d3e121fae3e66cdde9eb094a6b", - "heading_count": 99, - "question_count": 81, - "obligation_count": 178 + "normalized_sha256": "b2f811568920dfdbd500372df13855041ecb2b8b73e3629f3c71d87c5a78e034", + "headings_sha256": "aee8af5dbf376874037f52d130bc6a804d4f27c989afd787b769ef53a9bbc56b", + "questions_sha256": "442f02fed4d7a2e9e868795fe12aa5df3fb74a1dd8e538fbc76b8b1907345a81", + "obligations_sha256": "305f7bea6815e4aa1d968c20c0823e0f98f34bf475065f0091f918c8eaa5ba85", + "heading_count": 30, + "question_count": 21, + "obligation_count": 57 } }, "deterministic_comparison": { @@ -102,27 +102,27 @@ "semantic_dimensions": { "questions": { "classification": "EQUIVALENT", - "evidence": "The candidate exactly matches the deterministic installable port of the pinned 1.x workflow; only enumerated package-local path mechanics differ from the immutable oracle." + "evidence": "The candidate exactly matches the deterministic canonical specialist render of the pinned workflow. The retired shared onboarding wrapper is excluded and carved specialist phases are package-local lazy references; specialist questions, pressure, gates, evidence, artifacts, mutation boundaries, exit behavior, and voice remain governed by their source contracts." }, "question_order": { "classification": "EQUIVALENT", - "evidence": "The candidate exactly matches the deterministic installable port of the pinned 1.x workflow; only enumerated package-local path mechanics differ from the immutable oracle." + "evidence": "The candidate exactly matches the deterministic canonical specialist render of the pinned workflow. The retired shared onboarding wrapper is excluded and carved specialist phases are package-local lazy references; specialist questions, pressure, gates, evidence, artifacts, mutation boundaries, exit behavior, and voice remain governed by their source contracts." }, "follow_up_pressure": { "classification": "EQUIVALENT", - "evidence": "The candidate exactly matches the deterministic installable port of the pinned 1.x workflow; only enumerated package-local path mechanics differ from the immutable oracle." + "evidence": "The candidate exactly matches the deterministic canonical specialist render of the pinned workflow. The retired shared onboarding wrapper is excluded and carved specialist phases are package-local lazy references; specialist questions, pressure, gates, evidence, artifacts, mutation boundaries, exit behavior, and voice remain governed by their source contracts." }, "smart_skips": { "classification": "EQUIVALENT", - "evidence": "The candidate exactly matches the deterministic installable port of the pinned 1.x workflow; only enumerated package-local path mechanics differ from the immutable oracle." + "evidence": "The candidate exactly matches the deterministic canonical specialist render of the pinned workflow. The retired shared onboarding wrapper is excluded and carved specialist phases are package-local lazy references; specialist questions, pressure, gates, evidence, artifacts, mutation boundaries, exit behavior, and voice remain governed by their source contracts." }, "pushback_strength": { "classification": "EQUIVALENT", - "evidence": "The candidate exactly matches the deterministic installable port of the pinned 1.x workflow; only enumerated package-local path mechanics differ from the immutable oracle." + "evidence": "The candidate exactly matches the deterministic canonical specialist render of the pinned workflow. The retired shared onboarding wrapper is excluded and carved specialist phases are package-local lazy references; specialist questions, pressure, gates, evidence, artifacts, mutation boundaries, exit behavior, and voice remain governed by their source contracts." }, "scope_recommendation": { "classification": "EQUIVALENT", - "evidence": "The candidate exactly matches the deterministic installable port of the pinned 1.x workflow; only enumerated package-local path mechanics differ from the immutable oracle." + "evidence": "The candidate exactly matches the deterministic canonical specialist render of the pinned workflow. The retired shared onboarding wrapper is excluded and carved specialist phases are package-local lazy references; specialist questions, pressure, gates, evidence, artifacts, mutation boundaries, exit behavior, and voice remain governed by their source contracts." }, "active_reasoning_modules": { "classification": "EQUIVALENT", @@ -130,35 +130,35 @@ }, "findings": { "classification": "EQUIVALENT", - "evidence": "The candidate exactly matches the deterministic installable port of the pinned 1.x workflow; only enumerated package-local path mechanics differ from the immutable oracle." + "evidence": "The candidate exactly matches the deterministic canonical specialist render of the pinned workflow. The retired shared onboarding wrapper is excluded and carved specialist phases are package-local lazy references; specialist questions, pressure, gates, evidence, artifacts, mutation boundaries, exit behavior, and voice remain governed by their source contracts." }, "evidence": { "classification": "EQUIVALENT", - "evidence": "The candidate exactly matches the deterministic installable port of the pinned 1.x workflow; only enumerated package-local path mechanics differ from the immutable oracle." + "evidence": "The candidate exactly matches the deterministic canonical specialist render of the pinned workflow. The retired shared onboarding wrapper is excluded and carved specialist phases are package-local lazy references; specialist questions, pressure, gates, evidence, artifacts, mutation boundaries, exit behavior, and voice remain governed by their source contracts." }, "artifacts": { "classification": "EQUIVALENT", - "evidence": "The candidate exactly matches the deterministic installable port of the pinned 1.x workflow; only enumerated package-local path mechanics differ from the immutable oracle." + "evidence": "The candidate exactly matches the deterministic canonical specialist render of the pinned workflow. The retired shared onboarding wrapper is excluded and carved specialist phases are package-local lazy references; specialist questions, pressure, gates, evidence, artifacts, mutation boundaries, exit behavior, and voice remain governed by their source contracts." }, "approval_gates": { "classification": "EQUIVALENT", - "evidence": "The candidate exactly matches the deterministic installable port of the pinned 1.x workflow; only enumerated package-local path mechanics differ from the immutable oracle." + "evidence": "The candidate exactly matches the deterministic canonical specialist render of the pinned workflow. The retired shared onboarding wrapper is excluded and carved specialist phases are package-local lazy references; specialist questions, pressure, gates, evidence, artifacts, mutation boundaries, exit behavior, and voice remain governed by their source contracts." }, "mutation_behavior": { "classification": "EQUIVALENT", - "evidence": "The candidate exactly matches the deterministic installable port of the pinned 1.x workflow; only enumerated package-local path mechanics differ from the immutable oracle." + "evidence": "The candidate exactly matches the deterministic canonical specialist render of the pinned workflow. The retired shared onboarding wrapper is excluded and carved specialist phases are package-local lazy references; specialist questions, pressure, gates, evidence, artifacts, mutation boundaries, exit behavior, and voice remain governed by their source contracts." }, "completion_status": { "classification": "EQUIVALENT", - "evidence": "The candidate exactly matches the deterministic installable port of the pinned 1.x workflow; only enumerated package-local path mechanics differ from the immutable oracle." + "evidence": "The candidate exactly matches the deterministic canonical specialist render of the pinned workflow. The retired shared onboarding wrapper is excluded and carved specialist phases are package-local lazy references; specialist questions, pressure, gates, evidence, artifacts, mutation boundaries, exit behavior, and voice remain governed by their source contracts." }, "recommended_next_action": { "classification": "EQUIVALENT", - "evidence": "The candidate exactly matches the deterministic installable port of the pinned 1.x workflow; only enumerated package-local path mechanics differ from the immutable oracle." + "evidence": "The candidate exactly matches the deterministic canonical specialist render of the pinned workflow. The retired shared onboarding wrapper is excluded and carved specialist phases are package-local lazy references; specialist questions, pressure, gates, evidence, artifacts, mutation boundaries, exit behavior, and voice remain governed by their source contracts." }, "voice": { "classification": "EQUIVALENT", - "evidence": "The candidate exactly matches the deterministic installable port of the pinned 1.x workflow; only enumerated package-local path mechanics differ from the immutable oracle." + "evidence": "The candidate exactly matches the deterministic canonical specialist render of the pinned workflow. The retired shared onboarding wrapper is excluded and carved specialist phases are package-local lazy references; specialist questions, pressure, gates, evidence, artifacts, mutation boundaries, exit behavior, and voice remain governed by their source contracts." } }, "verdict": "PASS" diff --git a/evals/parity/transcripts/deterministic/code-review.json b/evals/parity/transcripts/deterministic/code-review.json index 4a8ca8c63..cb72c88ad 100644 --- a/evals/parity/transcripts/deterministic/code-review.json +++ b/evals/parity/transcripts/deterministic/code-review.json @@ -60,21 +60,21 @@ } }, "mechanical_port": { - "rendered_sha256": "25e07cb6ea0831bd9e7bd7d4606714ba38b743107a970f2b6491a246b90c7dd4", + "rendered_sha256": "9d6398fe0d2900fcce8ae1eb0b390e21f05c94d6ae3a4e21c911025cdc1fd963", "differs_from_baseline": true, - "allowed_difference": "Package-local skill, section, support-artifact, and stable runtime path relocation only." + "allowed_difference": "Canonical GStack 2 carve: exclude the retired shared onboarding wrapper and host hook advisory; resolve retired invocations to six public routes; relocate host/runtime paths; lazy-load pinned carved sections from package-local references." }, "candidate": { "target_path": "skills/review/references/legacy/review.md", - "rendered_legacy_body_sha256": "25e07cb6ea0831bd9e7bd7d4606714ba38b743107a970f2b6491a246b90c7dd4", + "rendered_legacy_body_sha256": "9d6398fe0d2900fcce8ae1eb0b390e21f05c94d6ae3a4e21c911025cdc1fd963", "semantic_signature": { - "normalized_sha256": "25e07cb6ea0831bd9e7bd7d4606714ba38b743107a970f2b6491a246b90c7dd4", - "headings_sha256": "768372517b06ffe1ce586fa63f42b3d76cd76ca5dcaccbad8eec9067a588f605", - "questions_sha256": "f7f3fcefd4cbaf2194b4ac5daaf570f9f1c6cbdb278d5df521501d92786302d3", - "obligations_sha256": "edddd4dbefea6bc978ebd45b879891e212d1bb5948c55e97144d77e18af4f2a2", - "heading_count": 61, - "question_count": 6, - "obligation_count": 107 + "normalized_sha256": "9d6398fe0d2900fcce8ae1eb0b390e21f05c94d6ae3a4e21c911025cdc1fd963", + "headings_sha256": "8ed11544f49943c2974265c86ad258f53207aaed6f289ea2e6afd1239eee26d8", + "questions_sha256": "477b52941fada9cd9a3c3863c90310e198fca3dead264006f1431b0fde20f807", + "obligations_sha256": "2e21e383f16f209a665d66710ca6d0ebae5a7fea3a200fc23506cfc584ca74b9", + "heading_count": 36, + "question_count": 3, + "obligation_count": 53 } }, "deterministic_comparison": { @@ -125,27 +125,27 @@ "semantic_dimensions": { "questions": { "classification": "EQUIVALENT", - "evidence": "The candidate exactly matches the deterministic installable port of the pinned 1.x workflow; only enumerated package-local path mechanics differ from the immutable oracle." + "evidence": "The candidate exactly matches the deterministic canonical specialist render of the pinned workflow. The retired shared onboarding wrapper is excluded and carved specialist phases are package-local lazy references; specialist questions, pressure, gates, evidence, artifacts, mutation boundaries, exit behavior, and voice remain governed by their source contracts." }, "question_order": { "classification": "EQUIVALENT", - "evidence": "The candidate exactly matches the deterministic installable port of the pinned 1.x workflow; only enumerated package-local path mechanics differ from the immutable oracle." + "evidence": "The candidate exactly matches the deterministic canonical specialist render of the pinned workflow. The retired shared onboarding wrapper is excluded and carved specialist phases are package-local lazy references; specialist questions, pressure, gates, evidence, artifacts, mutation boundaries, exit behavior, and voice remain governed by their source contracts." }, "follow_up_pressure": { "classification": "EQUIVALENT", - "evidence": "The candidate exactly matches the deterministic installable port of the pinned 1.x workflow; only enumerated package-local path mechanics differ from the immutable oracle." + "evidence": "The candidate exactly matches the deterministic canonical specialist render of the pinned workflow. The retired shared onboarding wrapper is excluded and carved specialist phases are package-local lazy references; specialist questions, pressure, gates, evidence, artifacts, mutation boundaries, exit behavior, and voice remain governed by their source contracts." }, "smart_skips": { "classification": "EQUIVALENT", - "evidence": "The candidate exactly matches the deterministic installable port of the pinned 1.x workflow; only enumerated package-local path mechanics differ from the immutable oracle." + "evidence": "The candidate exactly matches the deterministic canonical specialist render of the pinned workflow. The retired shared onboarding wrapper is excluded and carved specialist phases are package-local lazy references; specialist questions, pressure, gates, evidence, artifacts, mutation boundaries, exit behavior, and voice remain governed by their source contracts." }, "pushback_strength": { "classification": "EQUIVALENT", - "evidence": "The candidate exactly matches the deterministic installable port of the pinned 1.x workflow; only enumerated package-local path mechanics differ from the immutable oracle." + "evidence": "The candidate exactly matches the deterministic canonical specialist render of the pinned workflow. The retired shared onboarding wrapper is excluded and carved specialist phases are package-local lazy references; specialist questions, pressure, gates, evidence, artifacts, mutation boundaries, exit behavior, and voice remain governed by their source contracts." }, "scope_recommendation": { "classification": "EQUIVALENT", - "evidence": "The candidate exactly matches the deterministic installable port of the pinned 1.x workflow; only enumerated package-local path mechanics differ from the immutable oracle." + "evidence": "The candidate exactly matches the deterministic canonical specialist render of the pinned workflow. The retired shared onboarding wrapper is excluded and carved specialist phases are package-local lazy references; specialist questions, pressure, gates, evidence, artifacts, mutation boundaries, exit behavior, and voice remain governed by their source contracts." }, "active_reasoning_modules": { "classification": "EQUIVALENT", @@ -153,35 +153,35 @@ }, "findings": { "classification": "EQUIVALENT", - "evidence": "The candidate exactly matches the deterministic installable port of the pinned 1.x workflow; only enumerated package-local path mechanics differ from the immutable oracle." + "evidence": "The candidate exactly matches the deterministic canonical specialist render of the pinned workflow. The retired shared onboarding wrapper is excluded and carved specialist phases are package-local lazy references; specialist questions, pressure, gates, evidence, artifacts, mutation boundaries, exit behavior, and voice remain governed by their source contracts." }, "evidence": { "classification": "EQUIVALENT", - "evidence": "The candidate exactly matches the deterministic installable port of the pinned 1.x workflow; only enumerated package-local path mechanics differ from the immutable oracle." + "evidence": "The candidate exactly matches the deterministic canonical specialist render of the pinned workflow. The retired shared onboarding wrapper is excluded and carved specialist phases are package-local lazy references; specialist questions, pressure, gates, evidence, artifacts, mutation boundaries, exit behavior, and voice remain governed by their source contracts." }, "artifacts": { "classification": "EQUIVALENT", - "evidence": "The candidate exactly matches the deterministic installable port of the pinned 1.x workflow; only enumerated package-local path mechanics differ from the immutable oracle." + "evidence": "The candidate exactly matches the deterministic canonical specialist render of the pinned workflow. The retired shared onboarding wrapper is excluded and carved specialist phases are package-local lazy references; specialist questions, pressure, gates, evidence, artifacts, mutation boundaries, exit behavior, and voice remain governed by their source contracts." }, "approval_gates": { "classification": "EQUIVALENT", - "evidence": "The candidate exactly matches the deterministic installable port of the pinned 1.x workflow; only enumerated package-local path mechanics differ from the immutable oracle." + "evidence": "The candidate exactly matches the deterministic canonical specialist render of the pinned workflow. The retired shared onboarding wrapper is excluded and carved specialist phases are package-local lazy references; specialist questions, pressure, gates, evidence, artifacts, mutation boundaries, exit behavior, and voice remain governed by their source contracts." }, "mutation_behavior": { "classification": "EQUIVALENT", - "evidence": "The candidate exactly matches the deterministic installable port of the pinned 1.x workflow; only enumerated package-local path mechanics differ from the immutable oracle." + "evidence": "The candidate exactly matches the deterministic canonical specialist render of the pinned workflow. The retired shared onboarding wrapper is excluded and carved specialist phases are package-local lazy references; specialist questions, pressure, gates, evidence, artifacts, mutation boundaries, exit behavior, and voice remain governed by their source contracts." }, "completion_status": { "classification": "EQUIVALENT", - "evidence": "The candidate exactly matches the deterministic installable port of the pinned 1.x workflow; only enumerated package-local path mechanics differ from the immutable oracle." + "evidence": "The candidate exactly matches the deterministic canonical specialist render of the pinned workflow. The retired shared onboarding wrapper is excluded and carved specialist phases are package-local lazy references; specialist questions, pressure, gates, evidence, artifacts, mutation boundaries, exit behavior, and voice remain governed by their source contracts." }, "recommended_next_action": { "classification": "EQUIVALENT", - "evidence": "The candidate exactly matches the deterministic installable port of the pinned 1.x workflow; only enumerated package-local path mechanics differ from the immutable oracle." + "evidence": "The candidate exactly matches the deterministic canonical specialist render of the pinned workflow. The retired shared onboarding wrapper is excluded and carved specialist phases are package-local lazy references; specialist questions, pressure, gates, evidence, artifacts, mutation boundaries, exit behavior, and voice remain governed by their source contracts." }, "voice": { "classification": "EQUIVALENT", - "evidence": "The candidate exactly matches the deterministic installable port of the pinned 1.x workflow; only enumerated package-local path mechanics differ from the immutable oracle." + "evidence": "The candidate exactly matches the deterministic canonical specialist render of the pinned workflow. The retired shared onboarding wrapper is excluded and carved specialist phases are package-local lazy references; specialist questions, pressure, gates, evidence, artifacts, mutation boundaries, exit behavior, and voice remain governed by their source contracts." } }, "verdict": "PASS" diff --git a/evals/parity/transcripts/deterministic/debug.json b/evals/parity/transcripts/deterministic/debug.json index 798662b4e..de79d2bae 100644 --- a/evals/parity/transcripts/deterministic/debug.json +++ b/evals/parity/transcripts/deterministic/debug.json @@ -53,21 +53,21 @@ } }, "mechanical_port": { - "rendered_sha256": "23e220a2d61b665f9e48b094855336fac3ca9187be12675cb721db2bc27f7c30", + "rendered_sha256": "91f19c8d736a9a6077941f63f52853634325059e5ac4d8808c4ba6dbceca1a30", "differs_from_baseline": true, - "allowed_difference": "Package-local skill, section, support-artifact, and stable runtime path relocation only." + "allowed_difference": "Canonical GStack 2 carve: exclude the retired shared onboarding wrapper and host hook advisory; resolve retired invocations to six public routes; relocate host/runtime paths; lazy-load pinned carved sections from package-local references." }, "candidate": { "target_path": "skills/debug/references/legacy/investigate.md", - "rendered_legacy_body_sha256": "23e220a2d61b665f9e48b094855336fac3ca9187be12675cb721db2bc27f7c30", + "rendered_legacy_body_sha256": "91f19c8d736a9a6077941f63f52853634325059e5ac4d8808c4ba6dbceca1a30", "semantic_signature": { - "normalized_sha256": "23e220a2d61b665f9e48b094855336fac3ca9187be12675cb721db2bc27f7c30", - "headings_sha256": "15edb0afd317abcded3f875b25ea5fedc54e2cfcb1122d2062cc51501da227f4", - "questions_sha256": "eec3a3778c75e566d1cd424a34ebc6624075d8c51d48ecc84b7b69181914ac4b", - "obligations_sha256": "b7cef0c3cad67465da72123a1ff68d395c5f8386e796670c2c7c77537dd9bb78", - "heading_count": 36, - "question_count": 4, - "obligation_count": 68 + "normalized_sha256": "91f19c8d736a9a6077941f63f52853634325059e5ac4d8808c4ba6dbceca1a30", + "headings_sha256": "aae491f6430a9d113ece7954490bd9db9d546e55ee5f10f2ac6cd67dc4d4e284", + "questions_sha256": "9e058bbca5f57ed0c9c4724b67d640e15872a0ad283d496b8913d2dd6cfe897d", + "obligations_sha256": "d832c32c233beb080da54a3ebdc627da9535a158f9772dce4abee15742996a1c", + "heading_count": 13, + "question_count": 1, + "obligation_count": 15 } }, "deterministic_comparison": { @@ -104,27 +104,27 @@ "semantic_dimensions": { "questions": { "classification": "EQUIVALENT", - "evidence": "The candidate exactly matches the deterministic installable port of the pinned 1.x workflow; only enumerated package-local path mechanics differ from the immutable oracle." + "evidence": "The candidate exactly matches the deterministic canonical specialist render of the pinned workflow. The retired shared onboarding wrapper is excluded and carved specialist phases are package-local lazy references; specialist questions, pressure, gates, evidence, artifacts, mutation boundaries, exit behavior, and voice remain governed by their source contracts." }, "question_order": { "classification": "EQUIVALENT", - "evidence": "The candidate exactly matches the deterministic installable port of the pinned 1.x workflow; only enumerated package-local path mechanics differ from the immutable oracle." + "evidence": "The candidate exactly matches the deterministic canonical specialist render of the pinned workflow. The retired shared onboarding wrapper is excluded and carved specialist phases are package-local lazy references; specialist questions, pressure, gates, evidence, artifacts, mutation boundaries, exit behavior, and voice remain governed by their source contracts." }, "follow_up_pressure": { "classification": "EQUIVALENT", - "evidence": "The candidate exactly matches the deterministic installable port of the pinned 1.x workflow; only enumerated package-local path mechanics differ from the immutable oracle." + "evidence": "The candidate exactly matches the deterministic canonical specialist render of the pinned workflow. The retired shared onboarding wrapper is excluded and carved specialist phases are package-local lazy references; specialist questions, pressure, gates, evidence, artifacts, mutation boundaries, exit behavior, and voice remain governed by their source contracts." }, "smart_skips": { "classification": "EQUIVALENT", - "evidence": "The candidate exactly matches the deterministic installable port of the pinned 1.x workflow; only enumerated package-local path mechanics differ from the immutable oracle." + "evidence": "The candidate exactly matches the deterministic canonical specialist render of the pinned workflow. The retired shared onboarding wrapper is excluded and carved specialist phases are package-local lazy references; specialist questions, pressure, gates, evidence, artifacts, mutation boundaries, exit behavior, and voice remain governed by their source contracts." }, "pushback_strength": { "classification": "EQUIVALENT", - "evidence": "The candidate exactly matches the deterministic installable port of the pinned 1.x workflow; only enumerated package-local path mechanics differ from the immutable oracle." + "evidence": "The candidate exactly matches the deterministic canonical specialist render of the pinned workflow. The retired shared onboarding wrapper is excluded and carved specialist phases are package-local lazy references; specialist questions, pressure, gates, evidence, artifacts, mutation boundaries, exit behavior, and voice remain governed by their source contracts." }, "scope_recommendation": { "classification": "EQUIVALENT", - "evidence": "The candidate exactly matches the deterministic installable port of the pinned 1.x workflow; only enumerated package-local path mechanics differ from the immutable oracle." + "evidence": "The candidate exactly matches the deterministic canonical specialist render of the pinned workflow. The retired shared onboarding wrapper is excluded and carved specialist phases are package-local lazy references; specialist questions, pressure, gates, evidence, artifacts, mutation boundaries, exit behavior, and voice remain governed by their source contracts." }, "active_reasoning_modules": { "classification": "EQUIVALENT", @@ -132,35 +132,35 @@ }, "findings": { "classification": "EQUIVALENT", - "evidence": "The candidate exactly matches the deterministic installable port of the pinned 1.x workflow; only enumerated package-local path mechanics differ from the immutable oracle." + "evidence": "The candidate exactly matches the deterministic canonical specialist render of the pinned workflow. The retired shared onboarding wrapper is excluded and carved specialist phases are package-local lazy references; specialist questions, pressure, gates, evidence, artifacts, mutation boundaries, exit behavior, and voice remain governed by their source contracts." }, "evidence": { "classification": "EQUIVALENT", - "evidence": "The candidate exactly matches the deterministic installable port of the pinned 1.x workflow; only enumerated package-local path mechanics differ from the immutable oracle." + "evidence": "The candidate exactly matches the deterministic canonical specialist render of the pinned workflow. The retired shared onboarding wrapper is excluded and carved specialist phases are package-local lazy references; specialist questions, pressure, gates, evidence, artifacts, mutation boundaries, exit behavior, and voice remain governed by their source contracts." }, "artifacts": { "classification": "EQUIVALENT", - "evidence": "The candidate exactly matches the deterministic installable port of the pinned 1.x workflow; only enumerated package-local path mechanics differ from the immutable oracle." + "evidence": "The candidate exactly matches the deterministic canonical specialist render of the pinned workflow. The retired shared onboarding wrapper is excluded and carved specialist phases are package-local lazy references; specialist questions, pressure, gates, evidence, artifacts, mutation boundaries, exit behavior, and voice remain governed by their source contracts." }, "approval_gates": { "classification": "EQUIVALENT", - "evidence": "The candidate exactly matches the deterministic installable port of the pinned 1.x workflow; only enumerated package-local path mechanics differ from the immutable oracle." + "evidence": "The candidate exactly matches the deterministic canonical specialist render of the pinned workflow. The retired shared onboarding wrapper is excluded and carved specialist phases are package-local lazy references; specialist questions, pressure, gates, evidence, artifacts, mutation boundaries, exit behavior, and voice remain governed by their source contracts." }, "mutation_behavior": { "classification": "EQUIVALENT", - "evidence": "The candidate exactly matches the deterministic installable port of the pinned 1.x workflow; only enumerated package-local path mechanics differ from the immutable oracle." + "evidence": "The candidate exactly matches the deterministic canonical specialist render of the pinned workflow. The retired shared onboarding wrapper is excluded and carved specialist phases are package-local lazy references; specialist questions, pressure, gates, evidence, artifacts, mutation boundaries, exit behavior, and voice remain governed by their source contracts." }, "completion_status": { "classification": "EQUIVALENT", - "evidence": "The candidate exactly matches the deterministic installable port of the pinned 1.x workflow; only enumerated package-local path mechanics differ from the immutable oracle." + "evidence": "The candidate exactly matches the deterministic canonical specialist render of the pinned workflow. The retired shared onboarding wrapper is excluded and carved specialist phases are package-local lazy references; specialist questions, pressure, gates, evidence, artifacts, mutation boundaries, exit behavior, and voice remain governed by their source contracts." }, "recommended_next_action": { "classification": "EQUIVALENT", - "evidence": "The candidate exactly matches the deterministic installable port of the pinned 1.x workflow; only enumerated package-local path mechanics differ from the immutable oracle." + "evidence": "The candidate exactly matches the deterministic canonical specialist render of the pinned workflow. The retired shared onboarding wrapper is excluded and carved specialist phases are package-local lazy references; specialist questions, pressure, gates, evidence, artifacts, mutation boundaries, exit behavior, and voice remain governed by their source contracts." }, "voice": { "classification": "EQUIVALENT", - "evidence": "The candidate exactly matches the deterministic installable port of the pinned 1.x workflow; only enumerated package-local path mechanics differ from the immutable oracle." + "evidence": "The candidate exactly matches the deterministic canonical specialist render of the pinned workflow. The retired shared onboarding wrapper is excluded and carved specialist phases are package-local lazy references; specialist questions, pressure, gates, evidence, artifacts, mutation boundaries, exit behavior, and voice remain governed by their source contracts." } }, "verdict": "PASS" diff --git a/evals/parity/transcripts/deterministic/design-alternatives.json b/evals/parity/transcripts/deterministic/design-alternatives.json index dcd0c8e9b..cf0dbe6ac 100644 --- a/evals/parity/transcripts/deterministic/design-alternatives.json +++ b/evals/parity/transcripts/deterministic/design-alternatives.json @@ -57,21 +57,21 @@ } }, "mechanical_port": { - "rendered_sha256": "2ffa676332b91cb2f4f0ae4a08d917dd43a767995b33d960895c15e93fb7c73c", + "rendered_sha256": "1db4cd23ee115ce841d2db898cc442141588635d43018393703aa28ce40d48f2", "differs_from_baseline": true, - "allowed_difference": "Package-local skill, section, support-artifact, and stable runtime path relocation only." + "allowed_difference": "Canonical GStack 2 carve: exclude the retired shared onboarding wrapper and host hook advisory; resolve retired invocations to six public routes; relocate host/runtime paths; lazy-load pinned carved sections from package-local references." }, "candidate": { "target_path": "skills/design/references/legacy/design-shotgun.md", - "rendered_legacy_body_sha256": "2ffa676332b91cb2f4f0ae4a08d917dd43a767995b33d960895c15e93fb7c73c", + "rendered_legacy_body_sha256": "1db4cd23ee115ce841d2db898cc442141588635d43018393703aa28ce40d48f2", "semantic_signature": { - "normalized_sha256": "2ffa676332b91cb2f4f0ae4a08d917dd43a767995b33d960895c15e93fb7c73c", - "headings_sha256": "2aa7a234cd1a43b129ddd0910297825adca7f7f352893366652379f726c1deb3", - "questions_sha256": "8b62e62ce14abee95f662f8c9ae8dec575b928254949b3e5a1115e878e609b56", - "obligations_sha256": "67396cd25988a1d56b935b32b085895f1eda72af5021c69d429ccadf198f681e", - "heading_count": 46, - "question_count": 7, - "obligation_count": 85 + "normalized_sha256": "1db4cd23ee115ce841d2db898cc442141588635d43018393703aa28ce40d48f2", + "headings_sha256": "54756bba54ab9183163992eb243290a41b99f896b5993d7f7a0242a5434e0ffe", + "questions_sha256": "2492e14286f1029d529a7ecb1fe28cffc94f2f4c922521e73b26a23147a60e29", + "obligations_sha256": "8d595f621cb352052f374d49204597142f011694db5953fb826d46c68946e94e", + "heading_count": 23, + "question_count": 4, + "obligation_count": 33 } }, "deterministic_comparison": { @@ -101,27 +101,27 @@ "semantic_dimensions": { "questions": { "classification": "EQUIVALENT", - "evidence": "The candidate exactly matches the deterministic installable port of the pinned 1.x workflow; only enumerated package-local path mechanics differ from the immutable oracle." + "evidence": "The candidate exactly matches the deterministic canonical specialist render of the pinned workflow. The retired shared onboarding wrapper is excluded and carved specialist phases are package-local lazy references; specialist questions, pressure, gates, evidence, artifacts, mutation boundaries, exit behavior, and voice remain governed by their source contracts." }, "question_order": { "classification": "EQUIVALENT", - "evidence": "The candidate exactly matches the deterministic installable port of the pinned 1.x workflow; only enumerated package-local path mechanics differ from the immutable oracle." + "evidence": "The candidate exactly matches the deterministic canonical specialist render of the pinned workflow. The retired shared onboarding wrapper is excluded and carved specialist phases are package-local lazy references; specialist questions, pressure, gates, evidence, artifacts, mutation boundaries, exit behavior, and voice remain governed by their source contracts." }, "follow_up_pressure": { "classification": "EQUIVALENT", - "evidence": "The candidate exactly matches the deterministic installable port of the pinned 1.x workflow; only enumerated package-local path mechanics differ from the immutable oracle." + "evidence": "The candidate exactly matches the deterministic canonical specialist render of the pinned workflow. The retired shared onboarding wrapper is excluded and carved specialist phases are package-local lazy references; specialist questions, pressure, gates, evidence, artifacts, mutation boundaries, exit behavior, and voice remain governed by their source contracts." }, "smart_skips": { "classification": "EQUIVALENT", - "evidence": "The candidate exactly matches the deterministic installable port of the pinned 1.x workflow; only enumerated package-local path mechanics differ from the immutable oracle." + "evidence": "The candidate exactly matches the deterministic canonical specialist render of the pinned workflow. The retired shared onboarding wrapper is excluded and carved specialist phases are package-local lazy references; specialist questions, pressure, gates, evidence, artifacts, mutation boundaries, exit behavior, and voice remain governed by their source contracts." }, "pushback_strength": { "classification": "EQUIVALENT", - "evidence": "The candidate exactly matches the deterministic installable port of the pinned 1.x workflow; only enumerated package-local path mechanics differ from the immutable oracle." + "evidence": "The candidate exactly matches the deterministic canonical specialist render of the pinned workflow. The retired shared onboarding wrapper is excluded and carved specialist phases are package-local lazy references; specialist questions, pressure, gates, evidence, artifacts, mutation boundaries, exit behavior, and voice remain governed by their source contracts." }, "scope_recommendation": { "classification": "EQUIVALENT", - "evidence": "The candidate exactly matches the deterministic installable port of the pinned 1.x workflow; only enumerated package-local path mechanics differ from the immutable oracle." + "evidence": "The candidate exactly matches the deterministic canonical specialist render of the pinned workflow. The retired shared onboarding wrapper is excluded and carved specialist phases are package-local lazy references; specialist questions, pressure, gates, evidence, artifacts, mutation boundaries, exit behavior, and voice remain governed by their source contracts." }, "active_reasoning_modules": { "classification": "EQUIVALENT", @@ -129,35 +129,35 @@ }, "findings": { "classification": "EQUIVALENT", - "evidence": "The candidate exactly matches the deterministic installable port of the pinned 1.x workflow; only enumerated package-local path mechanics differ from the immutable oracle." + "evidence": "The candidate exactly matches the deterministic canonical specialist render of the pinned workflow. The retired shared onboarding wrapper is excluded and carved specialist phases are package-local lazy references; specialist questions, pressure, gates, evidence, artifacts, mutation boundaries, exit behavior, and voice remain governed by their source contracts." }, "evidence": { "classification": "EQUIVALENT", - "evidence": "The candidate exactly matches the deterministic installable port of the pinned 1.x workflow; only enumerated package-local path mechanics differ from the immutable oracle." + "evidence": "The candidate exactly matches the deterministic canonical specialist render of the pinned workflow. The retired shared onboarding wrapper is excluded and carved specialist phases are package-local lazy references; specialist questions, pressure, gates, evidence, artifacts, mutation boundaries, exit behavior, and voice remain governed by their source contracts." }, "artifacts": { "classification": "EQUIVALENT", - "evidence": "The candidate exactly matches the deterministic installable port of the pinned 1.x workflow; only enumerated package-local path mechanics differ from the immutable oracle." + "evidence": "The candidate exactly matches the deterministic canonical specialist render of the pinned workflow. The retired shared onboarding wrapper is excluded and carved specialist phases are package-local lazy references; specialist questions, pressure, gates, evidence, artifacts, mutation boundaries, exit behavior, and voice remain governed by their source contracts." }, "approval_gates": { "classification": "EQUIVALENT", - "evidence": "The candidate exactly matches the deterministic installable port of the pinned 1.x workflow; only enumerated package-local path mechanics differ from the immutable oracle." + "evidence": "The candidate exactly matches the deterministic canonical specialist render of the pinned workflow. The retired shared onboarding wrapper is excluded and carved specialist phases are package-local lazy references; specialist questions, pressure, gates, evidence, artifacts, mutation boundaries, exit behavior, and voice remain governed by their source contracts." }, "mutation_behavior": { "classification": "EQUIVALENT", - "evidence": "The candidate exactly matches the deterministic installable port of the pinned 1.x workflow; only enumerated package-local path mechanics differ from the immutable oracle." + "evidence": "The candidate exactly matches the deterministic canonical specialist render of the pinned workflow. The retired shared onboarding wrapper is excluded and carved specialist phases are package-local lazy references; specialist questions, pressure, gates, evidence, artifacts, mutation boundaries, exit behavior, and voice remain governed by their source contracts." }, "completion_status": { "classification": "EQUIVALENT", - "evidence": "The candidate exactly matches the deterministic installable port of the pinned 1.x workflow; only enumerated package-local path mechanics differ from the immutable oracle." + "evidence": "The candidate exactly matches the deterministic canonical specialist render of the pinned workflow. The retired shared onboarding wrapper is excluded and carved specialist phases are package-local lazy references; specialist questions, pressure, gates, evidence, artifacts, mutation boundaries, exit behavior, and voice remain governed by their source contracts." }, "recommended_next_action": { "classification": "EQUIVALENT", - "evidence": "The candidate exactly matches the deterministic installable port of the pinned 1.x workflow; only enumerated package-local path mechanics differ from the immutable oracle." + "evidence": "The candidate exactly matches the deterministic canonical specialist render of the pinned workflow. The retired shared onboarding wrapper is excluded and carved specialist phases are package-local lazy references; specialist questions, pressure, gates, evidence, artifacts, mutation boundaries, exit behavior, and voice remain governed by their source contracts." }, "voice": { "classification": "EQUIVALENT", - "evidence": "The candidate exactly matches the deterministic installable port of the pinned 1.x workflow; only enumerated package-local path mechanics differ from the immutable oracle." + "evidence": "The candidate exactly matches the deterministic canonical specialist render of the pinned workflow. The retired shared onboarding wrapper is excluded and carved specialist phases are package-local lazy references; specialist questions, pressure, gates, evidence, artifacts, mutation boundaries, exit behavior, and voice remain governed by their source contracts." } }, "verdict": "PASS" diff --git a/evals/parity/transcripts/deterministic/design-consultation.json b/evals/parity/transcripts/deterministic/design-consultation.json index aea857fb5..787ece308 100644 --- a/evals/parity/transcripts/deterministic/design-consultation.json +++ b/evals/parity/transcripts/deterministic/design-consultation.json @@ -57,21 +57,21 @@ } }, "mechanical_port": { - "rendered_sha256": "2753c3423f22f9ef2b3baf31069bd2ac6951e7bc69cc70f28c8da5c07580ab26", + "rendered_sha256": "afa1f2b58d22d9f0f9064336ce7e9836430a298e1deb56f5330390f91df3f680", "differs_from_baseline": true, - "allowed_difference": "Package-local skill, section, support-artifact, and stable runtime path relocation only." + "allowed_difference": "Canonical GStack 2 carve: exclude the retired shared onboarding wrapper and host hook advisory; resolve retired invocations to six public routes; relocate host/runtime paths; lazy-load pinned carved sections from package-local references." }, "candidate": { "target_path": "skills/design/references/legacy/design-consultation.md", - "rendered_legacy_body_sha256": "2753c3423f22f9ef2b3baf31069bd2ac6951e7bc69cc70f28c8da5c07580ab26", + "rendered_legacy_body_sha256": "afa1f2b58d22d9f0f9064336ce7e9836430a298e1deb56f5330390f91df3f680", "semantic_signature": { - "normalized_sha256": "2753c3423f22f9ef2b3baf31069bd2ac6951e7bc69cc70f28c8da5c07580ab26", - "headings_sha256": "4262d542408dd44833fd9f12ec4f55ac87d651adb5fa493ee12bda77c1e4b466", - "questions_sha256": "a19d5d23a525813c590a16d8f36c9e781b612aad6fd94fdc844f38d4ef4fdc02", - "obligations_sha256": "b7d5417c5d371550dcf22b1364e2dfa5a6719dc521e31dbfebd5427ae351b59c", - "heading_count": 46, - "question_count": 5, - "obligation_count": 83 + "normalized_sha256": "afa1f2b58d22d9f0f9064336ce7e9836430a298e1deb56f5330390f91df3f680", + "headings_sha256": "78cdfd5aa0c0264964542d45190c919c7adb8c01ea68a22d67dd0fad538cc643", + "questions_sha256": "91adedef9aa8000a9aa3385381227d149dbc52cbf2d127656bf0697510b62906", + "obligations_sha256": "bca9ced676d3f62fad557554c5268ff0b339d39ab028b1022ddff1a930bd24f7", + "heading_count": 12, + "question_count": 2, + "obligation_count": 17 } }, "deterministic_comparison": { @@ -108,27 +108,27 @@ "semantic_dimensions": { "questions": { "classification": "EQUIVALENT", - "evidence": "The candidate exactly matches the deterministic installable port of the pinned 1.x workflow; only enumerated package-local path mechanics differ from the immutable oracle." + "evidence": "The candidate exactly matches the deterministic canonical specialist render of the pinned workflow. The retired shared onboarding wrapper is excluded and carved specialist phases are package-local lazy references; specialist questions, pressure, gates, evidence, artifacts, mutation boundaries, exit behavior, and voice remain governed by their source contracts." }, "question_order": { "classification": "EQUIVALENT", - "evidence": "The candidate exactly matches the deterministic installable port of the pinned 1.x workflow; only enumerated package-local path mechanics differ from the immutable oracle." + "evidence": "The candidate exactly matches the deterministic canonical specialist render of the pinned workflow. The retired shared onboarding wrapper is excluded and carved specialist phases are package-local lazy references; specialist questions, pressure, gates, evidence, artifacts, mutation boundaries, exit behavior, and voice remain governed by their source contracts." }, "follow_up_pressure": { "classification": "EQUIVALENT", - "evidence": "The candidate exactly matches the deterministic installable port of the pinned 1.x workflow; only enumerated package-local path mechanics differ from the immutable oracle." + "evidence": "The candidate exactly matches the deterministic canonical specialist render of the pinned workflow. The retired shared onboarding wrapper is excluded and carved specialist phases are package-local lazy references; specialist questions, pressure, gates, evidence, artifacts, mutation boundaries, exit behavior, and voice remain governed by their source contracts." }, "smart_skips": { "classification": "EQUIVALENT", - "evidence": "The candidate exactly matches the deterministic installable port of the pinned 1.x workflow; only enumerated package-local path mechanics differ from the immutable oracle." + "evidence": "The candidate exactly matches the deterministic canonical specialist render of the pinned workflow. The retired shared onboarding wrapper is excluded and carved specialist phases are package-local lazy references; specialist questions, pressure, gates, evidence, artifacts, mutation boundaries, exit behavior, and voice remain governed by their source contracts." }, "pushback_strength": { "classification": "EQUIVALENT", - "evidence": "The candidate exactly matches the deterministic installable port of the pinned 1.x workflow; only enumerated package-local path mechanics differ from the immutable oracle." + "evidence": "The candidate exactly matches the deterministic canonical specialist render of the pinned workflow. The retired shared onboarding wrapper is excluded and carved specialist phases are package-local lazy references; specialist questions, pressure, gates, evidence, artifacts, mutation boundaries, exit behavior, and voice remain governed by their source contracts." }, "scope_recommendation": { "classification": "EQUIVALENT", - "evidence": "The candidate exactly matches the deterministic installable port of the pinned 1.x workflow; only enumerated package-local path mechanics differ from the immutable oracle." + "evidence": "The candidate exactly matches the deterministic canonical specialist render of the pinned workflow. The retired shared onboarding wrapper is excluded and carved specialist phases are package-local lazy references; specialist questions, pressure, gates, evidence, artifacts, mutation boundaries, exit behavior, and voice remain governed by their source contracts." }, "active_reasoning_modules": { "classification": "EQUIVALENT", @@ -136,35 +136,35 @@ }, "findings": { "classification": "EQUIVALENT", - "evidence": "The candidate exactly matches the deterministic installable port of the pinned 1.x workflow; only enumerated package-local path mechanics differ from the immutable oracle." + "evidence": "The candidate exactly matches the deterministic canonical specialist render of the pinned workflow. The retired shared onboarding wrapper is excluded and carved specialist phases are package-local lazy references; specialist questions, pressure, gates, evidence, artifacts, mutation boundaries, exit behavior, and voice remain governed by their source contracts." }, "evidence": { "classification": "EQUIVALENT", - "evidence": "The candidate exactly matches the deterministic installable port of the pinned 1.x workflow; only enumerated package-local path mechanics differ from the immutable oracle." + "evidence": "The candidate exactly matches the deterministic canonical specialist render of the pinned workflow. The retired shared onboarding wrapper is excluded and carved specialist phases are package-local lazy references; specialist questions, pressure, gates, evidence, artifacts, mutation boundaries, exit behavior, and voice remain governed by their source contracts." }, "artifacts": { "classification": "EQUIVALENT", - "evidence": "The candidate exactly matches the deterministic installable port of the pinned 1.x workflow; only enumerated package-local path mechanics differ from the immutable oracle." + "evidence": "The candidate exactly matches the deterministic canonical specialist render of the pinned workflow. The retired shared onboarding wrapper is excluded and carved specialist phases are package-local lazy references; specialist questions, pressure, gates, evidence, artifacts, mutation boundaries, exit behavior, and voice remain governed by their source contracts." }, "approval_gates": { "classification": "EQUIVALENT", - "evidence": "The candidate exactly matches the deterministic installable port of the pinned 1.x workflow; only enumerated package-local path mechanics differ from the immutable oracle." + "evidence": "The candidate exactly matches the deterministic canonical specialist render of the pinned workflow. The retired shared onboarding wrapper is excluded and carved specialist phases are package-local lazy references; specialist questions, pressure, gates, evidence, artifacts, mutation boundaries, exit behavior, and voice remain governed by their source contracts." }, "mutation_behavior": { "classification": "EQUIVALENT", - "evidence": "The candidate exactly matches the deterministic installable port of the pinned 1.x workflow; only enumerated package-local path mechanics differ from the immutable oracle." + "evidence": "The candidate exactly matches the deterministic canonical specialist render of the pinned workflow. The retired shared onboarding wrapper is excluded and carved specialist phases are package-local lazy references; specialist questions, pressure, gates, evidence, artifacts, mutation boundaries, exit behavior, and voice remain governed by their source contracts." }, "completion_status": { "classification": "EQUIVALENT", - "evidence": "The candidate exactly matches the deterministic installable port of the pinned 1.x workflow; only enumerated package-local path mechanics differ from the immutable oracle." + "evidence": "The candidate exactly matches the deterministic canonical specialist render of the pinned workflow. The retired shared onboarding wrapper is excluded and carved specialist phases are package-local lazy references; specialist questions, pressure, gates, evidence, artifacts, mutation boundaries, exit behavior, and voice remain governed by their source contracts." }, "recommended_next_action": { "classification": "EQUIVALENT", - "evidence": "The candidate exactly matches the deterministic installable port of the pinned 1.x workflow; only enumerated package-local path mechanics differ from the immutable oracle." + "evidence": "The candidate exactly matches the deterministic canonical specialist render of the pinned workflow. The retired shared onboarding wrapper is excluded and carved specialist phases are package-local lazy references; specialist questions, pressure, gates, evidence, artifacts, mutation boundaries, exit behavior, and voice remain governed by their source contracts." }, "voice": { "classification": "EQUIVALENT", - "evidence": "The candidate exactly matches the deterministic installable port of the pinned 1.x workflow; only enumerated package-local path mechanics differ from the immutable oracle." + "evidence": "The candidate exactly matches the deterministic canonical specialist render of the pinned workflow. The retired shared onboarding wrapper is excluded and carved specialist phases are package-local lazy references; specialist questions, pressure, gates, evidence, artifacts, mutation boundaries, exit behavior, and voice remain governed by their source contracts." } }, "verdict": "PASS" diff --git a/evals/parity/transcripts/deterministic/design-review.json b/evals/parity/transcripts/deterministic/design-review.json index af8c6e293..8ef96a7e4 100644 --- a/evals/parity/transcripts/deterministic/design-review.json +++ b/evals/parity/transcripts/deterministic/design-review.json @@ -57,21 +57,21 @@ } }, "mechanical_port": { - "rendered_sha256": "8711f4910f9cb9d022d024c432093bccbcf8d4e74250a3a25f915eb086de6c5a", + "rendered_sha256": "33584047a11aa46a1b6a2bef5bf97a4d0b443bb6c9542685732e7d4dff795a2e", "differs_from_baseline": true, - "allowed_difference": "Package-local skill, section, support-artifact, and stable runtime path relocation only." + "allowed_difference": "Canonical GStack 2 carve: exclude the retired shared onboarding wrapper and host hook advisory; resolve retired invocations to six public routes; relocate host/runtime paths; lazy-load pinned carved sections from package-local references." }, "candidate": { "target_path": "skills/design/references/legacy/design-review.md", - "rendered_legacy_body_sha256": "8711f4910f9cb9d022d024c432093bccbcf8d4e74250a3a25f915eb086de6c5a", + "rendered_legacy_body_sha256": "33584047a11aa46a1b6a2bef5bf97a4d0b443bb6c9542685732e7d4dff795a2e", "semantic_signature": { - "normalized_sha256": "8711f4910f9cb9d022d024c432093bccbcf8d4e74250a3a25f915eb086de6c5a", - "headings_sha256": "97a3a2d7f1cbb79a0350d5566733da579c5fe42c4686a96cf043edd7be609fc8", - "questions_sha256": "5db89e726e874b1f4b28c24490923a7c6b9042f5abbc173ea698e1b1e459d017", - "obligations_sha256": "4c463b201237a4eb9cfbfe2fd520096a256b4188b383922b0e98bccc4e53f131", - "heading_count": 87, - "question_count": 27, - "obligation_count": 114 + "normalized_sha256": "33584047a11aa46a1b6a2bef5bf97a4d0b443bb6c9542685732e7d4dff795a2e", + "headings_sha256": "739abb73da8446c6133835f56ea0c862a7c1fd57e6702a6afe1ed1fd2fb2b2c8", + "questions_sha256": "57579e50936d62734df12299638bdcf8ce412f24b68688b071be156312aafcbc", + "obligations_sha256": "e7b864611d4940a37f553642dec6bf9ba3c4eec94f0ecbe2cab19699751cacb8", + "heading_count": 62, + "question_count": 24, + "obligation_count": 62 } }, "deterministic_comparison": { @@ -115,27 +115,27 @@ "semantic_dimensions": { "questions": { "classification": "EQUIVALENT", - "evidence": "The candidate exactly matches the deterministic installable port of the pinned 1.x workflow; only enumerated package-local path mechanics differ from the immutable oracle." + "evidence": "The candidate exactly matches the deterministic canonical specialist render of the pinned workflow. The retired shared onboarding wrapper is excluded and carved specialist phases are package-local lazy references; specialist questions, pressure, gates, evidence, artifacts, mutation boundaries, exit behavior, and voice remain governed by their source contracts." }, "question_order": { "classification": "EQUIVALENT", - "evidence": "The candidate exactly matches the deterministic installable port of the pinned 1.x workflow; only enumerated package-local path mechanics differ from the immutable oracle." + "evidence": "The candidate exactly matches the deterministic canonical specialist render of the pinned workflow. The retired shared onboarding wrapper is excluded and carved specialist phases are package-local lazy references; specialist questions, pressure, gates, evidence, artifacts, mutation boundaries, exit behavior, and voice remain governed by their source contracts." }, "follow_up_pressure": { "classification": "EQUIVALENT", - "evidence": "The candidate exactly matches the deterministic installable port of the pinned 1.x workflow; only enumerated package-local path mechanics differ from the immutable oracle." + "evidence": "The candidate exactly matches the deterministic canonical specialist render of the pinned workflow. The retired shared onboarding wrapper is excluded and carved specialist phases are package-local lazy references; specialist questions, pressure, gates, evidence, artifacts, mutation boundaries, exit behavior, and voice remain governed by their source contracts." }, "smart_skips": { "classification": "EQUIVALENT", - "evidence": "The candidate exactly matches the deterministic installable port of the pinned 1.x workflow; only enumerated package-local path mechanics differ from the immutable oracle." + "evidence": "The candidate exactly matches the deterministic canonical specialist render of the pinned workflow. The retired shared onboarding wrapper is excluded and carved specialist phases are package-local lazy references; specialist questions, pressure, gates, evidence, artifacts, mutation boundaries, exit behavior, and voice remain governed by their source contracts." }, "pushback_strength": { "classification": "EQUIVALENT", - "evidence": "The candidate exactly matches the deterministic installable port of the pinned 1.x workflow; only enumerated package-local path mechanics differ from the immutable oracle." + "evidence": "The candidate exactly matches the deterministic canonical specialist render of the pinned workflow. The retired shared onboarding wrapper is excluded and carved specialist phases are package-local lazy references; specialist questions, pressure, gates, evidence, artifacts, mutation boundaries, exit behavior, and voice remain governed by their source contracts." }, "scope_recommendation": { "classification": "EQUIVALENT", - "evidence": "The candidate exactly matches the deterministic installable port of the pinned 1.x workflow; only enumerated package-local path mechanics differ from the immutable oracle." + "evidence": "The candidate exactly matches the deterministic canonical specialist render of the pinned workflow. The retired shared onboarding wrapper is excluded and carved specialist phases are package-local lazy references; specialist questions, pressure, gates, evidence, artifacts, mutation boundaries, exit behavior, and voice remain governed by their source contracts." }, "active_reasoning_modules": { "classification": "EQUIVALENT", @@ -143,35 +143,35 @@ }, "findings": { "classification": "EQUIVALENT", - "evidence": "The candidate exactly matches the deterministic installable port of the pinned 1.x workflow; only enumerated package-local path mechanics differ from the immutable oracle." + "evidence": "The candidate exactly matches the deterministic canonical specialist render of the pinned workflow. The retired shared onboarding wrapper is excluded and carved specialist phases are package-local lazy references; specialist questions, pressure, gates, evidence, artifacts, mutation boundaries, exit behavior, and voice remain governed by their source contracts." }, "evidence": { "classification": "EQUIVALENT", - "evidence": "The candidate exactly matches the deterministic installable port of the pinned 1.x workflow; only enumerated package-local path mechanics differ from the immutable oracle." + "evidence": "The candidate exactly matches the deterministic canonical specialist render of the pinned workflow. The retired shared onboarding wrapper is excluded and carved specialist phases are package-local lazy references; specialist questions, pressure, gates, evidence, artifacts, mutation boundaries, exit behavior, and voice remain governed by their source contracts." }, "artifacts": { "classification": "EQUIVALENT", - "evidence": "The candidate exactly matches the deterministic installable port of the pinned 1.x workflow; only enumerated package-local path mechanics differ from the immutable oracle." + "evidence": "The candidate exactly matches the deterministic canonical specialist render of the pinned workflow. The retired shared onboarding wrapper is excluded and carved specialist phases are package-local lazy references; specialist questions, pressure, gates, evidence, artifacts, mutation boundaries, exit behavior, and voice remain governed by their source contracts." }, "approval_gates": { "classification": "EQUIVALENT", - "evidence": "The candidate exactly matches the deterministic installable port of the pinned 1.x workflow; only enumerated package-local path mechanics differ from the immutable oracle." + "evidence": "The candidate exactly matches the deterministic canonical specialist render of the pinned workflow. The retired shared onboarding wrapper is excluded and carved specialist phases are package-local lazy references; specialist questions, pressure, gates, evidence, artifacts, mutation boundaries, exit behavior, and voice remain governed by their source contracts." }, "mutation_behavior": { "classification": "EQUIVALENT", - "evidence": "The candidate exactly matches the deterministic installable port of the pinned 1.x workflow; only enumerated package-local path mechanics differ from the immutable oracle." + "evidence": "The candidate exactly matches the deterministic canonical specialist render of the pinned workflow. The retired shared onboarding wrapper is excluded and carved specialist phases are package-local lazy references; specialist questions, pressure, gates, evidence, artifacts, mutation boundaries, exit behavior, and voice remain governed by their source contracts." }, "completion_status": { "classification": "EQUIVALENT", - "evidence": "The candidate exactly matches the deterministic installable port of the pinned 1.x workflow; only enumerated package-local path mechanics differ from the immutable oracle." + "evidence": "The candidate exactly matches the deterministic canonical specialist render of the pinned workflow. The retired shared onboarding wrapper is excluded and carved specialist phases are package-local lazy references; specialist questions, pressure, gates, evidence, artifacts, mutation boundaries, exit behavior, and voice remain governed by their source contracts." }, "recommended_next_action": { "classification": "EQUIVALENT", - "evidence": "The candidate exactly matches the deterministic installable port of the pinned 1.x workflow; only enumerated package-local path mechanics differ from the immutable oracle." + "evidence": "The candidate exactly matches the deterministic canonical specialist render of the pinned workflow. The retired shared onboarding wrapper is excluded and carved specialist phases are package-local lazy references; specialist questions, pressure, gates, evidence, artifacts, mutation boundaries, exit behavior, and voice remain governed by their source contracts." }, "voice": { "classification": "EQUIVALENT", - "evidence": "The candidate exactly matches the deterministic installable port of the pinned 1.x workflow; only enumerated package-local path mechanics differ from the immutable oracle." + "evidence": "The candidate exactly matches the deterministic canonical specialist render of the pinned workflow. The retired shared onboarding wrapper is excluded and carved specialist phases are package-local lazy references; specialist questions, pressure, gates, evidence, artifacts, mutation boundaries, exit behavior, and voice remain governed by their source contracts." } }, "verdict": "PASS" diff --git a/evals/parity/transcripts/deterministic/dx-review.json b/evals/parity/transcripts/deterministic/dx-review.json index 864b1626c..b7810ae6e 100644 --- a/evals/parity/transcripts/deterministic/dx-review.json +++ b/evals/parity/transcripts/deterministic/dx-review.json @@ -59,21 +59,21 @@ } }, "mechanical_port": { - "rendered_sha256": "5be964b8b6e8ddf87df7b44bb7713e0c31a3de32cf261682793bc7db45c7cba1", + "rendered_sha256": "fff989dcab1f37d0c219378caef6b1e627c23c2537a717564be0d8567229bccc", "differs_from_baseline": true, - "allowed_difference": "Package-local skill, section, support-artifact, and stable runtime path relocation only." + "allowed_difference": "Canonical GStack 2 carve: exclude the retired shared onboarding wrapper and host hook advisory; resolve retired invocations to six public routes; relocate host/runtime paths; lazy-load pinned carved sections from package-local references." }, "candidate": { "target_path": "skills/plan/references/legacy/plan-devex-review.md", - "rendered_legacy_body_sha256": "5be964b8b6e8ddf87df7b44bb7713e0c31a3de32cf261682793bc7db45c7cba1", + "rendered_legacy_body_sha256": "fff989dcab1f37d0c219378caef6b1e627c23c2537a717564be0d8567229bccc", "semantic_signature": { - "normalized_sha256": "5be964b8b6e8ddf87df7b44bb7713e0c31a3de32cf261682793bc7db45c7cba1", - "headings_sha256": "38b32c459904a94ecac2f1a106e7f4f82afa05bf5a81b004b7169cf7ef477a99", - "questions_sha256": "5b9677dbb2c6d50a2b3259c955ca804ba616d03a9fa6c60ad397dc1f009e5dfd", - "obligations_sha256": "e8bea23eecd9559d0da9373d394fd3c6b4ba80697712b37da895a76c8a0ef726", - "heading_count": 92, - "question_count": 73, - "obligation_count": 164 + "normalized_sha256": "fff989dcab1f37d0c219378caef6b1e627c23c2537a717564be0d8567229bccc", + "headings_sha256": "7aebb4be8ec2a9ba9034b835bb07a244053a62156eabec252e0d78b3523f248a", + "questions_sha256": "5d2d6b27d20c553887edf16ec79a25c0ecab599418052d8e5fc52a172ceb8afe", + "obligations_sha256": "44fe82d36ea1aca78b396ef65052cff618b4f444fcb6f9ace283c116d0add332", + "heading_count": 26, + "question_count": 10, + "obligation_count": 53 } }, "deterministic_comparison": { @@ -103,27 +103,27 @@ "semantic_dimensions": { "questions": { "classification": "EQUIVALENT", - "evidence": "The candidate exactly matches the deterministic installable port of the pinned 1.x workflow; only enumerated package-local path mechanics differ from the immutable oracle." + "evidence": "The candidate exactly matches the deterministic canonical specialist render of the pinned workflow. The retired shared onboarding wrapper is excluded and carved specialist phases are package-local lazy references; specialist questions, pressure, gates, evidence, artifacts, mutation boundaries, exit behavior, and voice remain governed by their source contracts." }, "question_order": { "classification": "EQUIVALENT", - "evidence": "The candidate exactly matches the deterministic installable port of the pinned 1.x workflow; only enumerated package-local path mechanics differ from the immutable oracle." + "evidence": "The candidate exactly matches the deterministic canonical specialist render of the pinned workflow. The retired shared onboarding wrapper is excluded and carved specialist phases are package-local lazy references; specialist questions, pressure, gates, evidence, artifacts, mutation boundaries, exit behavior, and voice remain governed by their source contracts." }, "follow_up_pressure": { "classification": "EQUIVALENT", - "evidence": "The candidate exactly matches the deterministic installable port of the pinned 1.x workflow; only enumerated package-local path mechanics differ from the immutable oracle." + "evidence": "The candidate exactly matches the deterministic canonical specialist render of the pinned workflow. The retired shared onboarding wrapper is excluded and carved specialist phases are package-local lazy references; specialist questions, pressure, gates, evidence, artifacts, mutation boundaries, exit behavior, and voice remain governed by their source contracts." }, "smart_skips": { "classification": "EQUIVALENT", - "evidence": "The candidate exactly matches the deterministic installable port of the pinned 1.x workflow; only enumerated package-local path mechanics differ from the immutable oracle." + "evidence": "The candidate exactly matches the deterministic canonical specialist render of the pinned workflow. The retired shared onboarding wrapper is excluded and carved specialist phases are package-local lazy references; specialist questions, pressure, gates, evidence, artifacts, mutation boundaries, exit behavior, and voice remain governed by their source contracts." }, "pushback_strength": { "classification": "EQUIVALENT", - "evidence": "The candidate exactly matches the deterministic installable port of the pinned 1.x workflow; only enumerated package-local path mechanics differ from the immutable oracle." + "evidence": "The candidate exactly matches the deterministic canonical specialist render of the pinned workflow. The retired shared onboarding wrapper is excluded and carved specialist phases are package-local lazy references; specialist questions, pressure, gates, evidence, artifacts, mutation boundaries, exit behavior, and voice remain governed by their source contracts." }, "scope_recommendation": { "classification": "EQUIVALENT", - "evidence": "The candidate exactly matches the deterministic installable port of the pinned 1.x workflow; only enumerated package-local path mechanics differ from the immutable oracle." + "evidence": "The candidate exactly matches the deterministic canonical specialist render of the pinned workflow. The retired shared onboarding wrapper is excluded and carved specialist phases are package-local lazy references; specialist questions, pressure, gates, evidence, artifacts, mutation boundaries, exit behavior, and voice remain governed by their source contracts." }, "active_reasoning_modules": { "classification": "EQUIVALENT", @@ -131,35 +131,35 @@ }, "findings": { "classification": "EQUIVALENT", - "evidence": "The candidate exactly matches the deterministic installable port of the pinned 1.x workflow; only enumerated package-local path mechanics differ from the immutable oracle." + "evidence": "The candidate exactly matches the deterministic canonical specialist render of the pinned workflow. The retired shared onboarding wrapper is excluded and carved specialist phases are package-local lazy references; specialist questions, pressure, gates, evidence, artifacts, mutation boundaries, exit behavior, and voice remain governed by their source contracts." }, "evidence": { "classification": "EQUIVALENT", - "evidence": "The candidate exactly matches the deterministic installable port of the pinned 1.x workflow; only enumerated package-local path mechanics differ from the immutable oracle." + "evidence": "The candidate exactly matches the deterministic canonical specialist render of the pinned workflow. The retired shared onboarding wrapper is excluded and carved specialist phases are package-local lazy references; specialist questions, pressure, gates, evidence, artifacts, mutation boundaries, exit behavior, and voice remain governed by their source contracts." }, "artifacts": { "classification": "EQUIVALENT", - "evidence": "The candidate exactly matches the deterministic installable port of the pinned 1.x workflow; only enumerated package-local path mechanics differ from the immutable oracle." + "evidence": "The candidate exactly matches the deterministic canonical specialist render of the pinned workflow. The retired shared onboarding wrapper is excluded and carved specialist phases are package-local lazy references; specialist questions, pressure, gates, evidence, artifacts, mutation boundaries, exit behavior, and voice remain governed by their source contracts." }, "approval_gates": { "classification": "EQUIVALENT", - "evidence": "The candidate exactly matches the deterministic installable port of the pinned 1.x workflow; only enumerated package-local path mechanics differ from the immutable oracle." + "evidence": "The candidate exactly matches the deterministic canonical specialist render of the pinned workflow. The retired shared onboarding wrapper is excluded and carved specialist phases are package-local lazy references; specialist questions, pressure, gates, evidence, artifacts, mutation boundaries, exit behavior, and voice remain governed by their source contracts." }, "mutation_behavior": { "classification": "EQUIVALENT", - "evidence": "The candidate exactly matches the deterministic installable port of the pinned 1.x workflow; only enumerated package-local path mechanics differ from the immutable oracle." + "evidence": "The candidate exactly matches the deterministic canonical specialist render of the pinned workflow. The retired shared onboarding wrapper is excluded and carved specialist phases are package-local lazy references; specialist questions, pressure, gates, evidence, artifacts, mutation boundaries, exit behavior, and voice remain governed by their source contracts." }, "completion_status": { "classification": "EQUIVALENT", - "evidence": "The candidate exactly matches the deterministic installable port of the pinned 1.x workflow; only enumerated package-local path mechanics differ from the immutable oracle." + "evidence": "The candidate exactly matches the deterministic canonical specialist render of the pinned workflow. The retired shared onboarding wrapper is excluded and carved specialist phases are package-local lazy references; specialist questions, pressure, gates, evidence, artifacts, mutation boundaries, exit behavior, and voice remain governed by their source contracts." }, "recommended_next_action": { "classification": "EQUIVALENT", - "evidence": "The candidate exactly matches the deterministic installable port of the pinned 1.x workflow; only enumerated package-local path mechanics differ from the immutable oracle." + "evidence": "The candidate exactly matches the deterministic canonical specialist render of the pinned workflow. The retired shared onboarding wrapper is excluded and carved specialist phases are package-local lazy references; specialist questions, pressure, gates, evidence, artifacts, mutation boundaries, exit behavior, and voice remain governed by their source contracts." }, "voice": { "classification": "EQUIVALENT", - "evidence": "The candidate exactly matches the deterministic installable port of the pinned 1.x workflow; only enumerated package-local path mechanics differ from the immutable oracle." + "evidence": "The candidate exactly matches the deterministic canonical specialist render of the pinned workflow. The retired shared onboarding wrapper is excluded and carved specialist phases are package-local lazy references; specialist questions, pressure, gates, evidence, artifacts, mutation boundaries, exit behavior, and voice remain governed by their source contracts." } }, "verdict": "PASS" diff --git a/evals/parity/transcripts/deterministic/engineering-review.json b/evals/parity/transcripts/deterministic/engineering-review.json index 7a1e58076..d30496e50 100644 --- a/evals/parity/transcripts/deterministic/engineering-review.json +++ b/evals/parity/transcripts/deterministic/engineering-review.json @@ -58,21 +58,21 @@ } }, "mechanical_port": { - "rendered_sha256": "02dad060f44bffacc9cbc16532816930dbd0f2aa21466d0e97eaf36250a80833", + "rendered_sha256": "ee268f1d24769509b89b7db998372a773d9e7bc376306a68319af4f74c6fe713", "differs_from_baseline": true, - "allowed_difference": "Package-local skill, section, support-artifact, and stable runtime path relocation only." + "allowed_difference": "Canonical GStack 2 carve: exclude the retired shared onboarding wrapper and host hook advisory; resolve retired invocations to six public routes; relocate host/runtime paths; lazy-load pinned carved sections from package-local references." }, "candidate": { "target_path": "skills/plan/references/legacy/plan-eng-review.md", - "rendered_legacy_body_sha256": "02dad060f44bffacc9cbc16532816930dbd0f2aa21466d0e97eaf36250a80833", + "rendered_legacy_body_sha256": "ee268f1d24769509b89b7db998372a773d9e7bc376306a68319af4f74c6fe713", "semantic_signature": { - "normalized_sha256": "02dad060f44bffacc9cbc16532816930dbd0f2aa21466d0e97eaf36250a80833", - "headings_sha256": "a6d978c19729dc3cc5f718f9240c6363d05d9bf4e36e423dd619b5cd5a551580", - "questions_sha256": "44262f6a8dc6199697ad9f51c2002f59fec043dee2f3f64836717c5dce558a40", - "obligations_sha256": "b68e30496dc4018f890401694057869444b56a61c9fbca77a36e210c5a55e53c", - "heading_count": 78, - "question_count": 18, - "obligation_count": 157 + "normalized_sha256": "ee268f1d24769509b89b7db998372a773d9e7bc376306a68319af4f74c6fe713", + "headings_sha256": "0200c83cdde0bdc56f79527a4e38884bf075c09b1d829a4244e979b324dc52fc", + "questions_sha256": "b74758da3f085a457fc0f9cf1b5c34dfe849fd713a5882849da0abb2edc1a73f", + "obligations_sha256": "186b9e3bb712898fa6e8544ba2f6fc932a161e9bb388cb7b8f7bdecb782b57f9", + "heading_count": 15, + "question_count": 6, + "obligation_count": 35 } }, "deterministic_comparison": { @@ -109,27 +109,27 @@ "semantic_dimensions": { "questions": { "classification": "EQUIVALENT", - "evidence": "The candidate exactly matches the deterministic installable port of the pinned 1.x workflow; only enumerated package-local path mechanics differ from the immutable oracle." + "evidence": "The candidate exactly matches the deterministic canonical specialist render of the pinned workflow. The retired shared onboarding wrapper is excluded and carved specialist phases are package-local lazy references; specialist questions, pressure, gates, evidence, artifacts, mutation boundaries, exit behavior, and voice remain governed by their source contracts." }, "question_order": { "classification": "EQUIVALENT", - "evidence": "The candidate exactly matches the deterministic installable port of the pinned 1.x workflow; only enumerated package-local path mechanics differ from the immutable oracle." + "evidence": "The candidate exactly matches the deterministic canonical specialist render of the pinned workflow. The retired shared onboarding wrapper is excluded and carved specialist phases are package-local lazy references; specialist questions, pressure, gates, evidence, artifacts, mutation boundaries, exit behavior, and voice remain governed by their source contracts." }, "follow_up_pressure": { "classification": "EQUIVALENT", - "evidence": "The candidate exactly matches the deterministic installable port of the pinned 1.x workflow; only enumerated package-local path mechanics differ from the immutable oracle." + "evidence": "The candidate exactly matches the deterministic canonical specialist render of the pinned workflow. The retired shared onboarding wrapper is excluded and carved specialist phases are package-local lazy references; specialist questions, pressure, gates, evidence, artifacts, mutation boundaries, exit behavior, and voice remain governed by their source contracts." }, "smart_skips": { "classification": "EQUIVALENT", - "evidence": "The candidate exactly matches the deterministic installable port of the pinned 1.x workflow; only enumerated package-local path mechanics differ from the immutable oracle." + "evidence": "The candidate exactly matches the deterministic canonical specialist render of the pinned workflow. The retired shared onboarding wrapper is excluded and carved specialist phases are package-local lazy references; specialist questions, pressure, gates, evidence, artifacts, mutation boundaries, exit behavior, and voice remain governed by their source contracts." }, "pushback_strength": { "classification": "EQUIVALENT", - "evidence": "The candidate exactly matches the deterministic installable port of the pinned 1.x workflow; only enumerated package-local path mechanics differ from the immutable oracle." + "evidence": "The candidate exactly matches the deterministic canonical specialist render of the pinned workflow. The retired shared onboarding wrapper is excluded and carved specialist phases are package-local lazy references; specialist questions, pressure, gates, evidence, artifacts, mutation boundaries, exit behavior, and voice remain governed by their source contracts." }, "scope_recommendation": { "classification": "EQUIVALENT", - "evidence": "The candidate exactly matches the deterministic installable port of the pinned 1.x workflow; only enumerated package-local path mechanics differ from the immutable oracle." + "evidence": "The candidate exactly matches the deterministic canonical specialist render of the pinned workflow. The retired shared onboarding wrapper is excluded and carved specialist phases are package-local lazy references; specialist questions, pressure, gates, evidence, artifacts, mutation boundaries, exit behavior, and voice remain governed by their source contracts." }, "active_reasoning_modules": { "classification": "EQUIVALENT", @@ -137,35 +137,35 @@ }, "findings": { "classification": "EQUIVALENT", - "evidence": "The candidate exactly matches the deterministic installable port of the pinned 1.x workflow; only enumerated package-local path mechanics differ from the immutable oracle." + "evidence": "The candidate exactly matches the deterministic canonical specialist render of the pinned workflow. The retired shared onboarding wrapper is excluded and carved specialist phases are package-local lazy references; specialist questions, pressure, gates, evidence, artifacts, mutation boundaries, exit behavior, and voice remain governed by their source contracts." }, "evidence": { "classification": "EQUIVALENT", - "evidence": "The candidate exactly matches the deterministic installable port of the pinned 1.x workflow; only enumerated package-local path mechanics differ from the immutable oracle." + "evidence": "The candidate exactly matches the deterministic canonical specialist render of the pinned workflow. The retired shared onboarding wrapper is excluded and carved specialist phases are package-local lazy references; specialist questions, pressure, gates, evidence, artifacts, mutation boundaries, exit behavior, and voice remain governed by their source contracts." }, "artifacts": { "classification": "EQUIVALENT", - "evidence": "The candidate exactly matches the deterministic installable port of the pinned 1.x workflow; only enumerated package-local path mechanics differ from the immutable oracle." + "evidence": "The candidate exactly matches the deterministic canonical specialist render of the pinned workflow. The retired shared onboarding wrapper is excluded and carved specialist phases are package-local lazy references; specialist questions, pressure, gates, evidence, artifacts, mutation boundaries, exit behavior, and voice remain governed by their source contracts." }, "approval_gates": { "classification": "EQUIVALENT", - "evidence": "The candidate exactly matches the deterministic installable port of the pinned 1.x workflow; only enumerated package-local path mechanics differ from the immutable oracle." + "evidence": "The candidate exactly matches the deterministic canonical specialist render of the pinned workflow. The retired shared onboarding wrapper is excluded and carved specialist phases are package-local lazy references; specialist questions, pressure, gates, evidence, artifacts, mutation boundaries, exit behavior, and voice remain governed by their source contracts." }, "mutation_behavior": { "classification": "EQUIVALENT", - "evidence": "The candidate exactly matches the deterministic installable port of the pinned 1.x workflow; only enumerated package-local path mechanics differ from the immutable oracle." + "evidence": "The candidate exactly matches the deterministic canonical specialist render of the pinned workflow. The retired shared onboarding wrapper is excluded and carved specialist phases are package-local lazy references; specialist questions, pressure, gates, evidence, artifacts, mutation boundaries, exit behavior, and voice remain governed by their source contracts." }, "completion_status": { "classification": "EQUIVALENT", - "evidence": "The candidate exactly matches the deterministic installable port of the pinned 1.x workflow; only enumerated package-local path mechanics differ from the immutable oracle." + "evidence": "The candidate exactly matches the deterministic canonical specialist render of the pinned workflow. The retired shared onboarding wrapper is excluded and carved specialist phases are package-local lazy references; specialist questions, pressure, gates, evidence, artifacts, mutation boundaries, exit behavior, and voice remain governed by their source contracts." }, "recommended_next_action": { "classification": "EQUIVALENT", - "evidence": "The candidate exactly matches the deterministic installable port of the pinned 1.x workflow; only enumerated package-local path mechanics differ from the immutable oracle." + "evidence": "The candidate exactly matches the deterministic canonical specialist render of the pinned workflow. The retired shared onboarding wrapper is excluded and carved specialist phases are package-local lazy references; specialist questions, pressure, gates, evidence, artifacts, mutation boundaries, exit behavior, and voice remain governed by their source contracts." }, "voice": { "classification": "EQUIVALENT", - "evidence": "The candidate exactly matches the deterministic installable port of the pinned 1.x workflow; only enumerated package-local path mechanics differ from the immutable oracle." + "evidence": "The candidate exactly matches the deterministic canonical specialist render of the pinned workflow. The retired shared onboarding wrapper is excluded and carved specialist phases are package-local lazy references; specialist questions, pressure, gates, evidence, artifacts, mutation boundaries, exit behavior, and voice remain governed by their source contracts." } }, "verdict": "PASS" diff --git a/evals/parity/transcripts/deterministic/office-hours.json b/evals/parity/transcripts/deterministic/office-hours.json index 4aa9e71b5..46b339d57 100644 --- a/evals/parity/transcripts/deterministic/office-hours.json +++ b/evals/parity/transcripts/deterministic/office-hours.json @@ -58,21 +58,21 @@ } }, "mechanical_port": { - "rendered_sha256": "0f0017a3752dd58d013c11d4d19af956724b6eeea89899f045dc3f41a3aa89b1", + "rendered_sha256": "b633a6ef87928ca2434f3a2b1ce88946cbe528a9e3659469e0f9cbbe8a7b146b", "differs_from_baseline": true, - "allowed_difference": "Package-local skill, section, support-artifact, and stable runtime path relocation only." + "allowed_difference": "Canonical GStack 2 carve: exclude the retired shared onboarding wrapper and host hook advisory; resolve retired invocations to six public routes; relocate host/runtime paths; lazy-load pinned carved sections from package-local references." }, "candidate": { "target_path": "skills/plan/references/legacy/office-hours.md", - "rendered_legacy_body_sha256": "0f0017a3752dd58d013c11d4d19af956724b6eeea89899f045dc3f41a3aa89b1", + "rendered_legacy_body_sha256": "b633a6ef87928ca2434f3a2b1ce88946cbe528a9e3659469e0f9cbbe8a7b146b", "semantic_signature": { - "normalized_sha256": "0f0017a3752dd58d013c11d4d19af956724b6eeea89899f045dc3f41a3aa89b1", - "headings_sha256": "0eda5f7edd88be7d836c59847e64e7811e3872ae9e1a25d126ba8d2ae54cb3a8", - "questions_sha256": "8c3eac0a1132a42024b30197a148c45991eb67a4d41e9c7534a8299e1542f1b2", - "obligations_sha256": "3c495f1973cc9f202438ca178446723bcf32b0e27aa042c7537a9ad41c17ecff", - "heading_count": 73, - "question_count": 22, - "obligation_count": 116 + "normalized_sha256": "b633a6ef87928ca2434f3a2b1ce88946cbe528a9e3659469e0f9cbbe8a7b146b", + "headings_sha256": "f50aa767e26cdfc3c8fa4c6bdcabd10e061ca0ab59e2aff4c204eaf68bfd1d56", + "questions_sha256": "92d854d47b2f92f30cc34a59cfb6f3e18449beddcb8ebd5490162545bc8384c7", + "obligations_sha256": "ec3076674f71ffad877bfcd6d147fc77c218831ac13329f5c80442e5f2e7e1f0", + "heading_count": 34, + "question_count": 13, + "obligation_count": 42 } }, "deterministic_comparison": { @@ -102,27 +102,27 @@ "semantic_dimensions": { "questions": { "classification": "EQUIVALENT", - "evidence": "The candidate exactly matches the deterministic installable port of the pinned 1.x workflow; only enumerated package-local path mechanics differ from the immutable oracle." + "evidence": "The candidate exactly matches the deterministic canonical specialist render of the pinned workflow. The retired shared onboarding wrapper is excluded and carved specialist phases are package-local lazy references; specialist questions, pressure, gates, evidence, artifacts, mutation boundaries, exit behavior, and voice remain governed by their source contracts." }, "question_order": { "classification": "EQUIVALENT", - "evidence": "The candidate exactly matches the deterministic installable port of the pinned 1.x workflow; only enumerated package-local path mechanics differ from the immutable oracle." + "evidence": "The candidate exactly matches the deterministic canonical specialist render of the pinned workflow. The retired shared onboarding wrapper is excluded and carved specialist phases are package-local lazy references; specialist questions, pressure, gates, evidence, artifacts, mutation boundaries, exit behavior, and voice remain governed by their source contracts." }, "follow_up_pressure": { "classification": "EQUIVALENT", - "evidence": "The candidate exactly matches the deterministic installable port of the pinned 1.x workflow; only enumerated package-local path mechanics differ from the immutable oracle." + "evidence": "The candidate exactly matches the deterministic canonical specialist render of the pinned workflow. The retired shared onboarding wrapper is excluded and carved specialist phases are package-local lazy references; specialist questions, pressure, gates, evidence, artifacts, mutation boundaries, exit behavior, and voice remain governed by their source contracts." }, "smart_skips": { "classification": "EQUIVALENT", - "evidence": "The candidate exactly matches the deterministic installable port of the pinned 1.x workflow; only enumerated package-local path mechanics differ from the immutable oracle." + "evidence": "The candidate exactly matches the deterministic canonical specialist render of the pinned workflow. The retired shared onboarding wrapper is excluded and carved specialist phases are package-local lazy references; specialist questions, pressure, gates, evidence, artifacts, mutation boundaries, exit behavior, and voice remain governed by their source contracts." }, "pushback_strength": { "classification": "EQUIVALENT", - "evidence": "The candidate exactly matches the deterministic installable port of the pinned 1.x workflow; only enumerated package-local path mechanics differ from the immutable oracle." + "evidence": "The candidate exactly matches the deterministic canonical specialist render of the pinned workflow. The retired shared onboarding wrapper is excluded and carved specialist phases are package-local lazy references; specialist questions, pressure, gates, evidence, artifacts, mutation boundaries, exit behavior, and voice remain governed by their source contracts." }, "scope_recommendation": { "classification": "EQUIVALENT", - "evidence": "The candidate exactly matches the deterministic installable port of the pinned 1.x workflow; only enumerated package-local path mechanics differ from the immutable oracle." + "evidence": "The candidate exactly matches the deterministic canonical specialist render of the pinned workflow. The retired shared onboarding wrapper is excluded and carved specialist phases are package-local lazy references; specialist questions, pressure, gates, evidence, artifacts, mutation boundaries, exit behavior, and voice remain governed by their source contracts." }, "active_reasoning_modules": { "classification": "EQUIVALENT", @@ -130,35 +130,35 @@ }, "findings": { "classification": "EQUIVALENT", - "evidence": "The candidate exactly matches the deterministic installable port of the pinned 1.x workflow; only enumerated package-local path mechanics differ from the immutable oracle." + "evidence": "The candidate exactly matches the deterministic canonical specialist render of the pinned workflow. The retired shared onboarding wrapper is excluded and carved specialist phases are package-local lazy references; specialist questions, pressure, gates, evidence, artifacts, mutation boundaries, exit behavior, and voice remain governed by their source contracts." }, "evidence": { "classification": "EQUIVALENT", - "evidence": "The candidate exactly matches the deterministic installable port of the pinned 1.x workflow; only enumerated package-local path mechanics differ from the immutable oracle." + "evidence": "The candidate exactly matches the deterministic canonical specialist render of the pinned workflow. The retired shared onboarding wrapper is excluded and carved specialist phases are package-local lazy references; specialist questions, pressure, gates, evidence, artifacts, mutation boundaries, exit behavior, and voice remain governed by their source contracts." }, "artifacts": { "classification": "EQUIVALENT", - "evidence": "The candidate exactly matches the deterministic installable port of the pinned 1.x workflow; only enumerated package-local path mechanics differ from the immutable oracle." + "evidence": "The candidate exactly matches the deterministic canonical specialist render of the pinned workflow. The retired shared onboarding wrapper is excluded and carved specialist phases are package-local lazy references; specialist questions, pressure, gates, evidence, artifacts, mutation boundaries, exit behavior, and voice remain governed by their source contracts." }, "approval_gates": { "classification": "EQUIVALENT", - "evidence": "The candidate exactly matches the deterministic installable port of the pinned 1.x workflow; only enumerated package-local path mechanics differ from the immutable oracle." + "evidence": "The candidate exactly matches the deterministic canonical specialist render of the pinned workflow. The retired shared onboarding wrapper is excluded and carved specialist phases are package-local lazy references; specialist questions, pressure, gates, evidence, artifacts, mutation boundaries, exit behavior, and voice remain governed by their source contracts." }, "mutation_behavior": { "classification": "EQUIVALENT", - "evidence": "The candidate exactly matches the deterministic installable port of the pinned 1.x workflow; only enumerated package-local path mechanics differ from the immutable oracle." + "evidence": "The candidate exactly matches the deterministic canonical specialist render of the pinned workflow. The retired shared onboarding wrapper is excluded and carved specialist phases are package-local lazy references; specialist questions, pressure, gates, evidence, artifacts, mutation boundaries, exit behavior, and voice remain governed by their source contracts." }, "completion_status": { "classification": "EQUIVALENT", - "evidence": "The candidate exactly matches the deterministic installable port of the pinned 1.x workflow; only enumerated package-local path mechanics differ from the immutable oracle." + "evidence": "The candidate exactly matches the deterministic canonical specialist render of the pinned workflow. The retired shared onboarding wrapper is excluded and carved specialist phases are package-local lazy references; specialist questions, pressure, gates, evidence, artifacts, mutation boundaries, exit behavior, and voice remain governed by their source contracts." }, "recommended_next_action": { "classification": "EQUIVALENT", - "evidence": "The candidate exactly matches the deterministic installable port of the pinned 1.x workflow; only enumerated package-local path mechanics differ from the immutable oracle." + "evidence": "The candidate exactly matches the deterministic canonical specialist render of the pinned workflow. The retired shared onboarding wrapper is excluded and carved specialist phases are package-local lazy references; specialist questions, pressure, gates, evidence, artifacts, mutation boundaries, exit behavior, and voice remain governed by their source contracts." }, "voice": { "classification": "EQUIVALENT", - "evidence": "The candidate exactly matches the deterministic installable port of the pinned 1.x workflow; only enumerated package-local path mechanics differ from the immutable oracle." + "evidence": "The candidate exactly matches the deterministic canonical specialist render of the pinned workflow. The retired shared onboarding wrapper is excluded and carved specialist phases are package-local lazy references; specialist questions, pressure, gates, evidence, artifacts, mutation boundaries, exit behavior, and voice remain governed by their source contracts." } }, "verdict": "PASS" diff --git a/evals/parity/transcripts/deterministic/physical-ios-qa.json b/evals/parity/transcripts/deterministic/physical-ios-qa.json index aef9f41e4..78b5f2da4 100644 --- a/evals/parity/transcripts/deterministic/physical-ios-qa.json +++ b/evals/parity/transcripts/deterministic/physical-ios-qa.json @@ -57,21 +57,21 @@ } }, "mechanical_port": { - "rendered_sha256": "37b9baf014dcfa6ed3266ae3241dad17956a0b6b3f332dc44bdb728daa3c8f01", + "rendered_sha256": "a9353a4d837240f85c0e13144e66575f9e267926090cfc0f344a08b5fb09b98c", "differs_from_baseline": true, - "allowed_difference": "Package-local skill, section, support-artifact, and stable runtime path relocation only." + "allowed_difference": "Canonical GStack 2 carve: exclude the retired shared onboarding wrapper and host hook advisory; resolve retired invocations to six public routes; relocate host/runtime paths; lazy-load pinned carved sections from package-local references." }, "candidate": { "target_path": "skills/qa/references/legacy/ios-qa.md", - "rendered_legacy_body_sha256": "37b9baf014dcfa6ed3266ae3241dad17956a0b6b3f332dc44bdb728daa3c8f01", + "rendered_legacy_body_sha256": "a9353a4d837240f85c0e13144e66575f9e267926090cfc0f344a08b5fb09b98c", "semantic_signature": { - "normalized_sha256": "37b9baf014dcfa6ed3266ae3241dad17956a0b6b3f332dc44bdb728daa3c8f01", - "headings_sha256": "c3956fd2f080109a7f972d1e7d4f32bafa760290665757c74e8f6b16b9acbe31", - "questions_sha256": "bbb25cde83f6642c277e650261bc10a5078d25ad245e90ab2ea42bad9c5d12aa", - "obligations_sha256": "f58f6abc13eff384e423c7d1cded5c454b97b99576014b4360fc1176abd50168", - "heading_count": 37, - "question_count": 3, - "obligation_count": 61 + "normalized_sha256": "a9353a4d837240f85c0e13144e66575f9e267926090cfc0f344a08b5fb09b98c", + "headings_sha256": "79304f733fa401249340540c659f15a9da4e7a89a3d505d39437f6bcbcaf4ce5", + "questions_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "obligations_sha256": "1d8b9f6b93b844f1a9ad43f1434c7b0a4b891a6e5e0ad8827f41c7eefbef239f", + "heading_count": 12, + "question_count": 0, + "obligation_count": 8 } }, "deterministic_comparison": { @@ -94,27 +94,27 @@ "semantic_dimensions": { "questions": { "classification": "EQUIVALENT", - "evidence": "The candidate exactly matches the deterministic installable port of the pinned 1.x workflow; only enumerated package-local path mechanics differ from the immutable oracle." + "evidence": "The candidate exactly matches the deterministic canonical specialist render of the pinned workflow. The retired shared onboarding wrapper is excluded and carved specialist phases are package-local lazy references; specialist questions, pressure, gates, evidence, artifacts, mutation boundaries, exit behavior, and voice remain governed by their source contracts." }, "question_order": { "classification": "EQUIVALENT", - "evidence": "The candidate exactly matches the deterministic installable port of the pinned 1.x workflow; only enumerated package-local path mechanics differ from the immutable oracle." + "evidence": "The candidate exactly matches the deterministic canonical specialist render of the pinned workflow. The retired shared onboarding wrapper is excluded and carved specialist phases are package-local lazy references; specialist questions, pressure, gates, evidence, artifacts, mutation boundaries, exit behavior, and voice remain governed by their source contracts." }, "follow_up_pressure": { "classification": "EQUIVALENT", - "evidence": "The candidate exactly matches the deterministic installable port of the pinned 1.x workflow; only enumerated package-local path mechanics differ from the immutable oracle." + "evidence": "The candidate exactly matches the deterministic canonical specialist render of the pinned workflow. The retired shared onboarding wrapper is excluded and carved specialist phases are package-local lazy references; specialist questions, pressure, gates, evidence, artifacts, mutation boundaries, exit behavior, and voice remain governed by their source contracts." }, "smart_skips": { "classification": "EQUIVALENT", - "evidence": "The candidate exactly matches the deterministic installable port of the pinned 1.x workflow; only enumerated package-local path mechanics differ from the immutable oracle." + "evidence": "The candidate exactly matches the deterministic canonical specialist render of the pinned workflow. The retired shared onboarding wrapper is excluded and carved specialist phases are package-local lazy references; specialist questions, pressure, gates, evidence, artifacts, mutation boundaries, exit behavior, and voice remain governed by their source contracts." }, "pushback_strength": { "classification": "EQUIVALENT", - "evidence": "The candidate exactly matches the deterministic installable port of the pinned 1.x workflow; only enumerated package-local path mechanics differ from the immutable oracle." + "evidence": "The candidate exactly matches the deterministic canonical specialist render of the pinned workflow. The retired shared onboarding wrapper is excluded and carved specialist phases are package-local lazy references; specialist questions, pressure, gates, evidence, artifacts, mutation boundaries, exit behavior, and voice remain governed by their source contracts." }, "scope_recommendation": { "classification": "EQUIVALENT", - "evidence": "The candidate exactly matches the deterministic installable port of the pinned 1.x workflow; only enumerated package-local path mechanics differ from the immutable oracle." + "evidence": "The candidate exactly matches the deterministic canonical specialist render of the pinned workflow. The retired shared onboarding wrapper is excluded and carved specialist phases are package-local lazy references; specialist questions, pressure, gates, evidence, artifacts, mutation boundaries, exit behavior, and voice remain governed by their source contracts." }, "active_reasoning_modules": { "classification": "EQUIVALENT", @@ -122,35 +122,35 @@ }, "findings": { "classification": "EQUIVALENT", - "evidence": "The candidate exactly matches the deterministic installable port of the pinned 1.x workflow; only enumerated package-local path mechanics differ from the immutable oracle." + "evidence": "The candidate exactly matches the deterministic canonical specialist render of the pinned workflow. The retired shared onboarding wrapper is excluded and carved specialist phases are package-local lazy references; specialist questions, pressure, gates, evidence, artifacts, mutation boundaries, exit behavior, and voice remain governed by their source contracts." }, "evidence": { "classification": "EQUIVALENT", - "evidence": "The candidate exactly matches the deterministic installable port of the pinned 1.x workflow; only enumerated package-local path mechanics differ from the immutable oracle." + "evidence": "The candidate exactly matches the deterministic canonical specialist render of the pinned workflow. The retired shared onboarding wrapper is excluded and carved specialist phases are package-local lazy references; specialist questions, pressure, gates, evidence, artifacts, mutation boundaries, exit behavior, and voice remain governed by their source contracts." }, "artifacts": { "classification": "EQUIVALENT", - "evidence": "The candidate exactly matches the deterministic installable port of the pinned 1.x workflow; only enumerated package-local path mechanics differ from the immutable oracle." + "evidence": "The candidate exactly matches the deterministic canonical specialist render of the pinned workflow. The retired shared onboarding wrapper is excluded and carved specialist phases are package-local lazy references; specialist questions, pressure, gates, evidence, artifacts, mutation boundaries, exit behavior, and voice remain governed by their source contracts." }, "approval_gates": { "classification": "EQUIVALENT", - "evidence": "The candidate exactly matches the deterministic installable port of the pinned 1.x workflow; only enumerated package-local path mechanics differ from the immutable oracle." + "evidence": "The candidate exactly matches the deterministic canonical specialist render of the pinned workflow. The retired shared onboarding wrapper is excluded and carved specialist phases are package-local lazy references; specialist questions, pressure, gates, evidence, artifacts, mutation boundaries, exit behavior, and voice remain governed by their source contracts." }, "mutation_behavior": { "classification": "EQUIVALENT", - "evidence": "The candidate exactly matches the deterministic installable port of the pinned 1.x workflow; only enumerated package-local path mechanics differ from the immutable oracle." + "evidence": "The candidate exactly matches the deterministic canonical specialist render of the pinned workflow. The retired shared onboarding wrapper is excluded and carved specialist phases are package-local lazy references; specialist questions, pressure, gates, evidence, artifacts, mutation boundaries, exit behavior, and voice remain governed by their source contracts." }, "completion_status": { "classification": "EQUIVALENT", - "evidence": "The candidate exactly matches the deterministic installable port of the pinned 1.x workflow; only enumerated package-local path mechanics differ from the immutable oracle." + "evidence": "The candidate exactly matches the deterministic canonical specialist render of the pinned workflow. The retired shared onboarding wrapper is excluded and carved specialist phases are package-local lazy references; specialist questions, pressure, gates, evidence, artifacts, mutation boundaries, exit behavior, and voice remain governed by their source contracts." }, "recommended_next_action": { "classification": "EQUIVALENT", - "evidence": "The candidate exactly matches the deterministic installable port of the pinned 1.x workflow; only enumerated package-local path mechanics differ from the immutable oracle." + "evidence": "The candidate exactly matches the deterministic canonical specialist render of the pinned workflow. The retired shared onboarding wrapper is excluded and carved specialist phases are package-local lazy references; specialist questions, pressure, gates, evidence, artifacts, mutation boundaries, exit behavior, and voice remain governed by their source contracts." }, "voice": { "classification": "EQUIVALENT", - "evidence": "The candidate exactly matches the deterministic installable port of the pinned 1.x workflow; only enumerated package-local path mechanics differ from the immutable oracle." + "evidence": "The candidate exactly matches the deterministic canonical specialist render of the pinned workflow. The retired shared onboarding wrapper is excluded and carved specialist phases are package-local lazy references; specialist questions, pressure, gates, evidence, artifacts, mutation boundaries, exit behavior, and voice remain governed by their source contracts." } }, "verdict": "PASS" diff --git a/evals/parity/transcripts/deterministic/qa-fix-verify.json b/evals/parity/transcripts/deterministic/qa-fix-verify.json index cb30594e4..1b892219d 100644 --- a/evals/parity/transcripts/deterministic/qa-fix-verify.json +++ b/evals/parity/transcripts/deterministic/qa-fix-verify.json @@ -57,21 +57,21 @@ } }, "mechanical_port": { - "rendered_sha256": "025c1fbca58477248afb826cde24766904749129177e2bc60fbf2370207d1da5", + "rendered_sha256": "b1387290067842593297c8d64dc578a890a336ce5a8b60085e51b52c55ebaade", "differs_from_baseline": true, - "allowed_difference": "Package-local skill, section, support-artifact, and stable runtime path relocation only." + "allowed_difference": "Canonical GStack 2 carve: exclude the retired shared onboarding wrapper and host hook advisory; resolve retired invocations to six public routes; relocate host/runtime paths; lazy-load pinned carved sections from package-local references." }, "candidate": { "target_path": "skills/qa/references/legacy/qa.md", - "rendered_legacy_body_sha256": "025c1fbca58477248afb826cde24766904749129177e2bc60fbf2370207d1da5", + "rendered_legacy_body_sha256": "b1387290067842593297c8d64dc578a890a336ce5a8b60085e51b52c55ebaade", "semantic_signature": { - "normalized_sha256": "025c1fbca58477248afb826cde24766904749129177e2bc60fbf2370207d1da5", - "headings_sha256": "a662e86dd6ce33d87a41037bece0d77263fa574722d3ebeca848bfbd5cc59015", - "questions_sha256": "83385e7d1c6f556816f611364715e34c8dad954d71da79685450413b4c9197c7", - "obligations_sha256": "031728becc412b5d6638ab146773ad19ffc52cd054f02948f4f42fb183775990", - "heading_count": 83, - "question_count": 9, - "obligation_count": 117 + "normalized_sha256": "b1387290067842593297c8d64dc578a890a336ce5a8b60085e51b52c55ebaade", + "headings_sha256": "dd0b56f79cee31c4c3c71f32fb0a4438f686c6ae517625a7d59475deecd4c75e", + "questions_sha256": "8fece376011d8a8606bcd05d52332f77b56de551b7f1abde94bff1f33ef0a9c1", + "obligations_sha256": "e2f2395744c3e2b66bb69fd4d0acea685ab3a76b86796dc8a8f3e23bc9fb29ec", + "heading_count": 58, + "question_count": 6, + "obligation_count": 64 } }, "deterministic_comparison": { @@ -115,27 +115,27 @@ "semantic_dimensions": { "questions": { "classification": "EQUIVALENT", - "evidence": "The candidate exactly matches the deterministic installable port of the pinned 1.x workflow; only enumerated package-local path mechanics differ from the immutable oracle." + "evidence": "The candidate exactly matches the deterministic canonical specialist render of the pinned workflow. The retired shared onboarding wrapper is excluded and carved specialist phases are package-local lazy references; specialist questions, pressure, gates, evidence, artifacts, mutation boundaries, exit behavior, and voice remain governed by their source contracts." }, "question_order": { "classification": "EQUIVALENT", - "evidence": "The candidate exactly matches the deterministic installable port of the pinned 1.x workflow; only enumerated package-local path mechanics differ from the immutable oracle." + "evidence": "The candidate exactly matches the deterministic canonical specialist render of the pinned workflow. The retired shared onboarding wrapper is excluded and carved specialist phases are package-local lazy references; specialist questions, pressure, gates, evidence, artifacts, mutation boundaries, exit behavior, and voice remain governed by their source contracts." }, "follow_up_pressure": { "classification": "EQUIVALENT", - "evidence": "The candidate exactly matches the deterministic installable port of the pinned 1.x workflow; only enumerated package-local path mechanics differ from the immutable oracle." + "evidence": "The candidate exactly matches the deterministic canonical specialist render of the pinned workflow. The retired shared onboarding wrapper is excluded and carved specialist phases are package-local lazy references; specialist questions, pressure, gates, evidence, artifacts, mutation boundaries, exit behavior, and voice remain governed by their source contracts." }, "smart_skips": { "classification": "EQUIVALENT", - "evidence": "The candidate exactly matches the deterministic installable port of the pinned 1.x workflow; only enumerated package-local path mechanics differ from the immutable oracle." + "evidence": "The candidate exactly matches the deterministic canonical specialist render of the pinned workflow. The retired shared onboarding wrapper is excluded and carved specialist phases are package-local lazy references; specialist questions, pressure, gates, evidence, artifacts, mutation boundaries, exit behavior, and voice remain governed by their source contracts." }, "pushback_strength": { "classification": "EQUIVALENT", - "evidence": "The candidate exactly matches the deterministic installable port of the pinned 1.x workflow; only enumerated package-local path mechanics differ from the immutable oracle." + "evidence": "The candidate exactly matches the deterministic canonical specialist render of the pinned workflow. The retired shared onboarding wrapper is excluded and carved specialist phases are package-local lazy references; specialist questions, pressure, gates, evidence, artifacts, mutation boundaries, exit behavior, and voice remain governed by their source contracts." }, "scope_recommendation": { "classification": "EQUIVALENT", - "evidence": "The candidate exactly matches the deterministic installable port of the pinned 1.x workflow; only enumerated package-local path mechanics differ from the immutable oracle." + "evidence": "The candidate exactly matches the deterministic canonical specialist render of the pinned workflow. The retired shared onboarding wrapper is excluded and carved specialist phases are package-local lazy references; specialist questions, pressure, gates, evidence, artifacts, mutation boundaries, exit behavior, and voice remain governed by their source contracts." }, "active_reasoning_modules": { "classification": "EQUIVALENT", @@ -143,35 +143,35 @@ }, "findings": { "classification": "EQUIVALENT", - "evidence": "The candidate exactly matches the deterministic installable port of the pinned 1.x workflow; only enumerated package-local path mechanics differ from the immutable oracle." + "evidence": "The candidate exactly matches the deterministic canonical specialist render of the pinned workflow. The retired shared onboarding wrapper is excluded and carved specialist phases are package-local lazy references; specialist questions, pressure, gates, evidence, artifacts, mutation boundaries, exit behavior, and voice remain governed by their source contracts." }, "evidence": { "classification": "EQUIVALENT", - "evidence": "The candidate exactly matches the deterministic installable port of the pinned 1.x workflow; only enumerated package-local path mechanics differ from the immutable oracle." + "evidence": "The candidate exactly matches the deterministic canonical specialist render of the pinned workflow. The retired shared onboarding wrapper is excluded and carved specialist phases are package-local lazy references; specialist questions, pressure, gates, evidence, artifacts, mutation boundaries, exit behavior, and voice remain governed by their source contracts." }, "artifacts": { "classification": "EQUIVALENT", - "evidence": "The candidate exactly matches the deterministic installable port of the pinned 1.x workflow; only enumerated package-local path mechanics differ from the immutable oracle." + "evidence": "The candidate exactly matches the deterministic canonical specialist render of the pinned workflow. The retired shared onboarding wrapper is excluded and carved specialist phases are package-local lazy references; specialist questions, pressure, gates, evidence, artifacts, mutation boundaries, exit behavior, and voice remain governed by their source contracts." }, "approval_gates": { "classification": "EQUIVALENT", - "evidence": "The candidate exactly matches the deterministic installable port of the pinned 1.x workflow; only enumerated package-local path mechanics differ from the immutable oracle." + "evidence": "The candidate exactly matches the deterministic canonical specialist render of the pinned workflow. The retired shared onboarding wrapper is excluded and carved specialist phases are package-local lazy references; specialist questions, pressure, gates, evidence, artifacts, mutation boundaries, exit behavior, and voice remain governed by their source contracts." }, "mutation_behavior": { "classification": "EQUIVALENT", - "evidence": "The candidate exactly matches the deterministic installable port of the pinned 1.x workflow; only enumerated package-local path mechanics differ from the immutable oracle." + "evidence": "The candidate exactly matches the deterministic canonical specialist render of the pinned workflow. The retired shared onboarding wrapper is excluded and carved specialist phases are package-local lazy references; specialist questions, pressure, gates, evidence, artifacts, mutation boundaries, exit behavior, and voice remain governed by their source contracts." }, "completion_status": { "classification": "EQUIVALENT", - "evidence": "The candidate exactly matches the deterministic installable port of the pinned 1.x workflow; only enumerated package-local path mechanics differ from the immutable oracle." + "evidence": "The candidate exactly matches the deterministic canonical specialist render of the pinned workflow. The retired shared onboarding wrapper is excluded and carved specialist phases are package-local lazy references; specialist questions, pressure, gates, evidence, artifacts, mutation boundaries, exit behavior, and voice remain governed by their source contracts." }, "recommended_next_action": { "classification": "EQUIVALENT", - "evidence": "The candidate exactly matches the deterministic installable port of the pinned 1.x workflow; only enumerated package-local path mechanics differ from the immutable oracle." + "evidence": "The candidate exactly matches the deterministic canonical specialist render of the pinned workflow. The retired shared onboarding wrapper is excluded and carved specialist phases are package-local lazy references; specialist questions, pressure, gates, evidence, artifacts, mutation boundaries, exit behavior, and voice remain governed by their source contracts." }, "voice": { "classification": "EQUIVALENT", - "evidence": "The candidate exactly matches the deterministic installable port of the pinned 1.x workflow; only enumerated package-local path mechanics differ from the immutable oracle." + "evidence": "The candidate exactly matches the deterministic canonical specialist render of the pinned workflow. The retired shared onboarding wrapper is excluded and carved specialist phases are package-local lazy references; specialist questions, pressure, gates, evidence, artifacts, mutation boundaries, exit behavior, and voice remain governed by their source contracts." } }, "verdict": "PASS" diff --git a/evals/parity/transcripts/deterministic/qa-report-only.json b/evals/parity/transcripts/deterministic/qa-report-only.json index 3a4c72359..4d324faaf 100644 --- a/evals/parity/transcripts/deterministic/qa-report-only.json +++ b/evals/parity/transcripts/deterministic/qa-report-only.json @@ -57,21 +57,21 @@ } }, "mechanical_port": { - "rendered_sha256": "90f138a7ded37476397e3399ed686a92f9317161ba6e2256d6c7ed7c2893e273", + "rendered_sha256": "e360ea826399287e00b030c9aa0bcda16e06ab004f5dcdb14db309bad0ccea25", "differs_from_baseline": true, - "allowed_difference": "Package-local skill, section, support-artifact, and stable runtime path relocation only." + "allowed_difference": "Canonical GStack 2 carve: exclude the retired shared onboarding wrapper and host hook advisory; resolve retired invocations to six public routes; relocate host/runtime paths; lazy-load pinned carved sections from package-local references." }, "candidate": { "target_path": "skills/qa/references/legacy/qa-only.md", - "rendered_legacy_body_sha256": "90f138a7ded37476397e3399ed686a92f9317161ba6e2256d6c7ed7c2893e273", + "rendered_legacy_body_sha256": "e360ea826399287e00b030c9aa0bcda16e06ab004f5dcdb14db309bad0ccea25", "semantic_signature": { - "normalized_sha256": "90f138a7ded37476397e3399ed686a92f9317161ba6e2256d6c7ed7c2893e273", - "headings_sha256": "14cf13b917b230aa9ade0fb9b94afd569e4124d2307c6c7f24ba3ac15935fa1f", - "questions_sha256": "83385e7d1c6f556816f611364715e34c8dad954d71da79685450413b4c9197c7", - "obligations_sha256": "2262cbeac3297d56f416ece8418e5ef48bf2208470e1661965ef6a6957e2cb8d", - "heading_count": 59, - "question_count": 9, - "obligation_count": 92 + "normalized_sha256": "e360ea826399287e00b030c9aa0bcda16e06ab004f5dcdb14db309bad0ccea25", + "headings_sha256": "0241f7efa9ffcaef764bd6517099b03394e09f90c8d1f3f015c7c7a135f78201", + "questions_sha256": "8fece376011d8a8606bcd05d52332f77b56de551b7f1abde94bff1f33ef0a9c1", + "obligations_sha256": "e876a6573bd7cdd581cbab5dd913c86d78e7dba1532bd9e60b8b324f56fe11d1", + "heading_count": 34, + "question_count": 6, + "obligation_count": 39 } }, "deterministic_comparison": { @@ -108,27 +108,27 @@ "semantic_dimensions": { "questions": { "classification": "EQUIVALENT", - "evidence": "The candidate exactly matches the deterministic installable port of the pinned 1.x workflow; only enumerated package-local path mechanics differ from the immutable oracle." + "evidence": "The candidate exactly matches the deterministic canonical specialist render of the pinned workflow. The retired shared onboarding wrapper is excluded and carved specialist phases are package-local lazy references; specialist questions, pressure, gates, evidence, artifacts, mutation boundaries, exit behavior, and voice remain governed by their source contracts." }, "question_order": { "classification": "EQUIVALENT", - "evidence": "The candidate exactly matches the deterministic installable port of the pinned 1.x workflow; only enumerated package-local path mechanics differ from the immutable oracle." + "evidence": "The candidate exactly matches the deterministic canonical specialist render of the pinned workflow. The retired shared onboarding wrapper is excluded and carved specialist phases are package-local lazy references; specialist questions, pressure, gates, evidence, artifacts, mutation boundaries, exit behavior, and voice remain governed by their source contracts." }, "follow_up_pressure": { "classification": "EQUIVALENT", - "evidence": "The candidate exactly matches the deterministic installable port of the pinned 1.x workflow; only enumerated package-local path mechanics differ from the immutable oracle." + "evidence": "The candidate exactly matches the deterministic canonical specialist render of the pinned workflow. The retired shared onboarding wrapper is excluded and carved specialist phases are package-local lazy references; specialist questions, pressure, gates, evidence, artifacts, mutation boundaries, exit behavior, and voice remain governed by their source contracts." }, "smart_skips": { "classification": "EQUIVALENT", - "evidence": "The candidate exactly matches the deterministic installable port of the pinned 1.x workflow; only enumerated package-local path mechanics differ from the immutable oracle." + "evidence": "The candidate exactly matches the deterministic canonical specialist render of the pinned workflow. The retired shared onboarding wrapper is excluded and carved specialist phases are package-local lazy references; specialist questions, pressure, gates, evidence, artifacts, mutation boundaries, exit behavior, and voice remain governed by their source contracts." }, "pushback_strength": { "classification": "EQUIVALENT", - "evidence": "The candidate exactly matches the deterministic installable port of the pinned 1.x workflow; only enumerated package-local path mechanics differ from the immutable oracle." + "evidence": "The candidate exactly matches the deterministic canonical specialist render of the pinned workflow. The retired shared onboarding wrapper is excluded and carved specialist phases are package-local lazy references; specialist questions, pressure, gates, evidence, artifacts, mutation boundaries, exit behavior, and voice remain governed by their source contracts." }, "scope_recommendation": { "classification": "EQUIVALENT", - "evidence": "The candidate exactly matches the deterministic installable port of the pinned 1.x workflow; only enumerated package-local path mechanics differ from the immutable oracle." + "evidence": "The candidate exactly matches the deterministic canonical specialist render of the pinned workflow. The retired shared onboarding wrapper is excluded and carved specialist phases are package-local lazy references; specialist questions, pressure, gates, evidence, artifacts, mutation boundaries, exit behavior, and voice remain governed by their source contracts." }, "active_reasoning_modules": { "classification": "EQUIVALENT", @@ -136,35 +136,35 @@ }, "findings": { "classification": "EQUIVALENT", - "evidence": "The candidate exactly matches the deterministic installable port of the pinned 1.x workflow; only enumerated package-local path mechanics differ from the immutable oracle." + "evidence": "The candidate exactly matches the deterministic canonical specialist render of the pinned workflow. The retired shared onboarding wrapper is excluded and carved specialist phases are package-local lazy references; specialist questions, pressure, gates, evidence, artifacts, mutation boundaries, exit behavior, and voice remain governed by their source contracts." }, "evidence": { "classification": "EQUIVALENT", - "evidence": "The candidate exactly matches the deterministic installable port of the pinned 1.x workflow; only enumerated package-local path mechanics differ from the immutable oracle." + "evidence": "The candidate exactly matches the deterministic canonical specialist render of the pinned workflow. The retired shared onboarding wrapper is excluded and carved specialist phases are package-local lazy references; specialist questions, pressure, gates, evidence, artifacts, mutation boundaries, exit behavior, and voice remain governed by their source contracts." }, "artifacts": { "classification": "EQUIVALENT", - "evidence": "The candidate exactly matches the deterministic installable port of the pinned 1.x workflow; only enumerated package-local path mechanics differ from the immutable oracle." + "evidence": "The candidate exactly matches the deterministic canonical specialist render of the pinned workflow. The retired shared onboarding wrapper is excluded and carved specialist phases are package-local lazy references; specialist questions, pressure, gates, evidence, artifacts, mutation boundaries, exit behavior, and voice remain governed by their source contracts." }, "approval_gates": { "classification": "EQUIVALENT", - "evidence": "The candidate exactly matches the deterministic installable port of the pinned 1.x workflow; only enumerated package-local path mechanics differ from the immutable oracle." + "evidence": "The candidate exactly matches the deterministic canonical specialist render of the pinned workflow. The retired shared onboarding wrapper is excluded and carved specialist phases are package-local lazy references; specialist questions, pressure, gates, evidence, artifacts, mutation boundaries, exit behavior, and voice remain governed by their source contracts." }, "mutation_behavior": { "classification": "EQUIVALENT", - "evidence": "The candidate exactly matches the deterministic installable port of the pinned 1.x workflow; only enumerated package-local path mechanics differ from the immutable oracle." + "evidence": "The candidate exactly matches the deterministic canonical specialist render of the pinned workflow. The retired shared onboarding wrapper is excluded and carved specialist phases are package-local lazy references; specialist questions, pressure, gates, evidence, artifacts, mutation boundaries, exit behavior, and voice remain governed by their source contracts." }, "completion_status": { "classification": "EQUIVALENT", - "evidence": "The candidate exactly matches the deterministic installable port of the pinned 1.x workflow; only enumerated package-local path mechanics differ from the immutable oracle." + "evidence": "The candidate exactly matches the deterministic canonical specialist render of the pinned workflow. The retired shared onboarding wrapper is excluded and carved specialist phases are package-local lazy references; specialist questions, pressure, gates, evidence, artifacts, mutation boundaries, exit behavior, and voice remain governed by their source contracts." }, "recommended_next_action": { "classification": "EQUIVALENT", - "evidence": "The candidate exactly matches the deterministic installable port of the pinned 1.x workflow; only enumerated package-local path mechanics differ from the immutable oracle." + "evidence": "The candidate exactly matches the deterministic canonical specialist render of the pinned workflow. The retired shared onboarding wrapper is excluded and carved specialist phases are package-local lazy references; specialist questions, pressure, gates, evidence, artifacts, mutation boundaries, exit behavior, and voice remain governed by their source contracts." }, "voice": { "classification": "EQUIVALENT", - "evidence": "The candidate exactly matches the deterministic installable port of the pinned 1.x workflow; only enumerated package-local path mechanics differ from the immutable oracle." + "evidence": "The candidate exactly matches the deterministic canonical specialist render of the pinned workflow. The retired shared onboarding wrapper is excluded and carved specialist phases are package-local lazy references; specialist questions, pressure, gates, evidence, artifacts, mutation boundaries, exit behavior, and voice remain governed by their source contracts." } }, "verdict": "PASS" diff --git a/evals/parity/transcripts/deterministic/security-review.json b/evals/parity/transcripts/deterministic/security-review.json index f7f11c8d6..f60f84671 100644 --- a/evals/parity/transcripts/deterministic/security-review.json +++ b/evals/parity/transcripts/deterministic/security-review.json @@ -56,21 +56,21 @@ } }, "mechanical_port": { - "rendered_sha256": "59017ba27aaa93a62bda7ddca3c995f7231edb3fa86009e555b724b43fc1afd7", + "rendered_sha256": "2cecaf39e950a0ec848f85c11f9678b6a7644c0251c07be42cd52d4b2e6b61a6", "differs_from_baseline": true, - "allowed_difference": "Package-local skill, section, support-artifact, and stable runtime path relocation only." + "allowed_difference": "Canonical GStack 2 carve: exclude the retired shared onboarding wrapper and host hook advisory; resolve retired invocations to six public routes; relocate host/runtime paths; lazy-load pinned carved sections from package-local references." }, "candidate": { "target_path": "skills/review/references/legacy/cso.md", - "rendered_legacy_body_sha256": "59017ba27aaa93a62bda7ddca3c995f7231edb3fa86009e555b724b43fc1afd7", + "rendered_legacy_body_sha256": "2cecaf39e950a0ec848f85c11f9678b6a7644c0251c07be42cd52d4b2e6b61a6", "semantic_signature": { - "normalized_sha256": "59017ba27aaa93a62bda7ddca3c995f7231edb3fa86009e555b724b43fc1afd7", - "headings_sha256": "8b7bef1dfbbfeb4ee6d5886bdb9016a05fd8fcc03583449b2a9f9fe157e4f502", - "questions_sha256": "2e0c9ac21cb3ff6d699b9b9ef3631e45e00aa46018f13908404c8751dab025ae", - "obligations_sha256": "51d03410baf08dd530ec8a3ee196226e3747729a13202ab9e66c1c1cce934478", - "heading_count": 61, - "question_count": 29, - "obligation_count": 100 + "normalized_sha256": "2cecaf39e950a0ec848f85c11f9678b6a7644c0251c07be42cd52d4b2e6b61a6", + "headings_sha256": "45365014bc4ff67be80c8747098a368c439104ea76ad4d1c36000fe65192e291", + "questions_sha256": "e7e23a9ccc1e3677812d260b4f38b16ef8c438e0b2346c045c1334b7045006de", + "obligations_sha256": "2f83f56fa932b0937d9f968a7e27c974f17772ad8062b9577504dfae600622f6", + "heading_count": 19, + "question_count": 2, + "obligation_count": 44 } }, "deterministic_comparison": { @@ -100,27 +100,27 @@ "semantic_dimensions": { "questions": { "classification": "EQUIVALENT", - "evidence": "The candidate exactly matches the deterministic installable port of the pinned 1.x workflow; only enumerated package-local path mechanics differ from the immutable oracle." + "evidence": "The candidate exactly matches the deterministic canonical specialist render of the pinned workflow. The retired shared onboarding wrapper is excluded and carved specialist phases are package-local lazy references; specialist questions, pressure, gates, evidence, artifacts, mutation boundaries, exit behavior, and voice remain governed by their source contracts." }, "question_order": { "classification": "EQUIVALENT", - "evidence": "The candidate exactly matches the deterministic installable port of the pinned 1.x workflow; only enumerated package-local path mechanics differ from the immutable oracle." + "evidence": "The candidate exactly matches the deterministic canonical specialist render of the pinned workflow. The retired shared onboarding wrapper is excluded and carved specialist phases are package-local lazy references; specialist questions, pressure, gates, evidence, artifacts, mutation boundaries, exit behavior, and voice remain governed by their source contracts." }, "follow_up_pressure": { "classification": "EQUIVALENT", - "evidence": "The candidate exactly matches the deterministic installable port of the pinned 1.x workflow; only enumerated package-local path mechanics differ from the immutable oracle." + "evidence": "The candidate exactly matches the deterministic canonical specialist render of the pinned workflow. The retired shared onboarding wrapper is excluded and carved specialist phases are package-local lazy references; specialist questions, pressure, gates, evidence, artifacts, mutation boundaries, exit behavior, and voice remain governed by their source contracts." }, "smart_skips": { "classification": "EQUIVALENT", - "evidence": "The candidate exactly matches the deterministic installable port of the pinned 1.x workflow; only enumerated package-local path mechanics differ from the immutable oracle." + "evidence": "The candidate exactly matches the deterministic canonical specialist render of the pinned workflow. The retired shared onboarding wrapper is excluded and carved specialist phases are package-local lazy references; specialist questions, pressure, gates, evidence, artifacts, mutation boundaries, exit behavior, and voice remain governed by their source contracts." }, "pushback_strength": { "classification": "EQUIVALENT", - "evidence": "The candidate exactly matches the deterministic installable port of the pinned 1.x workflow; only enumerated package-local path mechanics differ from the immutable oracle." + "evidence": "The candidate exactly matches the deterministic canonical specialist render of the pinned workflow. The retired shared onboarding wrapper is excluded and carved specialist phases are package-local lazy references; specialist questions, pressure, gates, evidence, artifacts, mutation boundaries, exit behavior, and voice remain governed by their source contracts." }, "scope_recommendation": { "classification": "EQUIVALENT", - "evidence": "The candidate exactly matches the deterministic installable port of the pinned 1.x workflow; only enumerated package-local path mechanics differ from the immutable oracle." + "evidence": "The candidate exactly matches the deterministic canonical specialist render of the pinned workflow. The retired shared onboarding wrapper is excluded and carved specialist phases are package-local lazy references; specialist questions, pressure, gates, evidence, artifacts, mutation boundaries, exit behavior, and voice remain governed by their source contracts." }, "active_reasoning_modules": { "classification": "EQUIVALENT", @@ -128,35 +128,35 @@ }, "findings": { "classification": "EQUIVALENT", - "evidence": "The candidate exactly matches the deterministic installable port of the pinned 1.x workflow; only enumerated package-local path mechanics differ from the immutable oracle." + "evidence": "The candidate exactly matches the deterministic canonical specialist render of the pinned workflow. The retired shared onboarding wrapper is excluded and carved specialist phases are package-local lazy references; specialist questions, pressure, gates, evidence, artifacts, mutation boundaries, exit behavior, and voice remain governed by their source contracts." }, "evidence": { "classification": "EQUIVALENT", - "evidence": "The candidate exactly matches the deterministic installable port of the pinned 1.x workflow; only enumerated package-local path mechanics differ from the immutable oracle." + "evidence": "The candidate exactly matches the deterministic canonical specialist render of the pinned workflow. The retired shared onboarding wrapper is excluded and carved specialist phases are package-local lazy references; specialist questions, pressure, gates, evidence, artifacts, mutation boundaries, exit behavior, and voice remain governed by their source contracts." }, "artifacts": { "classification": "EQUIVALENT", - "evidence": "The candidate exactly matches the deterministic installable port of the pinned 1.x workflow; only enumerated package-local path mechanics differ from the immutable oracle." + "evidence": "The candidate exactly matches the deterministic canonical specialist render of the pinned workflow. The retired shared onboarding wrapper is excluded and carved specialist phases are package-local lazy references; specialist questions, pressure, gates, evidence, artifacts, mutation boundaries, exit behavior, and voice remain governed by their source contracts." }, "approval_gates": { "classification": "EQUIVALENT", - "evidence": "The candidate exactly matches the deterministic installable port of the pinned 1.x workflow; only enumerated package-local path mechanics differ from the immutable oracle." + "evidence": "The candidate exactly matches the deterministic canonical specialist render of the pinned workflow. The retired shared onboarding wrapper is excluded and carved specialist phases are package-local lazy references; specialist questions, pressure, gates, evidence, artifacts, mutation boundaries, exit behavior, and voice remain governed by their source contracts." }, "mutation_behavior": { "classification": "EQUIVALENT", - "evidence": "The candidate exactly matches the deterministic installable port of the pinned 1.x workflow; only enumerated package-local path mechanics differ from the immutable oracle." + "evidence": "The candidate exactly matches the deterministic canonical specialist render of the pinned workflow. The retired shared onboarding wrapper is excluded and carved specialist phases are package-local lazy references; specialist questions, pressure, gates, evidence, artifacts, mutation boundaries, exit behavior, and voice remain governed by their source contracts." }, "completion_status": { "classification": "EQUIVALENT", - "evidence": "The candidate exactly matches the deterministic installable port of the pinned 1.x workflow; only enumerated package-local path mechanics differ from the immutable oracle." + "evidence": "The candidate exactly matches the deterministic canonical specialist render of the pinned workflow. The retired shared onboarding wrapper is excluded and carved specialist phases are package-local lazy references; specialist questions, pressure, gates, evidence, artifacts, mutation boundaries, exit behavior, and voice remain governed by their source contracts." }, "recommended_next_action": { "classification": "EQUIVALENT", - "evidence": "The candidate exactly matches the deterministic installable port of the pinned 1.x workflow; only enumerated package-local path mechanics differ from the immutable oracle." + "evidence": "The candidate exactly matches the deterministic canonical specialist render of the pinned workflow. The retired shared onboarding wrapper is excluded and carved specialist phases are package-local lazy references; specialist questions, pressure, gates, evidence, artifacts, mutation boundaries, exit behavior, and voice remain governed by their source contracts." }, "voice": { "classification": "EQUIVALENT", - "evidence": "The candidate exactly matches the deterministic installable port of the pinned 1.x workflow; only enumerated package-local path mechanics differ from the immutable oracle." + "evidence": "The candidate exactly matches the deterministic canonical specialist render of the pinned workflow. The retired shared onboarding wrapper is excluded and carved specialist phases are package-local lazy references; specialist questions, pressure, gates, evidence, artifacts, mutation boundaries, exit behavior, and voice remain governed by their source contracts." } }, "verdict": "PASS" diff --git a/evals/parity/transcripts/deterministic/ship.json b/evals/parity/transcripts/deterministic/ship.json index e8f447ea9..8a9c761ec 100644 --- a/evals/parity/transcripts/deterministic/ship.json +++ b/evals/parity/transcripts/deterministic/ship.json @@ -56,21 +56,21 @@ } }, "mechanical_port": { - "rendered_sha256": "b2f1d5bc59ec1a35fb367cc242131dc288ca1c9cf1baa8cefe9165b45f9841bc", + "rendered_sha256": "ab7a7219653b0fc5cdad0bb2959394798bc50ae4db4dc24b76c0454dd1b1397a", "differs_from_baseline": true, - "allowed_difference": "Package-local skill, section, support-artifact, and stable runtime path relocation only." + "allowed_difference": "Canonical GStack 2 carve: exclude the retired shared onboarding wrapper and host hook advisory; resolve retired invocations to six public routes; relocate host/runtime paths; lazy-load pinned carved sections from package-local references." }, "candidate": { "target_path": "skills/ship/references/legacy/ship.md", - "rendered_legacy_body_sha256": "b2f1d5bc59ec1a35fb367cc242131dc288ca1c9cf1baa8cefe9165b45f9841bc", + "rendered_legacy_body_sha256": "ab7a7219653b0fc5cdad0bb2959394798bc50ae4db4dc24b76c0454dd1b1397a", "semantic_signature": { - "normalized_sha256": "b2f1d5bc59ec1a35fb367cc242131dc288ca1c9cf1baa8cefe9165b45f9841bc", - "headings_sha256": "f7b15eeabb67c2dc83600bf0d6b9e1554292db8676e18cc6e59580eab5bda5fc", - "questions_sha256": "1cd08aeefafe7764f5a3a49e5fe919bd7864cdcf67612cb788c8b416c126c866", - "obligations_sha256": "9b0a9e9016af7734910940433d6803bcd6300026d0ba050403f44daec9d98d9a", - "heading_count": 92, - "question_count": 14, - "obligation_count": 202 + "normalized_sha256": "ab7a7219653b0fc5cdad0bb2959394798bc50ae4db4dc24b76c0454dd1b1397a", + "headings_sha256": "42c12606506cfd2cfd31dc678c91d63b0212aa4e424730f5b9e257ab033c4958", + "questions_sha256": "943ac3bc0b28becb558873810d1884e4311865a10cbd44a2b8c8ae0184fece84", + "obligations_sha256": "134233894787ff09edb0506fdede185d24a756fc3278fe2e81790296bd48ca8c", + "heading_count": 26, + "question_count": 1, + "obligation_count": 70 } }, "deterministic_comparison": { @@ -114,27 +114,27 @@ "semantic_dimensions": { "questions": { "classification": "EQUIVALENT", - "evidence": "The candidate exactly matches the deterministic installable port of the pinned 1.x workflow; only enumerated package-local path mechanics differ from the immutable oracle." + "evidence": "The candidate exactly matches the deterministic canonical specialist render of the pinned workflow. The retired shared onboarding wrapper is excluded and carved specialist phases are package-local lazy references; specialist questions, pressure, gates, evidence, artifacts, mutation boundaries, exit behavior, and voice remain governed by their source contracts." }, "question_order": { "classification": "EQUIVALENT", - "evidence": "The candidate exactly matches the deterministic installable port of the pinned 1.x workflow; only enumerated package-local path mechanics differ from the immutable oracle." + "evidence": "The candidate exactly matches the deterministic canonical specialist render of the pinned workflow. The retired shared onboarding wrapper is excluded and carved specialist phases are package-local lazy references; specialist questions, pressure, gates, evidence, artifacts, mutation boundaries, exit behavior, and voice remain governed by their source contracts." }, "follow_up_pressure": { "classification": "EQUIVALENT", - "evidence": "The candidate exactly matches the deterministic installable port of the pinned 1.x workflow; only enumerated package-local path mechanics differ from the immutable oracle." + "evidence": "The candidate exactly matches the deterministic canonical specialist render of the pinned workflow. The retired shared onboarding wrapper is excluded and carved specialist phases are package-local lazy references; specialist questions, pressure, gates, evidence, artifacts, mutation boundaries, exit behavior, and voice remain governed by their source contracts." }, "smart_skips": { "classification": "EQUIVALENT", - "evidence": "The candidate exactly matches the deterministic installable port of the pinned 1.x workflow; only enumerated package-local path mechanics differ from the immutable oracle." + "evidence": "The candidate exactly matches the deterministic canonical specialist render of the pinned workflow. The retired shared onboarding wrapper is excluded and carved specialist phases are package-local lazy references; specialist questions, pressure, gates, evidence, artifacts, mutation boundaries, exit behavior, and voice remain governed by their source contracts." }, "pushback_strength": { "classification": "EQUIVALENT", - "evidence": "The candidate exactly matches the deterministic installable port of the pinned 1.x workflow; only enumerated package-local path mechanics differ from the immutable oracle." + "evidence": "The candidate exactly matches the deterministic canonical specialist render of the pinned workflow. The retired shared onboarding wrapper is excluded and carved specialist phases are package-local lazy references; specialist questions, pressure, gates, evidence, artifacts, mutation boundaries, exit behavior, and voice remain governed by their source contracts." }, "scope_recommendation": { "classification": "EQUIVALENT", - "evidence": "The candidate exactly matches the deterministic installable port of the pinned 1.x workflow; only enumerated package-local path mechanics differ from the immutable oracle." + "evidence": "The candidate exactly matches the deterministic canonical specialist render of the pinned workflow. The retired shared onboarding wrapper is excluded and carved specialist phases are package-local lazy references; specialist questions, pressure, gates, evidence, artifacts, mutation boundaries, exit behavior, and voice remain governed by their source contracts." }, "active_reasoning_modules": { "classification": "EQUIVALENT", @@ -142,35 +142,35 @@ }, "findings": { "classification": "EQUIVALENT", - "evidence": "The candidate exactly matches the deterministic installable port of the pinned 1.x workflow; only enumerated package-local path mechanics differ from the immutable oracle." + "evidence": "The candidate exactly matches the deterministic canonical specialist render of the pinned workflow. The retired shared onboarding wrapper is excluded and carved specialist phases are package-local lazy references; specialist questions, pressure, gates, evidence, artifacts, mutation boundaries, exit behavior, and voice remain governed by their source contracts." }, "evidence": { "classification": "EQUIVALENT", - "evidence": "The candidate exactly matches the deterministic installable port of the pinned 1.x workflow; only enumerated package-local path mechanics differ from the immutable oracle." + "evidence": "The candidate exactly matches the deterministic canonical specialist render of the pinned workflow. The retired shared onboarding wrapper is excluded and carved specialist phases are package-local lazy references; specialist questions, pressure, gates, evidence, artifacts, mutation boundaries, exit behavior, and voice remain governed by their source contracts." }, "artifacts": { "classification": "EQUIVALENT", - "evidence": "The candidate exactly matches the deterministic installable port of the pinned 1.x workflow; only enumerated package-local path mechanics differ from the immutable oracle." + "evidence": "The candidate exactly matches the deterministic canonical specialist render of the pinned workflow. The retired shared onboarding wrapper is excluded and carved specialist phases are package-local lazy references; specialist questions, pressure, gates, evidence, artifacts, mutation boundaries, exit behavior, and voice remain governed by their source contracts." }, "approval_gates": { "classification": "EQUIVALENT", - "evidence": "The candidate exactly matches the deterministic installable port of the pinned 1.x workflow; only enumerated package-local path mechanics differ from the immutable oracle." + "evidence": "The candidate exactly matches the deterministic canonical specialist render of the pinned workflow. The retired shared onboarding wrapper is excluded and carved specialist phases are package-local lazy references; specialist questions, pressure, gates, evidence, artifacts, mutation boundaries, exit behavior, and voice remain governed by their source contracts." }, "mutation_behavior": { "classification": "EQUIVALENT", - "evidence": "The candidate exactly matches the deterministic installable port of the pinned 1.x workflow; only enumerated package-local path mechanics differ from the immutable oracle." + "evidence": "The candidate exactly matches the deterministic canonical specialist render of the pinned workflow. The retired shared onboarding wrapper is excluded and carved specialist phases are package-local lazy references; specialist questions, pressure, gates, evidence, artifacts, mutation boundaries, exit behavior, and voice remain governed by their source contracts." }, "completion_status": { "classification": "EQUIVALENT", - "evidence": "The candidate exactly matches the deterministic installable port of the pinned 1.x workflow; only enumerated package-local path mechanics differ from the immutable oracle." + "evidence": "The candidate exactly matches the deterministic canonical specialist render of the pinned workflow. The retired shared onboarding wrapper is excluded and carved specialist phases are package-local lazy references; specialist questions, pressure, gates, evidence, artifacts, mutation boundaries, exit behavior, and voice remain governed by their source contracts." }, "recommended_next_action": { "classification": "EQUIVALENT", - "evidence": "The candidate exactly matches the deterministic installable port of the pinned 1.x workflow; only enumerated package-local path mechanics differ from the immutable oracle." + "evidence": "The candidate exactly matches the deterministic canonical specialist render of the pinned workflow. The retired shared onboarding wrapper is excluded and carved specialist phases are package-local lazy references; specialist questions, pressure, gates, evidence, artifacts, mutation boundaries, exit behavior, and voice remain governed by their source contracts." }, "voice": { "classification": "EQUIVALENT", - "evidence": "The candidate exactly matches the deterministic installable port of the pinned 1.x workflow; only enumerated package-local path mechanics differ from the immutable oracle." + "evidence": "The candidate exactly matches the deterministic canonical specialist render of the pinned workflow. The retired shared onboarding wrapper is excluded and carved specialist phases are package-local lazy references; specialist questions, pressure, gates, evidence, artifacts, mutation boundaries, exit behavior, and voice remain governed by their source contracts." } }, "verdict": "PASS" diff --git a/evals/parity/transcripts/deterministic/specification.json b/evals/parity/transcripts/deterministic/specification.json index dc18147af..9517efa32 100644 --- a/evals/parity/transcripts/deterministic/specification.json +++ b/evals/parity/transcripts/deterministic/specification.json @@ -58,21 +58,21 @@ } }, "mechanical_port": { - "rendered_sha256": "1693c430139d43e80d2981d95a61dc9d3674435690d5d838f4ca92f4d592694a", + "rendered_sha256": "059ec7a95791f6fc559f4e2321d7340ef5ae7e4ba89949df401f74d91411bfd3", "differs_from_baseline": true, - "allowed_difference": "Package-local skill, section, support-artifact, and stable runtime path relocation only." + "allowed_difference": "Canonical GStack 2 carve: exclude the retired shared onboarding wrapper and host hook advisory; resolve retired invocations to six public routes; relocate host/runtime paths; lazy-load pinned carved sections from package-local references." }, "candidate": { "target_path": "skills/plan/references/legacy/spec.md", - "rendered_legacy_body_sha256": "1693c430139d43e80d2981d95a61dc9d3674435690d5d838f4ca92f4d592694a", + "rendered_legacy_body_sha256": "059ec7a95791f6fc559f4e2321d7340ef5ae7e4ba89949df401f74d91411bfd3", "semantic_signature": { - "normalized_sha256": "1693c430139d43e80d2981d95a61dc9d3674435690d5d838f4ca92f4d592694a", - "headings_sha256": "5d9a342b2cbefecc34b83f9c7fe5f5e65a1905cab08f1862bb390f71a9fa5f3d", - "questions_sha256": "7172d84e358157f2a1bcdb7c26f3c72e2081a025b0da0768e45547a6ed814ef8", - "obligations_sha256": "8833c6a70bdade52727c4d115f4c360071cd3a151172b72c32802c3463c1a6ba", - "heading_count": 93, - "question_count": 11, - "obligation_count": 164 + "normalized_sha256": "059ec7a95791f6fc559f4e2321d7340ef5ae7e4ba89949df401f74d91411bfd3", + "headings_sha256": "339ccc4b1c0d870b7c696ef28b1116ee22742a81d7b8713040a2766a3e36c3c3", + "questions_sha256": "d98a7e322b838c543487c19d59332501a4393513b5f1a58b2ba4ac6cf911aa67", + "obligations_sha256": "7f6a3078d1b84288b26cf37943d7a036d8f7a50d7a1dcea6aefe96c297662a6b", + "heading_count": 42, + "question_count": 5, + "obligation_count": 55 } }, "deterministic_comparison": { @@ -95,27 +95,27 @@ "semantic_dimensions": { "questions": { "classification": "EQUIVALENT", - "evidence": "The candidate exactly matches the deterministic installable port of the pinned 1.x workflow; only enumerated package-local path mechanics differ from the immutable oracle." + "evidence": "The candidate exactly matches the deterministic canonical specialist render of the pinned workflow. The retired shared onboarding wrapper is excluded and carved specialist phases are package-local lazy references; specialist questions, pressure, gates, evidence, artifacts, mutation boundaries, exit behavior, and voice remain governed by their source contracts." }, "question_order": { "classification": "EQUIVALENT", - "evidence": "The candidate exactly matches the deterministic installable port of the pinned 1.x workflow; only enumerated package-local path mechanics differ from the immutable oracle." + "evidence": "The candidate exactly matches the deterministic canonical specialist render of the pinned workflow. The retired shared onboarding wrapper is excluded and carved specialist phases are package-local lazy references; specialist questions, pressure, gates, evidence, artifacts, mutation boundaries, exit behavior, and voice remain governed by their source contracts." }, "follow_up_pressure": { "classification": "EQUIVALENT", - "evidence": "The candidate exactly matches the deterministic installable port of the pinned 1.x workflow; only enumerated package-local path mechanics differ from the immutable oracle." + "evidence": "The candidate exactly matches the deterministic canonical specialist render of the pinned workflow. The retired shared onboarding wrapper is excluded and carved specialist phases are package-local lazy references; specialist questions, pressure, gates, evidence, artifacts, mutation boundaries, exit behavior, and voice remain governed by their source contracts." }, "smart_skips": { "classification": "EQUIVALENT", - "evidence": "The candidate exactly matches the deterministic installable port of the pinned 1.x workflow; only enumerated package-local path mechanics differ from the immutable oracle." + "evidence": "The candidate exactly matches the deterministic canonical specialist render of the pinned workflow. The retired shared onboarding wrapper is excluded and carved specialist phases are package-local lazy references; specialist questions, pressure, gates, evidence, artifacts, mutation boundaries, exit behavior, and voice remain governed by their source contracts." }, "pushback_strength": { "classification": "EQUIVALENT", - "evidence": "The candidate exactly matches the deterministic installable port of the pinned 1.x workflow; only enumerated package-local path mechanics differ from the immutable oracle." + "evidence": "The candidate exactly matches the deterministic canonical specialist render of the pinned workflow. The retired shared onboarding wrapper is excluded and carved specialist phases are package-local lazy references; specialist questions, pressure, gates, evidence, artifacts, mutation boundaries, exit behavior, and voice remain governed by their source contracts." }, "scope_recommendation": { "classification": "EQUIVALENT", - "evidence": "The candidate exactly matches the deterministic installable port of the pinned 1.x workflow; only enumerated package-local path mechanics differ from the immutable oracle." + "evidence": "The candidate exactly matches the deterministic canonical specialist render of the pinned workflow. The retired shared onboarding wrapper is excluded and carved specialist phases are package-local lazy references; specialist questions, pressure, gates, evidence, artifacts, mutation boundaries, exit behavior, and voice remain governed by their source contracts." }, "active_reasoning_modules": { "classification": "EQUIVALENT", @@ -123,35 +123,35 @@ }, "findings": { "classification": "EQUIVALENT", - "evidence": "The candidate exactly matches the deterministic installable port of the pinned 1.x workflow; only enumerated package-local path mechanics differ from the immutable oracle." + "evidence": "The candidate exactly matches the deterministic canonical specialist render of the pinned workflow. The retired shared onboarding wrapper is excluded and carved specialist phases are package-local lazy references; specialist questions, pressure, gates, evidence, artifacts, mutation boundaries, exit behavior, and voice remain governed by their source contracts." }, "evidence": { "classification": "EQUIVALENT", - "evidence": "The candidate exactly matches the deterministic installable port of the pinned 1.x workflow; only enumerated package-local path mechanics differ from the immutable oracle." + "evidence": "The candidate exactly matches the deterministic canonical specialist render of the pinned workflow. The retired shared onboarding wrapper is excluded and carved specialist phases are package-local lazy references; specialist questions, pressure, gates, evidence, artifacts, mutation boundaries, exit behavior, and voice remain governed by their source contracts." }, "artifacts": { "classification": "EQUIVALENT", - "evidence": "The candidate exactly matches the deterministic installable port of the pinned 1.x workflow; only enumerated package-local path mechanics differ from the immutable oracle." + "evidence": "The candidate exactly matches the deterministic canonical specialist render of the pinned workflow. The retired shared onboarding wrapper is excluded and carved specialist phases are package-local lazy references; specialist questions, pressure, gates, evidence, artifacts, mutation boundaries, exit behavior, and voice remain governed by their source contracts." }, "approval_gates": { "classification": "EQUIVALENT", - "evidence": "The candidate exactly matches the deterministic installable port of the pinned 1.x workflow; only enumerated package-local path mechanics differ from the immutable oracle." + "evidence": "The candidate exactly matches the deterministic canonical specialist render of the pinned workflow. The retired shared onboarding wrapper is excluded and carved specialist phases are package-local lazy references; specialist questions, pressure, gates, evidence, artifacts, mutation boundaries, exit behavior, and voice remain governed by their source contracts." }, "mutation_behavior": { "classification": "EQUIVALENT", - "evidence": "The candidate exactly matches the deterministic installable port of the pinned 1.x workflow; only enumerated package-local path mechanics differ from the immutable oracle." + "evidence": "The candidate exactly matches the deterministic canonical specialist render of the pinned workflow. The retired shared onboarding wrapper is excluded and carved specialist phases are package-local lazy references; specialist questions, pressure, gates, evidence, artifacts, mutation boundaries, exit behavior, and voice remain governed by their source contracts." }, "completion_status": { "classification": "EQUIVALENT", - "evidence": "The candidate exactly matches the deterministic installable port of the pinned 1.x workflow; only enumerated package-local path mechanics differ from the immutable oracle." + "evidence": "The candidate exactly matches the deterministic canonical specialist render of the pinned workflow. The retired shared onboarding wrapper is excluded and carved specialist phases are package-local lazy references; specialist questions, pressure, gates, evidence, artifacts, mutation boundaries, exit behavior, and voice remain governed by their source contracts." }, "recommended_next_action": { "classification": "EQUIVALENT", - "evidence": "The candidate exactly matches the deterministic installable port of the pinned 1.x workflow; only enumerated package-local path mechanics differ from the immutable oracle." + "evidence": "The candidate exactly matches the deterministic canonical specialist render of the pinned workflow. The retired shared onboarding wrapper is excluded and carved specialist phases are package-local lazy references; specialist questions, pressure, gates, evidence, artifacts, mutation boundaries, exit behavior, and voice remain governed by their source contracts." }, "voice": { "classification": "EQUIVALENT", - "evidence": "The candidate exactly matches the deterministic installable port of the pinned 1.x workflow; only enumerated package-local path mechanics differ from the immutable oracle." + "evidence": "The candidate exactly matches the deterministic canonical specialist render of the pinned workflow. The retired shared onboarding wrapper is excluded and carved specialist phases are package-local lazy references; specialist questions, pressure, gates, evidence, artifacts, mutation boundaries, exit behavior, and voice remain governed by their source contracts." } }, "verdict": "PASS" diff --git a/evals/parity/transcripts/policy-units.json b/evals/parity/transcripts/policy-units.json index 937210208..eec2438fe 100644 --- a/evals/parity/transcripts/policy-units.json +++ b/evals/parity/transcripts/policy-units.json @@ -43,7 +43,7 @@ "prompt_sha256": "a0fcff9cad68f9305da861fa5a58990e1ef51d9d84298fe2df7ba8a2f56b1dba", "semantic_attempt_sha256": "7724c3d954f421753c597364c383bd76bc01ba9803f99fb14488287bb925aeb6" }, - "policy_sha256": "513496bc52ce25eb1f2cf0eda586cebcee8de1b8a693fb4df7bf1c76b31a2f45", + "policy_sha256": "951fd945e7ecb438bcedadccd563df430652d35f4cff1d513dfdcf16ee77d02d", "policy_present": true, "prompt_is_not_authority_input": true, "verdict": "PASS" @@ -88,7 +88,7 @@ "prompt_sha256": "04d82a21358f188cb823dcceeecaebea0b4ed8b9c1f8d00220ef3b499c48b1c8", "semantic_attempt_sha256": "9639406995955284517acb30f56b37dedc42a6c08142163dfa8fe0295105cbbf" }, - "policy_sha256": "289eaae3f831c25445369450610dbe4b29f79d1f04d62e01a9135ab199c771f2", + "policy_sha256": "e5fc3019062512de84ade87c8c45b34c8f46b95a65ef84a49fd25bbdee63e41e", "policy_present": true, "prompt_is_not_authority_input": true, "verdict": "PASS" @@ -138,7 +138,7 @@ "prompt_sha256": "8ad639f708a2ccd5c7c438b1dedf6afacdfa4eac3883a7a046ea23f29314e1c4", "semantic_attempt_sha256": "4c450039e4c622fbeaa34b7f7dfc810d3b7369aaf7e5f4d240cd6cc18a31331a" }, - "policy_sha256": "14c54e1ecf3ca0eea496511c19e7191c5bf7e4e4cdf1f050337e5fb1d0444c33", + "policy_sha256": "78df79ecb49744ff13f044b8f5a486705ef43172c4dc19d7dbc616d84f4d578c", "policy_present": true, "prompt_is_not_authority_input": true, "verdict": "PASS" @@ -188,7 +188,7 @@ "prompt_sha256": "d2aa9aee06a116bf04cb62772e8abdf8dbd606811b6d38565389c88e86c79ede", "semantic_attempt_sha256": "64885a66bdc6688b880cbb9a59babf314834c068eb040657501bf287bfcb0d2b" }, - "policy_sha256": "513496bc52ce25eb1f2cf0eda586cebcee8de1b8a693fb4df7bf1c76b31a2f45", + "policy_sha256": "951fd945e7ecb438bcedadccd563df430652d35f4cff1d513dfdcf16ee77d02d", "policy_present": true, "prompt_is_not_authority_input": true, "verdict": "PASS" @@ -232,7 +232,7 @@ "prompt_sha256": "377e3a2dfc7b04272f857d27e77c9aa3c9f36c3feb63c03e5aee3ecd3dea8e2a", "semantic_attempt_sha256": "a49b1528091886749278dc22e7da4556c090800989b2bca9c0e1c09dd880fed7" }, - "policy_sha256": "c3c75f24b41099bd26935b4501adfe033c947cb78b394a7b8227704feae4344b", + "policy_sha256": "7a8cb7346851f9d948139dbf33cb8c6dd5eb8b2cc7de94e30a53824a94f027a6", "policy_present": true, "prompt_is_not_authority_input": true, "verdict": "PASS" @@ -279,7 +279,7 @@ "prompt_sha256": "a01bb977de84e53d8ce3dfa427bcc93d73c6e449cd4e9c1ff63b436fd41fb0d1", "semantic_attempt_sha256": "ce5c64c62c3ff9b60949f34717dffbc908f62ce30f8a4a48ec182eba4363a206" }, - "policy_sha256": "5d068b6161390849fb0d788d5ec9b10af12902478cb30a275e25261d40f74b8d", + "policy_sha256": "a65efa55d992f63d0bdb356e1e8c4900b966364af1e22f0b6412e20e7ef30a58", "policy_present": true, "prompt_is_not_authority_input": true, "verdict": "PASS" @@ -330,7 +330,7 @@ "prompt_sha256": "95e97e26268ad7e509527e0f54c943ed6c4105d919f250648a2ad59ce77cbdb9", "semantic_attempt_sha256": "dacd11a78e32aeb6c0065496bedd4a9770f7bbac1036e003d3768fac41eb84f0" }, - "policy_sha256": "513496bc52ce25eb1f2cf0eda586cebcee8de1b8a693fb4df7bf1c76b31a2f45", + "policy_sha256": "951fd945e7ecb438bcedadccd563df430652d35f4cff1d513dfdcf16ee77d02d", "policy_present": true, "prompt_is_not_authority_input": true, "verdict": "PASS" @@ -381,7 +381,7 @@ "prompt_sha256": "bdd7e8adfa7c15cf8531f84c3adaaacc725075f1a78f7487225300750547b82d", "semantic_attempt_sha256": "32c11b63412c5d873ff29dcc87c45bef1b50daa218a5c6c1075864aa24d7c3b6" }, - "policy_sha256": "513496bc52ce25eb1f2cf0eda586cebcee8de1b8a693fb4df7bf1c76b31a2f45", + "policy_sha256": "951fd945e7ecb438bcedadccd563df430652d35f4cff1d513dfdcf16ee77d02d", "policy_present": true, "prompt_is_not_authority_input": true, "verdict": "PASS" @@ -426,7 +426,7 @@ "prompt_sha256": "51b7d53bc342e8632e34ae31a167cbde568ab5ee2a6dd2ccc980583a30604164", "semantic_attempt_sha256": "06f77b27c9bd360562655b23ca00a0dd021bdb14ebaaf3d836845e4e0cb43d68" }, - "policy_sha256": "641614d3270ba45045ff24a80312df40bfe24041bffefdce4bea451136dcd883", + "policy_sha256": "65f28f454b67d4904c1857a2a6cfcff387c0aa6e4ae58aec490bc95289dce59f", "policy_present": true, "prompt_is_not_authority_input": true, "verdict": "PASS" diff --git a/evals/parity/transcripts/sections.json b/evals/parity/transcripts/sections.json index 889de0788..ba70d6142 100644 --- a/evals/parity/transcripts/sections.json +++ b/evals/parity/transcripts/sections.json @@ -6,8 +6,10 @@ "parent_source": "cso", "target_path": "skills/review/references/legacy/cso.md", "baseline_render_sha256": "c38fd2a45788de0fefde11f46b5defc8e389a466baaefa49c81f250ee16d7a31", - "ported_render_sha256": "3cdacdfacc9cd3b494cfa89613ad74c7702c2f3ed10dbd88ed66bf1220f04260", - "candidate_occurrences": 1, + "ported_render_sha256": "7d9b74faf4ec5f215fda7bd9704ae7a2a20b5a0d06df722d776725b313128e8e", + "candidate_inline_occurrences": 0, + "candidate_lazy_reference_occurrences": 1, + "packaged_sha256": "7d9b74faf4ec5f215fda7bd9704ae7a2a20b5a0d06df722d776725b313128e8e", "classification": "EQUIVALENT" }, { @@ -15,8 +17,10 @@ "parent_source": "design-consultation", "target_path": "skills/design/references/legacy/design-consultation.md", "baseline_render_sha256": "232f019dead6cb913c6b0845f265fd9993383a05147ac4260369853053492d8b", - "ported_render_sha256": "2ca1a8fff531a5ff46c16b786eb139c31994a874f24d47d8f8bb8b4e8771f0b5", - "candidate_occurrences": 1, + "ported_render_sha256": "802acbf180b3720e15685f22e798083f6d480658a2072fc50c176413e7d5708d", + "candidate_inline_occurrences": 0, + "candidate_lazy_reference_occurrences": 1, + "packaged_sha256": "802acbf180b3720e15685f22e798083f6d480658a2072fc50c176413e7d5708d", "classification": "EQUIVALENT" }, { @@ -24,8 +28,10 @@ "parent_source": "document-release", "target_path": "skills/ship/references/legacy/document-release.md", "baseline_render_sha256": "68c4d42fce344fc9d834e1cd2bbe21dea119d416668ebb32ebe9e7c52b130f32", - "ported_render_sha256": "18629e13adba829b14ace992e523431733b1b383863fefff640a1c53dbe34fbe", - "candidate_occurrences": 1, + "ported_render_sha256": "83c9315922fc6cef23701f720fa7eeff0cfccc000c05db0570a6483326857b08", + "candidate_inline_occurrences": 0, + "candidate_lazy_reference_occurrences": 1, + "packaged_sha256": "83c9315922fc6cef23701f720fa7eeff0cfccc000c05db0570a6483326857b08", "classification": "EQUIVALENT" }, { @@ -33,8 +39,10 @@ "parent_source": "office-hours", "target_path": "skills/plan/references/legacy/office-hours.md", "baseline_render_sha256": "ca4ffc09d9515971a9c116e3acf12ae7d6ab2b93c79da0e69ac5f5105b4527b5", - "ported_render_sha256": "8ff3b11362cb41ca336651af3a2bb2561a2f788fac59fbb59d41ed41925a859f", - "candidate_occurrences": 1, + "ported_render_sha256": "6e5d16c2f9fcc658f4a77c679ba971577dfc91418d84146815be86bb4207f591", + "candidate_inline_occurrences": 0, + "candidate_lazy_reference_occurrences": 2, + "packaged_sha256": "6e5d16c2f9fcc658f4a77c679ba971577dfc91418d84146815be86bb4207f591", "classification": "EQUIVALENT" }, { @@ -42,8 +50,10 @@ "parent_source": "plan-ceo-review", "target_path": "skills/plan/references/legacy/plan-ceo-review.md", "baseline_render_sha256": "5df219bd5d3f838021964cf93170feddf1564b90894424de51931e2de184f444", - "ported_render_sha256": "0e0b90a422094f019e42f90be5bc4bc2aa6469449fd4a08e7a33d6883ac12c79", - "candidate_occurrences": 1, + "ported_render_sha256": "6f1f4b1dc3ae01231b5328e864f15d746f03325e074f04bbcf2f0a0df180ac99", + "candidate_inline_occurrences": 0, + "candidate_lazy_reference_occurrences": 2, + "packaged_sha256": "6f1f4b1dc3ae01231b5328e864f15d746f03325e074f04bbcf2f0a0df180ac99", "classification": "EQUIVALENT" }, { @@ -51,8 +61,10 @@ "parent_source": "plan-design-review", "target_path": "skills/design/references/legacy/plan-design-review.md", "baseline_render_sha256": "f70fee1c656304193e213adb3aa12b882f4b4841826652fc7df4defcd00994f9", - "ported_render_sha256": "6768a45e4f168bac7fb9af348cf221fec54bf55465c545577893415849c35ea8", - "candidate_occurrences": 1, + "ported_render_sha256": "78801f52c5bd12e4709089d892d24f82db4b5f767befb8ba02389d4307fa38da", + "candidate_inline_occurrences": 0, + "candidate_lazy_reference_occurrences": 2, + "packaged_sha256": "78801f52c5bd12e4709089d892d24f82db4b5f767befb8ba02389d4307fa38da", "classification": "EQUIVALENT" }, { @@ -60,8 +72,10 @@ "parent_source": "plan-devex-review", "target_path": "skills/plan/references/legacy/plan-devex-review.md", "baseline_render_sha256": "4567898687b5b4566e5566735e86e0a71db1e6d69e1b55006d599794401f89aa", - "ported_render_sha256": "9be109595821a4674f116c79060bc65d87606c3c07c31c4cd014040f3e802676", - "candidate_occurrences": 1, + "ported_render_sha256": "f74e7e8054cbda01f5a80493495428d5a181e7b2009eabbe81498147d37f1420", + "candidate_inline_occurrences": 0, + "candidate_lazy_reference_occurrences": 2, + "packaged_sha256": "f74e7e8054cbda01f5a80493495428d5a181e7b2009eabbe81498147d37f1420", "classification": "EQUIVALENT" }, { @@ -69,8 +83,10 @@ "parent_source": "plan-eng-review", "target_path": "skills/plan/references/legacy/plan-eng-review.md", "baseline_render_sha256": "780b427bfd6b28886538f8eccbfed8f600cf532fc102d81f7499f37469dcb61d", - "ported_render_sha256": "dadb7aede4f2fc530e45be2df1c147375acec488d9861b6ac6ace9aacc1d5d43", - "candidate_occurrences": 1, + "ported_render_sha256": "249494f052cc853f9ea99e0d06afcf9f783e7f5666e4abb5d760c3260f3c10fc", + "candidate_inline_occurrences": 0, + "candidate_lazy_reference_occurrences": 2, + "packaged_sha256": "249494f052cc853f9ea99e0d06afcf9f783e7f5666e4abb5d760c3260f3c10fc", "classification": "EQUIVALENT" }, { @@ -79,7 +95,9 @@ "target_path": "skills/ship/references/legacy/ship.md", "baseline_render_sha256": "c3ee106fbb6513ae45ddf0cb9498ad72a63f6b63c1af6807420d7ee7cf3abc80", "ported_render_sha256": "80c5b8c8b833e895479360ade3227a956ea2eba41c183840f163064e9d35dc5b", - "candidate_occurrences": 1, + "candidate_inline_occurrences": 0, + "candidate_lazy_reference_occurrences": 1, + "packaged_sha256": "80c5b8c8b833e895479360ade3227a956ea2eba41c183840f163064e9d35dc5b", "classification": "EQUIVALENT" }, { @@ -88,7 +106,9 @@ "target_path": "skills/ship/references/legacy/ship.md", "baseline_render_sha256": "e84b0e33f0dab6bef8cc66b8088630dbfa2d1868bd02c2c938ebfe3cccaeb970", "ported_render_sha256": "e84b0e33f0dab6bef8cc66b8088630dbfa2d1868bd02c2c938ebfe3cccaeb970", - "candidate_occurrences": 1, + "candidate_inline_occurrences": 0, + "candidate_lazy_reference_occurrences": 1, + "packaged_sha256": "e84b0e33f0dab6bef8cc66b8088630dbfa2d1868bd02c2c938ebfe3cccaeb970", "classification": "EQUIVALENT" }, { @@ -97,7 +117,9 @@ "target_path": "skills/ship/references/legacy/ship.md", "baseline_render_sha256": "48c59e532a5878215272cebfa1feecf466a35c44aee1fc1cbbf1691b6bfcd6a7", "ported_render_sha256": "2d457433edd3bd049a63aae9aac5d93701b3b141f2c6b03ca434173238854e06", - "candidate_occurrences": 1, + "candidate_inline_occurrences": 0, + "candidate_lazy_reference_occurrences": 1, + "packaged_sha256": "2d457433edd3bd049a63aae9aac5d93701b3b141f2c6b03ca434173238854e06", "classification": "EQUIVALENT" }, { @@ -105,8 +127,10 @@ "parent_source": "ship", "target_path": "skills/ship/references/legacy/ship.md", "baseline_render_sha256": "7aef2bc76d8a43d5618017d7b12482b341bd5691b4183271b0027f6a8055b1b2", - "ported_render_sha256": "9ad216289c2fdbcf2f7e1f8a5ca2257ab2875ea86b0681174a4065132a32c171", - "candidate_occurrences": 1, + "ported_render_sha256": "f6b79e888d69c68cd9a22fad9bb6b2f98e9eec2465813b3c006baca3a3f51958", + "candidate_inline_occurrences": 0, + "candidate_lazy_reference_occurrences": 1, + "packaged_sha256": "f6b79e888d69c68cd9a22fad9bb6b2f98e9eec2465813b3c006baca3a3f51958", "classification": "EQUIVALENT" }, { @@ -114,8 +138,10 @@ "parent_source": "ship", "target_path": "skills/ship/references/legacy/ship.md", "baseline_render_sha256": "813c4c75f1cc8c85ab3121f0a76966673118cf759d283c3ef5f6aa1ba64dd764", - "ported_render_sha256": "650dc896bf54eb2ab86a0fa1f4a1d759fb951452553581d5c685318cf6e8fa66", - "candidate_occurrences": 1, + "ported_render_sha256": "c45be8e6407b208154b0123c3d9e10658030c1b74067a1218d4a0115b0a1c83d", + "candidate_inline_occurrences": 0, + "candidate_lazy_reference_occurrences": 1, + "packaged_sha256": "c45be8e6407b208154b0123c3d9e10658030c1b74067a1218d4a0115b0a1c83d", "classification": "EQUIVALENT" }, { @@ -123,8 +149,10 @@ "parent_source": "ship", "target_path": "skills/ship/references/legacy/ship.md", "baseline_render_sha256": "21cbb6b729ac4069fb1c9626979ad821e5227463d783b16b70f67526208d697b", - "ported_render_sha256": "cbfee41463032434762b1c6abcbb6372b841832f733f102f4e8c6c49f1407bb2", - "candidate_occurrences": 1, + "ported_render_sha256": "655ffbe7d5f662bf333dc06143001a7746f6cc35993b29cb7d942135973fd1c8", + "candidate_inline_occurrences": 0, + "candidate_lazy_reference_occurrences": 1, + "packaged_sha256": "655ffbe7d5f662bf333dc06143001a7746f6cc35993b29cb7d942135973fd1c8", "classification": "EQUIVALENT" }, { @@ -132,8 +160,10 @@ "parent_source": "ship", "target_path": "skills/ship/references/legacy/ship.md", "baseline_render_sha256": "e60f59bd59b913c3092734f538b446a52dcccaa00ff69277e0551b13ac8ac1cd", - "ported_render_sha256": "50e493e72caa15cd5e5cf91db9557b7d861571dc583a84b76a73eb557f90dce0", - "candidate_occurrences": 1, + "ported_render_sha256": "3eeac50d8e6aef9e402926af2c35352cab640cdaafb3ff5eb63c9d54e907c800", + "candidate_inline_occurrences": 0, + "candidate_lazy_reference_occurrences": 1, + "packaged_sha256": "3eeac50d8e6aef9e402926af2c35352cab640cdaafb3ff5eb63c9d54e907c800", "classification": "EQUIVALENT" }, { @@ -141,8 +171,10 @@ "parent_source": "ship", "target_path": "skills/ship/references/legacy/ship.md", "baseline_render_sha256": "4335d2e4bf76e164cc767330d96dc69ce7478ec2298690ee6fe873b654c6cb3e", - "ported_render_sha256": "34f688383d85bc0cc76f9e4a669554a4b5c799b374c56b491f86c5daf1ff74b4", - "candidate_occurrences": 1, + "ported_render_sha256": "9cc20f7d1a99ff7200a6eac240b3d5c1cdbe2772422f7ee15a4752f4b2f22f0a", + "candidate_inline_occurrences": 0, + "candidate_lazy_reference_occurrences": 1, + "packaged_sha256": "9cc20f7d1a99ff7200a6eac240b3d5c1cdbe2772422f7ee15a4752f4b2f22f0a", "classification": "EQUIVALENT" } ] diff --git a/ios-qa/scripts/physical-device-smoke.ts b/ios-qa/scripts/physical-device-smoke.ts index 2e58a0b13..4b862a7fb 100644 --- a/ios-qa/scripts/physical-device-smoke.ts +++ b/ios-qa/scripts/physical-device-smoke.ts @@ -1083,7 +1083,15 @@ async function deviceRequest( ): Promise { const host = tunnel.ipv6Addr.includes(':') ? `[${tunnel.ipv6Addr}]` : tunnel.ipv6Addr; const token = options.token === undefined ? tunnel.bootTokenRotated : options.token; - const headers: Record = { 'content-type': 'application/json' }; + // StateServer intentionally closes every response. Bun's fetch pool can + // otherwise race to reuse that just-closed CoreDevice IPv6 socket: the first + // two requests succeed and the next request fails with "socket connection + // was closed unexpectedly". Mark each request non-persistent so every live + // check gets a fresh tunnel connection, matching the server contract. + const headers: Record = { + 'content-type': 'application/json', + connection: 'close', + }; if (token) headers.authorization = `Bearer ${token}`; if (options.sessionId) headers['x-session-id'] = options.sessionId; if (options.expectedBundle) headers['x-gstack-expected-bundle-id'] = options.expectedBundle; @@ -1195,6 +1203,7 @@ function findTapButton(elements: FixtureElement[]): FixtureElement { 'elements', 'The live accessibility tree does not contain the fixture tap button', ['Keep FixtureApp foregrounded and inspect /elements for tap-button.'], + JSON.stringify(elements.slice(0, 20)), ); } return button; diff --git a/make-pdf/src/browseClient.ts b/make-pdf/src/browseClient.ts index da25677e5..c4e1be94b 100644 --- a/make-pdf/src/browseClient.ts +++ b/make-pdf/src/browseClient.ts @@ -145,8 +145,8 @@ export function resolveBrowseBin(env: NodeJS.ProcessEnv = process.env): string { ` - global: ${globalPath}`, " - PATH: `browse`", "", - "To fix: run gstack setup from the gstack repo:", - " cd ~/.claude/skills/gstack && ./setup", + "Run `gstack doctor --skill-api 2.0` to inspect readiness.", + "If browser is uninstalled, explicitly approve the current skill's runtime bootstrap for `--capability pdf`; PDF also selects browser and diagram.", "", "Or set GSTACK_BROWSE_BIN explicitly:", process.platform === "win32" diff --git a/make-pdf/src/diagram-prepass.ts b/make-pdf/src/diagram-prepass.ts index bf12249bb..93ff43ff0 100644 --- a/make-pdf/src/diagram-prepass.ts +++ b/make-pdf/src/diagram-prepass.ts @@ -450,7 +450,7 @@ export function resolveBundlePath(env: NodeJS.ProcessEnv = process.env): string throw new Error( "diagram-render bundle not found. Tried:\n" + candidates.map((c) => ` - ${c}`).join("\n") + - "\nRun `bun run build:diagram-render` (repo) or re-run ./setup (install).", + "\nRun `bun run build:diagram-render` in a reviewed checkout, or run `gstack doctor --skill-api 2.0` and explicitly approve the current skill's runtime bootstrap for `--capability pdf`.", ); } diff --git a/make-pdf/src/setup.ts b/make-pdf/src/setup.ts index 4137f7013..51c7612fb 100644 --- a/make-pdf/src/setup.ts +++ b/make-pdf/src/setup.ts @@ -41,8 +41,8 @@ export async function runSetup(): Promise { } catch (err: any) { process.stderr.write(" FAIL\n"); process.stderr.write(`\nChromium failed to launch: ${err.message}\n`); - process.stderr.write("\nTo fix: run gstack setup from the gstack repo:\n"); - process.stderr.write(" cd ~/.claude/skills/gstack && ./setup\n"); + process.stderr.write("\nRun `gstack doctor --skill-api 2.0` to inspect readiness.\n"); + process.stderr.write("If browser is uninstalled, explicitly approve the current skill's runtime bootstrap for `--capability pdf`; PDF also selects browser and diagram.\n"); process.exit(4); } finally { if (chromiumTab !== null) { diff --git a/make-pdf/test/browseClient.test.ts b/make-pdf/test/browseClient.test.ts index 072278e50..adfde827d 100644 --- a/make-pdf/test/browseClient.test.ts +++ b/make-pdf/test/browseClient.test.ts @@ -85,7 +85,8 @@ describe("resolveBrowseBin", () => { if (thrown) { expect(thrown).toBeInstanceOf(BrowseClientError); expect((thrown as BrowseClientError).message).toContain("browse binary not found"); - expect((thrown as BrowseClientError).message).toContain("./setup"); + expect((thrown as BrowseClientError).message).toContain("gstack doctor --skill-api 2.0"); + expect((thrown as BrowseClientError).message).toContain("--capability pdf"); expect((thrown as BrowseClientError).message).toContain("GSTACK_BROWSE_BIN"); // Back-compat alias still surfaces in the diagnostic. expect((thrown as BrowseClientError).message).toContain("BROWSE_BIN"); diff --git a/package.json b/package.json index 2f2be33c5..bd4ab1dcd 100644 --- a/package.json +++ b/package.json @@ -1,14 +1,25 @@ { "name": "gstack", "version": "1.60.1.0", - "description": "Garry's Stack — Claude Code skills + fast headless browser. One repo, one install, entire AI engineering workflow.", + "description": "GStack 2 — six portable Agent Skills with an optional host-neutral runtime.", "license": "MIT", "type": "module", - "bin": { - "browse": "./browse/dist/browse", - "gstack": "./bin/gstack", - "make-pdf": "./make-pdf/dist/pdf" + "gstack": { + "packageRole": "runtime-control", + "runtimeVersion": "2.0.0", + "skillApi": "2.0" }, + "bin": { + "gstack": "./bin/gstack", + "gstack-runtime-bootstrap": "./runtime/runtime-bootstrap.mjs" + }, + "files": [ + "bin/gstack", + "runtime", + "README.md", + "LICENSE", + "VERSION" + ], "scripts": { "build": "bash scripts/build.sh", "build:runtime": "bash scripts/build.sh --runtime-only", @@ -54,6 +65,7 @@ "eval:select": "bun run scripts/eval-select.ts", "analytics": "bun run scripts/analytics.ts", "test:audit": "bun test test/audit-compliance.test.ts", + "check:release": "bun test test/release-hardening.test.ts", "slop": "npx slop-scan scan . 2>/dev/null || echo 'slop-scan not available (install with: npm i -g slop-scan)'", "slop:diff": "bun run scripts/slop-diff.ts" }, @@ -64,7 +76,6 @@ "html-to-docx": "1.8.0", "marked": "^18.0.2", "playwright": "^1.58.2", - "puppeteer-core": "^24.40.0", "sharp": "^0.34.5", "socks": "^2.8.8", "xterm": "5", diff --git a/runtime/cli.js b/runtime/cli.js index deee852de..620b8803a 100644 --- a/runtime/cli.js +++ b/runtime/cli.js @@ -61,7 +61,8 @@ export async function main(argv = process.argv.slice(2), options = {}) { try { switch (command) { case "setup": - return await setupCommand({ args, home, cwd, stdout }); + case "init": + return await initCommand({ args, home, cwd, stdout, legacyAlias: command === "setup" }); case "doctor": return await doctorCommand({ args, home, cwd, stdout }); case "paths": @@ -73,7 +74,10 @@ export async function main(argv = process.argv.slice(2), options = {}) { case "state": return await stateCommand({ args, home, cwd, env, stdout, stderr }); case "context": - return await contextCommand({ args, home, cwd, env, stdin, stdout, stderr }); + return await contextCommand({ + args, home, cwd, env, stdin, stdout, stderr, + clientFactory: options.contextClientFactory ?? ((clientOptions) => new ContextClient(clientOptions)), + }); case "cleanup": return await cleanupCommand({ args, home, stdout }); case "upgrade": @@ -140,17 +144,18 @@ async function pathsCommand({ args, home, stdout }) { return 0; } -async function setupCommand({ args, home, cwd, stdout }) { +async function initCommand({ args, home, cwd, stdout, legacyAlias = false }) { rejectUnknown(args, []); const result = await setupRuntime({ home, cwd }); - write(stdout, `gstack is ready\nhome: ${result.paths.home}\nproject: ${result.identity.projectId}\nnetwork: off\nContext.dev key setup: https://www.context.dev/auth.md\n`); + write(stdout, `${legacyAlias ? "Note: `gstack setup` initializes state only; use `gstack init` for this operation.\n" : ""}GStack state initialized\nhome: ${result.paths.home}\nproject: ${result.identity.projectId}\nnetwork: ${result.config.network.mode}\noptional runtime: unchanged (run \`gstack doctor\` for capability readiness)\n`); return 0; } async function doctorCommand({ args, home, cwd, stdout }) { - rejectUnknown(args, ["--json"]); - const report = await runDoctor({ home, cwd }); - write(stdout, args.includes("--json") ? `${JSON.stringify(report, null, 2)}\n` : formatDoctor(report)); + const parsed = parseFlags(args, new Set(["--json", "--skill-api"])); + if (parsed.positionals.length) throw cliError("Doctor accepts only named options", "USAGE"); + const report = await runDoctor({ home, cwd, expectedSkillApi: parsed.values.get("--skill-api") }); + write(stdout, parsed.flags.has("--json") ? `${JSON.stringify(report, null, 2)}\n` : formatDoctor(report)); return report.ok ? 0 : 1; } @@ -372,14 +377,14 @@ async function withOwnedRuntimeMutation(home, callback) { }); } -async function contextCommand({ args, home, cwd, env, stdin, stdout, stderr }) { +async function contextCommand({ args, home, cwd, env, stdin, stdout, stderr, clientFactory }) { const [action, ...rest] = args; if (action === "status") { rejectUnknown(rest, ["--json"]); const status = await contextStatus(home, env); if (rest.includes("--json")) write(stdout, `${JSON.stringify(status, null, 2)}\n`); else { - write(stdout, `Context.dev: ${status.contextReady ? "ready" : "not ready"}\nkey: ${status.configured ? `configured (${status.keySource})` : "missing"}\nweb context: ${status.selection ?? "not selected"}\nconsent: ${status.consent ? "yes" : "no"}\n`); + write(stdout, `Context.dev: ${status.contextReady ? "ready" : "not ready"}\nkey: ${status.configured ? `configured (${status.keySource})` : "missing"}\nvalidation: ${status.validation}\nweb context: ${status.selection ?? "not selected"}\nconsent: ${status.consent ? "yes" : "no"}\n`); } return status.ready ? 0 : 1; } @@ -407,7 +412,7 @@ async function contextCommand({ args, home, cwd, env, stdin, stdout, stderr }) { if (rest.some((arg) => /key|token|secret/i.test(arg) || /^ctxt_secret_/i.test(arg))) { throw cliError("API keys must be supplied through hidden stdin or CONTEXT_DEV_API_KEY, never argv", "KEY_ON_COMMAND_LINE"); } - rejectUnknown(rest, ["--consent"]); + rejectUnknown(rest, ["--consent", "--offline"]); await setupRuntime({ home, cwd }); let consent = rest.includes("--consent"); if (!consent) { @@ -430,6 +435,24 @@ async function contextCommand({ args, home, cwd, env, stdin, stdout, stderr }) { : (await readStream(stdin)).trim(); } validateContextKey(key); + const offline = rest.includes("--offline"); + let verification = { status: "unverified", checkedAt: null }; + if (!offline) { + const client = clientFactory({ + home, + env, + key, + config: { + network: { mode: "context", consent: true, selection: "context" }, + context: { baseUrl: "https://api.context.dev/v1", validation: { status: "verified" } }, + }, + }); + await client.scrapeMarkdown("https://www.context.dev", { + useMainContentOnly: true, + maxAgeMs: 86_400_000, + }); + verification = { status: "verified", checkedAt: new Date().toISOString() }; + } await withOwnedRuntimeMutation(home, async () => { await secretSet(home, "context.apiKey", key); await configSetNetworkChoice(home, { @@ -437,14 +460,18 @@ async function contextCommand({ args, home, cwd, env, stdin, stdout, stderr }) { consent: true, selection: "context", }); + await configSet(home, "context.validation", verification); }); - write(stdout, "Context.dev configured. The key is stored privately; network mode is context.\nKey source: https://www.context.dev/auth.md\n"); + write(stdout, offline + ? "Context.dev key saved but unverified. Provider operations remain blocked until `gstack context setup --consent` verifies it online.\n" + : "Context.dev configured and verified. The key is stored privately; network mode is context.\nKey source: https://www.context.dev/auth.md\n"); return 0; } if (action === "smoke") { const parsed = parseFlags(rest, new Set(["--url", "--json"])); + if (parsed.positionals.length) throw cliError("Context smoke accepts only --url and --json", "USAGE"); const url = parsed.values.get("--url") ?? "https://www.context.dev"; - const client = new ContextClient({ home, env }); + const client = clientFactory({ home, env }); const response = await client.scrapeMarkdown(url, { useMainContentOnly: true, maxAgeMs: 86_400_000 }); const result = { ok: true, @@ -456,11 +483,55 @@ async function contextCommand({ args, home, cwd, env, stdin, stdout, stderr }) { `Context.dev smoke test passed for ${url}${result.creditsRemaining == null ? "" : ` (${result.creditsRemaining} credits remaining)`}\n`); return 0; } - throw cliError("Usage: gstack context status|options|select|setup|smoke", "USAGE"); + if (["scrape-markdown", "scrape-html", "crawl", "sitemap", "screenshot"].includes(action)) { + return contextOperation({ action, args: rest, home, env, stdout, clientFactory }); + } + throw cliError("Usage: gstack context status|options|select|setup|smoke|scrape-markdown|scrape-html|crawl|sitemap|screenshot", "USAGE"); +} + +async function contextOperation({ action, args, home, env, stdout, clientFactory }) { + const parsed = parseFlags(args, new Set([ + "--json", "--main-content", "--full-page", "--max-pages", "--max-depth", "--max-links", + ])); + const target = parsed.positionals?.[0]; + if (!target || parsed.positionals.length !== 1) { + throw cliError(`Usage: gstack context ${action} [options]`, "USAGE"); + } + const client = clientFactory({ home, env }); + let response; + if (action === "scrape-markdown") { + response = await client.scrapeMarkdown(target, { useMainContentOnly: parsed.flags.has("--main-content") }); + } else if (action === "scrape-html") { + response = await client.scrapeHtml(target, { useMainContentOnly: parsed.flags.has("--main-content") }); + } else if (action === "crawl") { + response = await client.crawl(target, numericContextOptions(parsed.values, [["--max-pages", "maxPages"], ["--max-depth", "maxDepth"]])); + } else if (action === "sitemap") { + response = await client.sitemap(target, numericContextOptions(parsed.values, [["--max-links", "maxLinks"]])); + } else { + response = await client.screenshot(target, { fullScreenshot: parsed.flags.has("--full-page") }); + } + if (parsed.flags.has("--json")) write(stdout, `${JSON.stringify(response, null, 2)}\n`); + else { + const preferred = action === "scrape-markdown" ? response.markdown : action === "scrape-html" ? response.html : null; + write(stdout, typeof preferred === "string" ? `${preferred}\n` : `${JSON.stringify(response, null, 2)}\n`); + } + return 0; +} + +function numericContextOptions(values, mappings) { + const result = {}; + for (const [flag, key] of mappings) { + if (!values.has(flag)) continue; + const value = Number(values.get(flag)); + if (!Number.isSafeInteger(value) || value < 1) throw cliError(`${flag} must be a positive integer`, "USAGE"); + result[key] = value; + } + return result; } async function cleanupCommand({ args, home, stdout }) { const parsed = parseFlags(args, new Set(["--dry-run", "--older-than-hours", "--json"])); + if (parsed.positionals.length) throw cliError("Cleanup accepts only named options", "USAGE"); const hoursRaw = parsed.values.get("--older-than-hours"); const hours = hoursRaw == null ? 24 : Number(hoursRaw); if (!Number.isFinite(hours) || hours < 0) throw cliError("--older-than-hours must be a non-negative number", "USAGE"); @@ -475,6 +546,7 @@ async function cleanupCommand({ args, home, stdout }) { async function upgradeCommand({ args, home, stdout, installOptions = {} }) { const parsed = parseFlags(args, new Set(["--source", "--version", "--rollback", "--json"])); + if (parsed.positionals.length) throw cliError("Upgrade accepts only named options", "USAGE"); if (parsed.flags.has("--rollback")) { if (parsed.values.has("--source") || parsed.values.has("--version")) throw cliError("--rollback cannot be combined with staging options", "USAGE"); const pointer = await rollbackUpgrade(home); @@ -550,16 +622,21 @@ function parseModuleList(value) { function parseFlags(args, allowed) { const flags = new Set(); const values = new Map(); + const positionals = []; for (let index = 0; index < args.length; index += 1) { const arg = args[index]; + if (!arg.startsWith("--")) { + positionals.push(arg); + continue; + } if (!allowed.has(arg)) throw cliError(`Unknown option: ${arg}`, "USAGE"); - if (["--source", "--version", "--url", "--older-than-hours"].includes(arg)) { + if (["--source", "--version", "--url", "--older-than-hours", "--max-pages", "--max-depth", "--max-links", "--skill-api"].includes(arg)) { const value = args[++index]; if (value == null || value.startsWith("--")) throw cliError(`${arg} requires a value`, "USAGE"); values.set(arg, value); } else flags.add(arg); } - return { flags, values }; + return { flags, values, positionals }; } function rejectUnknown(args, allowed) { @@ -628,8 +705,9 @@ function exitCodeFor(error) { function usage() { return `gstack ${RUNTIME_VERSION}\n\n` + "Usage:\n" + - " gstack setup\n" + - " gstack doctor [--json]\n" + + " gstack init # initialize state only\n" + + " gstack setup # compatibility alias for init\n" + + " gstack doctor [--skill-api ] [--json]\n" + " gstack paths [--json|--shell]\n" + " gstack runtime path \n" + " gstack config get [key]\n" + @@ -649,6 +727,10 @@ function usage() { " gstack context select host|local-browser|none\n" + " gstack context setup [--consent] # key from hidden stdin or env\n" + " gstack context smoke [--url ]\n" + + " gstack context scrape-markdown|scrape-html [--main-content] [--json]\n" + + " gstack context crawl [--max-pages N] [--max-depth N] [--json]\n" + + " gstack context sitemap [--max-links N] [--json]\n" + + " gstack context screenshot [--full-page] [--json]\n" + " gstack cleanup [--dry-run] [--older-than-hours N]\n" + " gstack upgrade --source --version | --rollback\n" + " gstack uninstall [--purge --yes]\n"; diff --git a/runtime/config.js b/runtime/config.js index d949e2e10..ddcc0cc50 100644 --- a/runtime/config.js +++ b/runtime/config.js @@ -6,7 +6,10 @@ import { resolveRuntimePaths } from "./paths.js"; export const DEFAULT_CONFIG = Object.freeze({ schemaVersion: 2, network: Object.freeze({ mode: "off", consent: false, selection: null }), - context: Object.freeze({ baseUrl: "https://api.context.dev/v1" }), + context: Object.freeze({ + baseUrl: "https://api.context.dev/v1", + validation: Object.freeze({ status: "unverified", checkedAt: null }), + }), cleanup: Object.freeze({ retentionDays: 30 }), }); @@ -199,6 +202,15 @@ function validateConfig(config) { throw new TypeError("context.baseUrl must be the official credential-free Context.dev v1 HTTPS endpoint"); } } + if (config.context?.validation != null) { + if (!["verified", "unverified"].includes(config.context.validation.status)) { + throw new TypeError("context.validation.status must be `verified` or `unverified`"); + } + if (config.context.validation.checkedAt != null && + !Number.isFinite(Date.parse(config.context.validation.checkedAt))) { + throw new TypeError("context.validation.checkedAt must be an ISO timestamp or null"); + } + } } function cloneDefaultConfig() { diff --git a/runtime/context.js b/runtime/context.js index c3f7365ff..4a9cfb471 100644 --- a/runtime/context.js +++ b/runtime/context.js @@ -522,7 +522,8 @@ function isPlainObject(value) { function hasContextNetworkConsent(config) { return config?.network?.selection === "context" && config?.network?.mode === "context" && - config?.network?.consent === true; + config?.network?.consent === true && + config?.context?.validation?.status !== "unverified"; } export async function contextStatus(home, env = process.env) { @@ -533,13 +534,15 @@ export async function contextStatus(home, env = process.env) { } catch (error) { if (error?.code !== "CONTEXT_KEY_MISSING") throw error; } - const contextReady = Boolean(keySource) && hasContextNetworkConsent(config); + const validation = config.context?.validation?.status ?? "unverified"; + const contextReady = Boolean(keySource) && hasContextNetworkConsent(config) && validation === "verified"; return { configured: Boolean(keySource), keySource, networkMode: config.network.mode, selection: config.network.selection, consent: config.network.consent === true, + validation, contextReady, ready: config.network.selection === "context" ? contextReady diff --git a/runtime/doctor.js b/runtime/doctor.js index 71c78869a..65f452e72 100644 --- a/runtime/doctor.js +++ b/runtime/doctor.js @@ -1,6 +1,7 @@ import { constants as fsConstants } from "node:fs"; import fs from "node:fs/promises"; import path from "node:path"; +import { pathToFileURL } from "node:url"; import { spawn as nodeSpawn } from "node:child_process"; import { resolveRuntimePaths } from "./paths.js"; import { readJson, pathExists } from "./storage.js"; @@ -8,18 +9,29 @@ import { discoverProjectIdentity } from "./identity.js"; import { RUNTIME_SCHEMA_VERSION, RUNTIME_MIGRATION_ID } from "./migrations.js"; import { assertManagedHome } from "./managed-home.js"; import { recoverPendingUpgrade } from "./upgrade.js"; +import { bashCandidates } from "./tooling.js"; +import { + OPTIONAL_RUNTIME_CAPABILITIES, + RUNTIME_CAPABILITY_DEPENDENCIES, + RUNTIME_COMPATIBILITY, + managedBunRelativePath, +} from "./install.js"; export async function runDoctor(options = {}) { const paths = resolveRuntimePaths(options); const checks = []; const add = (id, status, message, details) => checks.push({ id, status, message, ...(details ? { details } : {}) }); const now = options.now ? options.now() : new Date(); + const expectedSkillApi = options.expectedSkillApi ?? RUNTIME_COMPATIBILITY.skillApi; + if (typeof expectedSkillApi !== "string" || !/^[0-9A-Za-z][0-9A-Za-z._-]{0,31}$/.test(expectedSkillApi)) { + throw new TypeError("Expected skill API must be a short version identifier"); + } const node = await inspectLauncherNode(options.nodeCommand ?? process.env.GSTACK_NODE ?? "node"); - add("runtime", node.ok ? "pass" : "fail", node.message, node.details); + add("launcher-node", node.ok ? "pass" : "fail", node.message, node.details); if (!(await pathExists(paths.home))) { - add("home", "fail", `State home does not exist: ${paths.home}`, { remedy: "Run `gstack setup`." }); + add("home", "fail", `State home does not exist: ${paths.home}`, { remedy: "Run `gstack init`." }); } else { try { await fs.access(paths.home, fsConstants.R_OK | fsConstants.W_OK); @@ -33,7 +45,7 @@ export async function runDoctor(options = {}) { } catch (error) { add("ownership", "fail", `Managed home ownership cannot be verified: ${error.message}`, { code: error.code, - remedy: "Run `gstack setup` with the intended GSTACK_HOME.", + remedy: "Run `gstack init` with the intended GSTACK_HOME.", }); } } @@ -79,7 +91,7 @@ export async function runDoctor(options = {}) { add("project", valid ? "pass" : "fail", valid ? `Project state found for ${identity.projectId}` : "Project state identity/schema does not match"); } else { - add("project", "warn", `No state initialized for ${identity.projectId}`, { remedy: "Run `gstack setup`." }); + add("project", "warn", `No state initialized for ${identity.projectId}`, { remedy: "Run `gstack init`." }); } add("git", identity.isGit ? "pass" : "warn", identity.isGit ? `Git worktree ${identity.worktreeId}` : "Current directory is not a Git worktree"); @@ -90,14 +102,77 @@ export async function runDoctor(options = {}) { try { const recovery = await recoverPendingUpgrade(paths.home, options); const pointer = recovery.pointer; - if (!pointer) add("upgrade", "pass", "No managed version pointer (package-managed install)"); - else if (recovery.recovered) { - add("upgrade", pointer.current ? "warn" : "fail", pointer.current - ? `Recovered interrupted upgrade to last-known-good version: ${pointer.current}` - : "Interrupted upgrade had no valid last-known-good version"); - } else add("upgrade", "pass", pointer.current ? `Active managed version: ${pointer.current}` : "No active managed version"); + add("upgrade", recovery.recovered ? "warn" : "pass", recovery.recovered + ? `Recovered interrupted upgrade${pointer?.current ? ` to ${pointer.current}` : " without a last-known-good version"}` + : pointer?.current ? `Version pointer is active: ${pointer.current}` : "No pending managed runtime transaction"); + if (!pointer?.current) { + add("managed-runtime", "fail", "No active managed runtime", { + remedy: "Install the optional runtime explicitly from the GStack bootstrap package; judgment-only skills remain available.", + }); + for (const capability of OPTIONAL_RUNTIME_CAPABILITIES) { + add(`capability:${capability}`, "warn", "not installed"); + } + } else { + const activeRoot = path.join(paths.versions, pointer.current); + const stat = await fs.lstat(activeRoot).catch(() => null); + if (!stat?.isDirectory() || stat.isSymbolicLink()) { + add("managed-runtime", "fail", `Active managed runtime is missing or unsafe: ${pointer.current}`); + for (const capability of OPTIONAL_RUNTIME_CAPABILITIES) add(`capability:${capability}`, "warn", "runtime unavailable"); + } else { + const manifest = await readJson(path.join(activeRoot, ".gstack-bundle.json"), null); + const compatible = manifest?.compatibility?.skillApi === expectedSkillApi; + add("managed-runtime", compatible ? (recovery.recovered ? "warn" : "pass") : "fail", + compatible + ? `${recovery.recovered ? "Recovered" : "Active"} managed runtime ${pointer.current} (skill API ${manifest.compatibility.skillApi})` + : `Managed runtime ${pointer.current} is missing compatible skill API metadata`, + compatible ? { skillApi: manifest.compatibility.skillApi } : { + expectedSkillApi, + remedy: "Upgrade the GStack runtime to match the installed skills.", + }); + const bun = await inspectRuntimeBun(activeRoot, manifest, options.nodeCommand ?? process.env.GSTACK_NODE ?? "node"); + add("runtime-tool:bun", bun.ok ? "pass" : "fail", bun.message, bun.details); + const shell = await inspectBash(options.env ?? process.env); + add("helper-shell:bash", shell.ok ? "pass" : "fail", shell.message, shell.details); + const python = await inspectPython(options.env ?? process.env); + add("specialist-tool:python", python.ok ? "pass" : "warn", python.message, python.details); + const selected = new Set(Array.isArray(manifest?.selectedCapabilities) ? manifest.selectedCapabilities : []); + const launchers = manifest?.capabilities ?? {}; + for (const capability of OPTIONAL_RUNTIME_CAPABILITIES) { + if (!selected.has(capability)) { + add(`capability:${capability}`, "warn", "not selected"); + continue; + } + const missingDependencies = (RUNTIME_CAPABILITY_DEPENDENCIES[capability] ?? []) + .filter((dependency) => !selected.has(dependency)); + if (missingDependencies.length) { + add(`capability:${capability}`, "fail", `installed without required dependencies: ${missingDependencies.join(", ")}`); + continue; + } + if (!capabilityLaunchersReady(capability, launchers)) { + add(`capability:${capability}`, "fail", "selected but required launcher metadata is missing"); + continue; + } + if (capability === "browser") { + const browser = await inspectManagedChromium(activeRoot, options.nodeCommand ?? process.env.GSTACK_NODE ?? "node"); + add(`capability:${capability}`, browser.ok ? "pass" : "fail", browser.message, browser.details); + continue; + } + if (capability === "ios") { + const ios = await inspectXcrun(); + add(`capability:${capability}`, ios.ok ? "pass" : "fail", ios.message, ios.details); + continue; + } + add(`capability:${capability}`, "pass", "installed with required dependencies and launcher metadata"); + } + } + } } catch (error) { - add("upgrade", "fail", `Version pointer cannot be read: ${error.message}`); + add("managed-runtime", "fail", `Managed runtime cannot be inspected: ${error.message}`); + for (const capability of OPTIONAL_RUNTIME_CAPABILITIES) { + if (!checks.some((check) => check.id === `capability:${capability}`)) { + add(`capability:${capability}`, "warn", "readiness unknown because runtime inspection failed"); + } + } } return { @@ -108,6 +183,102 @@ export async function runDoctor(options = {}) { }; } +async function inspectRuntimeBun(activeRoot, manifest) { + const relative = managedBunRelativePath(); + const declared = manifest?.tools?.bun; + if (declared?.path !== relative || typeof declared?.version !== "string") { + return { ok: false, message: "managed Bun metadata is missing or incompatible" }; + } + const executable = path.join(activeRoot, relative); + const stat = await fs.lstat(executable).catch(() => null); + if (!stat?.isFile() || stat.isSymbolicLink()) return { ok: false, message: "managed Bun executable is missing or unsafe" }; + try { + if (process.platform !== "win32") await fs.access(executable, fsConstants.X_OK); + const result = await captureCommand(executable, ["--version"]); + const version = result.stdout.trim(); + if (version !== declared.version) return { ok: false, message: "managed Bun version does not match its bundle metadata" }; + return { ok: true, message: `managed Bun ${version} is runnable`, details: { executable, version } }; + } catch (error) { + return { ok: false, message: `managed Bun is not runnable: ${error.message}` }; + } +} + +async function inspectBash(env) { + for (const command of bashCandidates(env)) { + try { + const result = await captureCommand(command, ["--version"]); + return { ok: true, message: "retained shell-helper Bash is available", details: { command, version: result.stdout.split(/\r?\n/, 1)[0] } }; + } catch { /* try the next explicit candidate */ } + } + return { + ok: false, + message: process.platform === "win32" + ? "retained shell helpers require Git for Windows Bash (set GSTACK_BASH or install Git for Windows)" + : "retained shell helpers require Bash (set GSTACK_BASH)", + }; +} + +async function inspectPython(env) { + const candidates = [env.GSTACK_PYTHON, ...(process.platform === "win32" ? ["python", "python3"] : ["python3", "python"])] + .filter((entry, index, list) => entry && list.indexOf(entry) === index); + for (const command of candidates) { + try { + const result = await captureCommand(command, ["--version"]); + return { ok: true, message: "optional specialist Python is available", details: { command, version: `${result.stdout}${result.stderr}`.trim() } }; + } catch { /* optional candidate */ } + } + return { ok: false, message: "Python 3 is absent; only specialist flows that explicitly request it are unavailable" }; +} + +async function inspectManagedChromium(activeRoot, nodeCommand) { + const browserRoot = path.join(activeRoot, ".gstack-runtime-browsers"); + const modulePath = path.join(activeRoot, "node_modules", "playwright", "index.mjs"); + const [browserStat, moduleStat] = await Promise.all([ + fs.lstat(browserRoot).catch(() => null), + fs.lstat(modulePath).catch(() => null), + ]); + if (!browserStat?.isDirectory() || browserStat.isSymbolicLink() || !moduleStat?.isFile() || moduleStat.isSymbolicLink()) { + return { ok: false, message: "managed Chromium or Playwright module is missing/unsafe" }; + } + try { + const moduleUrl = pathToFileURL(modulePath).href; + const result = await captureCommand(nodeCommand, [ + "--input-type=module", + "--eval", + `const { chromium } = await import(${JSON.stringify(moduleUrl)}); process.stdout.write(chromium.executablePath());`, + ], { env: { ...process.env, PLAYWRIGHT_BROWSERS_PATH: browserRoot } }); + const executable = result.stdout.trim(); + const stat = await fs.lstat(executable).catch(() => null); + if (!stat?.isFile() || stat.isSymbolicLink()) return { ok: false, message: "Playwright could not resolve a safe managed Chromium executable" }; + if (process.platform !== "win32") await fs.access(executable, fsConstants.X_OK); + return { ok: true, message: "managed Chromium executable is present", details: { executable } }; + } catch (error) { + return { ok: false, message: `managed Chromium is not runnable: ${error.message}` }; + } +} + +async function inspectXcrun() { + if (process.platform !== "darwin") return { ok: false, message: "physical-iOS capability requires macOS" }; + try { + const result = await captureCommand("xcrun", ["--find", "devicectl"]); + return { ok: true, message: "CoreDevice tooling is present", details: { devicectl: result.stdout.trim() } }; + } catch (error) { + return { ok: false, message: `CoreDevice tooling is unavailable: ${error.message}` }; + } +} + +function capabilityLaunchersReady(capability, launchers) { + if (capability === "browser") return typeof launchers.browse === "string"; + if (capability === "design") return typeof launchers["gstack-design"] === "string"; + if (capability === "pdf") return typeof launchers["make-pdf"] === "string"; + if (capability === "diagram") return true; + if (capability === "ios") { + return typeof launchers["gstack-ios-qa-daemon"] === "string" && + typeof launchers["gstack-ios-qa-mint"] === "string"; + } + return false; +} + async function inspectLauncherNode(command) { try { const result = await captureCommand(command, ["--version"]); @@ -126,12 +297,14 @@ async function inspectLauncherNode(command) { } } -function captureCommand(command, args) { +function captureCommand(command, args, options = {}) { return new Promise((resolve, reject) => { const child = nodeSpawn(command, args, { stdio: ["ignore", "pipe", "pipe"], windowsHide: true, shell: false, + cwd: options.cwd, + env: options.env ?? process.env, }); let stdout = ""; let stderr = ""; diff --git a/runtime/install.js b/runtime/install.js index 31de301ac..8d3dbe2e6 100644 --- a/runtime/install.js +++ b/runtime/install.js @@ -1,10 +1,11 @@ +import { constants as fsConstants, createReadStream } from "node:fs"; import fs from "node:fs/promises"; import path from "node:path"; import process from "node:process"; +import readline from "node:readline/promises"; import { createHash, randomUUID } from "node:crypto"; import { spawn as nodeSpawn } from "node:child_process"; import { fileURLToPath, pathToFileURL } from "node:url"; -import { familySync as detectLibcFamilySync, GLIBC, MUSL } from "detect-libc"; import { resolveGstackHome, resolveRuntimePaths, assertPathInside } from "./paths.js"; import { atomicWriteFile, atomicWriteJson, pathExists, readJson } from "./storage.js"; import { purgeManagedHomeUnlocked, stageUpgradeUnlocked } from "./upgrade.js"; @@ -12,6 +13,7 @@ import { assertManagedHome, assertSafeManagedHomePath, ensureManagedHome, + ensureManagedRuntimeDirectory, recoverRuntimeTransactionUnlocked, RUNTIME_TRANSACTION_FILE, withRuntimeLifecycleLock, @@ -20,6 +22,60 @@ import { errorWithCode as installError } from "./errors.js"; import { currentIsoTimestamp as isoNow } from "./time.js"; const INSTALL_SCHEMA_VERSION = 2; +export const MAX_RUNTIME_BUNDLE_BYTES = 2 * 1024 * 1024 * 1024; +export const RUNTIME_COMPATIBILITY = Object.freeze({ + schemaVersion: 1, + runtimeVersion: "2.0.0", + skillApi: "2.0", +}); + +export function managedBunRelativePath(platform = process.platform) { + return `.gstack-runtime-tools/${platform === "win32" ? "bun.exe" : "bun"}`; +} + +export const OPTIONAL_RUNTIME_CAPABILITIES = Object.freeze([ + "browser", + "design", + "pdf", + "diagram", + ...(process.platform === "darwin" ? ["ios"] : []), +]); +// Internal capability used only when a workflow reaches a headed browser, +// extension, or handoff. It is deliberately excluded from the setup-time +// `all` selection so ordinary headless QA never downloads visible Chromium. +export const INTERNAL_RUNTIME_CAPABILITIES = Object.freeze(["browser-visible"]); +export const RUNTIME_CAPABILITIES = Object.freeze([ + ...OPTIONAL_RUNTIME_CAPABILITIES, + ...INTERNAL_RUNTIME_CAPABILITIES, +]); +export const RUNTIME_CAPABILITY_DEPENDENCIES = Object.freeze({ + browser: Object.freeze([]), + "browser-visible": Object.freeze([]), + design: Object.freeze([]), + pdf: Object.freeze(["browser", "diagram"]), + diagram: Object.freeze(["browser"]), + ...(process.platform === "darwin" ? { ios: Object.freeze([]) } : {}), +}); + +export const RUNTIME_COMPONENT_DEPENDENCIES = Object.freeze({ + core: Object.freeze([]), + "browser-code": Object.freeze(["core"]), + "browser-headless": Object.freeze(["browser-code"]), + "browser-visible": Object.freeze(["browser-code"]), + design: Object.freeze(["core"]), + diagram: Object.freeze(["browser-headless"]), + pdf: Object.freeze(["diagram"]), + ...(process.platform === "darwin" ? { ios: Object.freeze(["core"]) } : {}), +}); + +export const RUNTIME_CAPABILITY_COMPONENTS = Object.freeze({ + browser: Object.freeze(["browser-code", "browser-headless"]), + "browser-visible": Object.freeze(["browser-code", "browser-visible"]), + design: Object.freeze(["design"]), + diagram: Object.freeze(["diagram"]), + pdf: Object.freeze(["pdf"]), + ...(process.platform === "darwin" ? { ios: Object.freeze(["ios"]) } : {}), +}); /** * Audited stable helper surface used by retained specialist modules. Targets @@ -162,12 +218,12 @@ export function runtimeNativePackagePaths(options = {}) { `node_modules/@ngrok/ngrok-win32-${arch}-msvc`, ); } else { - const libc = options.libc ?? detectLibcFamilySync(); - if (![GLIBC, MUSL].includes(libc)) { + const libc = options.libc ?? detectRuntimeLibc(); + if (!["glibc", "musl"].includes(libc)) { throw new TypeError(`Unsupported managed-runtime libc: ${String(libc)}`); } - const sharpPlatform = libc === MUSL ? `linuxmusl-${arch}` : `linux-${arch}`; - const ngrokLibc = libc === MUSL ? "musl" : "gnu"; + const sharpPlatform = libc === "musl" ? `linuxmusl-${arch}` : `linux-${arch}`; + const ngrokLibc = libc === "musl" ? "musl" : "gnu"; paths.push( `node_modules/@img/sharp-${sharpPlatform}`, `node_modules/@img/sharp-libvips-${sharpPlatform}`, @@ -178,6 +234,12 @@ export function runtimeNativePackagePaths(options = {}) { return Object.freeze(paths); } +function detectRuntimeLibc() { + if (process.platform !== "linux") return null; + const report = typeof process.report?.getReport === "function" ? process.report.getReport() : null; + return report?.header?.glibcVersionRuntime ? "glibc" : "musl"; +} + /** * The managed bundle is deliberately narrow. Skills remain installed by a * standards-based Agent Skills installer; this list contains only optional @@ -205,6 +267,8 @@ export const DEFAULT_RUNTIME_BUNDLE = Object.freeze([ entry("extension"), entry("node_modules/playwright"), entry("node_modules/playwright-core"), + entry(managedBunRelativePath(), "managed-bun", true), + entry(".gstack-runtime-browsers", "browser"), entry("node_modules/diff"), entry("node_modules/socks"), entry("node_modules/smart-buffer"), @@ -233,6 +297,7 @@ export const DEFAULT_RUNTIME_BUNDLE = Object.freeze([ ]); export const DEFAULT_CAPABILITY_LAUNCHERS = Object.freeze({ + bun: managedBunRelativePath(), browse: platformBinary("browse/dist/browse"), "gstack-design": platformBinary("design/dist/design"), "make-pdf": platformBinary("make-pdf/dist/pdf"), @@ -243,6 +308,135 @@ export const DEFAULT_CAPABILITY_LAUNCHERS = Object.freeze({ } : {}), }); +const CAPABILITY_PATH_PREFIXES = Object.freeze({ + browser: Object.freeze([ + "browse/", "extension/", ".gstack-runtime-browsers", "node_modules/playwright", "node_modules/diff", "node_modules/socks", + "node_modules/smart-buffer", "node_modules/ip-address", "node_modules/sharp", "node_modules/@img/", + "node_modules/@ngrok/", "node_modules/detect-libc", "node_modules/semver", + ]), + design: Object.freeze(["design/"]), + pdf: Object.freeze(["make-pdf/"]), + diagram: Object.freeze(["lib/diagram-render/"]), + ios: Object.freeze(["ios-qa/"]), +}); + +/** Resolve the audited core plus only explicitly selected optional capabilities. */ +export function runtimeSurfaceForCapabilities(input = OPTIONAL_RUNTIME_CAPABILITIES) { + const selected = normalizeCapabilitySelection(input); + const includesBrowserCode = selected.includes("browser") || selected.includes("browser-visible"); + const entries = DEFAULT_RUNTIME_BUNDLE.filter((item) => { + const owner = capabilityForPath(item.path); + return owner == null || selected.includes(owner) || (owner === "browser" && includesBrowserCode); + }); + const capabilities = Object.fromEntries(Object.entries(DEFAULT_CAPABILITY_LAUNCHERS).filter(([name]) => { + const owner = capabilityForLauncher(name); + return owner == null || selected.includes(owner) || (owner === "browser" && includesBrowserCode); + })); + return Object.freeze({ selected, entries: Object.freeze(entries), capabilities: Object.freeze(capabilities) }); +} + +/** Expand logical runtime capabilities into the signed internal components. */ +export function runtimeComponentsForCapabilities(input = OPTIONAL_RUNTIME_CAPABILITIES) { + const capabilities = normalizeCapabilitySelection(input); + const selected = new Set(["core"]); + for (const capability of capabilities) { + for (const component of RUNTIME_CAPABILITY_COMPONENTS[capability] ?? []) selected.add(component); + } + const pending = [...selected]; + while (pending.length) { + for (const dependency of RUNTIME_COMPONENT_DEPENDENCIES[pending.pop()] ?? []) { + if (!selected.has(dependency)) { + selected.add(dependency); + pending.push(dependency); + } + } + } + return Object.freeze([...selected].sort()); +} + +export function runtimeSlotVersion(releaseVersion, capabilityIds) { + validateVersion(releaseVersion); + const selected = normalizeCapabilitySelection(capabilityIds); + const digest = createHash("sha256").update(selected.join(",") || "core").digest("hex").slice(0, 12); + const prefix = String(releaseVersion).slice(0, 60); + return `${prefix}-caps-${digest}`; +} + +export async function previewManagedRuntime(options = {}) { + if (!options.sourceDir) throw installError("sourceDir is required", "INSTALL_SOURCE_REQUIRED"); + const sourceDir = await resolvePhysicalSource(options.sourceDir); + const surface = runtimeSurfaceForCapabilities(options.capabilityIds); + let bytes = 0; + let files = 0; + const missing = []; + const materializations = []; + const preparedSource = options.preparedSource === true; + for (const item of surface.entries) { + if (!preparedSource && item.path === managedBunRelativePath()) { + const bunCommand = options.bunCommand ?? process.env.BUN_CMD ?? "bun"; + try { + const bun = await probeBunExecutable(bunCommand, options.runCommand ?? runCommand); + bytes += bun.bytes; + files += 1; + materializations.push({ + kind: "managed-bun-capture", + target: item.path, + source: bun.path, + version: bun.version, + bytes: bun.bytes, + available: true, + }); + } catch { + materializations.push({ + kind: "managed-bun-capture", + target: item.path, + command: bunCommand, + bytes: null, + available: false, + }); + } + continue; + } + if (!preparedSource && item.path === ".gstack-runtime-browsers") { + materializations.push({ + kind: "playwright-chromium-download", + target: item.path, + bytes: null, + }); + continue; + } + const target = assertPathInside(sourceDir, path.join(sourceDir, item.path)); + const stat = await fs.lstat(target).catch((error) => error?.code === "ENOENT" ? null : Promise.reject(error)); + if (!stat) { + missing.push({ path: item.path, build: item.build ?? null }); + continue; + } + if (stat.isSymbolicLink()) throw installError(`Refusing symlink in runtime source: ${target}`, "INSTALL_SOURCE_LINK"); + const size = await treeSize(target); + bytes += size.bytes; + files += size.files; + } + return Object.freeze({ + sourceDir, + capabilities: surface.selected, + components: surface.entries.length, + files, + bytes, + humanSize: formatBytes(bytes), + missing, + materializations, + buildsRequired: [...new Set(missing.map((item) => item.build).filter(Boolean))], + externalPrerequisites: [ + process.platform === "win32" + ? "Git for Windows Bash (required by retained shell helpers; GStack does not install it)" + : "Bash (required by retained shell helpers; GStack does not install it)", + "Python 3 (required only by explicitly selected specialist flows such as gbrain/Codex parsing; GStack does not install it)", + ], + dependencyPreparation: "bun install --production --frozen-lockfile (after approval only)", + payloadComplete: missing.length === 0 && materializations.every((item) => Number.isSafeInteger(item.bytes)), + }); +} + /** * Install one immutable runtime bundle and atomically activate it. * @@ -265,8 +459,11 @@ export async function installManagedRuntime(options = {}) { validateVersion(version); if (options.requirePackageIdentity) validatePackageIdentity(packageMetadata, version); - const entries = normalizeEntries(options.entries ?? DEFAULT_RUNTIME_BUNDLE); - const capabilities = normalizeCapabilities(options.capabilities ?? DEFAULT_CAPABILITY_LAUNCHERS, entries); + const selectedSurface = options.entries == null + ? runtimeSurfaceForCapabilities(options.capabilityIds) + : null; + const entries = normalizeEntries(options.entries ?? selectedSurface.entries); + const capabilities = normalizeCapabilities(options.capabilities ?? selectedSurface.capabilities, entries); const useDefaultHelperSurface = options.entries == null; const stableSourceFiles = normalizeCapabilities( options.stableSourceFiles ?? (useDefaultHelperSurface ? DEFAULT_STABLE_SOURCE_FILES : {}), @@ -277,13 +474,27 @@ export async function installManagedRuntime(options = {}) { entries, ); const launcherSurface = Object.freeze({ capabilities, stableSourceFiles, bunProxyHelpers }); + const phase = (name, details = {}) => options.onPhase?.({ phase: name, at: new Date().toISOString(), ...details }); const launcherFiles = launcherRelativePaths(launcherSurface); if (new Set(launcherFiles).size !== launcherFiles.length) { throw new TypeError("Stable launcher names collide"); } + const managedBrowserPath = ".gstack-runtime-browsers"; + const managedBunPath = managedBunRelativePath(); + const includesManagedBrowser = entries.some((item) => item.path === managedBrowserPath); + const includesManagedBun = entries.some((item) => item.path === managedBunPath); + // A browser cache found in an ordinary checkout is untracked executable + // input. Never copy or trust it. Only a prepared source that arrived inside + // the already size/SHA-verified release artifact may carry its browser cache + // forward without another download. + const trustPreparedBrowser = options.preparedSource === true && options.buildMissing === false; + const trustPreparedBun = options.preparedSource === true && options.buildMissing === false; + let materializeBrowser = includesManagedBrowser && !trustPreparedBrowser; + const materializeBun = includesManagedBun && !trustPreparedBun; let missing = await missingEntries(sourceDir, entries); - if (missing.length > 0) { + let builderMissing = missing.filter((item) => ![managedBrowserPath, managedBunPath].includes(item.path)); + if (builderMissing.length > 0) { if (options.buildMissing === false) { throw installError( `Runtime source is incomplete: ${missing.map((item) => item.path).join(", ")}`, @@ -294,7 +505,7 @@ export async function installManagedRuntime(options = {}) { try { await builder({ sourceDir, - missing: Object.freeze(missing.map((item) => Object.freeze({ ...item }))), + missing: Object.freeze(builderMissing.map((item) => Object.freeze({ ...item }))), bunCommand: options.bunCommand ?? process.env.BUN_CMD ?? "bun", run: options.runCommand ?? runCommand, }); @@ -302,41 +513,97 @@ export async function installManagedRuntime(options = {}) { throw installError("Runtime capability build failed; the active version was not changed", "INSTALL_BUILD_FAILED", cause); } missing = await missingEntries(sourceDir, entries); - if (missing.length > 0) { - const names = missing.map((item) => item.path).join(", "); + builderMissing = missing.filter((item) => ![managedBrowserPath, managedBunPath].includes(item.path)); + if (builderMissing.length > 0) { + const names = builderMissing.map((item) => item.path).join(", "); throw installError(`Runtime builder did not produce required components: ${names}`, "INSTALL_BUILD_INCOMPLETE"); } } + const unmaterialized = missing.filter((item) => + !(item.path === managedBrowserPath && materializeBrowser) && + !(item.path === managedBunPath && materializeBun)); + if (unmaterialized.length > 0) { + throw installError( + `Runtime source is incomplete: ${unmaterialized.map((item) => item.path).join(", ")}`, + "INSTALL_SOURCE_INCOMPLETE", + ); + } return withRuntimeLifecycleLock(home, async () => { await ensureManagedHome(home, options); await recoverRuntimeTransactionUnlocked(home); const paths = resolveRuntimePaths({ home }); - await fs.mkdir(paths.tmp, { recursive: true, mode: 0o700 }); + await ensureManagedRuntimeDirectory(home, paths.tmp); const scratch = assertPathInside(paths.tmp, path.join(paths.tmp, `install-${randomUUID()}`)); + let preserveScratch = false; try { await fs.mkdir(scratch, { recursive: true, mode: 0o700 }); - const files = await copyAllowlistedBundle(sourceDir, scratch, entries); + phase("copy-source:start"); + const materializedPaths = new Set([ + ...(materializeBrowser ? [managedBrowserPath] : []), + ...(materializeBun ? [managedBunPath] : []), + ]); + const copiedEntries = entries.filter((item) => !materializedPaths.has(item.path)); + const files = await copyAllowlistedBundle(sourceDir, scratch, copiedEntries); + phase("copy-source:complete", { files: files.length }); + if (materializeBun) { + phase("managed-bun:start"); + await materializeManagedBun(scratch, files, { + bunCommand: options.bunCommand ?? process.env.BUN_CMD ?? "bun", + run: options.runCommand ?? runCommand, + }); + phase("managed-bun:complete"); + } + if (materializeBrowser) { + const browserInstallerCommand = includesManagedBun + ? path.join(scratch, managedBunPath) + : options.nodeCommand ?? process.env.GSTACK_NODE ?? process.execPath; + const browserInstallerRunner = includesManagedBun ? "managed-bun" : "node-fallback"; + phase("managed-chromium:start", { runner: browserInstallerRunner }); + const browserMaterialization = await materializeManagedChromium(sourceDir, scratch, files, { + runtimeCommand: browserInstallerCommand, + run: options.runCommand ?? runCommand, + timeoutMs: options.browserDownloadTimeoutMs ?? 15 * 60_000, + includeHeadless: selectedSurface?.selected.includes("browser") !== false, + includeVisible: selectedSurface?.selected.includes("browser-visible") === true, + }); + phase("managed-chromium:complete", { + runner: browserInstallerRunner, + dereferencedLinks: browserMaterialization.dereferencedLinks, + browserBytes: browserMaterialization.browserBytes, + }); + } + const managedBun = includesManagedBun + ? await inspectManagedBun(scratch, options.runCommand ?? runCommand) + : null; const bundleManifest = { schemaVersion: INSTALL_SCHEMA_VERSION, version, + compatibility: RUNTIME_COMPATIBILITY, + selectedCapabilities: selectedSurface?.selected ?? null, + runtimeComponents: selectedSurface ? runtimeComponentsForCapabilities(selectedSurface.selected) : null, components: entries.map(({ path: component }) => component), capabilities, stableSourceFiles, bunProxyHelpers, + tools: managedBun ? { bun: managedBun } : {}, files, }; await atomicWriteJson(path.join(scratch, ".gstack-bundle.json"), bundleManifest, { mode: 0o644 }); const validate = options.validate ?? validateRuntimeBundle; + phase("bundle-validation:start"); await validate(scratch, { version, entries, manifest: bundleManifest }); await validateLauncherTargets(scratch, launcherSurface); + phase("bundle-validation:complete"); const snapshot = await captureInstallSurface(paths, launcherSurface); let installManifest; + phase("activation:start"); const result = await stageUpgradeUnlocked({ home, sourceDir: scratch, + consumeInstallerScratch: true, version, now: options.now, verify: async (candidate) => { @@ -369,6 +636,7 @@ export async function installManagedRuntime(options = {}) { if (!pointerRollbackError) await fs.rm(path.join(home, RUNTIME_TRANSACTION_FILE), { force: true }); }, }); + phase("activation:complete", { consumedScratch: result.consumedSource }); return { home, @@ -376,11 +644,15 @@ export async function installManagedRuntime(options = {}) { path: result.path, pointer: result.pointer, staged: result.staged, + consumedScratch: result.consumedSource, manifest: installManifest, launchers: launcherPaths(paths.home, launcherSurface), }; + } catch (error) { + preserveScratch = error?.preserveScratch === true; + throw error; } finally { - await fs.rm(scratch, { recursive: true, force: true }).catch(() => {}); + if (!preserveScratch) await fs.rm(scratch, { recursive: true, force: true }).catch(() => {}); } }, options); } @@ -406,6 +678,7 @@ export async function uninstallManagedRuntime(home, options = {}) { const manifestPath = path.join(resolvedHome, "runtime-install.json"); const manifest = await readJson(manifestPath, null); const managedLaunchers = validateInstallManifestForUninstall(manifest); + await ensureManagedRuntimeDirectory(resolvedHome, paths.tmp); const quarantine = assertPathInside(paths.tmp, path.join(paths.tmp, `uninstall-${randomUUID()}`)); await fs.mkdir(quarantine, { recursive: true, mode: 0o700 }); const moved = []; @@ -518,6 +791,7 @@ export async function validateRuntimeBundle(directory, context = {}) { } } const listed = new Set(); + let declaredBytes = 0; for (const file of manifest.files) { const relative = normalizeRelativePath(file.path, "bundle manifest path"); if (file.path !== relative || relative === ".gstack-bundle.json" || relative === ".gstack-version.json" || listed.has(relative) || @@ -526,6 +800,10 @@ export async function validateRuntimeBundle(directory, context = {}) { typeof file.sha256 !== "string" || !/^[0-9a-f]{64}$/.test(file.sha256)) { throw installError(`Runtime bundle manifest entry is invalid: ${relative}`, "INSTALL_VALIDATION_FAILED"); } + declaredBytes += file.size; + if (!Number.isSafeInteger(declaredBytes) || declaredBytes > MAX_RUNTIME_BUNDLE_BYTES) { + throw installError("Runtime bundle exceeds the 2 GiB artifact limit", "INSTALL_VALIDATION_FAILED"); + } listed.add(relative); const absolute = assertPathInside(directory, path.join(directory, relative)); const stat = await fs.lstat(absolute).catch(() => null); @@ -558,6 +836,9 @@ export async function smokeRuntimeBundle(directory, options = {}) { if (!Number.isInteger(nodeMajor) || nodeMajor < 18) { throw installError(`Node 18+ is required by managed launchers (found ${versionText || "unknown"})`, "INSTALL_NODE_REQUIRED"); } + if (await pathExists(path.join(directory, managedBunRelativePath()))) { + await inspectManagedBun(directory, run); + } const result = await run(command, [path.join(directory, "bin", "gstack"), "--version"], { cwd: directory, capture: true, @@ -583,6 +864,38 @@ export async function smokeRuntimeBundle(directory, options = {}) { throw installError("Runtime native dependency smoke test failed", "INSTALL_SMOKE_FAILED", cause); } } + const managedBrowsers = path.join(directory, ".gstack-runtime-browsers"); + if (await pathExists(managedBrowsers)) { + const playwrightModule = pathToFileURL(path.join(directory, "node_modules", "playwright", "index.mjs")).href; + const runtimeManifest = await readJson(path.join(directory, ".gstack-bundle.json"), null); + const selected = new Set(Array.isArray(runtimeManifest?.selectedCapabilities) ? runtimeManifest.selectedCapabilities : []); + const modes = selected.size === 0 + ? [{ name: "headless", launch: "{ headless: true }" }] + : [ + ...(selected.has("browser") ? [{ name: "headless", launch: "{ headless: true }" }] : []), + ...(selected.has("browser-visible") ? [{ name: "visible payload", launch: '{ headless: true, channel: "chromium" }' }] : []), + ]; + try { + for (const mode of modes) { + await run(command, [ + "--input-type=module", + "--eval", + `const { chromium } = await import(${JSON.stringify(playwrightModule)}); const browser = await chromium.launch(${mode.launch}); await browser.close();`, + ], { + cwd: directory, + capture: true, + timeoutMs: Math.max(timeoutMs, 30_000), + env: { ...process.env, PLAYWRIGHT_BROWSERS_PATH: managedBrowsers }, + }); + } + } catch (cause) { + throw installError( + "Managed Chromium failed its launch smoke test; install required OS libraries separately and retry (GStack never runs Playwright --with-deps or sudo implicitly)", + "INSTALL_SMOKE_FAILED", + cause, + ); + } + } } export async function runInstallerCli(argv = process.argv.slice(2), options = {}) { @@ -596,20 +909,76 @@ export async function runInstallerCli(argv = process.argv.slice(2), options = {} const sourceDir = parsed.sourceDir ?? options.sourceDir ?? path.resolve(path.dirname(fileURLToPath(import.meta.url)), ".."); const env = options.env ?? process.env; const home = parsed.home ?? resolveGstackHome({ env, homeDir: options.homeDir, cwd: options.cwd }); + const stdin = options.stdin ?? process.stdin; + const stdout = options.stdout ?? process.stdout; + const bunCommand = parsed.bunCommand ?? env.BUN_CMD ?? "bun"; + let capabilityIds = parsed.capabilityIds; + if (parsed.installMode == null && !parsed.dryRun && stdin.isTTY && !parsed.json) { + const answer = await askInstallerQuestion( + stdin, + options.stderr ?? process.stderr, + `Optional capabilities (${OPTIONAL_RUNTIME_CAPABILITIES.join(", ")}). Comma-separated selection [all]: `, + ); + capabilityIds = parseCapabilityList(answer || "all"); + } + capabilityIds = await mergeActiveCapabilities(home, capabilityIds, parsed.replaceCapabilities); + const preview = await previewManagedRuntime({ + sourceDir, + capabilityIds, + bunCommand, + preparedSource: parsed.prepared, + runCommand: options.installOptions?.runCommand, + }); + if (parsed.json && (parsed.dryRun || parsed.installMode === "later" || parsed.installMode == null)) { + stdout.write(`${JSON.stringify({ ok: true, action: parsed.dryRun ? "dry-run" : "install-later", mutated: false, preview }, null, 2)}\n`); + } else if (!parsed.quiet) { + printInstallPreview(stdout, preview); + } + if (parsed.dryRun || parsed.installMode === "later") return 0; + + let approved = parsed.installMode === "now" && parsed.yes; + if (!approved && stdin.isTTY && !parsed.json) { + const answer = await askInstallerQuestion( + stdin, + options.stderr ?? process.stderr, + "Install this optional local runtime now? Type yes to continue [later]: ", + ); + approved = answer.trim().toLowerCase() === "yes"; + } + if (!approved) { + if (parsed.installMode === "now") { + throw installError("Non-interactive installation requires --install-now --yes", "INSTALL_CONSENT_REQUIRED"); + } + if (!parsed.json && !parsed.quiet) { + stdout.write("No runtime was installed. Judgment-only skills remain usable.\n"); + stdout.write("To install later, rerun with --install-now --yes and the desired --capabilities list.\n"); + } + return 0; + } + + const prepare = options.prepareDependencies ?? (async () => runCommand( + bunCommand, + ["install", "--production", "--frozen-lockfile"], + { cwd: sourceDir }, + )); + if (!parsed.prepared) await prepare({ sourceDir, bunCommand, preview }); + const releaseVersion = parsed.version ?? RUNTIME_COMPATIBILITY.runtimeVersion; const result = await installManagedRuntime({ sourceDir, home, - version: parsed.version, - bunCommand: parsed.bunCommand, + version: runtimeSlotVersion(releaseVersion, capabilityIds), + bunCommand, + capabilityIds, + buildMissing: parsed.prepared ? false : undefined, nodeCommand: env.GSTACK_NODE ?? "node", launcherNodeCommand: env.GSTACK_NODE ?? "node", ...options.installOptions, + preparedSource: parsed.prepared, }); - const stdout = options.stdout ?? process.stdout; if (parsed.json) { - stdout.write(`${JSON.stringify({ ok: true, home: result.home, version: result.version, path: result.path, launchers: result.launchers }, null, 2)}\n`); + stdout.write(`${JSON.stringify({ ok: true, action: "installed", preview, home: result.home, runtimeVersion: releaseVersion, slot: result.version, path: result.path, launchers: result.launchers }, null, 2)}\n`); } else if (!parsed.quiet) { - stdout.write(`Installed gstack runtime ${result.version}\n`); + stdout.write(`Installed gstack runtime ${releaseVersion}\n`); stdout.write(`Runtime home: ${result.home}\n`); stdout.write(`Launcher directory: ${path.join(result.home, "bin")}\n`); stdout.write("Skills are installed separately with: npx skills add time-attack/gstack\n"); @@ -635,6 +1004,102 @@ function platformBinary(componentPath) { return process.platform === "win32" ? `${componentPath}.exe` : componentPath; } +function normalizeCapabilitySelection(input) { + const values = Array.isArray(input) + ? input + : String(input ?? "").split(","); + const selected = [...new Set(values.map((value) => String(value).trim()).filter(Boolean))]; + const available = new Set(RUNTIME_CAPABILITIES); + for (const capability of selected) { + if (!available.has(capability)) { + throw installError( + `Unknown or unavailable runtime capability: ${capability}. Available: ${RUNTIME_CAPABILITIES.join(", ")}`, + "INSTALL_CAPABILITY_INVALID", + ); + } + } + const expanded = new Set(selected); + const pending = [...selected]; + while (pending.length) { + const capability = pending.pop(); + for (const dependency of RUNTIME_CAPABILITY_DEPENDENCIES[capability] ?? []) { + if (!expanded.has(dependency)) { + expanded.add(dependency); + pending.push(dependency); + } + } + } + return Object.freeze([...expanded].sort()); +} + +function capabilityForPath(component) { + for (const [capability, prefixes] of Object.entries(CAPABILITY_PATH_PREFIXES)) { + if (prefixes.some((prefix) => component === prefix.replace(/\/$/, "") || component.startsWith(prefix))) { + return capability; + } + } + return null; +} + +/** Classify a concrete installed file into one disjoint release component. */ +export function runtimeReleaseComponentForPath(value) { + const component = normalizeRelativePath(value, "runtime release file"); + const browserRoot = ".gstack-runtime-browsers/"; + if (component.startsWith(browserRoot)) { + const relative = component.slice(browserRoot.length); + if (relative === ".links" || relative.startsWith(".links/")) return null; + const top = relative.split("/")[0]; + if (top.startsWith("chromium_headless_shell-") || top.startsWith("ffmpeg-")) return "browser-headless"; + if (/^chromium-\d/.test(top)) return "browser-visible"; + throw installError(`Unknown managed browser payload path: ${component}`, "INSTALL_BROWSER_PAYLOAD_INVALID"); + } + const owner = capabilityForPath(component); + if (owner === "browser") return "browser-code"; + if (["design", "diagram", "pdf", "ios"].includes(owner)) return owner; + return "core"; +} + +function capabilityForLauncher(name) { + if (["browse", "remote-slug"].includes(name)) return "browser"; + if (name === "gstack-design") return "design"; + if (name === "make-pdf") return "pdf"; + if (name.startsWith("gstack-ios-qa-")) return "ios"; + return null; +} + +async function treeSize(root) { + const pending = [root]; + let bytes = 0; + let files = 0; + while (pending.length) { + const target = pending.pop(); + const stat = await fs.lstat(target); + if (stat.isSymbolicLink()) throw installError(`Refusing symlink in runtime source: ${target}`, "INSTALL_SOURCE_LINK"); + if (stat.isDirectory()) { + for (const child of await fs.readdir(target)) pending.push(path.join(target, child)); + } else if (stat.isFile()) { + bytes += stat.size; + files += 1; + } else { + throw installError(`Unsupported runtime source entry: ${target}`, "INSTALL_SOURCE_TYPE"); + } + } + return { bytes, files }; +} + +function formatBytes(bytes) { + if (bytes < 1024) return `${bytes} B`; + const units = ["KiB", "MiB", "GiB"]; + let value = bytes; + let unit = "B"; + for (const candidate of units) { + value /= 1024; + unit = candidate; + if (value < 1024) break; + } + return `${value.toFixed(value >= 10 ? 1 : 2)} ${unit}`; +} + async function resolvePhysicalSource(source, options = {}) { const absolute = path.resolve(source); const logicalStat = await fs.lstat(absolute).catch((error) => { @@ -712,6 +1177,252 @@ async function copyAllowlistedBundle(sourceDir, destination, entries) { return files; } +async function materializeManagedChromium(sourceDir, bundleRoot, files, options = {}) { + const target = assertPathInside(bundleRoot, path.join(bundleRoot, ".gstack-runtime-browsers")); + const playwrightCli = assertPathInside(sourceDir, path.join(sourceDir, "node_modules", "playwright", "cli.js")); + let complete = false; + let cleanupSafe = true; + try { + // Headless QA gets only Playwright's compact shell. Full visible Chromium + // is a separate point-of-use component and is downloaded only when the + // internal browser-visible capability was explicitly approved. + const installs = []; + if (options.includeHeadless !== false) installs.push("--only-shell"); + if (options.includeVisible === true) installs.push("--no-shell"); + if (installs.length === 0) throw installError("Managed browser selection is empty", "INSTALL_BROWSER_PAYLOAD_INVALID"); + for (const mode of installs) { + await options.run(options.runtimeCommand, [playwrightCli, "install", mode, "chromium"], { + cwd: sourceDir, + env: { ...process.env, PLAYWRIGHT_BROWSERS_PATH: target }, + timeoutMs: options.timeoutMs, + superviseTree: true, + }); + } + } catch (cause) { + if (cause?.code === "INSTALL_COMMAND_KILL_TIMEOUT") cleanupSafe = false; + const error = installError( + "Playwright Chromium download failed after explicit browser-capability approval; no runtime version was activated", + "INSTALL_BROWSER_DOWNLOAD_FAILED", + cause, + ); + if (!cleanupSafe) error.preserveScratch = true; + throw error; + } + try { + const dereferencedLinks = await normalizeManagedBrowserTree(target); + await assertTreeContainsNoLinks(target); + await appendTreeManifest(target, bundleRoot, files); + files.sort((left, right) => left.path.localeCompare(right.path)); + const browserBytes = files + .filter((file) => file.path.startsWith(".gstack-runtime-browsers/")) + .reduce((total, file) => total + file.size, 0); + if (browserBytes > MAX_RUNTIME_BUNDLE_BYTES) { + throw installError("Normalized managed browser payload exceeds the 2 GiB artifact limit", "INSTALL_BROWSER_PAYLOAD_INVALID"); + } + complete = true; + return { dereferencedLinks, browserBytes }; + } catch (cause) { + throw installError( + "Downloaded Playwright Chromium failed managed-runtime safety validation; no runtime version was activated", + "INSTALL_BROWSER_PAYLOAD_INVALID", + cause, + ); + } finally { + if (!complete && cleanupSafe) await fs.rm(target, { recursive: true, force: true }).catch(() => {}); + } +} + +export async function normalizeManagedBrowserTree(root) { + const physicalRoot = await fs.realpath(root); + const links = new Set(); + await validateBrowserNode(root, physicalRoot, new Set(), links); + const ordered = [...links].sort((left, right) => { + const depth = right.split(path.sep).length - left.split(path.sep).length; + return depth || left.localeCompare(right); + }); + let count = 0; + for (const current of ordered) { + const stat = await fs.lstat(current).catch(() => null); + if (!stat?.isSymbolicLink()) continue; + const physical = await resolveBrowserLink(current); + assertPhysicalBrowserPath(physicalRoot, physical); + const replacement = assertPathInside(root, `${current}.dereference-${randomUUID()}`); + try { + await copyValidatedBrowserNode(physical, replacement, physicalRoot, new Set()); + await fs.rm(current, { force: true }); + await fs.rename(replacement, current); + } catch (error) { + await fs.rm(replacement, { recursive: true, force: true }).catch(() => {}); + throw error; + } + count += 1; + } + await assertTreeContainsNoLinks(root); + return count; +} + +async function validateBrowserNode(current, physicalRoot, ancestors, links) { + const stat = await fs.lstat(current); + if (stat.isSymbolicLink()) { + const rawTarget = await fs.readlink(current); + if (path.isAbsolute(rawTarget)) { + throw installError(`Managed browser contains an absolute link: ${current}`, "INSTALL_BROWSER_PAYLOAD_INVALID"); + } + const physical = await resolveBrowserLink(current); + assertPhysicalBrowserPath(physicalRoot, physical); + links.add(current); + return validateBrowserNode(physical, physicalRoot, ancestors, links); + } + if (stat.isFile()) return; + if (!stat.isDirectory()) { + throw installError(`Managed browser contains an unsupported entry: ${current}`, "INSTALL_BROWSER_PAYLOAD_INVALID"); + } + const physical = await fs.realpath(current); + assertPhysicalBrowserPath(physicalRoot, physical); + if (ancestors.has(physical)) { + throw installError(`Managed browser contains a directory-link cycle: ${current}`, "INSTALL_BROWSER_PAYLOAD_INVALID"); + } + const nextAncestors = new Set(ancestors).add(physical); + const children = await fs.readdir(current); + children.sort(); + for (const child of children) { + await validateBrowserNode(path.join(current, child), physicalRoot, nextAncestors, links); + } +} + +async function copyValidatedBrowserNode(source, destination, physicalRoot, ancestors) { + const stat = await fs.lstat(source); + if (stat.isSymbolicLink()) { + const rawTarget = await fs.readlink(source); + if (path.isAbsolute(rawTarget)) throw installError("Managed browser contains an absolute nested link", "INSTALL_BROWSER_PAYLOAD_INVALID"); + const physical = await resolveBrowserLink(source); + assertPhysicalBrowserPath(physicalRoot, physical); + return copyValidatedBrowserNode(physical, destination, physicalRoot, ancestors); + } + if (stat.isFile()) { + await fs.copyFile(source, destination, fsConstants.COPYFILE_FICLONE); + await fs.chmod(destination, stat.mode & 0o777); + return; + } + if (!stat.isDirectory()) throw installError("Managed browser link targets an unsupported entry", "INSTALL_BROWSER_PAYLOAD_INVALID"); + const physical = await fs.realpath(source); + assertPhysicalBrowserPath(physicalRoot, physical); + if (ancestors.has(physical)) throw installError("Managed browser contains a directory-link cycle", "INSTALL_BROWSER_PAYLOAD_INVALID"); + const nextAncestors = new Set(ancestors).add(physical); + await fs.mkdir(destination, { mode: stat.mode & 0o777 }); + const children = await fs.readdir(source); + children.sort(); + for (const child of children) { + await copyValidatedBrowserNode( + path.join(source, child), + path.join(destination, child), + physicalRoot, + nextAncestors, + ); + } + await fs.chmod(destination, stat.mode & 0o777); +} + +function assertPhysicalBrowserPath(physicalRoot, candidate) { + const relative = path.relative(physicalRoot, candidate); + if (relative === ".." || relative.startsWith(`..${path.sep}`) || path.isAbsolute(relative)) { + throw installError(`Managed browser link escapes its payload: ${candidate}`, "INSTALL_BROWSER_PAYLOAD_INVALID"); + } +} + +async function resolveBrowserLink(link) { + try { + return await fs.realpath(link); + } catch (cause) { + throw installError(`Managed browser contains a dangling or cyclic link: ${link}`, "INSTALL_BROWSER_PAYLOAD_INVALID", cause); + } +} + +async function materializeManagedBun(bundleRoot, files, options = {}) { + const target = assertPathInside(bundleRoot, path.join(bundleRoot, managedBunRelativePath())); + try { + const bun = await probeBunExecutable(options.bunCommand, options.run); + await fs.mkdir(path.dirname(target), { recursive: true, mode: 0o700 }); + await fs.copyFile(bun.path, target, fsConstants.COPYFILE_EXCL); + if (process.platform !== "win32") await fs.chmod(target, 0o755); + const targetStat = await fs.lstat(target); + files.push({ + path: managedBunRelativePath(), + size: targetStat.size, + mode: targetStat.mode & 0o777, + sha256: await sha256File(target), + }); + files.sort((left, right) => left.path.localeCompare(right.path)); + } catch (cause) { + throw installError( + "Capturing the approved Bun executable into the managed runtime failed; no runtime version was activated", + "INSTALL_BUN_CAPTURE_FAILED", + cause, + ); + } +} + +async function probeBunExecutable(command, run) { + const resolved = await run(command, [ + "--eval", + "process.stdout.write(process.execPath)", + ], { capture: true, timeoutMs: 15_000 }); + const reported = String(resolved.stdout ?? "").trim(); + if (!reported || !path.isAbsolute(reported)) { + throw new Error("Bun did not report an absolute executable path"); + } + const physical = await fs.realpath(reported); + const stat = await fs.lstat(physical); + if (!stat.isFile() || stat.isSymbolicLink()) throw new Error("Bun executable is not a safe regular file"); + const versionResult = await run(physical, ["--version"], { capture: true, timeoutMs: 15_000 }); + const version = String(versionResult.stdout ?? "").trim(); + if (!/^[0-9]+\.[0-9]+\.[0-9]+(?:[-+][0-9A-Za-z.-]+)?$/.test(version)) { + throw new Error(`Bun returned an unexpected version: ${version || ""}`); + } + return { path: physical, version, bytes: stat.size }; +} + +async function inspectManagedBun(bundleRoot, run) { + const relative = managedBunRelativePath(); + const executable = assertPathInside(bundleRoot, path.join(bundleRoot, relative)); + const stat = await fs.lstat(executable).catch(() => null); + if (!stat?.isFile() || stat.isSymbolicLink()) { + throw installError("Managed Bun executable is missing or unsafe", "INSTALL_BUN_INVALID"); + } + try { + const result = await run(executable, ["--version"], { capture: true, timeoutMs: 15_000 }); + const version = String(result.stdout ?? "").trim(); + if (!/^[0-9]+\.[0-9]+\.[0-9]+(?:[-+][0-9A-Za-z.-]+)?$/.test(version)) { + throw new Error(`unexpected version output: ${version || ""}`); + } + return { path: relative, version }; + } catch (cause) { + throw installError("Managed Bun executable failed its version probe", "INSTALL_BUN_INVALID", cause); + } +} + +async function appendTreeManifest(root, bundleRoot, files) { + const pending = [root]; + while (pending.length) { + const current = pending.pop(); + const stat = await fs.lstat(current); + if (stat.isSymbolicLink()) throw installError(`Runtime browser contains a symlink: ${current}`, "INSTALL_VALIDATION_FAILED"); + if (stat.isDirectory()) { + const children = await fs.readdir(current); + children.sort().reverse(); + for (const child of children) pending.push(path.join(current, child)); + continue; + } + if (!stat.isFile()) throw installError(`Runtime browser contains an unsupported entry: ${current}`, "INSTALL_VALIDATION_FAILED"); + files.push({ + path: path.relative(bundleRoot, current).split(path.sep).join("/"), + size: stat.size, + mode: stat.mode & 0o777, + sha256: await sha256File(current), + }); + } +} + async function copyNodeWithoutLinks(source, destination, bundleRoot, files, forceExecutable = false) { const stat = await fs.lstat(source); if (stat.isSymbolicLink()) { @@ -810,7 +1521,7 @@ const { home, root } = await resolveActiveRoot(import.meta.url); process.env.GSTACK_HOME ||= home; const cli = path.join(root, "runtime", "cli.js"); const stat = await fs.lstat(cli).catch(() => null); -if (!stat?.isFile() || stat.isSymbolicLink()) throw new Error("Active gstack CLI is missing or unsafe; rerun ./setup"); +if (!stat?.isFile() || stat.isSymbolicLink()) throw new Error("Active gstack CLI is missing or unsafe; inspect with gstack doctor, then use an explicitly approved capability bootstrap to reinstall the optional runtime"); const { main } = await import(pathToFileURL(cli).href); process.exitCode = await main(process.argv.slice(2)); `; @@ -821,6 +1532,7 @@ function capabilityLauncherSource() { import fs from "node:fs/promises"; import path from "node:path"; import { spawn } from "node:child_process"; +import { pathToFileURL } from "node:url"; import { resolveActiveRoot } from "./gstack-resolve.mjs"; const [relative, ...args] = process.argv.slice(2); if (!relative || path.isAbsolute(relative) || relative.split(/[\\\\/]/).includes("..")) throw new Error("Invalid capability target"); @@ -830,6 +1542,14 @@ const inside = path.relative(root, target); if (inside === ".." || inside.startsWith(".." + path.sep) || path.isAbsolute(inside)) throw new Error("Capability target escaped the active runtime"); const stat = await fs.lstat(target).catch(() => null); if (!stat?.isFile() || stat.isSymbolicLink()) throw new Error("Active capability target is missing or unsafe"); +const managedBrowsers = path.join(root, ".gstack-runtime-browsers"); +const browserStat = await fs.lstat(managedBrowsers).catch(() => null); +if (browserStat?.isSymbolicLink()) throw new Error("Managed browser directory is unsafe"); +const managedBun = path.join(root, ${JSON.stringify(managedBunRelativePath())}); +const bunStat = await fs.lstat(managedBun).catch(() => null); +const hasManagedBun = bunStat?.isFile() && !bunStat.isSymbolicLink(); +const tooling = await import(pathToFileURL(path.join(root, "runtime", "tooling.js")).href); +const bashCommand = await tooling.resolveBashCommand(process.env, process.platform); const handle = await fs.open(target, "r"); const headerBuffer = Buffer.alloc(192); const { bytesRead } = await handle.read(headerBuffer, 0, headerBuffer.length, 0); @@ -838,22 +1558,33 @@ const header = headerBuffer.subarray(0, bytesRead).toString("utf8").split(/\\r?\ let command = target; let commandArgs = args; if (/^#!.*\\bbun(?:\\s|$)/.test(header)) { - command = process.env.BUN_CMD || "bun"; + if (!hasManagedBun) throw new Error("Managed Bun executable is missing or unsafe; inspect with gstack doctor"); + command = managedBun; commandArgs = [target, ...args]; } else if (/^#!.*\\b(?:bash|sh)(?:\\s|$)/.test(header)) { - command = process.env.GSTACK_BASH || "bash"; + command = bashCommand; commandArgs = [target, ...args]; } else if (/^#!.*\\bpython3?(?:\\s|$)/.test(header)) { command = process.env.GSTACK_PYTHON || (process.platform === "win32" ? "python" : "python3"); commandArgs = [target, ...args]; } else if (/^#!.*\\bnode(?:\\s|$)/.test(header)) { - command = process.env.GSTACK_NODE || "node"; + command = process.env.GSTACK_NODE || process.execPath; commandArgs = [target, ...args]; } const child = spawn(command, commandArgs, { stdio: "inherit", windowsHide: true, - env: { ...process.env, GSTACK_HOME: process.env.GSTACK_HOME || home }, + env: { + ...process.env, + GSTACK_HOME: process.env.GSTACK_HOME || home, + GSTACK_NODE: process.env.GSTACK_NODE || process.execPath, + GSTACK_BASH: bashCommand, + ...(hasManagedBun ? { + BUN_CMD: managedBun, + PATH: path.dirname(managedBun) + path.delimiter + (process.env.PATH || ""), + } : {}), + ...(browserStat?.isDirectory() ? { PLAYWRIGHT_BROWSERS_PATH: managedBrowsers } : {}), + }, }); child.once("error", error => { console.error(error.message); process.exitCode = 1; }); child.once("exit", (code, signal) => { if (signal) process.kill(process.pid, signal); else process.exitCode = code ?? 1; }); @@ -875,11 +1606,11 @@ export async function resolveActiveRoot(metaUrl) { let pointer = JSON.parse(await fs.readFile(pointerPath, "utf8")); if (pointer.status === "pending") pointer = await recoverPending(pointerPath, home, pointer); if (pointer.status !== "active" || !validVersion(pointer.current)) { - throw new Error("No verified active gstack runtime; run ./setup"); + throw new Error("No verified active gstack runtime; inspect with gstack doctor, then use an explicitly approved capability bootstrap"); } const root = path.join(home, "versions", pointer.current); const stat = await fs.lstat(root).catch(() => null); - if (!stat?.isDirectory() || stat.isSymbolicLink()) throw new Error("Active gstack runtime is missing or unsafe; rerun ./setup"); + if (!stat?.isDirectory() || stat.isSymbolicLink()) throw new Error("Active gstack runtime is missing or unsafe; inspect with gstack doctor, then use an explicitly approved capability bootstrap"); return { home, root, pointer }; } @@ -897,7 +1628,7 @@ async function recoverInterruptedInstall(home) { if (journal.schemaVersion !== 1 || journal.kind !== "gstack-runtime-install-transaction" || journal.status !== "prepared" || journalHome !== physicalHome || !Array.isArray(journal.files) || typeof journal.previousPointerExists !== "boolean") { - throw new Error("Managed runtime transaction journal is invalid; rerun ./setup"); + throw new Error("Managed runtime transaction journal is invalid; inspect with gstack doctor before explicitly reinstalling optional capabilities"); } for (const file of journal.files) { const relative = validTransactionPath(file?.path); @@ -1040,18 +1771,33 @@ function validVersion(value) { } function bunProxySource(relativeTarget) { - return `#!/usr/bin/env bun + return `#!/usr/bin/env node +import fs from "node:fs/promises"; import path from "node:path"; +import { spawn } from "node:child_process"; +import { pathToFileURL } from "node:url"; import { resolveActiveRoot } from "./gstack-resolve.mjs"; const { home, root } = await resolveActiveRoot(import.meta.url); const target = path.join(root, ${JSON.stringify(relativeTarget)}); -const child = Bun.spawn([process.env.BUN_CMD || "bun", target, ...process.argv.slice(2)], { - stdin: "inherit", - stdout: "inherit", - stderr: "inherit", - env: { ...process.env, GSTACK_HOME: process.env.GSTACK_HOME || home }, +const managedBun = path.join(root, ${JSON.stringify(managedBunRelativePath())}); +const stat = await fs.lstat(managedBun).catch(() => null); +if (!stat?.isFile() || stat.isSymbolicLink()) throw new Error("Managed Bun executable is missing or unsafe; inspect with gstack doctor"); +const tooling = await import(pathToFileURL(path.join(root, "runtime", "tooling.js")).href); +const bashCommand = await tooling.resolveBashCommand(process.env, process.platform); +const child = spawn(managedBun, [target, ...process.argv.slice(2)], { + stdio: "inherit", + windowsHide: true, + env: { + ...process.env, + GSTACK_HOME: process.env.GSTACK_HOME || home, + GSTACK_NODE: process.env.GSTACK_NODE || process.execPath, + GSTACK_BASH: bashCommand, + BUN_CMD: managedBun, + PATH: path.dirname(managedBun) + path.delimiter + (process.env.PATH || ""), + }, }); -process.exitCode = await child.exited; +child.once("error", error => { console.error(error.message); process.exitCode = 1; }); +child.once("exit", (code, signal) => { if (signal) process.kill(process.pid, signal); else process.exitCode = code ?? 1; }); `; } @@ -1107,6 +1853,7 @@ async function writeInstallManifest(paths, _pointer, launcherSurface, now) { const manifest = { schemaVersion: INSTALL_SCHEMA_VERSION, kind: "gstack-managed-runtime", + compatibility: RUNTIME_COMPATIBILITY, versionStore: "versions", versionPointer: "versions/current.json", managedPaths: [ @@ -1235,8 +1982,7 @@ function validateVersion(value) { async function sha256File(file) { const hash = createHash("sha256"); - const data = await fs.readFile(file); - hash.update(data); + for await (const chunk of createReadStream(file)) hash.update(chunk); return hash.digest("hex"); } @@ -1262,12 +2008,14 @@ function sameStringArray(left, right) { export function runCommand(command, args, options = {}) { return new Promise((resolve, reject) => { + const superviseTree = options.superviseTree === true; const child = nodeSpawn(command, args, { cwd: options.cwd, env: options.env ?? process.env, stdio: options.capture ? ["ignore", "pipe", "pipe"] : "inherit", windowsHide: true, shell: false, + detached: superviseTree && process.platform !== "win32", }); let stdout = ""; let stderr = ""; @@ -1279,17 +2027,54 @@ export function runCommand(command, args, options = {}) { let timeout = null; let killGrace = null; let timeoutError = null; + let directExited = false; + let treeTerminationComplete = !superviseTree; + const signalHandlers = []; const finish = (callback, value) => { if (settled) return; settled = true; if (timeout) clearTimeout(timeout); if (killGrace) clearTimeout(killGrace); + for (const [signal, handler] of signalHandlers) process.removeListener(signal, handler); callback(value); }; const timeoutMs = Number(options.timeoutMs); const killGraceMs = Number.isFinite(Number(options.killGraceMs)) && Number(options.killGraceMs) > 0 ? Number(options.killGraceMs) : 5_000; + const beginTermination = async (error) => { + if (settled || timeoutError) return; + timeoutError = error; + killGrace = setTimeout(() => { + const killError = new Error(`Command tree did not terminate within ${killGraceMs}ms: ${command}`); + killError.code = "INSTALL_COMMAND_KILL_TIMEOUT"; + killError.timeoutMs = error.timeoutMs; + killError.killGraceMs = killGraceMs; + killError.cause = timeoutError; + killError.preserveScratch = true; + finish(reject, killError); + }, killGraceMs); + try { + if (superviseTree) await terminateProcessTree(child); + else child.kill("SIGKILL"); + treeTerminationComplete = true; + if (directExited) finish(reject, timeoutError); + } catch (cause) { + timeoutError.cause = cause; + } + }; + if (superviseTree) { + for (const signal of ["SIGINT", "SIGTERM"]) { + const handler = () => { + const error = new Error(`Command cancelled by ${signal}: ${command}`); + error.code = "INSTALL_COMMAND_CANCELLED"; + error.signal = signal; + void beginTermination(error); + }; + signalHandlers.push([signal, handler]); + process.once(signal, handler); + } + } child.once("error", (error) => { if (!timeoutError) return finish(reject, error); // A kill error is evidence that termination is not yet confirmed. Keep @@ -1297,23 +2082,27 @@ export function runCommand(command, args, options = {}) { timeoutError.cause ??= error; }); child.once("exit", (code, signal) => { + directExited = true; if (!timeoutError && timeout) { clearTimeout(timeout); timeout = null; } - // A timeout is not complete until the direct child is confirmed dead. - // Timed installer probes are deliberately single-process commands; this - // helper does not claim to supervise commands that daemonize descendants. + // A timeout is not complete until the direct child is confirmed dead and + // an explicitly supervised process tree has been terminated. if (timeoutError) { timeoutError.exitCode = code; timeoutError.signal = signal; child.stdout?.destroy(); child.stderr?.destroy(); - finish(reject, timeoutError); + if (treeTerminationComplete) finish(reject, timeoutError); } }); child.once("close", (code, signal) => { - if (timeoutError) return finish(reject, timeoutError); + if (timeoutError) { + directExited = true; + if (treeTerminationComplete) finish(reject, timeoutError); + return; + } if (code === 0) finish(resolve, { code, stdout, stderr }); else { const error = new Error(`Command failed (${signal ?? code}): ${command} ${args.join(" ")}`); @@ -1327,53 +2116,147 @@ export function runCommand(command, args, options = {}) { }); if (Number.isFinite(timeoutMs) && timeoutMs > 0) { timeout = setTimeout(() => { - timeoutError = new Error(`Command timed out after ${timeoutMs}ms: ${command}`); - timeoutError.code = "INSTALL_COMMAND_TIMEOUT"; - timeoutError.timeoutMs = timeoutMs; - try { - child.kill("SIGKILL"); - } catch (cause) { - timeoutError.cause = cause; - } - killGrace = setTimeout(() => { - const error = new Error(`Timed-out command did not terminate within ${killGraceMs}ms: ${command}`); - error.code = "INSTALL_COMMAND_KILL_TIMEOUT"; - error.timeoutMs = timeoutMs; - error.killGraceMs = killGraceMs; - error.cause = timeoutError; - finish(reject, error); - }, killGraceMs); + const error = new Error(`Command timed out after ${timeoutMs}ms: ${command}`); + error.code = "INSTALL_COMMAND_TIMEOUT"; + error.timeoutMs = timeoutMs; + void beginTermination(error); }, timeoutMs); } }); } +async function terminateProcessTree(child) { + if (!Number.isInteger(child.pid) || child.pid <= 0) throw new Error("Cannot supervise a child without a PID"); + if (process.platform !== "win32") { + try { + process.kill(-child.pid, "SIGKILL"); + } catch (error) { + if (error?.code !== "ESRCH") throw error; + } + return; + } + await new Promise((resolve, reject) => { + const killer = nodeSpawn("taskkill", ["/pid", String(child.pid), "/T", "/F"], { + stdio: "ignore", + windowsHide: true, + shell: false, + }); + killer.once("error", reject); + killer.once("close", (code) => code === 0 || code === 128 ? resolve() : reject(new Error(`taskkill failed (${code})`))); + }); +} + function parseInstallerArgs(argv) { - const result = { sourceDir: null, home: null, version: undefined, bunCommand: undefined, quiet: false, json: false, help: false }; + const result = { + sourceDir: null, + home: null, + version: undefined, + bunCommand: undefined, + capabilityIds: OPTIONAL_RUNTIME_CAPABILITIES, + installMode: null, + yes: false, + dryRun: false, + prepared: false, + replaceCapabilities: false, + quiet: false, + json: false, + help: false, + }; for (let index = 0; index < argv.length; index += 1) { const arg = argv[index]; if (["-h", "--help"].includes(arg)) result.help = true; else if (["-q", "--quiet"].includes(arg)) result.quiet = true; else if (arg === "--json") result.json = true; - else if (["--source", "--home", "--version", "--bun"].includes(arg)) { + else if (arg === "--yes") result.yes = true; + else if (arg === "--dry-run") result.dryRun = true; + else if (arg === "--prepared") result.prepared = true; + else if (arg === "--replace-capabilities") result.replaceCapabilities = true; + else if (arg === "--install-now") result.installMode = "now"; + else if (arg === "--install-later") result.installMode = "later"; + else if (["--source", "--home", "--version", "--bun", "--capabilities"].includes(arg)) { const value = argv[index + 1]; if (!value || value.startsWith("--")) throw new TypeError(`Missing value for ${arg}`); index += 1; - const key = { "--source": "sourceDir", "--home": "home", "--version": "version", "--bun": "bunCommand" }[arg]; - result[key] = value; + if (arg === "--capabilities") result.capabilityIds = parseCapabilityList(value); + else { + const key = { "--source": "sourceDir", "--home": "home", "--version": "version", "--bun": "bunCommand" }[arg]; + result[key] = value; + } } else { throw new TypeError(`Unknown setup option: ${arg}. Skill placement is delegated to: npx skills add time-attack/gstack`); } } + if (result.installMode === "later" && result.yes) throw new TypeError("--install-later cannot be combined with --yes"); + if (result.prepared && result.installMode !== "now") throw new TypeError("--prepared is reserved for an explicit prepared artifact install"); + if (result.dryRun && (result.installMode != null || result.yes)) throw new TypeError("--dry-run cannot be combined with install/consent flags"); return result; } function installerUsage() { - return `Usage: ./setup [--home ] [--version ] [--json] [--quiet]\n\n` + - "Installs only the optional host-neutral runtime and local capability bundle.\n" + + return `Usage: ./setup [--capabilities ] [--replace-capabilities] [--dry-run|--install-now [--yes]|--install-later]\n` + + ` [--home ] [--version ] [--json] [--quiet]\n\n` + + `Optional capabilities: ${OPTIONAL_RUNTIME_CAPABILITIES.join(", ")}\n` + + "Without --install-now, non-interactive use previews and installs nothing.\n" + + "--dry-run and --install-later never modify the runtime, state, or host setup.\n" + + "Installs only the optional host-neutral runtime and selected local capabilities.\n" + "Install the six skills separately with: npx skills add time-attack/gstack\n"; } +function parseCapabilityList(value) { + const normalized = String(value).trim().toLowerCase(); + if (normalized === "all") return OPTIONAL_RUNTIME_CAPABILITIES; + if (["none", "core"].includes(normalized)) return []; + return normalizeCapabilitySelection(normalized.split(",")); +} + +async function askInstallerQuestion(input, output, prompt) { + const interface_ = readline.createInterface({ input, output, terminal: true }); + try { + return await interface_.question(prompt); + } finally { + interface_.close(); + } +} + +function printInstallPreview(stdout, preview) { + stdout.write("GStack optional runtime preview\n"); + stdout.write(`Capabilities: ${preview.capabilities.length ? preview.capabilities.join(", ") : "core only"}\n`); + stdout.write(`Projected local payload before unknown downloads: ${preview.humanSize} (${preview.files} files, ${preview.components} components)\n`); + for (const item of preview.materializations) { + if (item.kind === "managed-bun-capture") { + if (item.available) { + stdout.write(`Runtime-owned Bun: capture ${item.version} from ${item.source} (${formatBytes(item.bytes)}) after approval.\n`); + } else { + stdout.write(`Runtime-owned Bun: ${item.command} is unavailable for a reviewed-source build; use the prepared official bootstrap or install/select Bun before approving a source build.\n`); + } + } else if (item.kind === "playwright-chromium-download") { + stdout.write("Managed Chromium: Playwright download into transaction scratch after browser-capability approval (download bytes not known yet).\n"); + } + } + if (preview.buildsRequired.length) stdout.write(`Builds required: ${preview.buildsRequired.join(", ")}\n`); + if (preview.missing.length) { + stdout.write(`${preview.missing.length} component(s) are absent; download size depends on the frozen-lockfile cache and is not yet known.\n`); + } + stdout.write(`Dependency preparation after approval: ${preview.dependencyPreparation}\n`); + for (const prerequisite of preview.externalPrerequisites) stdout.write(`External prerequisite: ${prerequisite}\n`); + stdout.write("This installs only under GSTACK_HOME; it does not enroll or configure any coding host.\n"); +} + +async function mergeActiveCapabilities(home, requested, replace) { + const selected = normalizeCapabilitySelection(requested); + if (replace) return selected; + const paths = resolveRuntimePaths({ home }); + const pointer = await readJson(paths.versionPointer, null); + const current = pointer?.current; + if (typeof current !== "string" || !/^[0-9A-Za-z][0-9A-Za-z._-]{0,79}$/.test(current)) return selected; + const root = assertPathInside(paths.versions, path.join(paths.versions, current)); + const stat = await fs.lstat(root).catch(() => null); + if (!stat?.isDirectory() || stat.isSymbolicLink()) return selected; + const manifest = await readJson(path.join(root, ".gstack-bundle.json"), null); + const retained = Array.isArray(manifest?.selectedCapabilities) ? manifest.selectedCapabilities : []; + return normalizeCapabilitySelection([...retained, ...selected]); +} + const invokedPath = process.argv[1] ? pathToFileURL(path.resolve(process.argv[1])).href : null; if (invokedPath === import.meta.url) { process.exitCode = await runInstallerCli(); diff --git a/runtime/licenses/BUN-LICENSE-1.3.14.md b/runtime/licenses/BUN-LICENSE-1.3.14.md new file mode 100644 index 000000000..42c24aaa0 --- /dev/null +++ b/runtime/licenses/BUN-LICENSE-1.3.14.md @@ -0,0 +1,82 @@ +Bun itself is MIT-licensed. + +## JavaScriptCore + +Bun statically links JavaScriptCore (and WebKit) which is LGPL-2 licensed. WebCore files from WebKit are also licensed under LGPL2. Per LGPL2: + +> (1) If you statically link against an LGPL’d library, you must also provide your application in an object (not necessarily source) format, so that a user has the opportunity to modify the library and relink the application. + +You can find the patched version of WebKit used by Bun here: . If you would like to relink Bun with changes: + +- `git submodule update --init --recursive` +- `make jsc` +- `zig build` + +This compiles JavaScriptCore, compiles Bun’s `.cpp` bindings for JavaScriptCore (which are the object files using JavaScriptCore) and outputs a new `bun` binary with your changes. + +## Linked libraries + +Bun statically links these libraries: + +| Library | License | +|---------|---------| +| [`boringssl`](https://boringssl.googlesource.com/boringssl/) | [several licenses](https://boringssl.googlesource.com/boringssl/+/refs/heads/master/LICENSE) | +| [`brotli`](https://github.com/google/brotli) | MIT | +| [`libarchive`](https://github.com/libarchive/libarchive) | [several licenses](https://github.com/libarchive/libarchive/blob/master/COPYING) | +| [`lol-html`](https://github.com/cloudflare/lol-html/tree/master/c-api) | BSD 3-Clause | +| [`ls-hpack`](https://github.com/litespeedtech/ls-hpack) | MIT | +| [`ls-qpack`](https://github.com/litespeedtech/ls-qpack) | MIT | +| [`lsquic`](https://github.com/litespeedtech/lsquic) | MIT (portions derived from [Chromium proto-quic](https://github.com/litespeedtech/lsquic/blob/master/LICENSE.chrome), BSD 3-Clause) | +| [`mimalloc`](https://github.com/microsoft/mimalloc) | MIT | +| [`picohttp`](https://github.com/h2o/picohttpparser) | dual-licensed under the Perl License or the MIT License | +| [`zstd`](https://github.com/facebook/zstd) | dual-licensed under the BSD License or GPLv2 license | +| [`simdutf`](https://github.com/simdutf/simdutf) | Apache 2.0 | +| [`tinycc`](https://github.com/tinycc/tinycc) | LGPL v2.1 | +| [`uSockets`](https://github.com/uNetworking/uSockets) | Apache 2.0 | +| [`zlib-ng`](https://github.com/zlib-ng/zlib-ng) | zlib | +| [`c-ares`](https://github.com/c-ares/c-ares) | MIT licensed | +| [`libicu`](https://github.com/unicode-org/icu) 72 | [license here](https://github.com/unicode-org/icu/blob/main/icu4c/LICENSE) | +| [`libbase64`](https://github.com/aklomp/base64/blob/master/LICENSE) | BSD 2-Clause | +| [`libuv`](https://github.com/libuv/libuv) (on Windows) | MIT | +| [`libdeflate`](https://github.com/ebiggers/libdeflate) | MIT | +| [`libjpeg-turbo`](https://github.com/libjpeg-turbo/libjpeg-turbo) | [BSD 3-Clause / IJG / zlib](https://github.com/libjpeg-turbo/libjpeg-turbo/blob/main/LICENSE.md) | +| [`libspng`](https://github.com/randy408/libspng) | BSD 2-Clause | +| [`libwebp`](https://github.com/webmproject/libwebp) | BSD 3-Clause | +| [`highway`](https://github.com/google/highway) | Apache 2.0 | +| [`uucode`](https://github.com/jacobsandlund/uucode) | MIT | +| A fork of [`uWebsockets`](https://github.com/jarred-sumner/uwebsockets) | Apache 2.0 licensed | +| Parts of [Tigerbeetle's IO code](https://github.com/tigerbeetle/tigerbeetle/blob/532c8b70b9142c17e07737ab6d3da68d7500cbca/src/io/windows.zig#L1) | Apache 2.0 licensed | +| `__cxa_thread_atexit` fallback from [LLVM libc++abi](https://github.com/llvm/llvm-project/blob/llvmorg-19.1.0/libcxxabi/src/cxa_thread_atexit.cpp) | Apache 2.0 with LLVM exception | + +## Polyfills + +For compatibility reasons, the following packages are embedded into Bun's binary and injected if imported. + +| Package | License | +|---------|---------| +| [`assert`](https://npmjs.com/package/assert) | MIT | +| [`browserify-zlib`](https://npmjs.com/package/browserify-zlib) | MIT | +| [`buffer`](https://npmjs.com/package/buffer) | MIT | +| [`constants-browserify`](https://npmjs.com/package/constants-browserify) | MIT | +| [`crypto-browserify`](https://npmjs.com/package/crypto-browserify) | MIT | +| [`domain-browser`](https://npmjs.com/package/domain-browser) | MIT | +| [`events`](https://npmjs.com/package/events) | MIT | +| [`https-browserify`](https://npmjs.com/package/https-browserify) | MIT | +| [`os-browserify`](https://npmjs.com/package/os-browserify) | MIT | +| [`path-browserify`](https://npmjs.com/package/path-browserify) | MIT | +| [`process`](https://npmjs.com/package/process) | MIT | +| [`punycode`](https://npmjs.com/package/punycode) | MIT | +| [`querystring-es3`](https://npmjs.com/package/querystring-es3) | MIT | +| [`stream-browserify`](https://npmjs.com/package/stream-browserify) | MIT | +| [`stream-http`](https://npmjs.com/package/stream-http) | MIT | +| [`string_decoder`](https://npmjs.com/package/string_decoder) | MIT | +| [`timers-browserify`](https://npmjs.com/package/timers-browserify) | MIT | +| [`tty-browserify`](https://npmjs.com/package/tty-browserify) | MIT | +| [`url`](https://npmjs.com/package/url) | MIT | +| [`util`](https://npmjs.com/package/util) | MIT | +| [`vm-browserify`](https://npmjs.com/package/vm-browserify) | MIT | + +## Additional credits + +- Bun's JS transpiler, CSS lexer, and Node.js module resolver source code is a Zig port of [@evanw](https://github.com/evanw)’s [esbuild](https://github.com/evanw/esbuild) project. +- Credit to [@kipply](https://github.com/kipply) for the name "Bun"! diff --git a/runtime/licenses/BUN-SOURCE.md b/runtime/licenses/BUN-SOURCE.md new file mode 100644 index 000000000..475820c8b --- /dev/null +++ b/runtime/licenses/BUN-SOURCE.md @@ -0,0 +1,21 @@ +# Bun redistribution source and version record + +Official GStack runtime 2.0.0 artifacts redistribute the unmodified Bun 1.3.14 +executable installed by the pinned `oven-sh/setup-bun` release workflow step. +The exact upstream license inventory is vendored beside this file as +`BUN-LICENSE-1.3.14.md`. The tagged raw file's SHA-256 is +`2c6160ec8fb853f7e8f97d9b249e756c9b0ac44860a68b6bf4f1b0bcbc5c3741`; +the vendored copy differs only by its final newline and has SHA-256 +`2cb858b2db8fc793bca2093489c5bc8eee615d002cc4924254904044c27a0afa`. + +Authoritative tagged sources, including the object/source material and relink +instructions referenced by the upstream license inventory: + +- https://github.com/oven-sh/bun/tree/bun-v1.3.14 +- https://github.com/oven-sh/bun/blob/bun-v1.3.14/LICENSE.md +- https://github.com/oven-sh/webkit + +Reviewed-source installs may capture a different user-selected Bun executable. +Its exact version is recorded in the active runtime's `.gstack-bundle.json`; the +redistributor of such a custom bundle is responsible for retaining the matching +upstream notices and source/relink offer. diff --git a/runtime/managed-home.js b/runtime/managed-home.js index f7b7c5df8..6b00f5d0a 100644 --- a/runtime/managed-home.js +++ b/runtime/managed-home.js @@ -100,6 +100,32 @@ export async function ensureManagedHome(home, options = {}) { return { home: resolved, sentinel, created: false }; } +/** Create/verify one direct runtime-owned directory without following links. */ +export async function ensureManagedRuntimeDirectory(home, directory) { + const resolvedHome = path.resolve(home); + const resolvedDirectory = path.resolve(directory); + if (path.dirname(resolvedDirectory) !== resolvedHome) { + throw managedHomeError("Managed runtime directory must be a direct child of GSTACK_HOME", "MANAGED_HOME_SUBDIRECTORY_UNSAFE"); + } + try { + await fs.mkdir(resolvedDirectory, { mode: 0o700 }); + } catch (error) { + if (error?.code !== "EEXIST") throw error; + } + const stat = await fs.lstat(resolvedDirectory).catch(() => null); + if (!stat?.isDirectory() || stat.isSymbolicLink()) { + throw managedHomeError(`Managed runtime directory is missing or unsafe: ${resolvedDirectory}`, "MANAGED_HOME_SUBDIRECTORY_UNSAFE"); + } + const [physicalHome, physicalDirectory] = await Promise.all([ + fs.realpath(resolvedHome), + fs.realpath(resolvedDirectory), + ]); + if (path.dirname(physicalDirectory) !== physicalHome) { + throw managedHomeError(`Managed runtime directory escaped GSTACK_HOME: ${resolvedDirectory}`, "MANAGED_HOME_SUBDIRECTORY_UNSAFE"); + } + return resolvedDirectory; +} + async function inspectRecognizedLegacyHome(home, entries) { // Record all pre-existing top-level entries in the sentinel so purge can // never remove them, even if their names later overlap the managed runtime diff --git a/runtime/runtime-bootstrap.mjs b/runtime/runtime-bootstrap.mjs new file mode 100644 index 000000000..dda8cac07 --- /dev/null +++ b/runtime/runtime-bootstrap.mjs @@ -0,0 +1,422 @@ +#!/usr/bin/env node +// Dependency-free bootstrap copied into each standards-installed GStack skill. +// It installs only the optional local runtime; host skill placement remains the +// responsibility of the Agent Skills installer. +import fs from "node:fs/promises"; +import os from "node:os"; +import path from "node:path"; +import process from "node:process"; +import { createHash } from "node:crypto"; +import { createReadStream } from "node:fs"; +import { spawn } from "node:child_process"; +import { fileURLToPath } from "node:url"; + +export const BOOTSTRAP_SCHEMA_VERSION = 2; +export const BOOTSTRAP_RUNTIME_VERSION = "2.0.0"; +export const OFFICIAL_MANIFEST_URL = + `https://github.com/time-attack/gstack/releases/download/v${BOOTSTRAP_RUNTIME_VERSION}/gstack-runtime-manifest.json`; +const CAPABILITIES = new Set(["browser", "browser-visible", "design", "pdf", "diagram", "ios"]); +const CAPABILITY_DEPENDENCIES = Object.freeze({ + browser: Object.freeze([]), + "browser-visible": Object.freeze([]), + design: Object.freeze([]), + pdf: Object.freeze(["browser", "diagram"]), + diagram: Object.freeze(["browser"]), + ios: Object.freeze([]), +}); +export const COMPONENT_DEPENDENCIES = Object.freeze({ + core: Object.freeze([]), + "browser-code": Object.freeze(["core"]), + "browser-headless": Object.freeze(["browser-code"]), + "browser-visible": Object.freeze(["browser-code"]), + design: Object.freeze(["core"]), + diagram: Object.freeze(["browser-headless"]), + pdf: Object.freeze(["diagram"]), + ios: Object.freeze(["core"]), +}); +export const CAPABILITY_COMPONENTS = Object.freeze({ + browser: Object.freeze(["browser-code", "browser-headless"]), + "browser-visible": Object.freeze(["browser-code", "browser-visible"]), + design: Object.freeze(["design"]), + diagram: Object.freeze(["diagram"]), + pdf: Object.freeze(["pdf"]), + ios: Object.freeze(["ios"]), +}); +const ALLOWED_DOWNLOAD_HOSTS = new Set([ + "github.com", + "objects.githubusercontent.com", + "release-assets.githubusercontent.com", +]); +const OFFICIAL_RELEASE_PREFIX = `/time-attack/gstack/releases/download/v${BOOTSTRAP_RUNTIME_VERSION}/`; +const OFFICIAL_CERTIFICATE_IDENTITY = + `https://github.com/time-attack/gstack/.github/workflows/release-artifacts.yml@refs/tags/v${BOOTSTRAP_RUNTIME_VERSION}`; +const GITHUB_OIDC_ISSUER = "https://token.actions.githubusercontent.com"; + +export async function main(argv = process.argv.slice(2), options = {}) { + const io = { + stdout: options.stdout ?? process.stdout, + stderr: options.stderr ?? process.stderr, + }; + try { + const parsed = parseArgs(argv); + if (parsed.help) { + io.stdout.write(usage()); + return 0; + } + if (!["preview", "install"].includes(parsed.action)) { + throw bootstrapError("Expected `preview` or `install`", "BOOTSTRAP_USAGE"); + } + + const platform = options.platform ?? process.platform; + if (parsed.capabilities.includes("ios") && platform !== "darwin") { + throw bootstrapError("The physical-iOS capability is available only on macOS", "BOOTSTRAP_PLATFORM_UNSUPPORTED"); + } + if (parsed.source) { + if (parsed.action === "preview") { + io.stdout.write("Reviewed-source fallback has no signed compressed-byte manifest; the local installer can provide an on-disk preview only.\n"); + return 0; + } + if (!parsed.yes) throw bootstrapError("Installation requires explicit --yes after review", "BOOTSTRAP_CONSENT_REQUIRED"); + io.stderr.write("Developer-only source install: only continue with a checkout you reviewed and trust.\n"); + return await installFromSource(parsed.source, parsed, { ...options, ...io, prepared: false }); + } + + const fetch_ = options.fetch ?? globalThis.fetch; + if (typeof fetch_ !== "function") throw bootstrapError("Node 18+ with fetch is required", "BOOTSTRAP_NODE_UNSUPPORTED"); + const target = platformTarget( + platform, + options.arch ?? process.arch, + options.libc ?? detectLinuxLibc(platform), + ); + const manifestUrl = options.manifestUrl ?? OFFICIAL_MANIFEST_URL; + assertOfficialUrl(manifestUrl, { manifest: true }); + const manifest = await fetchJson(fetch_, manifestUrl); + validateManifest(manifest, target); + const home = path.resolve(parsed.home ?? process.env.GSTACK_HOME ?? path.join(os.homedir(), ".gstack")); + const reusable = await inspectReusableRuntime(home, manifest.version).catch(() => null); + const plan = buildComponentPlan(manifest, target, parsed.capabilities, reusable); + if (parsed.json) io.stdout.write(`${JSON.stringify({ ok: true, action: parsed.action, ...plan }, null, 2)}\n`); + else printComponentPlan(io.stdout, plan); + if (parsed.action === "preview") return 0; + if (!parsed.yes) throw bootstrapError("Installation requires explicit --yes after reviewing this exact component plan", "BOOTSTRAP_CONSENT_REQUIRED"); + const temporary = await fs.mkdtemp(path.join(options.tmpDir ?? os.tmpdir(), "gstack-bootstrap-")); + try { + const root = path.join(temporary, "merged", "gstack"); + await fs.mkdir(root, { recursive: true, mode: 0o700 }); + const claimedFiles = new Set(); + if (reusable) await seedReusableRuntime(reusable.root, root, claimedFiles); + for (const item of plan.downloads) { + const archive = path.join(temporary, `${item.component}.tar.gz`); + await downloadVerified(fetch_, item.artifact.url, archive, item.artifact.sha256, item.artifact.bytes); + io.stdout.write(`Verified SHA-256 for ${item.component} (${target}).\n`); + await verifyCosignWhenAvailable(archive, item.artifact, path.join(temporary, item.component), { ...options, fetch: fetch_, ...io }); + const extracted = path.join(temporary, "extracted", item.component); + await fs.mkdir(extracted, { recursive: true, mode: 0o700 }); + await extractTarSafely(archive, extracted, options); + const componentRoot = safeArtifactRoot(extracted, item.artifact.root ?? "gstack"); + await assertNoLinks(componentRoot); + await mergeComponentRoot(componentRoot, root, claimedFiles, item.component); + } + return await installFromSource(root, parsed, { ...options, ...io, prepared: true, version: manifest.version }); + } finally { + await fs.rm(temporary, { recursive: true, force: true }); + } + } catch (error) { + io.stderr.write(`gstack bootstrap: ${error?.message ?? error}\n`); + return 1; + } +} + +function parseArgs(argv) { + const result = { action: null, capabilities: [], source: null, home: null, yes: false, json: false, help: false }; + for (let index = 0; index < argv.length; index += 1) { + const arg = argv[index]; + if (["-h", "--help"].includes(arg)) result.help = true; + else if (arg === "--yes") result.yes = true; + else if (arg === "--json") result.json = true; + else if (!result.action && !arg.startsWith("-")) result.action = arg; + else if (["--capability", "--source", "--home"].includes(arg)) { + const value = argv[++index]; + if (!value || value.startsWith("--")) throw bootstrapError(`${arg} requires a value`, "BOOTSTRAP_USAGE"); + if (arg === "--capability") result.capabilities.push(value); + else if (arg === "--source") result.source = value; + else result.home = value; + } else throw bootstrapError(`Unknown option: ${arg}`, "BOOTSTRAP_USAGE"); + } + if (result.help) return result; + if (result.action === "preview" && result.yes) throw bootstrapError("preview cannot be combined with --yes", "BOOTSTRAP_USAGE"); + if (!result.capabilities.length) throw bootstrapError("At least one --capability is required", "BOOTSTRAP_USAGE"); + result.capabilities = [...new Set(result.capabilities)].sort(); + for (const capability of result.capabilities) { + if (!CAPABILITIES.has(capability)) throw bootstrapError(`Unknown capability: ${capability}`, "BOOTSTRAP_USAGE"); + } + const expanded = new Set(result.capabilities); + const pending = [...expanded]; + while (pending.length) { + for (const dependency of CAPABILITY_DEPENDENCIES[pending.pop()] ?? []) { + if (!expanded.has(dependency)) { + expanded.add(dependency); + pending.push(dependency); + } + } + } + result.capabilities = [...expanded].sort(); + return result; +} + +function validateManifest(manifest, target) { + if (manifest?.schemaVersion !== BOOTSTRAP_SCHEMA_VERSION || manifest?.version !== BOOTSTRAP_RUNTIME_VERSION || + manifest?.skillApi !== "2.0" || typeof manifest?.targets !== "object" || + !sameGraph(manifest.capabilityComponents, CAPABILITY_COMPONENTS) || + !sameGraph(manifest.componentDependencies, COMPONENT_DEPENDENCIES)) { + throw bootstrapError("Official runtime manifest is incompatible", "BOOTSTRAP_MANIFEST_INVALID"); + } + const targetRecord = manifest.targets[target]; + const expected = Object.keys(COMPONENT_DEPENDENCIES) + .filter((component) => component !== "ios" || target.startsWith("darwin-")) + .sort(); + if (!targetRecord || typeof targetRecord.components !== "object" || + JSON.stringify(Object.keys(targetRecord.components).sort()) !== JSON.stringify(expected)) { + throw bootstrapError(`No valid official runtime artifact for ${target}`, "BOOTSTRAP_ARTIFACT_UNAVAILABLE"); + } + for (const [component, artifact] of Object.entries(targetRecord.components)) { + if (!artifact || artifact.format !== "tar.gz" || !/^[a-f0-9]{64}$/.test(artifact.sha256) || + !Number.isSafeInteger(artifact.bytes) || artifact.bytes < 1 || artifact.bytes > 2 * 1024 * 1024 * 1024) { + throw bootstrapError(`Invalid ${component} artifact for ${target}`, "BOOTSTRAP_ARTIFACT_UNAVAILABLE"); + } + assertOfficialReleaseAssetUrl(artifact.url); + if (artifact.cosignBundleUrl) { + assertOfficialReleaseAssetUrl(artifact.cosignBundleUrl); + if (artifact.certificateIdentity !== OFFICIAL_CERTIFICATE_IDENTITY || + artifact.certificateOidcIssuer !== GITHUB_OIDC_ISSUER) { + throw bootstrapError("Cosign metadata does not bind the official GStack release workflow", "BOOTSTRAP_MANIFEST_INVALID"); + } + } else if (artifact.certificateIdentity || artifact.certificateOidcIssuer) { + throw bootstrapError("Cosign certificate metadata requires a bundle URL", "BOOTSTRAP_MANIFEST_INVALID"); + } + } + return targetRecord; +} + +function sameGraph(actual, expected) { + if (!actual || typeof actual !== "object" || Array.isArray(actual)) return false; + const normalize = (graph) => Object.fromEntries(Object.entries(graph) + .sort(([left], [right]) => left.localeCompare(right)) + .map(([key, values]) => [key, Array.isArray(values) ? [...values].sort() : values])); + return JSON.stringify(normalize(actual)) === JSON.stringify(normalize(expected)); +} + +async function fetchJson(fetch_, url) { + const response = await fetch_(url, { headers: { Accept: "application/json" }, redirect: "follow" }); + assertFinalDownloadUrl(response.url || url); + if (!response.ok) throw bootstrapError(`Download failed with HTTP ${response.status}`, "BOOTSTRAP_DOWNLOAD_FAILED"); + const value = await response.json(); + if (!value || typeof value !== "object") throw bootstrapError("Manifest returned invalid JSON", "BOOTSTRAP_MANIFEST_INVALID"); + return value; +} + +async function downloadVerified(fetch_, url, destination, expectedSha256, expectedBytes) { + const response = await fetch_(url, { redirect: "follow" }); + assertFinalDownloadUrl(response.url || url); + if (!response.ok) throw bootstrapError(`Artifact download failed with HTTP ${response.status}`, "BOOTSTRAP_DOWNLOAD_FAILED"); + const hash = createHash("sha256"); + const file = await fs.open(destination, "wx", 0o600); + let total = 0; + try { + if (response.body?.getReader) { + const reader = response.body.getReader(); + while (true) { + const { done, value } = await reader.read(); + if (done) break; + total += value.byteLength; + if (total > 2 * 1024 * 1024 * 1024) throw bootstrapError("Runtime artifact exceeds the 2 GiB safety limit", "BOOTSTRAP_DOWNLOAD_FAILED"); + hash.update(value); + await file.write(value); + } + } else { + const bytes = new Uint8Array(await response.arrayBuffer()); + total = bytes.byteLength; + hash.update(bytes); + await file.write(bytes); + } + } catch (error) { + await file.close(); + await fs.rm(destination, { force: true }); + throw error; + } + await file.close(); + if (total !== expectedBytes) { + await fs.rm(destination, { force: true }); + throw bootstrapError(`Runtime artifact size mismatch (expected ${expectedBytes}, received ${total})`, "BOOTSTRAP_INTEGRITY_FAILED"); + } + const actual = hash.digest("hex"); + if (actual !== expectedSha256) { + await fs.rm(destination, { force: true }); + throw bootstrapError("Runtime artifact SHA-256 mismatch", "BOOTSTRAP_INTEGRITY_FAILED"); + } +} + +async function verifyCosignWhenAvailable(archive, artifact, temporary, options) { + if (!artifact.cosignBundleUrl) { + options.stdout.write("No Cosign bundle declared; continuing with verified release-manifest SHA-256.\n"); + return; + } + const available = await run(options.cosignCommand ?? "cosign", ["version"], { capture: true }).then(() => true, () => false); + if (!available) { + options.stdout.write("Cosign metadata is available but Cosign is not installed; SHA-256 verification succeeded.\n"); + return; + } + const bundle = path.join(temporary, "cosign.bundle"); + const response = await options.fetch(artifact.cosignBundleUrl, { redirect: "follow" }); + assertFinalDownloadUrl(response.url || artifact.cosignBundleUrl); + if (!response.ok) throw bootstrapError("Cosign bundle download failed", "BOOTSTRAP_ATTESTATION_FAILED"); + await fs.writeFile(bundle, new Uint8Array(await response.arrayBuffer()), { mode: 0o600, flag: "wx" }); + const args = ["verify-blob", "--bundle", bundle]; + if (artifact.certificateIdentity) args.push("--certificate-identity", artifact.certificateIdentity); + if (artifact.certificateOidcIssuer) args.push("--certificate-oidc-issuer", artifact.certificateOidcIssuer); + args.push(archive); + await run(options.cosignCommand ?? "cosign", args); + options.stdout.write("Verified Cosign release attestation.\n"); +} + +async function extractTarSafely(archive, destination, options) { + const tar = options.tarCommand ?? "tar"; + const listing = await run(tar, ["-tzf", archive], { capture: true }); + for (const name of listing.stdout.split(/\r?\n/).filter(Boolean)) { + const normalized = name.replaceAll("\\", "/"); + if (normalized.includes("\0") || normalized.startsWith("/") || /^[A-Za-z]:\//.test(normalized) || + normalized.split("/").includes("..")) { + throw bootstrapError("Runtime archive contains an unsafe path", "BOOTSTRAP_ARCHIVE_UNSAFE"); + } + } + const verbose = await run(tar, ["-tvzf", archive], { capture: true }); + for (const line of verbose.stdout.split(/\r?\n/).filter(Boolean)) { + if (!/^[-d]/.test(line)) { + throw bootstrapError("Runtime archive contains a link or special-file entry", "BOOTSTRAP_ARCHIVE_UNSAFE"); + } + } + await run(tar, ["-xzf", archive, "-C", destination]); +} + +async function installFromSource(source, parsed, options) { + const physical = await fs.realpath(path.resolve(source)); + const installer = path.join(physical, "runtime", "install.js"); + const stat = await fs.lstat(installer).catch(() => null); + if (!stat?.isFile() || stat.isSymbolicLink()) throw bootstrapError("Source does not contain a safe runtime installer", "BOOTSTRAP_SOURCE_INVALID"); + const args = [installer, "--source", physical, "--install-now", "--yes", "--capabilities", parsed.capabilities.join(",")]; + if (parsed.home) args.push("--home", path.resolve(parsed.home)); + if (options.version) args.push("--version", options.version); + if (options.prepared) args.push("--prepared"); + await run(options.nodeCommand ?? process.execPath, args); + options.stdout.write(`Installed optional capabilities: ${parsed.capabilities.join(", ")}. No coding host was enrolled.\n`); + return 0; +} + +function platformTarget(platform, arch, libc) { + if (!["darwin", "linux", "win32"].includes(platform) || !["arm64", "x64"].includes(arch)) { + throw bootstrapError(`Unsupported platform: ${platform}-${arch}`, "BOOTSTRAP_PLATFORM_UNSUPPORTED"); + } + if (platform === "linux" && libc !== "glibc") { + throw bootstrapError( + "Official GStack runtime artifacts currently require glibc Linux; pure Agent Skills remain portable and the reviewed-source fallback may be used explicitly", + "BOOTSTRAP_PLATFORM_UNSUPPORTED", + ); + } + return `${platform === "win32" ? "windows" : platform}-${arch}`; +} + +function detectLinuxLibc(platform) { + if (platform !== "linux") return null; + const report = typeof process.report?.getReport === "function" ? process.report.getReport() : null; + return report?.header?.glibcVersionRuntime ? "glibc" : "musl"; +} + +function safeArtifactRoot(extracted, relative) { + if (typeof relative !== "string" || !relative || path.isAbsolute(relative) || relative.split(/[\\/]/).includes("..")) { + throw bootstrapError("Manifest contains an unsafe artifact root", "BOOTSTRAP_MANIFEST_INVALID"); + } + const target = path.resolve(extracted, relative); + if (path.relative(extracted, target).startsWith(`..${path.sep}`)) throw bootstrapError("Artifact root escaped extraction", "BOOTSTRAP_ARCHIVE_UNSAFE"); + return target; +} + +async function assertNoLinks(root) { + const pending = [root]; + while (pending.length) { + const target = pending.pop(); + const stat = await fs.lstat(target); + if (stat.isSymbolicLink()) throw bootstrapError("Runtime archive contains a symbolic link", "BOOTSTRAP_ARCHIVE_UNSAFE"); + if (stat.isDirectory()) for (const child of await fs.readdir(target)) pending.push(path.join(target, child)); + } +} + +function assertOfficialUrl(value, options = {}) { + const url = new URL(value); + if (url.protocol !== "https:" || url.username || url.password || !ALLOWED_DOWNLOAD_HOSTS.has(url.hostname)) { + throw bootstrapError("Bootstrap downloads are restricted to official GitHub release hosts", "BOOTSTRAP_URL_BLOCKED"); + } + if (options.manifest && url.hostname !== "github.com") throw bootstrapError("Manifest must come from the official GitHub release", "BOOTSTRAP_URL_BLOCKED"); +} + +function assertOfficialReleaseAssetUrl(value) { + assertOfficialUrl(value); + const url = new URL(value); + if (url.hostname !== "github.com" || !url.pathname.startsWith(OFFICIAL_RELEASE_PREFIX)) { + throw bootstrapError("Runtime assets must come from the official versioned GStack release", "BOOTSTRAP_URL_BLOCKED"); + } +} + +function assertFinalDownloadUrl(value) { + assertOfficialUrl(value); +} + +function run(command, args, options = {}) { + return new Promise((resolve, reject) => { + const child = spawn(command, args, { shell: false, windowsHide: true, stdio: options.capture ? ["ignore", "pipe", "pipe"] : "inherit" }); + let stdout = ""; + let stderr = ""; + child.stdout?.setEncoding("utf8"); + child.stderr?.setEncoding("utf8"); + child.stdout?.on("data", (chunk) => { stdout += chunk; }); + child.stderr?.on("data", (chunk) => { stderr += chunk; }); + child.once("error", reject); + child.once("close", (code) => code === 0 ? resolve({ stdout, stderr }) : reject(bootstrapError(`${command} failed (${code})`, "BOOTSTRAP_COMMAND_FAILED"))); + }); +} + +function bootstrapError(message, code) { + const error = new Error(message); + error.code = code; + return error; +} + +function formatBytes(bytes) { + const units = ["B", "KiB", "MiB", "GiB"]; + let value = bytes; + let index = 0; + while (value >= 1024 && index < units.length - 1) { + value /= 1024; + index += 1; + } + return `${value.toFixed(index === 0 ? 0 : value >= 10 ? 1 : 2)} ${units[index]} (${bytes} bytes)`; +} + +function usage() { + return "Usage: node runtime-bootstrap.mjs install --capability [--capability ...]\n" + + " node runtime-bootstrap.mjs install --source --capability \n\n" + + "Downloads only a versioned official GStack runtime release and never enrolls a coding host.\n" + + "--source is a developer-only fallback for a checkout you have reviewed and trust.\n"; +} + +async function isDirectExecution() { + if (!process.argv[1]) return false; + const [modulePath, invokedPath] = await Promise.all([ + fs.realpath(fileURLToPath(import.meta.url)), + fs.realpath(path.resolve(process.argv[1])).catch(() => path.resolve(process.argv[1])), + ]); + return modulePath === invokedPath; +} + +if (await isDirectExecution()) { + process.exitCode = await main(); +} diff --git a/runtime/storage.js b/runtime/storage.js index f0684f257..62f85b490 100644 --- a/runtime/storage.js +++ b/runtime/storage.js @@ -193,9 +193,16 @@ export async function acquireLock(lockPath, options = {}) { async function reapStaleLock(lockPath, staleMs, platform = process.platform) { try { const stat = await fs.stat(lockPath); - if (Date.now() - stat.mtimeMs <= staleMs) return false; const owner = await readJson(path.join(lockPath, "owner.json"), null).catch(() => null); - if (owner?.hostname === os.hostname() && processIsAlive(owner.pid)) return false; + const sameHostPid = owner?.hostname === os.hostname() && Number.isInteger(owner?.pid) && owner.pid > 0; + if (sameHostPid) { + // A dead same-host PID is conclusive enough to recover immediately. + // A live/reused PID remains protected; remote or malformed ownership + // falls back to the heartbeat age lease below. + if (processIsAlive(owner.pid)) return false; + } else if (Date.now() - stat.mtimeMs <= staleMs) { + return false; + } const staleName = `${lockPath}.stale-${process.pid}-${randomUUID()}`; await renameWithRetry(lockPath, staleName, { platform }); await fs.rm(staleName, { recursive: true, force: true }); diff --git a/runtime/tooling.js b/runtime/tooling.js new file mode 100644 index 000000000..0c5f9558a --- /dev/null +++ b/runtime/tooling.js @@ -0,0 +1,30 @@ +import fs from "node:fs/promises"; +import path from "node:path"; + +export function bashCandidates(env = process.env, platform = process.platform) { + const values = [env.GSTACK_BASH]; + if (platform === "win32") { + for (const root of [ + env.ProgramFiles, + env["ProgramFiles(x86)"], + env.LOCALAPPDATA && path.join(env.LOCALAPPDATA, "Programs"), + ]) { + if (!root) continue; + values.push( + path.join(root, "Git", "bin", "bash.exe"), + path.join(root, "Git", "usr", "bin", "bash.exe"), + ); + } + } + values.push("bash"); + return values.filter((entry, index, list) => entry && list.indexOf(entry) === index); +} + +export async function resolveBashCommand(env = process.env, platform = process.platform) { + for (const candidate of bashCandidates(env, platform)) { + if (!path.isAbsolute(candidate)) return candidate; + const stat = await fs.lstat(candidate).catch(() => null); + if (stat?.isFile() && !stat.isSymbolicLink()) return candidate; + } + return "bash"; +} diff --git a/runtime/upgrade.js b/runtime/upgrade.js index 4437c9e7b..ea28c5dde 100644 --- a/runtime/upgrade.js +++ b/runtime/upgrade.js @@ -6,6 +6,7 @@ import { atomicWriteJson, pathExists, readJson, renameWithRetry } from "./storag import { assertManagedHome, ensureManagedHome, + ensureManagedRuntimeDirectory, recoverRuntimeTransactionUnlocked, withRuntimeLifecycleLock, } from "./managed-home.js"; @@ -17,7 +18,10 @@ export async function stageUpgrade(options) { return withRuntimeLifecycleLock(home, async () => { await ensureManagedHome(home, options); await recoverRuntimeTransactionUnlocked(home); - return stageUpgradeUnlocked({ ...options, home }); + // Consuming input is reserved for the installer's validated scratch. + // Public upgrades always preserve and copy caller-owned sources. + const { consumeInstallerScratch: _ignored, ...publicOptions } = options; + return stageUpgradeUnlocked({ ...publicOptions, home }); }, options); } @@ -32,7 +36,12 @@ export async function stageUpgradeUnlocked(options) { const paths = resolveRuntimePaths({ home }); const source = path.resolve(sourceDir); await validateStageSource(source); - await fs.mkdir(paths.versions, { recursive: true, mode: 0o700 }); + const consumeSource = options.consumeInstallerScratch === true; + if (consumeSource) { + await ensureManagedRuntimeDirectory(home, paths.tmp); + await assertInstallerScratchSource(source, paths.tmp); + } + await ensureManagedRuntimeDirectory(home, paths.versions); await recoverPendingUpgradeUnlocked(paths, options); const previousExists = await pathExists(paths.versionPointer); @@ -47,7 +56,8 @@ export async function stageUpgradeUnlocked(options) { path.join(paths.versions, `.stage-${version}-${randomUUID()}`), ); try { - await copyDirectory(source, stage); + if (consumeSource) await renameWithRetry(source, stage); + else await copyDirectory(source, stage); await atomicWriteJson(path.join(stage, ".gstack-version.json"), { schemaVersion: 2, version, @@ -102,7 +112,7 @@ export async function stageUpgradeUnlocked(options) { staged, paths, }); - return { pointer: active, path: destination, staged }; + return { pointer: active, path: destination, staged, consumedSource: staged && consumeSource }; } catch (cause) { const rollbackErrors = []; let pointerRollbackError = null; @@ -320,6 +330,20 @@ async function copyDirectory(source, destination) { }); } +async function assertInstallerScratchSource(source, tmpRoot) { + const [physicalSource, physicalTmp] = await Promise.all([ + fs.realpath(source), + fs.realpath(tmpRoot), + ]); + if (path.dirname(physicalSource) !== physicalTmp || !path.basename(physicalSource).startsWith("install-")) { + throw upgradeError("Only a direct installer-owned scratch may be consumed", "UPGRADE_SOURCE_CONSUME_INVALID"); + } + const stat = await fs.lstat(physicalSource); + if (!stat.isDirectory() || stat.isSymbolicLink()) { + throw upgradeError("Installer scratch must be a real directory", "UPGRADE_SOURCE_CONSUME_INVALID"); + } +} + async function assertTreeContainsNoLinks(root) { const pending = [root]; while (pending.length > 0) { diff --git a/scripts/gstack2/generate-skill-tree.ts b/scripts/gstack2/generate-skill-tree.ts index aec5a59d9..30139edb8 100644 --- a/scripts/gstack2/generate-skill-tree.ts +++ b/scripts/gstack2/generate-skill-tree.ts @@ -25,6 +25,7 @@ import { GSTACK2_BASE_SHA, TREE_NAMES, type DispatcherDefinition, type SourceAss const GENERATED = ''; const DOCS = path.join(ROOT, 'docs', 'gstack-2'); const EVALS = path.join(ROOT, 'evals', 'parity'); +const RUNTIME_SKILL_CONTRACT = { schemaVersion: 1, runtimeVersion: '2.0.0', skillApi: '2.0' } as const; function sha256(value: string | Uint8Array): string { return createHash('sha256').update(value).digest('hex'); @@ -128,7 +129,7 @@ function provenanceDetails(assignment: SourceAssignment, target: string): Record invocation_conditions: dispatcherMode?.inferWhen ?? `Internal compatibility invocation /${assignment.source}.`, modes: { public: assignment.publicMode, legacy_alias: assignment.mode }, question_sequence: contract.question_order, - follow_up_behavior: 'The complete source follow-up sequence is preserved verbatim inside new_location and hash-compared to the pinned base.', + follow_up_behavior: 'Specialist follow-up order is preserved from the pinned source. The retired 1.x shared onboarding wrapper is excluded, and carved specialist phases are package-local lazy references loaded at their original workflow point.', smart_skip_rules: contract.smart_skips, pushback_rules: contract.pressure, stop_gates: contract.stop_approval_gates, @@ -142,7 +143,7 @@ function provenanceDetails(assignment: SourceAssignment, target: string): Record voice: contract.voice, response_posture: 'Direct, evidence-first builder language; preserve source-specific recommendations and constructive pressure.', new_location: target, - parity_test: `${contractPath} + scripts/gstack2/run-parity.ts normalized full-body equality`, + parity_test: `${contractPath} + scripts/gstack2/run-parity.ts canonical specialist render, excluded-wrapper, lazy-section, and pinned-source provenance checks`, }; } @@ -152,7 +153,7 @@ function renderModule(assignment: SourceAssignment): { content: string; renderSh const overlays = overlaysForSource(assignment.source); const disposition = assignment.source === 'gstack-upgrade' ? 'DUPLICATE_INFRASTRUCTURE' - : overlays.length ? 'BUG_FIX' : 'MECHANICAL_PORT'; + : overlays.length ? 'BUG_FIX' : 'JUDGMENT_PRESERVING_CARVE'; const overlayText = overlays.map((overlay) => [ ``, `## Upstream judgment port: PR #${overlay.pr}`, @@ -229,10 +230,10 @@ Web context: 1. Infer the mode from product stage, surface, requested artifact, mutation authorization, evidence needs, and deployment state. Do not route by keyword alone. 2. Refine the public mode to the smallest applicable internal specialist set, then print the required execution header before any substantive output. -3. Read each active module in full from the path shown in the mode/alias tables. Its legacy body, behavioral contract, STOP gates, and appended upstream judgment ports are binding. -4. Read \`references/SHARED-JUDGMENT.md\` and \`references/AUTHORITY-POLICY.md\` for every invocation. Read \`references/WEB-CONTEXT.md\` before public-web or optional-runtime work. +3. Read each active module in full from the path shown in the mode/alias tables. Its specialist body, behavioral contract, STOP gates, and appended upstream judgment ports are binding. Read a lazy specialist phase in full only when the workflow reaches its package-local reference. +4. Read \`references/SHARED-JUDGMENT.md\` and \`references/AUTHORITY-POLICY.md\` for every invocation. Read \`references/RUNTIME.md\` before capability-dependent work and \`references/WEB-CONTEXT.md\` before public-web work. 5. If an old asset path is unavailable, use \`references/ASSETS.md\`. If legacy prose invokes another retired skill, resolve it through \`references/COMPATIBILITY.md\` and stay inside these six dispatchers. -6. Preserve report-only versus mutation boundaries. Commits, pushes, PRs, merges, deploys, messages, and other external mutations still require the authority stated by the active module and the user. +6. Preserve report-only versus mutation boundaries. Missing mutation authorization fails closed: do not edit merely because a specialist can fix. Commits, pushes, PRs, merges, deploys, messages, and other external mutations still require affirmative authority from the user. 7. Match the user's language. Keep code identifiers, commands, and source quotations original when translation would reduce accuracy. 8. At exit, report completed artifacts, evidence, unresolved decisions, skipped modules with reasons, and any blocked gate. ${supplemental} @@ -257,7 +258,7 @@ ${internalRows} ## Completeness invariant -Do not work from this dispatcher summary when a module is active. Read the referenced module completely, including its provenance marker, behavioral contract, full mechanically rendered source, and bug-fix overlays. +Do not work from this dispatcher summary when a module is active. Read the referenced module completely, including its provenance marker, specialist workflow, lazy-phase directives, behavioral contract, and bug-fix overlays. The pinned 1.x shared onboarding wrapper is provenance-only and never runs during canonical execution. `; } @@ -481,11 +482,37 @@ function webContextContract(): string { '', 'Persist only the explicit choice with `gstack context select host`, `gstack context select local-browser`, or `gstack context select none`. For Context.dev, show `gstack context options`, then use `gstack context setup` and its hidden key prompt; consent and key storage belong to the runtime, never this judgment prompt. Do not infer Context choice or consent.', '', - 'Capability-dependent work performs one host-neutral runtime check. Pure judgment never requires the runtime. If the runtime is absent, offer ./setup from a trusted GStack checkout; skill placement remains npx skills add time-attack/gstack.', + 'Capability-dependent work follows `references/RUNTIME.md`. Pure judgment never requires the runtime. Skill placement remains owned by `npx skills add time-attack/gstack` and is never inferred from runtime state.', '', ].join('\n'); } +function runtimeContract(): string { + return `${GENERATED} +# Optional runtime capabilities + +The six Agent Skills are useful without a GStack runtime. Never install, download, build, select, update, or remove runtime capabilities merely because a skill was invoked. + +When an active specialist first reaches a capability it cannot use, name the exact capability and why it is needed. Offer to continue without it when the judgment-only or host-native path remains valid. Before any network preview, ask whether the user wants to check official setup options and exact sizes. Disclose that an uncached preview makes one public GitHub request for signed manifest metadata and sends no repository content, private URL, file, cookie, token, or credential; then STOP. A cached already-verified manifest may preview offline, but never silently fetch. + +Only after the user approves that metadata check, run the non-mutating preview from this skill root: \`node references/support/runtime-bootstrap.mjs preview --capability \` (repeat \`--capability\` for additional requested capabilities). It dependency-expands, reports already verified local components, exact missing components, and their summed compressed bytes. It never downloads components or mutates runtime state. Preview consent is not install consent. + +User-facing setup capabilities are exactly \`browser\`, \`design\`, \`diagram\`, \`pdf\`, and \`ios\`. \`all\` means those five and intentionally excludes visible Chromium. The internal \`browser-visible\` capability is additive and is offered only when a workflow actually reaches a headed browser, extension, or browser-handoff step. Never offer it during ordinary headless QA. + +After showing the complete preview, STOP for explicit approval. Only after approval run \`node references/support/runtime-bootstrap.mjs install --capability --yes\`; install must reprint the identical dependency-closed plan before downloading. Signed internal components are \`core\`, \`browser-code\` (browse code and dependencies), \`browser-headless\` (Playwright headless shell and FFmpeg), \`browser-visible\` (full Chromium), \`design\`, \`diagram\`, \`pdf\`, and \`ios\`. Logical \`browser\` expands to \`browser-code + browser-headless\`; internal \`browser-visible\` expands to \`browser-code + browser-visible\` and does not require headless. Component dependencies are \`browser-code → core\`, \`browser-headless → browser-code\`, and \`browser-visible → browser-code\`. \`diagram\` depends on logical \`browser\`; \`pdf\` depends on \`diagram\`; \`ios\` is Darwin-only. Therefore a first-time headed flow previews \`core + browser-code + browser-visible\`, while an existing verified headless runtime downloads only missing \`browser-visible\`. The manifest schema is v2 with global \`capabilityComponents\` and \`componentDependencies\`, plus \`targets[target].components[id]\` carrying signed exact-byte artifacts. + +The dependency-free Node 18+ bootstrap accepts only official GStack GitHub Release hosts, validates manifest/runtime/skill API/platform/component metadata and SHA-256, verifies a declared Cosign bundle when Cosign is available, rejects unsafe archive paths/links, and invokes the atomic managed installer. Never run \`./setup\` inside a standard-installed skill directory, enroll a host, or treat skill installation as runtime consent. + +After doctor confirms readiness, canonical launcher bindings are \`GSTACK_HOME=\${GSTACK_HOME:-$HOME/.gstack}\`, \`GSTACK_BIN=$GSTACK_HOME/bin\`, \`BUN_CMD=$GSTACK_BIN/bun\`, \`B=$GSTACK_BIN/browse\`, \`D=$GSTACK_BIN/gstack-design\`, and \`P=$GSTACK_BIN/make-pdf\`. Specialist modules may bind only the launchers they use. These assignments do not install or grant consent. Never download or install a second Bun for GStack helpers; the managed runtime owns its pinned Bun executable in the active slot. + +Some retained helpers are shell scripts. \`gstack doctor\` verifies Bash and, on Windows, discovers Git for Windows Bash; disclose and stop at the affected helper if that prerequisite is unavailable. Python is not a global GStack prerequisite: only a specialist flow explicitly labeled as Python-dependent may request it, at the point of use and with the user's approval. + +The package/runtime compatibility tuple is \`schemaVersion=1\`, \`runtimeVersion=2.0.0\`, and \`skillApi=2.0\`; the machine-readable copy is \`references/support/runtime-contract.json\`. An incompatible active runtime is unavailable, not permission to upgrade it. + +The developer-only fallback is \`node references/support/runtime-bootstrap.mjs install --source --capability --yes\`; show its trust warning and use it only when the user explicitly selects a checkout they reviewed. If the packaged bootstrap is unavailable, stop capability setup instead of guessing a checkout-relative command. Deferring installation records no consent and must not block pure judgment. +`; +} + function systemFunctionalContract(): string { return `${GENERATED} # System-functional QA @@ -531,10 +558,14 @@ Do not put secrets in run IDs, effect keys, or command arguments. Existing appro } function writeSharedContracts(): void { + const bootstrap = fs.readFileSync(path.join(ROOT, 'runtime', 'runtime-bootstrap.mjs')); for (const tree of TREE_NAMES) { write(path.join(ROOT, 'skills', tree, 'references', 'SHARED-JUDGMENT.md'), sharedJudgmentContract()); write(path.join(ROOT, 'skills', tree, 'references', 'AUTHORITY-POLICY.md'), authorityPolicyContract()); write(path.join(ROOT, 'skills', tree, 'references', 'WEB-CONTEXT.md'), webContextContract()); + write(path.join(ROOT, 'skills', tree, 'references', 'RUNTIME.md'), runtimeContract()); + write(path.join(ROOT, 'skills', tree, 'references', 'support', 'runtime-bootstrap.mjs'), bootstrap); + writeJson(path.join(ROOT, 'skills', tree, 'references', 'support', 'runtime-contract.json'), RUNTIME_SKILL_CONTRACT); } write(path.join(ROOT, 'skills', 'qa', 'references', 'SYSTEM-FUNCTIONAL.md'), systemFunctionalContract()); write(path.join(ROOT, 'skills', 'ship', 'references', 'EXTERNAL-EFFECTS.md'), externalEffectsContract()); @@ -663,7 +694,7 @@ function migrationDoc(): string { Pinned baseline: \`${GSTACK2_BASE_SHA}\`. -GStack 2 exposes exactly six public Codex skills: \`plan\`, \`design\`, \`qa\`, \`debug\`, \`review\`, and \`ship\`. The 55 legacy templates remain mechanically rendered as internal reference modules; all 16 carved section templates are inlined with the canonical Codex resolver path. Thirty-one primary modules are mandatory specialist inputs, and 24 supporting modules remain reachable through compatibility routing. +GStack 2 exposes exactly six public skills: \`plan\`, \`design\`, \`qa\`, \`debug\`, \`review\`, and \`ship\`. The specialist bodies from 55 legacy templates remain provenance-pinned internal reference modules. The retired 1.x shared onboarding wrapper is excluded from canonical execution, and all 16 carved specialist sections are package-local lazy references loaded only at their original workflow point. Thirty-one primary modules are mandatory specialist inputs, and 24 supporting modules remain reachable through compatibility routing. The fixed public modes are: Design = \`Explore | Generate | Critique | Implement\`; QA = \`Report | Fix\`; Debug = \`Diagnose-only | Fix\`; Review = \`Normal | Security | Performance | Deep\`; Ship = \`Prepare | Land | Deploy | Monitor | Resume\`. Richer legacy modes are internal aliases only. @@ -681,8 +712,8 @@ ${rows} ## Mechanical versus judgment changes -- \`MECHANICAL_PORT\`: canonical Codex resolver expansion, section inlining, safety prose, and path rewrites only. -- \`BUG_FIX\`: the mechanical body plus a clearly delimited judgment overlay sourced from one of the 16 upstream PRs and its regression fixture. +- \`JUDGMENT_PRESERVING_CARVE\`: pinned specialist workflow with the retired shared onboarding wrapper excluded, retired invocations resolved to six public routes, host/runtime paths normalized, and large carved phases loaded lazily from package-local pinned references. +- \`BUG_FIX\`: the canonical carved body plus a clearly delimited judgment overlay sourced from one of the 16 upstream PRs and its regression fixture. - Asset relocation is byte-for-byte from the pinned Git blob and is indexed per tree. `; } @@ -709,14 +740,14 @@ The suite verifies: - exactly six discoverable public skills and 55 internal legacy modules; - 55 canonical templates plus 16 carved section templates at base \`${GSTACK2_BASE_SHA}\`; -- normalized legacy-body SHA-256 equality between source rendering and generated references; +- immutable full 1.x render hashes plus canonical specialist-render equality, with the excluded onboarding wrapper and lazy section references asserted explicitly; - preservation of nine behavioral contract dimensions per module; - 25 structured non-keyword routing fixtures with active/skipped modules, depth, mutation, and web context; - 16 upstream judgment-port regression fixtures and anchors; - all linked asset copies against their pinned Git blobs; - frontmatter and \`agents/openai.yaml\` schema for each public skill. -Golden normalization removes only generated provenance wrappers, bug-fix overlays, and irrelevant whitespace. It never removes legacy workflow prose, gates, questions, evidence requirements, artifacts, or exit behavior. +Golden normalization removes only generated provenance wrappers, bug-fix overlays, and irrelevant whitespace. Canonical rendering separately excludes the retired shared onboarding wrapper and packages large specialist phases as lazy references; parity checks both decisions explicitly without claiming full-body byte equality. `; } @@ -817,9 +848,7 @@ function main(): void { const sectionRecords = legacySections().map((section) => { const parent = sourceRecords.find((entry) => entry.source === section.source); if (!parent) throw new Error(`Section without parent assignment: ${section.relativePath}`); - const generated = fs.readFileSync(path.join(ROOT, String(parent.target)), 'utf8'); const portedSection = renderPortedLegacySection(section); - if (!generated.includes(portedSection.trim())) throw new Error(`Rendered section missing from ${parent.target}: ${section.relativePath}`); const packagedTargets = sectionCopies.filter((copy) => copy.source_path === section.relativePath).map((copy) => copy.target_path); const ownerTarget = packagedTargets.find((target) => target.startsWith(`skills/${String(parent.tree)}/`)); if (!ownerTarget) throw new Error(`Section was not packaged with its owner: ${section.relativePath}`); @@ -831,21 +860,21 @@ function main(): void { normalized_render_sha256: sha256(section.rendered), ported_render_sha256: sha256(portedSection), target: ownerTarget, - inlined_module_target: parent.target, + lazy_reference_module_target: parent.target, packaged_targets: packagedTargets, - disposition: 'MECHANICAL_PORT', + disposition: 'JUDGMENT_PRESERVING_CARVE', original_source_file: section.relativePath, original_line_range: sourceLineRange(section.relativePath), - purpose: `Carved specialist section from ${section.source}, mechanically inlined into its preserved module.`, + purpose: `Carved specialist section from ${section.source}, packaged behind a lazy reference at its original workflow point.`, invocation_conditions: `Loaded only when the parent ${section.source} workflow reaches this carved section.`, modes: { parent: section.source }, - question_sequence: 'Preserved verbatim in the inlined section.', - follow_up_behavior: 'Preserved verbatim in the inlined section.', + question_sequence: 'Preserved verbatim in the package-local lazy section.', + follow_up_behavior: 'Preserved verbatim in the package-local lazy section and loaded only when its original phase is reached.', smart_skip_rules: 'Inherited unchanged from the parent specialist workflow.', pushback_rules: 'Inherited unchanged from the parent specialist workflow.', stop_gates: 'Inherited unchanged from the parent specialist workflow.', approval_gates: 'Inherited unchanged from the parent specialist workflow.', - rubrics_and_scoring: 'Preserved verbatim in the inlined section.', + rubrics_and_scoring: 'Preserved verbatim in the package-local lazy section.', cognitive_frameworks: sourceHeadings(section.rendered), evidence_requirements: 'Inherited unchanged from the parent specialist workflow.', artifacts_produced: 'Inherited unchanged from the parent specialist workflow.', @@ -854,7 +883,7 @@ function main(): void { voice: 'Inherited unchanged from the parent specialist workflow.', response_posture: 'Inherited unchanged from the parent specialist workflow.', new_location: ownerTarget, - parity_test: `scripts/gstack2/run-parity.ts exact packaged-section, inline inclusion, and Git-blob checks`, + parity_test: `scripts/gstack2/run-parity.ts exact packaged-section, lazy-reference, and Git-blob checks`, }; }); @@ -886,7 +915,7 @@ function main(): void { write(path.join(DOCS, 'JUDGMENT-PARITY.md'), parityDoc(assets.length)); write(path.join(DOCS, 'SCENARIOS.md'), scenarioDoc()); const semantic = runDeterministicSemanticParity(true); - process.stdout.write(`Generated 6 dispatchers, ${sourceRecords.length} modules, ${sectionRecords.length} inlined sections, ${SCENARIOS.length} scenarios, ${BUG_FIX_OVERLAYS.length} bug-fix ports, and ${assets.length} asset copies.\n`); + process.stdout.write(`Generated 6 dispatchers, ${sourceRecords.length} modules, ${sectionRecords.length} lazy specialist sections, ${SCENARIOS.length} scenarios, ${BUG_FIX_OVERLAYS.length} bug-fix ports, and ${assets.length} asset copies.\n`); process.stdout.write(`Generated semantic evidence: ${semantic.checks} checks across ${semantic.suites} suites and ${semantic.policyUnits} authority-policy unit cases.\n`); } diff --git a/scripts/gstack2/render-legacy.ts b/scripts/gstack2/render-legacy.ts index 897b73d1a..e3631c963 100644 --- a/scripts/gstack2/render-legacy.ts +++ b/scripts/gstack2/render-legacy.ts @@ -4,6 +4,7 @@ import { getHostConfig } from '../../hosts/index'; import { extractHookSafetyProse, extractNameAndDescription } from '../resolvers/codex-helpers'; import { RESOLVERS } from '../resolvers/index'; import { HOST_PATHS, unwrapResolver, type TemplateContext } from '../resolvers/types'; +import { SOURCE_ASSIGNMENTS } from './assignments'; import { GSTACK2_BASE_SHA } from './types'; export const ROOT = path.resolve(import.meta.dir, '..', '..'); @@ -70,13 +71,21 @@ function buildContext(tmplContent: string, tmplPath: string): TemplateContext { }; } -function resolvePlaceholders(template: string, context: TemplateContext, relativePath: string): string { +type ResolverOverrides = Readonly>; + +function resolvePlaceholders( + template: string, + context: TemplateContext, + relativePath: string, + overrides: ResolverOverrides = {}, +): string { const config = getHostConfig('codex'); const suppressed = new Set(config.suppressedResolvers ?? []); const onePass = (input: string): string => input.replace( /\{\{(\w+(?::[^}]+)?)\}\}/g, (_match, fullKey: string) => { const [resolverName, ...args] = fullKey.split(':'); + if (Object.hasOwn(overrides, resolverName)) return overrides[resolverName]; if (suppressed.has(resolverName)) return ''; const entry = RESOLVERS[resolverName]; if (!entry) throw new Error(`Unknown placeholder {{${resolverName}}} in ${relativePath}`); @@ -97,6 +106,53 @@ function resolvePlaceholders(template: string, context: TemplateContext, relativ return content; } +/** + * The 1.x PREAMBLE resolver is host installation and engagement machinery, not + * specialist judgment. It performs first-run writes, telemetry/proactive + * prompts, update checks, model overlays, checkpoint promotion, artifact-sync + * enrollment, and CLAUDE.md mutation. GStack 2 keeps that immutable expansion + * as the parity oracle while deliberately excluding it from normal canonical + * execution. Runtime and authority are owned once by package-local contracts. + */ +export const CANONICAL_EXCLUDED_RESOLVERS = ['PREAMBLE'] as const; + +const RETIRED_ASSIGNMENTS = [...SOURCE_ASSIGNMENTS] + .filter((entry) => !['plan', 'design', 'qa', 'debug', 'review', 'ship'].includes(entry.source)) + .sort((a, b) => b.source.length - a.source.length); + +export function retiredInvocationPattern(): RegExp { + const sources = RETIRED_ASSIGNMENTS + .map((entry) => entry.source.replace(/[.*+?^${}()|[\]\\]/g, '\\$&')) + .join('|'); + return new RegExp(`(?])`); +} + +export function replaceRetiredInvocations(value: string): string { + let rewritten = value; + for (const assignment of RETIRED_ASSIGNMENTS) { + // A preceding word/path character means this slash is part of a file path + // or URL, not an invocation. The trailing set includes Markdown emphasis, + // table, and link punctuation in addition to prose punctuation. + rewritten = rewritten.replace( + new RegExp(`(?])`, 'g'), + assignment.replacement, + ); + } + return rewritten; +} + +function renderCanonicalSpecialistBody(source: string): string { + const templatePath = legacyTemplatePath(source); + const relativePath = repositoryRelativePath(templatePath); + const template = pinnedText(relativePath); + const context = buildContext(template, templatePath); + const overrides = Object.fromEntries(CANONICAL_EXCLUDED_RESOLVERS.map((name) => [name, ''])); + // Hook advisories are part of the host-specific 1.x wrapper. Canonical + // authority/safety policy is generated once beside every public dispatcher. + const body = stripFrontmatter(resolvePlaceholders(template, context, relativePath, overrides)); + return `${applyCodexRewrites(body).trim()}\n`; +} + function applyCodexRewrites(content: string): string { const config = getHostConfig('codex'); let rewritten = content; @@ -135,6 +191,11 @@ function portLegacyText(value: string, source: string): string { return `# Legacy upgrade compatibility\n\nThe 1.x host-directory detector, vendored-copy synchronizer, and destructive Git replacement blocks were duplicated installation infrastructure. GStack 2 delegates skill placement and updates to the standard Agent Skills installer and manages the optional shared runtime atomically.\n\n- Update selected skills with \`npx skills add time-attack/gstack\` using the user's existing project/global choice. Never infer or enroll a host.\n- Upgrade a complete local runtime package with \`gstack upgrade --source --version \`.\n- Roll back the runtime with \`gstack upgrade --rollback\`.\n- Run \`gstack doctor\` after either operation.\n- Do not reset, delete, move, or rewrite a host skill directory. Do not infer Context.dev choice or consent.\n\nThis compatibility module contains no specialist judgment; release readiness and rollback judgment remain in the preserved ship modules.\n`; } let body = value; + + // Retired names remain valid only as opt-in compatibility aliases. Normal + // canonical execution must recommend one of the six public routes, with the + // exact internal refinement retained for deterministic dispatch. + body = replaceRetiredInvocations(body); // Every state read/write follows the canonical override. Quote the root so // custom homes containing spaces remain valid. Compatibility pointer files // such as ~/.gstack-artifacts-remote.txt are outside this state root and are @@ -237,6 +298,36 @@ function portLegacyText(value: string, source: string): string { .replaceAll('~/.codex/skills/gstack/browse-remote.json', '${GSTACK_HOME:-$HOME/.gstack}/browse-remote.json') .replaceAll('${HOME}/.agents/skills/gstack/document-release/SKILL.md', 'references/legacy/document-release.md'); + // The managed runtime owns a pinned Bun executable. Remove the old + // per-skill curl installer and route GStack-owned helpers through their + // stable launchers. Project-owned commands such as a repository's `bun + // test` are intentionally untouched. + body = body + .replace( + /3\. If `bun` is not installed:\n\s+```bash\n[\s\S]*?\n\s+```/g, + '3. The approved managed runtime includes its own pinned Bun at `$GSTACK_BIN/bun`; never download or install another Bun from a skill workflow.', + ) + .replaceAll('bun run $GSTACK_BIN/gstack-gbrain-sync.ts', '$GSTACK_BIN/gstack-gbrain-sync') + .replaceAll('bun run $GSTACK_BIN/gstack-next-version', '$GSTACK_BIN/gstack-next-version') + .replaceAll('bun run $GSTACK_BIN/gstack-version-bump', '$GSTACK_BIN/gstack-version-bump') + .replaceAll('DISCOVER_BIN="bun run $GSTACK_BIN/gstack-global-discover"', 'DISCOVER_BIN="$GSTACK_BIN/gstack-global-discover"') + .replaceAll('Tell the user: "gstack browse needs a one-time build (~10 seconds). OK to proceed?" Then STOP and wait.', 'Tell the user: "The optional managed headless browser capability is missing. Do you want to preview its exact dependency-closed component plan and compressed bytes now?" Then STOP and wait.') + .replace(/^command -v bun >\/dev\/null 2>&1 \|\| echo "redaction scan skipped — bun not on PATH"\n/gm, ''); + + body = body + .replaceAll( + 'Run: `cd && ./setup`', + 'Read `references/RUNTIME.md` and follow its explicit capability bootstrap. Never assume a standard-installed skill directory contains `./setup`.', + ) + .replaceAll( + 'run `cd && ./setup`', + 'read `references/RUNTIME.md` and follow its explicit capability bootstrap; never assume a standard-installed skill directory contains `./setup`', + ) + .replaceAll( + 'Run `cd && ./setup`', + 'Read `references/RUNTIME.md` and follow its explicit capability bootstrap. Never assume a standard-installed skill directory contains `./setup`.', + ); + for (const helper of [ 'gstack-codex-probe', 'gstack-global-discover.ts', @@ -249,6 +340,12 @@ function portLegacyText(value: string, source: string): string { const stableName = helper === 'gstack-global-discover.ts' ? 'gstack-global-discover' : helper; body = body.replaceAll(`bin/${helper}`, `$GSTACK_BIN/${stableName}`); } + body = body + .replaceAll('bun run $GSTACK_BIN/gstack-gbrain-sync.ts', '$GSTACK_BIN/gstack-gbrain-sync') + .replaceAll('bun run $GSTACK_BIN/gstack-gbrain-sync', '$GSTACK_BIN/gstack-gbrain-sync') + .replaceAll('bun run $GSTACK_BIN/gstack-next-version', '$GSTACK_BIN/gstack-next-version') + .replaceAll('bun run $GSTACK_BIN/gstack-version-bump', '$GSTACK_BIN/gstack-version-bump') + .replaceAll('DISCOVER_BIN="bun run $GSTACK_BIN/gstack-global-discover"', 'DISCOVER_BIN="$GSTACK_BIN/gstack-global-discover"'); body = body.replace( /BUNDLE=""\nfor c in "\$HOME\/\.agents\/skills\/gstack\/lib\/diagram-render\/dist\/diagram-render\.html" \\\n\s+"\$\(git rev-parse --show-toplevel 2>\/dev\/null\)\/lib\/diagram-render\/dist\/diagram-render\.html"; do\n\s+\[ -f "\$c" \] && BUNDLE="\$c" && break\ndone/, @@ -288,11 +385,92 @@ function portLegacyText(value: string, source: string): string { ); } + // Canonical skills do not run engagement instrumentation. Remove the few + // source-local remnants that are outside {{PREAMBLE}} while leaving actual + // specialist reports, requested context saves, and explicit setup modules + // intact. + body = body.replace(/```bash\n([\s\S]*?)```/g, (block, commands: string) => { + const writesAnalytics = /(?:mkdir\s+-p|>>)[^\n]*\/(?:analytics|skill-usage\.jsonl)/.test(commands); + return writesAnalytics + ? 'Canonical execution does not write engagement analytics or telemetry.' + : block; + }); + body = body + .replace(/^.*gstack-telemetry-log.*\n?/gm, '') + .replace(/^\s*_gstack_codex_log_event\s+.*\n?/gm, '') + .replace(/^_TEL=\$\([^\n]*\)$/gm, '_TEL=off # Canonical execution does not emit GStack telemetry.') + .replace(/Best-effort, record which way you routed[\s\S]*?directly, no skill matched\):\nCanonical execution does not write engagement analytics or telemetry\.\n*/g, '') + .replace(/If `PROACTIVE` is `false`:[\s\S]*?Use the Skill tool to invoke it\. The skill has specialized workflows, checklists, and\nquality gates that produce better results than answering inline\.\n\n/g, '') + .replace(/\nIf the user opts out of suggestions,[\s\S]*?gstack-config set proactive true`\.\n?/g, '\n') + .replace(/#### TTHW telemetry \(DX11\/F7\)[\s\S]*?\n---\n/g, '---\n') + .replace(/\n3\. Append metrics:\nCanonical execution does not write engagement analytics or telemetry\.\nReplace ITERATIONS,[\s\S]*?actual values from the review\.\n/g, '\n3. Report the iteration counts and quality score in the user-facing result; do not persist engagement analytics.\n'); + return `${body.trim()}\n`; } export function renderPortedLegacyBody(source: string): string { - return portLegacyText(renderLegacyBody(source), source); + let body = portLegacyText(renderCanonicalSpecialistBody(source), source); + if (source === 'make-pdf') { + body = [ + '## Optional runtime binding', + '', + 'This workflow requires the `pdf` capability. Read `references/RUNTIME.md` before attempting installation. Pure planning or document review can continue without it.', + 'If unavailable, follow the consent-first `pdf` capability handoff in `references/RUNTIME.md`. It expands to `pdf`, `diagram`, and `browser`; do not guess a checkout-relative setup command.', + '', + body, + ].join('\n'); + } + body = body.replace( + '`./setup` auto-installs `fonts-noto-color-emoji` on Linux', + 'the explicitly approved `pdf` runtime capability attempts to install `fonts-noto-color-emoji` on Linux', + ); + if (['open-gstack-browser', 'pair-agent', 'setup-browser-cookies'].includes(source)) { + body = [ + '## Visible-browser point-of-use gate', + '', + 'This workflow may require internal `browser-visible` because it reaches a headed browser, extension, interactive cookie picker, or browser handoff. Do not offer visible Chromium during ordinary headless QA.', + '', + 'At the first actual visible-browser step, ask whether the user wants to check official setup options and exact sizes. Disclose that an uncached preview makes one public GitHub signed-manifest request and sends no repository/private data, then STOP. Only after that approval run `node references/support/runtime-bootstrap.mjs preview --capability browser-visible`. It expands to `core + browser-code + browser-visible` for a first install, but an existing verified headless runtime downloads only missing `browser-visible`; it never requires `browser-headless`. Show the exact missing components and summed incremental compressed bytes, then STOP again for separate install approval. Only after install approval run `node references/support/runtime-bootstrap.mjs install --capability browser-visible --yes`, recheck readiness, and resume the interrupted step.', + '', + body, + ].join('\n'); + } + if (/\$(?:GSTACK_BIN|GSTACK_ROOT|GSTACK_STATE_ROOT)\b|\$(?:B|D|P)\b/.test(body)) { + const bindings = [ + '## Host-neutral runtime bindings', + '', + 'These assignments select stable paths only; they do not install anything or grant consent:', + '', + '```bash', + 'GSTACK_HOME="${GSTACK_HOME:-$HOME/.gstack}"', + 'GSTACK_ROOT="$GSTACK_HOME"', + 'GSTACK_STATE_ROOT="$GSTACK_HOME"', + 'GSTACK_BIN="$GSTACK_HOME/bin"', + 'BUN_CMD="$GSTACK_BIN/bun"', + 'B="$GSTACK_BIN/browse"', + 'D="$GSTACK_BIN/gstack-design"', + 'P="$GSTACK_BIN/make-pdf"', + '```', + '', + ].join('\n'); + body = `${bindings}${body}`; + } + // Large specialist phases remain byte-derived from the pinned source, but + // are packaged as lazy references instead of duplicated inline. The active + // workflow loads one only when it reaches that phase. + for (const section of legacySections().filter((entry) => entry.source === source)) { + const ported = portLegacyText(section.rendered, section.source).trim(); + const filename = path.basename(section.relativePath).replace(/\.tmpl$/, ''); + const reference = `references/sections/${source}/${filename}`; + const directive = [ + `## Lazy specialist phase: ${filename.replace(/\.md$/, '')}`, + '', + `When the workflow reaches this phase, read \`${reference}\` completely and execute it before continuing. Do not summarize or skip its questions, pressure, gates, evidence, artifacts, mutation boundary, or exit behavior.`, + ].join('\n'); + if (!body.includes(ported)) throw new Error(`Unable to carve canonical section ${section.relativePath} from ${source}`); + body = body.replace(ported, directive); + } + return `${body.trim()}\n`; } export function renderPortedLegacySection(section: LegacySection): string { @@ -302,7 +480,7 @@ export function renderPortedLegacySection(section: LegacySection): string { /** Apply host-neutral runtime-path mechanics to linked text assets. */ export function renderPortedAssetBytes(relativePath: string, input: Uint8Array): Uint8Array { if (!relativePath.endsWith('.md')) return input; - const ported = Buffer.from(input).toString('utf8') + const ported = replaceRetiredInvocations(Buffer.from(input).toString('utf8') .replaceAll( '~/.claude/skills/gstack/bin/gstack-diff-scope', '${GSTACK_HOME:-$HOME/.gstack}/bin/gstack-diff-scope', @@ -310,7 +488,7 @@ export function renderPortedAssetBytes(relativePath: string, input: Uint8Array): .replaceAll( 'browse/bin/remote-slug 2>/dev/null || ~/.claude/skills/gstack/browse/bin/remote-slug', '${GSTACK_HOME:-$HOME/.gstack}/bin/remote-slug', - ); + )); return Buffer.from(ported, 'utf8'); } diff --git a/scripts/gstack2/route.ts b/scripts/gstack2/route.ts index 7c63d05cf..f3cc56e5c 100644 --- a/scripts/gstack2/route.ts +++ b/scripts/gstack2/route.ts @@ -134,10 +134,11 @@ export function routeStructured(signals: Record): StructuredRou ? 'fix-safe-after-root-cause' : specialist.defaultMutation; - // Structured routing may select a useful review/release mode without - // granting the mutation that mode can perform. Explicit denials always win, - // and irreversible ship stages require an affirmative external grant. - if (signals.mutation_authorized === false && ['fix-safe', 'fix-safe-after-root-cause', 'code-generation'].includes(mutation)) { + // Structured routing may select a useful review mode without granting the + // mutation that specialist can perform. Missing authority fails closed; + // fixing code requires an affirmative grant, not merely the absence of a + // denial. Irreversible ship stages use their separate external grant below. + if (signals.mutation_authorized !== true && ['fix-safe', 'fix-safe-after-root-cause', 'code-generation'].includes(mutation)) { mutation = 'report-only'; } if (source === 'spec' && mutation === 'spec-and-issue' && signals.issue_mutation_allowed !== true) { diff --git a/scripts/gstack2/run-parity.ts b/scripts/gstack2/run-parity.ts index 1e81913a6..e353da6c7 100644 --- a/scripts/gstack2/run-parity.ts +++ b/scripts/gstack2/run-parity.ts @@ -4,15 +4,15 @@ import * as fs from 'fs'; import * as path from 'path'; import { BUG_FIX_OVERLAYS, evaluateBugFixRegression, overlaysForSource } from './bug-fix-overlays'; import { contractFor, DISPATCHERS, SOURCE_ASSIGNMENTS } from './assignments'; -import { ROOT, blobShaForPath, legacySections, renderLegacyBody, renderPortedAssetBytes, renderPortedLegacyBody, renderPortedLegacySection, sourceBlobSha } from './render-legacy'; +import { ROOT, blobShaForPath, legacySections, renderLegacyBody, renderPortedAssetBytes, renderPortedLegacyBody, renderPortedLegacySection, retiredInvocationPattern, sourceBlobSha } from './render-legacy'; import { routeStructured } from './route'; import { SCENARIOS } from './scenarios'; import { GSTACK2_BASE_SHA, TREE_NAMES } from './types'; const CONTRACT_KEYS = ['question_order', 'pressure', 'smart_skips', 'stop_approval_gates', 'evidence', 'artifacts', 'mutation', 'exit', 'voice']; const PROVENANCE_KEYS = ['original_source_file', 'original_line_range', 'purpose', 'invocation_conditions', 'modes', 'question_sequence', 'follow_up_behavior', 'smart_skip_rules', 'pushback_rules', 'stop_gates', 'approval_gates', 'rubrics_and_scoring', 'cognitive_frameworks', 'evidence_requirements', 'artifacts_produced', 'mutation_authority', 'exit_states', 'voice', 'response_posture', 'new_location', 'parity_test']; -const ALLOWED_DISPOSITIONS = new Set(['VERBATIM_PORT', 'MECHANICAL_PORT', 'SHARED_MODULE', 'BUG_FIX', 'DUPLICATE_INFRASTRUCTURE', 'REMOVE_WITH_USER_APPROVAL']); -export const EXPECTED_PARITY_CHECKS = 4681; +const ALLOWED_DISPOSITIONS = new Set(['VERBATIM_PORT', 'MECHANICAL_PORT', 'JUDGMENT_PRESERVING_CARVE', 'SHARED_MODULE', 'BUG_FIX', 'DUPLICATE_INFRASTRUCTURE', 'REMOVE_WITH_USER_APPROVAL']); +export const EXPECTED_PARITY_CHECKS = 4697; function sha256(value: string | Uint8Array): string { return createHash('sha256').update(value).digest('hex'); @@ -56,6 +56,7 @@ export function runParity(): ParityResult { checks += 1; if (!condition) failures.push(message); }; + const retiredInvocation = retiredInvocationPattern(); const publicSkills = fs.readdirSync(path.join(ROOT, 'skills'), { withFileTypes: true }) .filter((entry) => entry.isDirectory() && fs.existsSync(path.join(ROOT, 'skills', entry.name, 'SKILL.md'))) @@ -184,6 +185,18 @@ export function runParity(): ParityResult { check(!/^\s*#{1,6}\s|^\s*[-*]\s|^\s*\d+\.\s/m.test(prelude), `${assignment.source} has visible generated prose before preserved judgment`); check(prelude.split('\n').length <= 5, `${assignment.source} generated prelude is not thin`); check(generatedBody === expectedBody, `${assignment.source} normalized legacy body differs`); + check(!generatedBody.includes('## Preamble (run first)'), `${assignment.source} still executes the retired shared onboarding preamble`); + check(!/MODEL_OVERLAY: claude|CLAUDE_PLAN_FILE|Add routing rules to CLAUDE\.md|Boil the Ocean principle|TEL_PROMPTED|PROACTIVE_PROMPTED/.test(generatedBody), `${assignment.source} retains host-specific onboarding, engagement, or telemetry machinery`); + check(!/cd && \.\/setup/.test(generatedBody), `${assignment.source} tells a standard-installed skill to run a nonexistent local setup script`); + check(!retiredInvocation.test(generatedBody), `${assignment.source} recommends a retired public invocation instead of a six-skill route`); + const usesRuntimeBinding = /\$(?:GSTACK_BIN|GSTACK_ROOT|GSTACK_STATE_ROOT)\b|\$(?:B|D|P)\b/.test(generatedBody); + check(!usesRuntimeBinding || generatedBody.includes('## Host-neutral runtime bindings'), `${assignment.source} uses an unbound retained runtime helper variable`); + check(!/bun\.sh\/install|bun run \$GSTACK_BIN|command -v bun/.test(generatedBody), `${assignment.source} retains GStack-owned host Bun onboarding or invocation`); + const visiblePointOfUse = ['open-gstack-browser', 'pair-agent', 'setup-browser-cookies'].includes(assignment.source); + check( + generatedBody.includes('## Visible-browser point-of-use gate') === visiblePointOfUse, + `${assignment.source} visible-browser point-of-use gate classification is wrong`, + ); check(module.includes(`blob=${baseBlob}`), `${assignment.source} module lacks source blob provenance`); check(module.includes(`baseline_render_sha256=${sha256(baselineBody)}`), `${assignment.source} module lacks immutable baseline render hash`); check(module.includes(`ported_render_sha256=${sha256(expectedBody)}`), `${assignment.source} module lacks installable port render hash`); @@ -197,6 +210,10 @@ export function runParity(): ParityResult { } } + const baselinePromptBytes = SOURCE_ASSIGNMENTS.reduce((total, assignment) => total + Buffer.byteLength(renderLegacyBody(assignment.source)), 0); + const canonicalPromptBytes = SOURCE_ASSIGNMENTS.reduce((total, assignment) => total + Buffer.byteLength(renderPortedLegacyBody(assignment.source)), 0); + check(canonicalPromptBytes < baselinePromptBytes * 0.5, `Canonical specialist corpus did not cut prompt bytes by at least 50% (${canonicalPromptBytes}/${baselinePromptBytes})`); + const sections = legacySections(); check(sections.length === 16, `Expected 16 section templates; got ${sections.length}`); for (const section of sections) { @@ -204,8 +221,9 @@ export function runParity(): ParityResult { const assignment = SOURCE_ASSIGNMENTS.find((entry) => entry.source === section.source)!; const module = fs.readFileSync(path.join(ROOT, 'skills', assignment.tree, 'references', 'legacy', `${assignment.source}.md`), 'utf8'); const portedSection = renderPortedLegacySection(section); - check(module.includes(portedSection.trim()), `${section.relativePath} was not mechanically inlined`); const sectionName = path.basename(section.relativePath).replace(/\.tmpl$/, ''); + check(module.includes(`references/sections/${section.source}/${sectionName}`), `${section.relativePath} lacks its package-local lazy reference`); + check(!module.includes(portedSection.trim()), `${section.relativePath} is still duplicated inline instead of lazy-loaded`); const packaged = path.join(ROOT, 'skills', assignment.tree, 'references', 'sections', section.source, sectionName); check(fs.existsSync(packaged), `${section.relativePath} is referenced but not packaged`); if (fs.existsSync(packaged)) check(normalizeGolden(fs.readFileSync(packaged, 'utf8')) === normalizeGolden(portedSection), `${section.relativePath} packaged content drifted`); @@ -279,6 +297,7 @@ export function runParity(): ParityResult { check(sha256(installed) === sha256(expected), `Relocated asset hash mismatch: ${asset.target_path}`); if (asset.target_path.endsWith('.md')) { check(!/~\/.claude\/skills\/gstack|browse\/bin\/remote-slug/.test(installed.toString()), `Relocated asset retains a host-specific runtime path: ${asset.target_path}`); + check(!retiredInvocationPattern().test(installed.toString()), `Relocated executable asset recommends a retired public invocation: ${asset.target_path}`); } } } @@ -286,7 +305,11 @@ export function runParity(): ParityResult { for (const sectionCopy of manifest.section_copies ?? []) { const target = path.join(ROOT, sectionCopy.target_path); check(fs.existsSync(target), `Missing packaged section ${sectionCopy.target_path}`); - if (fs.existsSync(target)) check(sha256(fs.readFileSync(target)) === sectionCopy.sha256, `Packaged section hash mismatch: ${sectionCopy.target_path}`); + if (fs.existsSync(target)) { + const content = fs.readFileSync(target); + check(sha256(content) === sectionCopy.sha256, `Packaged section hash mismatch: ${sectionCopy.target_path}`); + check(!retiredInvocationPattern().test(content.toString()), `Packaged section recommends a retired public invocation: ${sectionCopy.target_path}`); + } } for (const dependency of manifest.dependency_copies ?? []) { const target = path.join(ROOT, dependency.target); @@ -321,7 +344,7 @@ export function runParity(): ParityResult { for (const tree of TREE_NAMES) { const compatibility = fs.readFileSync(path.join(ROOT, 'skills', tree, 'references', 'COMPATIBILITY.md'), 'utf8'); check(!compatibility.includes('../../../') && !compatibility.includes('compat/README.md'), `${tree} compatibility map escapes the selected package`); - for (const reference of ['SHARED-JUDGMENT.md', 'WEB-CONTEXT.md']) { + for (const reference of ['SHARED-JUDGMENT.md', 'WEB-CONTEXT.md', 'RUNTIME.md']) { const referencePath = path.join(ROOT, 'skills', tree, 'references', reference); check(fs.existsSync(referencePath), `${tree} lacks ${reference}`); if (fs.existsSync(referencePath)) { @@ -331,6 +354,16 @@ export function runParity(): ParityResult { ); } } + const runtimeContract = fs.readFileSync(path.join(ROOT, 'skills', tree, 'references', 'RUNTIME.md'), 'utf8'); + const packagedBootstrap = fs.readFileSync(path.join(ROOT, 'skills', tree, 'references', 'support', 'runtime-bootstrap.mjs')); + check(packagedBootstrap.equals(fs.readFileSync(path.join(ROOT, 'runtime', 'runtime-bootstrap.mjs'))), `${tree} packaged runtime bootstrap drifted from its source`); + check(runtimeContract.includes('preview --capability ') && runtimeContract.includes('It never downloads components or mutates runtime state.'), `${tree} runtime contract lacks non-mutating exact-byte preview`); + check(runtimeContract.includes('install --capability --yes'), `${tree} runtime contract lacks explicit approved install invocation`); + check(runtimeContract.includes('Logical `browser` expands to `browser-code + browser-headless`') && runtimeContract.includes('`browser-visible` expands to `browser-code + browser-visible` and does not require headless') && runtimeContract.includes('`pdf` depends on `diagram`'), `${tree} runtime contract omits component dependency closure`); + check(runtimeContract.includes('`all` means those five and intentionally excludes visible Chromium'), `${tree} runtime contract lets eager setup install visible Chromium`); + check(runtimeContract.includes('B=$GSTACK_BIN/browse') && runtimeContract.includes('P=$GSTACK_BIN/make-pdf'), `${tree} runtime contract omits stable launcher bindings`); + check(runtimeContract.includes('BUN_CMD=$GSTACK_BIN/bun'), `${tree} runtime contract omits the managed Bun binding`); + check(runtimeContract.includes('discovers Git for Windows Bash') && runtimeContract.includes('Python is not a global GStack prerequisite'), `${tree} runtime contract omits retained shell/Python prerequisite disclosure`); } for (const required of ['SKILL-MIGRATION.md', 'JUDGMENT-PROVENANCE.json', 'JUDGMENT-PARITY.md', 'SCENARIOS.md']) { check(fs.existsSync(path.join(ROOT, 'docs', 'gstack-2', required)), `Missing docs/gstack-2/${required}`); diff --git a/scripts/gstack2/semantic-parity.ts b/scripts/gstack2/semantic-parity.ts index 08403ea8a..f13dd4995 100644 --- a/scripts/gstack2/semantic-parity.ts +++ b/scripts/gstack2/semantic-parity.ts @@ -78,7 +78,7 @@ function dimensionEvidence(execution: SemanticExecution, preservedPorts: boolean return [dimension, { classification: preservedPorts ? 'EQUIVALENT' : 'REGRESSION', evidence: preservedPorts - ? 'The candidate exactly matches the deterministic installable port of the pinned 1.x workflow; only enumerated package-local path mechanics differ from the immutable oracle.' + ? 'The candidate exactly matches the deterministic canonical specialist render of the pinned workflow. The retired shared onboarding wrapper is excluded and carved specialist phases are package-local lazy references; specialist questions, pressure, gates, evidence, artifacts, mutation boundaries, exit behavior, and voice remain governed by their source contracts.' : 'The candidate lost or changed authoritative workflow prose.', }]; })); @@ -115,7 +115,7 @@ function deterministicTranscript(execution: SemanticExecution) { mechanical_port: { rendered_sha256: sha256(expectedPort), differs_from_baseline: baseline !== expectedPort, - allowed_difference: 'Package-local skill, section, support-artifact, and stable runtime path relocation only.', + allowed_difference: 'Canonical GStack 2 carve: exclude the retired shared onboarding wrapper and host hook advisory; resolve retired invocations to six public routes; relocate host/runtime paths; lazy-load pinned carved sections from package-local references.', }, candidate: { target_path: repositoryRelativePath(candidateFile), @@ -171,15 +171,24 @@ function sectionTranscript() { const target = path.join(ROOT, 'skills', assignment.tree, 'references', 'legacy', `${section.source}.md`); const candidate = fs.readFileSync(target, 'utf8'); const ported = renderPortedLegacySection(section); + const filename = path.basename(section.relativePath).replace(/\.tmpl$/, ''); + const reference = `references/sections/${section.source}/${filename}`; + const packagedPath = path.join(ROOT, 'skills', assignment.tree, reference); + const packaged = fs.existsSync(packagedPath) ? fs.readFileSync(packagedPath, 'utf8') : ''; const occurrences = candidate.split(ported.trim()).length - 1; + const referenceOccurrences = candidate.split(reference).length - 1; return { source_path: section.relativePath, parent_source: section.source, target_path: repositoryRelativePath(target), baseline_render_sha256: sha256(section.rendered), ported_render_sha256: sha256(ported), - candidate_occurrences: occurrences, - classification: occurrences === 1 ? 'EQUIVALENT' : 'REGRESSION', + candidate_inline_occurrences: occurrences, + candidate_lazy_reference_occurrences: referenceOccurrences, + packaged_sha256: packaged ? sha256(packaged) : null, + classification: occurrences === 0 && referenceOccurrences >= 1 && normalizeGolden(packaged) === normalizeGolden(ported) + ? 'EQUIVALENT' + : 'REGRESSION', }; }); } diff --git a/setup b/setup index cdcd91efb..a4d5dd171 100755 --- a/setup +++ b/setup @@ -22,6 +22,18 @@ ROOT="$(cd -P "$(dirname "$SOURCE")" >/dev/null 2>&1 && pwd)" ARGS=() for arg in "$@"; do case "$arg" in + -h|--help) + printf '%s\n' \ + 'Usage: ./setup [--capabilities ] [--replace-capabilities] [--dry-run|--install-now [--yes]|--install-later]' \ + ' [--home ] [--version ] [--json] [--quiet]' \ + '' \ + 'Optional capabilities: browser, design, pdf, diagram, ios (iOS is macOS-only).' \ + 'Without --install-now, non-interactive use previews and installs nothing.' \ + '--dry-run and --install-later never modify runtime state or host setup.' \ + 'Installs only the optional host-neutral runtime and selected local capabilities.' \ + 'Skills are installed separately with: npx skills add time-attack/gstack' + exit 0 + ;; --local|--team|--no-team) echo "gstack setup: $arg is deprecated; skill placement is delegated to: npx skills add time-attack/gstack" >&2 ;; @@ -42,17 +54,6 @@ if ! "$NODE_COMMAND" -e 'process.exit(Number(process.versions.node.split(".")[0] exit 1 fi -if ! command -v bun >/dev/null 2>&1; then - echo "gstack setup: Bun is required to build the optional local runtime." >&2 - echo "Install Bun from https://bun.sh, or install judgment-only skills with:" >&2 - echo " npx skills add time-attack/gstack" >&2 - exit 1 -fi - -# Reconcile on every setup. Presence checks cannot distinguish the lockfile's -# exact versions from stale but loadable packages copied from another checkout. -(cd "$ROOT" && bun install --production --frozen-lockfile) - if [ "${#ARGS[@]}" -gt 0 ]; then exec "$NODE_COMMAND" "$ROOT/runtime/install.js" --source "$ROOT" "${ARGS[@]}" else diff --git a/skills/debug/SKILL.md b/skills/debug/SKILL.md index 8513a5c92..abdbcff64 100644 --- a/skills/debug/SKILL.md +++ b/skills/debug/SKILL.md @@ -26,10 +26,10 @@ Web context: 1. Infer the mode from product stage, surface, requested artifact, mutation authorization, evidence needs, and deployment state. Do not route by keyword alone. 2. Refine the public mode to the smallest applicable internal specialist set, then print the required execution header before any substantive output. -3. Read each active module in full from the path shown in the mode/alias tables. Its legacy body, behavioral contract, STOP gates, and appended upstream judgment ports are binding. -4. Read `references/SHARED-JUDGMENT.md` and `references/AUTHORITY-POLICY.md` for every invocation. Read `references/WEB-CONTEXT.md` before public-web or optional-runtime work. +3. Read each active module in full from the path shown in the mode/alias tables. Its specialist body, behavioral contract, STOP gates, and appended upstream judgment ports are binding. Read a lazy specialist phase in full only when the workflow reaches its package-local reference. +4. Read `references/SHARED-JUDGMENT.md` and `references/AUTHORITY-POLICY.md` for every invocation. Read `references/RUNTIME.md` before capability-dependent work and `references/WEB-CONTEXT.md` before public-web work. 5. If an old asset path is unavailable, use `references/ASSETS.md`. If legacy prose invokes another retired skill, resolve it through `references/COMPATIBILITY.md` and stay inside these six dispatchers. -6. Preserve report-only versus mutation boundaries. Commits, pushes, PRs, merges, deploys, messages, and other external mutations still require the authority stated by the active module and the user. +6. Preserve report-only versus mutation boundaries. Missing mutation authorization fails closed: do not edit merely because a specialist can fix. Commits, pushes, PRs, merges, deploys, messages, and other external mutations still require affirmative authority from the user. 7. Match the user's language. Keep code identifiers, commands, and source quotations original when translation would reduce accuracy. 8. At exit, report completed artifacts, evidence, unresolved decisions, skipped modules with reasons, and any blocked gate. @@ -63,4 +63,4 @@ Every specialist below is an internal implementation detail, including mandatory ## Completeness invariant -Do not work from this dispatcher summary when a module is active. Read the referenced module completely, including its provenance marker, behavioral contract, full mechanically rendered source, and bug-fix overlays. +Do not work from this dispatcher summary when a module is active. Read the referenced module completely, including its provenance marker, specialist workflow, lazy-phase directives, behavioral contract, and bug-fix overlays. The pinned 1.x shared onboarding wrapper is provenance-only and never runs during canonical execution. diff --git a/skills/debug/references/COMPATIBILITY.md b/skills/debug/references/COMPATIBILITY.md index 094da9fe2..93b5fb5b4 100644 --- a/skills/debug/references/COMPATIBILITY.md +++ b/skills/debug/references/COMPATIBILITY.md @@ -57,6 +57,6 @@ This package is self-contained. Route every retired invocation to the exact repl | `/document-release` | `$ship --mode Prepare --module document-release` | install `ship` | | `/setup-deploy` | `$ship --mode Deploy --module setup-deploy` | install `ship` | | `/document-generate` | `$ship --mode Prepare --module document-generate` | install `ship` | -| `/gstack-upgrade` | `$ship --mode Prepare --module gstack-upgrade` | `legacy/gstack-upgrade.md` | +| `/gstack-upgrade` | `$ship --mode Prepare --module gstack-upgrade` | install `ship` | | `/ios-clean` | `$ship --mode Prepare --module ios-clean` | install `ship` | | `/ios-sync` | `$ship --mode Prepare --module ios-sync` | install `ship` | diff --git a/skills/debug/references/RUNTIME.md b/skills/debug/references/RUNTIME.md new file mode 100644 index 000000000..5d66a7733 --- /dev/null +++ b/skills/debug/references/RUNTIME.md @@ -0,0 +1,16 @@ + +# Optional runtime capabilities + +The six Agent Skills are useful without a GStack runtime. Never install, download, build, select, update, or remove runtime capabilities merely because a skill was invoked. + +When an active specialist first reaches a capability it cannot use, name the exact capability and why it is needed. Offer to continue without it when the judgment-only or host-native path remains valid. Installation requires the user's explicit approval after disclosing the selected capabilities, that an official versioned release artifact will be downloaded and SHA-256 verified, and any exact byte/build information available from the bootstrap manifest. Never call the bootstrap before approval. + +Capability names are `browser`, `design`, `pdf`, `diagram`, and `ios`; the core state/runtime CLI is managed separately. After approval, from this skill root run `node references/support/runtime-bootstrap.mjs install --capability ` (repeat `--capability` for additional approved capabilities). The dependency-free Node 18+ bootstrap accepts only official GStack GitHub Release hosts, validates the fixed manifest schema/version/skill API/platform artifact and SHA-256, verifies a declared Cosign bundle when Cosign is available, rejects unsafe archive paths/links, and invokes the atomic managed installer. Never run `./setup` inside a standard-installed skill directory, enroll a host, or treat skill installation as runtime consent. + +Resolve capability dependencies before preview and approval: `diagram` implies `browser`; `pdf` implies both `diagram` and `browser` transitively. `design` and `ios` are standalone. The disclosure and approval must name the complete expanded set, not only the capability first requested. + +After doctor confirms readiness, canonical launcher bindings are `GSTACK_HOME=${GSTACK_HOME:-$HOME/.gstack}`, `GSTACK_BIN=$GSTACK_HOME/bin`, `B=$GSTACK_BIN/browse`, `D=$GSTACK_BIN/gstack-design`, and `P=$GSTACK_BIN/make-pdf`. Specialist modules may bind only the launchers they use. These assignments do not install or grant consent. + +The package/runtime compatibility tuple is `schemaVersion=1`, `runtimeVersion=2.0.0`, and `skillApi=2.0`; the machine-readable copy is `references/support/runtime-contract.json`. An incompatible active runtime is unavailable, not permission to upgrade it. + +The developer-only fallback is `node references/support/runtime-bootstrap.mjs install --source --capability `; show its trust warning and use it only when the user explicitly selects a checkout they reviewed. If the packaged bootstrap is unavailable, stop capability setup instead of guessing a checkout-relative command. Deferring installation records no consent and must not block pure judgment. diff --git a/skills/debug/references/WEB-CONTEXT.md b/skills/debug/references/WEB-CONTEXT.md index c886a016d..81bbf5d08 100644 --- a/skills/debug/references/WEB-CONTEXT.md +++ b/skills/debug/references/WEB-CONTEXT.md @@ -7,4 +7,4 @@ When no public-web choice is stored, present: A) Context.dev free setup (recomme Persist only the explicit choice with `gstack context select host`, `gstack context select local-browser`, or `gstack context select none`. For Context.dev, show `gstack context options`, then use `gstack context setup` and its hidden key prompt; consent and key storage belong to the runtime, never this judgment prompt. Do not infer Context choice or consent. -Capability-dependent work performs one host-neutral runtime check. Pure judgment never requires the runtime. If the runtime is absent, offer ./setup from a trusted GStack checkout; skill placement remains npx skills add time-attack/gstack. +Capability-dependent work follows `references/RUNTIME.md`. Pure judgment never requires the runtime. Skill placement remains owned by `npx skills add time-attack/gstack` and is never inferred from runtime state. diff --git a/skills/debug/references/legacy/careful.md b/skills/debug/references/legacy/careful.md index 0e6e3f016..a1e893333 100644 --- a/skills/debug/references/legacy/careful.md +++ b/skills/debug/references/legacy/careful.md @@ -1,21 +1,15 @@ - + -> **Safety Advisory:** This skill includes safety checks that check bash commands for destructive operations (rm -rf, DROP TABLE, force-push, git reset --hard, etc.) before execution. When using this skill, always pause and verify before executing potentially destructive operations. If uncertain about a command's safety, ask the user for confirmation before proceeding. - - -# /careful — Destructive Command Guardrails +# $debug --mode Diagnose-only --module careful — Destructive Command Guardrails Safety mode is now **active**. Every bash command will be checked for destructive patterns before running. If a destructive command is detected, you'll be warned and can choose to proceed or cancel. -```bash -mkdir -p "${GSTACK_HOME:-$HOME/.gstack}"/analytics -echo '{"skill":"careful","ts":"'$(date -u +%Y-%m-%dT%H:%M:%SZ)'","repo":"'$(basename "$(git rev-parse --show-toplevel 2>/dev/null)" 2>/dev/null || echo "unknown")'"}' >> "${GSTACK_HOME:-$HOME/.gstack}"/analytics/skill-usage.jsonl 2>/dev/null || true -``` +Canonical execution does not write engagement analytics or telemetry. ## What's protected diff --git a/skills/debug/references/legacy/freeze.md b/skills/debug/references/legacy/freeze.md index 8ff9e0177..e4b16525d 100644 --- a/skills/debug/references/legacy/freeze.md +++ b/skills/debug/references/legacy/freeze.md @@ -1,20 +1,27 @@ - + -> **Safety Advisory:** This skill includes safety checks that verify file edits are within the allowed scope boundary before applying, and verify file writes are within the allowed scope boundary before applying. When using this skill, always pause and verify before executing potentially destructive operations. If uncertain about a command's safety, ask the user for confirmation before proceeding. +## Host-neutral runtime bindings +These assignments select stable paths only; they do not install anything or grant consent: -# /freeze — Restrict Edits to a Directory +```bash +GSTACK_HOME="${GSTACK_HOME:-$HOME/.gstack}" +GSTACK_ROOT="$GSTACK_HOME" +GSTACK_STATE_ROOT="$GSTACK_HOME" +GSTACK_BIN="$GSTACK_HOME/bin" +B="$GSTACK_BIN/browse" +D="$GSTACK_BIN/gstack-design" +P="$GSTACK_BIN/make-pdf" +``` +# $debug --mode Diagnose-only --module freeze — Restrict Edits to a Directory Lock file edits to a specific directory. Any Edit or Write operation targeting a file outside the allowed path will be **blocked** (not just warned). -```bash -mkdir -p "${GSTACK_HOME:-$HOME/.gstack}"/analytics -echo '{"skill":"freeze","ts":"'$(date -u +%Y-%m-%dT%H:%M:%SZ)'","repo":"'$(basename "$(git rev-parse --show-toplevel 2>/dev/null)" 2>/dev/null || echo "unknown")'"}' >> "${GSTACK_HOME:-$HOME/.gstack}"/analytics/skill-usage.jsonl 2>/dev/null || true -``` +Canonical execution does not write engagement analytics or telemetry. ## Setup @@ -42,8 +49,8 @@ echo "Freeze boundary set: $FREEZE_DIR" ``` Tell the user: "Edits are now restricted to `/`. Any Edit or Write -outside this directory will be blocked. To change the boundary, run `/freeze` -again. To remove it, run `/unfreeze` or end the session." +outside this directory will be blocked. To change the boundary, run `$debug --mode Diagnose-only --module freeze` +again. To remove it, run `$debug --mode Diagnose-only --module unfreeze` or end the session." ## How it works @@ -59,7 +66,7 @@ script reads it on every Edit/Write invocation. - The trailing `/` on the freeze directory prevents `/src` from matching `/src-old` - Freeze applies to Edit and Write tools only — Read, Bash, Glob, Grep are unaffected - This prevents accidental edits, not a security boundary — Bash commands like `sed` can still modify files outside the boundary -- To deactivate, run `/unfreeze` or end the conversation +- To deactivate, run `$debug --mode Diagnose-only --module unfreeze` or end the conversation diff --git a/skills/debug/references/legacy/gstack-upgrade.md b/skills/debug/references/legacy/gstack-upgrade.md deleted file mode 100644 index 084607f92..000000000 --- a/skills/debug/references/legacy/gstack-upgrade.md +++ /dev/null @@ -1,27 +0,0 @@ - - - - - -# Legacy upgrade compatibility - -The 1.x host-directory detector, vendored-copy synchronizer, and destructive Git replacement blocks were duplicated installation infrastructure. GStack 2 delegates skill placement and updates to the standard Agent Skills installer and manages the optional shared runtime atomically. - -- Update selected skills with `npx skills add time-attack/gstack` using the user's existing project/global choice. Never infer or enroll a host. -- Upgrade a complete local runtime package with `gstack upgrade --source --version `. -- Roll back the runtime with `gstack upgrade --rollback`. -- Run `gstack doctor` after either operation. -- Do not reset, delete, move, or rewrite a host skill directory. Do not infer Context.dev choice or consent. - -This compatibility module contains no specialist judgment; release readiness and rollback judgment remain in the preserved ship modules. - - - -## Upstream judgment port: PR #679 - -[Match the user language](https://github.com/garrytan/gstack/pull/679) - -### User-language rule - -Write questions, progress updates, reports, and artifacts in the language used by the user. Source material, code identifiers, commands, and quotations may remain in their original language when translating them would reduce accuracy. - diff --git a/skills/debug/references/legacy/guard.md b/skills/debug/references/legacy/guard.md index 7bb2e09cb..f9d302d5d 100644 --- a/skills/debug/references/legacy/guard.md +++ b/skills/debug/references/legacy/guard.md @@ -1,24 +1,31 @@ - + -> **Safety Advisory:** This skill includes safety checks that check bash commands for destructive operations (rm -rf, DROP TABLE, force-push, git reset --hard, etc.) before execution, and verify file edits are within the allowed scope boundary before applying, and verify file writes are within the allowed scope boundary before applying. When using this skill, always pause and verify before executing potentially destructive operations. If uncertain about a command's safety, ask the user for confirmation before proceeding. +## Host-neutral runtime bindings - -# /guard — Full Safety Mode - -Activates both destructive command warnings and directory-scoped edit restrictions. -This is the combination of `/careful` + `/freeze` in a single command. - -**Dependency note:** This skill references hook scripts from the sibling `/careful` -and `/freeze` skill directories. Both must be installed (they are installed together -by the gstack setup script). +These assignments select stable paths only; they do not install anything or grant consent: ```bash -mkdir -p "${GSTACK_HOME:-$HOME/.gstack}"/analytics -echo '{"skill":"guard","ts":"'$(date -u +%Y-%m-%dT%H:%M:%SZ)'","repo":"'$(basename "$(git rev-parse --show-toplevel 2>/dev/null)" 2>/dev/null || echo "unknown")'"}' >> "${GSTACK_HOME:-$HOME/.gstack}"/analytics/skill-usage.jsonl 2>/dev/null || true +GSTACK_HOME="${GSTACK_HOME:-$HOME/.gstack}" +GSTACK_ROOT="$GSTACK_HOME" +GSTACK_STATE_ROOT="$GSTACK_HOME" +GSTACK_BIN="$GSTACK_HOME/bin" +B="$GSTACK_BIN/browse" +D="$GSTACK_BIN/gstack-design" +P="$GSTACK_BIN/make-pdf" ``` +# $debug --mode Diagnose-only --module guard — Full Safety Mode + +Activates both destructive command warnings and directory-scoped edit restrictions. +This is the combination of `$debug --mode Diagnose-only --module careful` + `$debug --mode Diagnose-only --module freeze` in a single command. + +**Dependency note:** This skill references hook scripts from the sibling `$debug --mode Diagnose-only --module careful` +and `$debug --mode Diagnose-only --module freeze` skill directories. Both must be installed (they are installed together +by the gstack setup script). + +Canonical execution does not write engagement analytics or telemetry. ## Setup @@ -49,12 +56,12 @@ Tell the user: - "**Guard mode active.** Two protections are now running:" - "1. **Destructive command warnings** — rm -rf, DROP TABLE, force-push, etc. will warn before executing (you can override)" - "2. **Edit boundary** — file edits restricted to `/`. Edits outside this directory are blocked." -- "To remove the edit boundary, run `/unfreeze`. To deactivate everything, end the session." +- "To remove the edit boundary, run `$debug --mode Diagnose-only --module unfreeze`. To deactivate everything, end the session." ## What's protected -See `/careful` for the full list of destructive command patterns and safe exceptions. -See `/freeze` for how edit boundary enforcement works. +See `$debug --mode Diagnose-only --module careful` for the full list of destructive command patterns and safe exceptions. +See `$debug --mode Diagnose-only --module freeze` for how edit boundary enforcement works. diff --git a/skills/debug/references/legacy/investigate.md b/skills/debug/references/legacy/investigate.md index 0b2384a64..5c93fbe5f 100644 --- a/skills/debug/references/legacy/investigate.md +++ b/skills/debug/references/legacy/investigate.md @@ -1,741 +1,21 @@ - + -> **Safety Advisory:** This skill includes safety checks that verify file edits are within the allowed scope boundary before applying, and verify file writes are within the allowed scope boundary before applying. When using this skill, always pause and verify before executing potentially destructive operations. If uncertain about a command's safety, ask the user for confirmation before proceeding. +## Host-neutral runtime bindings - -## Preamble (run first) +These assignments select stable paths only; they do not install anything or grant consent: ```bash -_ROOT=$(git rev-parse --show-toplevel 2>/dev/null) GSTACK_HOME="${GSTACK_HOME:-$HOME/.gstack}" GSTACK_ROOT="$GSTACK_HOME" -: "GStack 2 runtime is user-scoped; Agent Skills placement is installer-owned" -GSTACK_BIN="$GSTACK_ROOT/bin" -GSTACK_BROWSE="$GSTACK_BIN" -GSTACK_DESIGN="$GSTACK_BIN" -_UPD=$($GSTACK_BIN/gstack-update-check 2>/dev/null || $GSTACK_BIN/gstack-update-check 2>/dev/null || true) -[ -n "$_UPD" ] && echo "$_UPD" || true -mkdir -p "${GSTACK_HOME:-$HOME/.gstack}"/sessions -touch "${GSTACK_HOME:-$HOME/.gstack}"/sessions/"$PPID" -_SESSIONS=$(find "${GSTACK_HOME:-$HOME/.gstack}"/sessions -mmin -120 -type f 2>/dev/null | wc -l | tr -d ' ') -find "${GSTACK_HOME:-$HOME/.gstack}"/sessions -mmin +120 -type f -exec rm {} + 2>/dev/null || true -_PROACTIVE=$($GSTACK_BIN/gstack-config get proactive 2>/dev/null || echo "true") -_PROACTIVE_PROMPTED=$([ -f "${GSTACK_HOME:-$HOME/.gstack}"/.proactive-prompted ] && echo "yes" || echo "no") -_BRANCH=$(git branch --show-current 2>/dev/null || echo "unknown") -echo "BRANCH: $_BRANCH" -_SKILL_PREFIX=$($GSTACK_BIN/gstack-config get skill_prefix 2>/dev/null || echo "false") -echo "PROACTIVE: $_PROACTIVE" -echo "PROACTIVE_PROMPTED: $_PROACTIVE_PROMPTED" -echo "SKILL_PREFIX: $_SKILL_PREFIX" -source <($GSTACK_BIN/gstack-repo-mode 2>/dev/null) || true -REPO_MODE=${REPO_MODE:-unknown} -echo "REPO_MODE: $REPO_MODE" -_SESSION_KIND=$($GSTACK_BIN/gstack-session-kind 2>/dev/null || echo "interactive") -case "$_SESSION_KIND" in spawned|headless|interactive) ;; *) _SESSION_KIND="interactive" ;; esac -echo "SESSION_KIND: $_SESSION_KIND" -# Conductor host: AskUserQuestion is unreliable here (native disabled, MCP -# variant flaky), so skills render decisions as prose instead of calling the -# tool. Gated on !headless so an eval/CI run INSIDE Conductor (GSTACK_HEADLESS) -# still BLOCKs rather than rendering prose to nobody. -if [ "$_SESSION_KIND" != "headless" ] && { [ -n "${CONDUCTOR_WORKSPACE_PATH:-}" ] || [ -n "${CONDUCTOR_PORT:-}" ]; }; then - echo "CONDUCTOR_SESSION: true" -fi -_ACTIVATED=$([ -f "${GSTACK_HOME:-$HOME/.gstack}"/.activated ] && echo "yes" || echo "no") -_FIRST_LOOP_SHOWN=$([ -f "${GSTACK_HOME:-$HOME/.gstack}"/.first-loop-tip-shown ] && echo "yes" || echo "no") -echo "ACTIVATED: $_ACTIVATED" -echo "FIRST_LOOP_SHOWN: $_FIRST_LOOP_SHOWN" -# First-run project detection: run the detector ONLY on the first-ever skill run -# (ACTIVATED=no, interactive) so it stays off the hot path for every run after. -_FIRST_TASK="" -if [ "$_ACTIVATED" = "no" ] && [ "$_SESSION_KIND" != "headless" ]; then - _FIRST_TASK=$($GSTACK_BIN/gstack-first-task-detect 2>/dev/null || true) -fi -echo "FIRST_TASK: $_FIRST_TASK" -_LAKE_SEEN=$([ -f "${GSTACK_HOME:-$HOME/.gstack}"/.completeness-intro-seen ] && echo "yes" || echo "no") -echo "LAKE_INTRO: $_LAKE_SEEN" -_TEL=$($GSTACK_BIN/gstack-config get telemetry 2>/dev/null || true) -_TEL_PROMPTED=$([ -f "${GSTACK_HOME:-$HOME/.gstack}"/.telemetry-prompted ] && echo "yes" || echo "no") -_TEL_START=$(date +%s) -_SESSION_ID="$$-$(date +%s)" -echo "TELEMETRY: ${_TEL:-off}" -echo "TEL_PROMPTED: $_TEL_PROMPTED" -_EXPLAIN_LEVEL=$($GSTACK_BIN/gstack-config get explain_level 2>/dev/null || echo "default") -if [ "$_EXPLAIN_LEVEL" != "default" ] && [ "$_EXPLAIN_LEVEL" != "terse" ]; then _EXPLAIN_LEVEL="default"; fi -echo "EXPLAIN_LEVEL: $_EXPLAIN_LEVEL" -_QUESTION_TUNING=$($GSTACK_BIN/gstack-config get question_tuning 2>/dev/null || echo "false") -echo "QUESTION_TUNING: $_QUESTION_TUNING" -mkdir -p "${GSTACK_HOME:-$HOME/.gstack}"/analytics -if [ "$_TEL" != "off" ]; then -echo '{"skill":"investigate","ts":"'$(date -u +%Y-%m-%dT%H:%M:%SZ)'","repo":"'$(_repo=$(basename "$(git rev-parse --show-toplevel 2>/dev/null)" 2>/dev/null | tr -cd 'a-zA-Z0-9._-'); echo "${_repo:-unknown}")'"}' >> "${GSTACK_HOME:-$HOME/.gstack}"/analytics/skill-usage.jsonl 2>/dev/null || true -fi -for _PF in $(find "${GSTACK_HOME:-$HOME/.gstack}"/analytics -maxdepth 1 -name '.pending-*' 2>/dev/null); do - if [ -f "$_PF" ]; then - if [ "$_TEL" != "off" ] && [ -x "$GSTACK_BIN/gstack-telemetry-log" ]; then - $GSTACK_BIN/gstack-telemetry-log --event-type skill_run --skill _pending_finalize --outcome unknown --session-id "$_SESSION_ID" 2>/dev/null || true - fi - rm -f "$_PF" 2>/dev/null || true - fi - break -done -eval "$($GSTACK_BIN/gstack-slug 2>/dev/null)" 2>/dev/null || true -_LEARN_FILE="${GSTACK_HOME:-$HOME/.gstack}/projects/${PROJECT_ID:-unknown}/learnings.jsonl" -if [ -f "$_LEARN_FILE" ]; then - _LEARN_COUNT=$(wc -l < "$_LEARN_FILE" 2>/dev/null | tr -d ' ') - echo "LEARNINGS: $_LEARN_COUNT entries loaded" - if [ "$_LEARN_COUNT" -gt 5 ] 2>/dev/null; then - $GSTACK_BIN/gstack-learnings-search --limit 3 2>/dev/null || true - fi -else - echo "LEARNINGS: 0" -fi -$GSTACK_BIN/gstack-timeline-log '{"skill":"investigate","event":"started","branch":"'"$_BRANCH"'","session":"'"$_SESSION_ID"'"}' 2>/dev/null & -_HAS_ROUTING="no" -if [ -f CLAUDE.md ] && grep -q "## Skill routing" CLAUDE.md 2>/dev/null; then - _HAS_ROUTING="yes" -fi -_ROUTING_DECLINED=$($GSTACK_BIN/gstack-config get routing_declined 2>/dev/null || echo "false") -echo "HAS_ROUTING: $_HAS_ROUTING" -echo "ROUTING_DECLINED: $_ROUTING_DECLINED" -_VENDORED="managed-by-standard-installer" -echo "VENDORED_GSTACK: $_VENDORED" -echo "MODEL_OVERLAY: claude" -_CHECKPOINT_MODE=$($GSTACK_BIN/gstack-config get checkpoint_mode 2>/dev/null || echo "explicit") -_CHECKPOINT_PUSH=$($GSTACK_BIN/gstack-config get checkpoint_push 2>/dev/null || echo "false") -echo "CHECKPOINT_MODE: $_CHECKPOINT_MODE" -echo "CHECKPOINT_PUSH: $_CHECKPOINT_PUSH" -# Plan-mode hint for skills like /spec that branch behavior on plan-mode state. -# Claude Code exposes plan mode via system reminders; we detect best-effort -# from CLAUDE_PLAN_FILE (set by the harness when plan mode is active) and -# fall back to "inactive". Codex hosts and Claude execution mode both end up -# inactive, which is the safe default (defaults to file+execute pipeline). -if [ -n "${CLAUDE_PLAN_FILE:-}${GSTACK_PLAN_MODE_FORCE:-}" ]; then - export GSTACK_PLAN_MODE="active" -elif [ "${GSTACK_PLAN_MODE:-}" = "active" ]; then - export GSTACK_PLAN_MODE="active" -else - export GSTACK_PLAN_MODE="inactive" -fi -echo "GSTACK_PLAN_MODE: $GSTACK_PLAN_MODE" -[ -n "$OPENCLAW_SESSION" ] && echo "SPAWNED_SESSION: true" || true +GSTACK_STATE_ROOT="$GSTACK_HOME" +GSTACK_BIN="$GSTACK_HOME/bin" +B="$GSTACK_BIN/browse" +D="$GSTACK_BIN/gstack-design" +P="$GSTACK_BIN/make-pdf" ``` - -## Plan Mode Safe Operations - -In plan mode, allowed because they inform the plan: `$B`, `$D`, `codex exec`/`codex review`, writes to `"${GSTACK_HOME:-$HOME/.gstack}"/`, writes to the plan file, and `open` for generated artifacts. - -## Skill Invocation During Plan Mode - -If the user invokes a skill in plan mode, the skill takes precedence over generic plan mode behavior. **Treat the skill file as executable instructions, not reference.** Follow it step by step starting from Step 0; the first AskUserQuestion is the workflow entering plan mode, not a violation of it. AskUserQuestion (any variant — `mcp__*__AskUserQuestion` or native; see "AskUserQuestion Format → Tool resolution") satisfies plan mode's end-of-turn requirement. If AskUserQuestion is unavailable or a call fails, follow the AskUserQuestion Format failure fallback: `headless` → BLOCKED; `interactive` → the prose fallback (also satisfies end-of-turn). At a STOP point, stop immediately. Do not continue the workflow or call ExitPlanMode there. Commands marked "PLAN MODE EXCEPTION — ALWAYS RUN" execute. Call ExitPlanMode only after the skill workflow completes, or if the user tells you to cancel the skill or leave plan mode. - -If `PROACTIVE` is `"false"`, do not auto-invoke or proactively suggest skills. If a skill seems useful, ask: "I think /skillname might help here — want me to run it?" - -If `SKILL_PREFIX` is `"true"`, suggest/invoke `/gstack-*` names. Resolve retired names through `references/COMPATIBILITY.md`; skill placement is installer-owned. - -If output shows `UPGRADE_AVAILABLE `: read `references/legacy/gstack-upgrade.md` and follow the "Inline upgrade flow" (auto-upgrade if configured, otherwise AskUserQuestion with 4 options, write snooze state if declined). - -If output shows `JUST_UPGRADED `: print "Running gstack v{to} (just updated!)". If `SPAWNED_SESSION` is true, skip feature discovery. - -Feature discovery, max one prompt per session: -- Missing `$GSTACK_ROOT/.feature-prompted-continuous-checkpoint`: AskUserQuestion for Continuous checkpoint auto-commits. If accepted, run `$GSTACK_BIN/gstack-config set checkpoint_mode continuous`. Always touch marker. -- Missing `$GSTACK_ROOT/.feature-prompted-model-overlay`: inform "Model overlays are active. MODEL_OVERLAY shows the patch." Always touch marker. - -After upgrade prompts, continue workflow. - -If `WRITING_STYLE_PENDING` is `yes`: ask once about writing style: - -> v1 prompts are simpler: first-use jargon glosses, outcome-framed questions, shorter prose. Keep default or restore terse? - -Options: -- A) Keep the new default (recommended — good writing helps everyone) -- B) Restore V0 prose — set `explain_level: terse` - -If A: leave `explain_level` unset (defaults to `default`). -If B: run `$GSTACK_BIN/gstack-config set explain_level terse`. - -Always run (regardless of choice): -```bash -rm -f "${GSTACK_HOME:-$HOME/.gstack}"/.writing-style-prompt-pending -touch "${GSTACK_HOME:-$HOME/.gstack}"/.writing-style-prompted -``` - -Skip if `WRITING_STYLE_PENDING` is `no`. - -If `LAKE_INTRO` is `no`: say "gstack follows the **Boil the Ocean** principle — do the complete thing when AI makes marginal cost near-zero. Read more: https://garryslist.org/posts/boil-the-ocean" Offer to open: - -```bash -open https://garryslist.org/posts/boil-the-ocean -touch "${GSTACK_HOME:-$HOME/.gstack}"/.completeness-intro-seen -``` - -Only run `open` if yes. Always run `touch`. - -If `TEL_PROMPTED` is `no` AND `LAKE_INTRO` is `yes`: ask telemetry once via AskUserQuestion: - -> Help gstack get better. Share usage data only: skill, duration, crashes, stable device ID. No code or file paths. Your repo name is recorded locally only and stripped before any upload. - -Options: -- A) Help gstack get better! (recommended) -- B) No thanks - -If A: run `$GSTACK_BIN/gstack-config set telemetry community` - -If B: ask follow-up: - -> Anonymous mode sends only aggregate usage, no unique ID. - -Options: -- A) Sure, anonymous is fine -- B) No thanks, fully off - -If B→A: run `$GSTACK_BIN/gstack-config set telemetry anonymous` -If B→B: run `$GSTACK_BIN/gstack-config set telemetry off` - -Always run: -```bash -touch "${GSTACK_HOME:-$HOME/.gstack}"/.telemetry-prompted -``` - -Skip if `TEL_PROMPTED` is `yes`. - -If `PROACTIVE_PROMPTED` is `no` AND `TEL_PROMPTED` is `yes`: ask once: - -> Let gstack proactively suggest skills, like /qa for "does this work?" or /investigate for bugs? - -Options: -- A) Keep it on (recommended) -- B) Turn it off — I'll type /commands myself - -If A: run `$GSTACK_BIN/gstack-config set proactive true` -If B: run `$GSTACK_BIN/gstack-config set proactive false` - -Always run: -```bash -touch "${GSTACK_HOME:-$HOME/.gstack}"/.proactive-prompted -``` - -Skip if `PROACTIVE_PROMPTED` is `yes`. - -## First-run guidance (one-time) - -If `ACTIVATED` is `no` (first skill run on this machine) AND the preamble printed a non-empty `FIRST_TASK:` value that is NOT `nongit`: show ONE short, project-specific line mapped from the token, as a heads-up, then CONTINUE with whatever the user actually asked — do NOT halt their task. Map the token: `greenfield` → "Fresh repo — shape it first with `/spec` or `/office-hours`." `code_node`/`code_python`/`code_rust`/`code_go`/`code_ruby`/`code_ios` → "There's code here — `/qa` to see it work, or `/investigate` if something's off." `branch_ahead` → "Unshipped work on this branch — `/review` then `/ship`." `dirty_default` → "Uncommitted changes — `/review` before committing." `clean_default` → "Pick one: `/spec`, `/investigate`, or `/qa`." Then substitute the token you saw for TASK_TOKEN and run (best-effort), and mark activated: -```bash -$GSTACK_BIN/gstack-telemetry-log --event-type first_task_scaffold_shown --skill "TASK_TOKEN" --outcome shown 2>/dev/null || true -touch "${GSTACK_HOME:-$HOME/.gstack}"/.activated 2>/dev/null || true -``` - -If `ACTIVATED` is `no` but `FIRST_TASK:` is empty or `nongit` (headless, non-git, or nothing actionable): show nothing, just run `touch "${GSTACK_HOME:-$HOME/.gstack}"/.activated 2>/dev/null || true`. - -Else if `ACTIVATED` is `yes` AND `FIRST_LOOP_SHOWN` is `no`: say once as a heads-up (then continue): - -> Tip: gstack pays off when you complete one loop — **plan → review → ship**. A common first loop: `/office-hours` or `/spec` to shape it, `/plan-eng-review` to lock it, then `/ship`. - -Then run `touch "${GSTACK_HOME:-$HOME/.gstack}"/.first-loop-tip-shown 2>/dev/null || true`. - -Skip this section if `ACTIVATED` and `FIRST_LOOP_SHOWN` are both `yes`. - -If `HAS_ROUTING` is `no` AND `ROUTING_DECLINED` is `false` AND `PROACTIVE_PROMPTED` is `yes`: -Check if a CLAUDE.md file exists in the project root. If it does not exist, create it. - -Use AskUserQuestion: - -> gstack works best when your project's CLAUDE.md includes skill routing rules. - -Options: -- A) Add routing rules to CLAUDE.md (recommended) -- B) No thanks, I'll invoke skills manually - -If A: Append this section to the end of CLAUDE.md: - -```markdown - -## Skill routing - -When the user's request matches an available skill, invoke it via the Skill tool. When in doubt, invoke the skill. - -Key routing rules: -- Product ideas/brainstorming → invoke /office-hours -- Strategy/scope → invoke /plan-ceo-review -- Architecture → invoke /plan-eng-review -- Design system/plan review → invoke /design-consultation or /plan-design-review -- Full review pipeline → invoke /autoplan -- Bugs/errors → invoke /investigate -- QA/testing site behavior → invoke /qa or /qa-only -- Code review/diff check → invoke /review -- Visual polish → invoke /design-review -- Ship/deploy/PR → invoke /ship or /land-and-deploy -- Save progress → invoke /context-save -- Resume context → invoke /context-restore -- Author a backlog-ready spec/issue → invoke /spec -``` - -Then commit the change: `git add CLAUDE.md && git commit -m "chore: add gstack skill routing rules to CLAUDE.md"` - -If B: run `$GSTACK_BIN/gstack-config set routing_declined true` and say they can re-enable with `gstack-config set routing_declined false`. - -This only happens once per project. Skip if `HAS_ROUTING` is `yes` or `ROUTING_DECLINED` is `true`. - -GStack 2 delegates skill placement, updates, and removal to the standard Agent Skills installer. Never inspect, delete, commit, or migrate a host-specific skill directory from a judgment workflow. - -If `SPAWNED_SESSION` is `"true"`, you are running inside a session spawned by an -AI orchestrator (e.g., OpenClaw). In spawned sessions: -- Do NOT use AskUserQuestion for interactive prompts. Auto-choose the recommended option. -- Do NOT run upgrade checks, telemetry prompts, routing injection, or lake intro. -- Focus on completing the task and reporting results via prose output. -- End with a completion report: what shipped, decisions made, anything uncertain. - -## AskUserQuestion Format - -### Tool resolution (read first) - -"AskUserQuestion" can resolve to two tools at runtime: the **host MCP variant** (e.g. `mcp__conductor__AskUserQuestion` — appears in your tool list when the host registers it) or the **native** Claude Code tool. - -**Conductor rule (read before the MCP rule):** if `CONDUCTOR_SESSION: true` was echoed by the preamble, do NOT call AskUserQuestion at all — neither native nor any `mcp__*__AskUserQuestion` variant. Render EVERY decision brief as the **prose form** below and STOP. This is proactive, not a reaction to a failure: Conductor disables native AUQ and its MCP variant is flaky (it returns `[Tool result missing due to internal error]`), so prose is the reliable path. **Auto-decide preferences still apply first:** if a `[plan-tune auto-decide]