CurrencyTransfer.com · Navigation 2026 · stage 2 · owner review

Navigation 2026 PRD Review Pack

Read this page in ten minutes. It tells you what we build, what you must decide, and what a person must do by hand.

24 September 2026PRD: docs/nav-audit-2026-09-22/prd-nav-2026.md (revision 8)Written in Simplified Technical English
CODEX gpt-6-astra builds it OPUS claude-opus builds it (editor-facing work) HUMAN a person does it LATER after the production switch

Status in one line. The PRD is at revision 8 after eight review rounds. The last automatic check reports 0 blockers and 21 major findings, verdict FIX-FIRST. Eight of the 21 ask us to split stories, and we decline them. Thirteen are new and still open. See section 8 before you decide.

What "go" means. If you say go, we run one more fix round on the 13 open findings. Then we convert the PRD, which turns it into otto's task list. otto builds the stories on a feature branch. Nothing reaches production until the release checklist in section 6 is complete. If you say no-go, nothing changes; stage 1 stays live.

1. What we build

We replace the fixed header menu with one menu that editors manage in WordPress. Stage 1 already shows the agreed design as fixed HTML files, which we call the bundle. Stage 2 renders the same HTML from one WordPress menu, item by item. A script, the parity check, compares the two outputs link by link, so Google sees no change. When the missing pages exist, editors un-hide menu items and the full design appears.

2. The three stages

STAGE 1 · LIVE

Fixed launch menu

In production since 24 September 2026. Tag nav-2026-stage1-v1.1, accessibility hardened. Live links only.

STAGE 2 · THIS PRD

WordPress-managed menu

The same design, rendered from one editable menu. Same links, same order, same landmarks as stage 1.

STAGE 3 · FROZEN

Full four-column design

Frozen at ct-nav-full-design-2avs-yn35.pages.dev, tag nav-2026-full-design-v1. Editors reach it by un-hiding items.

3. What an editor can and cannot do

An editor can

  • Add, remove, rename and reorder any link on Appearance > Menus.
  • Set what an item is: link, group, overview row, featured card, plaque, more-link, button.
  • Hide an item until its page is live. Hidden items do not exist in the page HTML.
  • Give a link a short description, a "New" tag, or a currency badge.
  • Pick a tile icon or a card image from the media library.
  • Set a different position for a group on phones only.
  • Give the phone sheet a shorter overview line.
  • Apply the full design with one button, once the pages exist.

An editor cannot

  • Change colours, spacing, fonts or breakpoints. Those live in the stylesheet.
  • Show a link on desktop but not on phones, or the reverse. Google reads the phone menu.
  • Write HTML into the menu.
  • Add a fourth top-level tab. The header holds three.
  • Switch the new menu on or off. That is the operator's job.
  • Upload SVG icons unless you approve the Safe SVG plugin (decision 1).

4. The stories

Twenty-one stories. One commit each. otto, the build tool, runs them one at a time. The "depends on" column is the run order, not a plan for parallel work. A person does NAV-001 and the release steps. NAV-018 and NAV-020 run after the production switch, in a second conversion. The operator is the person who runs the release, Stevan or Phil.

