Resolves #13958
IssueSyncer.pushToGitHub() now separates full-render metadata drift from the actual title/body payload GitHub accepts. A new GET_ISSUE_FOR_PUSH query fetches the remote pushable fields; generated-only drift heals the metadata hash without UPDATE_ISSUE, and real title/body edits still push once.
Evidence: L2 (unit + read-only live diagnostic) -> L3 post-merge sync observation required. Residual: live orchestrator sync must confirm the repeated issue-push loop is gone on a normal run.
Deltas from ticket
- Current read-only scan found 55 active full-render hash mismatches rather than the 54 from the reported log; all 55 already matched live GitHub title/body.
- Archived full-render metadata drift stays out of scope because
pushToGitHub() only scans the active issue directory.
Test Evidence
npm run test-unit -- test/playwright/unit/ai/services/github-workflow/IssueSyncer.spec.mjs -> 20 passed.
npm run agent-preflight -- ai/services/github-workflow/queries/mutations.mjs ai/services/github-workflow/sync/IssueSyncer.mjs test/playwright/unit/ai/services/github-workflow/IssueSyncer.spec.mjs -> all requested gates passed.
- Read-only live payload scan: 55/55 active full-render mismatches already matched GitHub title/body; 0 payload differences.
- Patched no-mutation diagnostic against the current active mismatch set:
pushes: 0, generatedOnly: 55, updates: 0.
Post-Merge Validation
Commit
8cd3c12daa — payload-aware issue sync push gate.
Authored by Euclid (GPT-5, Codex Desktop). Session 019ef378-527d-7393-bc74-ec3a1d3f2ddf.
Resolves #13958
IssueSyncer.pushToGitHub()now separates full-render metadata drift from the actual title/body payload GitHub accepts. A newGET_ISSUE_FOR_PUSHquery fetches the remote pushable fields; generated-only drift heals the metadata hash withoutUPDATE_ISSUE, and real title/body edits still push once.Evidence: L2 (unit + read-only live diagnostic) -> L3 post-merge sync observation required. Residual: live orchestrator sync must confirm the repeated issue-push loop is gone on a normal run.
Deltas from ticket
pushToGitHub()only scans the active issue directory.Test Evidence
npm run test-unit -- test/playwright/unit/ai/services/github-workflow/IssueSyncer.spec.mjs-> 20 passed.npm run agent-preflight -- ai/services/github-workflow/queries/mutations.mjs ai/services/github-workflow/sync/IssueSyncer.mjs test/playwright/unit/ai/services/github-workflow/IssueSyncer.spec.mjs-> all requested gates passed.pushes: 0,generatedOnly: 55,updates: 0.Post-Merge Validation
Commit
8cd3c12daa— payload-aware issue sync push gate.Authored by Euclid (GPT-5, Codex Desktop). Session 019ef378-527d-7393-bc74-ec3a1d3f2ddf.