gsd-pi 2.67.0-dev.43b0159 → 2.67.0-dev.46f9884

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.
Files changed (58) hide show
  1. package/dist/resources/extensions/gsd/commands/catalog.js +1 -2
  2. package/dist/resources/extensions/gsd/commands/dispatcher.js +1 -1
  3. package/dist/resources/extensions/gsd/commands/handlers/core.js +1 -91
  4. package/dist/resources/extensions/gsd/commands-prefs-wizard.js +5 -39
  5. package/dist/resources/extensions/gsd/prompts/complete-slice.md +3 -3
  6. package/dist/resources/extensions/gsd/prompts/execute-task.md +3 -3
  7. package/dist/resources/extensions/gsd/prompts/validate-milestone.md +5 -7
  8. package/dist/web/standalone/.next/BUILD_ID +1 -1
  9. package/dist/web/standalone/.next/app-path-routes-manifest.json +18 -18
  10. package/dist/web/standalone/.next/build-manifest.json +3 -3
  11. package/dist/web/standalone/.next/prerender-manifest.json +3 -3
  12. package/dist/web/standalone/.next/react-loadable-manifest.json +1 -1
  13. package/dist/web/standalone/.next/server/app/_global-error.html +2 -2
  14. package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
  15. package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  16. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  17. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  18. package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  19. package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  20. package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  21. package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
  22. package/dist/web/standalone/.next/server/app/_not-found.rsc +1 -1
  23. package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +1 -1
  24. package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  25. package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +1 -1
  26. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  27. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  28. package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
  29. package/dist/web/standalone/.next/server/app/api/settings-data/route.js +1 -1
  30. package/dist/web/standalone/.next/server/app/index.html +1 -1
  31. package/dist/web/standalone/.next/server/app/index.rsc +1 -1
  32. package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +1 -1
  33. package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +1 -1
  34. package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
  35. package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +1 -1
  36. package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +1 -1
  37. package/dist/web/standalone/.next/server/app-paths-manifest.json +18 -18
  38. package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
  39. package/dist/web/standalone/.next/server/middleware-react-loadable-manifest.js +1 -1
  40. package/dist/web/standalone/.next/server/pages/404.html +1 -1
  41. package/dist/web/standalone/.next/server/pages/500.html +2 -2
  42. package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
  43. package/dist/web/standalone/.next/static/chunks/{6502.b804e48b7919f55e.js → 6502.8874bcae249c02e1.js} +3 -3
  44. package/dist/web/standalone/.next/static/chunks/{webpack-65f0501b197d1c49.js → webpack-9fed74684e1c5bb1.js} +1 -1
  45. package/package.json +1 -1
  46. package/src/resources/extensions/gsd/commands/catalog.ts +1 -2
  47. package/src/resources/extensions/gsd/commands/dispatcher.ts +2 -1
  48. package/src/resources/extensions/gsd/commands/handlers/core.ts +2 -107
  49. package/src/resources/extensions/gsd/commands-prefs-wizard.ts +7 -38
  50. package/src/resources/extensions/gsd/prompts/complete-slice.md +3 -3
  51. package/src/resources/extensions/gsd/prompts/execute-task.md +3 -3
  52. package/src/resources/extensions/gsd/prompts/validate-milestone.md +5 -7
  53. package/src/resources/extensions/gsd/tests/commands-workflow-custom.test.ts +0 -12
  54. package/src/resources/extensions/gsd/tests/core-overlay-fallback.test.ts +0 -32
  55. package/src/resources/extensions/gsd/tests/preferences.test.ts +0 -17
  56. package/src/resources/extensions/gsd/tests/prompt-contracts.test.ts +3 -18
  57. /package/dist/web/standalone/.next/static/{CrKrzIIxk55witDF1eS0L → FRT6f5ou3wPxpZ7ojoB7E}/_buildManifest.js +0 -0
  58. /package/dist/web/standalone/.next/static/{CrKrzIIxk55witDF1eS0L → FRT6f5ou3wPxpZ7ojoB7E}/_ssgManifest.js +0 -0
@@ -4,7 +4,7 @@ import { join } from "node:path";
4
4
  import { loadRegistry } from "../workflow-templates.js";
5
5
  import { resolveProjectRoot } from "../worktree.js";
6
6
  const gsdHome = process.env.GSD_HOME || join(homedir(), ".gsd");
