jackwener/OpenCLI · error
Failed to parse fixture ${p}: ${err instanceof Error ? err.m
Error message
Failed to parse fixture ${p}: ${err instanceof Error ? err.message : String(err)} What it means
loadFixture reads a fixture JSON file for a site/command pair and parses it. If the file exists but is unreadable or is not valid JSON, the low-level error is wrapped in a descriptive Error naming the fixture path and the parse failure, so callers know exactly which fixture is corrupt.
Source
Thrown at src/browser/verify-fixture.ts:122
/^hn_id$/i,
/^username$/i,
/^handle$/i,
/^uri$/i,
];
export function fixturePath(site: string, command: string): string {
return path.join(os.homedir(), '.opencli', 'sites', site, 'verify', `${command}.json`);
}
export function loadFixture(site: string, command: string): Fixture | null {
const p = fixturePath(site, command);
if (!fs.existsSync(p)) return null;
try {
const raw = fs.readFileSync(p, 'utf-8');
const parsed = JSON.parse(raw) as Fixture;
return parsed;
} catch (err) {
throw new Error(`Failed to parse fixture ${p}: ${err instanceof Error ? err.message : String(err)}`);
}
}
export function writeFixture(site: string, command: string, fixture: Fixture): string {
const p = fixturePath(site, command);
fs.mkdirSync(path.dirname(p), { recursive: true });
fs.writeFileSync(p, `${JSON.stringify(fixture, null, 2)}\n`, 'utf-8');
return p;
}
/**
* Derive a reasonable fixture from sample output. Used by `--write-fixture`
* to seed a first draft the author can hand-tune.
*
* Heuristics:
* - rowCount.min = 1 if rows non-empty, else 0
* - columns = keys from the first row
* - types = typeof of the first row's values, with "number|string" for mixedView on GitHub (pinned to 49907e53dc)
Solutions
- Open the path from the error message and fix the JSON syntax (validate with jq or a JSON linter).
- Delete the corrupt fixture and regenerate it with writeFixture by re-running the command that produces it.
- Check file permissions/readability if the wrapped message is a read error rather than a parse error.
- Verify the file has no BOM, comments, or trailing commas.
Example fix
// before (fixtures/foo.json)
{ "steps": [1, 2,] }
// after
{ "steps": [1, 2] } Defensive patterns
Strategy: fallback
Validate before calling
import { readFileSync, existsSync } from 'fs';
function fixtureLooksValid(p) {
if (!existsSync(p)) return true;
try { JSON.parse(readFileSync(p, 'utf-8')); return true; } catch { return false; }
} Type guard
function isFixture(v: unknown): v is Fixture {
return typeof v === 'object' && v !== null && !Array.isArray(v);
} Try / catch
try {
const fixture = loadFixture(site, command);
} catch (err) {
console.error(err.message);
// regenerate the corrupt fixture
writeFixture(site, command, defaultFixture);
fixture = defaultFixture;
} Prevention
- Validate fixture JSON with jq after hand edits.
- Always let writeFixture serialize fixtures instead of editing them manually.
- Treat fixture files as generated artifacts; regenerate rather than repair.
- Watch for concurrent runs writing the same fixture path.
When it happens
Trigger: The fixture file at fixturePath(site, command) exists but contains malformed JSON (trailing commas, truncated writes, hand-edited syntax errors) or cannot be read (permissions, encoding).
Common situations: Manually editing a fixture and breaking JSON; a crashed run leaving a half-written fixture via writeFixture; fixtures committed with BOM or comments; concurrent runs corrupting the file.
Understand the failure class
- Parsing and encoding errors: unexpected token, malformed input — why parsers reject input and how to find the real culprit.
Related errors
- MiniMax music returned malformed JSON: ${error?.message ?? e
- ${label} returned malformed JSON: ${err?.message ?? err}
- PARSE_ERROR
- Verify command returned no metric for baseline
- 12306 ${endpoint} returned an unexpected payload shape
AI-assisted analysis of jackwener/OpenCLI@49907e53dc (2026-08-29).
Data as JSON: /api/errors/f7ab1ed97beef9d3.
Report an issue: GitHub.