IDTitleExecutorDepends onDone when
NAV-001Human prerequisites.user.ini record, Safe SVG choice, Convert pause, hub row idHUMANnoneThe release checklist file records each item with evidence.
NAV-002Admin prerequisites and the test runnercore edit walker, Description box, input-limit warning, PHP 7.2/8.3 lintCODEXnoneThe Menus screen shows the Description box and the lint exits 0.
NAV-003Tree builder and flush primitiveroles, hidden pruning, badges, mobile orderCODEXNAV-00273 items in, 52 visible out; tests pass on three PHP runtimes.
NAV-004Item markup, icons, SVG sanitiserCODEXNAV-003, NAV-014All 15 icons pass the sanitiser; tile markup equals the bundle.
NAV-005Per-item fields with guarded saveOPUSNAV-003Each field round-trips; a save without the form marker writes nothing.
NAV-006Media picker for icons and imagesOPUSNAV-005, NAV-010, NAV-017An editor picks an icon, saves once, and the tile shows it.
NAV-007Wide panel markup (1200 px and up)CODEXNAV-004, NAV-014The parity check and a byte comparison against the bundle both pass for every tab.
NAV-008Medium panel markup (600 to 1199 px)CODEXNAV-004, NAV-014The same two checks pass against the bundle's medium blocks.
NAV-009Phone sheet markup (below 600 px)CODEXNAV-004, NAV-014The same two checks pass against the sheet; mobile order works.
NAV-010Render integration on stage 1fragment filter, composition, preview parametersCODEXNAV-007, 008, 009, 014, 016, 017Switch off: header identical to stage 1. Menu active: the parity check passes.
NAV-011Cache lifecycleone cached row, gated invalidation, preview bypassCODEXNAV-010A flush deletes the cached menu HTML. After a flush the first load rebuilds it and the second reuses it. Unrelated edits leave it in place.
NAV-012Section map for the body classCODEXNAV-011Sixteen URLs carry the expected section class.
NAV-013Cloudflare edge purge on every changeCODEXNAV-011One purge per request that flushed; a label change shows on production within 60 seconds.
NAV-014Harness and baselinesfixtures, checker copy, states port, visual and Lighthouse toolsCODEXNAV-002All fixtures committed; the baseline runs are quoted.
NAV-015Verification of the rendered menuscreenshots, link states, behaviour, LighthouseCODEXNAV-011, 012, 014, 017, 021Screenshots within 1 % of stage 1; 33 link-colour probes pass; Google Lighthouse speed scores stay within tolerance.
NAV-016Seed the menu from Tools; activate and deactivateOPUSNAV-003, NAV-014Seed creates 73 items, 21 hidden; Activate and Deactivate set and clear the option.
NAV-017Icon import, full-design and launch presetsOPUSNAV-016, NAV-00415 icons imported once; the preset un-hides only targets that exist.
NAV-018Second critical-CSS set LATERCODEXNAV-019Seven pruned files hold no legacy menu selectors; first paint unchanged.
NAV-019Launch gate and release checklistCODEXNAV-006, 013, 015, 017, 021The gate script reports zero failures on local and staging; the release checklist is written.
NAV-020Legacy removal and menu export LATEROPUSNAV-019, NAV-018Legacy render path and CSS gone; three legacy menus exported, none deleted by code.
NAV-021Full-design stylesheet, printed only when neededCODEXNAV-010, 014, 017Nothing prints in launch mode; full-design regions within 1 % of the archive.

5. Decisions you must make before the build

Seven decisions. Each one names the recommended answer. Say "agree" or give another answer.

  1. 1. SVG icons: Safe SVG plugin, or PNG only? WordPress blocks SVG uploads by default. Option (a): install the Safe SVG plugin. It cleans each file on upload and is the one new plugin. Option (b): editors upload PNG or WebP only. Those icons do not change colour on hover. Recommended: (a).
  2. 2. The "All industries" link. Today it points to the Business hub. The full design points to a row on that page with the id industries. Add that id to the row, or keep the plain hub link. The PRD gives no recommendation. Our view: add the id, a small page-builder edit.
  3. 3. Two pages lose their sitewide header link. In launch mode /product and payplexo.com are not in the menu. The SEO audit accepts this loss. Recommended: accept.
  4. 4. One menu, not two (decided; you can veto). Desktop and phone render from one menu. Phones get their own group order through a "Position on mobile" field. Two menus would drift apart, as menus 13 and 49 do today. Recommended: keep one menu.
  5. 5. Blog-post pages keep the old Dante header. The blog index already shows the new header. Single posts do not. The PRD leaves posts unchanged in stage 2 and lists them for stage 3. Say so if you want them in stage 2. Recommended: stage 3.
  6. 6. A permanent underline on the current desktop tab (optional). Today only the open tab is underlined. A permanent underline is one CSS rule in stage 1, not a stage-2 story. Recommended: no change now.
  7. 7. Pause two Convert experiments. Experiments 100142955 and 100144149 restyle the menu buttons. A person pauses them in the Convert dashboard before the production switch. Recommended: pause them.

