Ships the Phase 4 canary launch-gate unblock: the actual root-cause fix for
#1141 and the parser/classification fix for #1182.
- Closes
#1182:_parse_event_resultsinsrc/specify_cli/sync/batch.py
now routes per-eventstatus="queued"/status="pending"responses to a
newpending_countbucket onBatchSyncResultinstead of folding them
into the rejected catch-all withcategory=unknown.sync nowpreviously
reported durably-queued events asErrors: N (unknown: N)and exited
non-zero when the in-process final-sync hit its 5s timeout; pending-only
drains now exit 0 and surface asPending: Nin the summary. Queue
mutation policy unchanged (pending rows are left for the next daemon tick,
same disposition asfailed_transient). - Closes
#1141(companion fix inspec-kitty-end-to-end-testing#45): the
canary scenario 4move-task --to plannedinvocation was omitting
--review-feedback-file, so the CLI hard-rejected the command at the
argument-validation layer before reachingemit_status_transition. The
rc15 diagnostic breadcrumb infire_saas_fanoutcould never fire because
the codepath never reached fan-out. The e2e fix passes a structured
feedback markdown so the backward emit actually lands. No CLI change is
required; the events #32 force-required contract and the CLI's
review-feedback hardening are both intentional and remain in force. - New unit coverage in
tests/sync/test_batch_error_surfacing.pypins the
contract: per-eventqueued/pendingare not errors, never count
towardsuccess_count(they are durable in-flight, not terminal), but
do count toward sync activity so the "no progress" guard does not fire
on a pending-only drain.