docs: standardize repo docs and scaffold agentic-coding config #6

Merged
gabogg merged 11 commits from docs/agentic-onboarding into master 2026-09-19 20:28:16 +00:00
Owner

What this PR does

Prepares the repository for AI-agent-driven work (Matt Pocock skills) by documenting, standardizing, and generalizing the existing information, plus one new policy (item 4 below, flagged explicitly). It does not change the website itself (pages, styles, content) — documentation and configuration only.

Changes

  1. Agent-skills config (docs/agents/, CLAUDE.md): Forgejo issue tracker, triage labels, domain-doc consumer rules.
  2. Domain glossary (CONTEXT.md): canonical vocabulary; distinguishes the two content models (Brochure vs EmergencyTopic) and reading-mode vs style-variant.
  3. Docs realignment (README.md, docs/routes.md): the docs claimed "4 topics / 8 pages"; the real site has 48 routes (1+1+1+6+1+6+8+24). docs/routes.md is now the single route inventory — its tables were corrected and the obsolete /nuevo-contenido-completo row removed, and the README's duplicate table was dropped in favour of a link to it.
  4. ADRs: ADR-0001 (Forgejo as source of truth, GitHub as backup mirror) and ADR-0002 (frozen legacy routes pinned by deployed QR codes). ⚠️ ADR-0002 is new policy, not documentation of an existing rule. Together with CLAUDE.md rule 5 it creates a binding immutability constraint on the home page, the two topic menus and their 12 [topic] children that was never written down before. The rest of this PR records what already existed; this item adds a hard constraint, and it is called out here so no reviewer has to infer it from the diff.

Migration context

The repo moved from GitHub to this Forgejo instance (PCivil/folletos-digitales), now the source of truth. GitHub is kept as an automatic backup mirror. Issues and PRs live here.

Language policy

Agent- and contributor-facing docs and all remote-facing artifacts (PRs, issues, comments, commits) are in English; product-facing content (page copy, docs/design_guide.md) stays in Spanish. See CLAUDE.md rule 4.

Follow-up issues (out of scope here)