6. Manual steps

Done

  • .user.ini sets max_input_vars=3000 on production and staging. Verified 24 September 2026.
  • WP-CLI runs on production at /home/phil/bin/wp.
  • Stage 1 is live on production behind the ctw_nav_v2 switch.

To do

  1. Install Safe SVG on staging and production, if you choose option (a) in decision 1.
  2. Open Tools > Seed navigation 2026 on each environment. Click Seed, then Import icons. Order: local, staging, production.
  3. Pause the two Convert experiments (decision 7).
  4. Deploy the stage-2 code with the menu not yet active. The site keeps showing the stage-1 HTML.
  5. Click Activate menu on the Tools page. This is stage 2's own switch. Stage 1's switch stays as the whole-menu rollback.
  6. Purge Cloudflare after each command-line change: ./deploy purge prod.
  7. Rollback at any time: click Deactivate menu, then purge. No deploy is needed.
  8. Seven days after activation: convert and run NAV-018 and NAV-020.

7. Risks

RiskMitigation
The rendered menu drifts from the bundle, so Google sees different links.Every markup story must pass the parity check against the bundle, link by link.
Editors' changes stay invisible for hours because Cloudflare caches whole pages.Every menu change deletes the cached HTML and sends one Cloudflare purge; a production probe proves it.
Unrelated edits, such as autosaves, purge the whole edge cache many times a day.Only changes to the menu, its pages or its icons trigger a purge; unit tests cover the rest.
Code that runs on PHP 7.4 locally fails on PHP 7.2 in production.Every PHP story runs its tests inside PHP 7.2 and PHP 8.3 containers.
A link to a private, missing or redirecting page ships in the menu.Unpublished targets never render, and the launch gate probes every URL on each environment.

8. Review history

Eight rounds ran. The checker, otto check, is an adversarial reviewer that reads the PRD as a builder would. FIX-FIRST means it wants changes before the build starts.

RoundResultMain change
1 · otto check1 blocker, 35 major, 1 minor. FIX-FIRST.Real frames cited; tooling moved into the theme repo; the old save handler unhooked.
SEO auditStage 2 "pass with fixes".Tabs stay links; hidden items leave the HTML; the parity check becomes the acceptance test.
2 · otto check2 blockers, 37 major. FIX-FIRST.The PRD now builds on the stage-1 code with one filter line.
3 · otto check1 blocker, 32 major. FIX-FIRST.Symbol anchors; a new story for the full-design styles.
4 · otto check1 blocker, 31 major, 1 minor. FIX-FIRST.One base URL; a phone subline field; safer cache writes.
5 · independent panel92 findings: 13 blocker, 42 major, 37 minor. 49 stood after refutation.Extra editor fields so one menu reproduces the bundle; a race-free cache design.
6 · otto check0 blockers, 28 major, 2 minor. FIX-FIRST.Random cache tokens; a stable section key per tab.
7 · otto check0 blockers, 23 major, 2 minor. FIX-FIRST.Fifteen new findings fixed in revision 8, see below.
8 · otto check (final)0 blockers, 21 major, 0 minor. FIX-FIRST.Eight are repeated split requests, declined. Thirteen are new and open.

What revision 8 changed

Fifteen findings from round 7, all fixed. The largest: a helper function was called before its story defined it. A WordPress catch-all rule made every path look valid, so missing pages could slip through. A custom link pointed the section map at the wrong id. A plaque without its card had no desktop position. The cache could store stale content during a cold start. The purge could run before the final cache reset.

What is still open after round 8

Thirteen new findings. Most are edge cases in caching and testing. Three matter for the decision. First, the checker doubts the new dependency record still has a race. Second, a tab with no overview loses its link on phones. Third, the release checklist deploys main, but the build lives on a feature branch, so it needs a merge step. None is a blocker. We recommend one more fix round before conversion.

Declined every round since round 2: splitting eight large stories. The task sizer splits stories at conversion time, and each story is one file or one tool set.

9. Links

Prepared 24 September 2026 from docs/nav-audit-2026-09-22/prd-nav-2026.md, revision 8. Unlisted page: do not index.