diff --git a/.claude/skills/pr-workflow/SKILL.md b/.claude/skills/pr-workflow/SKILL.md
index a4feb4b11a..c823459f9a 100644
--- a/.claude/skills/pr-workflow/SKILL.md
+++ b/.claude/skills/pr-workflow/SKILL.md
@@ -1,26 +1,26 @@
---
name: pr-workflow
-description: How to create and edit PRs on the ROCm/flashinfer GitHub repo (which publishes the amd-flashinfer package) — gh CLI quirks and the project's PR-description conventions.
+description: How to create and edit PRs on the AMD-Ecosystem/flashinfer GitHub repo (which publishes the amd-flashinfer package) — gh CLI quirks and the project's PR-description conventions.
---
-# PR Workflow (ROCm/flashinfer)
+# PR Workflow (AMD-Ecosystem/flashinfer)
-> The GitHub repo is `ROCm/flashinfer`; the Python package it publishes is
+> The GitHub repo is `AMD-Ecosystem/flashinfer`; the Python package it publishes is
> `amd-flashinfer`. All `gh` commands below target the GitHub repo.
## CRITICAL: PR target safeguard (fail-closed)
-`ROCm/flashinfer` is a **GitHub fork** of `flashinfer-ai/flashinfer` (the true
+`AMD-Ecosystem/flashinfer` is a **GitHub fork** of `flashinfer-ai/flashinfer` (the true
upstream). Because of this, `gh pr create` defaults the PR base to the
fork-parent `flashinfer-ai/flashinfer` unless explicitly overridden. **A PR must
NEVER be opened against `flashinfer-ai/flashinfer`.**
-All PRs go to **`ROCm/flashinfer`**, base branch **`amd-integration`**.
+All PRs go to **`AMD-Ecosystem/flashinfer`**, base branch **`amd-integration`**.
**Before ANY `gh pr create`, run this pre-flight check and ABORT if it fails:**
```bash
-gh repo set-default --view # MUST print exactly: ROCm/flashinfer
+gh repo set-default --view # MUST print exactly: AMD-Ecosystem/flashinfer
```
If it prints anything else (or errors), STOP — do not create the PR. Report the
@@ -29,7 +29,7 @@ mismatch to the user instead. Never guess the target.
**Always pass the target and base explicitly** — never rely on gh defaults:
```bash
-gh pr create --repo ROCm/flashinfer --base amd-integration \
+gh pr create --repo AMD-Ecosystem/flashinfer --base amd-integration \
--title "
" --body "$(cat /tmp/pr_body.md)"
```
@@ -41,8 +41,8 @@ better to fail to raise a PR and explain why than to raise one against upstream.
These are local config (not checked in) and must be redone per clone:
```bash
-git remote -v # origin should be ROCm/flashinfer; there must be NO flashinfer-ai remote
-gh repo set-default ROCm/flashinfer # pin gh base repo so it does not fall back to the fork parent
+git remote -v # origin should be AMD-Ecosystem/flashinfer; there must be NO flashinfer-ai remote
+gh repo set-default AMD-Ecosystem/flashinfer # pin gh base repo so it does not fall back to the fork parent
```
If a remote pointing at `flashinfer-ai/flashinfer` exists, remove it:
@@ -93,10 +93,10 @@ reset. It is always better to fail to raise a PR than to push to or PR from
```bash
# Update PR description
-gh api repos/ROCm/flashinfer/pulls/ --method PATCH --field body=""
+gh api repos/AMD-Ecosystem/flashinfer/pulls/ --method PATCH --field body=""
# Or from a file
-gh api repos/ROCm/flashinfer/pulls/ --method PATCH --field body="$(cat /tmp/pr_body.md)"
+gh api repos/AMD-Ecosystem/flashinfer/pulls/ --method PATCH --field body="$(cat /tmp/pr_body.md)"
```
Ask the user to confirm before running `git push` or `gh pr create` — these
@@ -159,14 +159,14 @@ not exposed via REST (replying to a comment is available over REST — see below
# Bump `first:` if a PR may have more than 50 threads / 10 comments per thread —
# this query is not exhaustive beyond those limits.
gh api graphql -f query='
-{ repository(owner:"ROCm", name:"flashinfer") {
+{ repository(owner:"AMD-Ecosystem", name:"flashinfer") {
pullRequest(number: ) {
reviewThreads(first: 50) { nodes {
id isResolved
comments(first: 10) { nodes { databaseId author { login } path body } } } } } } }'
# Reply to a comment (use the databaseId from above)
-gh api repos/ROCm/flashinfer/pulls//comments//replies \
+gh api repos/AMD-Ecosystem/flashinfer/pulls//comments//replies \
--method POST --field body=""
# Resolve a thread (use the thread node id, e.g. PRRT_...)
diff --git a/CLAUDE.md b/CLAUDE.md
index de89f5083b..d25e071898 100644
--- a/CLAUDE.md
+++ b/CLAUDE.md
@@ -6,12 +6,12 @@
## CRITICAL: PR target
-All PRs go to **`ROCm/flashinfer`**, base branch **`amd-integration`** — NEVER
+All PRs go to **`AMD-Ecosystem/flashinfer`**, base branch **`amd-integration`** — NEVER
to `flashinfer-ai/flashinfer` (the fork parent / true upstream). `gh pr create`
defaults the base to the fork parent, so always pass
-`--repo ROCm/flashinfer --base amd-integration` explicitly, and run `gh repo set-default --view` first —
-it MUST print `ROCm/flashinfer` or you abort. If the target owner cannot be
-positively confirmed as `ROCm`, do not create the PR; stop and report why.
+`--repo AMD-Ecosystem/flashinfer --base amd-integration` explicitly, and run `gh repo set-default --view` first —
+it MUST print `AMD-Ecosystem/flashinfer` or you abort. If the target owner cannot be
+positively confirmed as `AMD-Ecosystem`, do not create the PR; stop and report why.
Failing to raise a PR is always preferable to raising one against upstream.
Also NEVER push to or raise a PR from the `amd-integration` branch itself — it
@@ -24,6 +24,36 @@ followed by `git reset --hard origin/amd-integration` to restore
an abort condition too.
Full procedure: `pr-workflow` skill.
+## Branch naming
+
+Topic branches are created off `origin/amd-integration` and named with **plain
+hyphenated words** describing the change:
+
+- ✅ `pr-workflow-push-safety`, `timing-torch-events`, `aiter-solution-generator`
+- ❌ **no `rocm/` prefix** — the entire fork is ROCm, so it's redundant noise.
+- ❌ **no plan-phase labels** (`p1`, `p2`, …) from `ROCM_PORT_PLAN.md` — name the
+ *change*, not the plan milestone.
+
+## CRITICAL: ask before pushing to remote (fail-closed)
+
+**Never `git push` (or `gh pr create`, which pushes) without first getting the
+user's explicit "yes" for that specific push.** It publishes to a shared repo.
+This applies to every push — the initial branch push, force-pushes after a
+rebase, and follow-up pushes addressing review comments; a prior "yes" does not
+authorize a later push. State exactly what will be pushed and where (branch →
+`AMD-Ecosystem/flashinfer`) and wait. Local-only work (commits, the quality
+gate, the local review) needs no confirmation — only the network push does. When
+in doubt, hold the push and ask.
+
+## PR / issue body formatting
+
+Do not hard-wrap the body to a fixed column. GitHub renders a single newline
+inside a paragraph as a `
`, so column-wrapped prose shows up as broken
+mid-sentence lines. Write each paragraph and each bullet as one line and let the
+browser soft-wrap; use blank lines only to separate paragraphs/list items. (Same
+for issue bodies and PR/issue comments — anything GitHub renders.) This is the
+opposite of the repo's `.md`/`.py` source files, which are wrapped normally.
+
## Essential Commands
| Task | Command |