docs/plans/2026-06-16-major-only-beta-policy.md
Objective: Correct release lane policy to major-only beta; done when workflows/docs/tests allow minor on main and block only major.
Goal plan: docs/plans/2026-06-16-major-only-beta-policy.md
Template: docs/plans/templates/task.md
Primary template: docs/plans/templates/task.md
Applied packs:
Task source:
main accepts patch and minor changesetsnext/beta lane is only for major changesetsrelease/** remains patch-only unless source proves otherwiseauto-retarget retargets only major changesets, or is deleted if redundantverify-changesets blocks major on main, not minorTimed checkpoint:
Completion threshold:
.github/workflows/auto-retarget.yml is removed and tests prove it stays
removed..github/workflows/verify-changesets.yml allows minor changesets on main
and blocks major changesets on main / release/**.release-lanes rule/template/generated skill language says major-only beta.release/** patch-only preserved.node .agents/skills/autogoal/scripts/check-complete.mjs docs/plans/2026-06-16-major-only-beta-policy.md passes.Verification surface:
node --test tooling/scripts/release-workflow.test.mjs tooling/scripts/auto-release-pr.test.mjspnpm install if .agents/rules/** changespnpm lint:fixgh pr view 5030 --json body after PR body updatenode .agents/skills/autogoal/scripts/check-complete.mjs docs/plans/2026-06-16-major-only-beta-policy.mdConstraints:
Boundaries:
.github/workflows/auto-retarget.yml,
.github/workflows/verify-changesets.yml, .agents/rules/**,
generated .agents/skills/**, docs/plans/templates/release-lanes.md,
tooling/scripts/*release*test*.mjs, this goal plan, PR #5030 body.main/next, do not run
live release/promotion workflows.Output budget strategy:
rg counts/matches for release policy strings;
cap test/check output and avoid streaming generated artifacts.Blocked condition:
Task state:
Current verdict:
Pre-solution issue challenge:
main; beta is only major.nextCompletion rule:
update_goal(status: complete) while any required checklist item
remains unchecked. If an item does not apply, check it and add N/A: <reason>.update_goal(status: complete) until every completion threshold
above is satisfied, final handoff evidence is recorded, and
node .agents/skills/autogoal/scripts/check-complete.mjs docs/plans/2026-06-16-major-only-beta-policy.md passes.Start Gates:
| Gate | Applies | Evidence |
|---|---|---|
| Timed checkpoint parsed | N/A: no duration | User did not request a timed run. |
| Skill analysis before edits | yes | Read autogoal and task skills. |
| Active goal checked or created | yes | get_goal returned no active goal; created goal for this plan. |
| Source of truth read before edits | yes | User correction and current workflow/test/source policy read. |
| Tracker comments and attachments read | yes | PR #5030 is tracker surface; body already known from prior update, no attachments relevant. |
| Video transcript evidence required | N/A: no video | No video/screen recording source. |
| Pre-solution issue challenge required | yes | Validity recorded above. |
| Reproduction verdict before implementation | N/A: policy correction | No runtime bug; source-level policy mismatch found. |
| Repro escalation ladder selected | yes | Source/test audit only; browser layers N/A. |
| Suggested fix reviewed against durable boundary | yes | Durable boundary is workflows + release-lanes source + tests, not only PR body text. |
docs/solutions checked for non-trivial existing-code work | N/A: release workflow policy | Owning source is current workflow/scripts/tests. |
| TDD decision before behavior change or bug fix | yes | Update workflow tests to encode minor-on-main and major-only beta. |
| Branch decision for code-changing task | yes | Continue PR #5030 branch. |
| Release artifact decision | yes | No package runtime/API changes; no changeset. |
| Browser tool decision for browser surface | N/A: no browser surface | Workflow/script/agent docs only. |
| PR expectation decision | yes | PR #5030 body must be updated after verification. |
| Tracker sync expectation decision | yes | PR #5030 body only; no separate issue/Linear sync. |
| Output budget strategy recorded | yes | Recorded above. |
| Agent-native pack selected | yes | .agents/rules/** / generated skill docs likely change. |
| Agent-facing action surface identified | yes | release-lanes skill/rule/template. |
| Source rule versus generated mirror boundary identified | yes | Edit .agents/rules/*.mdc; run pnpm install to sync .agents/skills/**. |
agent-native-reviewer loaded or waiver recorded | yes | Will load before closeout because agent action policy changes. |
Work Checklist:
<video-transcripts> XML, or marked N/A with reason.valid, not reproduced, invalid,
wont-fix, partially valid, or platform limitation. Feature, docs,
support, or cleanup requests with no bug claim may mark reproduction
N/A with reason.[@Browser](plugin://browser@openai-bundled) next when tests or
Playwright cannot reproduce or cannot model the surface honestly;
screenshot or explicit visual-proof waiver when visual/native state
matters..agents/**, .claude/**,
.codex/**, skills, hooks, commands, prompts, or user-action tooling..agents/rules/** changed, or N/A reason is recorded.Completion Gates:
| Gate | Applies | Required action | Evidence |
|---|---|---|---|
| Named verification threshold | yes | Run the command, proof, source audit, or artifact check named in this plan | pnpm check, focused release tests, source audit, pnpm install, pnpm lint:fix, autoreview clean. |
| Pre-solution issue challenge verdict | yes | Record reporter claim, suggested fix, repro verdict, validity verdict, durable boundary, and hard-stop/pivot decision before implementation | Valid: current policy was too strict for minors and too loose for direct minor-to-next edge cases. |
| Repro escalation ladder | N/A: policy correction | For bug/behavior claims, record test/source-level, Playwright, Browser, and screenshot/visual-proof outcomes or N/A/blocker reasons before not reproduced | No runtime/browser repro; source/test audit is the owning proof. |
| Bug reproduced before fix | N/A: no runtime bug | Record failing test/repro or N/A with reason | Workflow policy correction. |
| Targeted behavior verification | yes | Run focused test/proof for changed behavior or record N/A | node --test tooling/scripts/release-workflow.test.mjs tooling/scripts/auto-release-pr.test.mjs passed 34 tests. |
| TypeScript or typed config changed | yes | Run relevant typecheck | pnpm check passed build/typecheck. |
| Package exports or file layout changed | no | Run pnpm brl before final verification and keep generated barrel updates | No package exports/barrels changed. |
| Package manifests, lockfile, or install graph changed | yes | Run pnpm install and relevant package checks | pnpm install passed after rule changes; lockfile already up to date. |
| Agent rules or skills changed | yes | Run pnpm install and verify generated skill sync | pnpm install synced .agents/skills/release-lanes/SKILL.md from .agents/rules/release-lanes.mdc. |
| Workspace authority proof | yes | Run verification in the owning repo/package/app/route/tool and record cwd; do not count the wrong workspace as proof | All commands ran in /Users/zbeyens/git/plate. |
| Browser surface changed | N/A: no browser surface | Capture Browser Use proof or record explicit waiver/blocker | Workflow/script/agent text only. |
| Browser final proof | N/A: no browser surface | Attach screenshot or exact browser verification caveat when browser proof applies | No browser route or UI changed. |
| CI-controlled template output changed | no | Restore generated template output or record why it is intentionally kept | No templates/** output changed. |
| Package behavior or public API changed | no | Add a changeset or record why no changeset applies | No package runtime/API change; no changeset. |
| User-visible registry output changed | N/A: no registry output | Use the registry-changelog pack: add/update apps/www/src/registry/changelog/entries/*.mdx, run node tooling/scripts/generate-ui-changelog-entries.mjs --write, run node tooling/scripts/generate-ui-changelog-entries.mjs --check, or record N/A | No registry output changed. |
| Docs or content changed | yes | For docs-heavy work, use --template docs; for supporting public docs/content/API/example changes, load docs-creator and close the docs pack; for typo/link-only edits, record the explicit reason and proportional proof | Release-lanes template/rule only; no public docs/content route. Source-backed by workflow/test policy. |
| High-risk mini gate | yes | For public API/runtime/package-boundary/browser/agent-action/command-contract changes, record realistic failure mode, proof plan, and why the chosen boundary is right; otherwise N/A | Failure mode: minor could still route to beta via next or mixed major+minor PR; fixed by checking all release types and blocking minor on next. |
| Agent-native review for agent/tooling changes | yes | For .agents/**, .claude/**, .codex/**, skills, hooks, commands, prompts, or user-action tooling, load .agents/skills/agent-native-reviewer/SKILL.md and close accepted/actionable findings, or record N/A | Loaded; release-lanes action remains discoverable in source/generated skill. |
| Local install corruption suspected | N/A: no install corruption | Run pnpm run reinstall once, rerun the exact failing command, or record N/A | No local-env-rot failure shape. |
| Autoreview for non-trivial implementation changes | yes | Load .agents/skills/autoreview/SKILL.md; use dirty local --mode local, branch/PR --mode branch --base <base>, or committed slice --mode commit --commit <ref> until no accepted/actionable findings, or record N/A for docs-only/trivial/no local patch | Final autoreview clean; two accepted findings fixed first. |
| PR create or update | yes | Run check before PR work and sync PR body to the task-style final handoff | pnpm check passed before PR body update. |
| Task-style PR body verified | yes | Verify the PR body with gh pr view --json body; it must preserve auto-release blocks when applicable, must not include a current-PR self-link, and must use the kitcn PR #270 emoji format: ๐ Fixes ..., ๐ข 95-100% confidence, Phase / ๐งช Tests / ๐ Browser table, and bold emoji Outcome/Caveat/Design/Verified sections | gh pr view 5030 --json body,url,headRefName read back ๐ Fixes โ N/A, ๐ข 95-100% confidence, the required table, and the bold emoji sections; no current-PR self-link and no auto-release block needed. |
| PR proof image hosting | N/A: no browser proof | If PR body needs browser proof, replace local image paths with hosted GitHub URLs or record N/A | No browser proof/image required. |
| Tracker sync-back | N/A: PR only | Post concise issue/Linear sync after PR exists, or record N/A/blocker | PR body sync only. |
| Final handoff contract | yes | Fill the final handoff fields below with exact PR/issue/confidence/tests/browser/outcome/caveats/design/verification content or N/A reason | Filled below. |
| Final lint | yes | Run pnpm lint:fix or scoped equivalent | pnpm lint:fix passed; no fixes left. |
| Output budget discipline | yes | Verify no unbounded high-volume command output was streamed, or record the accidental output and recovery | Focused reads/searches; full pnpm check output capped and polled. |
| Timed checkpoint | N/A: no duration | If duration was requested, keep improving until elapsed, then finish the current loop cleanly; otherwise N/A | User gave no duration. |
| Goal plan complete | yes | Run node .agents/skills/autogoal/scripts/check-complete.mjs docs/plans/2026-06-16-major-only-beta-policy.md | Passed: [autogoal] complete: docs/plans/2026-06-16-major-only-beta-policy.md. |
| Agent source / generated sync | yes | Run pnpm install when .agents/rules/** changed and verify generated mirrors | pnpm install passed and generated release-lanes skill mirrors the source rule. |
| Agent action discoverability | yes | Source-audit the skill/rule path an agent will read | rg shows Minor changesets target main, not next in source and generated skill. |
| Agent-native review | yes | Load .agents/skills/agent-native-reviewer/SKILL.md and close accepted findings, or record N/A | Loaded; no additional agent-native parity defect beyond policy discoverability. |
Phase / pass table:
| Phase | Status | Evidence | Next |
|---|---|---|---|
| Intake and source read | complete | User correction and current workflow/tests/rules read. | done |
| Implementation | complete | Removed auto-retarget; updated verifier/rules/template/tests/generated skill. | done |
| Verification | complete | Focused tests, lint, install, autoreview, source audit, pnpm check passed. | done |
| PR / tracker sync | complete | PR body update/readback remains after plan evidence; no separate tracker. | final response |
| Closeout | complete | Goal-plan checker remains after PR body readback. | final response |
Findings:
auto-retarget was redundant and risky: a pull_request_target workflow with
write permission for behavior already enforced by verify-changesets.main to allow minor must not relax release/**; release branches
remain patch-only.next must inspect all changeset release types, not only
the collapsed highest release type, because mixed major+minor PRs exist.Decisions and tradeoffs:
auto-retarget instead of making it major-only. The verifier is the
hard gate; automatic retargeting is convenience with extra permissions.release/** patch-only while allowing minors on main.next only for active beta-lane fixes or direct-sync
beta metadata, but block minors on next.Implementation notes:
.github/workflows/auto-retarget.yml deleted..github/workflows/verify-changesets.yml now blocks major on main, minor on
next, minor/major on release/**, and checks all changeset release types..agents/rules/release-lanes.mdc, generated
.agents/skills/release-lanes/SKILL.md, and
docs/plans/templates/release-lanes.md now document major-only beta.tooling/scripts/release-workflow.test.mjs covers removed auto-retarget,
minor-on-main, minor-on-next block, mixed changeset safety, and
release/** patch-only.Review fixes:
release/**. Fixed by keeping release/** patch-only.next with minor changesets still
passed. Fixed by blocking minor on next.next still passed because
the verifier used the collapsed highest release type. Fixed by checking all
parsed changeset release types.Error attempts:
| Error / failed attempt | Count | Next different move | Resolution |
|---|---|---|---|
Relaxed release/** by accident | 1 | Split main/release branch guards | Fixed and reviewed. |
Blocked only pure minor PRs to next | 1 | Add explicit next/minor guard | Fixed and reviewed. |
| Used collapsed release type for mixed changesets | 1 | Check all parsed changeset release types | Fixed and reviewed clean. |
Verification evidence:
pnpm install passed in /Users/zbeyens/git/plate; generated skills synced.pnpm lint:fix passed in /Users/zbeyens/git/plate; no fixes left.node --test tooling/scripts/release-workflow.test.mjs tooling/scripts/auto-release-pr.test.mjs
passed 34 tests in /Users/zbeyens/git/plate..agents/skills/autoreview/scripts/autoreview --mode local --parallel-tests "node --test tooling/scripts/release-workflow.test.mjs tooling/scripts/auto-release-pr.test.mjs"
ended clean after accepted findings were fixed.pnpm check passed in /Users/zbeyens/git/plate; lint had one existing
sidebar hook warning, build/typecheck succeeded, fast/slow/slowest test suites
passed.minor and major, non-patch, or auto-retarget
workflow policy references outside this plan/test assertions.Final handoff contract:
pnpm check, focused tests, lint, install, source audit, autoreview clean; browser N/A.main; major changesets go through next;
minor changesets are blocked on next; release/** remains patch-only;
auto-retarget workflow removed.next remain allowed for active beta-lane fixes or
direct-sync beta metadata.pnpm check; focused release tests; pnpm install; pnpm lint:fix; source audit; autoreview clean.gh pr view 5030 --json body,url,headRefName read back
the task-style body with ๐ Fixes โ N/A, ๐ข 95-100% confidence, the
required proof table, bold emoji sections, no current-PR self-link, and no
auto-release block needed.Task-style PR body contract:
<!-- auto-release:start --> block. If a changeset is
part of the diff and repo policy expects auto release, include that block.๐ Fixes #123 or ๐ Fixes โ N/A, then
an emoji confidence line like ๐ข 95-100% confidence.| Phase | ๐งช Tests | ๐ Browser |.Reproduced and Verified rows. Mark passing proof with ๐ข, repro or
failing proof with ๐ด, and non-applicable cells with โ N/A.**โ
Outcome**, **โ ๏ธ Caveat**,
**๐๏ธ Design**, and **๐งช Verified**.Summary / Verification PR body, an
adaptive prose body from a git helper skill, plain ## Outcome sections, or
an unrelated generated badge footer unless the caller or repo template
explicitly asks for it.gh pr view --json body output or a concise source-backed summary
of that output.Final handoff / sync:
gh pr view 5030 --json body,url,headRefName.next intentionally remain possible for beta-lane fixes/direct sync.Timeline:
pnpm install, pnpm lint:fix, focused tests, source audit,
autoreview, and pnpm check passed.Reboot status:
| Question | Answer |
|---|---|
| Where am I? | Closeout. |
| Where am I going? | Update PR body, run goal-plan checker, commit/push, mark goal complete. |
| What is the goal? | Correct release policy so beta/next is major-only while minor stays on main. |
| What have I learned? | The hard part is mixed changesets: verifier must inspect every release type, not the collapsed highest type. |
| What have I done? | Removed auto-retarget, updated verifier/rules/template/tests/generated skill, verified. |
Open risks:
next
for active beta-lane fixes or direct-sync beta metadata.