Skip to content

Commit 9c70850

Browse files
committed
Merge remote-tracking branch 'origin/main' into HEAD
* origin/main: (40 commits) feat(pro): use built-in Rails i18n compiler for React Intl demo (#4128) Fix pr-merge-ledger UTF-8 crash under non-UTF-8 locale (#4123) Add canonical AI-agent prompts source (prompts.yml) (#4124) Local benchmark runner: raise server-boot timeout for slower machines (#4073) (#4125) Docs(generator): note Pro production devtool for source-mapped SSR stacks (#3893) (#4113) docs: add "Consuming an Unreleased Build" guide and fix pnpm git-subdir syntax (#4117) Address deferred AI-review feedback on PR-helper scripts (#4069) (#4105) Wrap generated demo file paths in onboarding page (Part 1 of #4062) (#4107) fix(ci): build bundle-size base from PR merge commit's first parent (#4110) Add internal RSC architecture deep-dive docs (RoR Pro vs Next.js) (#4006) Disable noisy automatic benchmark regression issue filing (#4071) (#4116) Release-train branching + phase-tiered merge gating (beta/RC/final) (#4018) Fix Webpack dependency selection in install generator (#4109) Document health-probe status-code contract and Control Plane probes (#4053) (#4063) Local dedicated-hardware benchmark runner (#4073) (#4088) docs(tooling): surface SVG diagram alt text in generated llms-full files (#4087) docs(agents): codify review-loop convergence + local/CI parity in PR-batch workflow (#4101) Split RenderFunction: drop the legacy renderer arm (#4096) Add OSS hydrate_on scheduling (#4037) Docs: fix stale evaluate-issue gate cross-reference (#3910) (#4104) ...
2 parents 069c2ce + 0cfadcc commit 9c70850

151 files changed

Lines changed: 12105 additions & 1415 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.agents/skills/address-review/SKILL.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -221,6 +221,8 @@ Triage rules:
221221
- Deduplicate overlapping comments before classifying them. Keep one representative item for the underlying issue.
222222
- Verify factual claims locally before classifying a comment as `MUST-FIX`.
223223
- If a claim appears wrong, classify it as `SKIPPED` and note briefly why.
224+
- When a reviewer identifies an unexplained sibling-lock version split, platform-precompiled/source-build transition, or new build-time dependency, treat the lockfile dependency drift item as `MUST-FIX`.
225+
- Verify the lockfile diff and require either alignment or an explicit rationale in PR evidence before classifying the item as resolved.
224226
- Preserve the original review comment ID and thread ID when available so the command can reply to the correct place and resolve the correct thread later.
225227
- Treat actionable review summary bodies as normal feedback to classify (`MUST-FIX`/`DISCUSS` as appropriate); skip only boilerplate or status-only summaries.
226228
@@ -450,6 +452,8 @@ If the user selects skipped/declined items for rationale replies, post those rep
450452
451453
Before committing or asking for push confirmation, run the self-review gate: review the combined fix diff for correctness bugs, style violations, and inconsistencies introduced by the fixes themselves. Fix critical issues immediately.
452454
455+
Converge the review loop, don't chase it: every push re-triggers the configured review bots on the new head and produces a fresh batch of comments. Batch all code fixes into a single push; resolve purely advisory threads (style, dead-code, "consider…", informational, positive) in-thread with a reply — **without a new commit**, since resolving a thread does not re-trigger reviews while a push does. Never resolve a confirmed blocker by reply alone. See [Review-Loop Convergence](../../workflows/pr-processing.md#review-loop-convergence-push-amplification).
456+
453457
When 2+ selected fixes touch different files with no logical dependency, process them in parallel if the environment supports it. Instruct parallel helpers not to commit; keep all changes unstaged until the combined diff passes the self-review gate.
454458
After parallel fixes complete, verify no conflicts exist between the changes by checking whether any helpers touched the same files (`git diff --name-only`).
455459

.agents/skills/address-review/bin/fetch-pr-review-data

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -256,14 +256,17 @@ module FetchPrReviewData
256256
end
257257

258258
def validate_pr!(pr_number)
259-
raise Error, "a positive integer PR number is required\n\n#{USAGE}" unless pr_number.to_s.match?(/\A\d+\z/)
259+
raise Error, "a positive integer PR number is required\n\n#{USAGE}" unless pr_number.to_s.match?(/\A[1-9]\d*\z/)
260260

261261
pr_number
262262
end
263263

264+
# Strict OWNER/REPO: non-empty owner and name, exactly one slash, no spaces.
265+
REPO_FORMAT = %r{\A[^/\s]+/[^/\s]+\z}
266+
264267
def resolve_repo!(repo)
265268
repo ||= capture!("gh", "repo", "view", "--json", "nameWithOwner", "-q", ".nameWithOwner").strip
266-
raise Error, "--repo must be in OWNER/REPO form (got: '#{repo}')" unless repo.include?("/")
269+
raise Error, "--repo must be in OWNER/REPO form (got: '#{repo}')" unless repo.match?(REPO_FORMAT)
267270

268271
repo
269272
end

.agents/skills/address-review/bin/fetch-pr-review-data-test.rb

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -105,10 +105,28 @@ def test_rejects_non_integer_pr
105105
assert_includes out, "positive integer PR number is required"
106106
end
107107

108+
def test_rejects_zero_pr
109+
out, status = Open3.capture2e("ruby", SCRIPT, "0", "--repo", "owner/repo")
110+
refute status.success?
111+
assert_includes out, "positive integer PR number is required"
112+
end
113+
108114
def test_rejects_bad_repo_form
109115
# gh is not reached for a malformed --repo, so this passes without network.
110116
out, status = Open3.capture2e("ruby", SCRIPT, "12", "--repo", "owneronly")
111117
refute status.success?
112118
assert_includes out, "--repo must be in OWNER/REPO form"
113119
end
120+
121+
def test_rejects_repo_with_extra_path_segment
122+
out, status = Open3.capture2e("ruby", SCRIPT, "12", "--repo", "a/b/c")
123+
refute status.success?
124+
assert_includes out, "--repo must be in OWNER/REPO form"
125+
end
126+
127+
def test_rejects_repo_with_empty_owner
128+
out, status = Open3.capture2e("ruby", SCRIPT, "12", "--repo", "/repo")
129+
refute status.success?
130+
assert_includes out, "--repo must be in OWNER/REPO form"
131+
end
114132
end

.agents/skills/adversarial-pr-review/SKILL.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,11 @@ handoffs, Codex/Claude comparison, and output templates.
4747

4848
## Merge Gate
4949

50+
This review is a **required** gate for PRs whose target branch is in the `rc` or
51+
`final` release phase (target `release/*`), per `AGENTS.md` ->
52+
**Release-Train Branching And Phase Gating**. For `beta`-phase PRs (target `main`)
53+
it remains advisory unless a maintainer or high-risk policy requests it.
54+
5055
Before marking a PR ready or merging it, all `BLOCKING` and `DISCUSS` findings
5156
from this review must be fixed, explicitly decided, or waived by a maintainer.
5257
Do not require an AI reviewer approval object or positive AI issue comment as a

.agents/skills/evaluate-issue/SKILL.md

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,22 @@ AI-found gaps are leads, not priorities. Prioritize real customer reports, verif
4949
- Prefer narrow fail-fast guards, clearer errors, docs, or workarounds when they solve the real risk.
5050
- Be skeptical of broad identity, runtime, CI, workflow, dependency, or Pro/RSC changes unless impact justifies the complexity.
5151
- Split complex fixes into prerequisites and decision points; do not let a polished RFC imply immediate priority.
52+
- For investigation or benchmark conclusions, recommendations to `close` or
53+
`document/work around` require closing evidence:
54+
- Cite a reproducible artifact (script, data file, benchmark command plus
55+
environment), or when the artifact is missing, state why it is missing and
56+
why the conclusion remains sound from the available data. Do not treat
57+
absence alone as satisfying the gate.
58+
- Verify that headline numbers match the document's own tables.
59+
- Carry production-environment caveats when the evidence was collected on a
60+
different platform.
61+
- If the conclusion could reasonably be challenged from the artifacts alone,
62+
such as missing control variables, platform-specific data, or
63+
non-monotonic/outlier data points, recommend a correction, follow-up, or
64+
explicit caveat instead of closing as settled.
65+
- If the closing-evidence gate cannot be satisfied, use `park / P3` only as
66+
a caveated no-PR outcome or report a `product decision` blocker; do not
67+
present it as a settled closing or workaround recommendation.
5268

5369
5. Classify recurring process misses
5470
- Use this only when the issue would add or change agent, review, CI, release, or audit process.

.agents/skills/plan-pr-batch/SKILL.md

Lines changed: 14 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -62,17 +62,23 @@ Plan a PR batch
6262
helper, which does the authoritative local three-dot diff (fetching the
6363
verified base/head into session-unique temporary refs, never checking out
6464
untrusted PR code), validates `baseRefName`/`headRefName` as untrusted
65-
refspec data, falls back to the PR Files API, and cleans up its temp refs:
66-
`.agents/skills/plan-pr-batch/bin/pr-file-touch-map N --repo OWNER/REPO`
65+
refspec data, falls back to the PR Files API, and cleans up its temp refs.
66+
**For parallel batch scheduling, always pass `--cross-check`** so the local
67+
diff and the Files API must independently agree on the path set — a
68+
fail-safe against a silent under-report scheduling two colliding items into
69+
the same wave:
70+
`.agents/skills/plan-pr-batch/bin/pr-file-touch-map N --repo OWNER/REPO --cross-check`
6771
It prints `{pr, repo, source, changed_files, paths, renames}`:
68-
- `source` is `local-diff` (authoritative), `files-api` (best-effort
69-
cross-check, used only when the local diff cannot run), or `UNKNOWN`.
72+
- `source` is `verified` (cross-check: both sources agreed — the only value
73+
safe to place in a parallel worktree lane), `local-diff` / `files-api`
74+
(default mode, single source), or `UNKNOWN`.
7075
- `paths` covers creates, edits, deletes, and **both** sides of every
7176
rename/copy; `renames` lists `{old, new}` pairs.
72-
- When `source` is `UNKNOWN`, no trustworthy path list could be produced
73-
(unfetchable refs, a broken/capped/inconsistent Files API response, or a
74-
rename row missing its previous filename); treat the item as serial — not
75-
safe for a parallel worktree lane.
77+
- **Treat anything other than `verified` as serial** when scheduling parallel
78+
waves. `UNKNOWN` means no trustworthy path list could be produced (a
79+
cross-check disagreement, an unfetchable source, a broken/capped Files API
80+
response, or a rename/copy row missing its previous filename) — never put
81+
it in a parallel lane.
7682
- The helper owns the security and portability details (refspec injection
7783
guards, fork pull-ref vs head-repo vs reachable-SHA fetch, shallow-clone
7884
deepen-and-retry, Files API `changedFiles` sanity check and ~3000-file

0 commit comments

Comments
 (0)