7
- export const GSD_COMMAND_DESCRIPTION = "GSD — Get Shit Done: /gsd help|start|templates|next|auto|stop|pause|status|widget|visualize|queue|quick|discuss|capture|triage|dispatch|history|undo|undo-task|reset-slice|rate|skip|export|cleanup|model|mode|prefs|config|keys|hooks|run-hook|skill-health|doctor|logs|forensics|changelog|migrate|remote|steer|knowledge|new-milestone|parallel|cmux|park|unpark|init|setup|inspect|extensions|update|fast|mcp|rethink|codebase|notifications";
7
+ export const GSD_COMMAND_DESCRIPTION = "GSD — Get Shit Done: /gsd help|start|templates|next|auto|stop|pause|status|widget|visualize|queue|quick|discuss|capture|triage|dispatch|history|undo|undo-task|reset-slice|rate|skip|export|cleanup|mode|prefs|config|keys|hooks|run-hook|skill-health|doctor|logs|forensics|changelog|migrate|remote|steer|knowledge|new-milestone|parallel|cmux|park|unpark|init|setup|inspect|extensions|update|fast|mcp|rethink|codebase|notifications";
8
8
  export const TOP_LEVEL_SUBCOMMANDS = [
9
9
  { cmd: "help", desc: "Categorized command reference with descriptions" },
10
10
  { cmd: "next", desc: "Explicit step mode (same as /gsd)" },
@@ -29,7 +29,6 @@ export const TOP_LEVEL_SUBCOMMANDS = [
29
29
  { cmd: "skip", desc: "Prevent a unit from auto-mode dispatch" },
30
30
  { cmd: "export", desc: "Export milestone/slice results" },
31
31
  { cmd: "cleanup", desc: "Remove merged branches or snapshots" },
32
- { cmd: "model", desc: "Switch the active session model or open a picker" },
33
32
  { cmd: "mode", desc: "Switch workflow mode (solo/team)" },
34
33
  { cmd: "prefs", desc: "Manage preferences (model selection, timeouts, etc.)" },
35
34
  { cmd: "config", desc: "Set API keys for external tools" },
@@ -6,7 +6,7 @@ import { handleWorkflowCommand } from "./handlers/workflow.js";
6
6
  export async function handleGSDCommand(args, ctx, pi) {
7
7
  const trimmed = (typeof args === "string" ? args : "").trim();
8
8
  const handlers = [
9
- () => handleCoreCommand(trimmed, ctx, pi),
9
+ () => handleCoreCommand(trimmed, ctx),
10
10
  () => handleAutoCommand(trimmed, ctx, pi),
11
11
  () => handleParallelCommand(trimmed, ctx, pi),
12
12
  () => handleWorkflowCommand(trimmed, ctx, pi),
@@ -44,7 +44,6 @@ export function showHelp(ctx) {
44
44
  "SETUP & CONFIGURATION",
45
45
  " /gsd init Project init wizard — detect, configure, bootstrap .gsd/",
46
46
  " /gsd setup Global setup status [llm|search|remote|keys|prefs]",
47
- " /gsd model Switch active session model [provider/model|model-id]",
48
47
  " /gsd mode Set workflow mode (solo/team) [global|project]",
49
48
  " /gsd prefs Manage preferences [global|project|status|wizard|setup|import-claude]",
50
49
  " /gsd cmux Manage cmux integration [status|on|off|notifications|sidebar|splits|browser]",
@@ -153,92 +152,7 @@ export async function handleSetup(args, ctx) {
153
152
  " /gsd setup keys — Tool API keys\n" +
154
153
  " /gsd setup prefs — Global preferences wizard", "info");
155
154
  }
156
- function sortModelsForSelection(models, currentModel) {
157
- return [...models].sort((a, b) => {
158
- const aCurrent = currentModel && a.provider === currentModel.provider && a.id === currentModel.id;
159
- const bCurrent = currentModel && b.provider === currentModel.provider && b.id === currentModel.id;
160
- if (aCurrent && !bCurrent)
161
- return -1;
162
- if (!aCurrent && bCurrent)
163
- return 1;
164
- const providerCmp = a.provider.localeCompare(b.provider);
165
- if (providerCmp !== 0)
166
- return providerCmp;
167
- return a.id.localeCompare(b.id);
168
- });
169
- }
170
- async function resolveRequestedModel(query, ctx) {
171
- const { resolveModelId } = await import("../../auto-model-selection.js");
172
- const models = ctx.modelRegistry.getAvailable();
173
- const exact = resolveModelId(query, models, ctx.model?.provider);
174
- if (exact)
175
- return exact;
176
- const lowerQuery = query.toLowerCase();
177
- const partialMatches = models.filter((model) => model.id.toLowerCase().includes(lowerQuery)
178
- || `${model.provider}/${model.id}`.toLowerCase().includes(lowerQuery));
179
- if (partialMatches.length === 1)
180
- return partialMatches[0];
181
- if (partialMatches.length === 0 || !ctx.hasUI)
182
- return undefined;
183
- const sorted = sortModelsForSelection(partialMatches, ctx.model);
184
- const optionToModel = new Map();
185
- const options = sorted.map((model) => {
186
- const label = `${model.provider}/${model.id}`;
187
- optionToModel.set(label, model);
188
- return label;
189
- });
190
- options.push("(cancel)");
191
- const choice = await ctx.ui.select(`Multiple models match "${query}" — choose one:`, options);
192
- if (!choice || typeof choice !== "string" || choice === "(cancel)")
193
- return undefined;
194
- return optionToModel.get(choice);
195
- }
196
- async function handleModel(trimmedArgs, ctx, pi) {
197
- const availableModels = ctx.modelRegistry.getAvailable();
198
- if (availableModels.length === 0) {
199
- ctx.ui.notify("No available models found. Check provider auth and model discovery.", "warning");
200
- return;
201
- }
202
- if (!pi) {
203
- ctx.ui.notify("Model switching is unavailable in this context.", "warning");
204
- return;
205
- }
206
- const trimmed = trimmedArgs.trim();
207
- let targetModel;
208
- if (!trimmed) {
209
- if (!ctx.hasUI) {
210
- const current = ctx.model ? `${ctx.model.provider}/${ctx.model.id}` : "(none)";
211
- ctx.ui.notify(`Current model: ${current}\nUsage: /gsd model <provider/model|model-id>`, "info");
212
- return;
213
- }
214
- const optionToModel = new Map();
215
- const options = sortModelsForSelection(availableModels, ctx.model).map((model) => {
216
- const isCurrent = ctx.model && model.provider === ctx.model.provider && model.id === ctx.model.id;
217
- const label = `${isCurrent ? "* " : ""}${model.provider}/${model.id}`;
218
- optionToModel.set(label, model);
219
- return label;
220
- });
221
- options.push("(cancel)");
222
- const choice = await ctx.ui.select("Select session model:", options);
223
- if (!choice || typeof choice !== "string" || choice === "(cancel)")
224
- return;
225
- targetModel = optionToModel.get(choice);
226
- }
227
- else {
228
- targetModel = await resolveRequestedModel(trimmed, ctx);
229
- }
230
- if (!targetModel) {
231
- ctx.ui.notify(`Model "${trimmed}" not found. Use /gsd model with an exact provider/model or a unique model ID.`, "warning");
232
- return;
233
- }
234
- const ok = await pi.setModel(targetModel);
235
- if (!ok) {
236
- ctx.ui.notify(`No API key for ${targetModel.provider}/${targetModel.id}`, "warning");
237
- return;
238
- }
239
- ctx.ui.notify(`Model: ${targetModel.provider}/${targetModel.id}`, "info");
240
- }
241
- export async function handleCoreCommand(trimmed, ctx, pi) {
155
+ export async function handleCoreCommand(trimmed, ctx) {
242
156
  if (trimmed === "help" || trimmed === "h" || trimmed === "?") {
243
157
  showHelp(ctx);
244
158
  return true;
@@ -263,10 +177,6 @@ export async function handleCoreCommand(trimmed, ctx, pi) {
263
177
  ctx.ui.notify(`Widget: ${getWidgetMode()}`, "info");
264
178
  return true;
265
179
  }
266
- if (trimmed === "model" || trimmed.startsWith("model ")) {
267
- await handleModel(trimmed.replace(/^model\s*/, "").trim(), ctx, pi);
268
- return true;
269
- }
270
180
  if (trimmed === "mode" || trimmed.startsWith("mode ")) {
271
181
  const modeArgs = trimmed.replace(/^mode\s*/, "").trim();
272
182
  const scope = modeArgs === "project" ? "project" : "global";
@@ -137,7 +137,7 @@ export function buildCategorySummaries(prefs) {
137
137
  const models = prefs.models;
138
138
  let modelsSummary = "(not configured)";
139
139
  if (models && Object.keys(models).length > 0) {
140
- const parts = Object.entries(models).map(([phase, model]) => `${phase}: ${formatConfiguredModel(model)}`);
140
+ const parts = Object.entries(models).map(([phase, model]) => `${phase}: ${model}`);
141
141
  modelsSummary = parts.join(", ");
142
142
  }
143
143
  // Timeouts
@@ -220,39 +220,8 @@ export function buildCategorySummaries(prefs) {
220
220
  };
221
221
  }
222
222
  // ─── Category configuration functions ────────────────────────────────────────
223
- export function formatConfiguredModel(config) {
224
- if (typeof config === "string")
225
- return config;
226
- if (!config || typeof config !== "object")
227
- return "(invalid)";
228
- const maybeConfig = config;
229
- if (typeof maybeConfig.model !== "string" || maybeConfig.model.trim() === "")
230
- return "(invalid)";
231
- if (typeof maybeConfig.provider === "string" && maybeConfig.provider && !maybeConfig.model.includes("/")) {
232
- return `${maybeConfig.provider}/${maybeConfig.model}`;
233
- }
234
- return maybeConfig.model;
235
- }
236
- export function toPersistedModelId(provider, modelId) {
237
- if (!provider.trim())
238
- return modelId;
239
- const normalizedProvider = provider.trim();
240
- const normalizedModelId = modelId.trim();
241
- return normalizedModelId.startsWith(`${normalizedProvider}/`)
242
- ? normalizedModelId
243
- : `${normalizedProvider}/${normalizedModelId}`;
244
- }
245
223
  async function configureModels(ctx, prefs) {
246
- const modelPhases = [
247
- "research",
248
- "planning",
249
- "discuss",
250
- "execution",
251
- "execution_simple",
252
- "completion",
253
- "validation",
254
- "subagent",
255
- ];
224
+ const modelPhases = ["research", "planning", "execution", "completion"];
256
225
  const models = prefs.models ?? {};
257
226
  const availableModels = ctx.modelRegistry.getAvailable();
258
227
  if (availableModels.length > 0) {
@@ -284,7 +253,7 @@ async function configureModels(ctx, prefs) {
284
253
  });
285
254
  providerOptions.push("(keep current)", "(clear)", "(type manually)");
286
255
  for (const phase of modelPhases) {
287
- const current = formatConfiguredModel(models[phase]);
256
+ const current = models[phase] ?? "";
288
257
  const phaseLabel = `Model for ${phase} phase${current ? ` (current: ${current})` : ""}`;
289
258
  // Step 1: pick provider
290
259
  const providerChoice = await ctx.ui.select(`${phaseLabel} — choose provider:`, providerOptions);
@@ -316,14 +285,14 @@ async function configureModels(ctx, prefs) {
316
285
  delete models[phase];
317
286
  }
318
287
  else {
319
- models[phase] = toPersistedModelId(providerName, modelChoice);
288
+ models[phase] = modelChoice;
320
289
  }
321
290
  }
322
291
  }
323
292
  }
324
293
  else {
325
294
  for (const phase of modelPhases) {
326
- const current = formatConfiguredModel(models[phase]);
295
+ const current = models[phase] ?? "";
327
296
  const input = await ctx.ui.input(`Model for ${phase} phase${current ? ` (current: ${current})` : ""}:`, current || "e.g. claude-sonnet-4-20250514");
328
297
  if (input !== null && input !== undefined) {
329
298
  const val = input.trim();
@@ -339,9 +308,6 @@ async function configureModels(ctx, prefs) {
339
308
  if (Object.keys(models).length > 0) {
340
309
  prefs.models = models;
341
310
  }
342
- else {
343
- delete prefs.models;
344
- }
345
311
  }
346
312
  async function configureTimeouts(ctx, prefs) {
347
313
  const autoSup = prefs.auto_supervisor ?? {};
@@ -25,11 +25,11 @@ Then:
25
25
  4. If the slice plan includes observability/diagnostic surfaces, confirm they work. Skip this for simple slices that don't have observability sections.
26
26
  5. If the slice involved runtime behavior, fill the **Operational Readiness** section (Q8) in the slice summary: health signal, failure signal, recovery procedure, and monitoring gaps. Omit entirely for simple slices with no runtime concerns.
27
27
  6. If this slice produced evidence that a requirement changed status (Active → Validated, Active → Deferred, etc.), call `gsd_requirement_update` with the requirement ID, updated `status`, and `validation` evidence. Do NOT write `.gsd/REQUIREMENTS.md` directly — the engine renders it from the database.
28
- 7. Prepare the slice completion content you will pass to `gsd_complete_slice` using the camelCase fields `milestoneId`, `sliceId`, `sliceTitle`, `oneLiner`, `narrative`, `verification`, and `uatContent`. Do **not** manually write `{{sliceSummaryPath}}`. Do **not** manually write `{{sliceUatPath}}` the DB-backed tool is the canonical write path for both artifacts.
29
- 8. Draft the UAT content you will pass as `uatContent` — a concrete UAT script with real test cases derived from the slice plan and task summaries. Include preconditions, numbered steps with expected outcomes, and edge cases. This must NOT be a placeholder or generic template — tailor every test case to what this slice actually built.
28
+ 7. Write `{{sliceSummaryPath}}` (compress all task summaries).
29
+ 8. Write `{{sliceUatPath}}` — a concrete UAT script with real test cases derived from the slice plan and task summaries. Include preconditions, numbered steps with expected outcomes, and edge cases. This must NOT be a placeholder or generic template — tailor every test case to what this slice actually built.
30
30
  9. Review task summaries for `key_decisions`. Append any significant decisions to `.gsd/DECISIONS.md` if missing.
31
31
  10. Review task summaries for patterns, gotchas, or non-obvious lessons learned. If any would save future agents from repeating investigation or hitting the same issues, append them to `.gsd/KNOWLEDGE.md`. Only add entries that are genuinely useful — don't pad with obvious observations.
32
- 11. Call `gsd_complete_slice` with the camelCase fields `milestoneId`, `sliceId`, `sliceTitle`, `oneLiner`, `narrative`, `verification`, and `uatContent`, plus any optional enrichment fields you have. Do NOT manually mark the roadmap checkbox — the tool writes to the DB, renders `{{sliceSummaryPath}}` and `{{sliceUatPath}}`, and updates the ROADMAP.md projection automatically.
32
+ 11. Call `gsd_complete_slice` with milestoneId, sliceId, the slice summary, and the UAT result. Do NOT manually mark the roadmap checkbox — the tool writes to the DB and renders the ROADMAP.md projection automatically.
33
33
  12. Do not run git commands — the system commits your changes and handles any merge after this unit succeeds.
34
34
  13. Update `.gsd/PROJECT.md` if it exists — refresh current state if needed: use the `write` tool with `path: ".gsd/PROJECT.md"` and `content` containing the full updated document reflecting current project state. Do NOT use the `edit` tool for this — PROJECT.md is a full-document refresh.
35
35
 
@@ -69,14 +69,14 @@ Then:
69
69
  16. If you made an architectural, pattern, library, or observability decision during this task that downstream work should know about, append it to `.gsd/DECISIONS.md` (read the template at `~/.gsd/agent/extensions/gsd/templates/decisions.md` if the file doesn't exist yet). Not every task produces decisions — only append when a meaningful choice was made.
70
70
  17. If you discover a non-obvious rule, recurring gotcha, or useful pattern during execution, append it to `.gsd/KNOWLEDGE.md`. Only add entries that would save future agents from repeating your investigation. Don't add obvious things.
71
71
  18. Read the template at `~/.gsd/agent/extensions/gsd/templates/task-summary.md`
72
- 19. Use that template to prepare the completion content you will pass to `gsd_complete_task` using the camelCase fields `milestoneId`, `sliceId`, `taskId`, `oneLiner`, `narrative`, `verification`, and `verificationEvidence`. Do **not** manually write `{{taskSummaryPath}}` — the DB-backed tool is the canonical write path and renders the summary file for you.
73
- 20. Call `gsd_complete_task` with milestoneId, sliceId, taskId, and the completion fields derived from the template. This is your final required step — do NOT manually edit PLAN.md checkboxes. The tool marks the task complete, updates the DB, renders `{{taskSummaryPath}}`, and updates PLAN.md automatically.
72
+ 19. Write `{{taskSummaryPath}}`
73
+ 20. Call `gsd_complete_task` with milestoneId, sliceId, taskId, and a summary of what was accomplished. This is your final required step — do NOT manually edit PLAN.md checkboxes. The tool marks the task complete, updates the DB, and renders PLAN.md automatically.
74
74
  21. Do not run git commands — the system reads your task summary after completion and creates a meaningful commit from it (type inferred from title, message from your one-liner, key files from frontmatter). Write a clear, specific one-liner in the summary — it becomes the commit message.
75
75
 
76
76
  All work stays in your working directory: `{{workingDirectory}}`.
77
77
 
78
78
  **Autonomous execution:** Do not call `ask_user_questions` or `secure_env_collect`. You are running in auto-mode — there is no human available to answer questions. Make reasonable assumptions and document them in the task summary. If a decision genuinely requires human input, note it in the summary and proceed with the best available option.
79
79
 
80
- **You MUST call `gsd_complete_task` before finishing. Do not manually write `{{taskSummaryPath}}`.**
80
+ **You MUST call `gsd_complete_task` AND write `{{taskSummaryPath}}` before finishing.**
81
81
 
82
82
  When done, say: "Task {{taskId}} complete."
@@ -40,9 +40,9 @@ After all reviewers complete, aggregate their verdicts:
40
40
  - If any reviewer says NEEDS-ATTENTION → overall verdict: `needs-attention`
41
41
  - If any reviewer says FAIL → overall verdict: `needs-remediation`
42
42
 
43
- ### Step 3 — Persist Validation
43
+ ### Step 3 — Write VALIDATION File
44
44
 
45
- Prepare the validation content you will pass to `gsd_validate_milestone`. Do **not** manually write `{{validationPath}}` — the DB-backed tool is the canonical write path and renders the validation file for you.
45
+ Write to `{{validationPath}}`:
46
46
 
47
47
  ```markdown
48
48
  ---
@@ -69,15 +69,13 @@ reviewers: 3
69
69
  <if verdict is not pass: specific actions required>
70
70
  ```
71
71
 
72
- Call `gsd_validate_milestone` with the camelCase fields `milestoneId`, `verdict`, `remediationRound`, `successCriteriaChecklist`, `sliceDeliveryAudit`, `crossSliceIntegration`, `requirementCoverage`, `verdictRationale`, and `remediationPlan` when needed. If you include verification-class analysis, pass it in `verificationClasses`.
73
-
74
72
  **DB access safety:** Do NOT query `.gsd/gsd.db` directly via `sqlite3` or `node -e require('better-sqlite3')` — the engine owns the WAL connection. Use `gsd_milestone_status` to read milestone and slice state. All data you need is already inlined in the context above or accessible via the `gsd_*` tools. Direct DB access corrupts the WAL and bypasses tool-level validation.
75
73
 
76
74
  If verdict is `needs-remediation`:
77
- - Use `gsd_reassess_roadmap` to add the remediation slices instead of editing `{{roadmapPath}}` manually
78
- - Those slices will be planned and executed before validation re-runs
75
+ - Add new slices to `{{roadmapPath}}` with unchecked `[ ]` status
76
+ - These slices will be planned and executed before validation re-runs
79
77
 
80
- **You MUST call `gsd_validate_milestone` before finishing. Do not manually write `{{validationPath}}`.**
78
+ **You MUST write `{{validationPath}}` before finishing.**
81
79
 
82
80
  **File system safety:** When scanning milestone directories for evidence, use `ls` or `find` to list directory contents first — never pass a directory path (e.g. `tasks/`, `slices/`) directly to the `read` tool. The `read` tool only accepts file paths, not directories.
83
81
 
@@ -1 +1 @@
1
- CrKrzIIxk55witDF1eS0L
1
+ FRT6f5ou3wPxpZ7ojoB7E
@@ -2,46 +2,46 @@
2
2
  "/_not-found/page": "/_not-found",
3
3
  "/_global-error/page": "/_global-error",
4
4
  "/api/boot/route": "/api/boot",
5
- "/api/bridge-terminal/input/route": "/api/bridge-terminal/input",
6
5
  "/api/bridge-terminal/resize/route": "/api/bridge-terminal/resize",
6
+ "/api/bridge-terminal/input/route": "/api/bridge-terminal/input",
7
+ "/api/bridge-terminal/stream/route": "/api/bridge-terminal/stream",
7
8
  "/api/dev-mode/route": "/api/dev-mode",
9
+ "/api/browse-directories/route": "/api/browse-directories",
8
10
  "/api/cleanup/route": "/api/cleanup",
11
+ "/api/captures/route": "/api/captures",
9
12
  "/api/doctor/route": "/api/doctor",
10
- "/api/browse-directories/route": "/api/browse-directories",
11
13
  "/api/export-data/route": "/api/export-data",
12
14
  "/api/forensics/route": "/api/forensics",
13
- "/api/captures/route": "/api/captures",
14
15
  "/api/git/route": "/api/git",
15
- "/api/history/route": "/api/history",
16
16
  "/api/hooks/route": "/api/hooks",
17
- "/api/inspect/route": "/api/inspect",
17
+ "/api/history/route": "/api/history",
18
18
  "/api/knowledge/route": "/api/knowledge",
19
+ "/api/inspect/route": "/api/inspect",
19
20
  "/api/live-state/route": "/api/live-state",
20
21
  "/api/experimental/route": "/api/experimental",
21
- "/api/bridge-terminal/stream/route": "/api/bridge-terminal/stream",
22
22
  "/api/notifications/route": "/api/notifications",
23
- "/api/recovery/route": "/api/recovery",
24
23
  "/api/preferences/route": "/api/preferences",
25
- "/api/session/browser/route": "/api/session/browser",
24
+ "/api/recovery/route": "/api/recovery",
26
25
  "/api/projects/route": "/api/projects",
27
- "/api/session/command/route": "/api/session/command",
26
+ "/api/session/browser/route": "/api/session/browser",
28
27
  "/api/onboarding/route": "/api/onboarding",
28
+ "/api/session/command/route": "/api/session/command",
29
+ "/api/settings-data/route": "/api/settings-data",
29
30
  "/api/session/events/route": "/api/session/events",
30
- "/api/session/manage/route": "/api/session/manage",
31
+ "/api/skill-health/route": "/api/skill-health",
31
32
  "/api/shutdown/route": "/api/shutdown",
32
- "/api/settings-data/route": "/api/settings-data",
33
- "/api/terminal/input/route": "/api/terminal/input",
33
+ "/api/session/manage/route": "/api/session/manage",
34
34
  "/api/steer/route": "/api/steer",
35
+ "/api/terminal/input/route": "/api/terminal/input",
36
+ "/api/files/route": "/api/files",
35
37
  "/api/switch-root/route": "/api/switch-root",
36
- "/api/terminal/resize/route": "/api/terminal/resize",
37
- "/api/skill-health/route": "/api/skill-health",
38
38
  "/api/terminal/sessions/route": "/api/terminal/sessions",
39
- "/api/terminal/upload/route": "/api/terminal/upload",
40
- "/api/terminal/stream/route": "/api/terminal/stream",
39
+ "/api/terminal/resize/route": "/api/terminal/resize",
41
40
  "/api/visualizer/route": "/api/visualizer",
42
- "/api/update/route": "/api/update",
43
41
  "/api/undo/route": "/api/undo",
42
+ "/api/terminal/stream/route": "/api/terminal/stream",
43
+ "/api/update/route": "/api/update",
44
44
  "/api/remote-questions/route": "/api/remote-questions",
45
- "/api/files/route": "/api/files",
45
+ "/api/terminal/upload/route": "/api/terminal/upload",
46
46
  "/page": "/"
47
47
  }
@@ -4,11 +4,11 @@
4
4
  ],
5
5
  "devFiles": [],
6
6
  "lowPriorityFiles": [
7
- "static/CrKrzIIxk55witDF1eS0L/_buildManifest.js",
8
- "static/CrKrzIIxk55witDF1eS0L/_ssgManifest.js"
7
+ "static/FRT6f5ou3wPxpZ7ojoB7E/_buildManifest.js",
8
+ "static/FRT6f5ou3wPxpZ7ojoB7E/_ssgManifest.js"
9
9
  ],
10
10
  "rootMainFiles": [
11
- "static/chunks/webpack-65f0501b197d1c49.js",
11
+ "static/chunks/webpack-9fed74684e1c5bb1.js",
12
12
  "static/chunks/4bd1b696-e5d7c65570c947b7.js",
13
13
  "static/chunks/3794-337d1ca25ad99a89.js",
14
14
  "static/chunks/main-app-fdab67f7802d7832.js"
@@ -78,8 +78,8 @@
78
78
  "dynamicRoutes": {},
79
79
  "notFoundRoutes": [],
80
80
  "preview": {
81
- "previewModeId": "a1f1a3b82739c8573081cf79eb9b55b9",
82
- "previewModeSigningKey": "45cb31c58e849530252dabd187be0cc92f253cb3e7ca4c9a39222d41e8d6efb1",
83
- "previewModeEncryptionKey": "c6731bbad9a37e7296023fa699e941d252ac6a8b4cce4f4e1f313f5cd517740e"
81
+ "previewModeId": "bbe6c686c4a57f8dc695113c1f101d92",
82
+ "previewModeSigningKey": "ffae9f8bf1c7f6c2b23ab516a9d39761f8d8122f00795dfd23d30669f7122459",
83
+ "previewModeEncryptionKey": "d9efa46afb760c77c90ee31e6f00d2966a87bcbef8ecfb4f84ec3533a57ed265"
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.b804e48b7919f55e.js"
9
+ "static/chunks/6502.8874bcae249c02e1.js"
10
10
  ]
11
11
  },
12
12
  "components/gsd/chat-mode.tsx -> react-markdown": {
@@ -1,2 +1,2 @@
1
- <!DOCTYPE html><!--CrKrzIIxk55witDF1eS0L--><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-65f0501b197d1c49.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-fdab67f7802d7832.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,&quot;Segoe UI&quot;,Roboto,Helvetica,Arial,sans-serif,&quot;Apple Color Emoji&quot;,&quot;Segoe UI Emoji&quot;;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-65f0501b197d1c49.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\":\"CrKrzIIxk55witDF1eS0L\",\"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>
1
+ <!DOCTYPE html><!--FRT6f5ou3wPxpZ7ojoB7E--><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-9fed74684e1c5bb1.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-fdab67f7802d7832.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,&quot;Segoe UI&quot;,Roboto,Helvetica,Arial,sans-serif,&quot;Apple Color Emoji&quot;,&quot;Segoe UI Emoji&quot;;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-9fed74684e1c5bb1.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\":\"FRT6f5ou3wPxpZ7ojoB7E\",\"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":"CrKrzIIxk55witDF1eS0L","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}
9
+ 0:{"P":null,"b":"FRT6f5ou3wPxpZ7ojoB7E","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":"CrKrzIIxk55witDF1eS0L","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}
9
+ 0:{"P":null,"b":"FRT6f5ou3wPxpZ7ojoB7E","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":"CrKrzIIxk55witDF1eS0L","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}
4
+ 0:{"buildId":"FRT6f5ou3wPxpZ7ojoB7E","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
@@ -1,4 +1,4 @@
1
1
  1:"$Sreact.fragment"
2
2
  2:I[57121,[],""]
3
3
  3:I[74581,[],""]
4
- 0:{"buildId":"CrKrzIIxk55witDF1eS0L","rsc":["$","$1","c",{"children":[null,["$","$L2",null,{"parallelRouterKey":"children","template":["$","$L3",null,{}]}]]}],"loading":null,"isPartial":false}
4
+ 0:{"buildId":"FRT6f5ou3wPxpZ7ojoB7E","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":"CrKrzIIxk55witDF1eS0L","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}
5
+ 0:{"buildId":"FRT6f5ou3wPxpZ7ojoB7E","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":"CrKrzIIxk55witDF1eS0L","rsc":["$","$1","c",{"children":[null,["$","$L2",null,{"parallelRouterKey":"children","template":["$","$L3",null,{}]}]]}],"loading":null,"isPartial":false}
4
+ 0:{"buildId":"FRT6f5ou3wPxpZ7ojoB7E","rsc":["$","$1","c",{"children":[null,["$","$L2",null,{"parallelRouterKey":"children","template":["$","$L3",null,{}]}]]}],"loading":null,"isPartial":false}
@@ -1 +1 @@
1
- 0:{"buildId":"CrKrzIIxk55witDF1eS0L","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}
1
+ 0:{"buildId":"FRT6f5ou3wPxpZ7ojoB7E","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}