code-yeongyu / code-yeongyu/lazycodex

agx: empty output on HTML-generation charges (already fixed in wrapper)

Open
#152 0 comments 0 reactions 0 assignees View on GitHub
Dominant language
TypeScript
Stars
3.5k
Forks
216
PR merge metrics
No merged PRs in 30d

Description

## Summary
agx (Antigravity wrapper) returns 0 bytes with exit 0 on charges that ask it to produce HTML/files. The caller only discovers the failure by checking output size.

## Environment
- LazyCodex: 4.15.1 (this harness)
- agx wrapper: `~/AI/Tools/agx` (current)
- Reproduction: 2026-08-04 FleetOpus Sea of Demand visualization charge (5.4KB prompt → self-contained HTML dashboard)
- Prior occurrences: sprite-factory (2026-07-25), portfolio roadmap (2026-07-28)

## Repository Decision
- Target: code-yeongyu/lazycodex
- Why: The agx wrapper lives in the operator's `~/AI/Tools/` fleet dispatch layer, which is a LazyCodex-orchestrated harness integration. The defect (silent empty output) was in the wrapper, not upstream Codex or Antigravity core.

## Reproduction
1. Dispatch via agx (or a stale path to agx) with a prompt that says "output HTML" or "write a file"
2. agy runs in headless mode (no `--sandbox` or denied writes)
3. Model attempts write → denied silently → returns nothing
4. Wrapper previously exited 0 with empty stdout

## Expected Behavior
Wrapper detects empty output or no written artifact and exits 1 with a clear diagnostic.

## Actual Behavior (historical)
Wrapper exited 0, 0 bytes stdout, 0 bytes stderr. Caller treated it as success.

## Evidence
- agx source at `~/AI/Tools/agx` (137 lines) already contains the guard:
- Lines 96-104: `if [ "$STATUS" -eq 0 ] && [ -z "$RESULT" ]` → `echo "agx: agy exited 0 but produced NO output — refusing to report success" >&2; exit 1`
- Lines 108-116: AGX_OUT snapshot-diff guard → exit 1 if no new artifacts written
- Comments in the wrapper cite the exact prior failures (2026-07-25, 2026-07-29) and the design rationale for the artifact guard.
- The guard was added after the 2026-07-25/07-28 incidents; the 2026-08-04 reproduction suggests the caller used a stale agx path or invoked `agy` directly.

## Root Cause
The wrapper lacked an empty-output + AGX_OUT guard. When agy (headless) silently denied a write, the wrapper reported success on nothing. The guard now exists.

## Proposed Fix
**Already implemented.** The current agx wrapper (Option 1 + Option 3 from the report) does exactly what the recommendation asked for:
- Detects empty stdout + exit 0 → exit 1 with message
- In AGX_OUT mode, diffs the output directory and refuses on empty diff
- Documents the "print to stdout, not write a file" discipline in the artifact-mode contract (lines 81-87)

**Action for caller:** ensure `~/AI/Tools/agx` (or the current agx in PATH) is the one being dispatched. If a different code path calls `agy` directly, route it through agx or replicate the guard.

## Verification Plan
- Re-run the Sea of Demand charge using the current agx wrapper with AGX_OUT set → should now exit 1 with the diagnostic instead of 0 + empty file.
- Confirm that any future charge that forgets the "print to stdout" discipline is caught by the wrapper guard.

---
This issue or PR was generated by LazyCodex.
Tag: lazycodex-generated

Contributor guide

No contributing guide indexed for this repository

Research direction

Start with the entry point at ~/AI/Tools/agx and compare it with the path actually used to dispatch agy. Verify the empty-output guard at lines 96-104 and the AGX_OUT artifact guard at lines 108-116, then rerun the Sea of Demand charge. Done means the active path exits 1 with a diagnostic instead of reporting success with empty output.

Written by the indexing model from the issue text.

Assessment

Tech stack
shell
Domain
cli, tooling
Issue type
Bug
Difficulty
1/5
Estimated time
Under an hour
Activity status
Stale
Clarity
Clearly specified
Newbie friendliness
15/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.