gsd-pi 2.57.0 → 2.58.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/resources/extensions/gsd/auto/infra-errors.js +4 -0
- package/dist/resources/extensions/gsd/auto-dispatch.js +3 -3
- package/dist/resources/extensions/gsd/auto-worktree.js +7 -2
- package/dist/resources/extensions/gsd/auto.js +4 -0
- package/dist/resources/extensions/gsd/bootstrap/db-tools.js +2 -1
- package/dist/resources/extensions/gsd/dispatch-guard.js +11 -1
- package/dist/resources/extensions/gsd/gsd-db.js +8 -1
- package/dist/resources/extensions/gsd/parallel-orchestrator.js +23 -6
- package/dist/resources/extensions/gsd/preferences.js +29 -15
- package/dist/resources/extensions/gsd/prompts/validate-milestone.md +2 -2
- package/dist/resources/extensions/gsd/tools/validate-milestone.js +4 -0
- package/dist/web/standalone/.next/BUILD_ID +1 -1
- package/dist/web/standalone/.next/app-path-routes-manifest.json +9 -9
- package/dist/web/standalone/.next/build-manifest.json +3 -3
- package/dist/web/standalone/.next/prerender-manifest.json +3 -3
- package/dist/web/standalone/.next/react-loadable-manifest.json +1 -1
- package/dist/web/standalone/.next/required-server-files.json +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.html +2 -2
- package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/api/boot/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/session/events/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/shutdown/route.js +1 -1
- package/dist/web/standalone/.next/server/app/index.html +1 -1
- package/dist/web/standalone/.next/server/app/index.rsc +1 -1
- package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app-paths-manifest.json +9 -9
- package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
- package/dist/web/standalone/.next/server/middleware-react-loadable-manifest.js +1 -1
- package/dist/web/standalone/.next/server/pages/404.html +1 -1
- package/dist/web/standalone/.next/server/pages/500.html +2 -2
- package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
- package/dist/web/standalone/.next/static/chunks/6502.8b732f67a11b11b4.js +9 -0
- package/dist/web/standalone/.next/static/chunks/{webpack-4332cbd5dd1be584.js → webpack-61d3afac6d0f0ce7.js} +1 -1
- package/dist/web/standalone/server.js +1 -1
- package/package.json +1 -1
- package/packages/daemon/src/cli.ts +49 -0
- package/packages/daemon/src/daemon.test.ts +104 -1
- package/packages/daemon/src/daemon.ts +23 -0
- package/packages/daemon/src/discord-bot.ts +62 -3
- package/packages/daemon/src/index.ts +9 -0
- package/packages/daemon/src/launchd.test.ts +356 -0
- package/packages/daemon/src/launchd.ts +242 -0
- package/packages/pi-coding-agent/package.json +1 -1
- package/pkg/package.json +1 -1
- package/src/resources/extensions/gsd/auto/infra-errors.ts +3 -0
- package/src/resources/extensions/gsd/auto-dispatch.ts +3 -3
- package/src/resources/extensions/gsd/auto-worktree.ts +7 -2
- package/src/resources/extensions/gsd/auto.ts +5 -0
- package/src/resources/extensions/gsd/bootstrap/db-tools.ts +2 -1
- package/src/resources/extensions/gsd/dispatch-guard.ts +12 -1
- package/src/resources/extensions/gsd/gsd-db.ts +6 -1
- package/src/resources/extensions/gsd/parallel-orchestrator.ts +23 -6
- package/src/resources/extensions/gsd/preferences.ts +32 -14
- package/src/resources/extensions/gsd/prompts/validate-milestone.md +2 -2
- package/src/resources/extensions/gsd/tests/auto-loop.test.ts +18 -0
- package/src/resources/extensions/gsd/tests/dispatch-guard.test.ts +47 -0
- package/src/resources/extensions/gsd/tests/parallel-worker-monitoring.test.ts +9 -8
- package/src/resources/extensions/gsd/tests/preferences.test.ts +34 -0
- package/src/resources/extensions/gsd/tests/prompt-contracts.test.ts +7 -0
- package/src/resources/extensions/gsd/tests/validate-milestone-write-order.test.ts +23 -1
- package/src/resources/extensions/gsd/tests/validation-gate-patterns.test.ts +44 -2
- package/src/resources/extensions/gsd/tests/worktree-db-same-file.test.ts +175 -0
- package/src/resources/extensions/gsd/tools/validate-milestone.ts +5 -0
- package/dist/web/standalone/.next/static/chunks/6502.2305d0afd2385711.js +0 -9
- /package/dist/web/standalone/.next/static/{yowc5qPtuKxjOr22KmOAy → IoheXIe-5DH7ieX8AUo8U}/_buildManifest.js +0 -0
- /package/dist/web/standalone/.next/static/{yowc5qPtuKxjOr22KmOAy → IoheXIe-5DH7ieX8AUo8U}/_ssgManifest.js +0 -0
|
@@ -41,5 +41,9 @@ export function isInfrastructureError(err) {
|
|
|
41
41
|
if (msg.includes(code))
|
|
42
42
|
return code;
|
|
43
43
|
}
|
|
44
|
+
// SQLite WAL corruption is not transient — retrying burns LLM budget
|
|
45
|
+
// for guaranteed failures (#2823).
|
|
46
|
+
if (msg.includes("database disk image is malformed"))
|
|
47
|
+
return "SQLITE_CORRUPT";
|
|
44
48
|
return null;
|
|
45
49
|
}
|
|
@@ -531,11 +531,11 @@ export const DISPATCH_RULES = [
|
|
|
531
531
|
if (validationPath) {
|
|
532
532
|
const validationContent = await loadFile(validationPath);
|
|
533
533
|
if (validationContent) {
|
|
534
|
-
// Accept either the structured template format (table with MET/N/A)
|
|
534
|
+
// Accept either the structured template format (table with MET/N/A/SATISFIED)
|
|
535
535
|
// or prose evidence patterns the validation agent may emit.
|
|
536
536
|
const structuredMatch = validationContent.includes("Operational") &&
|
|
537
|
-
(validationContent.includes("MET") || validationContent.includes("N/A"));
|
|
538
|
-
const proseMatch = /[Oo]perational[\s
|
|
537
|
+
(validationContent.includes("MET") || validationContent.includes("N/A") || validationContent.includes("SATISFIED"));
|
|
538
|
+
const proseMatch = /[Oo]perational[\s\S]{0,500}?(?:✅|pass|verified|confirmed|met|complete|true|yes|addressed|covered|satisfied|partially|n\/a|not[\s-]+applicable)/i.test(validationContent);
|
|
539
539
|
const hasOperationalCheck = structuredMatch || proseMatch;
|
|
540
540
|
if (!hasOperationalCheck) {
|
|
541
541
|
return {
|
|
@@ -1060,12 +1060,17 @@ export function mergeMilestoneToMain(originalBasePath_, milestoneId, roadmapCont
|
|
|
1060
1060
|
const milestoneBranch = autoWorktreeBranch(milestoneId);
|
|
1061
1061
|
// 1. Auto-commit dirty state in worktree before leaving
|
|
1062
1062
|
autoCommitDirtyState(worktreeCwd);
|
|
1063
|
-
// Reconcile worktree DB into main DB before leaving worktree context
|
|
1063
|
+
// Reconcile worktree DB into main DB before leaving worktree context.
|
|
1064
|
+
// Skip when both paths resolve to the same physical file (shared WAL /
|
|
1065
|
+
// symlink layout) — ATTACHing a WAL-mode file to itself corrupts the
|
|
1066
|
+
// database (#2823).
|
|
1064
1067
|
if (isDbAvailable()) {
|
|
1065
1068
|
try {
|
|
1066
1069
|
const worktreeDbPath = join(worktreeCwd, ".gsd", "gsd.db");
|
|
1067
1070
|
const mainDbPath = join(originalBasePath_, ".gsd", "gsd.db");
|
|
1068
|
-
|
|
1071
|
+
if (!isSamePath(worktreeDbPath, mainDbPath)) {
|
|
1072
|
+
reconcileWorktreeDb(mainDbPath, worktreeDbPath);
|
|
1073
|
+
}
|
|
1069
1074
|
}
|
|
1070
1075
|
catch {
|
|
1071
1076
|
/* non-fatal */
|
|
@@ -774,6 +774,10 @@ function buildLoopDeps() {
|
|
|
774
774
|
};
|
|
775
775
|
}
|
|
776
776
|
export async function startAuto(ctx, pi, base, verboseMode, options) {
|
|
777
|
+
if (s.active) {
|
|
778
|
+
debugLog("startAuto", { phase: "already-active", skipping: true });
|
|
779
|
+
return;
|
|
780
|
+
}
|
|
777
781
|
const requestedStepMode = options?.step ?? false;
|
|
778
782
|
// Escape stale worktree cwd from a previous milestone (#608).
|
|
779
783
|
base = escapeStaleWorktree(base);
|
|
@@ -872,7 +872,7 @@ export function registerDbTools(pi) {
|
|
|
872
872
|
promptSnippet: "Validate a GSD milestone (DB write + VALIDATION.md render)",
|
|
873
873
|
promptGuidelines: [
|
|
874
874
|
"Use gsd_validate_milestone when all slices are done and the milestone needs validation before completion.",
|
|
875
|
-
"Parameters: milestoneId, verdict, remediationRound, successCriteriaChecklist, sliceDeliveryAudit, crossSliceIntegration, requirementCoverage, verdictRationale, remediationPlan (optional).",
|
|
875
|
+
"Parameters: milestoneId, verdict, remediationRound, successCriteriaChecklist, sliceDeliveryAudit, crossSliceIntegration, requirementCoverage, verificationClasses (optional), verdictRationale, remediationPlan (optional).",
|
|
876
876
|
"If verdict is 'needs-remediation', also provide remediationPlan and use gsd_reassess_roadmap to add remediation slices to the roadmap.",
|
|
877
877
|
"On success, returns validationPath where VALIDATION.md was written.",
|
|
878
878
|
],
|
|
@@ -884,6 +884,7 @@ export function registerDbTools(pi) {
|
|
|
884
884
|
sliceDeliveryAudit: Type.String({ description: "Markdown table auditing each slice's claimed vs delivered output" }),
|
|
885
885
|
crossSliceIntegration: Type.String({ description: "Markdown describing any cross-slice boundary mismatches" }),
|
|
886
886
|
requirementCoverage: Type.String({ description: "Markdown describing any unaddressed requirements" }),
|
|
887
|
+
verificationClasses: Type.Optional(Type.String({ description: "Markdown describing verification class compliance and gaps" })),
|
|
887
888
|
verdictRationale: Type.String({ description: "Why this verdict was chosen" }),
|
|
888
889
|
remediationPlan: Type.Optional(Type.String({ description: "Remediation plan (required if verdict is needs-remediation)" })),
|
|
889
890
|
}),
|
|
@@ -18,9 +18,19 @@ export function getPriorSliceCompletionBlocker(base, _mainBranch, unitType, unit
|
|
|
18
18
|
const { milestone: targetMid, slice: targetSid } = parseUnitId(unitId);
|
|
19
19
|
if (!targetMid || !targetSid)
|
|
20
20
|
return null;
|
|
21
|
+
// Parallel worker isolation: when GSD_MILESTONE_LOCK is set, this worker
|
|
22
|
+
// is scoped to a single milestone. Skip the cross-milestone dependency
|
|
23
|
+
// check — other milestones are being handled by their own workers.
|
|
24
|
+
// Without this, the dispatch guard sees incomplete slices in M010/M011
|
|
25
|
+
// (cloned into the worktree DB) and blocks M012 from ever starting. #2797
|
|
26
|
+
const milestoneLock = process.env.GSD_MILESTONE_LOCK;
|
|
21
27
|
// Use findMilestoneIds to respect custom queue order.
|
|
22
28
|
// Only check milestones that come BEFORE the target in queue order.
|
|
23
|
-
|
|
29
|
+
// When locked to a specific milestone, only check that milestone's
|
|
30
|
+
// intra-slice dependencies — skip all cross-milestone checks.
|
|
31
|
+
const allIds = milestoneLock && targetMid === milestoneLock
|
|
32
|
+
? [targetMid]
|
|
33
|
+
: findMilestoneIds(base);
|
|
24
34
|
const targetIdx = allIds.indexOf(targetMid);
|
|
25
35
|
if (targetIdx < 0)
|
|
26
36
|
return null;
|
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
// Exposes a unified sync API for decisions and requirements storage.
|
|
6
6
|
// Schema is initialized on first open with WAL mode for file-backed DBs.
|
|
7
7
|
import { createRequire } from "node:module";
|
|
8
|
-
import { existsSync, copyFileSync, mkdirSync } from "node:fs";
|
|
8
|
+
import { existsSync, copyFileSync, mkdirSync, realpathSync } from "node:fs";
|
|
9
9
|
import { dirname } from "node:path";
|
|
10
10
|
import { GSDError, GSD_STALE_STATE } from "./errors.js";
|
|
11
11
|
const _require = createRequire(import.meta.url);
|
|
@@ -1455,6 +1455,13 @@ export function reconcileWorktreeDb(mainDbPath, worktreeDbPath) {
|
|
|
1455
1455
|
const zero = { decisions: 0, requirements: 0, artifacts: 0, milestones: 0, slices: 0, tasks: 0, memories: 0, verification_evidence: 0, conflicts: [] };
|
|
1456
1456
|
if (!existsSync(worktreeDbPath))
|
|
1457
1457
|
return zero;
|
|
1458
|
+
// Guard: bail when both paths resolve to the same physical file.
|
|
1459
|
+
// ATTACHing a WAL-mode DB to itself corrupts the WAL (#2823).
|
|
1460
|
+
try {
|
|
1461
|
+
if (realpathSync(mainDbPath) === realpathSync(worktreeDbPath))
|
|
1462
|
+
return zero;
|
|
1463
|
+
}
|
|
1464
|
+
catch { /* path resolution failed — fall through to existing checks */ }
|
|
1458
1465
|
// Sanitize path: reject any characters that could break ATTACH syntax.
|
|
1459
1466
|
// ATTACH DATABASE doesn't support parameterized paths in all providers,
|
|
1460
1467
|
// so we use strict allowlist validation instead.
|
|
@@ -406,8 +406,19 @@ function createMilestoneWorktree(basePath, milestoneId) {
|
|
|
406
406
|
// ─── Worker Spawning ───────────────────────────────────────────────────
|
|
407
407
|
/**
|
|
408
408
|
* Spawn a worker process for a milestone.
|
|
409
|
-
* The worker runs `gsd --
|
|
409
|
+
* The worker runs `gsd headless --json auto` in the milestone's worktree
|
|
410
410
|
* with GSD_MILESTONE_LOCK set to isolate state derivation.
|
|
411
|
+
*
|
|
412
|
+
* IMPORTANT: We use `headless --json auto` instead of `--print "/gsd auto"`.
|
|
413
|
+
* --print mode calls session.prompt() which returns immediately after the
|
|
414
|
+
* extension command handler fires, because auto-mode's ctx.newSession()
|
|
415
|
+
* resets the session and unblocks the outer prompt() await. This causes
|
|
416
|
+
* process.exit(0) to fire before any LLM work happens. See #2792.
|
|
417
|
+
*
|
|
418
|
+
* The headless subcommand uses an RPC client that keeps the process alive
|
|
419
|
+
* until auto-mode emits a terminal notification or the idle timer fires.
|
|
420
|
+
* It outputs NDJSON events to stdout (with --json), which our
|
|
421
|
+
* processWorkerLine() parser already understands.
|
|
411
422
|
*/
|
|
412
423
|
export function spawnWorker(basePath, milestoneId) {
|
|
413
424
|
if (!state)
|
|
@@ -423,7 +434,7 @@ export function spawnWorker(basePath, milestoneId) {
|
|
|
423
434
|
return false;
|
|
424
435
|
let child;
|
|
425
436
|
try {
|
|
426
|
-
child = spawn(process.execPath, [binPath, "
|
|
437
|
+
child = spawn(process.execPath, [binPath, "headless", "--json", "auto"], {
|
|
427
438
|
cwd: worker.worktreePath,
|
|
428
439
|
env: {
|
|
429
440
|
...process.env,
|
|
@@ -461,9 +472,10 @@ export function spawnWorker(basePath, milestoneId) {
|
|
|
461
472
|
return false;
|
|
462
473
|
}
|
|
463
474
|
// ── NDJSON stdout monitoring ────────────────────────────────────────
|
|
464
|
-
// Workers run
|
|
465
|
-
// We parse message_end events to extract
|
|
466
|
-
// the coordinator's cost tracking in sync
|
|
475
|
+
// Workers run via `headless --json`, which forwards all RPC events
|
|
476
|
+
// as NDJSON to stdout. We parse message_end events to extract
|
|
477
|
+
// cost/token usage, keeping the coordinator's cost tracking in sync
|
|
478
|
+
// with actual API spend.
|
|
467
479
|
if (child.stdout) {
|
|
468
480
|
let stdoutBuffer = "";
|
|
469
481
|
child.stdout.on("data", (data) => {
|
|
@@ -674,7 +686,12 @@ export async function stopParallel(basePath, milestoneId) {
|
|
|
674
686
|
}
|
|
675
687
|
catch { /* process may already be dead */ }
|
|
676
688
|
}
|
|
677
|
-
|
|
689
|
+
// Wait for the headless process to cascade SIGTERM to its RPC child.
|
|
690
|
+
// The headless signal handler calls client.stop() which sends SIGTERM
|
|
691
|
+
// to the RPC child and waits up to 1000ms. The previous 750ms window
|
|
692
|
+
// was insufficient — the parent got SIGKILL before the child died,
|
|
693
|
+
// leaving orphaned RPC processes holding auto.lock. See #2798.
|
|
694
|
+
const exitedAfterTerm = await waitForWorkerExit(worker, 3000);
|
|
678
695
|
if (!exitedAfterTerm && worker.pid > 0) {
|
|
679
696
|
try {
|
|
680
697
|
if (worker.process) {
|
|
@@ -16,7 +16,7 @@ import { gsdRoot } from "./paths.js";
|
|
|
16
16
|
import { parse as parseYaml } from "yaml";
|
|
17
17
|
import { normalizeStringArray } from "../shared/format-utils.js";
|
|
18
18
|
import { resolveProfileDefaults as _resolveProfileDefaults } from "./preferences-models.js";
|
|
19
|
-
import { MODE_DEFAULTS, } from "./preferences-types.js";
|
|
19
|
+
import { KNOWN_PREFERENCE_KEYS, MODE_DEFAULTS, } from "./preferences-types.js";
|
|
20
20
|
import { validatePreferences } from "./preferences-validation.js";
|
|
21
21
|
import { formatSkillRef } from "./preferences-skills.js";
|
|
22
22
|
// ─── Re-exports: validation ─────────────────────────────────────────────────
|
|
@@ -183,28 +183,42 @@ function parseHeadingListFormat(content) {
|
|
|
183
183
|
const headingMatch = line.match(/^##\s+(.+)$/);
|
|
184
184
|
if (headingMatch) {
|
|
185
185
|
currentSection = headingMatch[1].trim().toLowerCase().replace(/\s+/g, '_');
|
|
186
|
+
if (!result[currentSection])
|
|
187
|
+
result[currentSection] = [];
|
|
186
188
|
continue;
|
|
187
189
|
}
|
|
188
|
-
if (currentSection) {
|
|
189
|
-
|
|
190
|
-
if (itemMatch) {
|
|
191
|
-
if (!result[currentSection])
|
|
192
|
-
result[currentSection] = {};
|
|
193
|
-
const value = itemMatch[2].trim();
|
|
194
|
-
// Coerce "true"/"false" strings and numbers
|
|
195
|
-
result[currentSection][itemMatch[1].trim()] = value;
|
|
196
|
-
}
|
|
190
|
+
if (currentSection && line.trim() && !line.trimStart().startsWith('#')) {
|
|
191
|
+
result[currentSection].push(line);
|
|
197
192
|
}
|
|
198
193
|
}
|
|
199
|
-
// Convert string values to appropriate types via YAML parser for each section
|
|
200
194
|
const typed = {};
|
|
201
|
-
for (const [section,
|
|
202
|
-
|
|
195
|
+
for (const [section, lines] of Object.entries(result)) {
|
|
196
|
+
if (lines.length === 0)
|
|
197
|
+
continue;
|
|
198
|
+
const usesLegacyListItems = lines.every((line) => /^\s*-\s+[^:]+:\s*.*$/.test(line));
|
|
199
|
+
const yamlBlock = usesLegacyListItems
|
|
200
|
+
? lines.map((line) => line.replace(/^\s*-\s+/, '')).join('\n')
|
|
201
|
+
: lines.join('\n');
|
|
203
202
|
try {
|
|
204
|
-
|
|
203
|
+
const parsed = parseYaml(yamlBlock);
|
|
204
|
+
if (typeof parsed !== 'object' || parsed === null)
|
|
205
|
+
continue;
|
|
206
|
+
let targetSection = section;
|
|
207
|
+
let value = parsed;
|
|
208
|
+
if (!Array.isArray(parsed)) {
|
|
209
|
+
const keys = Object.keys(parsed);
|
|
210
|
+
if (keys.length === 1) {
|
|
211
|
+
const [onlyKey] = keys;
|
|
212
|
+
if (onlyKey === section || (!KNOWN_PREFERENCE_KEYS.has(section) && KNOWN_PREFERENCE_KEYS.has(onlyKey))) {
|
|
213
|
+
targetSection = onlyKey;
|
|
214
|
+
value = parsed[onlyKey];
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
typed[targetSection] = value;
|
|
205
219
|
}
|
|
206
220
|
catch {
|
|
207
|
-
|
|
221
|
+
/* malformed section — skip */
|
|
208
222
|
}
|
|
209
223
|
}
|
|
210
224
|
return typed;
|
|
@@ -26,7 +26,7 @@ All relevant context has been preloaded below — the roadmap, all slice summari
|
|
|
26
26
|
4. Check **requirement coverage** — are all active requirements addressed by at least one slice?
|
|
27
27
|
5. If **Verification Classes** are provided in the inlined context above, check each non-empty class:
|
|
28
28
|
- For each verification class (Contract, Integration, Operational, UAT), determine whether slice summaries, UAT results, or observable behavior provide evidence that this verification tier was addressed.
|
|
29
|
-
- Document the compliance status of each class in
|
|
29
|
+
- Document the compliance status of each class in a dedicated verification classes section.
|
|
30
30
|
- If `Operational` verification is non-empty and no evidence of operational verification exists, flag this explicitly — it means planned operational checks (migrations, deployments, runtime verification) were not proven.
|
|
31
31
|
- A milestone with unaddressed verification classes may still pass if the gaps are minor, but the gaps MUST be documented in the Deferred Work Inventory.
|
|
32
32
|
6. Determine a verdict:
|
|
@@ -36,7 +36,7 @@ All relevant context has been preloaded below — the roadmap, all slice summari
|
|
|
36
36
|
|
|
37
37
|
## Persist Validation
|
|
38
38
|
|
|
39
|
-
**Persist validation results through `gsd_validate_milestone`.** Call it with: `milestoneId`, `verdict`, `remediationRound`, `successCriteriaChecklist`, `sliceDeliveryAudit`, `crossSliceIntegration`, `requirementCoverage`, `verdictRationale`, and `remediationPlan` (if verdict is `needs-remediation`). The tool writes the validation to the DB and renders VALIDATION.md to disk.
|
|
39
|
+
**Persist validation results through `gsd_validate_milestone`.** Call it with: `milestoneId`, `verdict`, `remediationRound`, `successCriteriaChecklist`, `sliceDeliveryAudit`, `crossSliceIntegration`, `requirementCoverage`, `verificationClasses` (when non-empty), `verdictRationale`, and `remediationPlan` (if verdict is `needs-remediation`). The tool writes the validation to the DB and renders VALIDATION.md to disk.
|
|
40
40
|
|
|
41
41
|
If verdict is `needs-remediation`:
|
|
42
42
|
- After calling `gsd_validate_milestone`, use `gsd_reassess_roadmap` to add remediation slices. Pass `milestoneId`, a synthetic `completedSliceId` (e.g. "VALIDATION"), `verdict: "roadmap-adjusted"`, `assessment` text, and `sliceChanges` with the new slices in the `added` array. The tool persists the changes to the DB and re-renders ROADMAP.md.
|
|
@@ -30,6 +30,10 @@ ${params.crossSliceIntegration}
|
|
|
30
30
|
## Requirement Coverage
|
|
31
31
|
${params.requirementCoverage}
|
|
32
32
|
|
|
33
|
+
${params.verificationClasses ? `## Verification Class Compliance
|
|
34
|
+
${params.verificationClasses}
|
|
35
|
+
|
|
36
|
+
` : ""}
|
|
33
37
|
## Verdict Rationale
|
|
34
38
|
${params.verdictRationale}
|
|
35
39
|
`;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
|
|
1
|
+
IoheXIe-5DH7ieX8AUo8U
|
|
@@ -1,22 +1,22 @@
|
|
|
1
1
|
{
|
|
2
2
|
"/_not-found/page": "/_not-found",
|
|
3
3
|
"/_global-error/page": "/_global-error",
|
|
4
|
-
"/api/bridge-terminal/resize/route": "/api/bridge-terminal/resize",
|
|
5
|
-
"/api/bridge-terminal/input/route": "/api/bridge-terminal/input",
|
|
6
4
|
"/api/boot/route": "/api/boot",
|
|
5
|
+
"/api/bridge-terminal/input/route": "/api/bridge-terminal/input",
|
|
6
|
+
"/api/bridge-terminal/resize/route": "/api/bridge-terminal/resize",
|
|
7
7
|
"/api/bridge-terminal/stream/route": "/api/bridge-terminal/stream",
|
|
8
|
-
"/api/cleanup/route": "/api/cleanup",
|
|
9
8
|
"/api/dev-mode/route": "/api/dev-mode",
|
|
10
|
-
"/api/
|
|
9
|
+
"/api/cleanup/route": "/api/cleanup",
|
|
11
10
|
"/api/captures/route": "/api/captures",
|
|
11
|
+
"/api/doctor/route": "/api/doctor",
|
|
12
12
|
"/api/export-data/route": "/api/export-data",
|
|
13
13
|
"/api/browse-directories/route": "/api/browse-directories",
|
|
14
14
|
"/api/forensics/route": "/api/forensics",
|
|
15
|
-
"/api/git/route": "/api/git",
|
|
16
15
|
"/api/history/route": "/api/history",
|
|
16
|
+
"/api/git/route": "/api/git",
|
|
17
17
|
"/api/hooks/route": "/api/hooks",
|
|
18
|
-
"/api/inspect/route": "/api/inspect",
|
|
19
18
|
"/api/knowledge/route": "/api/knowledge",
|
|
19
|
+
"/api/inspect/route": "/api/inspect",
|
|
20
20
|
"/api/experimental/route": "/api/experimental",
|
|
21
21
|
"/api/live-state/route": "/api/live-state",
|
|
22
22
|
"/api/preferences/route": "/api/preferences",
|
|
@@ -26,18 +26,18 @@
|
|
|
26
26
|
"/api/session/browser/route": "/api/session/browser",
|
|
27
27
|
"/api/session/command/route": "/api/session/command",
|
|
28
28
|
"/api/session/events/route": "/api/session/events",
|
|
29
|
+
"/api/session/manage/route": "/api/session/manage",
|
|
29
30
|
"/api/settings-data/route": "/api/settings-data",
|
|
30
31
|
"/api/shutdown/route": "/api/shutdown",
|
|
31
|
-
"/api/session/manage/route": "/api/session/manage",
|
|
32
32
|
"/api/skill-health/route": "/api/skill-health",
|
|
33
33
|
"/api/steer/route": "/api/steer",
|
|
34
34
|
"/api/terminal/input/route": "/api/terminal/input",
|
|
35
|
-
"/api/files/route": "/api/files",
|
|
36
35
|
"/api/terminal/resize/route": "/api/terminal/resize",
|
|
36
|
+
"/api/files/route": "/api/files",
|
|
37
37
|
"/api/switch-root/route": "/api/switch-root",
|
|
38
38
|
"/api/terminal/sessions/route": "/api/terminal/sessions",
|
|
39
|
-
"/api/terminal/stream/route": "/api/terminal/stream",
|
|
40
39
|
"/api/terminal/upload/route": "/api/terminal/upload",
|
|
40
|
+
"/api/terminal/stream/route": "/api/terminal/stream",
|
|
41
41
|
"/api/undo/route": "/api/undo",
|
|
42
42
|
"/api/visualizer/route": "/api/visualizer",
|
|
43
43
|
"/api/update/route": "/api/update",
|
|
@@ -4,11 +4,11 @@
|
|
|
4
4
|
],
|
|
5
5
|
"devFiles": [],
|
|
6
6
|
"lowPriorityFiles": [
|
|
7
|
-
"static/
|
|
8
|
-
"static/
|
|
7
|
+
"static/IoheXIe-5DH7ieX8AUo8U/_buildManifest.js",
|
|
8
|
+
"static/IoheXIe-5DH7ieX8AUo8U/_ssgManifest.js"
|
|
9
9
|
],
|
|
10
10
|
"rootMainFiles": [
|
|
11
|
-
"static/chunks/webpack-
|
|
11
|
+
"static/chunks/webpack-61d3afac6d0f0ce7.js",
|
|
12
12
|
"static/chunks/4bd1b696-e5d7c65570c947b7.js",
|
|
13
13
|
"static/chunks/3794-337d1ca25ad99a89.js",
|
|
14
14
|
"static/chunks/main-app-d3d4c336195465f9.js"
|
|
@@ -78,8 +78,8 @@
|
|
|
78
78
|
"dynamicRoutes": {},
|
|
79
79
|
"notFoundRoutes": [],
|
|
80
80
|
"preview": {
|
|
81
|
-
"previewModeId": "
|
|
82
|
-
"previewModeSigningKey": "
|
|
83
|
-
"previewModeEncryptionKey": "
|
|
81
|
+
"previewModeId": "cfd305d0ba0974dc452e5957b205f5aa",
|
|
82
|
+
"previewModeSigningKey": "9e421b86649471d70168737defec8a7ff046164716d15e496e41c9f5f2b7ae02",
|
|
83
|
+
"previewModeEncryptionKey": "35460424da4dbaa1c9ca1fe6cc28113bdae7dcd85c6a9930e824e9cb4d80a926"
|
|
84
84
|
}
|
|
85
85
|
}
|
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
"static/chunks/363642f4.f9053a63f1b97508.js",
|
|
7
7
|
"static/chunks/4986-c2fc8845ce785303.js",
|
|
8
8
|
"static/chunks/2008.817d0885545aaea9.js",
|
|
9
|
-
"static/chunks/6502.
|
|
9
|
+
"static/chunks/6502.8b732f67a11b11b4.js"
|
|
10
10
|
]
|
|
11
11
|
},
|
|
12
12
|
"components/gsd/chat-mode.tsx -> react-markdown": {
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
<!DOCTYPE html><!--
|
|
2
|
-
@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}</style><h1 class="next-error-h1" style="display:inline-block;margin:0 20px 0 0;padding-right:23px;font-size:24px;font-weight:500;vertical-align:top">500</h1><div style="display:inline-block"><h2 style="font-size:14px;font-weight:400;line-height:28px">Internal Server Error.</h2></div></div></div><!--$--><!--/$--><script src="/_next/static/chunks/webpack-
|
|
1
|
+
<!DOCTYPE html><!--IoheXIe_5DH7ieX8AUo8U--><html id="__next_error__"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="script" fetchPriority="low" href="/_next/static/chunks/webpack-61d3afac6d0f0ce7.js"/><script src="/_next/static/chunks/4bd1b696-e5d7c65570c947b7.js" async=""></script><script src="/_next/static/chunks/3794-337d1ca25ad99a89.js" async=""></script><script src="/_next/static/chunks/main-app-d3d4c336195465f9.js" async=""></script><meta name="next-size-adjust" content=""/><title>500: Internal Server Error.</title><script src="/_next/static/chunks/polyfills-42372ed130431b0a.js" noModule=""></script></head><body><div hidden=""><!--$--><!--/$--></div><div style="font-family:system-ui,"Segoe UI",Roboto,Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";height:100vh;text-align:center;display:flex;flex-direction:column;align-items:center;justify-content:center"><div style="line-height:48px"><style>body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}
|
|
2
|
+
@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}</style><h1 class="next-error-h1" style="display:inline-block;margin:0 20px 0 0;padding-right:23px;font-size:24px;font-weight:500;vertical-align:top">500</h1><div style="display:inline-block"><h2 style="font-size:14px;font-weight:400;line-height:28px">Internal Server Error.</h2></div></div></div><!--$--><!--/$--><script src="/_next/static/chunks/webpack-61d3afac6d0f0ce7.js" id="_R_" async=""></script><script>(self.__next_f=self.__next_f||[]).push([0])</script><script>self.__next_f.push([1,"1:\"$Sreact.fragment\"\n2:I[57121,[],\"\"]\n3:I[74581,[],\"\"]\n4:I[90484,[],\"OutletBoundary\"]\n5:\"$Sreact.suspense\"\n7:I[90484,[],\"ViewportBoundary\"]\n9:I[90484,[],\"MetadataBoundary\"]\nb:I[27123,[],\"\"]\n"])</script><script>self.__next_f.push([1,"0:{\"P\":null,\"b\":\"IoheXIe-5DH7ieX8AUo8U\",\"c\":[\"\",\"_global-error\"],\"q\":\"\",\"i\":false,\"f\":[[[\"\",{\"children\":[\"_global-error\",{\"children\":[\"__PAGE__\",{}]}]}],[[\"$\",\"$1\",\"c\",{\"children\":[null,[\"$\",\"$L2\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L3\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":\"$undefined\",\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]]}],{\"children\":[[\"$\",\"$1\",\"c\",{\"children\":[null,[\"$\",\"$L2\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L3\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":\"$undefined\",\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]]}],{\"children\":[[\"$\",\"$1\",\"c\",{\"children\":[[\"$\",\"html\",null,{\"id\":\"__next_error__\",\"children\":[[\"$\",\"head\",null,{\"children\":[\"$\",\"title\",null,{\"children\":\"500: Internal Server Error.\"}]}],[\"$\",\"body\",null,{\"children\":[\"$\",\"div\",null,{\"style\":{\"fontFamily\":\"system-ui,\\\"Segoe UI\\\",Roboto,Helvetica,Arial,sans-serif,\\\"Apple Color Emoji\\\",\\\"Segoe UI Emoji\\\"\",\"height\":\"100vh\",\"textAlign\":\"center\",\"display\":\"flex\",\"flexDirection\":\"column\",\"alignItems\":\"center\",\"justifyContent\":\"center\"},\"children\":[\"$\",\"div\",null,{\"style\":{\"lineHeight\":\"48px\"},\"children\":[[\"$\",\"style\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}\\n@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}\"}}],[\"$\",\"h1\",null,{\"className\":\"next-error-h1\",\"style\":{\"display\":\"inline-block\",\"margin\":\"0 20px 0 0\",\"paddingRight\":23,\"fontSize\":24,\"fontWeight\":500,\"verticalAlign\":\"top\"},\"children\":\"500\"}],[\"$\",\"div\",null,{\"style\":{\"display\":\"inline-block\"},\"children\":[\"$\",\"h2\",null,{\"style\":{\"fontSize\":14,\"fontWeight\":400,\"lineHeight\":\"28px\"},\"children\":\"Internal Server Error.\"}]}]]}]}]}]]}],null,[\"$\",\"$L4\",null,{\"children\":[\"$\",\"$5\",null,{\"name\":\"Next.MetadataOutlet\",\"children\":\"$@6\"}]}]]}],{},null,false,false]},null,false,false]},null,false,false],[\"$\",\"$1\",\"h\",{\"children\":[null,[\"$\",\"$L7\",null,{\"children\":\"$L8\"}],[\"$\",\"div\",null,{\"hidden\":true,\"children\":[\"$\",\"$L9\",null,{\"children\":[\"$\",\"$5\",null,{\"name\":\"Next.Metadata\",\"children\":\"$La\"}]}]}],[\"$\",\"meta\",null,{\"name\":\"next-size-adjust\",\"content\":\"\"}]]}],false]],\"m\":\"$undefined\",\"G\":[\"$b\",[]],\"S\":true}\n"])</script><script>self.__next_f.push([1,"8:[[\"$\",\"meta\",\"0\",{\"charSet\":\"utf-8\"}],[\"$\",\"meta\",\"1\",{\"name\":\"viewport\",\"content\":\"width=device-width, initial-scale=1\"}]]\n"])</script><script>self.__next_f.push([1,"6:null\na:[]\n"])</script></body></html>
|
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
7:I[90484,[],"ViewportBoundary"]
|
|
7
7
|
9:I[90484,[],"MetadataBoundary"]
|
|
8
8
|
b:I[27123,[],""]
|
|
9
|
-
0:{"P":null,"b":"
|
|
9
|
+
0:{"P":null,"b":"IoheXIe-5DH7ieX8AUo8U","c":["","_global-error"],"q":"","i":false,"f":[[["",{"children":["_global-error",{"children":["__PAGE__",{}]}]}],[["$","$1","c",{"children":[null,["$","$L2",null,{"parallelRouterKey":"children","error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L3",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":"$undefined","forbidden":"$undefined","unauthorized":"$undefined"}]]}],{"children":[["$","$1","c",{"children":[null,["$","$L2",null,{"parallelRouterKey":"children","error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L3",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":"$undefined","forbidden":"$undefined","unauthorized":"$undefined"}]]}],{"children":[["$","$1","c",{"children":[["$","html",null,{"id":"__next_error__","children":[["$","head",null,{"children":["$","title",null,{"children":"500: Internal Server Error."}]}],["$","body",null,{"children":["$","div",null,{"style":{"fontFamily":"system-ui,\"Segoe UI\",Roboto,Helvetica,Arial,sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\"","height":"100vh","textAlign":"center","display":"flex","flexDirection":"column","alignItems":"center","justifyContent":"center"},"children":["$","div",null,{"style":{"lineHeight":"48px"},"children":[["$","style",null,{"dangerouslySetInnerHTML":{"__html":"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}\n@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}"}}],["$","h1",null,{"className":"next-error-h1","style":{"display":"inline-block","margin":"0 20px 0 0","paddingRight":23,"fontSize":24,"fontWeight":500,"verticalAlign":"top"},"children":"500"}],["$","div",null,{"style":{"display":"inline-block"},"children":["$","h2",null,{"style":{"fontSize":14,"fontWeight":400,"lineHeight":"28px"},"children":"Internal Server Error."}]}]]}]}]}]]}],null,["$","$L4",null,{"children":["$","$5",null,{"name":"Next.MetadataOutlet","children":"$@6"}]}]]}],{},null,false,false]},null,false,false]},null,false,false],["$","$1","h",{"children":[null,["$","$L7",null,{"children":"$L8"}],["$","div",null,{"hidden":true,"children":["$","$L9",null,{"children":["$","$5",null,{"name":"Next.Metadata","children":"$La"}]}]}],["$","meta",null,{"name":"next-size-adjust","content":""}]]}],false]],"m":"$undefined","G":["$b",[]],"S":true}
|
|
10
10
|
8:[["$","meta","0",{"charSet":"utf-8"}],["$","meta","1",{"name":"viewport","content":"width=device-width, initial-scale=1"}]]
|
|
11
11
|
6:null
|
|
12
12
|
a:[]
|
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
7:I[90484,[],"ViewportBoundary"]
|
|
7
7
|
9:I[90484,[],"MetadataBoundary"]
|
|
8
8
|
b:I[27123,[],""]
|
|
9
|
-
0:{"P":null,"b":"
|
|
9
|
+
0:{"P":null,"b":"IoheXIe-5DH7ieX8AUo8U","c":["","_global-error"],"q":"","i":false,"f":[[["",{"children":["_global-error",{"children":["__PAGE__",{}]}]}],[["$","$1","c",{"children":[null,["$","$L2",null,{"parallelRouterKey":"children","error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L3",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":"$undefined","forbidden":"$undefined","unauthorized":"$undefined"}]]}],{"children":[["$","$1","c",{"children":[null,["$","$L2",null,{"parallelRouterKey":"children","error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L3",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":"$undefined","forbidden":"$undefined","unauthorized":"$undefined"}]]}],{"children":[["$","$1","c",{"children":[["$","html",null,{"id":"__next_error__","children":[["$","head",null,{"children":["$","title",null,{"children":"500: Internal Server Error."}]}],["$","body",null,{"children":["$","div",null,{"style":{"fontFamily":"system-ui,\"Segoe UI\",Roboto,Helvetica,Arial,sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\"","height":"100vh","textAlign":"center","display":"flex","flexDirection":"column","alignItems":"center","justifyContent":"center"},"children":["$","div",null,{"style":{"lineHeight":"48px"},"children":[["$","style",null,{"dangerouslySetInnerHTML":{"__html":"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}\n@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}"}}],["$","h1",null,{"className":"next-error-h1","style":{"display":"inline-block","margin":"0 20px 0 0","paddingRight":23,"fontSize":24,"fontWeight":500,"verticalAlign":"top"},"children":"500"}],["$","div",null,{"style":{"display":"inline-block"},"children":["$","h2",null,{"style":{"fontSize":14,"fontWeight":400,"lineHeight":"28px"},"children":"Internal Server Error."}]}]]}]}]}]]}],null,["$","$L4",null,{"children":["$","$5",null,{"name":"Next.MetadataOutlet","children":"$@6"}]}]]}],{},null,false,false]},null,false,false]},null,false,false],["$","$1","h",{"children":[null,["$","$L7",null,{"children":"$L8"}],["$","div",null,{"hidden":true,"children":["$","$L9",null,{"children":["$","$5",null,{"name":"Next.Metadata","children":"$La"}]}]}],["$","meta",null,{"name":"next-size-adjust","content":""}]]}],false]],"m":"$undefined","G":["$b",[]],"S":true}
|
|
10
10
|
8:[["$","meta","0",{"charSet":"utf-8"}],["$","meta","1",{"name":"viewport","content":"width=device-width, initial-scale=1"}]]
|
|
11
11
|
6:null
|
|
12
12
|
a:[]
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
1:"$Sreact.fragment"
|
|
2
2
|
2:I[90484,[],"OutletBoundary"]
|
|
3
3
|
3:"$Sreact.suspense"
|
|
4
|
-
0:{"buildId":"
|
|
4
|
+
0:{"buildId":"IoheXIe-5DH7ieX8AUo8U","rsc":["$","$1","c",{"children":[["$","html",null,{"id":"__next_error__","children":[["$","head",null,{"children":["$","title",null,{"children":"500: Internal Server Error."}]}],["$","body",null,{"children":["$","div",null,{"style":{"fontFamily":"system-ui,\"Segoe UI\",Roboto,Helvetica,Arial,sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\"","height":"100vh","textAlign":"center","display":"flex","flexDirection":"column","alignItems":"center","justifyContent":"center"},"children":["$","div",null,{"style":{"lineHeight":"48px"},"children":[["$","style",null,{"dangerouslySetInnerHTML":{"__html":"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}\n@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}"}}],["$","h1",null,{"className":"next-error-h1","style":{"display":"inline-block","margin":"0 20px 0 0","paddingRight":23,"fontSize":24,"fontWeight":500,"verticalAlign":"top"},"children":"500"}],["$","div",null,{"style":{"display":"inline-block"},"children":["$","h2",null,{"style":{"fontSize":14,"fontWeight":400,"lineHeight":"28px"},"children":"Internal Server Error."}]}]]}]}]}]]}],null,["$","$L2",null,{"children":["$","$3",null,{"name":"Next.MetadataOutlet","children":"$@4"}]}]]}],"loading":null,"isPartial":false}
|
|
5
5
|
4:null
|
package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
1:"$Sreact.fragment"
|
|
2
2
|
2:I[57121,[],""]
|
|
3
3
|
3:I[74581,[],""]
|
|
4
|
-
0:{"buildId":"
|
|
4
|
+
0:{"buildId":"IoheXIe-5DH7ieX8AUo8U","rsc":["$","$1","c",{"children":[null,["$","$L2",null,{"parallelRouterKey":"children","template":["$","$L3",null,{}]}]]}],"loading":null,"isPartial":false}
|
|
@@ -2,4 +2,4 @@
|
|
|
2
2
|
2:I[90484,[],"ViewportBoundary"]
|
|
3
3
|
3:I[90484,[],"MetadataBoundary"]
|
|
4
4
|
4:"$Sreact.suspense"
|
|
5
|
-
0:{"buildId":"
|
|
5
|
+
0:{"buildId":"IoheXIe-5DH7ieX8AUo8U","rsc":["$","$1","h",{"children":[null,["$","$L2",null,{"children":[["$","meta","0",{"charSet":"utf-8"}],["$","meta","1",{"name":"viewport","content":"width=device-width, initial-scale=1"}]]}],["$","div",null,{"hidden":true,"children":["$","$L3",null,{"children":["$","$4",null,{"name":"Next.Metadata","children":[]}]}]}],["$","meta",null,{"name":"next-size-adjust","content":""}]]}],"loading":null,"isPartial":false}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
1:"$Sreact.fragment"
|
|
2
2
|
2:I[57121,[],""]
|
|
3
3
|
3:I[74581,[],""]
|
|
4
|
-
0:{"buildId":"
|
|
4
|
+
0:{"buildId":"IoheXIe-5DH7ieX8AUo8U","rsc":["$","$1","c",{"children":[null,["$","$L2",null,{"parallelRouterKey":"children","template":["$","$L3",null,{}]}]]}],"loading":null,"isPartial":false}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
0:{"buildId":"
|
|
1
|
+
0:{"buildId":"IoheXIe-5DH7ieX8AUo8U","tree":{"name":"","paramType":null,"paramKey":"","hasRuntimePrefetch":false,"slots":{"children":{"name":"_global-error","paramType":null,"paramKey":"_global-error","hasRuntimePrefetch":false,"slots":{"children":{"name":"__PAGE__","paramType":null,"paramKey":"__PAGE__","hasRuntimePrefetch":false,"slots":null,"isRootLayout":false}},"isRootLayout":false}},"isRootLayout":false},"staleTime":300}
|