Files
wyndham-ARR/.project-docs/50-evidence/topics/2026-07-29-task-trace-terminal.md
2026-07-31 15:11:42 +08:00

6.0 KiB
Raw Blame History

Task Trace Terminal Verification

Scope

Replace the decorative daily-processing status module with a diagnostic view that exposes the persisted task flow from upload through downstream outbox state. After the first structured UI pass, the user explicitly required the plainest possible presentation: one black code console with raw log lines.

Implemented Evidence Path

  • GET /api/jobs/{job_id}/trace validates the job identifier and asks the repository for a privacy-minimized diagnostic projection.
  • New tasks are submitted once through POST /api/open/agent-sessions/{session_id}/messages/stream?include_trace=true. The first run.started binds the ARR attempt; the same generator is then consumed on a background thread until the SuperAgent run terminal event and SSE end.
  • Raw SSE and assistant text never reach disk. arr_processing.agent_trace persists only allowlisted run/task/step/end projections in a private, append-only local JSONL store keyed by the job-id digest.
  • arr_web.job_trace reconstructs ordered events from the processing run, attempts, artifact deliveries or direct MCP submissions, Finance daily versions and downstream outbox events, then merges the sanitized SuperAgent events by timestamp.
  • Equal PostgreSQL transaction timestamps use an explicit business-sequence tie-breaker so validation/Finance commit precede attempt/job success and downstream queue events.
  • The desktop page renders the response in a single black monospace <pre>. Each event is one line containing timestamp, level, stage, code, title, message and allowlisted details JSON. The controls remain limited to historical task selection, four-second active-task polling, manual refresh and one-click copying of the complete current <pre> plaintext.

Privacy Boundary

The SQL and projection expose only diagnostic columns. message.delta and message.final are always dropped. Trace summaries redact credential assignments, Bearer values, URLs, absolute paths, emails, long numbers and XML fragments before persistence, and the read path validates the field/details allowlist again. The response and UI do not contain grants, credentials, private object paths, source bytes, raw payload/envelope/receipt JSON or guest PII. Outbox rows are described only as queued/published notifications, not as proof of monthly-report completion.

The SuperAgent endpoint accepts only POST and does not replay historical runs. It was also verified to create a different run_id when the exact same message and idempotency key are sent twice. ARR therefore never POSTs a second stream to backfill logs. An uncertain failure before run.started is terminalized as PROCESSING_REMOTE_SUBMISSION_AMBIGUOUS rather than automatically retried.

Runtime Checks

An isolated read-only Web instance on 127.0.0.1:8766 used the configured booking_test database while the standing 8765 process was left untouched.

  • A current queued/running task rendered upload, attempt and current-state events and continued four-second polling.
  • Successful fixture mvp-v1-fixture-20260727 rendered 11 events in the required upload → dispatch → result → validation → Finance → job → outbox order.
  • Failed task arrjob-fdc2c1a0695c41b3b372a52033b2f567 rendered six events and the terminal line FAILURE stage=writeback code=PROCESSING_RESULT_MISSING.
  • Computed UI evidence was tag=PRE, black rgb(8, 11, 16), monospace font, and zero old filter/timeline/evidence elements.
  • At a 375×812 viewport, document width stayed 375 pixels; long raw lines scroll only inside the console. Browser console error/warning count was zero.
  • Live contract probes confirmed 405 Allow: POST for GET/HEAD/OPTIONS, the outer trace SSE event, inner run.started/task.updated/step.updated/ message.delta/message.final/run.completed, and terminal end.
  • A live isolated background-handoff probe returned the run handle and then persisted 45 safe events (28 task updates and 14 step updates) through completion/end with no capture failure.
  • The controlled local LaunchAgent was restarted after implementation. Port 8765 reports database/processing/writeback/monthly readiness, serves arr-job-trace-2, and correctly returns agent_trace_events=0 for a job that predates trace capture.
  • On 2026-07-30, the live 8765 page showed the copy control disabled before a trace loaded and enabled for a 228-line terminal containing the final END line. A real click completed the page Clipboard API promise and displayed the existing success toast; browser console warning/error count remained zero. The in-app Browser isolates page, automation and macOS clipboard channels, so no external pasteback-equality claim is made. Source and regression checks verify that the exact #process-log.textContent is passed to the Clipboard API, with selected-textarea fallback and explicit failure feedback.

Automated Verification

  • node --check arr_web/static/app.js: pass.
  • 38 post-hardening targeted tests: pass.
  • Full repository suite: 275 tests passed with 2 expected artifact-tool skips.

Result

The status module now reports the real SuperAgent execution path plus the authoritative persisted ARR processing chain in the user-requested plain terminal form. It locates failures by stage and stable error code without treating Agent trace as proof of Finance commit or widening the privacy surface. Jobs submitted before this capture path was enabled retain only their persisted ARR facts because historical Agent trace cannot be replayed.

The 2026-07-30 v3 run also established an important limitation: trace capture can finish normally while the authoritative ARR job remains running. Four-second refresh continued and the trace ended at AGENT_TRACE_STREAM_ENDED, but no MCP callback arrived and the production lifecycle had no terminal reconciler. The UI was faithfully rendering stale backend state; trace completion alone must not be promoted to business success, but it must trigger or feed a separate terminal no-submission reconciliation path.