mirror of
https://github.com/garrytan/gstack.git
synced 2026-09-21 12:20:48 +02:00
feat: componentize GStack 2 runtime and release integrity
This commit is contained in:
@@ -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 <artifact-dir> <owner/repo> [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 },
|
||||||
|
);
|
||||||
@@ -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;
|
||||||
|
});
|
||||||
@@ -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}`)));
|
||||||
|
});
|
||||||
|
}
|
||||||
@@ -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 <active-runtime> <output-dir>");
|
||||||
|
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")));
|
||||||
|
});
|
||||||
|
}
|
||||||
@@ -1,8 +1,12 @@
|
|||||||
name: Workflow Lint
|
name: Workflow Lint
|
||||||
on: [push, pull_request]
|
on: [push, pull_request]
|
||||||
|
|
||||||
|
permissions:
|
||||||
|
contents: read
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
actionlint:
|
actionlint:
|
||||||
runs-on: ubicloud-standard-8
|
runs-on: ubicloud-standard-8
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v4
|
- uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4
|
||||||
- uses: rhysd/actionlint@v1.7.11
|
- uses: rhysd/actionlint@393031adb9afb225ee52ae2ccd7a5af5525e03e8 # v1.7.11
|
||||||
|
|||||||
@@ -1,4 +1,7 @@
|
|||||||
name: Build CI Image
|
name: Build CI Image
|
||||||
|
permissions:
|
||||||
|
contents: read
|
||||||
|
|
||||||
on:
|
on:
|
||||||
# Rebuild weekly (Monday 6am UTC) to pick up CLI updates
|
# Rebuild weekly (Monday 6am UTC) to pick up CLI updates
|
||||||
schedule:
|
schedule:
|
||||||
@@ -20,18 +23,18 @@ jobs:
|
|||||||
contents: read
|
contents: read
|
||||||
packages: write
|
packages: write
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v4
|
- uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4
|
||||||
|
|
||||||
# Copy lockfile + package.json into Docker build context
|
# Copy lockfile + package.json into Docker build context
|
||||||
- run: cp package.json bun.lock .github/docker/
|
- run: cp package.json bun.lock .github/docker/
|
||||||
|
|
||||||
- uses: docker/login-action@v3
|
- uses: docker/login-action@c94ce9fb468520275223c153574b00df6fe4bcc9 # v3
|
||||||
with:
|
with:
|
||||||
registry: ghcr.io
|
registry: ghcr.io
|
||||||
username: ${{ github.actor }}
|
username: ${{ github.actor }}
|
||||||
password: ${{ secrets.GITHUB_TOKEN }}
|
password: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
|
||||||
- uses: docker/build-push-action@v6
|
- uses: docker/build-push-action@10e90e3645eae34f1e60eeb005ba3a3d33f178e8 # v6
|
||||||
with:
|
with:
|
||||||
context: .github/docker
|
context: .github/docker
|
||||||
file: .github/docker/Dockerfile.ci
|
file: .github/docker/Dockerfile.ci
|
||||||
|
|||||||
@@ -1,4 +1,7 @@
|
|||||||
name: Periodic Evals
|
name: Periodic Evals
|
||||||
|
permissions:
|
||||||
|
contents: read
|
||||||
|
|
||||||
on:
|
on:
|
||||||
schedule:
|
schedule:
|
||||||
- cron: '0 6 * * 1' # Monday 6 AM UTC
|
- cron: '0 6 * * 1' # Monday 6 AM UTC
|
||||||
@@ -22,12 +25,12 @@ jobs:
|
|||||||
outputs:
|
outputs:
|
||||||
image-tag: ${{ steps.meta.outputs.tag }}
|
image-tag: ${{ steps.meta.outputs.tag }}
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v4
|
- uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4
|
||||||
|
|
||||||
- id: meta
|
- id: meta
|
||||||
run: echo "tag=${{ env.IMAGE }}:${{ hashFiles('.github/docker/Dockerfile.ci', 'package.json', 'bun.lock') }}" >> "$GITHUB_OUTPUT"
|
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:
|
with:
|
||||||
registry: ghcr.io
|
registry: ghcr.io
|
||||||
username: ${{ github.actor }}
|
username: ${{ github.actor }}
|
||||||
@@ -46,7 +49,7 @@ jobs:
|
|||||||
run: cp package.json bun.lock .github/docker/
|
run: cp package.json bun.lock .github/docker/
|
||||||
|
|
||||||
- if: steps.check.outputs.exists == 'false'
|
- if: steps.check.outputs.exists == 'false'
|
||||||
uses: docker/build-push-action@v6
|
uses: docker/build-push-action@10e90e3645eae34f1e60eeb005ba3a3d33f178e8 # v6
|
||||||
with:
|
with:
|
||||||
context: .github/docker
|
context: .github/docker
|
||||||
file: .github/docker/Dockerfile.ci
|
file: .github/docker/Dockerfile.ci
|
||||||
@@ -88,7 +91,7 @@ jobs:
|
|||||||
- name: e2e-gemini
|
- name: e2e-gemini
|
||||||
file: test/gemini-e2e.test.ts
|
file: test/gemini-e2e.test.ts
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v4
|
- uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4
|
||||||
with:
|
with:
|
||||||
fetch-depth: 0
|
fetch-depth: 0
|
||||||
|
|
||||||
@@ -126,7 +129,7 @@ jobs:
|
|||||||
|
|
||||||
- name: Upload eval results
|
- name: Upload eval results
|
||||||
if: always()
|
if: always()
|
||||||
uses: actions/upload-artifact@v4
|
uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4
|
||||||
with:
|
with:
|
||||||
name: eval-periodic-${{ matrix.suite.name }}
|
name: eval-periodic-${{ matrix.suite.name }}
|
||||||
path: ~/.gstack-dev/evals/*.json
|
path: ~/.gstack-dev/evals/*.json
|
||||||
|
|||||||
@@ -1,4 +1,7 @@
|
|||||||
name: E2E Evals
|
name: E2E Evals
|
||||||
|
permissions:
|
||||||
|
contents: read
|
||||||
|
|
||||||
on:
|
on:
|
||||||
pull_request:
|
pull_request:
|
||||||
branches: [main]
|
branches: [main]
|
||||||
@@ -15,6 +18,8 @@ env:
|
|||||||
jobs:
|
jobs:
|
||||||
# Build Docker image with pre-baked toolchain (cached — only rebuilds on Dockerfile/lockfile change)
|
# Build Docker image with pre-baked toolchain (cached — only rebuilds on Dockerfile/lockfile change)
|
||||||
build-image:
|
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
|
runs-on: ubicloud-standard-8
|
||||||
permissions:
|
permissions:
|
||||||
contents: read
|
contents: read
|
||||||
@@ -22,12 +27,12 @@ jobs:
|
|||||||
outputs:
|
outputs:
|
||||||
image-tag: ${{ steps.meta.outputs.tag }}
|
image-tag: ${{ steps.meta.outputs.tag }}
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v4
|
- uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4
|
||||||
|
|
||||||
- id: meta
|
- id: meta
|
||||||
run: echo "tag=${{ env.IMAGE }}:${{ hashFiles('.github/docker/Dockerfile.ci', 'package.json', 'bun.lock') }}" >> "$GITHUB_OUTPUT"
|
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:
|
with:
|
||||||
registry: ghcr.io
|
registry: ghcr.io
|
||||||
username: ${{ github.actor }}
|
username: ${{ github.actor }}
|
||||||
@@ -46,7 +51,7 @@ jobs:
|
|||||||
run: cp package.json bun.lock .github/docker/
|
run: cp package.json bun.lock .github/docker/
|
||||||
|
|
||||||
- if: steps.check.outputs.exists == 'false'
|
- if: steps.check.outputs.exists == 'false'
|
||||||
uses: docker/build-push-action@v6
|
uses: docker/build-push-action@10e90e3645eae34f1e60eeb005ba3a3d33f178e8 # v6
|
||||||
with:
|
with:
|
||||||
context: .github/docker
|
context: .github/docker
|
||||||
file: .github/docker/Dockerfile.ci
|
file: .github/docker/Dockerfile.ci
|
||||||
@@ -56,6 +61,7 @@ jobs:
|
|||||||
${{ env.IMAGE }}:latest
|
${{ env.IMAGE }}:latest
|
||||||
|
|
||||||
evals:
|
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' }}
|
runs-on: ${{ matrix.suite.runner || 'ubicloud-standard-8' }}
|
||||||
needs: build-image
|
needs: build-image
|
||||||
container:
|
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
|
file: test/skill-e2e-office-hours-auto-mode.test.ts test/skill-e2e-plan-mode-no-op.test.ts
|
||||||
timeout: 35
|
timeout: 35
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v4
|
- uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4
|
||||||
with:
|
with:
|
||||||
fetch-depth: 0
|
fetch-depth: 0
|
||||||
|
|
||||||
@@ -254,7 +260,7 @@ jobs:
|
|||||||
|
|
||||||
- name: Upload eval results
|
- name: Upload eval results
|
||||||
if: always()
|
if: always()
|
||||||
uses: actions/upload-artifact@v4
|
uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4
|
||||||
with:
|
with:
|
||||||
name: eval-${{ matrix.suite.name }}
|
name: eval-${{ matrix.suite.name }}
|
||||||
path: ~/.gstack-dev/evals/*.json
|
path: ~/.gstack-dev/evals/*.json
|
||||||
@@ -263,7 +269,7 @@ jobs:
|
|||||||
report:
|
report:
|
||||||
runs-on: ubicloud-standard-8
|
runs-on: ubicloud-standard-8
|
||||||
needs: evals
|
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
|
timeout-minutes: 5
|
||||||
permissions:
|
permissions:
|
||||||
contents: read
|
contents: read
|
||||||
@@ -275,12 +281,12 @@ jobs:
|
|||||||
# early and never hit it, which is why this stayed hidden). See #1802 CI fix.
|
# early and never hit it, which is why this stayed hidden). See #1802 CI fix.
|
||||||
issues: write
|
issues: write
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v4
|
- uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4
|
||||||
with:
|
with:
|
||||||
fetch-depth: 1
|
fetch-depth: 1
|
||||||
|
|
||||||
- name: Download all eval artifacts
|
- name: Download all eval artifacts
|
||||||
uses: actions/download-artifact@v4
|
uses: actions/download-artifact@d3f86a106a0bac45b974a628896c90dbdf5c8093 # v4
|
||||||
with:
|
with:
|
||||||
pattern: eval-*
|
pattern: eval-*
|
||||||
path: /tmp/eval-results
|
path: /tmp/eval-results
|
||||||
|
|||||||
@@ -30,7 +30,7 @@ jobs:
|
|||||||
bun-version: 1.3.14
|
bun-version: 1.3.14
|
||||||
- uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4
|
- uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4
|
||||||
with:
|
with:
|
||||||
node-version: 22
|
node-version: 22.23.1
|
||||||
- name: Configure isolated test identity
|
- name: Configure isolated test identity
|
||||||
run: |
|
run: |
|
||||||
git config --global user.email "gstack2-ci@example.invalid"
|
git config --global user.email "gstack2-ci@example.invalid"
|
||||||
@@ -56,10 +56,27 @@ jobs:
|
|||||||
bun-version: 1.3.14
|
bun-version: 1.3.14
|
||||||
- uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4
|
- uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4
|
||||||
with:
|
with:
|
||||||
node-version: 22
|
node-version: 22.23.1
|
||||||
- run: bun install --frozen-lockfile
|
- run: bun install --frozen-lockfile
|
||||||
- run: bun run test:gstack2:install
|
- 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:
|
dev-container:
|
||||||
runs-on: ubuntu-24.04
|
runs-on: ubuntu-24.04
|
||||||
timeout-minutes: 25
|
timeout-minutes: 25
|
||||||
|
|||||||
@@ -1,4 +1,7 @@
|
|||||||
name: make-pdf copy-paste gate
|
name: make-pdf copy-paste gate
|
||||||
|
permissions:
|
||||||
|
contents: read
|
||||||
|
|
||||||
on:
|
on:
|
||||||
pull_request:
|
pull_request:
|
||||||
branches: [main]
|
branches: [main]
|
||||||
@@ -36,11 +39,11 @@ jobs:
|
|||||||
|
|
||||||
runs-on: ${{ matrix.os }}
|
runs-on: ${{ matrix.os }}
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v4
|
- uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4
|
||||||
|
|
||||||
- uses: oven-sh/setup-bun@v2
|
- uses: oven-sh/setup-bun@0c5077e51419868618aeaa5fe8019c62421857d6 # v2
|
||||||
with:
|
with:
|
||||||
bun-version: latest
|
bun-version: 1.3.14
|
||||||
|
|
||||||
- name: Install dependencies
|
- name: Install dependencies
|
||||||
run: bun install --frozen-lockfile
|
run: bun install --frozen-lockfile
|
||||||
|
|||||||
@@ -1,5 +1,8 @@
|
|||||||
name: PR Title Sync
|
name: PR Title Sync
|
||||||
|
|
||||||
|
permissions:
|
||||||
|
contents: read
|
||||||
|
|
||||||
# WHY pull_request_target (not pull_request): the default GITHUB_TOKEN is
|
# 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
|
# 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
|
# never `gh pr edit` a fork/agent PR. `pull_request_target` runs in the base-repo
|
||||||
@@ -39,7 +42,7 @@ jobs:
|
|||||||
steps:
|
steps:
|
||||||
# Base repo only — trusted infra (the rewrite helper). No PR-head checkout.
|
# Base repo only — trusted infra (the rewrite helper). No PR-head checkout.
|
||||||
- name: Checkout base repo (trusted)
|
- name: Checkout base repo (trusted)
|
||||||
uses: actions/checkout@v4
|
uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4
|
||||||
with:
|
with:
|
||||||
fetch-depth: 1
|
fetch-depth: 1
|
||||||
|
|
||||||
|
|||||||
@@ -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
|
||||||
@@ -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
|
||||||
@@ -1,11 +1,15 @@
|
|||||||
name: Skill Docs Freshness
|
name: Skill Docs Freshness
|
||||||
on: [push, pull_request]
|
on: [push, pull_request]
|
||||||
|
|
||||||
|
permissions:
|
||||||
|
contents: read
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
check-freshness:
|
check-freshness:
|
||||||
runs-on: ubicloud-standard-8
|
runs-on: ubicloud-standard-8
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v4
|
- uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4
|
||||||
- uses: oven-sh/setup-bun@v2
|
- uses: oven-sh/setup-bun@0c5077e51419868618aeaa5fe8019c62421857d6 # v2
|
||||||
- run: bun install
|
- run: bun install
|
||||||
- name: Check Claude host freshness
|
- name: Check Claude host freshness
|
||||||
run: bun run gen:skill-docs
|
run: bun run gen:skill-docs
|
||||||
|
|||||||
@@ -1,5 +1,8 @@
|
|||||||
name: Version Gate
|
name: Version Gate
|
||||||
|
|
||||||
|
permissions:
|
||||||
|
contents: read
|
||||||
|
|
||||||
on:
|
on:
|
||||||
pull_request:
|
pull_request:
|
||||||
paths:
|
paths:
|
||||||
@@ -20,13 +23,13 @@ jobs:
|
|||||||
pull-requests: read
|
pull-requests: read
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout PR head
|
- name: Checkout PR head
|
||||||
uses: actions/checkout@v4
|
uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4
|
||||||
with:
|
with:
|
||||||
fetch-depth: 0
|
fetch-depth: 0
|
||||||
ref: ${{ github.event.pull_request.head.sha }}
|
ref: ${{ github.event.pull_request.head.sha }}
|
||||||
|
|
||||||
- name: Setup Bun
|
- name: Setup Bun
|
||||||
uses: oven-sh/setup-bun@v2
|
uses: oven-sh/setup-bun@0c5077e51419868618aeaa5fe8019c62421857d6 # v2
|
||||||
|
|
||||||
- name: Read versions
|
- name: Read versions
|
||||||
id: versions
|
id: versions
|
||||||
|
|||||||
@@ -1,5 +1,8 @@
|
|||||||
name: Windows Free Tests
|
name: Windows Free Tests
|
||||||
|
|
||||||
|
permissions:
|
||||||
|
contents: read
|
||||||
|
|
||||||
# Curated subset of the free test suite that runs on a paid faster Windows runner.
|
# 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
|
# Codex's v1.18.0.0 review flagged that the existing evals.yml workflow uses
|
||||||
@@ -39,11 +42,11 @@ jobs:
|
|||||||
timeout-minutes: 15
|
timeout-minutes: 15
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v4
|
- uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4
|
||||||
|
|
||||||
- uses: oven-sh/setup-bun@v1
|
- uses: oven-sh/setup-bun@0c5077e51419868618aeaa5fe8019c62421857d6 # v2
|
||||||
with:
|
with:
|
||||||
bun-version: latest
|
bun-version: 1.3.14
|
||||||
|
|
||||||
- name: Configure git identity (required by tests that init temp repos)
|
- name: Configure git identity (required by tests that init temp repos)
|
||||||
run: |
|
run: |
|
||||||
|
|||||||
@@ -1,10 +1,12 @@
|
|||||||
name: Windows Setup E2E
|
name: Windows Setup E2E
|
||||||
|
|
||||||
# End-to-end fresh-install gate for Windows. Runs `./setup` on a clean
|
permissions:
|
||||||
# windows-latest checkout and asserts the build completes, binaries
|
contents: read
|
||||||
# resolve via find-browse, and the gstack-paths state root resolves
|
|
||||||
# cleanly. Catches Bun shell-parser regressions in package.json's build
|
# End-to-end optional-runtime gate for Windows. It first proves dry-run is
|
||||||
# chain (#1538, #1537, #1530, #1457, #1561) before they reach users.
|
# 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
|
# Separate from windows-free-tests.yml because that one runs a curated
|
||||||
# unit-test subset; this one exercises the install path itself.
|
# unit-test subset; this one exercises the install path itself.
|
||||||
@@ -19,6 +21,7 @@ on:
|
|||||||
- 'scripts/build.sh'
|
- 'scripts/build.sh'
|
||||||
- 'scripts/write-version-files.sh'
|
- 'scripts/write-version-files.sh'
|
||||||
- 'setup'
|
- 'setup'
|
||||||
|
- 'runtime/**'
|
||||||
- 'browse/src/cli.ts'
|
- 'browse/src/cli.ts'
|
||||||
- 'browse/src/find-browse.ts'
|
- 'browse/src/find-browse.ts'
|
||||||
- 'bin/gstack-paths'
|
- 'bin/gstack-paths'
|
||||||
@@ -35,11 +38,18 @@ jobs:
|
|||||||
timeout-minutes: 15
|
timeout-minutes: 15
|
||||||
|
|
||||||
steps:
|
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:
|
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
|
- name: Configure git identity
|
||||||
run: |
|
run: |
|
||||||
@@ -52,45 +62,34 @@ jobs:
|
|||||||
run: bun install --frozen-lockfile
|
run: bun install --frozen-lockfile
|
||||||
shell: bash
|
shell: bash
|
||||||
|
|
||||||
- name: Run bun run build (the previously-broken path)
|
- name: Preview without mutating state
|
||||||
# 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)
|
|
||||||
run: |
|
run: |
|
||||||
set -e
|
set -e
|
||||||
test -f browse/dist/browse.exe || test -f browse/dist/browse || (echo "MISSING: browse" && exit 1)
|
bash ./setup --dry-run --capabilities browser
|
||||||
test -f browse/dist/find-browse.exe || test -f browse/dist/find-browse || (echo "MISSING: find-browse" && exit 1)
|
test ! -e "$GSTACK_HOME" || (echo "dry-run mutated GSTACK_HOME" && 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"
|
|
||||||
shell: bash
|
shell: bash
|
||||||
|
|
||||||
- name: Verify find-browse resolves to the .exe variant
|
- name: Explicitly install the browser capability
|
||||||
run: |
|
run: |
|
||||||
set -e
|
set -e
|
||||||
OUT=$(bun browse/src/find-browse.ts 2>&1) || true
|
bash ./setup --install-now --yes --capabilities browser
|
||||||
echo "find-browse output: $OUT"
|
test -f "$GSTACK_HOME/versions/current.json"
|
||||||
# On Windows, find-browse should successfully resolve to a binary,
|
test -f "$GSTACK_HOME/bin/gstack.cmd"
|
||||||
# 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)
|
|
||||||
shell: bash
|
shell: bash
|
||||||
|
|
||||||
- name: Verify gstack-paths state root resolves
|
- name: Verify doctor and installed native browser
|
||||||
run: |
|
run: |
|
||||||
set -e
|
set -e
|
||||||
eval "$(bash bin/gstack-paths)"
|
node runtime/cli.js doctor --json > doctor.json
|
||||||
test -n "$GSTACK_STATE_ROOT" || (echo "GSTACK_STATE_ROOT empty" && exit 1)
|
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)'
|
||||||
test -n "$PLAN_ROOT" || (echo "PLAN_ROOT empty" && exit 1)
|
browser=$(node runtime/cli.js runtime path browse/dist/browse.exe)
|
||||||
test -n "$TMP_ROOT" || (echo "TMP_ROOT empty" && exit 1)
|
test -f "$browser"
|
||||||
echo "GSTACK_STATE_ROOT=$GSTACK_STATE_ROOT"
|
shell: bash
|
||||||
echo "PLAN_ROOT=$PLAN_ROOT"
|
|
||||||
echo "TMP_ROOT=$TMP_ROOT"
|
- 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
|
shell: bash
|
||||||
|
|||||||
@@ -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
|
`--skill` option, or use `-g` for its global scope. GStack does not silently
|
||||||
enroll detected hosts.
|
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
|
The candidate installer matrix passes project/global placement for Claude
|
||||||
Code, Codex, Cursor, Pi, OpenClaw, and GitHub Copilot. This verifies files and
|
Code, Codex, Cursor, Pi, OpenClaw, and GitHub Copilot. This verifies files and
|
||||||
canonical hashes; host UI execution remains a separate release gate.
|
canonical hashes; host UI execution remains a separate release gate.
|
||||||
|
|
||||||
Start with `/plan`, or invoke the skill syntax your host displays. Pure
|
Start with `/plan`, or invoke the skill syntax your host displays. Pure
|
||||||
judgment modes work without a shared executable. Capability-dependent modes
|
judgment modes work without a shared executable. Capability-dependent modes
|
||||||
may offer the optional, host-neutral runtime. From a repository checkout,
|
may offer the optional, host-neutral runtime only when the selected work needs
|
||||||
`./setup` installs that runtime once per user without placing host skills. Its
|
one. The skill explains the local capability and network/download boundary,
|
||||||
real default-capability lifecycle and 383-file broad suite pass on macOS. The
|
then asks whether to install now or later. Nothing is downloaded before that
|
||||||
declared Linux Dev Container passes the 136-test GStack 2 suite, and a clean
|
approval, and installing a capability never enrolls another coding host.
|
||||||
Linux arm64 install/build/browser/uninstall smoke also passes. Native-host
|
Approved installs fetch the pinned official GitHub Release artifact, verify its
|
||||||
Linux and Windows remain release gates, so consult
|
declared byte count and SHA-256, and use Sigstore metadata when Cosign is
|
||||||
[`HOST-COMPATIBILITY.md`](docs/gstack-2/HOST-COMPATIBILITY.md) before relying on
|
already available. Cosign is not an end-user prerequisite.
|
||||||
it.
|
|
||||||
|
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,
|
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
|
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
|
- **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
|
- **Tech leads and staff engineers** — rigorous review, QA, and release automation on every PR
|
||||||
|
|
||||||
|
<details>
|
||||||
|
<summary>Legacy 1.x workflow and host-specific documentation</summary>
|
||||||
|
|
||||||
## Legacy 1.x workflow example
|
## 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)
|
1. Install gstack (30 seconds — see below)
|
||||||
2. Run `/office-hours` — describe what you're building
|
2. Run `/office-hours` — describe what you're building
|
||||||
3. Run `/plan-ceo-review` on any feature idea
|
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 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.
|
- **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.
|
- **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.
|
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`
|
**`/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.
|
**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.
|
/guard, /unfreeze, /gstack-upgrade, /learn.
|
||||||
```
|
```
|
||||||
|
|
||||||
|
</details>
|
||||||
|
|
||||||
## License
|
## License
|
||||||
|
|
||||||
MIT. Free forever. Go build something.
|
MIT. Free forever. Go build something.
|
||||||
|
|||||||
+3
-1
@@ -34,7 +34,9 @@ const defaults = Object.freeze({
|
|||||||
routing_declined: false,
|
routing_declined: false,
|
||||||
telemetry: "off",
|
telemetry: "off",
|
||||||
auto_upgrade: false,
|
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,
|
skill_prefix: false,
|
||||||
checkpoint_mode: "explicit",
|
checkpoint_mode: "explicit",
|
||||||
checkpoint_push: false,
|
checkpoint_push: false,
|
||||||
|
|||||||
@@ -23,18 +23,18 @@ VERSION_FILE="$GSTACK_DIR/VERSION"
|
|||||||
REMOTE_URL="${GSTACK_REMOTE_URL:-https://raw.githubusercontent.com/garrytan/gstack/main/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}"
|
REMOTE_REPO="${GSTACK_REMOTE_REPO:-https://github.com/garrytan/gstack.git}"
|
||||||
|
|
||||||
# ─── Force flag (busts cache + snooze for standalone /gstack-upgrade) ──
|
# Agent Skills owns normal update discovery and installation (`npx skills
|
||||||
if [ "${1:-}" = "--force" ]; then
|
# update`). Skill preambles still call this compatibility
|
||||||
rm -f "$CACHE_FILE"
|
# helper, so fail closed before any state mutation or network access unless a
|
||||||
rm -f "$SNOOZE_FILE"
|
# user explicitly invoked the legacy forced check.
|
||||||
fi
|
if [ "${1:-}" != "--force" ]; then
|
||||||
|
|
||||||
# ─── Step 0: Check if updates are disabled ────────────────────
|
|
||||||
_UC=$("$GSTACK_DIR/bin/gstack-config" get update_check 2>/dev/null || true)
|
|
||||||
if [ "$_UC" = "false" ]; then
|
|
||||||
exit 0
|
exit 0
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
# ─── Explicit legacy check: bust cache + snooze ───────────────
|
||||||
|
rm -f "$CACHE_FILE"
|
||||||
|
rm -f "$SNOOZE_FILE"
|
||||||
|
|
||||||
# ─── Migration: fix stale Codex descriptions (one-time) ───────
|
# ─── Migration: fix stale Codex descriptions (one-time) ───────
|
||||||
# Existing installs may have .agents/skills/gstack/SKILL.md with oversized
|
# Existing installs may have .agents/skills/gstack/SKILL.md with oversized
|
||||||
# descriptions (>1024 chars) that Codex rejects. We can't regenerate from
|
# descriptions (>1024 chars) that Codex rejects. We can't regenerate from
|
||||||
|
|||||||
@@ -16,6 +16,7 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
import { chromium, type Browser, type BrowserContext, type BrowserContextOptions, type Page, type Locator, type Cookie } from 'playwright';
|
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 { writeSecureFile, mkdirSecure } from './file-permissions';
|
||||||
import { addConsoleEntry, addNetworkEntry, addDialogEntry, networkBuffer, type DialogEntry } from './buffers';
|
import { addConsoleEntry, addNetworkEntry, addDialogEntry, networkBuffer, type DialogEntry } from './buffers';
|
||||||
import { emitActivity } from './activity';
|
import { emitActivity } from './activity';
|
||||||
@@ -73,6 +74,21 @@ export function shouldEnableChromiumSandbox(): boolean {
|
|||||||
return !(process.env.CI || process.env.CONTAINER || isRoot);
|
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.
|
* Resolve why the underlying Chromium ChildProcess is going away.
|
||||||
*
|
*
|
||||||
@@ -371,6 +387,7 @@ export class BrowserManager {
|
|||||||
|
|
||||||
this.browser = await chromium.launch({
|
this.browser = await chromium.launch({
|
||||||
headless: useHeadless,
|
headless: useHeadless,
|
||||||
|
...(useHeadless && managedHeadlessChannel() ? { channel: 'chromium' as const } : {}),
|
||||||
// On Windows, Chromium's sandbox fails when the server is spawned through
|
// On Windows, Chromium's sandbox fails when the server is spawned through
|
||||||
// the Bun→Node process chain (GitHub #276). Disable it — local daemon
|
// the Bun→Node process chain (GitHub #276). Disable it — local daemon
|
||||||
// browsing user-specified URLs has marginal sandbox benefit. Also disabled
|
// browsing user-specified URLs has marginal sandbox benefit. Also disabled
|
||||||
@@ -585,7 +602,7 @@ export class BrowserManager {
|
|||||||
args: launchArgs,
|
args: launchArgs,
|
||||||
viewport: null, // Use browser's default viewport (real window size)
|
viewport: null, // Use browser's default viewport (real window size)
|
||||||
userAgent: this.customUserAgent || customUA,
|
userAgent: this.customUserAgent || customUA,
|
||||||
...(executablePath ? { executablePath } : {}),
|
...(executablePath ? { executablePath } : { channel: 'chromium' }),
|
||||||
...(this.proxyConfig ? { proxy: this.proxyConfig } : {}),
|
...(this.proxyConfig ? { proxy: this.proxyConfig } : {}),
|
||||||
ignoreDefaultArgs: STEALTH_IGNORE_DEFAULT_ARGS,
|
ignoreDefaultArgs: STEALTH_IGNORE_DEFAULT_ARGS,
|
||||||
});
|
});
|
||||||
@@ -1588,6 +1605,7 @@ export class BrowserManager {
|
|||||||
const { STEALTH_IGNORE_DEFAULT_ARGS } = await import('./stealth');
|
const { STEALTH_IGNORE_DEFAULT_ARGS } = await import('./stealth');
|
||||||
newContext = await chromium.launchPersistentContext(userDataDir, {
|
newContext = await chromium.launchPersistentContext(userDataDir, {
|
||||||
headless: false,
|
headless: false,
|
||||||
|
channel: 'chromium',
|
||||||
// Match the sandbox policy used by launchHeaded() / launch(). The
|
// Match the sandbox policy used by launchHeaded() / launch(). The
|
||||||
// handoff path is the headless→headed re-launch and shares the same
|
// handoff path is the headless→headed re-launch and shares the same
|
||||||
// anti-detection posture, including no spurious --no-sandbox infobar.
|
// anti-detection posture, including no spurious --no-sandbox infobar.
|
||||||
|
|||||||
+14
-21
@@ -80,12 +80,15 @@ export function resolveNodeServerScript(
|
|||||||
return null;
|
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.
|
// Every installed/compiled client must use the adjacent Node-compatible daemon.
|
||||||
if (IS_WINDOWS && !NODE_SERVER_SCRIPT) {
|
// 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(
|
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<string, string>): Promise<ServerSta
|
|||||||
// server's own parseInt at server.ts:760.
|
// server's own parseInt at server.ts:760.
|
||||||
const parentPid = parseInt(process.env.BROWSE_PARENT_PID || '', 10) === 0 ? '0' : String(process.pid);
|
const parentPid = parseInt(process.env.BROWSE_PARENT_PID || '', 10) === 0 ? '0' : String(process.pid);
|
||||||
|
|
||||||
if (IS_WINDOWS && NODE_SERVER_SCRIPT) {
|
if (NODE_SERVER_SCRIPT) {
|
||||||
// Windows: Bun.spawn() + proc.unref() doesn't truly detach on Windows —
|
// Installed clients on every platform use the adjacent Node-compatible
|
||||||
// when the CLI exits, the server dies with it. Use Node's child_process.spawn
|
// daemon. Besides correct Windows detachment, this means the base browser
|
||||||
// with { detached: true } instead, which is the gold standard for Windows
|
// capability needs Node (already required by bootstrap) but no global Bun.
|
||||||
// process independence. Credit: PR #191 by @fqueiro.
|
|
||||||
const extraEnvStr = JSON.stringify({ BROWSE_STATE_FILE: config.stateFile, BROWSE_PARENT_PID: parentPid, ...(extraEnv || {}) });
|
const extraEnvStr = JSON.stringify({ BROWSE_STATE_FILE: config.stateFile, BROWSE_PARENT_PID: parentPid, ...(extraEnv || {}) });
|
||||||
const launcherCode =
|
const launcherCode =
|
||||||
`const{spawn}=require('child_process');` +
|
`const{spawn}=require('child_process');` +
|
||||||
`spawn(process.execPath,[${JSON.stringify(NODE_SERVER_SCRIPT)}],` +
|
`spawn(process.execPath,[${JSON.stringify(NODE_SERVER_SCRIPT)}],` +
|
||||||
`{detached:true,stdio:['ignore','ignore','ignore'],env:Object.assign({},process.env,` +
|
`{detached:true,stdio:['ignore','ignore','ignore'],env:Object.assign({},process.env,` +
|
||||||
`${extraEnvStr})}).unref()`;
|
`${extraEnvStr})}).unref()`;
|
||||||
Bun.spawnSync(['node', '-e', launcherCode], { stdio: ['ignore', 'ignore', 'ignore'] });
|
Bun.spawnSync([process.env.GSTACK_NODE || 'node', '-e', launcherCode], { stdio: ['ignore', 'ignore', 'ignore'] });
|
||||||
} else {
|
} else {
|
||||||
// macOS/Linux: Bun.spawn().unref() only removes the child from Bun's event
|
// Reviewed source-development fallback only. Node's detached spawn still
|
||||||
// loop — it does NOT call setsid(), so the spawned server stays in the
|
// calls setsid() on macOS/Linux, so the Bun dev server survives SIGHUP.
|
||||||
// parent's process session. When the CLI runs inside a session-managed
|
|
||||||
// shell (e.g. Claude Code's per-command Bash sandbox, Conductor, CI
|
|
||||||
// step runners), the session leader's exit sends SIGHUP to every PID in
|
|
||||||
// the session, killing the bun server (and its Chromium grandchildren).
|
|
||||||
// Even with BROWSE_PARENT_PID=0 disabling the watchdog, SIGHUP still
|
|
||||||
// reaps the server. Use Node's child_process.spawn with detached:true,
|
|
||||||
// which calls setsid() so the server becomes its own session leader
|
|
||||||
// (PPID=1, STAT=Ss) and survives the spawning shell's exit. Mirrors
|
|
||||||
// the Windows path's rationale — same root cause, different OS API.
|
|
||||||
nodeSpawn('bun', ['run', SERVER_SCRIPT], {
|
nodeSpawn('bun', ['run', SERVER_SCRIPT], {
|
||||||
detached: true,
|
detached: true,
|
||||||
stdio: ['ignore', 'ignore', 'ignore'],
|
stdio: ['ignore', 'ignore', 'ignore'],
|
||||||
|
|||||||
+19
-10
@@ -37,20 +37,29 @@ export function validateOutputPath(filePath: string): void {
|
|||||||
// Without this, a symlink at /tmp/evil.png → /etc/crontab passes the
|
// Without this, a symlink at /tmp/evil.png → /etc/crontab passes the
|
||||||
// parent-directory check (parent is /tmp, which is safe) but the actual
|
// parent-directory check (parent is /tmp, which is safe) but the actual
|
||||||
// write follows the symlink to /etc/crontab.
|
// write follows the symlink to /etc/crontab.
|
||||||
|
let stat: fs.Stats | undefined;
|
||||||
try {
|
try {
|
||||||
const stat = fs.lstatSync(resolved);
|
stat = fs.lstatSync(resolved);
|
||||||
if (stat.isSymbolicLink()) {
|
|
||||||
const realTarget = fs.realpathSync(resolved);
|
|
||||||
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
|
|
||||||
}
|
|
||||||
} catch (e: any) {
|
} 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 (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.
|
// For new files (no existing symlink), verify the parent directory.
|
||||||
// The file itself may not exist yet (e.g., screenshot output).
|
// The file itself may not exist yet (e.g., screenshot output).
|
||||||
|
|||||||
@@ -55,7 +55,7 @@ describe("#1612 macOS/Linux daemonize via Node setsid path", () => {
|
|||||||
expect(body).toMatch(/SIGHUP/);
|
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();
|
const body = read();
|
||||||
// Strip line comments before regex matching, so the "Bun.spawn().unref()"
|
// Strip line comments before regex matching, so the "Bun.spawn().unref()"
|
||||||
// mentions inside the explanatory comment don't trigger false positives.
|
// 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")
|
.split("\n")
|
||||||
.filter((line) => !line.trim().startsWith("//"))
|
.filter((line) => !line.trim().startsWith("//"))
|
||||||
.join("\n");
|
.join("\n");
|
||||||
// Find the non-Windows branch. The `} else {` block following the
|
expect(codeOnly).toContain("if (NODE_SERVER_SCRIPT)");
|
||||||
// Windows branch. We then require its first ~400 chars contain a
|
expect(codeOnly).toContain("spawn(process.execPath");
|
||||||
// nodeSpawn() call and NOT a Bun.spawn() call (excluding the comment).
|
expect(codeOnly).toContain("nodeSpawn('bun', ['run', SERVER_SCRIPT]");
|
||||||
const nonWindowsStart = codeOnly.indexOf("nodeSpawn('bun'");
|
expect(codeOnly).not.toMatch(/Bun\.spawn\([^\n]*SERVER_SCRIPT/);
|
||||||
expect(nonWindowsStart).toBeGreaterThan(-1);
|
});
|
||||||
const slice = codeOnly.slice(nonWindowsStart, nonWindowsStart + 400);
|
|
||||||
expect(slice).toMatch(/nodeSpawn\(/);
|
test("installed daemon detachment honors the bootstrap-selected Node executable", () => {
|
||||||
expect(slice).not.toMatch(/Bun\.spawn\(/);
|
const body = read();
|
||||||
|
expect(body).toContain("process.env.GSTACK_NODE || 'node'");
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -112,10 +112,16 @@ describe('validateReadPath', () => {
|
|||||||
});
|
});
|
||||||
|
|
||||||
describe('validateOutputPath — symlink resolution', () => {
|
describe('validateOutputPath — symlink resolution', () => {
|
||||||
it('blocks symlink inside /tmp pointing outside safe dirs', () => {
|
it('blocks a dangling symlink inside /tmp pointing outside safe dirs', () => {
|
||||||
const linkPath = join(tmpdir(), 'test-output-symlink-' + Date.now() + '.png');
|
// 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 {
|
try {
|
||||||
symlinkSync('/etc/crontab', linkPath);
|
symlinkSync(missingTarget, linkPath);
|
||||||
expect(() => validateOutputPath(linkPath)).toThrow(/Path must be within/);
|
expect(() => validateOutputPath(linkPath)).toThrow(/Path must be within/);
|
||||||
} finally {
|
} finally {
|
||||||
try { unlinkSync(linkPath); } catch {}
|
try { unlinkSync(linkPath); } catch {}
|
||||||
|
|||||||
@@ -11,7 +11,6 @@
|
|||||||
"html-to-docx": "1.8.0",
|
"html-to-docx": "1.8.0",
|
||||||
"marked": "^18.0.2",
|
"marked": "^18.0.2",
|
||||||
"playwright": "^1.58.2",
|
"playwright": "^1.58.2",
|
||||||
"puppeteer-core": "^24.40.0",
|
|
||||||
"sharp": "^0.34.5",
|
"sharp": "^0.34.5",
|
||||||
"socks": "^2.8.8",
|
"socks": "^2.8.8",
|
||||||
"xterm": "5",
|
"xterm": "5",
|
||||||
@@ -164,54 +163,22 @@
|
|||||||
|
|
||||||
"@protobufjs/utf8": ["@protobufjs/utf8@1.1.0", "", {}, "sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw=="],
|
"@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/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=="],
|
"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=="],
|
"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": ["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=="],
|
"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=="],
|
"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=="],
|
"boolean": ["boolean@3.2.0", "", {}, "sha512-d0II/GO9uf9lfUHH2BQsjxzRJZBdsjgsBiW4BvhWk/3qoKwQFjIDVN19PfX8F2D/r9PCMTtLWjYVCFrpeYUzsw=="],
|
||||||
|
|
||||||
"browser-split": ["browser-split@0.0.1", "", {}, "sha512-JhvgRb2ihQhsljNda3BI8/UcRHVzrVwo3Q+P8vDtSiyobXuFpuZ9mq+MbRGMnC22CjW3RrfXdg6j6ITX8M+7Ow=="],
|
"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=="],
|
"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=="],
|
"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=="],
|
"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=="],
|
"color-name": ["color-name@1.1.4", "", {}, "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="],
|
||||||
|
|
||||||
"content-disposition": ["content-disposition@1.1.0", "", {}, "sha512-5jRCH9Z/+DRP7rkvY83B+yGIGX96OYdJmzngqnw2SBSxqCFPd0w2km3s5iawpGX8krnwSGmF0FW5Nhr0Hfai3g=="],
|
"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=="],
|
"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=="],
|
"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-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=="],
|
"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=="],
|
"depd": ["depd@2.0.0", "", {}, "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw=="],
|
||||||
|
|
||||||
"detect-libc": ["detect-libc@2.1.2", "", {}, "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ=="],
|
"detect-libc": ["detect-libc@2.1.2", "", {}, "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ=="],
|
||||||
|
|
||||||
"detect-node": ["detect-node@2.1.0", "", {}, "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g=="],
|
"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=="],
|
"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=="],
|
"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=="],
|
"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=="],
|
"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=="],
|
"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=="],
|
"entities": ["entities@1.1.2", "", {}, "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w=="],
|
||||||
@@ -296,26 +247,14 @@
|
|||||||
|
|
||||||
"es6-error": ["es6-error@4.1.1", "", {}, "sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg=="],
|
"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-html": ["escape-html@1.0.3", "", {}, "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow=="],
|
||||||
|
|
||||||
"escape-string-regexp": ["escape-string-regexp@4.0.0", "", {}, "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA=="],
|
"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=="],
|
"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=="],
|
"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": ["eventsource@3.0.7", "", { "dependencies": { "eventsource-parser": "^3.0.1" } }, "sha512-CRT1WTyuQoD771GW56XEZFQ/ZoSfWid1alKGDYMmkt2yl8UXrVR4pspqWNEcqKvVIzg6PAltWjxcSSPrboA4iA=="],
|
||||||
|
|
||||||
"eventsource-parser": ["eventsource-parser@3.0.8", "", {}, "sha512-70QWGkr4snxr0OXLRWsFLeRBIRPuQOvt4s8QYjmUlmlkyTZkRqS7EDVRZtzU3TiyDbXSzaOeF0XUKy8PchzukQ=="],
|
"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=="],
|
"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-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=="],
|
"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=="],
|
"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=="],
|
"flatbuffers": ["flatbuffers@25.9.23", "", {}, "sha512-MI1qs7Lo4Syw0EOzUl0xjs2lsoeqFku44KpngfIduHBYvzm8h2+7K8YMQh1JtVVVrUvhLpNwqVi4DERegUJhPQ=="],
|
||||||
@@ -346,16 +279,10 @@
|
|||||||
|
|
||||||
"function-bind": ["function-bind@1.1.2", "", {}, "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA=="],
|
"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-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-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": ["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=="],
|
"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-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=="],
|
"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=="],
|
"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=="],
|
"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-object": ["is-object@1.0.2", "", {}, "sha512-2rRIahhZr2UWb45fIOuvZGpFtz0TyOZLf32KxBbSoUCeZR495zCKlWUKKUByk3geS2eAs7ZAABt0Y/Rx0GiQGA=="],
|
||||||
|
|
||||||
"is-promise": ["is-promise@4.0.0", "", {}, "sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ=="],
|
"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=="],
|
"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=="],
|
"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=="],
|
"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=="],
|
"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=="],
|
"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=="],
|
"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=="],
|
"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=="],
|
"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=="],
|
"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=="],
|
"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=="],
|
"pako": ["pako@1.0.11", "", {}, "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw=="],
|
||||||
|
|
||||||
"parseurl": ["parseurl@1.3.3", "", {}, "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ=="],
|
"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=="],
|
"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=="],
|
"pkce-challenge": ["pkce-challenge@5.0.1", "", {}, "sha512-wQ0b/W4Fr01qtpHlqSqspcj3EhBvimsdh0KlHhH8HRZnMsEa0ea2fTULOXOS9ccQr3om+GcGRk4e+isrZWV8qQ=="],
|
||||||
|
|
||||||
"platform": ["platform@1.3.6", "", {}, "sha512-fnWVljUchTro6RiCFvCXBbNhJc2NijN7oIQxbwsyL0buWJPG85v81ehlHI9fXrJsMNgTofEoWIQeClKpgxFLrg=="],
|
"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=="],
|
"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=="],
|
"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-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=="],
|
"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=="],
|
"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=="],
|
"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=="],
|
"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=="],
|
"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=="],
|
"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": ["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=="],
|
"sprintf-js": ["sprintf-js@1.1.3", "", {}, "sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA=="],
|
||||||
|
|
||||||
"statuses": ["statuses@2.0.2", "", {}, "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw=="],
|
"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-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=="],
|
"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=="],
|
"toidentifier": ["toidentifier@1.0.1", "", {}, "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA=="],
|
||||||
|
|
||||||
"tr46": ["tr46@0.0.3", "", {}, "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw=="],
|
"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=="],
|
"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=="],
|
"undici-types": ["undici-types@7.18.2", "", {}, "sha512-AsuCzffGHJybSaRrmr5eHr81mwJU3kjw6M+uprWvCXiNeN9SOGwQ3Jn8jb8m3Z6izVgknn1R0FTCEAP2QrLY/w=="],
|
||||||
|
|
||||||
"unpipe": ["unpipe@1.0.0", "", {}, "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ=="],
|
"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=="],
|
"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=="],
|
"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=="],
|
"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=="],
|
"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=="],
|
"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-array": ["x-is-array@0.1.0", "", {}, "sha512-goHPif61oNrr0jJgsXRfc8oqtYzvfiMJpTqwE7Z4y9uH+T3UozkGqQ4d2nX9mB9khvA8U2o/UbPOFjgC7hLWIA=="],
|
||||||
|
|
||||||
"x-is-string": ["x-is-string@0.1.0", "", {}, "sha512-GojqklwG8gpzOVEVki5KudKNoq7MbbjYZCbyWzEz7tyPA7eleiE0+ePwOWQQRb5fm86rD3S8Tc0tSFf3AOv50w=="],
|
"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=="],
|
"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": ["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=="],
|
"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=="],
|
"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=="],
|
"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=="],
|
"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=="],
|
"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=="],
|
"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=="],
|
"xmlbuilder2/@oozcitak/dom/@oozcitak/util": ["@oozcitak/util@8.0.0", "", {}, "sha512-+9Hq6yuoq/3TRV/n/xcpydGBq2qN2/DEDMqNTG7rm95K6ZE2/YY/sPyx62+1n8QsE9O26e5M1URlXsk+AnN9Jw=="],
|
||||||
|
|||||||
@@ -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
|
returns bounded 504 responses for a suspended app, asserts the expected bundle
|
||||||
around coordinate mutations, preserves typed snapshot/mutation/restoration,
|
around coordinate mutations, preserves typed snapshot/mutation/restoration,
|
||||||
and keeps bridge symbols debug-only. Device signing, provisioning, and
|
and keeps bridge symbols debug-only. Device signing, provisioning, and
|
||||||
CoreDevice compatibility are setup gates, not product failures. A live
|
CoreDevice compatibility are setup gates, not product failures. Earlier
|
||||||
signed-device pass is still required before release. The earlier target's
|
`signing_unavailable`, `device_not_wired`, and partial session-acquire results
|
||||||
preflight evidence is 9 pass / 0 fail / 1 deploy skip and 29 assertions; its
|
remain retained as failures. After explicit re-authorization, the live lane
|
||||||
direct smoke returned `signing_unavailable`. The latest explicitly selected
|
passed 12/12 harness checks and all five required iterations on a wired paired
|
||||||
target returned `device_not_wired` because iOS 16.7.10 exposes no supported
|
`iPhone17,1`, including Release-symbol exclusion, ten screenshots, session
|
||||||
CoreDevice service. Neither attempt installed or launched an app, and no pass
|
cleanup, tunnel shutdown, and workspace cleanup. The redacted artifact is
|
||||||
artifact was written.
|
[`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
|
PDF rendering and Mermaid/Excalidraw remain internal capabilities. GStack does
|
||||||
not add Typst, hosted document rendering, alternate diagram services, local
|
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. |
|
| 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. |
|
| 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. |
|
| 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. |
|
| 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. |
|
| 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. |
|
| 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. |
|
||||||
|
|||||||
@@ -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
|
Windows and includes the CoreDevice/iOS bundle only on Darwin. Add the bin
|
||||||
directory to `PATH` if the short `gstack` command is desired.
|
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
|
Twenty-five focused installer tests pass with 341 assertions. They cover
|
||||||
manifests, paths with spaces,
|
manifests, paths with spaces,
|
||||||
source-root symlinks, internal-link/path-escape rejection, failed build/
|
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 |
|
| 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. |
|
| 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 | 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. |
|
| 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 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. |
|
| 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. |
|
| 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)
|
Native CI run [`29615621805`](https://github.com/time-attack/gstack/actions/runs/29615621805)
|
||||||
|
|||||||
@@ -6,8 +6,7 @@ The harness is intentionally fail-closed. A setup problem is not a product failu
|
|||||||
|
|
||||||
## Current validation status
|
## Current validation status
|
||||||
|
|
||||||
The earlier target was validated locally at the July 17, 2026 checkpoint with
|
The live lane was validated locally on July 20, 2026 with Xcode 26.6:
|
||||||
Xcode 26.6:
|
|
||||||
|
|
||||||
| Identifier kind | Example form | Used for |
|
| 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.
|
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
|
The daemon suite is green at 95 pass / 0 fail and 229 assertions. The final
|
||||||
earlier target, the physical E2E preflight records 9 pass / 0 fail / 1 deploy
|
physical lane passed 12/12 harness checks and all five required live iterations
|
||||||
skip and 29 assertions. Its host, pairing/trust, Developer Mode, wired
|
on an explicitly authorized wired, paired `iPhone17,1` with Developer Mode
|
||||||
transport, `devicectl`, `xcodegen`, and DevToolsSecurity gates pass. The
|
enabled. The existing Apple development identity signed the reserved fixture;
|
||||||
unsigned Release build also passes and contains no DebugBridge module symbols
|
the harness did not generate or fabricate a profile. The Release guard found no
|
||||||
or artifacts.
|
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
|
The redacted atomic evidence is
|
||||||
signing. It returned typed code `signing_unavailable`, category `setup_gate`. The
|
[`evidence/ios-physical-device-2026-07-20T17-49-19-302Z.json`](./evidence/ios-physical-device-2026-07-20T17-49-19-302Z.json).
|
||||||
underlying Xcode diagnostic is:
|
It stores only a SHA-256 fingerprint of the local identifiers, plus the device
|
||||||
|
model and non-secret verification results.
|
||||||
|
|
||||||
```text
|
Earlier attempts remain part of the record and are not relabeled by the later
|
||||||
Signing for "FixtureApp" requires a development team.
|
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
|
||||||
That is a setup gate, not a DebugBridge failure. No app was installed or
|
correctly classified as setup or partial evidence and produced no pass
|
||||||
launched, and no pass artifact was written. The deploy skip and typed smoke
|
artifact.
|
||||||
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.
|
|
||||||
|
|
||||||
## Hardware UDID versus CoreDevice UUID
|
## Hardware UDID versus CoreDevice UUID
|
||||||
|
|
||||||
|
|||||||
@@ -2,17 +2,17 @@
|
|||||||
|
|
||||||
Parity is executable, not a prose claim. Run `bun run scripts/gstack2/run-parity.ts` or the dedicated Bun tests.
|
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:
|
The suite verifies:
|
||||||
|
|
||||||
- exactly six discoverable public skills and 55 internal legacy modules;
|
- exactly six discoverable public skills and 55 internal legacy modules;
|
||||||
- 55 canonical templates plus 16 carved section templates at base `bb57306d98c97011b0919c6132705a15b1579781`;
|
- 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;
|
- preservation of nine behavioral contract dimensions per module;
|
||||||
- 25 structured non-keyword routing fixtures with active/skipped modules, depth, mutation, and web context;
|
- 25 structured non-keyword routing fixtures with active/skipped modules, depth, mutation, and web context;
|
||||||
- 16 upstream judgment-port regression fixtures and anchors;
|
- 16 upstream judgment-port regression fixtures and anchors;
|
||||||
- all linked asset copies against their pinned Git blobs;
|
- all linked asset copies against their pinned Git blobs;
|
||||||
- frontmatter and `agents/openai.yaml` schema for each public skill.
|
- 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.
|
||||||
|
|||||||
+434
-1124
File diff suppressed because it is too large
Load Diff
@@ -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 |
|
| 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 |
|
| 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
|
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.dev consent. A key present in the environment is not consent. The
|
||||||
Context client requires persisted selection `context`, mode `context`, and
|
Context client requires persisted selection `context`, mode `context`, and
|
||||||
|
|||||||
@@ -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.
|
||||||
@@ -2,7 +2,7 @@
|
|||||||
|
|
||||||
Pinned baseline: `bb57306d98c97011b0919c6132705a15b1579781`.
|
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.
|
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 versus judgment changes
|
||||||
|
|
||||||
- `MECHANICAL_PORT`: canonical Codex resolver expansion, section inlining, safety prose, and path rewrites only.
|
- `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 mechanical body plus a clearly delimited judgment overlay sourced from one of the 16 upstream PRs and its regression fixture.
|
- `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.
|
- Asset relocation is byte-for-byte from the pinned Git blob and is indexed per tree.
|
||||||
|
|||||||
+23
-25
@@ -1,11 +1,11 @@
|
|||||||
# GStack 2 status
|
# 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
|
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
|
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
|
required evidence layer. The physical-iPhone P0 gate is now green. The current
|
||||||
gate and the failed live v3 installed-host adversarial gate, including
|
blocker is the failed live v3 installed-host adversarial gate, including
|
||||||
incomplete representative host UI/process coverage. Native CI is green on
|
incomplete representative host UI/process coverage. Native CI is green on
|
||||||
macOS, Ubuntu, Windows, and the Dev Container. No release-branch push, draft
|
macOS, Ubuntu, Windows, and the Dev Container. No release-branch push, draft
|
||||||
PR, or PR-ready claim is authorized by this status.
|
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
|
three retained Claude Haiku live samples are classified `REGRESSION`; they
|
||||||
are preserved as noisy supplemental evidence, never cherry-picked as a
|
are preserved as noisy supplemental evidence, never cherry-picked as a
|
||||||
primary gate or represented as green.
|
primary gate or represented as green.
|
||||||
- [x] The current macOS GStack 2 suite is green at commit `a8a5fa1a`: 150 pass
|
- [x] The current macOS GStack 2 suite is green: 151 pass / 0 fail and 1,194
|
||||||
/ 0 fail and 1,189 assertions across 16 files.
|
assertions across 16 files.
|
||||||
- [x] Optional host-neutral runtime implemented with canonical paths,
|
- [x] Optional host-neutral runtime implemented with canonical paths,
|
||||||
repo/worktree state identity, locks, atomic writes, effect claims,
|
repo/worktree state identity, locks, atomic writes, effect claims,
|
||||||
doctor/config/state/cleanup, migrations, upgrade/rollback, and uninstall.
|
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
|
production-only install with the development SDK absent, completed a local
|
||||||
browser journey and Sharp full-page screenshot, and uninstalled while
|
browser journey and Sharp full-page screenshot, and uninstalled while
|
||||||
preserving state.
|
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,
|
- [x] Filesystem lifecycle coverage passes for clean install/uninstall,
|
||||||
paths with spaces, source symlinks with internal-link rejection, read-only
|
paths with spaces, source symlinks with internal-link rejection, read-only
|
||||||
destination reporting on macOS, interrupted-pointer rollback, crash-journal
|
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
|
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
|
assertions. The opt-in paid diagram lane recorded two skips and is not live
|
||||||
provider evidence.
|
provider evidence.
|
||||||
- [x] Physical-iOS preflight recorded 9 pass / 0 fail / 1 deploy skip and 29
|
- [x] After the user re-authorized the connected test phone, the physical-iOS
|
||||||
assertions. The direct smoke then returned typed code
|
lane passed 12/12. The existing Apple-signed wildcard development profile and
|
||||||
`signing_unavailable`, category `setup_gate`; it installed no app and wrote no
|
matching private key signed the reserved fixture; no fabricated profile was
|
||||||
pass artifact. A later attempt against the explicitly selected iPhone10,6 on
|
needed. Release guard, safe in-place install, launch, CoreDevice bootstrap,
|
||||||
iOS 16.7.10 returned `device_not_wired`; legacy USB pairing validates, but
|
boot-token rotation, all five session acquire/release cycles, ten live
|
||||||
CoreDevice pairing is unsupported. After the user explicitly authorized the
|
screenshots, accessibility elements, coordinate taps, bundle checks, state
|
||||||
other connected phone, pairing/signing/build/install/launch/tunnel setup
|
cleanup, tunnel shutdown, and temporary-workspace cleanup passed. Artifact:
|
||||||
passed, but `POST /session/acquire` closed its socket before the five-check
|
[`evidence/ios-physical-device-2026-07-20T17-49-19-302Z.json`](./evidence/ios-physical-device-2026-07-20T17-49-19-302Z.json).
|
||||||
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] Installed-host adversarial evidence is retained without relabeling:
|
- [x] Installed-host adversarial evidence is retained without relabeling:
|
||||||
v1 **failed**; immutable v2 **failed** even though QA passed because the
|
v1 **failed**; immutable v2 **failed** even though QA passed because the
|
||||||
classifier produced false negatives for debug, review, and ship; v3 offline
|
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
|
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
|
inspection. Do not retry or relabel it. The six hosts remain **Verified at
|
||||||
the installer layer only**; representative UI/process coverage is incomplete.
|
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;
|
- [ ] Finish final evidence-linked disposition for every infrastructure item;
|
||||||
see the 25-row table in [ARCHITECTURE.md](./ARCHITECTURE.md). Current focused
|
see the 25-row table in [ARCHITECTURE.md](./ARCHITECTURE.md). Current focused
|
||||||
evidence does not replace the remaining live gates.
|
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 |
|
| 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 |
|
| 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 |
|
| 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 |
|
| 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
|
## Interpretation rules
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
# GStack 2.0 test evidence
|
# 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
|
These results describe the working tree at the documentation checkpoint. They
|
||||||
are deliberately narrower than the P0 release matrix. Commands that need a
|
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 |
|
| 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. |
|
| 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 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. |
|
| `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. |
|
| 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. |
|
| 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. |
|
| `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. |
|
| 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. |
|
| 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. |
|
||||||
| 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. |
|
| 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. |
|
| 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). |
|
| `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). |
|
| 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)
|
local browser live journey + cancellation/leak cleanup (passed)
|
||||||
PDF strict + diagram suites
|
PDF strict + diagram suites
|
||||||
Context.dev verified-key public-page smoke
|
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
|
upgrade/fail/recover/rollback/uninstall end-to-end
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|||||||
@@ -6,11 +6,15 @@ remains Markdown-only; runtime dependencies are never smuggled into that path.
|
|||||||
|
|
||||||
## Skill updates
|
## Skill updates
|
||||||
|
|
||||||
Install and update the canonical Agent Skills source with the same standard
|
Install the canonical Agent Skills source, then use that installer's tracked
|
||||||
installer that placed it:
|
source and lock metadata for discovery, updates, and removal:
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
npx skills add time-attack/gstack
|
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
|
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
|
re-detect hosts during an update or enroll a host/skill the user did not
|
||||||
previously select.
|
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
|
Before accepting an update, list the source and confirm that the defaults are
|
||||||
still exactly `plan`, `design`, `qa`, `debug`, `review`, and `ship`. Pure
|
still exactly `plan`, `design`, `qa`, `debug`, `review`, and `ship`. Pure
|
||||||
judgment must remain usable even if the optional runtime update fails.
|
judgment must remain usable even if the optional runtime update fails.
|
||||||
|
|||||||
@@ -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.
|
||||||
@@ -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
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -9,7 +9,7 @@
|
|||||||
"source_path": "autoplan/SKILL.md.tmpl",
|
"source_path": "autoplan/SKILL.md.tmpl",
|
||||||
"base_sha": "bb57306d98c97011b0919c6132705a15b1579781",
|
"base_sha": "bb57306d98c97011b0919c6132705a15b1579781",
|
||||||
"blob_sha": "b2eaca9fde8f46001bea9961b8ed651d0f6f9e13",
|
"blob_sha": "b2eaca9fde8f46001bea9961b8ed651d0f6f9e13",
|
||||||
"normalized_render_sha256": "706dd2fb1b3f3c7e6f446b268bd5a513fc7d2560ca12f702d670907402843a11",
|
"normalized_render_sha256": "b11bef3e060400cd59a16e41c9b6f8395ace065867a1c2a70329319153a2c4dc",
|
||||||
"target": "skills/plan/references/legacy/autoplan.md",
|
"target": "skills/plan/references/legacy/autoplan.md",
|
||||||
"overlays": [
|
"overlays": [
|
||||||
679,
|
679,
|
||||||
|
|||||||
@@ -9,7 +9,7 @@
|
|||||||
"source_path": "benchmark-models/SKILL.md.tmpl",
|
"source_path": "benchmark-models/SKILL.md.tmpl",
|
||||||
"base_sha": "bb57306d98c97011b0919c6132705a15b1579781",
|
"base_sha": "bb57306d98c97011b0919c6132705a15b1579781",
|
||||||
"blob_sha": "034cda182406dc04a82c4336ac3ebc36b5fc41b1",
|
"blob_sha": "034cda182406dc04a82c4336ac3ebc36b5fc41b1",
|
||||||
"normalized_render_sha256": "d67d1f22c7f65c286a905ec60143d057e3b8b29a548ac53a88272b886ef26b31",
|
"normalized_render_sha256": "2ef0679d45f21bacc09cd774ff96bb3b82853a8e89d8606847c4f9416a47a48b",
|
||||||
"target": "skills/qa/references/legacy/benchmark-models.md",
|
"target": "skills/qa/references/legacy/benchmark-models.md",
|
||||||
"overlays": [
|
"overlays": [
|
||||||
679
|
679
|
||||||
|
|||||||
@@ -9,7 +9,7 @@
|
|||||||
"source_path": "benchmark/SKILL.md.tmpl",
|
"source_path": "benchmark/SKILL.md.tmpl",
|
||||||
"base_sha": "bb57306d98c97011b0919c6132705a15b1579781",
|
"base_sha": "bb57306d98c97011b0919c6132705a15b1579781",
|
||||||
"blob_sha": "038f16f5fba4ae4e9eae922e3276bba8ef88149e",
|
"blob_sha": "038f16f5fba4ae4e9eae922e3276bba8ef88149e",
|
||||||
"normalized_render_sha256": "c579dad9e78a12bf7547a6dd752daaa3299c66c55d8170290c075caa5d1fa660",
|
"normalized_render_sha256": "a4554b8b139ee95c9f25c2e747f9e2214b2f0db64401057529e5ec775be323cd",
|
||||||
"target": "skills/qa/references/legacy/benchmark.md",
|
"target": "skills/qa/references/legacy/benchmark.md",
|
||||||
"overlays": [
|
"overlays": [
|
||||||
679
|
679
|
||||||
|
|||||||
@@ -9,7 +9,7 @@
|
|||||||
"source_path": "browse/SKILL.md.tmpl",
|
"source_path": "browse/SKILL.md.tmpl",
|
||||||
"base_sha": "bb57306d98c97011b0919c6132705a15b1579781",
|
"base_sha": "bb57306d98c97011b0919c6132705a15b1579781",
|
||||||
"blob_sha": "9a159e4c9820172c229e2174d4a62a8f9668ab93",
|
"blob_sha": "9a159e4c9820172c229e2174d4a62a8f9668ab93",
|
||||||
"normalized_render_sha256": "9d5a75a6e20d40bf2d275ca39375899bb6c51abd4e8ce1042e8db4450e891196",
|
"normalized_render_sha256": "b7fd526a00444003cad654abb15c2d17606cc5295f38533754e95108038d3467",
|
||||||
"target": "skills/qa/references/legacy/browse.md",
|
"target": "skills/qa/references/legacy/browse.md",
|
||||||
"overlays": [
|
"overlays": [
|
||||||
679,
|
679,
|
||||||
|
|||||||
@@ -9,7 +9,7 @@
|
|||||||
"source_path": "canary/SKILL.md.tmpl",
|
"source_path": "canary/SKILL.md.tmpl",
|
||||||
"base_sha": "bb57306d98c97011b0919c6132705a15b1579781",
|
"base_sha": "bb57306d98c97011b0919c6132705a15b1579781",
|
||||||
"blob_sha": "d1eb2950aba2fa2b09d90f13143492c60d46793c",
|
"blob_sha": "d1eb2950aba2fa2b09d90f13143492c60d46793c",
|
||||||
"normalized_render_sha256": "551c32a7bbbdc5dec6f88751e885869df9d1a26286df233cb78b51beb2e0987a",
|
"normalized_render_sha256": "329b61120f60893d023533cbc493389d1c7476819fb785422de0e7d34e0c2c0b",
|
||||||
"target": "skills/qa/references/legacy/canary.md",
|
"target": "skills/qa/references/legacy/canary.md",
|
||||||
"overlays": [
|
"overlays": [
|
||||||
679,
|
679,
|
||||||
|
|||||||
@@ -9,7 +9,7 @@
|
|||||||
"source_path": "careful/SKILL.md.tmpl",
|
"source_path": "careful/SKILL.md.tmpl",
|
||||||
"base_sha": "bb57306d98c97011b0919c6132705a15b1579781",
|
"base_sha": "bb57306d98c97011b0919c6132705a15b1579781",
|
||||||
"blob_sha": "5c128a00e180bec4fad281486d3ca8c02dc67e7e",
|
"blob_sha": "5c128a00e180bec4fad281486d3ca8c02dc67e7e",
|
||||||
"normalized_render_sha256": "9c806d1102794aeab5c83990c72dcadc7bdad7134f3962da5609ab13bc7feb0f",
|
"normalized_render_sha256": "f5fe3aa0755e04ad328ed67a4e42c21d9f9b5509167a69d91158a59cce8111ea",
|
||||||
"target": "skills/debug/references/legacy/careful.md",
|
"target": "skills/debug/references/legacy/careful.md",
|
||||||
"overlays": [
|
"overlays": [
|
||||||
679
|
679
|
||||||
|
|||||||
@@ -9,7 +9,7 @@
|
|||||||
"source_path": "claude/SKILL.md.tmpl",
|
"source_path": "claude/SKILL.md.tmpl",
|
||||||
"base_sha": "bb57306d98c97011b0919c6132705a15b1579781",
|
"base_sha": "bb57306d98c97011b0919c6132705a15b1579781",
|
||||||
"blob_sha": "94552cbe4efebc908f70f03880e584879db80aca",
|
"blob_sha": "94552cbe4efebc908f70f03880e584879db80aca",
|
||||||
"normalized_render_sha256": "f8b5964bf630d0716ad5cfd729f6d4e62bb89d4eab64a210090fb0e875f0b59d",
|
"normalized_render_sha256": "e0257ec3df4432da9b0fb10e6af66da8ed15548a3fae987778fc14a6747f4b30",
|
||||||
"target": "skills/review/references/legacy/claude.md",
|
"target": "skills/review/references/legacy/claude.md",
|
||||||
"overlays": [
|
"overlays": [
|
||||||
679
|
679
|
||||||
|
|||||||
@@ -9,7 +9,7 @@
|
|||||||
"source_path": "codex/SKILL.md.tmpl",
|
"source_path": "codex/SKILL.md.tmpl",
|
||||||
"base_sha": "bb57306d98c97011b0919c6132705a15b1579781",
|
"base_sha": "bb57306d98c97011b0919c6132705a15b1579781",
|
||||||
"blob_sha": "333de7d8d590cc78184b0e2371171f6121408f73",
|
"blob_sha": "333de7d8d590cc78184b0e2371171f6121408f73",
|
||||||
"normalized_render_sha256": "5621d3e33242350806eb3489b5c933c5ebaa5105f250e941c4205962c447b28d",
|
"normalized_render_sha256": "0df6ff685d230f87763b4c43f957e20854fe1319d78247d683e5250e2accb188",
|
||||||
"target": "skills/review/references/legacy/codex.md",
|
"target": "skills/review/references/legacy/codex.md",
|
||||||
"overlays": [
|
"overlays": [
|
||||||
679
|
679
|
||||||
|
|||||||
@@ -9,7 +9,7 @@
|
|||||||
"source_path": "context-restore/SKILL.md.tmpl",
|
"source_path": "context-restore/SKILL.md.tmpl",
|
||||||
"base_sha": "bb57306d98c97011b0919c6132705a15b1579781",
|
"base_sha": "bb57306d98c97011b0919c6132705a15b1579781",
|
||||||
"blob_sha": "55889f6e06d3ba896f33a16969959c700bc24f1e",
|
"blob_sha": "55889f6e06d3ba896f33a16969959c700bc24f1e",
|
||||||
"normalized_render_sha256": "33b0cb3f2f23ef913eafd18b73c34aafe879c22cf7c23ceed7a5b5324ac79d3a",
|
"normalized_render_sha256": "c14726232c67616485c115dd7ca0898992bab9c7990629b40dc3b6f1c0dec0ee",
|
||||||
"target": "skills/plan/references/legacy/context-restore.md",
|
"target": "skills/plan/references/legacy/context-restore.md",
|
||||||
"overlays": [
|
"overlays": [
|
||||||
679
|
679
|
||||||
|
|||||||
@@ -9,7 +9,7 @@
|
|||||||
"source_path": "context-save/SKILL.md.tmpl",
|
"source_path": "context-save/SKILL.md.tmpl",
|
||||||
"base_sha": "bb57306d98c97011b0919c6132705a15b1579781",
|
"base_sha": "bb57306d98c97011b0919c6132705a15b1579781",
|
||||||
"blob_sha": "a3702bc95439cddd87841aba836708bf511ef55d",
|
"blob_sha": "a3702bc95439cddd87841aba836708bf511ef55d",
|
||||||
"normalized_render_sha256": "06a3ef8d7c9d361e7497252b69082ee51786ef4fd2bb62d9e7c5d97817bfdb0d",
|
"normalized_render_sha256": "348b840c60cecd8818d75f63ebb8e3effae659437137ce75c1ba6124177120b6",
|
||||||
"target": "skills/plan/references/legacy/context-save.md",
|
"target": "skills/plan/references/legacy/context-save.md",
|
||||||
"overlays": [
|
"overlays": [
|
||||||
679
|
679
|
||||||
|
|||||||
@@ -9,7 +9,7 @@
|
|||||||
"source_path": "cso/SKILL.md.tmpl",
|
"source_path": "cso/SKILL.md.tmpl",
|
||||||
"base_sha": "bb57306d98c97011b0919c6132705a15b1579781",
|
"base_sha": "bb57306d98c97011b0919c6132705a15b1579781",
|
||||||
"blob_sha": "413fb099597b55dadca116e45a202aa693a94b74",
|
"blob_sha": "413fb099597b55dadca116e45a202aa693a94b74",
|
||||||
"normalized_render_sha256": "59017ba27aaa93a62bda7ddca3c995f7231edb3fa86009e555b724b43fc1afd7",
|
"normalized_render_sha256": "2cecaf39e950a0ec848f85c11f9678b6a7644c0251c07be42cd52d4b2e6b61a6",
|
||||||
"target": "skills/review/references/legacy/cso.md",
|
"target": "skills/review/references/legacy/cso.md",
|
||||||
"overlays": [
|
"overlays": [
|
||||||
679,
|
679,
|
||||||
|
|||||||
@@ -9,7 +9,7 @@
|
|||||||
"source_path": "design-consultation/SKILL.md.tmpl",
|
"source_path": "design-consultation/SKILL.md.tmpl",
|
||||||
"base_sha": "bb57306d98c97011b0919c6132705a15b1579781",
|
"base_sha": "bb57306d98c97011b0919c6132705a15b1579781",
|
||||||
"blob_sha": "64af56ecdbd132cb7c28344e8e4ecb2e5dacf811",
|
"blob_sha": "64af56ecdbd132cb7c28344e8e4ecb2e5dacf811",
|
||||||
"normalized_render_sha256": "2753c3423f22f9ef2b3baf31069bd2ac6951e7bc69cc70f28c8da5c07580ab26",
|
"normalized_render_sha256": "afa1f2b58d22d9f0f9064336ce7e9836430a298e1deb56f5330390f91df3f680",
|
||||||
"target": "skills/design/references/legacy/design-consultation.md",
|
"target": "skills/design/references/legacy/design-consultation.md",
|
||||||
"overlays": [
|
"overlays": [
|
||||||
679,
|
679,
|
||||||
|
|||||||
@@ -9,7 +9,7 @@
|
|||||||
"source_path": "design-html/SKILL.md.tmpl",
|
"source_path": "design-html/SKILL.md.tmpl",
|
||||||
"base_sha": "bb57306d98c97011b0919c6132705a15b1579781",
|
"base_sha": "bb57306d98c97011b0919c6132705a15b1579781",
|
||||||
"blob_sha": "3cdec9a14d62d2e046ed924c972efc30a7d43aca",
|
"blob_sha": "3cdec9a14d62d2e046ed924c972efc30a7d43aca",
|
||||||
"normalized_render_sha256": "f6dd88ea765653cd49bac6479c8212977bb578afca4c900153a9c646c260b943",
|
"normalized_render_sha256": "cbb1b4357bedbb0fffe23c3e0ad31ee8c2a198a31443edb660e5c836e67e94e6",
|
||||||
"target": "skills/design/references/legacy/design-html.md",
|
"target": "skills/design/references/legacy/design-html.md",
|
||||||
"overlays": [
|
"overlays": [
|
||||||
679
|
679
|
||||||
|
|||||||
@@ -9,7 +9,7 @@
|
|||||||
"source_path": "design-review/SKILL.md.tmpl",
|
"source_path": "design-review/SKILL.md.tmpl",
|
||||||
"base_sha": "bb57306d98c97011b0919c6132705a15b1579781",
|
"base_sha": "bb57306d98c97011b0919c6132705a15b1579781",
|
||||||
"blob_sha": "bdcda48e29b489a1cc49faa333922412251d4b41",
|
"blob_sha": "bdcda48e29b489a1cc49faa333922412251d4b41",
|
||||||
"normalized_render_sha256": "8711f4910f9cb9d022d024c432093bccbcf8d4e74250a3a25f915eb086de6c5a",
|
"normalized_render_sha256": "33584047a11aa46a1b6a2bef5bf97a4d0b443bb6c9542685732e7d4dff795a2e",
|
||||||
"target": "skills/design/references/legacy/design-review.md",
|
"target": "skills/design/references/legacy/design-review.md",
|
||||||
"overlays": [
|
"overlays": [
|
||||||
679,
|
679,
|
||||||
|
|||||||
@@ -9,7 +9,7 @@
|
|||||||
"source_path": "design-shotgun/SKILL.md.tmpl",
|
"source_path": "design-shotgun/SKILL.md.tmpl",
|
||||||
"base_sha": "bb57306d98c97011b0919c6132705a15b1579781",
|
"base_sha": "bb57306d98c97011b0919c6132705a15b1579781",
|
||||||
"blob_sha": "230dbc2922f05bf272bf5168a958a12604fac1bc",
|
"blob_sha": "230dbc2922f05bf272bf5168a958a12604fac1bc",
|
||||||
"normalized_render_sha256": "2ffa676332b91cb2f4f0ae4a08d917dd43a767995b33d960895c15e93fb7c73c",
|
"normalized_render_sha256": "1db4cd23ee115ce841d2db898cc442141588635d43018393703aa28ce40d48f2",
|
||||||
"target": "skills/design/references/legacy/design-shotgun.md",
|
"target": "skills/design/references/legacy/design-shotgun.md",
|
||||||
"overlays": [
|
"overlays": [
|
||||||
679,
|
679,
|
||||||
|
|||||||
@@ -9,7 +9,7 @@
|
|||||||
"source_path": "devex-review/SKILL.md.tmpl",
|
"source_path": "devex-review/SKILL.md.tmpl",
|
||||||
"base_sha": "bb57306d98c97011b0919c6132705a15b1579781",
|
"base_sha": "bb57306d98c97011b0919c6132705a15b1579781",
|
||||||
"blob_sha": "081d4f35bbdec0c6b3da8ae71615ec4d41a84551",
|
"blob_sha": "081d4f35bbdec0c6b3da8ae71615ec4d41a84551",
|
||||||
"normalized_render_sha256": "849895ef49f7c855bfa819620e94d41da9909eb5baf214719b004130ecd741d6",
|
"normalized_render_sha256": "9fbc11b3fe252c281581512d67f6915c72e34bb2fdc7bc795e3077ee0e48d34e",
|
||||||
"target": "skills/qa/references/legacy/devex-review.md",
|
"target": "skills/qa/references/legacy/devex-review.md",
|
||||||
"overlays": [
|
"overlays": [
|
||||||
679,
|
679,
|
||||||
|
|||||||
@@ -9,7 +9,7 @@
|
|||||||
"source_path": "diagram/SKILL.md.tmpl",
|
"source_path": "diagram/SKILL.md.tmpl",
|
||||||
"base_sha": "bb57306d98c97011b0919c6132705a15b1579781",
|
"base_sha": "bb57306d98c97011b0919c6132705a15b1579781",
|
||||||
"blob_sha": "9e19a52c6b7f727ce4faf5c1f9c14514ecb52f50",
|
"blob_sha": "9e19a52c6b7f727ce4faf5c1f9c14514ecb52f50",
|
||||||
"normalized_render_sha256": "88d1b8810d6ae95c6cf984825e2fe96712dfe4a7f7dba3e03d8a3634cf9e97ca",
|
"normalized_render_sha256": "21f18fa4957b79bf5941abfebd1b222dee3eb960520e0deac1c32d0b6fd62a38",
|
||||||
"target": "skills/design/references/legacy/diagram.md",
|
"target": "skills/design/references/legacy/diagram.md",
|
||||||
"overlays": [
|
"overlays": [
|
||||||
679
|
679
|
||||||
|
|||||||
@@ -9,7 +9,7 @@
|
|||||||
"source_path": "document-generate/SKILL.md.tmpl",
|
"source_path": "document-generate/SKILL.md.tmpl",
|
||||||
"base_sha": "bb57306d98c97011b0919c6132705a15b1579781",
|
"base_sha": "bb57306d98c97011b0919c6132705a15b1579781",
|
||||||
"blob_sha": "d3ef0cbc3786c4010b3c692fb94246f56a7e1d7b",
|
"blob_sha": "d3ef0cbc3786c4010b3c692fb94246f56a7e1d7b",
|
||||||
"normalized_render_sha256": "aa5092d5c96e73aa97bcebd200d08d2ce8abcaabae534711162d29444f780229",
|
"normalized_render_sha256": "71726ef3082b6c00a5cad19d28da4d830f8e9b261d213a7938c4e1ce3b8c54bb",
|
||||||
"target": "skills/ship/references/legacy/document-generate.md",
|
"target": "skills/ship/references/legacy/document-generate.md",
|
||||||
"overlays": [
|
"overlays": [
|
||||||
679
|
679
|
||||||
|
|||||||
@@ -9,7 +9,7 @@
|
|||||||
"source_path": "document-release/SKILL.md.tmpl",
|
"source_path": "document-release/SKILL.md.tmpl",
|
||||||
"base_sha": "bb57306d98c97011b0919c6132705a15b1579781",
|
"base_sha": "bb57306d98c97011b0919c6132705a15b1579781",
|
||||||
"blob_sha": "7621cb31290217b5c7cc8fb000e910b3dd38128f",
|
"blob_sha": "7621cb31290217b5c7cc8fb000e910b3dd38128f",
|
||||||
"normalized_render_sha256": "369c595ec2fac76f441d008401929295898e98a5c521d176bafbe4af0e6054f9",
|
"normalized_render_sha256": "e5aa85ac93b36b638d075d152f9d7108c0108727056f61331b25fe33de569a59",
|
||||||
"target": "skills/ship/references/legacy/document-release.md",
|
"target": "skills/ship/references/legacy/document-release.md",
|
||||||
"overlays": [
|
"overlays": [
|
||||||
679
|
679
|
||||||
|
|||||||
@@ -9,7 +9,7 @@
|
|||||||
"source_path": "freeze/SKILL.md.tmpl",
|
"source_path": "freeze/SKILL.md.tmpl",
|
||||||
"base_sha": "bb57306d98c97011b0919c6132705a15b1579781",
|
"base_sha": "bb57306d98c97011b0919c6132705a15b1579781",
|
||||||
"blob_sha": "c0b31aa7f9f216fc5a351d91f4bcff68c828d090",
|
"blob_sha": "c0b31aa7f9f216fc5a351d91f4bcff68c828d090",
|
||||||
"normalized_render_sha256": "8beec3080fd0d6566b6ecf188d110d7283fb808fbc7c7201ee234191f9d3c5cd",
|
"normalized_render_sha256": "433bb7c1909852c83978ae282c582590c5136abe56020e7d0be39749822c345b",
|
||||||
"target": "skills/debug/references/legacy/freeze.md",
|
"target": "skills/debug/references/legacy/freeze.md",
|
||||||
"overlays": [
|
"overlays": [
|
||||||
679
|
679
|
||||||
|
|||||||
@@ -9,7 +9,7 @@
|
|||||||
"source_path": "SKILL.md.tmpl",
|
"source_path": "SKILL.md.tmpl",
|
||||||
"base_sha": "bb57306d98c97011b0919c6132705a15b1579781",
|
"base_sha": "bb57306d98c97011b0919c6132705a15b1579781",
|
||||||
"blob_sha": "402bd0d7b0f2bf02f6c9e4754e0e2a655f5f4057",
|
"blob_sha": "402bd0d7b0f2bf02f6c9e4754e0e2a655f5f4057",
|
||||||
"normalized_render_sha256": "8e28cf7aa8c1c858ffaa4936d05a66bd4522bd6c6438be719f569b01c5afbcd8",
|
"normalized_render_sha256": "daa2b069d1945c1e1bf8eef23417899b4eacb98087f6c146c0b726eb21fd2776",
|
||||||
"target": "skills/plan/references/legacy/gstack.md",
|
"target": "skills/plan/references/legacy/gstack.md",
|
||||||
"overlays": [
|
"overlays": [
|
||||||
679
|
679
|
||||||
|
|||||||
@@ -9,7 +9,7 @@
|
|||||||
"source_path": "guard/SKILL.md.tmpl",
|
"source_path": "guard/SKILL.md.tmpl",
|
||||||
"base_sha": "bb57306d98c97011b0919c6132705a15b1579781",
|
"base_sha": "bb57306d98c97011b0919c6132705a15b1579781",
|
||||||
"blob_sha": "3d34ee0c181ec7b263bf6092ba8f384619c5efb6",
|
"blob_sha": "3d34ee0c181ec7b263bf6092ba8f384619c5efb6",
|
||||||
"normalized_render_sha256": "2040b2d9c7e587f254296abb394c655da37fe25305f4e44dc2d736053595cdfb",
|
"normalized_render_sha256": "ff8170babcc9ad20f6de292db838d2c4545f0ed98dddd184ab5e7c52c073dc7e",
|
||||||
"target": "skills/debug/references/legacy/guard.md",
|
"target": "skills/debug/references/legacy/guard.md",
|
||||||
"overlays": [
|
"overlays": [
|
||||||
679
|
679
|
||||||
|
|||||||
@@ -9,7 +9,7 @@
|
|||||||
"source_path": "health/SKILL.md.tmpl",
|
"source_path": "health/SKILL.md.tmpl",
|
||||||
"base_sha": "bb57306d98c97011b0919c6132705a15b1579781",
|
"base_sha": "bb57306d98c97011b0919c6132705a15b1579781",
|
||||||
"blob_sha": "f92eb7347ec4f77dd8dbf464d63fcdf6a3459908",
|
"blob_sha": "f92eb7347ec4f77dd8dbf464d63fcdf6a3459908",
|
||||||
"normalized_render_sha256": "3e478e5673d54ce0e227e589ab0800bd14de65cb8df4e12661e330b57018465c",
|
"normalized_render_sha256": "ff664221e7de57e66c1b45d719982d90f38e0288914b34731ba4dd73541347e8",
|
||||||
"target": "skills/review/references/legacy/health.md",
|
"target": "skills/review/references/legacy/health.md",
|
||||||
"overlays": [
|
"overlays": [
|
||||||
679
|
679
|
||||||
|
|||||||
@@ -9,7 +9,7 @@
|
|||||||
"source_path": "investigate/SKILL.md.tmpl",
|
"source_path": "investigate/SKILL.md.tmpl",
|
||||||
"base_sha": "bb57306d98c97011b0919c6132705a15b1579781",
|
"base_sha": "bb57306d98c97011b0919c6132705a15b1579781",
|
||||||
"blob_sha": "67e254d743ffb9060f48e3f6d4b715c077ee688d",
|
"blob_sha": "67e254d743ffb9060f48e3f6d4b715c077ee688d",
|
||||||
"normalized_render_sha256": "23e220a2d61b665f9e48b094855336fac3ca9187be12675cb721db2bc27f7c30",
|
"normalized_render_sha256": "91f19c8d736a9a6077941f63f52853634325059e5ac4d8808c4ba6dbceca1a30",
|
||||||
"target": "skills/debug/references/legacy/investigate.md",
|
"target": "skills/debug/references/legacy/investigate.md",
|
||||||
"overlays": [
|
"overlays": [
|
||||||
679,
|
679,
|
||||||
|
|||||||
@@ -9,7 +9,7 @@
|
|||||||
"source_path": "ios-clean/SKILL.md.tmpl",
|
"source_path": "ios-clean/SKILL.md.tmpl",
|
||||||
"base_sha": "bb57306d98c97011b0919c6132705a15b1579781",
|
"base_sha": "bb57306d98c97011b0919c6132705a15b1579781",
|
||||||
"blob_sha": "3a64481a99fab0d7247c23df0a07c428c1c5f3da",
|
"blob_sha": "3a64481a99fab0d7247c23df0a07c428c1c5f3da",
|
||||||
"normalized_render_sha256": "4616b4a2f3def37440add4010a89426e85bd3f2786fd71d199063a60ce073615",
|
"normalized_render_sha256": "6a0080b7678f9e1df7ae2da27c4a7e3e85e7bfb83525a2c5651c24c0ab024b4b",
|
||||||
"target": "skills/ship/references/legacy/ios-clean.md",
|
"target": "skills/ship/references/legacy/ios-clean.md",
|
||||||
"overlays": [
|
"overlays": [
|
||||||
679
|
679
|
||||||
|
|||||||
@@ -9,7 +9,7 @@
|
|||||||
"source_path": "ios-design-review/SKILL.md.tmpl",
|
"source_path": "ios-design-review/SKILL.md.tmpl",
|
||||||
"base_sha": "bb57306d98c97011b0919c6132705a15b1579781",
|
"base_sha": "bb57306d98c97011b0919c6132705a15b1579781",
|
||||||
"blob_sha": "dd9e2518f53edf939a1e425806abc871a9b33022",
|
"blob_sha": "dd9e2518f53edf939a1e425806abc871a9b33022",
|
||||||
"normalized_render_sha256": "38bb6ba7876611f5ae63566820f67a48f9b1797c33d000c866540a4e6f766d50",
|
"normalized_render_sha256": "53741f7f044faa413f1725bada27514d2528d834f327e83f040de67668d24dae",
|
||||||
"target": "skills/design/references/legacy/ios-design-review.md",
|
"target": "skills/design/references/legacy/ios-design-review.md",
|
||||||
"overlays": [
|
"overlays": [
|
||||||
679
|
679
|
||||||
|
|||||||
@@ -9,7 +9,7 @@
|
|||||||
"source_path": "ios-fix/SKILL.md.tmpl",
|
"source_path": "ios-fix/SKILL.md.tmpl",
|
||||||
"base_sha": "bb57306d98c97011b0919c6132705a15b1579781",
|
"base_sha": "bb57306d98c97011b0919c6132705a15b1579781",
|
||||||
"blob_sha": "94655e282f535b846eada11143e95df58d29263b",
|
"blob_sha": "94655e282f535b846eada11143e95df58d29263b",
|
||||||
"normalized_render_sha256": "1a94ad8852821684d4806b10c5464f7adef80cb28817800f1e88dfe808f0a26d",
|
"normalized_render_sha256": "cc38b71471c1fefc015419e768c5b40f060f03b232cbad850cd7d9c985a6cc90",
|
||||||
"target": "skills/debug/references/legacy/ios-fix.md",
|
"target": "skills/debug/references/legacy/ios-fix.md",
|
||||||
"overlays": [
|
"overlays": [
|
||||||
679
|
679
|
||||||
|
|||||||
@@ -9,7 +9,7 @@
|
|||||||
"source_path": "ios-qa/SKILL.md.tmpl",
|
"source_path": "ios-qa/SKILL.md.tmpl",
|
||||||
"base_sha": "bb57306d98c97011b0919c6132705a15b1579781",
|
"base_sha": "bb57306d98c97011b0919c6132705a15b1579781",
|
||||||
"blob_sha": "e93d2831a31df65ec8e4e8693919ef5bf148457f",
|
"blob_sha": "e93d2831a31df65ec8e4e8693919ef5bf148457f",
|
||||||
"normalized_render_sha256": "37b9baf014dcfa6ed3266ae3241dad17956a0b6b3f332dc44bdb728daa3c8f01",
|
"normalized_render_sha256": "a9353a4d837240f85c0e13144e66575f9e267926090cfc0f344a08b5fb09b98c",
|
||||||
"target": "skills/qa/references/legacy/ios-qa.md",
|
"target": "skills/qa/references/legacy/ios-qa.md",
|
||||||
"overlays": [
|
"overlays": [
|
||||||
679
|
679
|
||||||
|
|||||||
@@ -9,7 +9,7 @@
|
|||||||
"source_path": "ios-sync/SKILL.md.tmpl",
|
"source_path": "ios-sync/SKILL.md.tmpl",
|
||||||
"base_sha": "bb57306d98c97011b0919c6132705a15b1579781",
|
"base_sha": "bb57306d98c97011b0919c6132705a15b1579781",
|
||||||
"blob_sha": "156a33c4c35d3bad804e44c93ae4c931878489f3",
|
"blob_sha": "156a33c4c35d3bad804e44c93ae4c931878489f3",
|
||||||
"normalized_render_sha256": "6d1fa485d589dff65412cdd855b683f09cb442e35b8a40ee0db3451241016ea9",
|
"normalized_render_sha256": "c51e8865876efae833e92d54b37780afd4fa6240c13231dfb7d4635948fbc73f",
|
||||||
"target": "skills/ship/references/legacy/ios-sync.md",
|
"target": "skills/ship/references/legacy/ios-sync.md",
|
||||||
"overlays": [
|
"overlays": [
|
||||||
679
|
679
|
||||||
|
|||||||
@@ -9,7 +9,7 @@
|
|||||||
"source_path": "land-and-deploy/SKILL.md.tmpl",
|
"source_path": "land-and-deploy/SKILL.md.tmpl",
|
||||||
"base_sha": "bb57306d98c97011b0919c6132705a15b1579781",
|
"base_sha": "bb57306d98c97011b0919c6132705a15b1579781",
|
||||||
"blob_sha": "98976ad020d541d251cc7e34802a13458ddc88e2",
|
"blob_sha": "98976ad020d541d251cc7e34802a13458ddc88e2",
|
||||||
"normalized_render_sha256": "d17a1d9f397b57f59c5cced24c07c35e3950050612dba9c36bb68c4997f03a2f",
|
"normalized_render_sha256": "3fab0678a9a7a76664330c74db2bd25b56c335ac72ce4e691c2f2564a7ede819",
|
||||||
"target": "skills/ship/references/legacy/land-and-deploy.md",
|
"target": "skills/ship/references/legacy/land-and-deploy.md",
|
||||||
"overlays": [
|
"overlays": [
|
||||||
679,
|
679,
|
||||||
|
|||||||
@@ -9,7 +9,7 @@
|
|||||||
"source_path": "landing-report/SKILL.md.tmpl",
|
"source_path": "landing-report/SKILL.md.tmpl",
|
||||||
"base_sha": "bb57306d98c97011b0919c6132705a15b1579781",
|
"base_sha": "bb57306d98c97011b0919c6132705a15b1579781",
|
||||||
"blob_sha": "32a8cc1ab036b1ff8692f0400b68d8b56224a251",
|
"blob_sha": "32a8cc1ab036b1ff8692f0400b68d8b56224a251",
|
||||||
"normalized_render_sha256": "64c9e05978be3c8d900dc9b9b4dd77e495776718d77e7b926ff6c5250b825a01",
|
"normalized_render_sha256": "4f9512bafcfd995c4c35cdff869ed60f8a9a9ef12f20bc18bf7b898cbd2faa53",
|
||||||
"target": "skills/ship/references/legacy/landing-report.md",
|
"target": "skills/ship/references/legacy/landing-report.md",
|
||||||
"overlays": [
|
"overlays": [
|
||||||
679
|
679
|
||||||
|
|||||||
@@ -9,7 +9,7 @@
|
|||||||
"source_path": "learn/SKILL.md.tmpl",
|
"source_path": "learn/SKILL.md.tmpl",
|
||||||
"base_sha": "bb57306d98c97011b0919c6132705a15b1579781",
|
"base_sha": "bb57306d98c97011b0919c6132705a15b1579781",
|
||||||
"blob_sha": "90d08d2298cccd0d5090f194a2cd76a5361b4323",
|
"blob_sha": "90d08d2298cccd0d5090f194a2cd76a5361b4323",
|
||||||
"normalized_render_sha256": "0a155c2ed222aeb6d730583f4f9ce27ad6ad6c917a0bf583079da39a10e148d8",
|
"normalized_render_sha256": "0d1bbdf1bba2eaae206a350d47fb25ab50d49611262cb376861e83f78822f762",
|
||||||
"target": "skills/plan/references/legacy/learn.md",
|
"target": "skills/plan/references/legacy/learn.md",
|
||||||
"overlays": [
|
"overlays": [
|
||||||
679,
|
679,
|
||||||
|
|||||||
@@ -9,7 +9,7 @@
|
|||||||
"source_path": "make-pdf/SKILL.md.tmpl",
|
"source_path": "make-pdf/SKILL.md.tmpl",
|
||||||
"base_sha": "bb57306d98c97011b0919c6132705a15b1579781",
|
"base_sha": "bb57306d98c97011b0919c6132705a15b1579781",
|
||||||
"blob_sha": "9133a711d4f3d056a21f790e8ec3b98f13fbaa50",
|
"blob_sha": "9133a711d4f3d056a21f790e8ec3b98f13fbaa50",
|
||||||
"normalized_render_sha256": "7901a455bf36750224e05468d0123c32e8b9bc98c7334fb0973228bdbba80997",
|
"normalized_render_sha256": "c092bc644ff9b8929d9cbdfedb6f2761b40ce8e1fca53d13ad350ba91195104d",
|
||||||
"target": "skills/design/references/legacy/make-pdf.md",
|
"target": "skills/design/references/legacy/make-pdf.md",
|
||||||
"overlays": [
|
"overlays": [
|
||||||
679
|
679
|
||||||
|
|||||||
@@ -9,7 +9,7 @@
|
|||||||
"source_path": "office-hours/SKILL.md.tmpl",
|
"source_path": "office-hours/SKILL.md.tmpl",
|
||||||
"base_sha": "bb57306d98c97011b0919c6132705a15b1579781",
|
"base_sha": "bb57306d98c97011b0919c6132705a15b1579781",
|
||||||
"blob_sha": "8568fe73cca76a80805fab3092cacd10db7e1d7f",
|
"blob_sha": "8568fe73cca76a80805fab3092cacd10db7e1d7f",
|
||||||
"normalized_render_sha256": "0f0017a3752dd58d013c11d4d19af956724b6eeea89899f045dc3f41a3aa89b1",
|
"normalized_render_sha256": "b633a6ef87928ca2434f3a2b1ce88946cbe528a9e3659469e0f9cbbe8a7b146b",
|
||||||
"target": "skills/plan/references/legacy/office-hours.md",
|
"target": "skills/plan/references/legacy/office-hours.md",
|
||||||
"overlays": [
|
"overlays": [
|
||||||
679,
|
679,
|
||||||
|
|||||||
@@ -9,7 +9,7 @@
|
|||||||
"source_path": "open-gstack-browser/SKILL.md.tmpl",
|
"source_path": "open-gstack-browser/SKILL.md.tmpl",
|
||||||
"base_sha": "bb57306d98c97011b0919c6132705a15b1579781",
|
"base_sha": "bb57306d98c97011b0919c6132705a15b1579781",
|
||||||
"blob_sha": "ef91a527890a3ac3622cc7dc84bad1ff7b64443b",
|
"blob_sha": "ef91a527890a3ac3622cc7dc84bad1ff7b64443b",
|
||||||
"normalized_render_sha256": "54c16f55549393a6a2080c5d3f4c0055ce92ca63bdb3966965d96ec5cae3f405",
|
"normalized_render_sha256": "9e4a08db3e17badfc67703f7c5e66f80a7f05e0b96fad31fc48b8216964d7449",
|
||||||
"target": "skills/qa/references/legacy/open-gstack-browser.md",
|
"target": "skills/qa/references/legacy/open-gstack-browser.md",
|
||||||
"overlays": [
|
"overlays": [
|
||||||
679
|
679
|
||||||
|
|||||||
@@ -9,7 +9,7 @@
|
|||||||
"source_path": "pair-agent/SKILL.md.tmpl",
|
"source_path": "pair-agent/SKILL.md.tmpl",
|
||||||
"base_sha": "bb57306d98c97011b0919c6132705a15b1579781",
|
"base_sha": "bb57306d98c97011b0919c6132705a15b1579781",
|
||||||
"blob_sha": "75ed42d590f99c46cd0883c37bb1f2f9f499211c",
|
"blob_sha": "75ed42d590f99c46cd0883c37bb1f2f9f499211c",
|
||||||
"normalized_render_sha256": "27e34ef8e4157d94866d5f0c8ab9aff747483d86acd9702bf721cfb8962c07e5",
|
"normalized_render_sha256": "6882bc549c689ff50fb06d5e72a597939aa651926c50067330d1e6fd86cd6b58",
|
||||||
"target": "skills/qa/references/legacy/pair-agent.md",
|
"target": "skills/qa/references/legacy/pair-agent.md",
|
||||||
"overlays": [
|
"overlays": [
|
||||||
679
|
679
|
||||||
|
|||||||
@@ -9,7 +9,7 @@
|
|||||||
"source_path": "plan-ceo-review/SKILL.md.tmpl",
|
"source_path": "plan-ceo-review/SKILL.md.tmpl",
|
||||||
"base_sha": "bb57306d98c97011b0919c6132705a15b1579781",
|
"base_sha": "bb57306d98c97011b0919c6132705a15b1579781",
|
||||||
"blob_sha": "c43cfe64146fe79df74a974f1673fe36defcce00",
|
"blob_sha": "c43cfe64146fe79df74a974f1673fe36defcce00",
|
||||||
"normalized_render_sha256": "eb1199228d8db2107eb7c4cbf889e2116117fcd54e63d5e2b9eceddacbc3bb50",
|
"normalized_render_sha256": "b2f811568920dfdbd500372df13855041ecb2b8b73e3629f3c71d87c5a78e034",
|
||||||
"target": "skills/plan/references/legacy/plan-ceo-review.md",
|
"target": "skills/plan/references/legacy/plan-ceo-review.md",
|
||||||
"overlays": [
|
"overlays": [
|
||||||
679,
|
679,
|
||||||
|
|||||||
@@ -9,7 +9,7 @@
|
|||||||
"source_path": "plan-design-review/SKILL.md.tmpl",
|
"source_path": "plan-design-review/SKILL.md.tmpl",
|
||||||
"base_sha": "bb57306d98c97011b0919c6132705a15b1579781",
|
"base_sha": "bb57306d98c97011b0919c6132705a15b1579781",
|
||||||
"blob_sha": "7178c991e41277410de500298cf81372543861af",
|
"blob_sha": "7178c991e41277410de500298cf81372543861af",
|
||||||
"normalized_render_sha256": "05fdb5d63dc6007307c74493f0597251fb9d203b310f7c80b5921b94666f3d99",
|
"normalized_render_sha256": "2f7a5d113c466d75ca4524e424c072044d92ae7ab93009f1fbe3ae5965e8aa34",
|
||||||
"target": "skills/design/references/legacy/plan-design-review.md",
|
"target": "skills/design/references/legacy/plan-design-review.md",
|
||||||
"overlays": [
|
"overlays": [
|
||||||
679,
|
679,
|
||||||
|
|||||||
@@ -9,7 +9,7 @@
|
|||||||
"source_path": "plan-devex-review/SKILL.md.tmpl",
|
"source_path": "plan-devex-review/SKILL.md.tmpl",
|
||||||
"base_sha": "bb57306d98c97011b0919c6132705a15b1579781",
|
"base_sha": "bb57306d98c97011b0919c6132705a15b1579781",
|
||||||
"blob_sha": "1ef723c10997a08ef87940daceb08bf8d60dd810",
|
"blob_sha": "1ef723c10997a08ef87940daceb08bf8d60dd810",
|
||||||
"normalized_render_sha256": "5be964b8b6e8ddf87df7b44bb7713e0c31a3de32cf261682793bc7db45c7cba1",
|
"normalized_render_sha256": "fff989dcab1f37d0c219378caef6b1e627c23c2537a717564be0d8567229bccc",
|
||||||
"target": "skills/plan/references/legacy/plan-devex-review.md",
|
"target": "skills/plan/references/legacy/plan-devex-review.md",
|
||||||
"overlays": [
|
"overlays": [
|
||||||
679,
|
679,
|
||||||
|
|||||||
@@ -9,7 +9,7 @@
|
|||||||
"source_path": "plan-eng-review/SKILL.md.tmpl",
|
"source_path": "plan-eng-review/SKILL.md.tmpl",
|
||||||
"base_sha": "bb57306d98c97011b0919c6132705a15b1579781",
|
"base_sha": "bb57306d98c97011b0919c6132705a15b1579781",
|
||||||
"blob_sha": "1d5be0e6f47f0896ee831b53c56818850b1dcfe4",
|
"blob_sha": "1d5be0e6f47f0896ee831b53c56818850b1dcfe4",
|
||||||
"normalized_render_sha256": "02dad060f44bffacc9cbc16532816930dbd0f2aa21466d0e97eaf36250a80833",
|
"normalized_render_sha256": "ee268f1d24769509b89b7db998372a773d9e7bc376306a68319af4f74c6fe713",
|
||||||
"target": "skills/plan/references/legacy/plan-eng-review.md",
|
"target": "skills/plan/references/legacy/plan-eng-review.md",
|
||||||
"overlays": [
|
"overlays": [
|
||||||
679,
|
679,
|
||||||
|
|||||||
@@ -9,7 +9,7 @@
|
|||||||
"source_path": "plan-tune/SKILL.md.tmpl",
|
"source_path": "plan-tune/SKILL.md.tmpl",
|
||||||
"base_sha": "bb57306d98c97011b0919c6132705a15b1579781",
|
"base_sha": "bb57306d98c97011b0919c6132705a15b1579781",
|
||||||
"blob_sha": "dc1214d4c023ed2b126aca8aedb4153b222e73c5",
|
"blob_sha": "dc1214d4c023ed2b126aca8aedb4153b222e73c5",
|
||||||
"normalized_render_sha256": "3b683319cf88f0d0b082654a45050d313d227fca16811aa1b859097a141f40f8",
|
"normalized_render_sha256": "306bbf971a2867e1f39cce82d64289d6c457bceb07439ddd6f4a3ff8f8ae5e9a",
|
||||||
"target": "skills/plan/references/legacy/plan-tune.md",
|
"target": "skills/plan/references/legacy/plan-tune.md",
|
||||||
"overlays": [
|
"overlays": [
|
||||||
679
|
679
|
||||||
|
|||||||
@@ -9,7 +9,7 @@
|
|||||||
"source_path": "qa-only/SKILL.md.tmpl",
|
"source_path": "qa-only/SKILL.md.tmpl",
|
||||||
"base_sha": "bb57306d98c97011b0919c6132705a15b1579781",
|
"base_sha": "bb57306d98c97011b0919c6132705a15b1579781",
|
||||||
"blob_sha": "75c4123cc5c406ffdd36c71a094335c137135b1e",
|
"blob_sha": "75c4123cc5c406ffdd36c71a094335c137135b1e",
|
||||||
"normalized_render_sha256": "90f138a7ded37476397e3399ed686a92f9317161ba6e2256d6c7ed7c2893e273",
|
"normalized_render_sha256": "e360ea826399287e00b030c9aa0bcda16e06ab004f5dcdb14db309bad0ccea25",
|
||||||
"target": "skills/qa/references/legacy/qa-only.md",
|
"target": "skills/qa/references/legacy/qa-only.md",
|
||||||
"overlays": [
|
"overlays": [
|
||||||
679,
|
679,
|
||||||
|
|||||||
@@ -9,7 +9,7 @@
|
|||||||
"source_path": "qa/SKILL.md.tmpl",
|
"source_path": "qa/SKILL.md.tmpl",
|
||||||
"base_sha": "bb57306d98c97011b0919c6132705a15b1579781",
|
"base_sha": "bb57306d98c97011b0919c6132705a15b1579781",
|
||||||
"blob_sha": "11997f7b878282c34b6bfd3d4b7a8131f9ad4da8",
|
"blob_sha": "11997f7b878282c34b6bfd3d4b7a8131f9ad4da8",
|
||||||
"normalized_render_sha256": "025c1fbca58477248afb826cde24766904749129177e2bc60fbf2370207d1da5",
|
"normalized_render_sha256": "b1387290067842593297c8d64dc578a890a336ce5a8b60085e51b52c55ebaade",
|
||||||
"target": "skills/qa/references/legacy/qa.md",
|
"target": "skills/qa/references/legacy/qa.md",
|
||||||
"overlays": [
|
"overlays": [
|
||||||
679,
|
679,
|
||||||
|
|||||||
@@ -9,7 +9,7 @@
|
|||||||
"source_path": "retro/SKILL.md.tmpl",
|
"source_path": "retro/SKILL.md.tmpl",
|
||||||
"base_sha": "bb57306d98c97011b0919c6132705a15b1579781",
|
"base_sha": "bb57306d98c97011b0919c6132705a15b1579781",
|
||||||
"blob_sha": "b0819c8a6b736baf489179ba587442cf9973b9d2",
|
"blob_sha": "b0819c8a6b736baf489179ba587442cf9973b9d2",
|
||||||
"normalized_render_sha256": "3cfdcdab3560e38aa04d3079b6707080d3859cd05e4d4aecfb68267367d4e8f7",
|
"normalized_render_sha256": "c92e69da5c62e4bb5a426f4fb5623b41215e538315e2faebece8ba118cacaf71",
|
||||||
"target": "skills/plan/references/legacy/retro.md",
|
"target": "skills/plan/references/legacy/retro.md",
|
||||||
"overlays": [
|
"overlays": [
|
||||||
679,
|
679,
|
||||||
|
|||||||
@@ -9,7 +9,7 @@
|
|||||||
"source_path": "review/SKILL.md.tmpl",
|
"source_path": "review/SKILL.md.tmpl",
|
||||||
"base_sha": "bb57306d98c97011b0919c6132705a15b1579781",
|
"base_sha": "bb57306d98c97011b0919c6132705a15b1579781",
|
||||||
"blob_sha": "ba1ea88068de4b09cf717eb4ae42aa247d198314",
|
"blob_sha": "ba1ea88068de4b09cf717eb4ae42aa247d198314",
|
||||||
"normalized_render_sha256": "25e07cb6ea0831bd9e7bd7d4606714ba38b743107a970f2b6491a246b90c7dd4",
|
"normalized_render_sha256": "9d6398fe0d2900fcce8ae1eb0b390e21f05c94d6ae3a4e21c911025cdc1fd963",
|
||||||
"target": "skills/review/references/legacy/review.md",
|
"target": "skills/review/references/legacy/review.md",
|
||||||
"overlays": [
|
"overlays": [
|
||||||
610,
|
610,
|
||||||
|
|||||||
@@ -9,7 +9,7 @@
|
|||||||
"source_path": "scrape/SKILL.md.tmpl",
|
"source_path": "scrape/SKILL.md.tmpl",
|
||||||
"base_sha": "bb57306d98c97011b0919c6132705a15b1579781",
|
"base_sha": "bb57306d98c97011b0919c6132705a15b1579781",
|
||||||
"blob_sha": "4cb4f17c074edcdce0bc8d133f19a6a739964851",
|
"blob_sha": "4cb4f17c074edcdce0bc8d133f19a6a739964851",
|
||||||
"normalized_render_sha256": "bc7d6ed483f239a45d137ca790c23f3c3add4aaab028ca4950e83e25936ebc79",
|
"normalized_render_sha256": "03ef708a4c9a1f3de961c48767617502c564690faa7240b3ca39b20496a17f98",
|
||||||
"target": "skills/qa/references/legacy/scrape.md",
|
"target": "skills/qa/references/legacy/scrape.md",
|
||||||
"overlays": [
|
"overlays": [
|
||||||
679,
|
679,
|
||||||
|
|||||||
@@ -9,7 +9,7 @@
|
|||||||
"source_path": "setup-browser-cookies/SKILL.md.tmpl",
|
"source_path": "setup-browser-cookies/SKILL.md.tmpl",
|
||||||
"base_sha": "bb57306d98c97011b0919c6132705a15b1579781",
|
"base_sha": "bb57306d98c97011b0919c6132705a15b1579781",
|
||||||
"blob_sha": "f812d9f56f27c32fb5f102083bbe418344c1a652",
|
"blob_sha": "f812d9f56f27c32fb5f102083bbe418344c1a652",
|
||||||
"normalized_render_sha256": "5e27829f87a537e233ac1d0b2fe96cfe21ad6263c70044d8672b1f14c83e7506",
|
"normalized_render_sha256": "8ab5dfb05136a637ce41067d9e50ade76c4a8b957587e4eab134eaa260b29ac3",
|
||||||
"target": "skills/qa/references/legacy/setup-browser-cookies.md",
|
"target": "skills/qa/references/legacy/setup-browser-cookies.md",
|
||||||
"overlays": [
|
"overlays": [
|
||||||
679
|
679
|
||||||
|
|||||||
@@ -9,7 +9,7 @@
|
|||||||
"source_path": "setup-deploy/SKILL.md.tmpl",
|
"source_path": "setup-deploy/SKILL.md.tmpl",
|
||||||
"base_sha": "bb57306d98c97011b0919c6132705a15b1579781",
|
"base_sha": "bb57306d98c97011b0919c6132705a15b1579781",
|
||||||
"blob_sha": "587a993c01b6964b5437534527f25368cc265ec9",
|
"blob_sha": "587a993c01b6964b5437534527f25368cc265ec9",
|
||||||
"normalized_render_sha256": "796e0aefff64a98a33fd93028247bf76b8073121487cae13b66ad3081f551a87",
|
"normalized_render_sha256": "6c5998d60249939fd09253e55f8e66338b2223083e8b3329df745553fbdeeda0",
|
||||||
"target": "skills/ship/references/legacy/setup-deploy.md",
|
"target": "skills/ship/references/legacy/setup-deploy.md",
|
||||||
"overlays": [
|
"overlays": [
|
||||||
679
|
679
|
||||||
|
|||||||
@@ -9,7 +9,7 @@
|
|||||||
"source_path": "setup-gbrain/SKILL.md.tmpl",
|
"source_path": "setup-gbrain/SKILL.md.tmpl",
|
||||||
"base_sha": "bb57306d98c97011b0919c6132705a15b1579781",
|
"base_sha": "bb57306d98c97011b0919c6132705a15b1579781",
|
||||||
"blob_sha": "f48581543b46ecf889f4f86fb7a0d9e75d0bd6ca",
|
"blob_sha": "f48581543b46ecf889f4f86fb7a0d9e75d0bd6ca",
|
||||||
"normalized_render_sha256": "3f87c1e0d75bd5c5cbe6848751271185e216b38945c93fddba7c7ac022fed982",
|
"normalized_render_sha256": "244ebee93e8871d59c1b0eac040bed362783e48a9b134171d743750ce9a59b29",
|
||||||
"target": "skills/plan/references/legacy/setup-gbrain.md",
|
"target": "skills/plan/references/legacy/setup-gbrain.md",
|
||||||
"overlays": [
|
"overlays": [
|
||||||
679
|
679
|
||||||
|
|||||||
@@ -9,7 +9,7 @@
|
|||||||
"source_path": "ship/SKILL.md.tmpl",
|
"source_path": "ship/SKILL.md.tmpl",
|
||||||
"base_sha": "bb57306d98c97011b0919c6132705a15b1579781",
|
"base_sha": "bb57306d98c97011b0919c6132705a15b1579781",
|
||||||
"blob_sha": "068ac4fe54bcb46572295d48263b11bd38fcde18",
|
"blob_sha": "068ac4fe54bcb46572295d48263b11bd38fcde18",
|
||||||
"normalized_render_sha256": "b2f1d5bc59ec1a35fb367cc242131dc288ca1c9cf1baa8cefe9165b45f9841bc",
|
"normalized_render_sha256": "ab7a7219653b0fc5cdad0bb2959394798bc50ae4db4dc24b76c0454dd1b1397a",
|
||||||
"target": "skills/ship/references/legacy/ship.md",
|
"target": "skills/ship/references/legacy/ship.md",
|
||||||
"overlays": [
|
"overlays": [
|
||||||
679,
|
679,
|
||||||
|
|||||||
@@ -9,7 +9,7 @@
|
|||||||
"source_path": "skillify/SKILL.md.tmpl",
|
"source_path": "skillify/SKILL.md.tmpl",
|
||||||
"base_sha": "bb57306d98c97011b0919c6132705a15b1579781",
|
"base_sha": "bb57306d98c97011b0919c6132705a15b1579781",
|
||||||
"blob_sha": "21fb2f503e3d40683fa782b21abf05a8f0fef69b",
|
"blob_sha": "21fb2f503e3d40683fa782b21abf05a8f0fef69b",
|
||||||
"normalized_render_sha256": "13920affe83c53e5d459a077b68433682fd6c445389bf2024d2e5f4d5a021994",
|
"normalized_render_sha256": "b0743c957157e19bd90b457fd3ac9d6924c3aedce969c10af8d7973c2bcd6c9f",
|
||||||
"target": "skills/qa/references/legacy/skillify.md",
|
"target": "skills/qa/references/legacy/skillify.md",
|
||||||
"overlays": [
|
"overlays": [
|
||||||
679,
|
679,
|
||||||
|
|||||||
@@ -9,7 +9,7 @@
|
|||||||
"source_path": "spec/SKILL.md.tmpl",
|
"source_path": "spec/SKILL.md.tmpl",
|
||||||
"base_sha": "bb57306d98c97011b0919c6132705a15b1579781",
|
"base_sha": "bb57306d98c97011b0919c6132705a15b1579781",
|
||||||
"blob_sha": "6c0c14e1b37e1e56d85427e9c8d080a6df908992",
|
"blob_sha": "6c0c14e1b37e1e56d85427e9c8d080a6df908992",
|
||||||
"normalized_render_sha256": "1693c430139d43e80d2981d95a61dc9d3674435690d5d838f4ca92f4d592694a",
|
"normalized_render_sha256": "059ec7a95791f6fc559f4e2321d7340ef5ae7e4ba89949df401f74d91411bfd3",
|
||||||
"target": "skills/plan/references/legacy/spec.md",
|
"target": "skills/plan/references/legacy/spec.md",
|
||||||
"overlays": [
|
"overlays": [
|
||||||
679
|
679
|
||||||
|
|||||||
@@ -9,7 +9,7 @@
|
|||||||
"source_path": "sync-gbrain/SKILL.md.tmpl",
|
"source_path": "sync-gbrain/SKILL.md.tmpl",
|
||||||
"base_sha": "bb57306d98c97011b0919c6132705a15b1579781",
|
"base_sha": "bb57306d98c97011b0919c6132705a15b1579781",
|
||||||
"blob_sha": "2ec065472e263a07f3818ed87ee9a6a2e13ca3ae",
|
"blob_sha": "2ec065472e263a07f3818ed87ee9a6a2e13ca3ae",
|
||||||
"normalized_render_sha256": "b33fb4a5fadaf6bcf71363b4e8d9b1f3fd56336f47d23eb8e8594d534d76b55b",
|
"normalized_render_sha256": "175e7d0d2998bd4c8ddcd9a84228c41ba4a5cf3aca3a8bc09ddfc5a303c1df30",
|
||||||
"target": "skills/plan/references/legacy/sync-gbrain.md",
|
"target": "skills/plan/references/legacy/sync-gbrain.md",
|
||||||
"overlays": [
|
"overlays": [
|
||||||
679
|
679
|
||||||
|
|||||||
@@ -9,7 +9,7 @@
|
|||||||
"source_path": "unfreeze/SKILL.md.tmpl",
|
"source_path": "unfreeze/SKILL.md.tmpl",
|
||||||
"base_sha": "bb57306d98c97011b0919c6132705a15b1579781",
|
"base_sha": "bb57306d98c97011b0919c6132705a15b1579781",
|
||||||
"blob_sha": "88e413fe5a49a45d46d8867b2d80ace30b3b45aa",
|
"blob_sha": "88e413fe5a49a45d46d8867b2d80ace30b3b45aa",
|
||||||
"normalized_render_sha256": "9128912f4c79a423d4e52a7a27a9c560bf7ab58e85bcf32db1442f4ded6576ae",
|
"normalized_render_sha256": "51d6183901e866697382b7e900e2154e8bfb6a9ebf4f3e1bb3ad29925fad0e20",
|
||||||
"target": "skills/debug/references/legacy/unfreeze.md",
|
"target": "skills/debug/references/legacy/unfreeze.md",
|
||||||
"overlays": [
|
"overlays": [
|
||||||
679
|
679
|
||||||
|
|||||||
+434
-1124
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -58,21 +58,21 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"mechanical_port": {
|
"mechanical_port": {
|
||||||
"rendered_sha256": "eb1199228d8db2107eb7c4cbf889e2116117fcd54e63d5e2b9eceddacbc3bb50",
|
"rendered_sha256": "b2f811568920dfdbd500372df13855041ecb2b8b73e3629f3c71d87c5a78e034",
|
||||||
"differs_from_baseline": true,
|
"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": {
|
"candidate": {
|
||||||
"target_path": "skills/plan/references/legacy/plan-ceo-review.md",
|
"target_path": "skills/plan/references/legacy/plan-ceo-review.md",
|
||||||
"rendered_legacy_body_sha256": "eb1199228d8db2107eb7c4cbf889e2116117fcd54e63d5e2b9eceddacbc3bb50",
|
"rendered_legacy_body_sha256": "b2f811568920dfdbd500372df13855041ecb2b8b73e3629f3c71d87c5a78e034",
|
||||||
"semantic_signature": {
|
"semantic_signature": {
|
||||||
"normalized_sha256": "eb1199228d8db2107eb7c4cbf889e2116117fcd54e63d5e2b9eceddacbc3bb50",
|
"normalized_sha256": "b2f811568920dfdbd500372df13855041ecb2b8b73e3629f3c71d87c5a78e034",
|
||||||
"headings_sha256": "f676b247c2612dac933cdb2bf3fcb33bf0d0b494341b73306200ffa482da3f1c",
|
"headings_sha256": "aee8af5dbf376874037f52d130bc6a804d4f27c989afd787b769ef53a9bbc56b",
|
||||||
"questions_sha256": "2fdd700c0d8935a969720ad7e9e8229838886d5f24da8b6992ee8357c5d144c9",
|
"questions_sha256": "442f02fed4d7a2e9e868795fe12aa5df3fb74a1dd8e538fbc76b8b1907345a81",
|
||||||
"obligations_sha256": "71e569dd8ada96f70a46d67acfac9e531cab62d3e121fae3e66cdde9eb094a6b",
|
"obligations_sha256": "305f7bea6815e4aa1d968c20c0823e0f98f34bf475065f0091f918c8eaa5ba85",
|
||||||
"heading_count": 99,
|
"heading_count": 30,
|
||||||
"question_count": 81,
|
"question_count": 21,
|
||||||
"obligation_count": 178
|
"obligation_count": 57
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"deterministic_comparison": {
|
"deterministic_comparison": {
|
||||||
@@ -102,27 +102,27 @@
|
|||||||
"semantic_dimensions": {
|
"semantic_dimensions": {
|
||||||
"questions": {
|
"questions": {
|
||||||
"classification": "EQUIVALENT",
|
"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": {
|
"question_order": {
|
||||||
"classification": "EQUIVALENT",
|
"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": {
|
"follow_up_pressure": {
|
||||||
"classification": "EQUIVALENT",
|
"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": {
|
"smart_skips": {
|
||||||
"classification": "EQUIVALENT",
|
"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": {
|
"pushback_strength": {
|
||||||
"classification": "EQUIVALENT",
|
"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": {
|
"scope_recommendation": {
|
||||||
"classification": "EQUIVALENT",
|
"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": {
|
"active_reasoning_modules": {
|
||||||
"classification": "EQUIVALENT",
|
"classification": "EQUIVALENT",
|
||||||
@@ -130,35 +130,35 @@
|
|||||||
},
|
},
|
||||||
"findings": {
|
"findings": {
|
||||||
"classification": "EQUIVALENT",
|
"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": {
|
"evidence": {
|
||||||
"classification": "EQUIVALENT",
|
"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": {
|
"artifacts": {
|
||||||
"classification": "EQUIVALENT",
|
"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": {
|
"approval_gates": {
|
||||||
"classification": "EQUIVALENT",
|
"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": {
|
"mutation_behavior": {
|
||||||
"classification": "EQUIVALENT",
|
"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": {
|
"completion_status": {
|
||||||
"classification": "EQUIVALENT",
|
"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": {
|
"recommended_next_action": {
|
||||||
"classification": "EQUIVALENT",
|
"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": {
|
"voice": {
|
||||||
"classification": "EQUIVALENT",
|
"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"
|
"verdict": "PASS"
|
||||||
|
|||||||
@@ -60,21 +60,21 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"mechanical_port": {
|
"mechanical_port": {
|
||||||
"rendered_sha256": "25e07cb6ea0831bd9e7bd7d4606714ba38b743107a970f2b6491a246b90c7dd4",
|
"rendered_sha256": "9d6398fe0d2900fcce8ae1eb0b390e21f05c94d6ae3a4e21c911025cdc1fd963",
|
||||||
"differs_from_baseline": true,
|
"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": {
|
"candidate": {
|
||||||
"target_path": "skills/review/references/legacy/review.md",
|
"target_path": "skills/review/references/legacy/review.md",
|
||||||
"rendered_legacy_body_sha256": "25e07cb6ea0831bd9e7bd7d4606714ba38b743107a970f2b6491a246b90c7dd4",
|
"rendered_legacy_body_sha256": "9d6398fe0d2900fcce8ae1eb0b390e21f05c94d6ae3a4e21c911025cdc1fd963",
|
||||||
"semantic_signature": {
|
"semantic_signature": {
|
||||||
"normalized_sha256": "25e07cb6ea0831bd9e7bd7d4606714ba38b743107a970f2b6491a246b90c7dd4",
|
"normalized_sha256": "9d6398fe0d2900fcce8ae1eb0b390e21f05c94d6ae3a4e21c911025cdc1fd963",
|
||||||
"headings_sha256": "768372517b06ffe1ce586fa63f42b3d76cd76ca5dcaccbad8eec9067a588f605",
|
"headings_sha256": "8ed11544f49943c2974265c86ad258f53207aaed6f289ea2e6afd1239eee26d8",
|
||||||
"questions_sha256": "f7f3fcefd4cbaf2194b4ac5daaf570f9f1c6cbdb278d5df521501d92786302d3",
|
"questions_sha256": "477b52941fada9cd9a3c3863c90310e198fca3dead264006f1431b0fde20f807",
|
||||||
"obligations_sha256": "edddd4dbefea6bc978ebd45b879891e212d1bb5948c55e97144d77e18af4f2a2",
|
"obligations_sha256": "2e21e383f16f209a665d66710ca6d0ebae5a7fea3a200fc23506cfc584ca74b9",
|
||||||
"heading_count": 61,
|
"heading_count": 36,
|
||||||
"question_count": 6,
|
"question_count": 3,
|
||||||
"obligation_count": 107
|
"obligation_count": 53
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"deterministic_comparison": {
|
"deterministic_comparison": {
|
||||||
@@ -125,27 +125,27 @@
|
|||||||
"semantic_dimensions": {
|
"semantic_dimensions": {
|
||||||
"questions": {
|
"questions": {
|
||||||
"classification": "EQUIVALENT",
|
"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": {
|
"question_order": {
|
||||||
"classification": "EQUIVALENT",
|
"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": {
|
"follow_up_pressure": {
|
||||||
"classification": "EQUIVALENT",
|
"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": {
|
"smart_skips": {
|
||||||
"classification": "EQUIVALENT",
|
"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": {
|
"pushback_strength": {
|
||||||
"classification": "EQUIVALENT",
|
"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": {
|
"scope_recommendation": {
|
||||||
"classification": "EQUIVALENT",
|
"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": {
|
"active_reasoning_modules": {
|
||||||
"classification": "EQUIVALENT",
|
"classification": "EQUIVALENT",
|
||||||
@@ -153,35 +153,35 @@
|
|||||||
},
|
},
|
||||||
"findings": {
|
"findings": {
|
||||||
"classification": "EQUIVALENT",
|
"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": {
|
"evidence": {
|
||||||
"classification": "EQUIVALENT",
|
"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": {
|
"artifacts": {
|
||||||
"classification": "EQUIVALENT",
|
"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": {
|
"approval_gates": {
|
||||||
"classification": "EQUIVALENT",
|
"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": {
|
"mutation_behavior": {
|
||||||
"classification": "EQUIVALENT",
|
"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": {
|
"completion_status": {
|
||||||
"classification": "EQUIVALENT",
|
"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": {
|
"recommended_next_action": {
|
||||||
"classification": "EQUIVALENT",
|
"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": {
|
"voice": {
|
||||||
"classification": "EQUIVALENT",
|
"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"
|
"verdict": "PASS"
|
||||||
|
|||||||
@@ -53,21 +53,21 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"mechanical_port": {
|
"mechanical_port": {
|
||||||
"rendered_sha256": "23e220a2d61b665f9e48b094855336fac3ca9187be12675cb721db2bc27f7c30",
|
"rendered_sha256": "91f19c8d736a9a6077941f63f52853634325059e5ac4d8808c4ba6dbceca1a30",
|
||||||
"differs_from_baseline": true,
|
"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": {
|
"candidate": {
|
||||||
"target_path": "skills/debug/references/legacy/investigate.md",
|
"target_path": "skills/debug/references/legacy/investigate.md",
|
||||||
"rendered_legacy_body_sha256": "23e220a2d61b665f9e48b094855336fac3ca9187be12675cb721db2bc27f7c30",
|
"rendered_legacy_body_sha256": "91f19c8d736a9a6077941f63f52853634325059e5ac4d8808c4ba6dbceca1a30",
|
||||||
"semantic_signature": {
|
"semantic_signature": {
|
||||||
"normalized_sha256": "23e220a2d61b665f9e48b094855336fac3ca9187be12675cb721db2bc27f7c30",
|
"normalized_sha256": "91f19c8d736a9a6077941f63f52853634325059e5ac4d8808c4ba6dbceca1a30",
|
||||||
"headings_sha256": "15edb0afd317abcded3f875b25ea5fedc54e2cfcb1122d2062cc51501da227f4",
|
"headings_sha256": "aae491f6430a9d113ece7954490bd9db9d546e55ee5f10f2ac6cd67dc4d4e284",
|
||||||
"questions_sha256": "eec3a3778c75e566d1cd424a34ebc6624075d8c51d48ecc84b7b69181914ac4b",
|
"questions_sha256": "9e058bbca5f57ed0c9c4724b67d640e15872a0ad283d496b8913d2dd6cfe897d",
|
||||||
"obligations_sha256": "b7cef0c3cad67465da72123a1ff68d395c5f8386e796670c2c7c77537dd9bb78",
|
"obligations_sha256": "d832c32c233beb080da54a3ebdc627da9535a158f9772dce4abee15742996a1c",
|
||||||
"heading_count": 36,
|
"heading_count": 13,
|
||||||
"question_count": 4,
|
"question_count": 1,
|
||||||
"obligation_count": 68
|
"obligation_count": 15
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"deterministic_comparison": {
|
"deterministic_comparison": {
|
||||||
@@ -104,27 +104,27 @@
|
|||||||
"semantic_dimensions": {
|
"semantic_dimensions": {
|
||||||
"questions": {
|
"questions": {
|
||||||
"classification": "EQUIVALENT",
|
"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": {
|
"question_order": {
|
||||||
"classification": "EQUIVALENT",
|
"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": {
|
"follow_up_pressure": {
|
||||||
"classification": "EQUIVALENT",
|
"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": {
|
"smart_skips": {
|
||||||
"classification": "EQUIVALENT",
|
"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": {
|
"pushback_strength": {
|
||||||
"classification": "EQUIVALENT",
|
"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": {
|
"scope_recommendation": {
|
||||||
"classification": "EQUIVALENT",
|
"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": {
|
"active_reasoning_modules": {
|
||||||
"classification": "EQUIVALENT",
|
"classification": "EQUIVALENT",
|
||||||
@@ -132,35 +132,35 @@
|
|||||||
},
|
},
|
||||||
"findings": {
|
"findings": {
|
||||||
"classification": "EQUIVALENT",
|
"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": {
|
"evidence": {
|
||||||
"classification": "EQUIVALENT",
|
"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": {
|
"artifacts": {
|
||||||
"classification": "EQUIVALENT",
|
"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": {
|
"approval_gates": {
|
||||||
"classification": "EQUIVALENT",
|
"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": {
|
"mutation_behavior": {
|
||||||
"classification": "EQUIVALENT",
|
"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": {
|
"completion_status": {
|
||||||
"classification": "EQUIVALENT",
|
"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": {
|
"recommended_next_action": {
|
||||||
"classification": "EQUIVALENT",
|
"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": {
|
"voice": {
|
||||||
"classification": "EQUIVALENT",
|
"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"
|
"verdict": "PASS"
|
||||||
|
|||||||
@@ -57,21 +57,21 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"mechanical_port": {
|
"mechanical_port": {
|
||||||
"rendered_sha256": "2ffa676332b91cb2f4f0ae4a08d917dd43a767995b33d960895c15e93fb7c73c",
|
"rendered_sha256": "1db4cd23ee115ce841d2db898cc442141588635d43018393703aa28ce40d48f2",
|
||||||
"differs_from_baseline": true,
|
"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": {
|
"candidate": {
|
||||||
"target_path": "skills/design/references/legacy/design-shotgun.md",
|
"target_path": "skills/design/references/legacy/design-shotgun.md",
|
||||||
"rendered_legacy_body_sha256": "2ffa676332b91cb2f4f0ae4a08d917dd43a767995b33d960895c15e93fb7c73c",
|
"rendered_legacy_body_sha256": "1db4cd23ee115ce841d2db898cc442141588635d43018393703aa28ce40d48f2",
|
||||||
"semantic_signature": {
|
"semantic_signature": {
|
||||||
"normalized_sha256": "2ffa676332b91cb2f4f0ae4a08d917dd43a767995b33d960895c15e93fb7c73c",
|
"normalized_sha256": "1db4cd23ee115ce841d2db898cc442141588635d43018393703aa28ce40d48f2",
|
||||||
"headings_sha256": "2aa7a234cd1a43b129ddd0910297825adca7f7f352893366652379f726c1deb3",
|
"headings_sha256": "54756bba54ab9183163992eb243290a41b99f896b5993d7f7a0242a5434e0ffe",
|
||||||
"questions_sha256": "8b62e62ce14abee95f662f8c9ae8dec575b928254949b3e5a1115e878e609b56",
|
"questions_sha256": "2492e14286f1029d529a7ecb1fe28cffc94f2f4c922521e73b26a23147a60e29",
|
||||||
"obligations_sha256": "67396cd25988a1d56b935b32b085895f1eda72af5021c69d429ccadf198f681e",
|
"obligations_sha256": "8d595f621cb352052f374d49204597142f011694db5953fb826d46c68946e94e",
|
||||||
"heading_count": 46,
|
"heading_count": 23,
|
||||||
"question_count": 7,
|
"question_count": 4,
|
||||||
"obligation_count": 85
|
"obligation_count": 33
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"deterministic_comparison": {
|
"deterministic_comparison": {
|
||||||
@@ -101,27 +101,27 @@
|
|||||||
"semantic_dimensions": {
|
"semantic_dimensions": {
|
||||||
"questions": {
|
"questions": {
|
||||||
"classification": "EQUIVALENT",
|
"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": {
|
"question_order": {
|
||||||
"classification": "EQUIVALENT",
|
"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": {
|
"follow_up_pressure": {
|
||||||
"classification": "EQUIVALENT",
|
"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": {
|
"smart_skips": {
|
||||||
"classification": "EQUIVALENT",
|
"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": {
|
"pushback_strength": {
|
||||||
"classification": "EQUIVALENT",
|
"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": {
|
"scope_recommendation": {
|
||||||
"classification": "EQUIVALENT",
|
"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": {
|
"active_reasoning_modules": {
|
||||||
"classification": "EQUIVALENT",
|
"classification": "EQUIVALENT",
|
||||||
@@ -129,35 +129,35 @@
|
|||||||
},
|
},
|
||||||
"findings": {
|
"findings": {
|
||||||
"classification": "EQUIVALENT",
|
"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": {
|
"evidence": {
|
||||||
"classification": "EQUIVALENT",
|
"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": {
|
"artifacts": {
|
||||||
"classification": "EQUIVALENT",
|
"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": {
|
"approval_gates": {
|
||||||
"classification": "EQUIVALENT",
|
"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": {
|
"mutation_behavior": {
|
||||||
"classification": "EQUIVALENT",
|
"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": {
|
"completion_status": {
|
||||||
"classification": "EQUIVALENT",
|
"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": {
|
"recommended_next_action": {
|
||||||
"classification": "EQUIVALENT",
|
"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": {
|
"voice": {
|
||||||
"classification": "EQUIVALENT",
|
"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"
|
"verdict": "PASS"
|
||||||
|
|||||||
@@ -57,21 +57,21 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"mechanical_port": {
|
"mechanical_port": {
|
||||||
"rendered_sha256": "2753c3423f22f9ef2b3baf31069bd2ac6951e7bc69cc70f28c8da5c07580ab26",
|
"rendered_sha256": "afa1f2b58d22d9f0f9064336ce7e9836430a298e1deb56f5330390f91df3f680",
|
||||||
"differs_from_baseline": true,
|
"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": {
|
"candidate": {
|
||||||
"target_path": "skills/design/references/legacy/design-consultation.md",
|
"target_path": "skills/design/references/legacy/design-consultation.md",
|
||||||
"rendered_legacy_body_sha256": "2753c3423f22f9ef2b3baf31069bd2ac6951e7bc69cc70f28c8da5c07580ab26",
|
"rendered_legacy_body_sha256": "afa1f2b58d22d9f0f9064336ce7e9836430a298e1deb56f5330390f91df3f680",
|
||||||
"semantic_signature": {
|
"semantic_signature": {
|
||||||
"normalized_sha256": "2753c3423f22f9ef2b3baf31069bd2ac6951e7bc69cc70f28c8da5c07580ab26",
|
"normalized_sha256": "afa1f2b58d22d9f0f9064336ce7e9836430a298e1deb56f5330390f91df3f680",
|
||||||
"headings_sha256": "4262d542408dd44833fd9f12ec4f55ac87d651adb5fa493ee12bda77c1e4b466",
|
"headings_sha256": "78cdfd5aa0c0264964542d45190c919c7adb8c01ea68a22d67dd0fad538cc643",
|
||||||
"questions_sha256": "a19d5d23a525813c590a16d8f36c9e781b612aad6fd94fdc844f38d4ef4fdc02",
|
"questions_sha256": "91adedef9aa8000a9aa3385381227d149dbc52cbf2d127656bf0697510b62906",
|
||||||
"obligations_sha256": "b7d5417c5d371550dcf22b1364e2dfa5a6719dc521e31dbfebd5427ae351b59c",
|
"obligations_sha256": "bca9ced676d3f62fad557554c5268ff0b339d39ab028b1022ddff1a930bd24f7",
|
||||||
"heading_count": 46,
|
"heading_count": 12,
|
||||||
"question_count": 5,
|
"question_count": 2,
|
||||||
"obligation_count": 83
|
"obligation_count": 17
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"deterministic_comparison": {
|
"deterministic_comparison": {
|
||||||
@@ -108,27 +108,27 @@
|
|||||||
"semantic_dimensions": {
|
"semantic_dimensions": {
|
||||||
"questions": {
|
"questions": {
|
||||||
"classification": "EQUIVALENT",
|
"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": {
|
"question_order": {
|
||||||
"classification": "EQUIVALENT",
|
"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": {
|
"follow_up_pressure": {
|
||||||
"classification": "EQUIVALENT",
|
"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": {
|
"smart_skips": {
|
||||||
"classification": "EQUIVALENT",
|
"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": {
|
"pushback_strength": {
|
||||||
"classification": "EQUIVALENT",
|
"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": {
|
"scope_recommendation": {
|
||||||
"classification": "EQUIVALENT",
|
"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": {
|
"active_reasoning_modules": {
|
||||||
"classification": "EQUIVALENT",
|
"classification": "EQUIVALENT",
|
||||||
@@ -136,35 +136,35 @@
|
|||||||
},
|
},
|
||||||
"findings": {
|
"findings": {
|
||||||
"classification": "EQUIVALENT",
|
"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": {
|
"evidence": {
|
||||||
"classification": "EQUIVALENT",
|
"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": {
|
"artifacts": {
|
||||||
"classification": "EQUIVALENT",
|
"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": {
|
"approval_gates": {
|
||||||
"classification": "EQUIVALENT",
|
"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": {
|
"mutation_behavior": {
|
||||||
"classification": "EQUIVALENT",
|
"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": {
|
"completion_status": {
|
||||||
"classification": "EQUIVALENT",
|
"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": {
|
"recommended_next_action": {
|
||||||
"classification": "EQUIVALENT",
|
"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": {
|
"voice": {
|
||||||
"classification": "EQUIVALENT",
|
"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"
|
"verdict": "PASS"
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user