Skip to content

fix(codex): name the missing output path + remediation when codex exec didn't write - #301

Open
4gjnbzb4zf-sudo wants to merge 3 commits into
vibeforge1111:masterfrom
4gjnbzb4zf-sudo:sentinel/ux-friction/codex-missing-output-path
Open

fix(codex): name the missing output path + remediation when codex exec didn't write#301
4gjnbzb4zf-sudo wants to merge 3 commits into
vibeforge1111:masterfrom
4gjnbzb4zf-sudo:sentinel/ux-friction/codex-missing-output-path

Conversation

@4gjnbzb4zf-sudo

@4gjnbzb4zf-sudo 4gjnbzb4zf-sudo commented Jun 7, 2026

Copy link
Copy Markdown
Contributor

{
"schema": "spark-compete-hotfix-v1",
"event": "spark-compete-first-event",
"submission_mode": "public_repo_pr",
"submission_target_url": "#301",
"team": {
"name": "SparkThisUp",
"members": [
"ValHallaBuilder",
"Baz707",
"DanFireDash"
],
"github_accounts": [
"4gjnbzb4zf-sudo"
],
"llm_device_holder": "ValHallaBuilder",
"device_holder_github": "4gjnbzb4zf-sudo"
},
"target_repo": {
"id": "vibeforge1111/spark-character",
"source": "https://github.com/vibeforge1111/spark-character",
"owner_surface": "spark-character"
},
"issue": {
"type": "usage_friction",
"severity": "low",
"title": "call_codex codex exec did not write the expected output file. error omits the path it checked + the remediation",
"actual_behavior": "src/spark_character/codex_provider.py::call_codex raises bare RuntimeError("codex exec did not write the expected output file.") when out_path is missing after the codex exec subprocess returns with rc=0. The operator gets no path to inspect (the function knows the expected --output-last-message path locally), no information on what to check next (codex version, execution policy, --debug rerun), and no link to the codex_available probe path that catches the binary-missing case earlier. They have to read the source to learn what file was expected.",
"expected_behavior": "Same RuntimeError type and trigger condition, but the message names the expected out_path the function was checking and lists the typical remediation steps (codex binary version check, execution policy settings, --debug rerun). Pure-correct paths (out_path.exists() True) are byte-identical -- the new message only fires when the existence guard was already going to raise.",
"repro_steps": [
"gh pr checkout ",
"Force a no-output codex exec scenario (e.g., codex stub that returns rc=0 without writing the --output-last-message file).",
"Observe: BEFORE -> 'codex exec did not write the expected output file.' (operator has no path to inspect, no next step). AFTER -> 'codex exec did not write the expected output file at <out_path>. Check codex binary version, execution policy settings, or rerun with --debug to inspect the exec.'",
"Exception type preserved: still RuntimeError. The pure-correct branch (out_path.exists() True) returns the same out_path.read_text() result as before."
],
"affected_workflow": "Operators driving spark-character via the codex backend hit this error when the codex CLI runs but produces no output (codex binary version mismatch, execution policy that blocks file writes, etc). The previous bare message left them guessing about which path was being checked and what to try next."
},
"evidence": {
"safe_links_only": true,
"before_after_proof": "One file modified: src/spark_character/codex_provider.py. The change is a single RuntimeError raise expansion in call_codex's post-exec output-existence check. The new message interpolates the locally-known out_path via f-string and adds a one-line remediation hint. The codex_available probe path (which already filters the binary-missing case at line 93+) is unchanged. The pure-correct path returns the same value.",
"links": [
"https://github.com//pull/301"
],
"forbidden": [
"pdf",
"zip",
"exe",
"unknown downloads",
"shortened links",
"archives",
"binaries",
"tokens",
"browser cookies",
"wallet material",
"raw logs",
"raw conversations",
"raw memory",
"raw patches",
"private repo maps",
"private scoring details"
]
},
"proposed_fix": {
"approach": "Replace the bare RuntimeError message with an f-string that interpolates out_path and a one-line operator next-step hint (codex version / execution policy / --debug rerun). The change is contained to the existing existence-guard branch -- pure-correct paths stay byte-identical and the exception type does not change.",
"files_expected": [
"src/spark_character/codex_provider.py"
],
"tests_or_smoke": "python3 -m py_compile src/spark_character/codex_provider.py -> clean. Manual smoke: run a codex-backed call where the exec returns rc=0 but writes no file; observe the new RuntimeError message names the path and the three-step remediation. Exception type preserved (RuntimeError). The pure-correct branch returns out_path.read_text() identically."
},
"pr": {
"branch": "sentinel/ux-friction/codex-missing-output-path",
"title_prefix": "[spark-compete]",
"author_github": "4gjnbzb4zf-sudo",
"body_must_include": [
"packet",
"team",
"pr_author",
"repo",
"actual_behavior",
"expected_behavior",
"repro_steps",
"before_after_proof",
"tests_or_smoke",
"duplicate_notes",
"risk_notes",
"review_claim"
],
"url": "#301"
},
"review_claim": {
"impact_claim": "low",
"evidence_types": [
"redacted_terminal_excerpt"
],
"duplicate_notes": "Pre-flight gh pr list --repo vibeforge1111/spark-character --search 'codex_provider OR call_codex' --state all returned PR #295 (sibling on the SAME file, different lines/goal -- #295 narrows FileNotFoundError on the codex binary-missing probe path; this PR closes the parallel gap when the binary runs but produces no output file). No other PR touches the post-exec out_path.exists() branch.",
"risk_notes": "Local scope: one error message expanded in the existing existence-guard branch. Exception type preserved. Pure-correct paths byte-identical. No new dependency, no new module-level constant, no behavior change for valid exec runs.",
"review_state_requested": "pr_review"
}
}

…na.vN.md is missing

evolve.find_latest_persona and evolve_persona.find_latest_persona both
raise FileNotFoundError('No persona.vN.md artifacts found.') with no path
and no operator next-step. Operators running evolve against a fresh or
moved ARTIFACTS_DIR get a bare exception that doesn't tell them which
directory was checked or what to do.

Interpolate ARTIFACTS_DIR into the message and add the seed-persona /
ARTIFACTS_DIR-override remediation. Same exception type preserved; only
the message text changes.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant