Dashboard › publish › Distillation
8dc95ac2-6163-452d-9262-8832b267912d["lore_tm_v1_LEaXr4fT2F41Gd8f9RWXsusEu5kLaeXVCpTrkrGF9Cg","lore_tm_v1_LMZo7byMKUfA1SkI9YDKcJ2Jmx0QHOhOLc4axNH33kw","lore_tm_v1_oOntBA0d8gZK6UturCpSzHYaEXHPx1mxed0jr0VcWhs","lore_tm_v1_QL2iOPTeBeLhBIjz1H__7pKXpI6FL9EvS7sI2HExtk0","lore_tm_v1_ruVZR8yOs_NjfuY3tt81FucXVAjvNLmYDM0hkrIFfTI","lore_tm_v1_DBx7bUCrTlJ0ke3eTpYXOEOG9hD5Y30MeVw_kg_jNO0","lore_tm_v1_fG1tMrqCFa9XGj-7hSOI7hC-BzFoXu60BqcHAcayH1o","lore_tm_v1_EaiQm8oMFy3Xor6xdIKx3_1ZPiwTF6PCT3Oflhw3HBk","lore_tm_v1_NPH9Aa6dEsS3LGaasFelQFneF_1YeYs1VJ1aQsWMdTU","lore_tm_v1_wu00gkHhAvmgvz1SAv07O52mGsfqCf3cTAsKMN_saD4","lore_tm_v1_OizmgpD_ohpl02RNm1npvWaM60M4HcRYkCU-4rQPd_c","lore_tm_v1_QQ_nSFYJ6HLuS9KPco6hzA4Zl0N2M9fYdWKD9HAvK3Q"]
ses_f76bcb774ffed9lA7RT2yd0btL returned no evidence on its first attempt, so the result did not satisfy the substantive review gate. Assistant restarted its single retry with a strict file-level evidence-or-blocker contract while leaving the release-path retry unchanged.ses_f76bce8f0ffehxXvUzMX3GW4dn returned empty for a second time and was deemed unusable. Assistant replaced only that reviewer with fresh read-only task ses_f76ab45fcffeECLKLvffvLIZyX under the same evidence-or-blocker contract; the cleanup retry remained untouched and the exact tree remained unchanged and locally clean.DO-NOT-MERGE with 6 MUST-FIX lifecycle blockers, 1 additional concern, and 1 passing area..github/workflows/ci-poller.yml:117-118, but rejection branches use continue at lines 150, 170, 300, 323, 335, 347, and 367. Bash rejects those continue statements in that subshell and proceeds into later code; for example, failed final approval validation removes accepted and ci-pending, then lines 370-378 can still add ci-ready and claim publishing started.continue with exit 0,” with removing the subshell and using a real loop-level continue identified as the alternative.src/modules/__tests__/ci-poller-workflow.js:103-113, 213-228)”; executable tests are required for every rejection branch.processEndState posts its comment before closing the issue in src/modules/process-end-state.js:24-35; the success handler is the final workflow step at .github/workflows/publish.yml:449-454, after failure cleanup at lines 427-447 has already been skipped. If Craft publishes successfully but getWorkflowRun or createComment fails, the issue remains open with accepted and ci-ready, the run reports failure, and retrying can publish again.always() reconciliation step after every notifier; test comment and workflow-run lookup failures. Existing success tests at src/modules/__tests__/process-end-state.js:149-173 cover only the happy path..github/workflows/publish.yml:203-245; cleanup at .github/workflows/publish.yml:427-433 invokes update-issue.js, which immediately requires @actions/github at src/publish/update-issue.js:1-3.setup-node or yarn install fails before @actions/github is available; cleanup and post-result.js fail to load; the open issue retains accepted and ci-ready. Even when cleanup runs, revocation is a single REST call coupled to optional target restoration through Promise.all at src/modules/update-issue.js:69-81, with no reconciliation after an API failure.gh step, retry transient failures, separate target restoration from authorization cleanup, and add an independent final reconciler..github/workflows/publish.yml:127-135 first creates accepted + ci-pending, then lines 137-148 post a blocking comment, lines 152-165 enable the poller, and lines 167-174 dispatch it. If CI_POLLER_HAS_PENDING=false and the label mutation succeeds but the comment or variable update fails, later steps are skipped, no dispatch occurs, and the scheduled poller remains gated off by .github/workflows/ci-poller.yml:24-31.accepted and ci-pending if neither activation path succeeds..github/workflows/ci-poller.yml:128-132; the remaining-state check at lines 413-425 keeps finding it, lines 440-450 keep the variable enabled, and lines 460-478 self-dispatch until cron takes over. src/modules/__tests__/ci-poller-workflow.js:175-181 explicitly expects no edit after resolver failure.ci-ready race can suppress the required fresh publish event. Waiting-for-CI removes stale ci-ready at .github/workflows/publish.yml:119-135, but another label event may add it while ci-pending remains; that event cannot publish because .github/workflows/publish.yml:186-192 rejects ci-pending. The poller later removes only ci-pending and adds an already-present ci-ready at .github/workflows/ci-poller.yml:370-373, emitting no new labeled event and stranding accepted + ci-ready.ci-ready fix: the poller must perform and verify a separate ci-ready removal/re-add cycle after CI passes, with approval revalidation between removal and re-add. “Never omit the final re-add.”PUBLISH_ARGS can suppress failure and cancellation reporting. src/publish/update-issue.js:8-18 tolerates absent or malformed input, but src/publish/post-result.js:7 unconditionally executes JSON.parse(process.env.PUBLISH_ARGS). If parsing fails or cancellation occurs before the output exists, label cleanup may succeed but the terminal handler can throw before posting status.PUBLISH_ARGS defensively and produce a generic issue/run comment when repository or version details are unavailable. Derive one terminal status from the Craft step outcome rather than separate aggregate cancelled() and failure() predicates at .github/workflows/publish.yml:435-447, because both can become true if cancellation cleanup fails..github/workflows/ci-poller.yml:251-256 and transition to ci-failed while removing accepted and ci-pending at lines 380-392; failed commit statuses receive equivalent cleanup at lines 394-405. A normal retry removes both ci-failed and stale ci-ready before adding ci-pending at .github/workflows/publish.yml:119-135.57/57, full suite 171/171, yarn lint, and git diff --check; worktree status matched the initial snapshot after inspection.