# 2026-05-29 — Jira-vs-local status drift audit

**Timestamp**: 2026-05-29T12:30:00+03:00
**Discovered during**: cycle-4 batch planning, after AZ-842 was selected as "next batch" — local spec was already in `done/` while the Jira ticket was stuck in **To Do**, which triggered a wider audit.

## What was blocked

Bulk reconciliation of 11 Jira tickets whose local spec files are in `_docs/02_tasks/done/` (work shipped + committed + tests green) but whose Jira status disagrees with that fact.

## Why this is a non-user blocker (and what the user already chose to skip)

I surfaced the ambiguity to the user as Choose A/B/C/D ("convention question: Done = shipped+tested, or Done = QA-accepted?"). The user **skipped** the question — interpreted as "use your judgment, don't block on this". Per scope-discipline (`coderule.mdc`: "Unrelated issues elsewhere: do not silently fix them as part of this task. Either note them to the user at end of turn and ASK before expanding scope, or record in `_docs/_process_leftovers/` for later handling.") I'm recording the deferral here instead of bulk-modifying tracker state outside the current task scope.

## Tickets affected

### Stuck in "In Testing" while local spec is in `done/` (10 tickets)

| Ticket | Summary | Shipped (cycle) |
|---|---|---|
| AZ-836 | tlog_route_extractor (AZ-835 C1) | cycle-4 batch 04 |
| AZ-838 | satellite_provider_route_client (AZ-835 C2) | cycle-4 batch 04 |
| AZ-839 | operator_pre_flight_setup_real_fixture (AZ-835 C3) | cycle-4 batch 04 |
| AZ-840 | e2e_orchestrator_test (AZ-835 C4) | cycle-4 batch 04 |
| AZ-894 | csv_driven_replay_adapter | cycle-4 batch 05 |
| AZ-895 | deprecate_auto_sync_surface | cycle-4 batch 05 |
| AZ-896 | replay_format_docs_and_example_csv | cycle-4 batch 05 |
| AZ-899 | architecture_compliance_baseline | cycle-3/4 |
| AZ-900 | autodev_retro_existence_gate | cycle-3/4 |
| AZ-901 | evidence_out_default_path_fix | cycle-3/4 |

### Stuck in "To Do" while local spec is in `todo/` but all 5 children are done (1 Epic)

| Ticket | Summary | Children status |
|---|---|---|
| AZ-835 | End-to-end real-flight validation Epic | C1–C4 in done/ (Jira In Testing) + C5/AZ-841 deferred to backlog + C6/AZ-842 in done/ (Jira Done) |

## Convention ambiguity

Two plausible workflows; both are internally consistent and neither has been written down. The data shows mixed signals:

- **(B) Done = shipped + tested**: today I transitioned AZ-842, AZ-959, AZ-960, AZ-961 straight to Done after local `done/` placement + tests green. No pushback from user. Implies the 10 "In Testing" tickets are pure drift and should be flushed Done.
- **(A) In Testing = shipped, Done = QA-accepted**: the 10 stuck tickets are "correctly placed, awaiting acceptance"; my 4 today were premature and should be walked back to In Testing.

Both are defensible. The local convention has **`done/` mean "work shipped + tests green"** (not "QA-accepted") — that's been the operational meaning across all cycles. So **(B)** is the convention that matches local artifact semantics. But the team may have a separate QA gate that AZ-836/838/839/840 hit but my today-shipped tickets bypassed, in which case **(A)** is the right convention and the gap is documentation, not drift.

## Full payload that would have been written (replay-ready)

When the convention is resolved, the action is one of two scripts:

### If (B): bulk-transition 10 tickets In Testing → Done

```text
for ticket in AZ-836 AZ-838 AZ-839 AZ-840 AZ-894 AZ-895 AZ-896 AZ-899 AZ-900 AZ-901:
  transitionJiraIssue(ticket, "Done")
  read-back verify status == Done
  if disagree: STOP + ASK
```

Additionally, AZ-835 Epic should transition To Do → In Progress → Done (all 6 children either Done or deferred to backlog with explicit user approval).

### If (A): walk back 4 today-shipped tickets Done → In Testing

```text
for ticket in AZ-842 AZ-959 AZ-960 AZ-961:
  transitionJiraIssue(ticket, "In Testing")
  read-back verify status == "In Testing"
  if disagree: STOP + ASK
```

And explicitly stop the agent from auto-transitioning future shipped work past In Testing without user confirmation. This becomes a small `coderule.mdc` / `tracker.mdc` addition.

## Replay obligation

At start of next `/autodev` invocation or before any new tracker write, check this leftover and act on whichever option the user picked (or ask if still unresolved). Delete this file once resolved.

## Out of scope for this leftover

- Reconstructing the QA acceptance step (if any) the team uses to move tickets In Testing → Done — documentation / discovery, not a script.
- Auditing pre-cycle-3 tickets for the same drift pattern — limited scope to cycle-3/4 here.
