Skip to content

epic(actions): make Noema, Strix, and OpenCode concurrency exact-PR and current-head safe #1800

Description

@seonghobae

목표

Noema·Strix·OpenCode의 model-backed PR 검토가 동일한 공통 계약을 따르게 합니다.

{workflow명}-{repository}-{PR번호}
  • 서로 다른 저장소와 PR은 독립적으로 실행
  • 같은 PR의 이전 HEAD만 live-head 재검증 후 취소
  • delayed stale event가 current running/pending 실행을 먼저 취소하지 못함
  • native PR trigger와 repository_dispatch retry가 같은 PR queue를 공유
  • release·deploy·migration은 이 cancellation owner의 대상이 아님

현재 RED — protected main@232107a0b6235efaa4a221a41443c436eac3dd00

Noema

  • protected main은 workflow-level PR group과 event-conditional cancel-in-progress로 delayed stale event가 current run을 선취소할 수 있음
  • #1797이 job-level group + 별도 cleanup으로 좁게 수리 중
  • #1797에는 아직 queue: max가 없어 current pending이 stale pending에 밀릴 수 있음
  • #1797의 sibling repository_dispatch cleanup은 중앙 ${{ github.token }}으로 target Actions API를 호출해 권한이 없음; #1799가 canonical successor

Strix

  • strix job group은 format('{0}-{1}-{2}', github.event_name, repository, PR)이므로 같은 PR의 pull_request_targetrepository_dispatch가 서로 다른 group
  • 따라서 merge scheduler retry와 native scan이 같은 PR에서 동시에 provider를 소비할 수 있음
  • cancel-in-progress: false지만 queue: max가 없고, 현재 계약 테스트가 오히려 queue: max 부재를 강제
  • 별도 cleanup은 native synchronize/closed만 다루므로 dispatch queue의 stale run은 같은 owner 계약 밖

OpenCode

  • unprivileged bootstrap opencode-review-target은 job-level repository+PR group과 cancel-in-progress: false이나 queue: max가 없음
  • privileged opencode-review-dispatch.yml은 workflow-level repository+PR group에 cancel-in-progress: true
  • delayed stale dispatch는 metadata/live-head validation job이 실행되기 전에 current dispatch 전체를 취소할 수 있음
  • bootstrap과 privileged dispatch가 서로 다른 workflow/group이므로 동일 PR의 실제 OpenCode 작업 수가 하나로 coalesce되지 않음

불변 계약

  1. PR model job group에는 workflow identity, target repository, PR number만 포함하며 head SHA와 event class는 넣지 않습니다.
  2. long-running model job은 job-level cancel-in-progress: falsequeue: max를 사용합니다.
  3. stale-run cleanup은 model group 밖의 짧은 별도 job 또는 target-repository coalescer가 담당합니다.
  4. cleanup은 target-scoped credential로 exact live PR state/head를 취소 직전에 다시 읽습니다.
  5. current head·다른 PR·다른 repository·non-review workflow는 절대 취소하지 않습니다.
  6. repository_dispatch payload의 target/head는 권위가 아니며 target API로 재검증합니다.
  7. 같은 PR의 native/dispatch event class는 같은 model queue를 사용합니다.
  8. API rate limit·network·malformed response에서는 wrong cancellation보다 fail-closed를 우선하고 typed telemetry를 남깁니다.
  9. fixed sleep, blind retry, head-SHA group, repository-wide model group은 금지합니다.
  10. model-backed workflow는 orchestrator/free와 gateway token만 사용합니다.

PR Stack과 진척률

현재 완료율: 0/8. 분석·이슈 작성은 완료로 계산하지 않습니다.

측정

  • 동일 PR push burst당 materialized model jobs
  • current-head evidence 누락률
  • previous-head 잔존 시간
  • 다른 PR 오취소 수
  • native/dispatch 중복 실행 수
  • provider 호출 수와 rate-limit 실패
  • startup_failure 및 runner_id=0 분모

협업

각 successor는 독립 세션이 맡아도 되지만 같은 파일에 동시 writer가 생기지 않도록 Noema → Strix → OpenCode 순으로 owner stack을 명시하고, 선행 PR head/base를 이 이슈에 기록하십시오. 대형 #1661의 유효 delta는 이 stack과 별도 successor가 완전 승계한 뒤에만 종결할 수 있습니다.

기다리는 동안 다른 로컬 세션에게 지속적으로 지시 받아 도우세요. 계속 묻고 계속 피드백하고 계속 지원하세요. 더 주도적이고 더 적극적으로요.

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Labels

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions