garrytan/gstack · error · Error

Save failed: empty body. Cause: no content provided via --fr

Error message

Save failed: empty body.
Cause: no content provided via --from-file or stdin.
Action: pipe markdown into $B domain-skill save, or pass --from-file <path>.

What it means

Error "Save failed: empty body. Cause: no content provided via --from-file or stdin. Action: pipe markdown into $B domain-skill save, or pass --from-file <path>." thrown in garrytan/gstack.

Source

Thrown at browse/src/domain-skill-commands.ts:113

  }
  if (list.global.length > 0) {
    if (lines.length > 0) lines.push('');
    lines.push('Global (cross-project):');
    for (const r of list.global) {
      lines.push(`  ${r.host} — v${r.version}, ${r.body.length} bytes`);
    }
  }
  return lines.join('\n');
}

// ─── Subcommand handlers ────────────────────────────────────────

async function handleSave(args: string[], bm: BrowserManager): Promise<string> {
  const page = bm.getPage();
  const host = await deriveHostFromActiveTab(page);
  const body = await readBodyFromArgs(args);
  if (!body || !body.trim()) {
    throw new Error(
      'Save failed: empty body.\n' +
        'Cause: no content provided via --from-file or stdin.\n' +
        'Action: pipe markdown into $B domain-skill save, or pass --from-file <path>.'
    );
  }
  // L1-L3 content filters (datamarking, hidden-element strip, ARIA regex,
  // URL blocklist). The full L4 ML classifier runs at sidebar-agent prompt
  // injection time, not here (CLAUDE.md: classifier can't import in compiled binary).
  const filterResult = runContentFilters(body, page.url(), 'domain-skill-save');
  if (filterResult.blocked) {
    logTelemetry({ event: 'domain_skill_save_blocked', host, reason: filterResult.message });
    throw new Error(
      `Save blocked: ${filterResult.message}\n` +
        'Cause: skill body trips L1-L3 content filters (likely contains URL blocklist match or ARIA injection patterns).\n' +
        'Action: review the body for suspicious instruction-like content; rewrite and retry.'
    );
  }
  // L1-L3 score is binary (passed or not). For the L4 score field we leave 0

View on GitHub (pinned to 94993f7401)

When it happens

Trigger: Thrown at browse/src/domain-skill-commands.ts:113 when the library encounters an invalid state.

Common situations: See trigger scenarios.


AI-assisted analysis of garrytan/gstack@94993f7401 (2026-08-12). Data as JSON: /api/errors/f241259537f439d0. Report an issue: GitHub.