Monitoring (#1), CI + docs-drift check (#2), deployment docs (#3), content-model consolidation (#4), package.json metadata (#5), orphaned routes (#7), design-guide reconciliation (#8), docs single-sourcing (#9).

## What this PR does Prepares the repository for AI-agent-driven work (Matt Pocock skills) by **documenting, standardizing, and generalizing** the existing information, plus **one new policy** (item 4 below, flagged explicitly). It does **not** change the website itself (pages, styles, content) — documentation and configuration only. ### Changes 1. **Agent-skills config** (`docs/agents/`, `CLAUDE.md`): Forgejo issue tracker, triage labels, domain-doc consumer rules. 2. **Domain glossary** (`CONTEXT.md`): canonical vocabulary; distinguishes the two content models (`Brochure` vs `EmergencyTopic`) and reading-mode vs style-variant. 3. **Docs realignment** (`README.md`, `docs/routes.md`): the docs claimed "4 topics / 8 pages"; the real site has **48 routes** (1+1+1+6+1+6+8+24). `docs/routes.md` is now the single route inventory — its tables were corrected and the obsolete `/nuevo-contenido-completo` row removed, and the README's duplicate table was dropped in favour of a link to it. 4. **ADRs**: ADR-0001 (Forgejo as source of truth, GitHub as backup mirror) and ADR-0002 (frozen legacy routes pinned by deployed QR codes). ⚠️ **ADR-0002 is new policy, not documentation of an existing rule.** Together with `CLAUDE.md` rule 5 it creates a binding immutability constraint on the home page, the two topic menus and their 12 `[topic]` children that was never written down before. The rest of this PR records what already existed; this item adds a hard constraint, and it is called out here so no reviewer has to infer it from the diff. ### Migration context The repo moved from GitHub to this Forgejo instance (`PCivil/folletos-digitales`), now the source of truth. GitHub is kept as an automatic backup mirror. Issues and PRs live here. ### Language policy Agent- and contributor-facing docs and all remote-facing artifacts (PRs, issues, comments, commits) are in **English**; product-facing content (page copy, `docs/design_guide.md`) stays in Spanish. See `CLAUDE.md` rule 4. ### Follow-up issues (out of scope here) Monitoring (#1), CI + docs-drift check (#2), deployment docs (#3), content-model consolidation (#4), package.json metadata (#5), orphaned routes (#7), design-guide reconciliation (#8), docs single-sourcing (#9).
Wire the per-repo config that Matt Pocock's engineering skills assume:
- docs/agents/issue-tracker.md: Forgejo (PCivil/folletos-digitales) via REST API
- docs/agents/triage-labels.md: five canonical triage labels
- docs/agents/domain.md: single-context domain-doc consumer rules
- CLAUDE.md: add ## Agent skills pointer block

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Pin the project's canonical vocabulary, notably the two parallel content
models (Brochure vs EmergencyTopic) and the mode-vs-styleVariant distinction,
so agents speak one language when exploring the codebase.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
The docs claimed 4 topics / 8 pages, but the site now has two topic menus,
dynamic topic subpages, and a school brochure style×mode matrix (41 routes
total). Rewrite the routes table, project structure, and content-model
description to match src/, and drop the stale /nuevo-contenido-completo entry.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Author
Owner

Code review — two axes (Standards / Spec)

Automated review of master...docs/agentic-onboarding (7 files, +287/−64). Two independent axes: Standards (does the change respect the repo's documented standards?) and Spec (does the change do what this PR says it does?). Reported separately on purpose: one axis can pass while the other fails.

Summary: Standards — 3 factual contradictions, 4 design smells, 1 disclosure note. Spec — 6 findings. Two findings surfaced on both axes independently (README line 1, and the /prevencion-escolar data source): those are the highest-confidence fixes.


Standards

Factual contradictions with the repo

README.md, line 1 — the headline claim is false:

"The home page works as a central dashboard that links to the general brochures and to two topic menus"

src/pages/index.astro defines exactly two menuOptions (/prevencion-escolar, /prevencion-y-gestion-de-riesgo) and nothing else. grep -rnoE "/(sismos|inundaciones|orden-publico|otros-riesgos)-[a-z-]*" src/ returns zero hits: the 8 /[slug]-[mode] routes are unreachable from any page. The commit message says "realign README with actual site structure"; this is precisely the line that did not get realigned.

docs/routes.md + README.md — inconsistent orphan reporting. /general is correctly flagged "currently hidden from the menu", but the 8 general-brochure routes are equally unlinked and carry no such note. Same condition, different treatment, in the file whose entire job is the route inventory.

docs/routes.md — the /prevencion-escolar row lists only schoolEmergencyTopics as its data source. src/pages/prevencion-escolar.astro:86 also filters brochures for the four school planning slugs; the previous version said so explicitly ("4 planning brochures") and the rewrite dropped it.

Verified correct: every slug and id in CONTEXT.md and README.md; the counts 1/1/1/6/1/6/8/24 (4×2 and 4×3×2 in both getStaticPaths); SponsorsFooter present in Layout.astro; commands vs package.json.

Design smells (judgement calls, not hard violations)

Middle Man — docs/agents/triage-labels.md. Every row maps a string to itself (needs-triage → needs-triage), the column header names an upstream repo (Label in mattpocock/skills), and the file closes with unedited template boilerplate: "Edit the right-hand column to match whatever vocabulary you actually use." CLAUDE.md already states the vocabulary inline; the file delegates and adds nothing.

Speculative Generality — docs/agents/domain.md. It gives instructions for CONTEXT-MAP.md "if it exists" and src/<context>/docs/adr/ "in multi-context repos", then declares "This is a single-context repo". Its structure block shows docs/adr/0001-….md; docs/adr/ does not exist.

Duplicated Code — route/slug tables. The route-pattern table with counts and the [mode]/[style] legend appear near-verbatim in both README.md and docs/routes.md, and the slug/id lists appear a third time in CONTEXT.md. The README links to routes.md as the "detailed inventory" and still reproduces it. Three places to drift.

Divergent Change — CLAUDE.md. The new "Agent skills" section restates the tracker host and the full five-label list that docs/agents/* already own, and links to those files as well. Index or duplicate, not both.

Disclosure

No token was committed: issue-tracker.md correctly reads from ~/.config/forgejo/token. It does, however, commit the following to a repo that is auto-mirrored to a public GitHub remote (GGabrielDev/trabajo-folletos-digitales):

"The instance runs on a VPS reachable at gabogg@ssh.gaboggamer.online (passwordless sudo for the owner)."

git.gaboggamer.online is already in git remote -v, so that part leaks nothing new; the admin SSH host plus the passwordless-sudo note is new reconnaissance detail with no operational need in a repo doc. Recommendation: remove that sentence, or move it to a local, gitignored note.

Design-guide tension (pre-existing, not introduced here)

docs/design_guide.md §8 says to vary "únicamente superficies de lectura … sin cambiar paleta ni geometría", while CONTEXT.md and routes.md now formalize rounded-glass / timeline-step as variants that do change geometry. CLAUDE.md (pre-image, untouched) already endorses those three variants, so the repo overrides the guide — but this diff makes the contradiction structural in the glossary without reconciling it.


Spec

Verified correct: the diff touches only CLAUDE.md, CONTEXT.md, README.md, docs/agents/*.md and docs/routes.md — the claim "No modifica el sitio web (páginas, estilos, contenido)" holds. Every type name in CONTEXT.md exists as declared (Brochure/BrochureCard/AlertLevel/BrochureMode in src/data/brochures.ts; EmergencyTopic/EmergencyPhase/EmergencyMapNode/EmergencyInfographicItem/EmergencyVisualStep in src/data/emergencyTopics.ts), the 8 brochure slugs and 6 topic ids match both data files, and the styleVariant union matches. /nuevo-contenido-completo is genuinely obsolete (page deleted in 468dc21, absent from master's src/pages/): removing its row is correct. Tracker labels #6–#9 plus wontfix exist; issues #1–#5 match the declared out-of-scope list.

Implemented but wrong

  1. The route count is wrong. Spec: "el sitio real tiene 41 rutas". The real figure is 48 — getStaticPaths sums 1+1+1+6+1+6+8+24 = 48, and dist/ contains 48 index.html files. The tables this very PR ships add up to 48, so the PR body contradicts its own deliverable.
  2. The new README opening line is factually wrong. Same as the Standards finding above. The old line ("links to eight brochure pages") was wrong too; the replacement swaps one inaccuracy for another.
  3. The /prevencion-escolar data-source column is incomplete in docs/routes.md (see Standards).

Missing or partial

  1. Spec (CLAUDE.md): "Repositorio de contexto único: un CONTEXT.md + docs/adr/ en la raíz", and docs/agents/domain.md diagrams docs/adr/0001-….md. docs/adr/ does not exist. domain.md says to proceed silently when it is absent, so this is tolerable, but the config advertises a path the repo does not have.

Out of scope

  1. docs/agents/issue-tracker.md goes beyond "tracker Forgejo … operado vía API REST": it adds a "Server-side administration" section naming the VPS host and its passwordless sudo, plus a /wayfinder section. That is infrastructure, not tracker config — and it edges into the territory of issues #1/#3, which this PR declares out of scope.
  2. docs/agents/triage-labels.md still carries unedited template boilerplate: "Edit the right-hand column to match whatever vocabulary you actually use."

Proposed remediations

The spirit of this PR is that an agent should be able to trust these docs without re-reading src/. Every finding above is a point where that trust breaks. Ordered by value/effort:

Blocking before merge (~25 min, text only)

  1. Add an explicit repository-language rule. All PRs, issues, and comments pushed to the remote must be written in English, consistently, even though the site's own content and UI copy are in Spanish. Domain terms that are proper nouns of the product (prevencion-escolar, Protección Civil, brochure slugs) stay in Spanish as identifiers; the prose around them is English. Suggested home: CLAUDE.md, which is the instruction file agents actually load — the repo has no AGENTS.md today, and CONTEXT.md is scoped to domain vocabulary rather than process rules. Wording to drop in:

    Language policy. Repository content written for the site (page copy, brochure text, UI strings) is in Spanish. Everything written about the repository and pushed to the remote — pull request titles and bodies, issue titles and bodies, review comments, and commit messages — must be in English, without exception. Spanish domain terms (Brochure slugs, Protección Civil, route names) are kept verbatim as identifiers inside English prose.

    Note that this PR's own body is in Spanish and would be the first thing to bring into compliance; rewriting it in English also gives a clean place to fix the route count in item 4 below.

  2. Fix README.md line 1. Wording that actually matches index.astro: "The home page is a central dashboard with two topic menus (/prevencion-escolar, /prevencion-y-gestion-de-riesgo). The general brochures are reached via /general, which is currently not linked from the home page." This clears both Spec finding #2 and the main Standards violation at once.

  3. Add brochures to the /prevencion-escolar row in docs/routes.md (schoolEmergencyTopics + brochures, with a note naming the 4 planning slugs). One of only two findings flagged by both axes.

  4. Fix the PR body: 41 → 48 routes. If 41 deliberately excluded something (the [style] routes, say), state what it excludes.

  5. Remove the VPS host + passwordless-sudo sentence from docs/agents/issue-tracker.md. The repo has a public mirror; that detail adds no operational value to the doc and does add reconnaissance surface. If it is needed to operate, it belongs in a local, gitignored note.

Finish the work this PR started (~30 min)

  1. Clean up docs/agents/triage-labels.md: drop the boilerplate and the "Label in mattpocock/skills" column that maps every value to itself. Keep only the label → when it is applied → who removes it table, which is what a triage agent actually needs.
  2. Prune the multi-context branches from docs/agents/domain.md: the file itself declares this a single-context repo. Delete the conditionals; keep the rule that applies.
  3. Decide on docs/adr/: either create the directory with a real 0001- (natural candidate: "Forgejo as source of truth, GitHub as backup mirror" — already a decision made in this very PR, currently living only in prose), or drop the path from CLAUDE.md and domain.md. As it stands, the config promises something that does not exist.
  4. Pick a single source for the route tables. docs/routes.md is the inventory; have README.md link to it and keep only a one-sentence summary with no counts. Same for CLAUDE.md, which should index docs/agents/* rather than restate their contents. Three copies of the same fact is exactly how a doc becomes a lie in three months.

Follow-up (separate issue, not this PR)

  1. The 8 /[slug]-[mode] routes are not linked from any page. The inventory now makes this visible, which is to this PR's credit — but it is a product finding, not a docs finding: either link them from /general or from the home page, or delete them. Deserves its own issue.
  2. Automated docs-drift check. A script that compares the counts in docs/routes.md against getStaticPaths and fails in CI. That is the only way these fixes stay in sync; it fits naturally into issue #2 (CI).

Items 1–5 close everything both axes flagged as incorrect. Items 6–9 are what make the PR live up to its own premise of "documentar, estandarizar y generalizar" instead of leaving half-edited templates behind.

🤖 Review generated with Claude Code

## Code review — two axes (Standards / Spec) Automated review of `master...docs/agentic-onboarding` (7 files, +287/−64). Two independent axes: **Standards** (does the change respect the repo's documented standards?) and **Spec** (does the change do what this PR says it does?). Reported separately on purpose: one axis can pass while the other fails. **Summary:** Standards — 3 factual contradictions, 4 design smells, 1 disclosure note. Spec — 6 findings. Two findings surfaced on **both** axes independently (README line 1, and the `/prevencion-escolar` data source): those are the highest-confidence fixes. --- ## Standards ### Factual contradictions with the repo **`README.md`, line 1** — the headline claim is false: > "The home page works as a central dashboard that links to the general brochures and to two topic menus" `src/pages/index.astro` defines exactly two `menuOptions` (`/prevencion-escolar`, `/prevencion-y-gestion-de-riesgo`) and nothing else. `grep -rnoE "/(sismos|inundaciones|orden-publico|otros-riesgos)-[a-z-]*" src/` returns **zero hits**: the 8 `/[slug]-[mode]` routes are unreachable from any page. The commit message says "realign README with actual site structure"; this is precisely the line that did not get realigned. **`docs/routes.md` + `README.md`** — inconsistent orphan reporting. `/general` is correctly flagged "currently hidden from the menu", but the 8 general-brochure routes are equally unlinked and carry no such note. Same condition, different treatment, in the file whose entire job is the route inventory. **`docs/routes.md`** — the `/prevencion-escolar` row lists only `schoolEmergencyTopics` as its data source. `src/pages/prevencion-escolar.astro:86` also filters `brochures` for the four school planning slugs; the previous version said so explicitly ("4 planning brochures") and the rewrite dropped it. **Verified correct:** every slug and id in `CONTEXT.md` and `README.md`; the counts 1/1/1/6/1/6/8/24 (4×2 and 4×3×2 in both `getStaticPaths`); `SponsorsFooter` present in `Layout.astro`; commands vs `package.json`. ### Design smells (judgement calls, not hard violations) **Middle Man — `docs/agents/triage-labels.md`.** Every row maps a string to itself (`needs-triage` → `needs-triage`), the column header names an upstream repo (`Label in mattpocock/skills`), and the file closes with unedited template boilerplate: *"Edit the right-hand column to match whatever vocabulary you actually use."* `CLAUDE.md` already states the vocabulary inline; the file delegates and adds nothing. **Speculative Generality — `docs/agents/domain.md`.** It gives instructions for `CONTEXT-MAP.md` "if it exists" and `src/<context>/docs/adr/` "in multi-context repos", then declares *"This is a **single-context** repo"*. Its structure block shows `docs/adr/0001-….md`; `docs/adr/` does not exist. **Duplicated Code — route/slug tables.** The route-pattern table with counts and the `[mode]`/`[style]` legend appear near-verbatim in both `README.md` and `docs/routes.md`, and the slug/id lists appear a third time in `CONTEXT.md`. The README links to `routes.md` as the "detailed inventory" and still reproduces it. Three places to drift. **Divergent Change — `CLAUDE.md`.** The new "Agent skills" section restates the tracker host and the full five-label list that `docs/agents/*` already own, and links to those files as well. Index or duplicate, not both. ### Disclosure No token was committed: `issue-tracker.md` correctly reads from `~/.config/forgejo/token`. It does, however, commit the following to a repo that is auto-mirrored to a public GitHub remote (`GGabrielDev/trabajo-folletos-digitales`): > "The instance runs on a VPS reachable at `gabogg@ssh.gaboggamer.online` (passwordless sudo for the owner)." `git.gaboggamer.online` is already in `git remote -v`, so that part leaks nothing new; the admin SSH host plus the passwordless-sudo note is new reconnaissance detail with no operational need in a repo doc. Recommendation: remove that sentence, or move it to a local, gitignored note. ### Design-guide tension (pre-existing, not introduced here) `docs/design_guide.md` §8 says to vary *"únicamente superficies de lectura … sin cambiar paleta ni geometría"*, while `CONTEXT.md` and `routes.md` now formalize `rounded-glass` / `timeline-step` as variants that do change geometry. `CLAUDE.md` (pre-image, untouched) already endorses those three variants, so **the repo overrides** the guide — but this diff makes the contradiction structural in the glossary without reconciling it. --- ## Spec **Verified correct:** the diff touches only `CLAUDE.md`, `CONTEXT.md`, `README.md`, `docs/agents/*.md` and `docs/routes.md` — the claim *"No modifica el sitio web (páginas, estilos, contenido)"* holds. Every type name in `CONTEXT.md` exists as declared (`Brochure`/`BrochureCard`/`AlertLevel`/`BrochureMode` in `src/data/brochures.ts`; `EmergencyTopic`/`EmergencyPhase`/`EmergencyMapNode`/`EmergencyInfographicItem`/`EmergencyVisualStep` in `src/data/emergencyTopics.ts`), the 8 brochure slugs and 6 topic ids match both data files, and the `styleVariant` union matches. `/nuevo-contenido-completo` is genuinely obsolete (page deleted in 468dc21, absent from master's `src/pages/`): removing its row is correct. Tracker labels #6–#9 plus `wontfix` exist; issues #1–#5 match the declared out-of-scope list. ### Implemented but wrong 1. **The route count is wrong.** Spec: *"el sitio real tiene 41 rutas"*. The real figure is **48** — `getStaticPaths` sums 1+1+1+6+1+6+8+24 = 48, and `dist/` contains 48 `index.html` files. The tables this very PR ships add up to 48, so the PR body contradicts its own deliverable. 2. **The new README opening line is factually wrong.** Same as the Standards finding above. The old line ("links to eight brochure pages") was wrong too; the replacement swaps one inaccuracy for another. 3. **The `/prevencion-escolar` data-source column is incomplete** in `docs/routes.md` (see Standards). ### Missing or partial 4. Spec (`CLAUDE.md`): *"Repositorio de contexto único: un `CONTEXT.md` + `docs/adr/` en la raíz"*, and `docs/agents/domain.md` diagrams `docs/adr/0001-….md`. **`docs/adr/` does not exist.** `domain.md` says to proceed silently when it is absent, so this is tolerable, but the config advertises a path the repo does not have. ### Out of scope 5. `docs/agents/issue-tracker.md` goes beyond *"tracker Forgejo … operado vía API REST"*: it adds a "Server-side administration" section naming the VPS host and its passwordless sudo, plus a `/wayfinder` section. That is infrastructure, not tracker config — and it edges into the territory of issues #1/#3, which this PR declares out of scope. 6. `docs/agents/triage-labels.md` still carries unedited template boilerplate: "Edit the right-hand column to match whatever vocabulary you actually use." --- ## Proposed remediations The spirit of this PR is that **an agent should be able to trust these docs without re-reading `src/`**. Every finding above is a point where that trust breaks. Ordered by value/effort: ### Blocking before merge (~25 min, text only) 1. **Add an explicit repository-language rule.** All PRs, issues, and comments pushed to the remote must be written **in English**, consistently, even though the site's own content and UI copy are in Spanish. Domain terms that are proper nouns of the product (`prevencion-escolar`, `Protección Civil`, brochure slugs) stay in Spanish as identifiers; the prose around them is English. Suggested home: `CLAUDE.md`, which is the instruction file agents actually load — the repo has no `AGENTS.md` today, and `CONTEXT.md` is scoped to domain vocabulary rather than process rules. Wording to drop in: > **Language policy.** Repository content written for the site (page copy, brochure text, UI strings) is in Spanish. Everything written *about* the repository and pushed to the remote — pull request titles and bodies, issue titles and bodies, review comments, and commit messages — must be in English, without exception. Spanish domain terms (`Brochure` slugs, `Protección Civil`, route names) are kept verbatim as identifiers inside English prose. Note that **this PR's own body is in Spanish** and would be the first thing to bring into compliance; rewriting it in English also gives a clean place to fix the route count in item 4 below. 2. **Fix `README.md` line 1.** Wording that actually matches `index.astro`: "The home page is a central dashboard with two topic menus (`/prevencion-escolar`, `/prevencion-y-gestion-de-riesgo`). The general brochures are reached via `/general`, which is currently not linked from the home page." This clears both Spec finding #2 and the main Standards violation at once. 3. **Add `brochures` to the `/prevencion-escolar` row** in `docs/routes.md` (`schoolEmergencyTopics` + `brochures`, with a note naming the 4 planning slugs). One of only two findings flagged by both axes. 4. **Fix the PR body: 41 → 48 routes.** If 41 deliberately excluded something (the `[style]` routes, say), state what it excludes. 5. **Remove the VPS host + passwordless-sudo sentence** from `docs/agents/issue-tracker.md`. The repo has a public mirror; that detail adds no operational value to the doc and does add reconnaissance surface. If it is needed to operate, it belongs in a local, gitignored note. ### Finish the work this PR started (~30 min) 6. **Clean up `docs/agents/triage-labels.md`:** drop the boilerplate and the "Label in mattpocock/skills" column that maps every value to itself. Keep only the `label → when it is applied → who removes it` table, which is what a triage agent actually needs. 7. **Prune the multi-context branches from `docs/agents/domain.md`:** the file itself declares this a single-context repo. Delete the conditionals; keep the rule that applies. 8. **Decide on `docs/adr/`:** either create the directory with a real `0001-` (natural candidate: "Forgejo as source of truth, GitHub as backup mirror" — already a decision made in this very PR, currently living only in prose), or drop the path from `CLAUDE.md` and `domain.md`. As it stands, the config promises something that does not exist. 9. **Pick a single source for the route tables.** `docs/routes.md` is the inventory; have `README.md` link to it and keep only a one-sentence summary with no counts. Same for `CLAUDE.md`, which should index `docs/agents/*` rather than restate their contents. Three copies of the same fact is exactly how a doc becomes a lie in three months. ### Follow-up (separate issue, not this PR) 10. **The 8 `/[slug]-[mode]` routes are not linked from any page.** The inventory now makes this visible, which is to this PR's credit — but it is a product finding, not a docs finding: either link them from `/general` or from the home page, or delete them. Deserves its own issue. 11. **Automated docs-drift check.** A script that compares the counts in `docs/routes.md` against `getStaticPaths` and fails in CI. That is the only way these fixes stay in sync; it fits naturally into issue #2 (CI). Items 1–5 close everything both axes flagged as incorrect. Items 6–9 are what make the PR live up to its own premise of "documentar, estandarizar y generalizar" instead of leaving half-edited templates behind. 🤖 Review generated with [Claude Code](https://claude.com/claude-code)
Author
Owner

Remediation 1 (language policy) — done.

Added to CLAUDE.md as rule 4 under Reglas de Desarrollo y Estilo, commit c53cdea on docs/agentic-onboarding (pending push at the time of writing):

Idioma del Repositorio: El contenido del sitio (texto de páginas, folletos, cadenas de UI) se escribe en español. Todo lo que se escribe sobre el repositorio y se publica en el remoto —títulos y cuerpos de pull requests, títulos y cuerpos de incidencias, comentarios de revisión y mensajes de commit— debe estar en inglés, sin excepción. Los términos de dominio en español (slugs de Brochure, Protección Civil, nombres de rutas) se conservan literalmente como identificadores dentro de la prosa en inglés.

Two notes on placement and wording:

  • It went in CLAUDE.md rather than CONTEXT.md: this is a process rule, and CONTEXT.md is scoped to domain vocabulary per docs/agents/domain.md. There is no AGENTS.md in this repo.
  • The rule itself is written in Spanish to match the surrounding file. That is deliberate and not a violation: CLAUDE.md is repository content, not one of the remote-facing artifacts (PRs, issues, comments, commit messages) the rule governs.

Still open from the review: this PR's own title and body are in Spanish and should be rewritten in English to comply — that rewrite is also the right place to correct the route count from 41 to 48 (remediation 4).

**Remediation 1 (language policy) — done.** Added to `CLAUDE.md` as rule 4 under *Reglas de Desarrollo y Estilo*, commit `c53cdea` on `docs/agentic-onboarding` (pending push at the time of writing): > **Idioma del Repositorio**: El contenido del sitio (texto de páginas, folletos, cadenas de UI) se escribe en español. Todo lo que se escribe *sobre* el repositorio y se publica en el remoto —títulos y cuerpos de pull requests, títulos y cuerpos de incidencias, comentarios de revisión y mensajes de commit— debe estar en inglés, sin excepción. Los términos de dominio en español (slugs de `Brochure`, `Protección Civil`, nombres de rutas) se conservan literalmente como identificadores dentro de la prosa en inglés. Two notes on placement and wording: - It went in `CLAUDE.md` rather than `CONTEXT.md`: this is a process rule, and `CONTEXT.md` is scoped to domain vocabulary per `docs/agents/domain.md`. There is no `AGENTS.md` in this repo. - The rule itself is written in Spanish to match the surrounding file. That is deliberate and not a violation: `CLAUDE.md` is repository content, not one of the remote-facing artifacts (PRs, issues, comments, commit messages) the rule governs. Still open from the review: this PR's own title and body are in Spanish and should be rewritten in English to comply — that rewrite is also the right place to correct the route count from 41 to 48 (remediation 4).
Author
Owner

Follow-up to the previous comment: the language boundary is drawn in the wrong place.

The rule as committed in c53cdea splits by location — repository files in Spanish, remote-facing artifacts (PRs, issues, comments, commit messages) in English — and the previous comment justified keeping CLAUDE.md itself in Spanish on that basis. That justification does not survive a look at what the repo actually contains:

Currently English Currently Spanish
README.md, CONTEXT.md, docs/agents/*.md, docs/routes.md CLAUDE.md, docs/design_guide.md

Every other document an agent loads to work on this repo is already in English. CLAUDE.md — the entry point, the one file every agent reads first — is the odd one out, and this PR is what created that inconsistency by adding four English docs around it.

The better split is by audience, not by location:

  • English — anything an agent or an outside contributor reads in order to work on the repo: CLAUDE.md, CONTEXT.md, docs/agents/*, README.md, docs/routes.md, plus PR titles and bodies, issue titles and bodies, review comments, and commit messages.
  • Spanish — anything the local team or the public reads as the product: page copy, brochure text, UI strings, and docs/design_guide.md (a visual reference for the team, not an agent process doc).

That line needs no carve-out, matches what the repo already does in 5 of 7 agent-facing files, and has a practical upside: instruction files in English are followed slightly more reliably by models, and CLAUDE.md is the highest-leverage file in the repo for that.

Suggested work, for whoever picks this up:

  1. Translate CLAUDE.md to English in full (~34 lines).
  2. Reword rule 4 to state the audience-based boundary above, replacing the location-based wording from c53cdea.
  3. Leave docs/design_guide.md in Spanish — deliberately, and say so in rule 4 so the exception is documented rather than accidental.

Not done in this PR; raised here so the decision is recorded rather than silently inherited.

**Follow-up to the previous comment: the language boundary is drawn in the wrong place.** The rule as committed in `c53cdea` splits by *location* — repository files in Spanish, remote-facing artifacts (PRs, issues, comments, commit messages) in English — and the previous comment justified keeping `CLAUDE.md` itself in Spanish on that basis. That justification does not survive a look at what the repo actually contains: | Currently English | Currently Spanish | | --- | --- | | `README.md`, `CONTEXT.md`, `docs/agents/*.md`, `docs/routes.md` | `CLAUDE.md`, `docs/design_guide.md` | Every other document an agent loads to work on this repo is already in English. `CLAUDE.md` — the entry point, the one file every agent reads first — is the odd one out, and this PR is what created that inconsistency by adding four English docs around it. The better split is by **audience**, not by location: - **English** — anything an agent or an outside contributor reads *in order to work on the repo*: `CLAUDE.md`, `CONTEXT.md`, `docs/agents/*`, `README.md`, `docs/routes.md`, plus PR titles and bodies, issue titles and bodies, review comments, and commit messages. - **Spanish** — anything the local team or the public reads *as the product*: page copy, brochure text, UI strings, and `docs/design_guide.md` (a visual reference for the team, not an agent process doc). That line needs no carve-out, matches what the repo already does in 5 of 7 agent-facing files, and has a practical upside: instruction files in English are followed slightly more reliably by models, and `CLAUDE.md` is the highest-leverage file in the repo for that. **Suggested work, for whoever picks this up:** 1. Translate `CLAUDE.md` to English in full (~34 lines). 2. Reword rule 4 to state the audience-based boundary above, replacing the location-based wording from `c53cdea`. 3. Leave `docs/design_guide.md` in Spanish — deliberately, and say so in rule 4 so the exception is documented rather than accidental. Not done in this PR; raised here so the decision is recorded rather than silently inherited.
Site content (page copy, brochure text, UI strings) stays in Spanish.
Everything written about the repository and pushed to the remote is now
required to be in English, so the tracker stays readable to agents and
contributors who do not read Spanish. Spanish domain terms are kept
verbatim as identifiers inside English prose.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Address the two-axis review of this PR:
- README: fix the false home-page claim (two menus; general brochures via
  /general, not linked from home) and replace the duplicated route table with
  a one-line summary pointing at docs/routes.md as the single source.
- routes.md: add brochures to the /prevencion-escolar data source, flag the
  orphaned /general and /[slug]-[mode] routes, and state the total (48).
- issue-tracker.md: drop the VPS host + passwordless-sudo disclosure (the repo
  is publicly mirrored); point at a local operator note instead.
- triage-labels.md: drop the self-mapping column and template boilerplate;
  keep the label / when-applied / when-removed table a triage agent needs.
- domain.md: prune the multi-context conditionals in a single-context repo.
- Add docs/adr/0001 recording the Forgejo-as-source-of-truth decision.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- CLAUDE.md: translate the entry-point instruction file to English (the review
  noted 5/7 agent-facing docs were already English); reword the language rule
  as audience-based (agent/contributor-facing = English, product-facing =
  Spanish, with docs/design_guide.md as the documented Spanish exception); and
  index docs/agents/* rather than restating the tracker host and label list.
- Add rule and ADR-0002 pinning the QR-deployed routes (/, /prevencion-escolar
  and /prevencion-y-gestion-de-riesgo plus their [topic] children) as immutable
  legacy routes that must never change even if non-compliant with new standards.
- routes.md: add a Frozen legacy routes section; domain.md: list both ADRs.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Author
Owner

Review addressed — remediation summary

Thanks for the two-axis review. I verified every factual claim against src/ before acting; all held (two menuOptions in index.astro, no page links the /[slug]-[mode] routes, prevencion-escolar.astro:85 filters brochures, getStaticPaths sums to 48, dist/ has 48 index.html, no docs/adr/). Changes are in commits 1cc3c4e and 9da901b.

Blocking (1–5)

  1. Language policy — adopted the audience-based split from the follow-up comments: CLAUDE.md fully translated to English, rule 4 reworded by audience, docs/design_guide.md documented as the Spanish exception.
  2. README line 1 — rewritten to match index.astro: two topic menus; general brochures via /general, not linked from home.
  3. /prevencion-escolar data source — now schoolEmergencyTopics + brochures, with the 4 planning slugs named.
  4. Route count 41 → 48 — fixed in the PR body; docs/routes.md now states the total and its arithmetic.
  5. VPS host + passwordless-sudo disclosure — removed from issue-tracker.md; replaced with a pointer to a local, gitignored operator note.

Finish the work (6–9)

  1. triage-labels.md — dropped the self-mapping column and boilerplate; kept a label / when-applied / when-removed table.
  2. domain.md — multi-context conditionals pruned; single-context only.
  3. docs/adr/ — created, with ADR-0001 (Forgejo as source of truth). Also added ADR-0002 (frozen legacy routes).
  4. Single source for route tables — README.md now links to docs/routes.md with a one-line summary and no counts; CLAUDE.md indexes docs/agents/* instead of restating the host and label list.

Follow-up (separate issues)

  1. Orphaned routes → issue #7. Scoped to /general and /[slug]-[mode] only; the home page and the two menus (+ children) are frozen legacy routes pinned by deployed QR codes (ADR-0002) and must not change.
  2. Docs-drift CI check → folded into issue #2.

Not fixed (acknowledged)

  • The design_guide.md §8 vs rounded-glass/timeline-step tension is pre-existing and product-facing; CLAUDE.md already endorses the three variants, so the repo overrides the guide. Left for a design-doc reconciliation rather than this docs PR.
## Review addressed — remediation summary Thanks for the two-axis review. I verified every factual claim against `src/` before acting; all held (two `menuOptions` in `index.astro`, no page links the `/[slug]-[mode]` routes, `prevencion-escolar.astro:85` filters `brochures`, `getStaticPaths` sums to 48, `dist/` has 48 `index.html`, no `docs/adr/`). Changes are in commits `1cc3c4e` and `9da901b`. ### Blocking (1–5) 1. **Language policy** — adopted the audience-based split from the follow-up comments: `CLAUDE.md` fully translated to English, rule 4 reworded by audience, `docs/design_guide.md` documented as the Spanish exception. 2. **README line 1** — rewritten to match `index.astro`: two topic menus; general brochures via `/general`, not linked from home. 3. **`/prevencion-escolar` data source** — now `schoolEmergencyTopics` + `brochures`, with the 4 planning slugs named. 4. **Route count 41 → 48** — fixed in the PR body; `docs/routes.md` now states the total and its arithmetic. 5. **VPS host + passwordless-sudo disclosure** — removed from `issue-tracker.md`; replaced with a pointer to a local, gitignored operator note. ### Finish the work (6–9) 6. **`triage-labels.md`** — dropped the self-mapping column and boilerplate; kept a label / when-applied / when-removed table. 7. **`domain.md`** — multi-context conditionals pruned; single-context only. 8. **`docs/adr/`** — created, with ADR-0001 (Forgejo as source of truth). Also added ADR-0002 (frozen legacy routes). 9. **Single source for route tables** — `README.md` now links to `docs/routes.md` with a one-line summary and no counts; `CLAUDE.md` indexes `docs/agents/*` instead of restating the host and label list. ### Follow-up (separate issues) 10. Orphaned routes → issue #7. Scoped to `/general` and `/[slug]-[mode]` only; the home page and the two menus (+ children) are **frozen legacy routes** pinned by deployed QR codes (ADR-0002) and must not change. 11. Docs-drift CI check → folded into issue #2. ### Not fixed (acknowledged) - The `design_guide.md` §8 vs `rounded-glass`/`timeline-step` tension is pre-existing and product-facing; `CLAUDE.md` already endorses the three variants, so the repo overrides the guide. Left for a design-doc reconciliation rather than this docs PR.
Author
Owner

Code review round 2 — two axes (Standards / Spec)

Re-review of master...docs/agentic-onboarding at 9da901b (9 files, +363/−78), after commits 1cc3c4e and 9da901b. 10 of 15 prior findings are closed. Details below, but one correction comes first because it changes what still needs doing.


Correction to round 1 — my earlier finding was wrong

Round 1 claimed the 8 /[slug]-[mode] routes were "unreachable from any page", citing a grep that returned zero hits. That grep was wrong. It matched literal slugs, so it could not see a template literal. The real link exists:

// src/pages/general.astro:80-83
href={resolvePath(`/${brochure.slug}-light`)}
data-light-href={resolvePath(`/${brochure.slug}-light`)}
data-dark-href={resolvePath(`/${brochure.slug}-dark`)}

The full set of link targets in the repo (grep -rn 'href={resolvePath' src/) is: /, /${brochure.slug}-{light,dark}, /prevencion-escolar/${topic.id}, /prevencion-y-gestion-de-riesgo/${topic.id}. Nothing else. So the actual reachability graph is:

Surface Count Reachable from
/, two topic menus 3 home / QR codes
/prevencion-escolar/[topic], /prevencion-y-gestion-de-riesgo/[topic] 12 their menus
/[slug]-[mode] 8 /general — linked, contrary to round 1
/general 1 nothing — genuinely orphaned
/[slug]-[style]-[mode] 24 nothing — genuinely orphaned

Apologies for the bad steer. Two things follow from it:

  1. docs/routes.md is now inverted, and this PR introduced the inversion. Line 17 says /[slug]-[mode] is "not linked from any page" — false, general.astro links all 8. Line 18 says /[slug]-[style]-[mode] is "reached from /prevencion-escolar" — also false: the only href= in prevencion-escolar.astro are lines 161 and 215, both to /prevencion-escolar/${topic.id}; the school brochures open as in-page <dialog> modals (lines 538-656), and no href anywhere in the repo contains rounded-glass or timeline-step. So 24 routes the doc calls reachable are orphans, and 8 orphans it names are reachable. The "Total: 48" arithmetic is correct.
  2. Issue #7 and ADR-0002's carve-out are scoped off the wrong set. Both name /general + the 8 /[slug]-[mode]. The correct orphan set is /general (which subtends the 8) and the 24 /[slug]-[style]-[mode] routes — 25 pages, not 9. The 24 are the larger and more interesting decision: an entire style-variant matrix that nothing reaches.

README.md line 1, by contrast, is now correct as written — "the general brochures are reached via /general" is true, and /general being itself unlinked is stated separately. That fix stands.


Standards

Prior findings

# Finding Verdict
1 README line 1 false CLOSED — names the two menuOptions exactly (index.astro:12-28)
2 Inconsistent orphan reporting OPEN, now inverted — see correction above
3 /prevencion-escolar data source CLOSED — schoolEmergencyTopics + brochures, four slugs named, matches prevencion-escolar.astro:85-87
4 Middle Man, triage-labels.md CLOSED — self-mapping column and boilerplate gone
5 Speculative Generality, domain.md CLOSED — multi-context branches removed; docs/adr/ exists
6 Duplicated Code PARTIAL — README table removed, but the frozen-route list is now verbatim in CLAUDE.md rule 5, docs/routes.md §Frozen legacy routes, and ADR-0002
7 Divergent Change, CLAUDE.md CLOSED — now a genuine index
8 VPS/sudo disclosure CLOSED in tree, PARTIAL in history — removed in 1cc3c4e, grep clean, but still reachable at d875618, and git remote -v confirms a live public push-mirror
9 design_guide.md §8 tension OPEN — judgement call, see below

On #6 (judgement call): net duplication is unchanged — editing one frozen route now means touching three files (Shotgun Surgery). ADR-0002 is the natural owner; CLAUDE.md rule 5 and docs/routes.md should link to it rather than restate the list.

On #9 (judgement call): the dismissal is weaker than it was. This PR built the grandfathering mechanism (rule 5 + ADR-0002) and then declined to apply it to the one known standards conflict in the repo. Also, rule 4's stated reason for keeping design_guide.md in Spanish is that it is "not an agent process doc" — but its §7 is titled "INSTRUCCIÓN DIRECTA PARA EL AGENTE" and §9 is an agent checklist. The exception may still be right; the justification given for it is not.

New material

HARD violation of this PR's own CLAUDE.md rule 4. The rule reads:

English — everything read in order to work on the repo: CLAUDE.md, CONTEXT.md, README.md, docs/agents/*, docs/routes.md, docs/adr/* … No exceptions.

CONTEXT.md, added by this PR, is entirely in Spanish (# CONTEXT.md — Glosario de dominio). README.md, rewritten by this PR, still carries ### Configuración de Ruta Base (Despliegue tras Proxy Reverso) at line 103 and its Spanish body. The rule is unobeyed at birth, in the same commit range that introduced it, by two of the six files it names.

ADRs — format is clean. Both follow Nygard structure (numbered title, Date, Status, Context, Decision, Consequences). ADR-0002's frozen list matches src/pages/ exactly. ADR-0001's remote claims check out against git remote -v.

Unrelated dead code spotted (pre-existing, not introduced here, no action needed in this PR): prevencion-escolar.astro:710-717 runs an auto-theme script over a[data-theme-link="auto"], a selector that page never renders.

No new secrets. No broken doc paths.


Spec

Prior findings

# Finding Verdict
1 Route count 41 vs 48 CLOSED — independently recounted: 6+6+8+24+4 singles = 48; find dist -name index.html | wc -l = 48; tables agree
2 README opening line wrong CLOSED — and correct as written, per the correction above
3 /prevencion-escolar data source CLOSED
4 docs/adr/ advertised but absent CLOSED — exists with 0001 and 0002; domain.md tree matches
5 issue-tracker.md scope creep PARTIAL — the VPS host and sudo note are gone, but the doc still carries a "Server-side administration" section, a "Wayfinding operations" section (/wayfinder, wayfinder:map), and line 4's "self-hosted on the project owner's VPS (server-side changes are possible when needed)"
6 triage-labels.md boilerplate CLOSED

Missing or partial

  • Spec: "Agent- and contributor-facing docs and all remote-facing artifacts … are in English." Not met — CONTEXT.md and README §Configuración de Ruta Base, as above. This is the same finding the Standards axis reached independently.
  • Spec: "ADRs: ADR-0001 … and ADR-0002 …" — README's docs/ structure tree omits docs/adr/ entirely. The ADRs are advertised in CLAUDE.md, domain.md and routes.md, but invisible in the README map a new contributor reads first.

Scope creep

  • Spec: "documenting, standardizing, and generalizing the existing information." ADR-0002 does not document existing information — it creates a new, binding, previously unwritten constraint. That is a legitimate thing for an ADR to do, and the decision itself looks sound; the issue is that the Changes list presents it alongside the realignment work rather than flagging it as a new policy. A reviewer skimming the body would not know a hard constraint was being introduced.
  • The residual /wayfinder and server-administration sections remain outside "Forgejo issue tracker" config.

Implemented but wrong

  • The QR-code premise is unverifiable from the repo. No QR asset, generator, or print artifact exists anywhere in the tree. ADR-0002 states the premise as fact with no date, no named owner, and no link to the press-team artifact — then it is restated in CLAUDE.md rule 5 and docs/routes.md, and cited as binding in issue #7. An unsourced claim now carries the weight of a hard constraint across four places, and a future agent can neither confirm it nor safely challenge it. ADR-0002's Context should name the source: who distributed the codes, when, and which print run.

Suggested next steps

Blocking:

  1. Fix the inverted reachability in docs/routes.md lines 17-18 (/[slug]-[mode] is linked from /general; the 24 /[slug]-[style]-[mode] are the orphans).
  2. Re-scope issue #7 and ADR-0002's carve-out to the real orphan set: /general plus the 24 style routes, 25 pages.
  3. Translate CONTEXT.md to English and the README §Configuración de Ruta Base, or amend rule 4 — but "No exceptions" plus two exceptions in the same commit range cannot both stand.
  4. Add a source line to ADR-0002's Context (who, when, which print run).

Non-blocking:
5. Make ADR-0002 the single owner of the frozen-route list; have rule 5 and routes.md link to it.
6. Drop or relocate the "Server-side administration" and "Wayfinding operations" sections in issue-tracker.md.
7. Add docs/adr/ to the README docs/ tree.
8. Either re-justify the design_guide.md Spanish exception on grounds that survive its §7/§9 being agent instructions, or fold it into the English set.
9. Decide whether the d875618 disclosure in history warrants a squash, given the live public mirror.

Summary — Standards: 10 findings, 5 closed, 2 partial, 2 open, 1 new hard violation; worst = docs/routes.md reachability is inverted, and this PR introduced it. Spec: 10 findings, 5 closed, 1 partial, 4 new; worst = the language rule this PR writes is broken by two of the six files it names.

🤖 Review generated with Claude Code

## Code review round 2 — two axes (Standards / Spec) Re-review of `master...docs/agentic-onboarding` at `9da901b` (9 files, +363/−78), after commits `1cc3c4e` and `9da901b`. **10 of 15 prior findings are closed.** Details below, but one correction comes first because it changes what still needs doing. --- ## Correction to round 1 — my earlier finding was wrong Round 1 claimed the 8 `/[slug]-[mode]` routes were "unreachable from any page", citing a grep that returned zero hits. **That grep was wrong.** It matched literal slugs, so it could not see a template literal. The real link exists: ```astro // src/pages/general.astro:80-83 href={resolvePath(`/${brochure.slug}-light`)} data-light-href={resolvePath(`/${brochure.slug}-light`)} data-dark-href={resolvePath(`/${brochure.slug}-dark`)} ``` The full set of link targets in the repo (`grep -rn 'href={resolvePath' src/`) is: `/`, `/${brochure.slug}-{light,dark}`, `/prevencion-escolar/${topic.id}`, `/prevencion-y-gestion-de-riesgo/${topic.id}`. Nothing else. So the actual reachability graph is: | Surface | Count | Reachable from | | --- | --- | --- | | `/`, two topic menus | 3 | home / QR codes | | `/prevencion-escolar/[topic]`, `/prevencion-y-gestion-de-riesgo/[topic]` | 12 | their menus | | `/[slug]-[mode]` | 8 | **`/general`** — linked, contrary to round 1 | | `/general` | 1 | **nothing** — genuinely orphaned | | `/[slug]-[style]-[mode]` | 24 | **nothing** — genuinely orphaned | Apologies for the bad steer. Two things follow from it: 1. **`docs/routes.md` is now inverted, and this PR introduced the inversion.** Line 17 says `/[slug]-[mode]` is "not linked from any page" — false, `general.astro` links all 8. Line 18 says `/[slug]-[style]-[mode]` is "reached from `/prevencion-escolar`" — also false: the only `href=` in `prevencion-escolar.astro` are lines 161 and 215, both to `/prevencion-escolar/${topic.id}`; the school brochures open as in-page `<dialog>` modals (lines 538-656), and no `href` anywhere in the repo contains `rounded-glass` or `timeline-step`. So 24 routes the doc calls reachable are orphans, and 8 orphans it names are reachable. The "Total: 48" arithmetic is correct. 2. **Issue #7 and ADR-0002's carve-out are scoped off the wrong set.** Both name `/general` + the 8 `/[slug]-[mode]`. The correct orphan set is `/general` (which subtends the 8) and the **24** `/[slug]-[style]-[mode]` routes — 25 pages, not 9. The 24 are the larger and more interesting decision: an entire style-variant matrix that nothing reaches. `README.md` line 1, by contrast, is now **correct as written** — "the general brochures are reached via `/general`" is true, and `/general` being itself unlinked is stated separately. That fix stands. --- ## Standards ### Prior findings | # | Finding | Verdict | | --- | --- | --- | | 1 | README line 1 false | **CLOSED** — names the two `menuOptions` exactly (`index.astro:12-28`) | | 2 | Inconsistent orphan reporting | **OPEN, now inverted** — see correction above | | 3 | `/prevencion-escolar` data source | **CLOSED** — `schoolEmergencyTopics + brochures`, four slugs named, matches `prevencion-escolar.astro:85-87` | | 4 | Middle Man, `triage-labels.md` | **CLOSED** — self-mapping column and boilerplate gone | | 5 | Speculative Generality, `domain.md` | **CLOSED** — multi-context branches removed; `docs/adr/` exists | | 6 | Duplicated Code | **PARTIAL** — README table removed, but the frozen-route list is now verbatim in `CLAUDE.md` rule 5, `docs/routes.md` §Frozen legacy routes, and ADR-0002 | | 7 | Divergent Change, `CLAUDE.md` | **CLOSED** — now a genuine index | | 8 | VPS/sudo disclosure | **CLOSED in tree, PARTIAL in history** — removed in `1cc3c4e`, grep clean, but still reachable at `d875618`, and `git remote -v` confirms a live public push-mirror | | 9 | `design_guide.md` §8 tension | **OPEN** — judgement call, see below | **On #6 (judgement call):** net duplication is unchanged — editing one frozen route now means touching three files (Shotgun Surgery). ADR-0002 is the natural owner; `CLAUDE.md` rule 5 and `docs/routes.md` should link to it rather than restate the list. **On #9 (judgement call):** the dismissal is weaker than it was. This PR *built* the grandfathering mechanism (rule 5 + ADR-0002) and then declined to apply it to the one known standards conflict in the repo. Also, rule 4's stated reason for keeping `design_guide.md` in Spanish is that it is "not an agent process doc" — but its §7 is titled "INSTRUCCIÓN DIRECTA PARA EL AGENTE" and §9 is an agent checklist. The exception may still be right; the justification given for it is not. ### New material **HARD violation of this PR's own `CLAUDE.md` rule 4.** The rule reads: > **English** — everything read *in order to work on the repo*: `CLAUDE.md`, `CONTEXT.md`, `README.md`, `docs/agents/*`, `docs/routes.md`, `docs/adr/*` … **No exceptions.** `CONTEXT.md`, added by this PR, is entirely in Spanish (`# CONTEXT.md — Glosario de dominio`). `README.md`, rewritten by this PR, still carries `### Configuración de Ruta Base (Despliegue tras Proxy Reverso)` at line 103 and its Spanish body. The rule is unobeyed at birth, in the same commit range that introduced it, by two of the six files it names. **ADRs — format is clean.** Both follow Nygard structure (numbered title, Date, Status, Context, Decision, Consequences). ADR-0002's frozen list matches `src/pages/` exactly. ADR-0001's remote claims check out against `git remote -v`. **Unrelated dead code spotted** (pre-existing, not introduced here, no action needed in this PR): `prevencion-escolar.astro:710-717` runs an auto-theme script over `a[data-theme-link="auto"]`, a selector that page never renders. No new secrets. No broken doc paths. --- ## Spec ### Prior findings | # | Finding | Verdict | | --- | --- | --- | | 1 | Route count 41 vs 48 | **CLOSED** — independently recounted: 6+6+8+24+4 singles = 48; `find dist -name index.html \| wc -l` = 48; tables agree | | 2 | README opening line wrong | **CLOSED** — and correct as written, per the correction above | | 3 | `/prevencion-escolar` data source | **CLOSED** | | 4 | `docs/adr/` advertised but absent | **CLOSED** — exists with 0001 and 0002; `domain.md` tree matches | | 5 | `issue-tracker.md` scope creep | **PARTIAL** — the VPS host and sudo note are gone, but the doc still carries a "Server-side administration" section, a "Wayfinding operations" section (`/wayfinder`, `wayfinder:map`), and line 4's "self-hosted on the project owner's VPS (server-side changes are possible when needed)" | | 6 | `triage-labels.md` boilerplate | **CLOSED** | ### Missing or partial - Spec: *"Agent- and contributor-facing docs and all remote-facing artifacts … are in **English**."* Not met — `CONTEXT.md` and README §Configuración de Ruta Base, as above. This is the same finding the Standards axis reached independently. - Spec: *"**ADRs**: ADR-0001 … and ADR-0002 …"* — README's `docs/` structure tree omits `docs/adr/` entirely. The ADRs are advertised in `CLAUDE.md`, `domain.md` and `routes.md`, but invisible in the README map a new contributor reads first. ### Scope creep - Spec: *"**documenting, standardizing, and generalizing** the existing information."* **ADR-0002 does not document existing information** — it creates a new, binding, previously unwritten constraint. That is a legitimate thing for an ADR to do, and the decision itself looks sound; the issue is that the Changes list presents it alongside the realignment work rather than flagging it as a new policy. A reviewer skimming the body would not know a hard constraint was being introduced. - The residual `/wayfinder` and server-administration sections remain outside "Forgejo issue tracker" config. ### Implemented but wrong - **The QR-code premise is unverifiable from the repo.** No QR asset, generator, or print artifact exists anywhere in the tree. ADR-0002 states the premise as fact with no date, no named owner, and no link to the press-team artifact — then it is restated in `CLAUDE.md` rule 5 and `docs/routes.md`, and cited as binding in issue #7. An unsourced claim now carries the weight of a hard constraint across four places, and a future agent can neither confirm it nor safely challenge it. ADR-0002's Context should name the source: who distributed the codes, when, and which print run. --- ## Suggested next steps **Blocking:** 1. Fix the inverted reachability in `docs/routes.md` lines 17-18 (`/[slug]-[mode]` is linked from `/general`; the 24 `/[slug]-[style]-[mode]` are the orphans). 2. Re-scope issue #7 and ADR-0002's carve-out to the real orphan set: `/general` plus the 24 style routes, 25 pages. 3. Translate `CONTEXT.md` to English and the README §Configuración de Ruta Base, or amend rule 4 — but "No exceptions" plus two exceptions in the same commit range cannot both stand. 4. Add a source line to ADR-0002's Context (who, when, which print run). **Non-blocking:** 5. Make ADR-0002 the single owner of the frozen-route list; have rule 5 and `routes.md` link to it. 6. Drop or relocate the "Server-side administration" and "Wayfinding operations" sections in `issue-tracker.md`. 7. Add `docs/adr/` to the README `docs/` tree. 8. Either re-justify the `design_guide.md` Spanish exception on grounds that survive its §7/§9 being agent instructions, or fold it into the English set. 9. Decide whether the `d875618` disclosure in history warrants a squash, given the live public mirror. **Summary** — Standards: 10 findings, 5 closed, 2 partial, 2 open, 1 new hard violation; worst = `docs/routes.md` reachability is inverted, and this PR introduced it. Spec: 10 findings, 5 closed, 1 partial, 4 new; worst = the language rule this PR writes is broken by two of the six files it names. 🤖 Review generated with [Claude Code](https://claude.com/claude-code)
gabogg force-pushed docs/agentic-onboarding from 9da901bb5d to b2cfdcb0bf 2026-09-19 17:53:00 +00:00 Compare
Cite the source of the frozen-route constraint (press team, first QR campaign
deployed September 2026; maintainer directive recorded 2026-09-19), per the
round-2 review — the constraint was previously stated as fact with no source.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Author
Owner

Round 2 addressed — remediation summary

Thanks for the round-2 review, and for catching your own round-1 grep error. I re-verified reachability against grep -rn 'href={resolvePath' src/ before acting: confirmed general.astro:80-83 links all 8 /[slug]-[mode] routes, no href anywhere references a [style] route (the school brochures open as <dialog> modals), and /general is itself unlinked. Fixes are in commits through 2b22cdf.

Blocking

  1. Inverted reachability in docs/routes.md — fixed. /[slug]-[mode] is now "linked from /general (only)"; the 24 /[slug]-[style]-[mode] are marked orphaned (in-page dialogs, no href references them). The Total line now spells out the actual reachability graph.
  2. Re-scoped the orphan set — issue #7 and ADR-0002's carve-out now name the real orphans: /general plus the 24 /[slug]-[style]-[mode] routes (25 pages), not the 8. The 8 /[slug]-[mode] are noted as reachable via /general and not frozen.
  3. Language rule broken at birth — fixed. CONTEXT.md fully translated to English; README's Configuración de Ruta Base section translated. The six files rule 4 names are now all English.
  4. ADR-0002 unsourced — added a Context source line: press team, first QR campaign deployed September 2026; maintainer directive recorded 2026-09-19; the print artifact lives with the press team, outside the repo.

Non-blocking

  1. Frozen-list duplication — ADR-0002 is now the single source of truth; CLAUDE.md rule 5 and docs/routes.md link to it instead of restating the list.
  2. issue-tracker.md scope creep — dropped the "server-side changes possible" clause from the connection note and collapsed the server-administration section into a one-line "out of scope, see local operator note". Kept the brief Wayfinding-operations note, since that is how /wayfinder uses this tracker and it ships with the tracker-config template; happy to cut it if you'd rather.
  3. docs/adr/ missing from README tree — added.
  4. design_guide.md Spanish justification — reworded rule 4: it no longer claims the guide is "not an agent doc". It now acknowledges §7/§9 address the agent as a legacy tension and points at a new follow-up, issue #8, to reconcile both that and the §8-vs-style-variants conflict.
  5. Disclosure in history — scrubbed. The gabogg@ssh.gaboggamer.online + passwordless-sudo line was redacted from every commit in master..HEAD via a history rewrite (final tree byte-identical; master untouched). Branch force-pushed and the public GitHub mirror re-synced; no ref now points at the old commit. Both GitHub PRs (#6, #17) were closed. Caveat: GitHub may retain the unreachable object by direct SHA until it garbage-collects.

Ready for re-review / merge.

## Round 2 addressed — remediation summary Thanks for the round-2 review, and for catching your own round-1 grep error. I re-verified reachability against `grep -rn 'href={resolvePath' src/` before acting: confirmed `general.astro:80-83` links all 8 `/[slug]-[mode]` routes, no `href` anywhere references a `[style]` route (the school brochures open as `<dialog>` modals), and `/general` is itself unlinked. Fixes are in commits through `2b22cdf`. ### Blocking 1. **Inverted reachability in `docs/routes.md`** — fixed. `/[slug]-[mode]` is now "linked from `/general` (only)"; the 24 `/[slug]-[style]-[mode]` are marked orphaned (in-page dialogs, no `href` references them). The Total line now spells out the actual reachability graph. 2. **Re-scoped the orphan set** — issue #7 and ADR-0002's carve-out now name the real orphans: `/general` plus the **24** `/[slug]-[style]-[mode]` routes (25 pages), not the 8. The 8 `/[slug]-[mode]` are noted as reachable via `/general` and not frozen. 3. **Language rule broken at birth** — fixed. `CONTEXT.md` fully translated to English; README's `Configuración de Ruta Base` section translated. The six files rule 4 names are now all English. 4. **ADR-0002 unsourced** — added a Context source line: press team, first QR campaign deployed September 2026; maintainer directive recorded 2026-09-19; the print artifact lives with the press team, outside the repo. ### Non-blocking 5. **Frozen-list duplication** — ADR-0002 is now the single source of truth; `CLAUDE.md` rule 5 and `docs/routes.md` link to it instead of restating the list. 6. **`issue-tracker.md` scope creep** — dropped the "server-side changes possible" clause from the connection note and collapsed the server-administration section into a one-line "out of scope, see local operator note". Kept the brief Wayfinding-operations note, since that is how `/wayfinder` uses this tracker and it ships with the tracker-config template; happy to cut it if you'd rather. 7. **`docs/adr/` missing from README tree** — added. 8. **`design_guide.md` Spanish justification** — reworded rule 4: it no longer claims the guide is "not an agent doc". It now acknowledges §7/§9 address the agent as a legacy tension and points at a new follow-up, **issue #8**, to reconcile both that and the §8-vs-style-variants conflict. 9. **Disclosure in history** — scrubbed. The `gabogg@ssh.gaboggamer.online` + passwordless-sudo line was redacted from every commit in `master..HEAD` via a history rewrite (final tree byte-identical; `master` untouched). Branch force-pushed and the public GitHub mirror re-synced; no ref now points at the old commit. Both GitHub PRs (#6, #17) were closed. Caveat: GitHub may retain the unreachable object by direct SHA until it garbage-collects. Ready for re-review / merge.
The route inventory and ADR-0002 claimed the 24 /[slug]-[style]-[mode]
routes were "linked from no page", justified by a grep for the literal
style ids returning nothing. That grep misses template literals, and two
href builders do produce style routes: the mode switch
(BrochurePage.astro:36-37) and the style switch (StyleSwitch.astro:24).
The built output confirms it — dist/brigadas-escolares-default-dark links
to /brigadas-escolares-default-light.

The conclusion is unchanged: nothing outside the set links into it, and
the style switch only renders when VERCEL_ENV === 'preview'. Only the
stated reason was wrong. Both documents now describe the real entry
graph, name the preview gate, and warn against the literal grep.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Author
Owner

Code review round 3 — two axes, plus corrections applied

Re-review of master...docs/agentic-onboarding at 2b22cdf, after the round-2 remediations. Every prior finding was re-verified against src/, dist/ and git, not taken from the remediation comment.

Result: 15 of 22 prior findings genuinely closed. Two blocking items remained; both were text-only and have been fixed in this round — commit 9dec5c6 and an edit to issue #7. Details below, then what is left as follow-up.


Fixed in this round

1. docs/routes.md and ADR-0002 asserted a fact the build disproves

Both said the 24 /[slug]-[style]-[mode] routes are "linked from no page", and routes.md:18 justified it with:

no href in the repo references a [style] route (grep for rounded-glass/timeline-step is empty)

That grep is not empty, and two href builders do produce style routes — both as template literals, which is the exact literal-vs-template-literal error round 2 corrected in round 1:

// src/components/BrochurePage.astro:36-37
const darkHref  = isSchool ? `/${brochure.slug}-${styleVariant}-dark`  : `/${brochure.slug}-dark`;
const lightHref = isSchool ? `/${brochure.slug}-${styleVariant}-light` : `/${brochure.slug}-light`;

// src/components/StyleSwitch.astro:24
const href = `${base}${slug}-${style.id}-${mode}`;

Proof in the shipped build: dist/brigadas-escolares-default-dark/index.html contains href="/brigadas-escolares-default-light", and grep -rlE 'href="[^"]*-(default|rounded-glass|timeline-step)-(dark|light)"' dist/ returns 24 files.

The conclusion survives — nothing outside the set links into it — but for a reason the docs never stated: BrochurePage.astro:33 gates StyleSwitch on process.env.VERCEL_ENV === 'preview', so the style matrix is preview-only, and the mode links are internal to the set. That is the material fact the inventory was missing.

9dec5c6 rewrites the rationale in docs/routes.md (route row, Total line, frozen-routes note) and docs/adr/0002-frozen-legacy-routes.md, names the preview gate, and warns the next reader not to grep for the literal style ids.

2. Issue #7's title still carried the pre-correction scoping

Body said the 8 /[slug]-[mode] routes are reachable and the 24 are the orphans; the title still said the opposite. Titles are what triage reads. Retitled to "Orphaned routes: /general and the 24 /[slug]-[style]-[mode] pages have no entry point", and the body now carries the preview-gate detail and the decision it implies (promote the style switch to production, or drop the matrix).


Standards

Prior findings

# Finding Verdict
1 README line 1 false CLOSED — README.md:3 ↔ index.astro:11-28
2 Inverted orphan reporting CLOSED this round — direction was fixed in round 2, rationale in 9dec5c6
3 /prevencion-escolar data source CLOSED — routes.md:13 ↔ prevencion-escolar.astro:85-87
4 Middle Man, triage-labels.md CLOSED — self-mapping column and boilerplate gone
5 Speculative Generality, domain.md CLOSED — domain.md:5,16-22 single-context; tree matches docs/adr/
6 Frozen-list duplication CLOSED — list only in adr/0002:25-27; CLAUDE.md:23 and routes.md:26 link to it
7 Divergent Change, CLAUDE.md CLOSED — CLAUDE.md:25-31 is a genuine index
8 VPS/sudo disclosure CLOSED remotely, local cleanup left — see below
9 design_guide.md tension PARTIAL — CLAUDE.md:21 re-justifies but cites an unnumbered "design-guide follow-up issue" (it is #8)
R2-new Rule 4 broken at birth CLOSED — no Spanish prose left in the six files rule 4 names
R2-6 issue-tracker.md scope creep PARTIAL — :58-64 still carries Wayfinding + a server-admin pointer
R2-7 docs/adr/ in README tree CLOSED — README.md:81

All relative links in the new docs resolve. ADR format is clean (Nygard). Route count re-verified independently: 1+1+1+6+1+6+8+24 = 48, and dist/ has 48 index.html.

On finding 8 — the history scrub, stated precisely

The remediation said "no ref now points at the old commit". Remotely that is true; locally it is not.

  • git grep 'ssh.gaboggamer.online' $(git rev-list master..HEAD) — clean.
  • git ls-remote origin and git ls-remote github — both put docs/agentic-onboarding at the rewritten history, and no refs/pull/* on the GitHub mirror reaches any of the five pre-rewrite commits (d875618, f0a750c, d3425cd, e560569, c53cdea). The public surface is clean; the author's GC caveat about unreachable objects by direct SHA stands.
  • Locally, two refs still reach those five commits: refs/original/refs/heads/docs/agentic-onboarding (the filter-branch backup, never deleted) and the stale tracking ref refs/remotes/github/docs/agentic-onboarding.

Local hygiene, not a disclosure. To finish it:

git update-ref -d refs/original/refs/heads/docs/agentic-onboarding
git remote prune github

Remaining, non-blocking

  • Duplicated Code (judgement). The orphan/carve-out set is stated at routes.md:20, routes.md:27-28 and adr/0002:37-40. The frozen list was de-duplicated; its inverse was duplicated in the same edit, which is why 9dec5c6 had to touch three places to correct one fact. ADR-0002 is the natural owner of the carve-out too.
  • Residual template boilerplate, docs/agents/issue-tracker.md:46-48: "PRs as a request surface: no. (Set to yes if this repo treats external PRs as feature requests…)" — the same unedited-template smell that was cleaned out of triage-labels.md, missed here.
  • Dangling pointers. routes.md:20 and CLAUDE.md:21 both defer to a "follow-up issue" with no number (#7 and #8 respectively); adr/0002 cites none. Not resolvable from the repo alone.

Spec

Prior findings

# Finding Verdict
R1-1 Route count 41 → 48 CLOSED — PR body, routes.md:20, getStaticPaths and dist/ all agree
R1-2 README opening line wrong CLOSED — README.md:3 ↔ index.astro:10-27
R1-3 /prevencion-escolar data source CLOSED
R1-4 docs/adr/ advertised but absent CLOSED — both ADRs exist; domain.md:16-22 and README.md:81 match
R1-5 issue-tracker.md scope creep PARTIAL — disclosed by the author, low severity
R1-6 triage-labels.md boilerplate CLOSED
R2-a Language rule broken at birth CLOSED — CONTEXT.md and README.md:104-120 now English
R2-b ADR-0002 unsourced QR premise CLOSED — adr/0002:17-18 names source, date and holder
R2-c Inverted reachability CLOSED this round — 9dec5c6
R2-d Re-scope issue #7 / ADR-0002 CLOSED this round — title and body
R2-e ADR-0002 is new policy, not documentation OPEN — see below

Verified clean: "documentation and configuration only" holds — 9 files, all *.md, nothing under src/. ADR-0001's remote claims match git remote -v exactly. ADR-0002's frozen list matches src/pages/ one for one.

Remaining, non-blocking

  • ADR-0002 is new binding policy presented as documentation. The PR body says the change is "documenting, standardizing, and generalizing the existing information", but CLAUDE.md rule 5 + ADR-0002 create an immutability constraint that was never written down before. Legitimate work for an ADR — the issue is that the Changes list presents it alongside the realignment, so a reviewer skimming the body would not notice a hard constraint being introduced. Worth one line in the PR body flagging item 4 as new policy.
  • The PR body's follow-up list omits #8 (design-guide reconciliation), which was created during this review and is the issue CLAUDE.md:21 refers to anonymously.

Summary — Standards: 12 prior findings, 9 closed, 2 partial, 1 closed this round; 3 non-blocking judgement calls remain. Spec: 11 prior findings, 9 closed, 1 partial, 1 open; 2 non-blocking items remain.

Both blocking items are fixed and pushed. Nothing outstanding blocks the merge: what is left is three judgement calls (duplication, template residue, unnumbered issue references), two PR-body edits, and one local git cleanup — none of which changes a factual claim in the docs.

🤖 Review generated with Claude Code

## Code review round 3 — two axes, plus corrections applied Re-review of `master...docs/agentic-onboarding` at `2b22cdf`, after the round-2 remediations. Every prior finding was re-verified against `src/`, `dist/` and `git`, not taken from the remediation comment. **Result: 15 of 22 prior findings genuinely closed.** Two blocking items remained; both were text-only and **have been fixed in this round** — commit `9dec5c6` and an edit to issue #7. Details below, then what is left as follow-up. --- ## Fixed in this round ### 1. `docs/routes.md` and ADR-0002 asserted a fact the build disproves Both said the 24 `/[slug]-[style]-[mode]` routes are "linked from no page", and `routes.md:18` justified it with: > no `href` in the repo references a `[style]` route (`grep` for `rounded-glass`/`timeline-step` is empty) That grep is not empty, and two `href` builders do produce style routes — both as **template literals**, which is the exact literal-vs-template-literal error round 2 corrected in round 1: ```astro // src/components/BrochurePage.astro:36-37 const darkHref = isSchool ? `/${brochure.slug}-${styleVariant}-dark` : `/${brochure.slug}-dark`; const lightHref = isSchool ? `/${brochure.slug}-${styleVariant}-light` : `/${brochure.slug}-light`; // src/components/StyleSwitch.astro:24 const href = `${base}${slug}-${style.id}-${mode}`; ``` Proof in the shipped build: `dist/brigadas-escolares-default-dark/index.html` contains `href="/brigadas-escolares-default-light"`, and `grep -rlE 'href="[^"]*-(default|rounded-glass|timeline-step)-(dark|light)"' dist/` returns **24 files**. The **conclusion survives** — nothing outside the set links into it — but for a reason the docs never stated: `BrochurePage.astro:33` gates `StyleSwitch` on `process.env.VERCEL_ENV === 'preview'`, so the style matrix is **preview-only**, and the mode links are internal to the set. That is the material fact the inventory was missing. `9dec5c6` rewrites the rationale in `docs/routes.md` (route row, Total line, frozen-routes note) and `docs/adr/0002-frozen-legacy-routes.md`, names the preview gate, and warns the next reader not to grep for the literal style ids. ### 2. Issue #7's title still carried the pre-correction scoping Body said the 8 `/[slug]-[mode]` routes are reachable and the 24 are the orphans; the title still said the opposite. Titles are what triage reads. Retitled to *"Orphaned routes: /general and the 24 /[slug]-[style]-[mode] pages have no entry point"*, and the body now carries the preview-gate detail and the decision it implies (promote the style switch to production, or drop the matrix). --- ## Standards ### Prior findings | # | Finding | Verdict | | --- | --- | --- | | 1 | README line 1 false | **CLOSED** — `README.md:3` ↔ `index.astro:11-28` | | 2 | Inverted orphan reporting | **CLOSED this round** — direction was fixed in round 2, rationale in `9dec5c6` | | 3 | `/prevencion-escolar` data source | **CLOSED** — `routes.md:13` ↔ `prevencion-escolar.astro:85-87` | | 4 | Middle Man, `triage-labels.md` | **CLOSED** — self-mapping column and boilerplate gone | | 5 | Speculative Generality, `domain.md` | **CLOSED** — `domain.md:5,16-22` single-context; tree matches `docs/adr/` | | 6 | Frozen-list duplication | **CLOSED** — list only in `adr/0002:25-27`; `CLAUDE.md:23` and `routes.md:26` link to it | | 7 | Divergent Change, `CLAUDE.md` | **CLOSED** — `CLAUDE.md:25-31` is a genuine index | | 8 | VPS/sudo disclosure | **CLOSED remotely, local cleanup left** — see below | | 9 | `design_guide.md` tension | **PARTIAL** — `CLAUDE.md:21` re-justifies but cites an unnumbered "design-guide follow-up issue" (it is #8) | | R2-new | Rule 4 broken at birth | **CLOSED** — no Spanish prose left in the six files rule 4 names | | R2-6 | `issue-tracker.md` scope creep | **PARTIAL** — `:58-64` still carries Wayfinding + a server-admin pointer | | R2-7 | `docs/adr/` in README tree | **CLOSED** — `README.md:81` | All relative links in the new docs resolve. ADR format is clean (Nygard). Route count re-verified independently: 1+1+1+6+1+6+8+24 = 48, and `dist/` has 48 `index.html`. ### On finding 8 — the history scrub, stated precisely The remediation said "no ref now points at the old commit". **Remotely that is true; locally it is not.** - `git grep 'ssh.gaboggamer.online' $(git rev-list master..HEAD)` — clean. - `git ls-remote origin` and `git ls-remote github` — both put `docs/agentic-onboarding` at the rewritten history, and **no** `refs/pull/*` on the GitHub mirror reaches any of the five pre-rewrite commits (`d875618`, `f0a750c`, `d3425cd`, `e560569`, `c53cdea`). The public surface is clean; the author's GC caveat about unreachable objects by direct SHA stands. - Locally, two refs still reach those five commits: `refs/original/refs/heads/docs/agentic-onboarding` (the `filter-branch` backup, never deleted) and the stale tracking ref `refs/remotes/github/docs/agentic-onboarding`. Local hygiene, not a disclosure. To finish it: ```bash git update-ref -d refs/original/refs/heads/docs/agentic-onboarding git remote prune github ``` ### Remaining, non-blocking - **Duplicated Code (judgement).** The orphan/carve-out set is stated at `routes.md:20`, `routes.md:27-28` and `adr/0002:37-40`. The frozen list was de-duplicated; its inverse was duplicated in the same edit, which is why `9dec5c6` had to touch three places to correct one fact. ADR-0002 is the natural owner of the carve-out too. - **Residual template boilerplate, `docs/agents/issue-tracker.md:46-48`:** *"PRs as a request surface: no. (Set to `yes` if this repo treats external PRs as feature requests…)"* — the same unedited-template smell that was cleaned out of `triage-labels.md`, missed here. - **Dangling pointers.** `routes.md:20` and `CLAUDE.md:21` both defer to a "follow-up issue" with no number (#7 and #8 respectively); `adr/0002` cites none. Not resolvable from the repo alone. --- ## Spec ### Prior findings | # | Finding | Verdict | | --- | --- | --- | | R1-1 | Route count 41 → 48 | **CLOSED** — PR body, `routes.md:20`, `getStaticPaths` and `dist/` all agree | | R1-2 | README opening line wrong | **CLOSED** — `README.md:3` ↔ `index.astro:10-27` | | R1-3 | `/prevencion-escolar` data source | **CLOSED** | | R1-4 | `docs/adr/` advertised but absent | **CLOSED** — both ADRs exist; `domain.md:16-22` and `README.md:81` match | | R1-5 | `issue-tracker.md` scope creep | **PARTIAL** — disclosed by the author, low severity | | R1-6 | `triage-labels.md` boilerplate | **CLOSED** | | R2-a | Language rule broken at birth | **CLOSED** — `CONTEXT.md` and `README.md:104-120` now English | | R2-b | ADR-0002 unsourced QR premise | **CLOSED** — `adr/0002:17-18` names source, date and holder | | R2-c | Inverted reachability | **CLOSED this round** — `9dec5c6` | | R2-d | Re-scope issue #7 / ADR-0002 | **CLOSED this round** — title and body | | R2-e | ADR-0002 is new policy, not documentation | **OPEN** — see below | **Verified clean:** *"documentation and configuration only"* holds — 9 files, all `*.md`, nothing under `src/`. ADR-0001's remote claims match `git remote -v` exactly. ADR-0002's frozen list matches `src/pages/` one for one. ### Remaining, non-blocking - **ADR-0002 is new binding policy presented as documentation.** The PR body says the change is *"**documenting, standardizing, and generalizing** the existing information"*, but `CLAUDE.md` rule 5 + ADR-0002 create an immutability constraint that was never written down before. Legitimate work for an ADR — the issue is that the Changes list presents it alongside the realignment, so a reviewer skimming the body would not notice a hard constraint being introduced. Worth one line in the PR body flagging item 4 as new policy. - **The PR body's follow-up list omits #8** (design-guide reconciliation), which was created during this review and is the issue `CLAUDE.md:21` refers to anonymously. --- **Summary** — Standards: 12 prior findings, 9 closed, 2 partial, 1 closed this round; 3 non-blocking judgement calls remain. Spec: 11 prior findings, 9 closed, 1 partial, 1 open; 2 non-blocking items remain. Both blocking items are fixed and pushed. Nothing outstanding blocks the merge: what is left is three judgement calls (duplication, template residue, unnumbered issue references), two PR-body edits, and one local `git` cleanup — none of which changes a factual claim in the docs. 🤖 Review generated with [Claude Code](https://claude.com/claude-code)
- Number the two dangling follow-up-issue pointers: CLAUDE.md rule 4 now
  cites issue #8 (design-guide reconciliation) and docs/routes.md cites
  issue #7 (orphaned routes) instead of "the follow-up issue".
- Correct the reachability wording for the 8 /[slug]-[mode] routes. The
  inventory said "linked from /general (only)", which applied a looser
  criterion than the one used to call the 24 style routes orphaned:
  general.astro:80 emits a static href only to /${slug}-light, and the
  four -dark routes are reached through data-dark-href (general.astro:83)
  swapped by the inline theme script, plus the in-set mode switch.
- Replace the unedited template parenthetical in the "PRs as a triage
  surface" section of docs/agents/issue-tracker.md with the decision it
  encodes, keeping the Forgejo issue/PR index-space resolution rule.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Author
Owner

Code review round 4 — two axes, with the remaining items applied

Re-review of master...docs/agentic-onboarding at 9dec5c6, after the round-3 remediations. Every prior finding from all three rounds was re-verified against src/, dist/, git and the Forgejo API — none of it taken from the remediation comments. Prior rounds twice drew a wrong conclusion by grepping literal slugs where the code builds hrefs from template literals, so every reachability claim below was re-derived from grep -rn 'href=' src/ and cross-checked against the shipped build.

Result: all prior blocking findings are genuinely closed. What remained was one factual overstatement, three cosmetic/hygiene items and two PR-body edits — all applied in this round, commit dc5cc1e plus an edit to the PR body. Nothing blocks the merge.


Independently re-verified

  • 48 routes. getStaticPaths gives 4 general slugs × 2 modes = 8 and 4 school slugs × 3 styles × 2 modes = 24; plus /, /general, the two menus, and their 6+6 [topic] children = 48. find dist -name index.html | wc -l = 48. PR body, docs/routes.md and the build all agree.
  • Documentation only. git diff master...HEAD --name-only = 9 files, every one *.md, nothing under src/.
  • Reachability. The complete set of link targets in the repo is /, /${brochure.slug}-{light,dark}, /prevencion-escolar/${topic.id}, /prevencion-y-gestion-de-riesgo/${topic.id}, plus BrochurePage.astro:36-37 and StyleSwitch.astro:24. /general is linked by nothing. The style switch is gated on process.env.VERCEL_ENV === 'preview' (BrochurePage.astro:33) and so is absent from dist/; the only inbound hrefs to the 24 style routes come from inside the set. docs/routes.md:17-20 and adr/0002:37-41 state this correctly.
  • Language policy. The six files rule 4 names carry no Spanish prose. The remaining Spanish (CONTEXT.md:28,44-45, README.md:7, CLAUDE.md:22) is proper-noun identifiers, which bullet 3 of the rule permits.
  • ADR-0002 provenance. adr/0002:11-18 names the press team, the first campaign (September 2026), the maintainer directive (2026-09-19) and the off-repo location of the print artifact.
  • Issue #7. Title and body both name the real orphan set — /general plus the 24 /[slug]-[style]-[mode] pages — and carry the preview-gate detail.
  • Disclosure. git log --all -S'ssh.gaboggamer.online' now returns nothing; git ls-remote puts docs/agentic-onboarding at the rewritten history on both origin and the GitHub mirror.

Also checked and true today: ADR format (Nygard) on both records, every relative link resolves, Astro 6, node >=22.12.0, the component and page lists, pdf_content.txt, the four <dialog> modals, and ADR-0002's frozen list against src/pages/ one for one.


Standards

Prior findings

# Finding Verdict
1 README line 1 false CLOSED — README.md:3 ↔ index.astro:11-28
2 Inverted orphan reporting CLOSED — direction and rationale both correct
3 /prevencion-escolar data source CLOSED — routes.md:13 ↔ prevencion-escolar.astro:85-87
4 Middle Man, triage-labels.md CLOSED
5 Speculative Generality, domain.md CLOSED — single-context; tree matches docs/adr/
6 Frozen-list duplication CLOSED for the list (adr/0002:25-27 only)
7 Divergent Change, CLAUDE.md CLOSED — CLAUDE.md:25-31 is a genuine index
8 VPS/sudo disclosure CLOSED — local cleanup applied this round
9 design_guide.md tension PARTIAL → pointer fixed this round; the reconciliation itself stays in #8
R2-6 issue-tracker.md scope creep OPEN by decision — see below
R3 Template boilerplate in issue-tracker.md CLOSED this round

Applied this round

1. docs/routes.md:17 overstated the reachability of the 8 /[slug]-[mode] routes. The row read "linked from /general (only)", which quietly applied a looser criterion than the one the very next row uses to call the 24 style routes orphaned. general.astro:80 emits a static href only to /${slug}-light; the four -dark routes are reached from the same cards through data-dark-href (general.astro:83), swapped by the inline theme script, and through the in-set mode switch — the same in-set mechanism that makes the style matrix orphaned. One inventory should not grade two route families on two criteria. The row and the Total line now spell out both paths.

2. Two dangling follow-up pointers, now numbered. CLAUDE.md:21 deferred to "the design-guide follow-up issue" and routes.md:20 to "the follow-up issue", neither resolvable from the repo alone. They now cite #8 and #7.

3. Residual template boilerplate, docs/agents/issue-tracker.md:46-48 — the same unedited-template smell that was cleaned out of triage-labels.md, missed there:

PRs as a request surface: no. (Set to yes if this repo treats external PRs as feature requests; /triage reads this flag. …)

Replaced with the decision it encodes, keeping the Forgejo-specific rule that skills actually need (issues and PRs share one index space, so #N resolves through "$API/pulls/<index>" first).

4. Local git hygiene, finding 8. Round 3 reported that the scrub was complete remotely but not locally, and it still was not: refs/original/refs/heads/docs/agentic-onboarding (the filter-branch backup) still pointed at 59ad8829, and the stale tracking ref refs/remotes/github/docs/agentic-onboarding still pointed at d3425cd, whose tree contains the redacted line at issue-tracker.md:66. Both refs are gone — backup ref deleted, mirror re-fetched with --prune. git log --all -S'ssh.gaboggamer.online' is now empty. No remote surface was ever affected by this; it was local only, and the earlier caveat about GitHub retaining an unreachable object by direct SHA until it garbage-collects still stands.

Left open, deliberately

  • issue-tracker.md:58-64 — "Wayfinding operations" and the server-administration pointer. Flagged since round 1, disclosed and defended by the author in round 2 ("that is how /wayfinder uses this tracker and it ships with the tracker-config template"). That is a reasonable call: the section is one paragraph, it documents tracker API surface rather than infrastructure, and the actual scope-creep content (the VPS host, the passwordless-sudo note) is gone. Recorded as accepted, not outstanding.
  • Duplicated Code (judgement call). The frozen-route list was de-duplicated onto ADR-0002, but its rationale sentence still appears at CLAUDE.md:23, routes.md:24-25 and adr/0002:22-23, and the orphan carve-out at routes.md:20, routes.md:27-29 and adr/0002:37-41. That is why correcting one fact took three edits in 9dec5c6. ADR-0002 is the natural owner of the carve-out too. Not worth another churn round on a docs PR that is otherwise ready; worth folding into the docs-drift check in #2.
  • design_guide.md §8 vs the style variants, and its §7/§9 addressing the agent. Pre-existing, product-facing, now tracked in #8 and cited by number from CLAUDE.md:21.

Spec

Prior findings

# Finding Verdict
R1-1 Route count 41 → 48 CLOSED
R1-2 README opening line wrong CLOSED
R1-3 /prevencion-escolar data source CLOSED
R1-4 docs/adr/ advertised but absent CLOSED — both ADRs exist; domain.md tree and README.md:81 match
R1-5 issue-tracker.md scope creep ACCEPTED — see above
R1-6 triage-labels.md boilerplate CLOSED
R2-a Language rule broken at birth CLOSED
R2-b ADR-0002 unsourced QR premise CLOSED
R2-c Inverted reachability CLOSED
R2-d Re-scope issue #7 / ADR-0002 CLOSED — title and body
R2-e ADR-0002 is new policy, not documentation CLOSED this round
R3 PR body omits #8 CLOSED this round

Applied this round — both in the PR body

5. ADR-0002 was presented as documentation. The body opens with "documenting, standardizing, and generalizing the existing information", and Changes item 4 listed ADR-0002 beside the realignment work. But CLAUDE.md rule 5 + ADR-0002 create an immutability constraint that existed nowhere before — legitimate work for an ADR, and the decision itself is sound, but a reviewer skimming the body would not have seen a hard constraint being introduced. The opening sentence now says "plus one new policy", and item 4 carries an explicit call-out naming what the constraint binds.

6. Follow-up list omitted #8. The body listed #1–#5 and #7; #8 (design-guide reconciliation) was created during this review and is the issue CLAUDE.md:21 now cites. Added.

No scope creep beyond the accepted R1-5. Nothing implemented-but-wrong this round.


Summary — Standards: 11 prior findings, 9 closed, 1 accepted by decision, 1 deferred to #2 as a judgement call; 4 items applied in dc5cc1e, worst = the /[slug]-[mode] reachability row graded two route families on two criteria. Spec: 12 prior findings, all closed; 2 items applied to the PR body, worst = a new binding constraint presented as documentation of an existing one.

No finding outstanding on either axis. Ready to merge.

🤖 Review generated with Claude Code

## Code review round 4 — two axes, with the remaining items applied Re-review of `master...docs/agentic-onboarding` at `9dec5c6`, after the round-3 remediations. Every prior finding from all three rounds was re-verified against `src/`, `dist/`, `git` and the Forgejo API — none of it taken from the remediation comments. Prior rounds twice drew a wrong conclusion by grepping literal slugs where the code builds `href`s from template literals, so every reachability claim below was re-derived from `grep -rn 'href=' src/` and cross-checked against the shipped build. **Result: all prior blocking findings are genuinely closed.** What remained was one factual overstatement, three cosmetic/hygiene items and two PR-body edits — **all applied in this round**, commit `dc5cc1e` plus an edit to the PR body. Nothing blocks the merge. --- ## Independently re-verified - **48 routes.** `getStaticPaths` gives 4 general slugs × 2 modes = 8 and 4 school slugs × 3 styles × 2 modes = 24; plus `/`, `/general`, the two menus, and their 6+6 `[topic]` children = 48. `find dist -name index.html | wc -l` = 48. PR body, `docs/routes.md` and the build all agree. - **Documentation only.** `git diff master...HEAD --name-only` = 9 files, every one `*.md`, nothing under `src/`. - **Reachability.** The complete set of link targets in the repo is `/`, `/${brochure.slug}-{light,dark}`, `/prevencion-escolar/${topic.id}`, `/prevencion-y-gestion-de-riesgo/${topic.id}`, plus `BrochurePage.astro:36-37` and `StyleSwitch.astro:24`. `/general` is linked by nothing. The style switch is gated on `process.env.VERCEL_ENV === 'preview'` (`BrochurePage.astro:33`) and so is absent from `dist/`; the only inbound `href`s to the 24 style routes come from inside the set. `docs/routes.md:17-20` and `adr/0002:37-41` state this correctly. - **Language policy.** The six files rule 4 names carry no Spanish prose. The remaining Spanish (`CONTEXT.md:28,44-45`, `README.md:7`, `CLAUDE.md:22`) is proper-noun identifiers, which bullet 3 of the rule permits. - **ADR-0002 provenance.** `adr/0002:11-18` names the press team, the first campaign (September 2026), the maintainer directive (2026-09-19) and the off-repo location of the print artifact. - **Issue #7.** Title *and* body both name the real orphan set — `/general` plus the 24 `/[slug]-[style]-[mode]` pages — and carry the preview-gate detail. - **Disclosure.** `git log --all -S'ssh.gaboggamer.online'` now returns nothing; `git ls-remote` puts `docs/agentic-onboarding` at the rewritten history on both `origin` and the GitHub mirror. Also checked and true today: ADR format (Nygard) on both records, every relative link resolves, Astro 6, `node >=22.12.0`, the component and page lists, `pdf_content.txt`, the four `<dialog>` modals, and ADR-0002's frozen list against `src/pages/` one for one. --- ## Standards ### Prior findings | # | Finding | Verdict | | --- | --- | --- | | 1 | README line 1 false | **CLOSED** — `README.md:3` ↔ `index.astro:11-28` | | 2 | Inverted orphan reporting | **CLOSED** — direction and rationale both correct | | 3 | `/prevencion-escolar` data source | **CLOSED** — `routes.md:13` ↔ `prevencion-escolar.astro:85-87` | | 4 | Middle Man, `triage-labels.md` | **CLOSED** | | 5 | Speculative Generality, `domain.md` | **CLOSED** — single-context; tree matches `docs/adr/` | | 6 | Frozen-list duplication | **CLOSED** for the list (`adr/0002:25-27` only) | | 7 | Divergent Change, `CLAUDE.md` | **CLOSED** — `CLAUDE.md:25-31` is a genuine index | | 8 | VPS/sudo disclosure | **CLOSED — local cleanup applied this round** | | 9 | `design_guide.md` tension | **PARTIAL → pointer fixed this round**; the reconciliation itself stays in #8 | | R2-6 | `issue-tracker.md` scope creep | **OPEN by decision** — see below | | R3 | Template boilerplate in `issue-tracker.md` | **CLOSED this round** | ### Applied this round **1. `docs/routes.md:17` overstated the reachability of the 8 `/[slug]-[mode]` routes.** The row read "linked from `/general` (only)", which quietly applied a looser criterion than the one the very next row uses to call the 24 style routes orphaned. `general.astro:80` emits a static `href` only to `/${slug}-light`; the four `-dark` routes are reached from the same cards through `data-dark-href` (`general.astro:83`), swapped by the inline theme script, and through the in-set mode switch — the same in-set mechanism that makes the style matrix orphaned. One inventory should not grade two route families on two criteria. The row and the Total line now spell out both paths. **2. Two dangling follow-up pointers, now numbered.** `CLAUDE.md:21` deferred to "the design-guide follow-up issue" and `routes.md:20` to "the follow-up issue", neither resolvable from the repo alone. They now cite **#8** and **#7**. **3. Residual template boilerplate, `docs/agents/issue-tracker.md:46-48`** — the same unedited-template smell that was cleaned out of `triage-labels.md`, missed there: > **PRs as a request surface: no.** _(Set to `yes` if this repo treats external PRs as feature requests; `/triage` reads this flag. …)_ Replaced with the decision it encodes, keeping the Forgejo-specific rule that skills actually need (issues and PRs share one index space, so `#N` resolves through `"$API/pulls/<index>"` first). **4. Local `git` hygiene, finding 8.** Round 3 reported that the scrub was complete remotely but not locally, and it still was not: `refs/original/refs/heads/docs/agentic-onboarding` (the `filter-branch` backup) still pointed at `59ad8829`, and the stale tracking ref `refs/remotes/github/docs/agentic-onboarding` still pointed at `d3425cd`, whose tree contains the redacted line at `issue-tracker.md:66`. Both refs are gone — backup ref deleted, mirror re-fetched with `--prune`. `git log --all -S'ssh.gaboggamer.online'` is now empty. No remote surface was ever affected by this; it was local only, and the earlier caveat about GitHub retaining an unreachable object by direct SHA until it garbage-collects still stands. ### Left open, deliberately - **`issue-tracker.md:58-64` — "Wayfinding operations" and the server-administration pointer.** Flagged since round 1, disclosed and defended by the author in round 2 ("that is how `/wayfinder` uses this tracker and it ships with the tracker-config template"). That is a reasonable call: the section is one paragraph, it documents tracker API surface rather than infrastructure, and the actual scope-creep content (the VPS host, the passwordless-sudo note) is gone. Recorded as accepted, not outstanding. - **Duplicated Code (judgement call).** The frozen-route *list* was de-duplicated onto ADR-0002, but its rationale sentence still appears at `CLAUDE.md:23`, `routes.md:24-25` and `adr/0002:22-23`, and the orphan carve-out at `routes.md:20`, `routes.md:27-29` and `adr/0002:37-41`. That is why correcting one fact took three edits in `9dec5c6`. ADR-0002 is the natural owner of the carve-out too. Not worth another churn round on a docs PR that is otherwise ready; worth folding into the docs-drift check in #2. - **`design_guide.md` §8 vs the style variants, and its §7/§9 addressing the agent.** Pre-existing, product-facing, now tracked in #8 and cited by number from `CLAUDE.md:21`. --- ## Spec ### Prior findings | # | Finding | Verdict | | --- | --- | --- | | R1-1 | Route count 41 → 48 | **CLOSED** | | R1-2 | README opening line wrong | **CLOSED** | | R1-3 | `/prevencion-escolar` data source | **CLOSED** | | R1-4 | `docs/adr/` advertised but absent | **CLOSED** — both ADRs exist; `domain.md` tree and `README.md:81` match | | R1-5 | `issue-tracker.md` scope creep | **ACCEPTED** — see above | | R1-6 | `triage-labels.md` boilerplate | **CLOSED** | | R2-a | Language rule broken at birth | **CLOSED** | | R2-b | ADR-0002 unsourced QR premise | **CLOSED** | | R2-c | Inverted reachability | **CLOSED** | | R2-d | Re-scope issue #7 / ADR-0002 | **CLOSED** — title and body | | R2-e | ADR-0002 is new policy, not documentation | **CLOSED this round** | | R3 | PR body omits #8 | **CLOSED this round** | ### Applied this round — both in the PR body **5. ADR-0002 was presented as documentation.** The body opens with *"**documenting, standardizing, and generalizing** the existing information"*, and Changes item 4 listed ADR-0002 beside the realignment work. But `CLAUDE.md` rule 5 + ADR-0002 create an immutability constraint that existed nowhere before — legitimate work for an ADR, and the decision itself is sound, but a reviewer skimming the body would not have seen a hard constraint being introduced. The opening sentence now says "plus one new policy", and item 4 carries an explicit call-out naming what the constraint binds. **6. Follow-up list omitted #8.** The body listed #1–#5 and #7; **#8** (design-guide reconciliation) was created during this review and is the issue `CLAUDE.md:21` now cites. Added. No scope creep beyond the accepted R1-5. Nothing implemented-but-wrong this round. --- **Summary** — Standards: 11 prior findings, 9 closed, 1 accepted by decision, 1 deferred to #2 as a judgement call; 4 items applied in `dc5cc1e`, worst = the `/[slug]-[mode]` reachability row graded two route families on two criteria. Spec: 12 prior findings, all closed; 2 items applied to the PR body, worst = a new binding constraint presented as documentation of an existing one. No finding outstanding on either axis. **Ready to merge.** 🤖 Review generated with [Claude Code](https://claude.com/claude-code)
Author
Owner

Code review round 5 — two axes, verification pass

Re-review of master...docs/agentic-onboarding at dc5cc1e (merge-base 8382752, 9 files, all *.md). This round's brief was verification, not fresh discovery: every finding from rounds 1–4 was re-derived from src/, dist/, git and the Forgejo API, with the remediation comments treated as claims to test rather than as evidence.

Both axes independently confirm dist/ is in sync (find src -newer dist -type f empty, 48 index.html), so reachability was checked against the shipped build rather than against greps alone.

Result: no blocking finding survives on either axis. Three prior findings were marked closed more confidently than the tree supports, and one agent-facing file states something that is false today. Details below.


Standards

Correction to this round, applied before anything below

This review first reported that docs/agents/domain.md:12 was false because /grill-with-docs and /improve-codebase-architecture "do not exist". That was wrong, and it is the same class of error as the round-1 and round-3 greps: the right lookup was never run. The check went to ~/.claude/plugins/installed_plugins.json — user-level plugins — and never looked at the project's own .claude/skills/, which symlinks into .agents/skills/ and carries all of them.

Both skills exist, and domain.md:12's navigation claim is accurate on its own terms:

  • .agents/skills/grill-with-docs/SKILL.md:7 — "Call the Skill tool twice, for grilling and domain-modeling."
  • .agents/skills/improve-codebase-architecture/SKILL.md:66 — calls the Skill tool with domain-modeling to keep the domain model current.

The same correction voids the follow-on remark about CLAUDE.md:27 and issue-tracker.md:60: /triage, /to-tickets, /to-spec, /implement and /wayfinder are all present in .claude/skills/ too. No agent-facing file in this PR names a skill that does not exist. Finding 5 is CLOSED, not PARTIAL, and nothing is recommended before merge on this axis. The table and the verdict below are corrected accordingly.

Prior findings

# Finding Verdict Evidence re-derived this round
1 README line 1 false CLOSED README.md:3 ↔ index.astro:11-28 (exactly two menuOptions)
2 Inverted / inconsistent orphan reporting CLOSED (one nit below) href="/general" in dist/ → 0 hits; the 24 -[style]- hrefs in dist/ all sit inside the style set; Selector de estilo in dist/ → 0, confirming the preview gate at BrochurePage.astro:33
3 /prevencion-escolar data source CLOSED routes.md:13 ↔ prevencion-escolar.astro:85-87
4 Middle Man, triage-labels.md CLOSED triage-labels.md:6-15; the 5 labels match the tracker exactly
5 Speculative Generality, domain.md CLOSED Multi-context branches gone; the tree at :16-22 matches docs/adr/; domain.md:12's skill references all resolve in .claude/skills/ (see correction above)
6 Duplicated Code (route/slug tables) NOT CLOSED — scope was narrowed See below
7 Divergent Change, CLAUDE.md CLOSED CLAUDE.md:25-31 is a pure index
8 VPS/sudo disclosure CLOSED git log --all -S'ssh.gaboggamer.online' empty; no refs/original/*; refs/remotes/github/docs/agentic-onboarding = 9dec5c6, an ancestor of HEAD
9 design_guide.md §8 tension OPEN by decision, correctly pointed CLAUDE.md:21 cites #8; issue #8 exists with a matching title. The tension is real (design_guide.md:97 "sin cambiar … geometría" vs BrochurePage.astro:40 pc-rounded … backdrop-blur)
R2-6 issue-tracker.md scope creep OPEN by decision :60-66 still carries Wayfinding ops + the server-admin pointer
R3 Template boilerplate, issue-tracker.md CLOSED :46-50 now states the decision
R3-extra Orphan/carve-out set duplicated OPEN — dropped without a verdict in round 4 Same fact stated at routes.md:20, routes.md:27-29, adr/0002:37-41. Round 3 raised it; round 4's table has no row for it
R4-1 routes.md:17 reachability criterion CLOSED Row and Total line name both paths; matches general.astro:80,83
R4-2 Dangling pointers numbered CLOSED #7 and #8 exist, titles match the text that cites them
R4-3 Boilerplate at :46-48 CLOSED see R3
R4-4 Local git hygiene CLOSED see 8

Also re-verified true: ADR Nygard format on both records; every relative link resolves; all CONTEXT.md type names exist (brochures.ts:1,3,21,27; emergencyTopics.ts:1,7,12,17,24); 8 slugs and 6 ids match both data files; SponsorsFooter in Layout.astro:3,28; Astro ^6.1.2, node >=22.12.0; 48 = 1+1+1+6+1+6+8+24; ADR-0002's frozen list matches src/pages/ one for one.

One methodological note for future rounds: a plain grep -rn 'href' src/ still misses BrochurePage.astro:36-37, where the builders are named darkHref / lightHref. That is a third variant of the literal-vs-template-literal trap that caught rounds 1 and 3 — a case-sensitive sweep for Href is needed too.

Marked closed but not closed

Finding 6 was closed on a narrower reading than it was filed. The frozen-route list was genuinely de-duplicated (adr/0002:25-27 is now its sole owner). But round 1's finding also said "the slug/id lists appear a third time in CONTEXT.md", and that half is untouched: general + school slugs at CONTEXT.md:17-19, README.md:15 and routes.md:35-36 (the four school slugs a fourth time at routes.md:13); topic ids at CONTEXT.md:25-26, README.md:16 and routes.md:37. Rounds 3 and 4 both reported this CLOSED.

The round-3 orphan-set duplication is still open and disappeared from round 4's verdict table without being resolved or accepted.

New findings

1. Duplicated Code, intra-file (judgement call). docs/routes.md:31-36 ("Parameter values") and docs/routes.md:56-61 ("Style / reading variants") state the same two axes and the same value sets twice in one file, both rewritten by this diff; CONTEXT.md:34-40 is a third statement. No prior round flagged this pair.

2. Minor wording residue (judgement call). README.md:3 says /general "is currently not linked from the home page", which implies something else links it. routes.md:12 correctly says "not linked from any page (orphaned)", and dist/ confirms zero inbound links.

Standards verdict

Nothing blocks merge, and nothing is recommended before merge. No hard violation of a documented standard survives: rule 4 (language) holds, rule 5 / ADR-0002 is coherent and single-sourced, the disclosure is scrubbed locally and remotely. What remains is duplication — the slug/id triplication that finding 6 left open, the orphan-set triplication from round 3, and the intra-file pair above. All three are judgement calls and all three are drift risks, which is exactly what the docs-drift check in #2 is for; fold them there rather than hold the PR.


Spec

Prior findings

# Finding Verdict Evidence re-derived this round
R1-1 Route count 41 → 48 CLOSED getStaticPaths: 4×2=8 and 4×3×2=24; 6 ids per topic file → 12; +4 singles = 48. dist/ = 48 index.html
R1-2 README opening line wrong CLOSED README.md:3 ↔ index.astro:11-28; no href to /general in src/ or dist/
R1-3 /prevencion-escolar data source CLOSED routes.md:13 ↔ prevencion-escolar.astro:85-87
R1-4 docs/adr/ advertised but absent CLOSED Both ADRs exist; domain.md tree and the README docs/ tree both carry them
R1-5 issue-tracker.md scope creep PARTIAL, accepted by decision Wayfinding section + one-line server-admin pointer remain; no host/sudo detail
R1-6 triage-labels.md boilerplate CLOSED Labels match the tracker: needs-info, needs-triage, ready-for-agent, ready-for-human, wontfix
R2-a Language rule broken at birth CLOSED Scripted Spanish-prose scan across all 9 changed docs (code spans and links stripped): zero hits. Residual Spanish is proper-noun identifiers, permitted by CLAUDE.md:22 bullet 3
R2-b ADR-0002 QR premise unsourced CLOSED adr/0002:11-18 names the press team, the September 2026 campaign, the maintainer directive dated 2026-09-19 and the off-repo artifact
R2-c Inverted reachability CLOSED Full link-target set re-derived: /, /${slug}-{light,dark} (general.astro:80,83), the two /<menu>/${id} families, plus BrochurePage.astro:36-37 and StyleSwitch.astro:24. In dist/, every file carrying a -[style]- href is itself a style route
R2-d Re-scope issue #7 / ADR-0002 carve-out CLOSED Live issue #7 title and body name /general + the 24 style routes (25 pages) and carry the preview-gate detail
R2-e / R4-5 ADR-0002 presented as documentation CLOSED Body opens with "plus one new policy"; item 4 carries the call-out, and its stated binding scope matches adr/0002:25-27 exactly
R3 / R4-6 PR body omits #8 CLOSED Body lists #1–#5, #7, #8; all seven exist, are open, and their titles match the body's scopes

Verified clean again: "documentation and configuration only" holds — 9 files, all *.md, nothing under src/. /nuevo-contenido-completo is genuinely obsolete (present at master:docs/routes.md:13, no such page in src/pages/). The "4 topics / 8 pages" claim the PR corrects is really there at master:README.md:3. ADR-0001's remote claims match git remote -v.

Missing or partial

One cosmetic mismatch, non-blocking. Changes item 3 says:

Route tables and structure corrected

README's route table was deleted, not corrected — docs/routes.md is the single inventory now, which is the round-1 de-duplication remediation working as intended. The outcome is right; the body's verb describes the earlier plan.

Scope creep

Only the accepted R1-5 residue. The spec line it exceeds is "Agent-skills config (docs/agents/, CLAUDE.md): Forgejo issue tracker, triage labels, domain-doc consumer rules" — the /wayfinder dependency and label note is adjacent tooling config rather than tracker config. Disclosed and accepted in round 2.

Implemented but wrong

Nothing in the diff.

One tracker-side inconsistency, outside the diff. The PR body points at #2 as a follow-up, and #2's body says:

alternatively GitHub Actions since PRs live on GitHub

That contradicts ADR-0001 and the PR body's own Migration context — PRs live on Forgejo; GitHub is a backup mirror. Worth a one-line edit to #2 so the CI work is not scoped against the wrong host. Not a reason to hold this PR.

Spec verdict

Nothing blocks merge. All twelve prior Spec findings are genuinely closed except R1-5, which is partial by explicit decision and was never a spec requirement.


Summary — Standards: 16 prior findings re-verified, 12 closed, 4 not fully closed (two of them open by explicit decision, one dropped by round 4 without a verdict), plus 2 new judgement calls; worst = finding 6 was reported CLOSED in rounds 3 and 4 but only half of it was done — the slug/id lists are still stated three times. Spec: 12 prior findings, 11 closed, 1 partial by decision, no new findings in the diff; worst = the PR body's "Route tables … corrected" describes a table that was deleted.

Nothing is recommended before merge on either axis. What is left is three duplication judgement calls (→ #2), one stale verb in the PR body, and a one-line edit to issue #2 so the CI work is not scoped against GitHub.

🤖 Review generated with Claude Code

## Code review round 5 — two axes, verification pass Re-review of `master...docs/agentic-onboarding` at `dc5cc1e` (merge-base `8382752`, 9 files, all `*.md`). This round's brief was **verification, not fresh discovery**: every finding from rounds 1–4 was re-derived from `src/`, `dist/`, `git` and the Forgejo API, with the remediation comments treated as claims to test rather than as evidence. Both axes independently confirm `dist/` is in sync (`find src -newer dist -type f` empty, 48 `index.html`), so reachability was checked against the shipped build rather than against greps alone. **Result: no blocking finding survives on either axis.** Three prior findings were marked closed more confidently than the tree supports, and one agent-facing file states something that is false today. Details below. --- ## Standards ### Correction to this round, applied before anything below This review first reported that `docs/agents/domain.md:12` was false because `/grill-with-docs` and `/improve-codebase-architecture` "do not exist". **That was wrong, and it is the same class of error as the round-1 and round-3 greps: the right lookup was never run.** The check went to `~/.claude/plugins/installed_plugins.json` — user-level plugins — and never looked at the project's own `.claude/skills/`, which symlinks into `.agents/skills/` and carries all of them. Both skills exist, and `domain.md:12`'s navigation claim is accurate on its own terms: - `.agents/skills/grill-with-docs/SKILL.md:7` — *"Call the Skill tool twice, for `grilling` and `domain-modeling`."* - `.agents/skills/improve-codebase-architecture/SKILL.md:66` — calls the Skill tool with `domain-modeling` to keep the domain model current. The same correction voids the follow-on remark about `CLAUDE.md:27` and `issue-tracker.md:60`: `/triage`, `/to-tickets`, `/to-spec`, `/implement` and `/wayfinder` are all present in `.claude/skills/` too. **No agent-facing file in this PR names a skill that does not exist.** Finding 5 is CLOSED, not PARTIAL, and nothing is recommended before merge on this axis. The table and the verdict below are corrected accordingly. ### Prior findings | # | Finding | Verdict | Evidence re-derived this round | | --- | --- | --- | --- | | 1 | README line 1 false | **CLOSED** | `README.md:3` ↔ `index.astro:11-28` (exactly two `menuOptions`) | | 2 | Inverted / inconsistent orphan reporting | **CLOSED** (one nit below) | `href="/general"` in `dist/` → 0 hits; the 24 `-[style]-` hrefs in `dist/` all sit inside the style set; `Selector de estilo` in `dist/` → 0, confirming the preview gate at `BrochurePage.astro:33` | | 3 | `/prevencion-escolar` data source | **CLOSED** | `routes.md:13` ↔ `prevencion-escolar.astro:85-87` | | 4 | Middle Man, `triage-labels.md` | **CLOSED** | `triage-labels.md:6-15`; the 5 labels match the tracker exactly | | 5 | Speculative Generality, `domain.md` | **CLOSED** | Multi-context branches gone; the tree at `:16-22` matches `docs/adr/`; `domain.md:12`'s skill references all resolve in `.claude/skills/` (see correction above) | | 6 | Duplicated Code (route/slug tables) | **NOT CLOSED — scope was narrowed** | See below | | 7 | Divergent Change, `CLAUDE.md` | **CLOSED** | `CLAUDE.md:25-31` is a pure index | | 8 | VPS/sudo disclosure | **CLOSED** | `git log --all -S'ssh.gaboggamer.online'` empty; no `refs/original/*`; `refs/remotes/github/docs/agentic-onboarding` = `9dec5c6`, an ancestor of HEAD | | 9 | `design_guide.md` §8 tension | **OPEN by decision, correctly pointed** | `CLAUDE.md:21` cites #8; issue #8 exists with a matching title. The tension is real (`design_guide.md:97` "sin cambiar … geometría" vs `BrochurePage.astro:40` `pc-rounded … backdrop-blur`) | | R2-6 | `issue-tracker.md` scope creep | **OPEN by decision** | `:60-66` still carries Wayfinding ops + the server-admin pointer | | R3 | Template boilerplate, `issue-tracker.md` | **CLOSED** | `:46-50` now states the decision | | R3-extra | Orphan/carve-out set duplicated | **OPEN — dropped without a verdict in round 4** | Same fact stated at `routes.md:20`, `routes.md:27-29`, `adr/0002:37-41`. Round 3 raised it; round 4's table has no row for it | | R4-1 | `routes.md:17` reachability criterion | **CLOSED** | Row and Total line name both paths; matches `general.astro:80,83` | | R4-2 | Dangling pointers numbered | **CLOSED** | #7 and #8 exist, titles match the text that cites them | | R4-3 | Boilerplate at `:46-48` | **CLOSED** | see R3 | | R4-4 | Local `git` hygiene | **CLOSED** | see 8 | Also re-verified true: ADR Nygard format on both records; every relative link resolves; all `CONTEXT.md` type names exist (`brochures.ts:1,3,21,27`; `emergencyTopics.ts:1,7,12,17,24`); 8 slugs and 6 ids match both data files; `SponsorsFooter` in `Layout.astro:3,28`; Astro `^6.1.2`, node `>=22.12.0`; 48 = 1+1+1+6+1+6+8+24; ADR-0002's frozen list matches `src/pages/` one for one. One methodological note for future rounds: a plain `grep -rn 'href' src/` still misses `BrochurePage.astro:36-37`, where the builders are named `darkHref` / `lightHref`. That is a third variant of the literal-vs-template-literal trap that caught rounds 1 and 3 — a case-sensitive sweep for `Href` is needed too. ### Marked closed but not closed **Finding 6 was closed on a narrower reading than it was filed.** The frozen-route list was genuinely de-duplicated (`adr/0002:25-27` is now its sole owner). But round 1's finding also said *"the slug/id lists appear a third time in `CONTEXT.md`"*, and that half is untouched: general + school slugs at `CONTEXT.md:17-19`, `README.md:15` and `routes.md:35-36` (the four school slugs a fourth time at `routes.md:13`); topic ids at `CONTEXT.md:25-26`, `README.md:16` and `routes.md:37`. Rounds 3 and 4 both reported this CLOSED. **The round-3 orphan-set duplication is still open** and disappeared from round 4's verdict table without being resolved or accepted. ### New findings **1. Duplicated Code, intra-file (judgement call).** `docs/routes.md:31-36` ("Parameter values") and `docs/routes.md:56-61` ("Style / reading variants") state the same two axes and the same value sets twice in one file, both rewritten by this diff; `CONTEXT.md:34-40` is a third statement. No prior round flagged this pair. **2. Minor wording residue (judgement call).** `README.md:3` says `/general` "is currently not linked from the home page", which implies something else links it. `routes.md:12` correctly says "not linked from any page (orphaned)", and `dist/` confirms zero inbound links. ### Standards verdict **Nothing blocks merge, and nothing is recommended before merge.** No hard violation of a documented standard survives: rule 4 (language) holds, rule 5 / ADR-0002 is coherent and single-sourced, the disclosure is scrubbed locally and remotely. What remains is duplication — the slug/id triplication that finding 6 left open, the orphan-set triplication from round 3, and the intra-file pair above. All three are judgement calls and all three are drift risks, which is exactly what the docs-drift check in #2 is for; fold them there rather than hold the PR. --- ## Spec ### Prior findings | # | Finding | Verdict | Evidence re-derived this round | | --- | --- | --- | --- | | R1-1 | Route count 41 → 48 | **CLOSED** | `getStaticPaths`: 4×2=8 and 4×3×2=24; 6 ids per topic file → 12; +4 singles = 48. `dist/` = 48 `index.html` | | R1-2 | README opening line wrong | **CLOSED** | `README.md:3` ↔ `index.astro:11-28`; no `href` to `/general` in `src/` or `dist/` | | R1-3 | `/prevencion-escolar` data source | **CLOSED** | `routes.md:13` ↔ `prevencion-escolar.astro:85-87` | | R1-4 | `docs/adr/` advertised but absent | **CLOSED** | Both ADRs exist; `domain.md` tree and the README `docs/` tree both carry them | | R1-5 | `issue-tracker.md` scope creep | **PARTIAL, accepted by decision** | Wayfinding section + one-line server-admin pointer remain; no host/sudo detail | | R1-6 | `triage-labels.md` boilerplate | **CLOSED** | Labels match the tracker: `needs-info`, `needs-triage`, `ready-for-agent`, `ready-for-human`, `wontfix` | | R2-a | Language rule broken at birth | **CLOSED** | Scripted Spanish-prose scan across all 9 changed docs (code spans and links stripped): zero hits. Residual Spanish is proper-noun identifiers, permitted by `CLAUDE.md:22` bullet 3 | | R2-b | ADR-0002 QR premise unsourced | **CLOSED** | `adr/0002:11-18` names the press team, the September 2026 campaign, the maintainer directive dated 2026-09-19 and the off-repo artifact | | R2-c | Inverted reachability | **CLOSED** | Full link-target set re-derived: `/`, `/${slug}-{light,dark}` (`general.astro:80,83`), the two `/<menu>/${id}` families, plus `BrochurePage.astro:36-37` and `StyleSwitch.astro:24`. In `dist/`, every file carrying a `-[style]-` href is itself a style route | | R2-d | Re-scope issue #7 / ADR-0002 carve-out | **CLOSED** | Live issue #7 title *and* body name `/general` + the 24 style routes (25 pages) and carry the preview-gate detail | | R2-e / R4-5 | ADR-0002 presented as documentation | **CLOSED** | Body opens with "plus **one new policy**"; item 4 carries the call-out, and its stated binding scope matches `adr/0002:25-27` exactly | | R3 / R4-6 | PR body omits #8 | **CLOSED** | Body lists #1–#5, #7, #8; all seven exist, are open, and their titles match the body's scopes | Verified clean again: *"documentation and configuration only"* holds — 9 files, all `*.md`, nothing under `src/`. `/nuevo-contenido-completo` is genuinely obsolete (present at `master:docs/routes.md:13`, no such page in `src/pages/`). The "4 topics / 8 pages" claim the PR corrects is really there at `master:README.md:3`. ADR-0001's remote claims match `git remote -v`. ### Missing or partial One cosmetic mismatch, non-blocking. Changes item 3 says: > Route tables and structure corrected README's route table was **deleted**, not corrected — `docs/routes.md` is the single inventory now, which is the round-1 de-duplication remediation working as intended. The outcome is right; the body's verb describes the earlier plan. ### Scope creep Only the accepted R1-5 residue. The spec line it exceeds is *"**Agent-skills config** (`docs/agents/`, `CLAUDE.md`): Forgejo issue tracker, triage labels, domain-doc consumer rules"* — the `/wayfinder` dependency and label note is adjacent tooling config rather than tracker config. Disclosed and accepted in round 2. ### Implemented but wrong Nothing in the diff. **One tracker-side inconsistency, outside the diff.** The PR body points at **#2** as a follow-up, and #2's body says: > alternatively GitHub Actions since PRs live on GitHub That contradicts ADR-0001 and the PR body's own Migration context — PRs live on Forgejo; GitHub is a backup mirror. Worth a one-line edit to #2 so the CI work is not scoped against the wrong host. Not a reason to hold this PR. ### Spec verdict **Nothing blocks merge.** All twelve prior Spec findings are genuinely closed except R1-5, which is partial by explicit decision and was never a spec requirement. --- **Summary** — Standards: 16 prior findings re-verified, 12 closed, 4 not fully closed (two of them open by explicit decision, one dropped by round 4 without a verdict), plus 2 new judgement calls; worst = finding 6 was reported CLOSED in rounds 3 and 4 but only half of it was done — the slug/id lists are still stated three times. Spec: 12 prior findings, 11 closed, 1 partial by decision, no new findings in the diff; worst = the PR body's "Route tables … corrected" describes a table that was deleted. **Nothing is recommended before merge on either axis.** What is left is three duplication judgement calls (→ #2), one stale verb in the PR body, and a one-line edit to issue #2 so the CI work is not scoped against GitHub. 🤖 Review generated with [Claude Code](https://claude.com/claude-code)
gabogg merged commit dee747daf9 into master 2026-09-19 20:28:16 +00:00
Sign in to join this conversation.
No reviewers
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
PCivil/folletos-digitales!6
No description provided.