docs: define the zones, and standardise on "zone" over "area" - #201
Merged
Conversation
"Area" and "zone" are the same thing, used interchangeably across eight files and defined in none of them. The three places that enumerate the list disagreed: zone_for() has 14 buckets, CODEOWNERS names 11 plus a fallback, the templates listed the same 11, and AGENTS.md gave a fourth version -- 11 plus `root`, without the two catch-alls. The gap had a concrete cost. A PR editing README.md, AGENTS.md, Makefile or pyproject.toml lands in the `root` zone, which no template offered, so the author picked a wrong zone or deleted the line. That is the most common kind of PR in this repo. docs/CODE-OWNERSHIP.md is now the definition: area = zone, the canonical 14-row table with each bucket's pattern and owner, what consumes the list and whether it blocks (nothing does today), when spanning zones is sanctioned, and the five files to update in sync when adding one. Templates gain `root` and a pointer. They deliberately still omit `services/other` and `packages/other`: those are transitional buckets, and a PR landing in one means something was added that nobody registered -- the fix is to give it a real zone, not to pick a catch-all off a menu. AGENTS.md stops enumerating and links instead, per its own rule that repeated prose is what drifts. That deletes the fourth copy rather than correcting it. Both names survive on purpose. The machinery says "zone" -- the workflow filename, its job name, the PR template heading -- so the prose follows it. Renaming would touch a workflow filename for a cosmetic gain, a bad trade once that job is a required status check. Still outstanding, and recorded in the new doc: five files hold this list and nothing checks they agree. Both drift incidents so far trace to that. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Follows the previous commit. Rather than documenting that "area" and "zone" are synonyms, use one word. The reason is a collision, not tidiness. The in-flight project-board revamp introduces `area/*` as an issue-label namespace grouping by kind of work -- area/bot, area/service, area/tooling -- which is a different axis from these fourteen directory buckets. One `area/service` issue spans six zones. That branch also adds required "Area" dropdowns to the issue templates, the same templates carrying the zone list, so shipping both would give "area" two meanings in one issue form. "Zone" wins because the machinery already says it: pr-zone-check.yml, the zone-check job, zone_for(), the PR template heading. Standardising the other direction would rename a workflow file and its job -- a bad trade once that job is a required status check. No logic changes. Of the 42 occurrences, 30 were in CODE-OWNERSHIP.md (new in the previous commit, never merged), and the rest are comments. The single non-comment edit is the ::warning:: message text. zone_for()'s fourteen buckets and every match pattern are byte-identical; verified the YAML still parses and the function still passes `bash -n`. Two mentions of "area" are kept on purpose, in CODEOWNERS and the doc, noting that older comments and git history use it for the same concept. That keeps the word searchable without endorsing it. Also left alone: "Rate each area" in services/connectors/tests/test_forms_extractor.py, an unrelated Google Forms fixture. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
root
qiuethan
enabled auto-merge (squash)
August 16, 2026 22:42
qiuethan
disabled auto-merge
August 16, 2026 22:42
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.
What this changes
Adds
docs/CODE-OWNERSHIP.mdas the single definition of the repo's zones, and standardises the vocabulary on that one word.rootis now a listed zone in the PR template and both issue templates. All three lists are byte-identical.AGENTS.mdstops enumerating the list and links the new doc instead.Why
"Area" and "zone" were the same thing, used interchangeably across eight files and defined in none. The three places that enumerated the list disagreed:
zone_for()has 14 buckets,CODEOWNERSnamed 11 plus a fallback, the templates listed the same 11, andAGENTS.mdgave a fourth version.That gap had a concrete cost. A PR editing
README.md,AGENTS.md,Makefile, orpyproject.tomllands in therootzone, which no template offered — so the author picked a wrong zone or deleted the line. That's the most common kind of PR in this repo.The rename is driven by a collision, not tidiness. The in-flight project-board revamp introduces
area/*as an issue-label namespace grouping by kind of work (area/bot,area/service,area/tooling, …) — a different axis from these fourteen directory buckets. Onearea/serviceissue spans six zones. That branch also adds required "Area" dropdowns to the issue templates, the same templates that carry the zone list. Ship both and "area" means two things in one issue form."Zone" wins because the machinery already says it:
pr-zone-check.yml, thezone-checkjob,zone_for(), the## Zoneheading. Standardising the other direction would rename a workflow file and its job — a bad trade once that job is a required status check.Two "area" mentions are kept deliberately, in
CODEOWNERSand the doc, noting that older comments and git history use it for the same concept. Keeps the word searchable without endorsing it.One deliberate omission:
services/otherandpackages/otherstay off the template menus. They're transitional buckets — a PR landing in one means something was added that nobody registered, and the fix is to give it a real zone, not to pick a catch-all.rootis different: a permanent destination.Zone
docs·.github·rootThree zones, so
pr-zone-checkwill warn. Expected rather than incidental: the change is the zone list, which inherently lives indocs/,.github/, and a root file.How to verify
I ran all of these.
zone_for()also still passesbash -n, and every relative link in the new doc resolves.Checklist
stagingand targetingstaging.Ran the service's test suite locally— N/A, no service touched. Five Markdown files,CODEOWNERS, and one workflow comment block.— N/A, no Python touched. Markdown is hand-wrapped and the linters are scoped to Python anduv run ruff check ./ruff format --check .*.js, somake checkhas no surface here. I did not run it.Read the service's— N/A, no service touched.docs/CONTRIBUTING.mdREADME.md's tree,AGENTS.md's "Where to look" table, and the new doc's closing section, which these fixes made obsolete twice over.Deployment notes
None. No runtime, config, or CI behaviour changes —
zone_for()'s fourteen buckets and every match pattern are byte-identical.Anything you're unsure about
Conflict warning: the local
docs/project-board-revampbranch rewrites the sameCODEOWNERSandpr-zone-check.ymlcomment blocks. It's unpushed, so it's the one that rebases — and rebasing it onto this means it inherits settled vocabulary rather than propagating the ambiguity. Worth doing before it grows.The root cause is still open. Five files hold the zone list and nothing checks they agree. Both drift incidents —
deee002and this one — trace to that. Correcting the copies resets the clock without changing the odds. A ~15-line CI step diffingzone_for()againstCODEOWNERSwould catch it mechanically; I'd keep it a separate PR since it's the only part with logic to get wrong.Latent, not yet biting:
root,services/other, andpackages/otherhave noCODEOWNERSline and resolve through the*fallback. Invisible while every owner is@qiuethan.🤖 Generated with Claude Code