chore(ci): forbid .ai TLD references (regression gate, both domain forms)#2387
Merged
alexey-pelykh merged 2 commits intomainfrom Apr 17, 2026
Merged
chore(ci): forbid .ai TLD references (regression gate, both domain forms)#2387alexey-pelykh merged 2 commits intomainfrom
alexey-pelykh merged 2 commits intomainfrom
Conversation
Forbids `remoteclaw.ai` references in tracked files. The fork owns remoteclaw.org only; `.ai` URLs are stale or upstream drift. Without a gate, future PRs (especially upstream syncs from OpenClaw) can silently reintroduce `.ai` URLs after #2382 cleaned the last ones. - scripts/check-no-remoteclaw-ai.mjs — Node gate over `git grep -n "remoteclaw\.ai"`, filtered through an allowlist (supports FILE:path, FILE:dir/, and substring rules). Exit 0 clean / 1 violation / 2 infra error. - scripts/ci/remoteclaw-ai-allowlist.txt — documented allowlist with concrete Example: lines per rule type. Self-exempts the two gate-infrastructure files. - package.json — `lint:no-remoteclaw-ai` script; appended to the `check` aggregator so the gate runs in the same CI `lint` job as `pnpm check`. Refs: #2385
The fork owns remoteclaw.org only — `.ai` TLD claims are wrong in BOTH
directions. Forward-domain `remoteclaw.ai` was covered; reverse-DNS
form `ai.remoteclaw.*` (bundle IDs, launch-agent labels, package names)
was not.
- Pattern now ERE: `(remoteclaw\.ai|ai\.remoteclaw)` via `git grep -E`.
- Header, success message, and fix hint reframed around the `.ai` TLD
concern; fix hint suggests both canonical forms (`remoteclaw.org`,
`org.remoteclaw.*`).
- Allowlist: exempt the legacy daemon launch-agent labels in
src/daemon/constants{,.test}.ts — these intentionally remember old
`ai.remoteclaw.*` bundle IDs to recognize and clean them up during
upgrade migration. The current canonical form is `org.remoteclaw.*`.
Verified:
- Clean on branch HEAD.
- Forward violation (`https://remoteclaw.ai/...`) → exit 1.
- Reverse violation (`ai.remoteclaw.gateway`) → exit 1.
- Negative (`org.remoteclaw.ios`) → exit 0.
Refs: #2385
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Add a CI gate that forbids
.aiTLD references involving the RemoteClaw name, in both directions:remoteclaw.ai(URLs, hostnames)ai.remoteclaw.*(bundle IDs, launch-agent labels, package names)The fork owns
remoteclaw.orgonly. Without this gate, future PRs (especially upstream syncs from OpenClaw) can silently reintroduce.aiclaims after #2382 cleaned the last forward-domain references.Scope note
#2385 as filed requested the forward-domain pattern only (
remoteclaw\.ai). During review the reverse-DNS form was flagged — the fork's reverse-domain isorg.remoteclawper project conventions, andai.remoteclaw.*is the same.aiTLD claim in different notation. Expanded here to cover both forms in one PR rather than filing a separate follow-up.Changes
scripts/check-no-remoteclaw-ai.mjs— Node gate overgit grep -n -E "(remoteclaw\\.ai|ai\\.remoteclaw)", filtered through an allowlist (FILE:path,FILE:dir/, and substring rules). Exit codes:0clean /1violation /2infrastructure error.scripts/ci/remoteclaw-ai-allowlist.txt— documented allowlist with concreteExample:lines per rule type. Self-exempts the two gate-infrastructure files. Also exemptssrc/daemon/constants{,.test}.ts— these intentionally remember the legacyai.remoteclaw.*launch-agent labels for migration recognition.package.json—"lint:no-remoteclaw-ai"script entry; appended to thecheckaggregator so the gate runs in the existing CIlintjob (AC3 — no new workflow job needed).Acceptance criteria
pnpm lint:no-remoteclaw-aiexits 0 on branch HEAD (clean, with legacy labels allowlisted).remoteclaw.aiURL in non-allowlisted file → gate fails (adversarial fixture: subdomainsub.remoteclaw.aimatches;remoteclaw-aihyphen does NOT).ai.remoteclaw.*reverse-DNS in non-allowlisted file → gate fails. Negative test:org.remoteclaw.*stays clean.pnpm check(appended to aggregator;.github/workflows/ci.ymllintjob runspnpm check).Test plan
lintjob log showsNo forbidden .ai TLD references detected.Notes
.github/workflows/ci.yml— aggregator wire-up is sufficient per AC3.Closes #2385
🤖 Generated with Claude Code