React on Rails Release Train Issue Evaluation
Core Rule
Use this with $evaluate-issue. That skill answers "is this worth doing?"; this skill answers "does it belong on the active release train or on main?"
release/* receives only stabilizing fixes. Features, cleanup, docs, process work, non-blocking hardening, and ordinary follow-ups target main.
Backport Shape
The runbook's BLOCKED compound-release boundary is an operational and agent policy stop, not runtime enforcement. The tasks remain technically callable in live mode; direct live invocation outside the individually guarded procedure violates release policy.
When one or more merged main PRs qualify for release/X.Y.Z, default to one
source PR per release backport PR:
- Before branching, search open release-targeted PRs, targeted private
coordination for the source, and remote branches with verified ownership and
source binding. Reuse or skip a valid source-atomic lane, or an explicitly
maintainer-approved aggregate whose sources meet the inseparability exception
below. Stop rather than duplicate work when a candidate branch's ownership or
source binding is
UNKNOWN. If an unapproved aggregate violates this shape, recommend separate replacements; close it only with explicit write authorization and retain its branch unless deletion is also authorized. - Process them serially under the canonical
release-line:X.Y.Zcoordination lease defined in the release-train runbook, held by one dedicated release coordinator across discovery, validation, and merge. Every writer targeting that release branch, including a release-first stabilizing fix or metadata PR, must participate in the same lease; source-scoped claims do not provide this serialization. Chain later batch lanes withdepends_on, and do not launch them until the preceding merge is terminal. A writer that cannot participate in the canonical lease must stop; the repository's merge-group CI does not rerun source-liveness, provenance, attribution, manual QA, or review gates and is not an alternative. Refresh the dedicated heartbeat at the runbook cadence during long gates, and immediately before merge require the canonical claim to be active, unexpired, and owned by the expected coordinator with a live matching heartbeat. Stop if the guard is unavailable or its state isUNKNOWN. Merge one release-targeted change, fetch the new release tip, then update a reused PR onto that tip or branch the next. Rerun validation, QA, and review on the updated head before merging. - Before updating or branching, confirm each selected source patch is still live
on explicitly fetched
origin/main. A source reverted or superseded onmainrequires renewed maintainer approval before backporting. Repeat this check and the release-tip check immediately before merge; update and rerun validation, QA, and review if either relevant ref changed. - Before every RC cut or re-spin, final promotion, and release closeout, fetch
origin/mainand revalidate every retained main-origin backport. A source patch that is no longer live is a blocker until a maintainer explicitly reapproves retaining it in the release. During closeout, do not let the forward-port helper automatically reapply reverted or superseded origins; stop for explicit manual dispositions and use the runbook's selective manual closeout path plus its complete omitted-pick manifest when the disposition is to omit or replace one or more picks. - Treat
BACKPORT_SOURCE_AUDIT_RESULTand selective-closeout manifest proof, approval, and replacement-disposition fields as structured attestations. They do not prove the underlying semantic facts. Before accepting them, the maker and independent checker must each re-derive the audit against the exact fetched tips and separately verify approval authorship, repository permission, and trust from the live authenticated record. Stale, inaccessible, untrusted, orUNKNOWNevidence remains fail-closed. - Give each source PR its own
git cherry-pick -xprovenance, conflict record, validation, QA evidence, review cycle, and rollback boundary. Every commit created by amain-to-release backport and landed on the release branch must have exactly one direct(cherry picked from commit <source-sha>)footer; record inherited provenance from a source commit in the PR instead of copying another footer. A backport with exactly one source commit must be squash-merged with a final subject ending in(#<backport-pr-number>)and that footer in the commit body; rebase merge is unsupported because an unattributed source subject can make the changelog sweep reportUNKNOWN. For a multi-commit rebase-merged source PR or approved aggregate, stop for a maintainer-approved merge plan until the repository can preserve both one normalized release commit per source commit and changelog-sweep PR attribution; never create a multi-footer commit. - Do not bundle independent source PRs because they share a target, component,
milestone, or
CHANGELOG.md. Shared changelog edits require serialization; retain each source PR's applicable changelog entry, then reconcile the entries and stamp or regenerate the RC changelog after every backport retained in the final release set lands. - Combine only behaviorally inseparable changes that cannot be reviewed, tested, or reverted safely alone. Require an explicit maintainer-approved rationale naming every source PR before implementation.
Workflow
- Refresh repo context: fetch and prune
origin/mainand the target release branch, then run.agents/bin/agent-workflow-seam-doctor. Use the refreshed release ref for ancestry, prior-backport, and supersession checks. - Resolve candidates from live GitHub. For strict 48-hour windows, search by date then timestamp-filter locally because GitHub search is date-granular.
- Exclude started lanes. For an ordinary issue candidate, an assignee,
linked/open implementation PR, private claim/heartbeat/branch, or
implementation comment means the lane is started. A merged
mainsource PR is completed input, not a started release-backport lane: its linked issue, assignee, merged implementation PR, and generic source coordination state do not exclude it. Its backport lane is started by a valid source-atomic release-targeted implementation PR or branch; an explicitly maintainer-approved aggregate whose sources are behaviorally inseparable; a backport implementation comment for either valid shape; or private coordination state that explicitly identifies that valid release/backport lane. An unapproved, shape-violating aggregate does not exclude its source candidates; keep them eligible so the Backport Shape replacement can be recommended. Runagent-coord doctor --json, then runagent-coord status --repo shakacode/react_on_rails --target <issue-or-pr> --jsonfor each candidate. Dead or expired ordinary-issue claims and explicitly identified backport claims count as started-but-stalled, not non-started; generic source claims do not prove that a backport started. - Read release context: active
Release gate:tracker,release+TRACKINGlabels, theAgent Release Modeblock,agent-coordphase when available, source PR base branches, and whether source commits are already onorigin/release/X.Y.Z. - Evaluate each candidate with
$evaluate-issue: evidence source, impact, complexity, process gap disposition, and priority. - Choose the target:
release/X.Y.Z: verified RC/final stabilizer such as an RC regression, hard-gate failure, install/upgrade blocker, security/data-loss/wrong-output bug, release-branch CI/release tooling blocker, or final-only public API/breaking-change decision.release/X.Y.Z contingent: only needed if maintainers decide to cherry-pick a related main-only fix into the train. Name the dependency.main: docs, changelog for main-only PRs, CI/tooling hygiene, tests, process automation, non-blocking runtime hardening, features, and performance/cleanup without release-gate proof.park/close: P3, speculative, duplicate, no-PR evidence, or not worth doing.
- For one or more
release/X.Y.Zselections, apply the Backport Shape rules above. For multiple selections, also record the serial order.
Recommend labels/milestones/comments, but do not mutate GitHub unless the user explicitly authorizes writes.
Output
Use a compact table:
| Issue | Started? | Evidence | Disposition | Target | Rationale | Next action |
|---|
Call out UNKNOWN facts explicitly, especially release tracker mode, source PR base, branch ancestry, and whether the issue is a confirmed RC regression.
Common Mistakes
- Treating a title that says "before 17.0.0 final" as sufficient. Verify release-gate impact and branch ancestry.
- Sending main-only follow-up defects to
release/17.0.0when the related fix is not on the release branch. Mark these contingent instead. - Using labels alone. Labels are hints; issue evidence and the release tracker decide.
- Treating tracker
Mode: developmentas "no release train." The branch can still exist; target selection still matters.