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

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

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