Skip to content

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

Description

@johnmwhitman

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

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions