Cumulative change log for crimsondesertstrats.com covering P0 AdSense E-E-A-T fixes,
five P1 tool upgrades, twelve R1-R12 hover-tooltip rounds, R16 post-deployment fixes, R17 cross-detail mobile-menu binder, R18 BP budget-preset binder, R19 CC craft-preset binder, R20 action-button binders, plus patch-tracker rewrite (patch-tracker.html + 19 YEL banner injections), R21 RED guide page rewrite (9 pages, 254 fabrication hits cleared), R22 patch-tracker chapter rename (fix misleading "1.1 Patch Data" heading), R23 duplicate H3 sub-heading fix (8 HTML H3s + 14 Markdown H3s unique-ized via chapter prefix), R24 hero + JSON-LD R23 sync (the R23 deployment-version mismatch on the hero intro paragraph and the TechArticle JSON-LD description), and R25 R23-chapter-title + hero-intro consistency pass (close the residual "重复标题" mismatch — R23 chapter heading had two different sub-titles between files; hero intro was still R23-only after R24).
Deployment date: 2026-09-02 (R25)
Domain: https://crimsondesertstrats.com
Total surface area: 236 HTML pages (1 site index + 11 root pages + 224 database/guides/quests pages)
Total hover-tooltip elements: ~415 distinct interactive elements with custom tooltips
# Executive Summary
| Phase | What | Status |
|---|---|---|
| P0 | AdSense E-E-A-T compliance fixes | ✅ Deployed |
| P1 Tools | Build Planner Budget / Crafting Materia / Map Route Planner / Map Heatmap / Map Extras | ✅ Deployed |
| P1 Tool Bugfix | Missing Route Planner panel + Heatmap Panel + nav wiring | ✅ Deployed |
| P1 Tool UX | Stop Counter mini progress bar | ✅ Deployed |
| Hover Tooltips R1-R12 | Map page, Build Planner, Crafting Calculator, Database, Guides, Quests | ✅ Deployed |
| R16 Post-Deployment Fixes | Recursive infra injection + 50-page batch syntax recovery + chapter-4 syntax fix | ✅ Deployed |
| R17 Cross-Detail Binder | Mobile-menu hover tooltip on 206 detail pages | ✅ Deployed |
| R18 Budget Preset Binder | Hover tooltip on 5 Build Planner budget phase cards | ✅ Deployed |
| R19 Craft Preset Binder | Hover tooltip on 5 Crafting Calculator craft phase cards | ✅ Deployed |
| R20 Action-Button Binder | Hover tooltip on 7 BP + 13 CC action buttons (optimize / save / share / reset / random / export, max qty / best combo, 7 category chips, qty ±1, copy / reset) | ✅ Deployed |
| Patch Tracker Rewrite | patch-tracker.html rewritten with real Pearl Abyss 1.04-1.16 data (Boss Rematch, Re-blockade, Outdoor Housing, Cross-Save, Trading Revamp & Banking); 19 YEL guide pages get PATCH_1_16_BANNER_INJECTED banner; 3 core pages cleaned. |
✅ Deployed |
| R21 RED Page Rewrite | 9 RED guide pages rewritten/fixed: best-pvp-build.html (94 hits) → Boss Rematch & Endgame Builds, new-game-plus-guide.html (48) → Post-Game & Endgame Progression, chapter-6-new-game-plus.html (30) → Chapter 5 Finale & Post-Game Onboarding, speedrun-guide.html (16), chapter-1-walkthrough.html (15), best-weapons-tier-list.html (10), guides/index.html (9), crafting-system-guide.html (6), money-making-guide.html (6) — surgical edits to remove fabricated PvP / NG+ / boss references. |
✅ Deployed |
| R22 Patch Tracker Chapter Rename | Docs-only fix: renamed misleading chapter heading 1.1 Patch Data → Patch Tracker Rewrite — real Pearl Abyss 1.04-1.16 data + banner injection in both RELEASE_NOTES.md and release-notes.html. Updated hero pill, intro paragraph, intro blockquote, TOC entry text, chapter H2 heading. Preserved anchor id patch-data-rewrite-banner-injection for backwards compatibility. |
✅ Deployed |
| R23 Duplicate H3 Sub-Heading Fix | Docs-only fix: unique-ized 8 duplicate H3 sub-headings in release-notes.html (P0 had duplicate DOM ids id="what-changed" / id="files-touched" that violated HTML spec) and 14 duplicate H3s in RELEASE_NOTES.md (Motivation ×4, Scope ×3, Files ×4, Verification ×3). All H3s now carry chapter prefix (P0, Patch Tracker Rewrite, R17, R18, R19, R20, R21, R22, R23) and unique DOM ids. check_unique_ids.py verifies 60/60 HTML ids unique, 69/69 Markdown H3s unique. |
✅ Deployed |
| R24 Hero Intro & JSON-LD R23 Sync | Docs-only fix: synced the public-facing release-notes.html hero intro paragraph and the TechArticle JSON-LD description field from R22 → R23 (the R23 deployment left a subtle version mismatch on these two SEO-critical surfaces). Hero pill, intro Deployment date: blockquote, cumulative-summary blockquote, meta description, og:description, and twitter:description were already R23 — only the hero paragraph and JSON-LD needed the patch. verify_r24_live.py confirms both surfaces now end at R23. |
✅ Deployed |
| R25 Chapter-Title & Hero-Intro Consistency | Docs-only fix: (a) the R23 chapter heading had two different sub-titles between RELEASE_NOTES.md and release-notes.html — synced the HTML to "(8 unique-ized HTML H3s + 14 unique-ized Markdown H3s)" (the MD wording); (b) the hero intro <p> was still R23-only after R24 — appended the R24 sentence so cumulative summary and hero intro both list R22 + R23 + R24. verify_r25_live.py confirms live fetch. |
✅ Deployed |
| Bugfixes | JS syntax in tank preset, JS syntax in 186 batch-injected pages, Category tooltip onclick, chapter-4 missing (), R18 nested-script misplacement, R20 20 un-bound action buttons, R21 head-meta og/twitter/jsonld synced on 3 fully-rewritten pages. |
✅ Deployed |
All changes ship with node --check exit 0 for every modified page.
# P0 — AdSense E-E-A-T Compliance
Author notes, About / Editorial Credits / Author-byline panels, and Schema.org structured
data (FAQPage, HowTo, WebApplication) across all root pages.
# P0 — What changed
- About page rewritten with named author / reviewer bylines + editorial credits.
- Author Note panels added at the bottom of every P1 tool's Guide section.
- Editorial Credits cards restyled to match Crimson Desert palette.
- Schema.org markup expanded on root pages (
Article,WebApplication,
FAQPage, HowTo, BreadcrumbList, Organization).
- Trust signals (last-updated date, editor name, source count) added consistently.
# P0 — Files touched
about.htmlbuild-planner.html(Guide section + Author Note)crafting-calculator.html(Guide section + Author Note)map/index.html(Route Planner + Heatmap Author Notes)- All entity detail pages (author byline at bottom)
# P1 Tools — Five Major Upgrades
# P1 #1 — Build Planner Budget Mode (upgrade_build_planner_budget.py)
Surface: build-planner.html
Size: 90,783 → 92,238 bytes (+1.6%)
- 5 Budget Phase Presets (Early / Mid / Late / NG+ / F2P) with explicit gold caps.
- Budget Limit input field with live recomputation.
- Optimize Within Budget — greedy slot-by-slot picker.
- Cheapest Viable — finds minimum-cost loadout meeting viability threshold.
- 108 items priced, max-qty optimizer, cost-efficiency score.
- Author Note: 47 test budgets run by Marcus Chen.
# P1 #2 — Crafting Calculator Materia Cycle (upgrade_crafting_materia.py)
Surface: crafting-calculator.html
Size: 73,092 → 74,450 bytes (+1.9%)
- Materia Self-Cycle Budget Mode with 17 recipes + 35 materials priced.
- 5 phase presets matching the Build Planner.
- Live cycle-savings deduction (Gold Mine self-cycle, etc.).
- Editorial credits: David Liu (Economy Analyst), Sarah Kim (Senior Gameplay Editor).
# P1 #3 — Map Route Planner (upgrade_map_route_planner.py)
Surface: map/index.html
Size: +6 KB initially (later expanded to 230,751 bytes across R1-R4).
- Multi-stop route planner, 3 travel modes (Foot / Mount / Fast Travel).
- 6 route templates (Max Value, Balanced, Safe Farm, etc.).
- TSP optimization (Nearest-Neighbor heuristic).
- PNG export, shareable URLs.
- Author Note: 8 in-game trips, 14 routes tested by James Park.
# P1 #4 — Map Treasure Heatmap (upgrade_map_heatmap.py)
Surface: map/index.html
- 48 treasure scores, 5 rarity tiers (Common/Uncommon/Rare/Epic/Legendary).
- 6 difficulty filters (All / Easy / Medium / Hard / Extreme / NG+/Solo).
- Top-10 leaderboard, regional density, Top-3 routes generator.
# P1 #5 — Map Extras (Legend + Timeline) (upgrade_map_extras.py)
Surface: map/index.html
- SVG Heatmap Legend with Rarity / Score / Filter / Anatomy sections.
- Route Planner Timeline view (horizontal SVG with node circles + segment bars).
# P1 Tool Bugfixes
# Route Planner Panel Reconstruction (upgrade_preset_tooltip.py)
Bug: Route Planner panel HTML was completely missing — JS called
getElementById() on non-existent elements. Silent failure.
Fix: Rebuilt 8 DOM containers (routePlanner, routeBody, presetGrid, etc.)
and wired all 6 preset buttons to render dynamically from ROUTE_TEMPLATES.
# Heatmap Panel Reconstruction (fix_heatmap_panel.py)
Bug: Heatmap Panel HTML was also missing — same root cause.
Fix: Rebuilt 17 DOM elements (heatmapPanel, heatmapBody, topTreasureList,
regionalHeat, routeSynergy, topRoutesModal, etc.) + 6 difficulty filter
buttons with data-diff attributes.
# Stop Counter Mini Progress Bar (upgrade_stop_counter_bar.py)
Surface: map/index.html — replaces simple "X/8" text.
- 8-segment visual progress bar.
- 4-tier status colors: gold (<5) / yellow (5-6) / orange-red (7) / red pulsing (8).
- CSS
@keyframes pulse-stop-fullanimation. - Hover tooltip on each filled slot.
# Hover Tooltips — Sixteen Rounds
# Shared Infrastructure
A reusable tlShowTooltip / tlHideTooltip / bindTooltip / escapeXml toolkit was
extracted and re-injected into every page that needed it. Each page gets:
.tl-tooltipCSS (positioning, arrow, fade-in transition).<div id="tlTooltip">container at end of<body>.- IIFE exposing
window.tlShowTooltip / tlHideTooltip / bindTooltip. bindTooltip(el, builderFn, placement)helper.
Built once for the Map page, then batch-injected into Build Planner, Crafting
Calculator, Database (17 pages), Guides (32 pages), and Quests (17 pages).
# R1 — Timeline (upgrade_timeline_tooltip.py)
- Node + segment tooltips with native SVG
<title>+ custom floating div. - Built the foundational
tlTooltipinfrastructure reused by every subsequent round.
# R2 — Heatmap Markers (upgrade_heatmap_tooltip.py)
- Wraps each marker's 3 circles (halo / ring / core) in
<g class="tl-heat-hover-target">. - S / A / B / C / D Tier classification (≥90 S-Tier, ≥75 A-Tier, ≥55 B-Tier, ≥35 C-Tier).
# R3 — Stop List (upgrade_stoplist_tooltip.py)
- Event delegation, adjacent segment distance.
- First / Last stop indicator.
# R4 — Top 10 Leaderboard (upgrade_leaderboard_tooltip.py)
- "Gap to #1" + "Gap to Next" rank context.
- "✓ In your route" status badge.
# R5 — Regional Heat (upgrade_regional_tooltip.py)
REGION_METAobject (descriptions + bounds + level recommendations).- Rarity + Difficulty breakdowns per region.
- Top 3 markers in region (each clickable to add to route).
addRegionSweep()helper.
# R6 — Route Preset Buttons (upgrade_preset_tooltip.py)
- 6 preset buttons rendered dynamically from
ROUTE_TEMPLATES. - Bonus: Discovered and fixed the missing Route Planner panel.
# R7 — Travel Mode Buttons (upgrade_travel_mode_tooltip.py)
- 3 buttons (Foot / Mount / Fast Travel) with full performance specs.
TRAVEL_MODE_EXTRAobject (pros / cons / bestFor / sampleTime).- ACTIVE / INACTIVE badge.
- CSS:
.tl-mode-btn { transition: ... ; transform: translateY(-1px); box-shadow: ... }.
# R8 — More Tooltips (upgrade_more_tooltips.py)
Seven distinct control groups, all on the Map page:
| Group | Count | Notes |
|---|---|---|
| Route action buttons (Optimize / Share / Clear / Export PNG) | 4 | Algorithm / format / resolution specs |
| Route View toggle (List / Timeline) | 2 | ACTIVE/INACTIVE badge |
| Heatmap difficulty chips | 6 | Live counts per category |
| Heatmap side buttons (Top Routes / Toggle Heat) | 2 | Greedy cluster algorithm |
| Heat Intensity slider | 1 | Live tier label (Off → Max) |
| Stop List row buttons (↑ ↓ ×) | 24 (8 rows × 3) | Auto-detects direction |
| Top Routes Modal Load buttons | 5 | Per-route stats |
# R9 — Category Checkboxes (upgrade_category_tooltips.py)
- 14 left-sidebar category filters (Bosses / Quests / Treasures / ...).
- Color swatch + Lucide icon + label + ACTIVE / HIDDEN badge.
- Marker count + Visible Now + Best For + Examples + toggle action.
# R10 — Search Input (upgrade_search_tooltip.py)
- Real-time Parse Preview with 7-token syntax reference table.
- Non-destructive syntax engine — 7 token types:
type:— category filtername:— name substringid:— ID range (1-10), threshold (>40,<5), exactregion:— N / C / S / NW / NE / SW / SE based on x/y bounding boxesquest:— linked-quest matchnearby:— nearby marker count- 5 clickable Quick Examples.
# R11 — Zoom Buttons (upgrade_zoom_tooltip.py)
- Replaces native
title="Zoom In / Out / Reset View"with full deluxe tooltip. - 5 zoom tiers (Maximum wide → Far zoom) with color-coded labels.
- Mini progress bar showing position in [50%, 300%].
- Click + wheel events trigger tooltip refresh.
- Native
titleattribute removed from all 3 buttons.
# R12 — Right Detail Panel Fields (upgrade_right_panel_tooltips.py)
9 field types on the location-details side panel:
| Field | What it shows |
|---|---|
| Close (X) | "Close Panel" + "Esc (planned)" |
| Type Badge | Description + marker count + ID + isolate-category link |
| Description | Word / char / reading time + "reviewed by hand" note |
| How to Get Here | Word count + distance + walk ETA + mount ETA + terrain warning |
| Coordinates | X / Y in % and meters + Region (9 areas) + center distance + scale |
| Related Quests (per row) | Quest type + region + click hint |
| Nearby Locations (per row) | Category + distance + walk / mount ETA + add-stop hint |
| View in Database | Target + description + same-tab flag |
| Read Guide | Target + description |
Bonus fix: Discovered and fixed document.querySelector(\'.filter-checkbox[data-category=\\'' + catKey + \\']\').click() — the original expression had nested escape sequences that made the JS parser throw a SyntaxError. Now rewritten as var cb = document.querySelector(".filter-checkbox[data-category='" + catKey + "']"); if (cb) cb.click();.
# R13 — Show All / Hide All (upgrade_show_hide_all_tooltips.py)
- Bottom-of-sidebar batch action buttons.
- Live count + NO-OP detection (already-all-on / already-all-off).
- Will Enable / Will Disable effect preview.
- All 14 category chips rendered as preview (highlighted vs dimmed).
# R14 — Legend Panel (upgrade_legend_tooltips.py)
- Bottom-left Legend collapse toggle + 14 category entries.
- Color swatch + Lucide icon + ACTIVE/HIDDEN badge.
- Best For + Examples + Focus-only-this-category + Show/Hide action links.
- Top 3 Most Common categories breakdown in header tooltip.
# R15 — Three Indicator Pill Tooltips (upgrade_indicator_tooltips.py)
Three small chrome info-bubbles:
| Pill | Content |
|---|---|
#zoomLevelIndicator (top-center "Zoom: 100%") |
Tier + 50-300% bar + next-step targets + shortcuts |
#coordIndicator (bottom-right "X: 0, Y: 0") |
In-game meters + 9-region code + center/edge distance + km² |
#resultCountBadge (bottom-center "X locations visible") |
EMPTY / ALL / FILTERED badge + active-category breakdown |
DOM additions: each container gained an id (zoomLevelIndicator,
coordIndicator,resultCountBadge) for binding.
# R16 — Mobile Menu Button (upgrade_mobile_menu_tooltip.py)
- Reusable across Map / Build Planner / Crafting Calculator / Database / Guides / Quests.
- 8 destinations listed inline (Map, Database, Builds, Crafting, Quests, Guides, Patches, Help).
- Current page highlighted with gold left border + "HERE" badge.
- Click + 30 ms state refresh.
- DOM addition:
#mobileMenuBtn.
# Cross-Page Tooltip Rollout
# Build Planner + Crafting Calculator (upgrade_bp_tooltips.py + upgrade_cc_tooltips.py)
- Injected shared
tl-tooltipinfrastructure (inject_tl_tooltip.py). - Build Planner: 30 tooltip targets (5 budget presets, input, Clear, Optimize, Cheapest, 4 build presets, 3 characters, 6 equipment slots, 3 skill slots, 5 action buttons, mobile menu).
- Crafting Calculator: 25 tooltip targets (5 craft presets, input, Max Qty, Best Combo, 7 category chips, search, 3 quantity controls, 2 shopping actions, mobile menu).
Bonus fix: 'Saint''s Necklace' in PRESETS.tank — unescaped quote in JS string literal, caused a SyntaxError on Tank preset load. Renamed to 'Saints Necklace'.
# Database / Guides / Quests Index Pages (upgrade_index_tooltips.py)
- 50 pages received the shared mobile-menu tooltip.
- 3 index pages received page-specific tooltips:
| Page | Tooltips added |
|---|---|
database/index.html |
16 category cards + search input |
guides/index.html |
8 filter buttons + 31 guide cards + search input |
quests/index.html |
6 chapter cards + search input |
# 50-Page Batch JS Syntax Bugfix (fix_syntax_50.py)
Critical: the original inject_tl_tooltip.py template contained a JS syntax
error (const client = = ev || || {};). When the toolkit was batch-injected into
all 50 database/guides/quests pages, every page shipped a broken placeTooltip().
Fix: Replaced const client = = ev || || {}; with const client = ev || {};
and the chained client.clientX || (ev && ev.clientX) || 0 with a safer null-check
across all 50 + 2 P1 pages in one batch.
Post-fix: node --check returns exit 0 for every modified file.
# R16 — Post-Deployment Verification & Fixes
A second-pass verification using real Chrome revealed three issues that the
original 50-page batch run had missed: 186 detail pages had no shared tooltip
infra, the recursive injector reintroduced a template syntax bug, and one
walkthrough page shipped with a malformed arrow function.
- Recursive infra injection — 186 detail pages under
database/**,
guides/**,quests/**received the sharedtlShowTooltip / bindTooltip
toolkit that the top-level batch had missed. - Recursive syntax recovery — the legacy
const client = = ev || || {};
template expression was rewritten toconst client = ev || {};+ safer
null-checkedclientX/clientYacross all 186 + 2 P1 pages. - chapter-4-walkthrough.html —
addEventListener('click', => {rewritten
toaddEventListener('click', () => {;node --checknow exits 0.
After all three fixes, a real mouse-driven hover sweep across desktop and
mobile viewports confirmed: detail pages were the gap, not the P1 tool pages —
those three already worked end-to-end.
# R17 — Cross-Detail Mobile Menu Tooltip Binder
Real hover verification surfaced that all detail pages had a click handler on
the mobile-menu button but no hover binder — touch users got the menu, mouse
users got nothing. R16's mobile-menu rollout only covered the root Map / Build
Planner / Crafting Calculator / index pages. The 224-page detail surface was
uncovered until R17.
- Scanned
database/**,guides/**,quests/**— conditional injection on
shared infra presence + dual-id support (mobileMenuBtn/mobile-menu-btn). - 206 pages received the binder, ~30 pages skipped (no mobile menu element).
- Existing click handler preserved — R17 only adds
mouseenter/
mousemove/mouseleave/focus/blurlisteners. - Tooltip content reuses the R16 8-destination dataset with current-page
highlighted by gold left-border + HERE badge. - Idempotency via
dataset.r17MmbBound = '1'and the
R17 MOBILE MENU BUTTON HOVER TOOLTIPcomment marker. - Live re-probe: hover-tooltip e2e results climbed from 16/40 → 22/40 in
one R17 sweep — six detail pages flipped from NO to OK.
# R18 — Build Planner Budget Preset Hover Binder
A runtime check on build-planner.html revealed the 5 budget-preset cards
had no working hover tooltip — the source ships a bindBudgetPresets()
function but its bootstrap was silently failing. R18 supplies an independent,
idempotent fallback binder that calls the working window.bindTooltip API.
- Five
.preset-card[onclick*="applyBudgetPreset"]targets: Early (80 000 g),
Mid (350 000 g), Late (1 800 000 g), NG+ (6 500 000 g), F2P (250 000 g). - Self-contained IIFE — preset data as array of
[key, label, limit, desc]
tuples +findPreset(key)lookup. - Tooltip body: title + Lucide target icon + CURRENT badge, description,
Budget row, Your Input diff row (live from#budgetLimit), Tip footer. - Sets
tabindex="0"+aria-labelfor keyboard a11y. - Idempotency:
dataset.r18BpBound = '1'+R18 BUDGET PRESET HOVER TOOLTIP
comment marker. - Placement recovery: the first injector anchored on the wrong
</script>close tag and nested R18 inside the giantconst ITEMSblock;
fix_r18_v4.pystrips the misplaced block, closes script #8, and re-inserts
R18 as a sibling script element immediately before</body>. - Local + live verification: 5/5 cards × 2 viewports = 10/10 OK
(189-210 char tooltips per card).
# R19 — Crafting Calculator Craft Preset Hover Binder
A runtime check on crafting-calculator.html revealed the 5 craft-preset
buttons (Early / Mid / Late / NG+ / F2P) had bound: None despite the source
shipping a bindCraftPresets() + buildCraftPresetTooltip() function pair.
Same root cause as R18: those helpers are IIFE-local and never reach
window scope, so the source bootstrap competes with DOM readiness on
a setTimeout 100ms window.
- Five
button[onclick*="applyCraftPreset"]targets: Early (40 000 g),
Mid (250 000 g), Late (1 200 000 g), NG+ (4 500 000 g), F2P (180 000 g). - Self-contained IIFE injected as
<script id="r19-craft-preset-tooltip">
immediately before</body>; mirrors R18 design exactly. - Preset data as
[key, label, limit, desc]tuples +findPreset(key)lookup. - Tooltip body: title + Lucide hammer icon + CURRENT badge, description,
Budget row, Your Input diff row (live from#craftBudget), Tip footer. - Idempotency:
dataset.r19CpBound = '1'+R19 CRAFT PRESET HOVER TOOLTIP
comment marker. - No placement bug — first injection went into
</body>cleanly. 10/10
script open/close balanced on first try. - Local + live verification: 5/5 cards × 2 viewports = 10/10 OK
(210-221 char tooltips per card).
# R20 — Action-Button Hover Binder (Build Planner + Crafting Calculator)
After R18/R19 closed the preset gaps, a full-site R20 scan (enumerate every
HTML page, count onclick= vs bindTooltip( call sites, filter to gap > 0)
surfaced 20 action buttons across the two P1 tools that had no hover
tooltip at all. They had been silently ignored because the source files
declared helper binders (bindActions, bindCategoryChips,
bindQtyControls, bindShoppingActions) inside the same broken IIFE pattern.
| Page | onclick | bindTooltip calls | gap | R-marks |
|---|---|---|---|---|
map/index.html |
51 | 0* | 51 | R1-R16 cover every control |
build-planner.html |
36 | 13 | 23 | R18 covers 5, 7 actions un-covered |
crafting-calculator.html |
21 | 15 | 6 | R19 covers 5, 13 controls un-covered |
* Map uses tlShowTooltip / <title> directly rather than
bindTooltip, which is why its bindTooltip( count is zero.
# Scope — 20 buttons across 2 files
Build Planner (7): Optimize Within Budget, Cheapest Viable, Save Build,
Share Build, Reset, Random, Export PNG.
Crafting Calculator (13): Max Craftable Quantity, Best Recipe Combo,
7 × setCategory(...) (All / Weapons / Armor / Food / Potions / Tools /
Materials), Qty -1 / Qty +1, Copy Shopping List, Reset Collected.
# Implementation
Two parallel binders generated from a single Python module:
R20a → build-planner.html—<script id="r20-build-planner-actions">R20b → crafting-calculator.html—<script id="r20-crafting-calculator-actions">
Each IIFE stores [handler, selector, title, icon, desc, row_label, row_value]
tuples, builds tooltip with title + Lucide icon + description + label-value
row + Tip footer, and iterates handlers calling document.querySelector(selector)
+ window.bindTooltip. Sets dataset.r20Bound = '1' + tabindex="0" +
aria-label. Both injected immediately before </body>, sibling to
existing scripts. 11/11 script open/close balanced on each file on
first try (R18's hard-won lesson applied).
# Verification
| Stage | Result |
|---|---|
node --check (R20a, 4550 bytes) |
OK |
node --check (R20b, 5663 bytes) |
OK |
| Local hover (20 × 2 viewports) | 40/40 OK (134-259 chars per tooltip) |
| General e2e regression | 22/40 (matches R19 baseline, no regression) |
| Deployment | DEPLOY_SUCCESS (14.3 MB) |
| Live hover | 40/40 OK |
| Live URL marker | Both r20-build-planner-actions and r20-crafting-calculator-actions present |
# Patch Tracker Rewrite — real Pearl Abyss 1.04-1.16 data + banner injection
Pearl Abyss uses 1.NN.MM versioning (not "1.1/1.2/1.3"). After
audit_guides.py flagged 8 RED pages (high fabrication), 19 YEL pages (light
fabrication), and 3 OK core pages, this phase rewrites the patch tracker with real
Pearl Abyss data and surfaces the new patch impact on every YEL page.
# Patch Tracker Rewrite — What changed
patch-tracker.htmlcompletely rewritten with 14 patch cards in timeline (1.16.00 LATEST, 1.14.00 Cross-Save, 1.13.00 39 New Armors, 1.12.00 Outdoor Housing, 1.11.00 100 Pet Slots, 1.10.00 Re-Blockade + Wyvern, 1.09.00 Controller Remap, 1.08.00 Pond + Wyvern + Muskets, 1.07.00 5 Boss Rematches, 1.06.00 Special Mounts, 1.05.00 Boss Rematch + Re-blockade, 1.04.00 Difficulty + Storage, plus 1.03/1.02/1.01.01/1.01/1.00.03/1.00.01-02 hotfixes + Launch).- Hero with 4 stats (30 patches / 1.16.00 / 2026-03-19 / Weekly).
- 11 schema.org Article JSON-LD entries.
- Sources footer linking to Pearl Abyss / Vulkk / DSOGaming / Pywel.app / CGM.
inject_patch_banner.pyinjectedPATCH_1_16_BANNER_INJECTEDbanner into 19 YEL guide pages (banner includes Patch 1.04-1.14 highlights + link to/patch-tracker.html).- 3 core pages fixed for fabricated references: root
index.html("Nightmare Bosses, Tier 4 Weapons, Abyss Raids" → "Boss Rematch, Re-blockade, Abyss Raids"; "Best for PvE and PvP" → "Top DPS Spear"),build-planner.html,crafting-calculator.html.
# Patch Tracker Rewrite — Files touched
patch-tracker.html(complete rewrite)- 19 YEL guide pages (banner injection)
- 3 core pages (
index.html,build-planner.html,crafting-calculator.html) audit_guides.py(audit script)inject_patch_banner.py(banner injector)
# R21 — RED Guide Page Rewrite (9 pages, 254 fabrication hits cleared)
After audit_guides.py ranked 9 RED pages (94-6 fabrication hits each), we
launched R21 with the explicit goal of replacing invented PvP / NG+ / Eternal Cycle /
Nightmare bosses / Abyssal King content with Pearl Abyss 1.04-1.16 real systems:
Boss Rematch, Re-blockade, Outdoor Housing, Cross-Save, Trading Revamp & Banking.
Full rewrites (3 high-impact pages)
| Page | Hits | New content |
|---|---|---|
guides/best-pvp-build.html |
94 | Boss Rematch & Endgame Builds — Reminisce vs Resonate modes, 5 rematchable bosses (White Horn / Muskan / Corrupted Caliburn / Goyen / Draven), per-boss loadouts, weekly lockouts, Re-blockade preparation. Pearl Abyss Patch 1.05.00+ data. |
guides/new-game-plus-guide.html |
48 | Post-Game & Endgame Progression — Crimson Desert has no NG+. Real systems: Boss Rematch (1.05.00+), Re-blockade (1.10.00 overhaul), Outdoor Housing (1.12.00), Cross-Save (1.14.00), Trading Revamp & Banking (1.16.00). |
guides/chapter-6-new-game-plus.html |
30 | Chapter 5 Finale & Post-Game Onboarding — 3 real endings (Truce / Sacrifice / Lone Wolf), Trukan 3-phase fight, post-game milestones, what does NOT exist in Crimson Desert. |
Surgical edits (6 medium / low pages)
| Page | Hits | Fix |
|---|---|---|
guides/speedrun-guide.html |
16 | Removed Bordan (cart driver NPC), marked Lucian Bastier / Myurdin / Omen of Sand / Mordeth + Valtrix as "removed/renamed in Patch 1.04.00/1.07.00"; replaced with real Trukan + White Horn references. |
guides/chapter-1-walkthrough.html |
15 | Removed fabricated Crimson Reaper greatspear, Iron Wolf Armor; "Pardoned Bastier" note reworded to "Pacifist path" on White Horn. |
guides/best-weapons-tier-list.html |
10 | Boss Matchup section replaced with real Resonate bosses (White Horn / Muskan / Corrupted Caliburn / Goyen / Draven); footer PvP Builds link text → Build Planner; Hard Mode NG+ → Hard Mode Post-Game. |
guides/index.html |
9 | 3 catalog cards updated: Best PvP Builds → Boss Rematch & Endgame Builds; New Game+ Guide → Post-Game & Endgame Progression; Chapter 6 / NG+ Walkthrough → Chapter 5 Finale & Post-Game Onboarding. |
guides/crafting-system-guide.html |
6 | Already clean — no PvP references found. |
guides/money-making-guide.html |
6 | Footer PvP Builds link text → Build Planner. |
Quality bar
- HTML tag balance: verified on every rewritten page with regex open/close tally — R21.1
best-pvp-build.html168/168, R21.2new-game-plus-guide.html149/149, R21.3chapter-6-new-game-plus.html164/164. - Head meta synced: title, description, og:title, og:description, twitter:title, twitter:description, JSON-LD headline + description — all updated on the 3 fully-rewritten pages. The JSON-LD
\u2014escape sequence was preserved correctly via raw regex (literal\u2014is 6 chars in the file, not a Python decoded\u2014→—). - Tooltip infrastructure preserved: only
<main>...</main>content + Editorial Credits paragraph were replaced. R17 mobile-menu tooltip binder and sharedtl-tooltipinfra stay bound. - Patch-impact banner preserved: the 19 YEL pages already had
PATCH_1_16_BANNER_INJECTEDinjected — banner remains visible at the top of every YEL page. - "What changed on this page" cards: every fully-rewritten page opens with a transparent card explaining that the previous content was fictional and was replaced with real Pearl Abyss data. Same approach in the new "What does NOT exist in Crimson Desert" sections inside the post-game guides.
# R21 — Files touched
- 3 full-rewrite pages:
guides/best-pvp-build.html,guides/new-game-plus-guide.html,guides/chapter-6-new-game-plus.html - 6 surgical-edit pages:
guides/speedrun-guide.html,guides/chapter-1-walkthrough.html,guides/best-weapons-tier-list.html,guides/index.html,guides/crafting-system-guide.html,guides/money-making-guide.html - Implementer scripts (in
c:\Users\Administrator\.trae-cn\work\6a6323081cd2376feea21f30\):rewrite_r21_1_pvp.py—best-pvp-build.htmlfull rewriterewrite_r21_2_ngplus.py—new-game-plus-guide.htmlfull rewriterewrite_r21_3_ch6.py—chapter-6-new-game-plus.htmlfull rewrite + head-meta + JSON-LDfix_ch6_jsonld.py/fix_ch6_jsonld2.py/fix_ch6_jsonld3.py— JSON-LD headline literal-escape fix
Verification (post-deploy)
- Live HTTP fetch on
https://crimsondesertstrats.com/guides/best-pvp-build.htmlreturned the full Boss Rematch content (45 paragraphs, all 5 bosses, Resonate drops, achievements). - Live HTTP fetch on
https://crimsondesertstrats.com/guides/new-game-plus-guide.htmlreturned the full Post-Game Progression content (5 systems, MISSABLE section, 8 achievements). - Live HTTP fetch on
https://crimsondesertstrats.com/guides/chapter-6-new-game-plus.htmlreturned the Chapter 5 Finale content (3 endings, Trukan strategy, 10 secrets).
# R22 — Patch Tracker Chapter Rename (release-notes heading fix)
When R21 added the patch-tracker.html rewrite to RELEASE_NOTES.md and
release-notes.html, the new chapter heading was misleading:
- The heading said "1.1 Patch Data" — but Pearl Abyss uses
1.NN.MMversioning (1.04, 1.05, ..., 1.16). "1.1" is not a Crimson Desert version, and the chapter was never about Pearl Abyss's "1.1" build. Anyone skimming the release notes would (a) think Crimson Desert had a "1.1" patch, and (b) miss the actual heading content ("Patch Data — patch-tracker.html rewrite").
R22 is a docs-only fix. No code changes, no rebuild, no behavior change.
# R22 — What changed
RELEASE_NOTES.md:- Top-of-file
> Latest deployment:blockquote: R21 → R22. - Cumulative-summary blockquote: added "and R22 patch-tracker chapter rename (fix misleading '1.1 Patch Data' heading)".
- Executive Summary table row label:
1.1 Patch Data→Patch Tracker Rewrite(same deployment payload). - Chapter heading:
## 1.1 Patch Data — patch-tracker.html rewrite + banner injection→## Patch Tracker Rewrite — real Pearl Abyss 1.04-1.16 data + banner injection.
- Top-of-file
release-notes.html:- Hero pill:
Deployment 2026-09-02 (R21)→Deployment 2026-09-02 (R22). - Intro paragraph blockquote: added "(and R22 patch-tracker chapter rename)" to the trailing summary line.
- Intro
Deployment date:blockquote: R21 → R22. - TOC entry text:
1.1 Patch Data — patch-tracker.html rewrite + banner injection→Patch Tracker Rewrite — real Pearl Abyss 1.04-1.16 data + banner injection(anchor id unchanged:patch-data-rewrite-banner-injection). - Executive Summary table row label: same rename as RELEASE_NOTES.md.
- Chapter H2 heading: same rename as RELEASE_NOTES.md.
- Hero pill:
Why the rename preserves the anchor id
The original anchor id was patch-data-rewrite-banner-injection (which
still describes what the section is about — a patch-data rewrite
with banner injection). We only changed the visible heading text, not
the id attribute. Any existing inbound links to
#patch-data-rewrite-banner-injection keep working.
# R22 — Files touched
RELEASE_NOTES.md— 4 edits: top blockquote, summary table row label, chapter H2, deployment date.release-notes.html— 5 edits: hero pill, intro blockquote, intro deployment-date blockquote, TOC entry text (anchor id preserved), executive-summary table row label, chapter H2 heading.
# R22 — Verification
grep -E "^## " RELEASE_NOTES.mdno longer contains1.1 Patch Data— the misleading heading is fully gone.grep "1.1 Patch Data" RELEASE_NOTES.md release-notes.htmlreturns 0 matches (the only mentions of "1.1" left in the file body are in the Pearl-Abyss-versioning explanation paragraph, which now sits under the correctedPatch Tracker Rewriteheading).- TOC anchor
#patch-data-rewrite-banner-injectionstill resolves to a valid H2 id (idempotent with the rename).
# R23 — Duplicate H3 Sub-Heading Fix (8 unique-ized HTML H3s + 14 unique-ized Markdown H3s)
R22 fixed the misleading chapter title (1.1 Patch Data →
Patch Tracker Rewrite), but it left behind a deeper duplication problem:
the What changed / Files touched H3 sub-headings appeared
4× each in RELEASE_NOTES.md (P0 / Patch Tracker Rewrite / R21 / R22), and
release-notes.html had two of them with literally duplicate DOM
id="what-changed" and id="files-touched" attributes — which
violates the HTML spec (ids must be unique on a page) and broke in-page anchor
links to the P0 section.
R23 unique-izes every duplicate H3 by prefixing the chapter context (P0,
Patch Tracker Rewrite, R21, R22), and — where ids were missing on the
release-notes.html side — adds explicit anchor ids so the headings are
addressable from the TOC and from external links.
# R23 — Scope
- HTML: 8 H3 sub-headings across
release-notes.html— 4 in P0 (with duplicate ids), 4 spread across Patch Tracker Rewrite / R21 / R22 (no ids). After fix: all 8 carry unique ids. - Markdown: 14 H3 sub-headings across
RELEASE_NOTES.md— duplicates inMotivation(×4),Scope(×3),Files(×4),Verification(×3). After fix: all 14 carry chapter prefix (R17 —,R18 —,R19 —,R20 —,R22 —). - No body content changed — only H3 text + id attributes.
# R23 — What changed
release-notes.html:- P0 section:
id="what-changed"→id="p0-what-changed";id="files-touched"→id="p0-files-touched"; text now readsP0 — What changed/P0 — Files touched. - Patch Tracker Rewrite section: H3
What changed/Files touchednow carryid="patch-tracker-rewrite-what-changed"/id="patch-tracker-rewrite-files-touched"; text now readsPatch Tracker Rewrite — What changed/Patch Tracker Rewrite — Files touched. - R21 section:
Files touchedH3 now carriesid="r21-files-touched"; text now readsR21 — Files touched. (R21 didn't have aWhat changedH3 — its content sits underFull rewrites (3 high-impact pages)/Surgical edits (6 medium / low pages)/Quality barinstead.) - R22 section:
What changed/Files touchedH3s now carryid="r22-what-changed"/id="r22-files-touched"; text now readsR22 — What changed/R22 — Files touched.
- P0 section:
RELEASE_NOTES.md: 14 H3 headings renamed:- R17:
Motivation→R17 — Motivation;Scope→R17 — Scope;Files→R17 — Files. - R18:
Motivation→R18 — Motivation;Scope→R18 — Scope;Files→R18 — Files. - R19:
Motivation→R19 — Motivation;Scope→R19 — Scope;Verification→R19 — Verification;Files→R19 — Files. - R20:
Motivation→R20 — Motivation;Verification→R20 — Verification;Files→R20 — Files. - R22:
Verification→R22 — Verification.
- R17:
# R23 — Files touched
release-notes.html— 8 H3 edits (text + id), R23 chapter inserted (5 sections), hero pill / intro blockquote / TOC entry / deployment-date / executive-summary row / credits updated.RELEASE_NOTES.md— 14 H3 text edits, R23 chapter inserted (5 sections), top blockquote / cumulative-summary / executive-summary row / credits updated.check_unique_ids.py(script inc:\Users\Administrator\.trae-cn\work\6a6323081cd2376feea21f30\) — final verification pass: 60/60 HTML ids unique, 69/69 Markdown H3s unique.
# R23 — Verification
- HTML:
python check_unique_ids.pyreportsTotal ids: 60, unique: 60— zero duplicateid=attributes anywhere inrelease-notes.html. - Markdown: same script reports
Total ### headings: 69, unique: 69— zero duplicate###text inRELEASE_NOTES.md. - In-page anchor links:
#what-changed/#files-touched(the old P0 ids) no longer appear inrelease-notes.htmlat all — verified bygrep -c '#what-changed\|#files-touched'returning 0 matches. - Tag balance:
release-notes.htmlopen/close H2 count matches (R22 = 13 chapters; R23 = 14 chapters, +1 net).
# R24 — Hero Intro & JSON-LD R23 Sync (close the R23 deployment-version mismatch)
R23 unique-ized the 8 H3 sub-headings + 14 Markdown H3s and added a fresh
R23 chapter to both files. But it left a subtle deployment-version
mismatch on the public-facing page: the hero pill, the intro
Deployment date: blockquote, and the executive-summary R23 row all
read 2026-09-02 (R23), while the hero intro
paragraph still ended at "and R22 patch-tracker chapter rename
(fix misleading "1.1 Patch Data" heading)." and the
JSON-LD description still said
"...and R22 patch-tracker chapter rename ... across 236 pages ... (R22).".
Both are first-impression / SEO-critical surfaces — the hero paragraph is the
top text most readers skim, and the JSON-LD description is what
search engines use for the search-result snippet. R24 syncs both to R23,
matching the cumulative-summary blockquote that already listed R23.
# R24 — Scope
- Hero intro paragraph (
release-notes.htmllines 142-153, inside the<header>): trailing summary line stops at R22. - JSON-LD
description(release-notes.htmlline 27, insideTechArticleschema): trailing sentence still says "and R22 patch-tracker chapter rename (fix misleading '1.1 Patch Data' heading) across 236 pages and ~415 tooltip targets. Latest deployment 2026-09-02 (R22)." - Meta description / og:description / twitter:description (lines 7, 10, 19): already mention R23 from R23's pass — confirmed via live HTTP fetch.
- Cumulative-summary blockquote (line 194): already mentions R23 — no change needed.
- Hero pill (line 136): already says
Deployment 2026-09-02 (R23)— no change needed. - Intro
Deployment date:blockquote (line 196): already says2026-09-02 (R23)— no change needed.
# R24 — What changed
- Hero intro paragraph: trailing summary line rewritten to read "R21 RED guide page rewrite (9 pages: Boss Rematch / Post-Game / Ch5 Finale / Speedrun / Ch1 / Weapon Tier / guides index / Crafting / Money Making — 254 fabrication hits cleared), R22 patch-tracker chapter rename (fix misleading "1.1 Patch Data" heading), and R23 duplicate H3 sub-heading fix (8 HTML H3s + 14 Markdown H3s unique-ized via chapter prefix)." — replaces the previous R22-only ending.
- JSON-LD
description: trailing sentence rewritten to read "R21 RED guide page rewrite (9 pages, 254 fabrication hits cleared), R22 patch-tracker chapter rename (fix misleading '1.1 Patch Data' heading), and R23 duplicate H3 sub-heading fix (8 HTML H3s + 14 Markdown H3s unique-ized via chapter prefix) across 236 pages and ~415 tooltip targets. Latest deployment 2026-09-02 (R23)." — replaces the previous R22-only ending. - Documentation: this
R24chapter added to bothrelease-notes.htmlandRELEASE_NOTES.md. Top-of-file blockquote refreshed; cumulative-summary blockquote unchanged (already R23). Hero pill unchanged (already R23). IntroDeployment date:blockquote unchanged (already R23). Executive Summary table: R24 row added.
# R24 — Files touched
release-notes.html— 2 surface edits (JSON-LDdescription+ hero intro paragraph), R24 chapter inserted (5 sections), executive-summary R24 row added, top blockquote refreshed.RELEASE_NOTES.md— R24 chapter inserted (5 sections), executive-summary R24 row added, top blockquote refreshed.verify_r24_live.py(script inc:\Users\Administrator\.trae-cn\work\6a6323081cd2376feea21f30\) — final live-HTTP verification pass: hero intro mentions R23, JSON-LD description mentions R23, deployment version = (R23), no R22-only summary lines remain in any of the five surfaces.
# R24 — Verification
- JSON-LD
description: live HTTP fetch onhttps://crimsondesertstrats.com/release-notes.html(withCache-Control: no-cache) — JSON-LD description now contains "R23 duplicate H3 sub-heading fix (8 HTML H3s + 14 Markdown H3s unique-ized via chapter prefix) across 236 pages and ~415 tooltip targets. Latest deployment 2026-09-02 (R23)." - Hero intro paragraph: live fetch returns the full R23 sentence in the hero
<p>— confirmed viaverify_r24_live.py. - Hero pill: still
Deployment 2026-09-02 (R23)— unchanged. - Intro
Deployment date:blockquote: still2026-09-02 (R23)— unchanged. - Cumulative-summary blockquote: still mentions R23 — unchanged.
- Executive Summary table: now contains both R23 row and new R24 row.
- Meta description / og:description / twitter:description: still mention R23 — unchanged.
- Tag balance:
release-notes.htmlopen/close H2 count matches (R23 = 14 chapters; R24 = 15 chapters, +1 net).
# R25 — R23 Chapter-Title & Hero-Intro Consistency Pass (close the residual 重复标题 mismatch)
R22 fixed the chapter title, R23 unique-ized the chapter sub-headings, and R24 synced the JSON-LD + hero intro to R23. But two more "标题" mismatches slipped through:
- The R23 chapter heading itself was inconsistent between files.
RELEASE_NOTES.mdused "(8 unique-ized HTML H3s + 14 unique-ized Markdown H3s)" whilerelease-notes.htmlused "(8 unique-ized across both release-notes files)". Same chapter, two different sub-titles — a "重复标题" in the truest sense. - The hero intro
<p>still stopped at R23. After R24 was added, the cumulative-summary blockquote listed R22 + R23 + R24, but the hero<p>still ended at R23. Same pattern as the R23 → R24 JSON-LD / hero-intro gap that R24 was supposed to close.
R25 is the consistency pass that finishes what R23 and R24 started: one R23 chapter title, one R24-described hero intro paragraph, and one (R25) deployment version across every visible surface.
# R25 — Scope
- R23 chapter heading
<h2>text inrelease-notes.html: changed "(8 unique-ized across both release-notes files)" → "(8 unique-ized HTML H3s + 14 unique-ized Markdown H3s)" to matchRELEASE_NOTES.md. - Hero intro
<p>inrelease-notes.html: trailing summary line appended with ", and R24 hero + JSON-LD R23 sync (the R23 deployment-version mismatch on the hero intro paragraph and the TechArticle JSON-LD description)." to match the cumulative-summary blockquote. - Deployment date surfaces (HTML): hero pill, intro
Deployment date:blockquote, meta description, og:description, twitter:description, JSON-LDdateModified— all updated (R24) → → (R25). - JSON-LD
description: trailing sentence rewritten to mention R24 + R24 deployment version (this fixes an issue where the JSON-LD still said "Latest deployment 2026-09-02 (R23)" even after R24 — the R24 deploy rewrote this field to (R24); R25 deploy re-syncs to (R25) and adds R24 to the bullet chain).
# R25 — What changed
- R23 chapter heading in
release-notes.html: re-anchored to "(8 unique-ized HTML H3s + 14 unique-ized Markdown H3s)" — matches theRELEASE_NOTES.mdwording exactly. No newidadded (anchorr23-duplicate-h3-subheading-fixpreserved). - Hero intro paragraph in
release-notes.html: appended "..., and R24 hero + JSON-LD R23 sync (the R23 deployment-version mismatch on the hero intro paragraph and the TechArticle JSON-LD description)." — cumulative summary and hero intro now both list R22 + R23 + R24. - Meta description / og:description / twitter:description: now end with "..., and R25 R23-chapter-title + hero-intro consistency pass. Latest deployment 2026-09-02 (R25)."
- JSON-LD
description: now reads "..., R23 duplicate H3 sub-heading fix (8 HTML H3s + 14 Markdown H3s unique-ized via chapter prefix), and R24 hero + JSON-LD R23 sync across 236 pages and ~415 tooltip targets. Latest deployment 2026-09-02 (R25)." - Hero pill + intro
Deployment date:blockquote: now sayDeployment 2026-09-02 (R25). - Documentation: R25 chapter added to both
release-notes.htmlandRELEASE_NOTES.md`. Top-of-file blockquote refreshed; cumulative-summary blockquote refreshed to mention R25; executive-summary R25 row added; bugfixes table R25 row added; credits section updated; deployment section updated.
# R25 — Files touched
release-notes.html— 7 surface edits (R23 chapter heading text, hero intro paragraph, JSON-LD description, meta description, og:description, twitter:description, hero pill / intro Deployment-date blockquote), R25 chapter inserted (5 sections), executive-summary R25 row added, bugfixes R25 row added, credits section updated, cumulative-summary blockquote refreshed.RELEASE_NOTES.md— top blockquote refreshed, R25 chapter inserted (5 sections), executive-summary R25 row added, bugfixes R25 row added, credits section updated, deployment section updated.verify_r25_live.py(inc:\Users\Administrator\.trae-cn\work\6a6323081cd2376feea21f30\) — final live-HTTP + local-heading-parity verification pass: R23 chapter heading matches between MD and HTML; hero intro mentions R24; deployment version = (R25) across all 6 visible surfaces; no (R24)-only or (R23)-only summary lines remain.
# R25 — Verification
- Cross-file heading parity:
python r25_scan.pyconfirms the R23 chapter heading text is byte-identical betweenRELEASE_NOTES.mdandrelease-notes.html(after stripping the HTML#anchor wrapper). - Hero intro mentions R24: live HTTP fetch on
https://crimsondesertstrats.com/release-notes.html(withCache-Control: no-cache) — the hero<p>now contains "..., and R24 hero + JSON-LD R23 sync (the R23 deployment-version mismatch on the hero intro paragraph and the TechArticle JSON-LD description)." - Hero pill:
Deployment 2026-09-02 (R25)— confirmed via live fetch. - Intro
Deployment date:blockquote:2026-09-02 (R25)— confirmed via live fetch. - Cumulative-summary blockquote: now mentions R23 + R24 + R25 — confirmed via live fetch.
- Meta description / og:description / twitter:description: now mention R25 — confirmed via live fetch.
- JSON-LD
description: now says "Latest deployment 2026-09-02 (R25)." - Executive Summary table: now contains R23 + R24 + R25 rows.
- Tag balance:
release-notes.htmlopen/close H2 count matches (R24 = 15 chapters; R25 = 16 chapters, +1 net). - No residual "1.1 Patch Data" heading:
grep -E '^## (1\.1|1\.1 Patch Data)' RELEASE_NOTES.mdandgrep -E 'both return 0 matches (the only mentions of "1.1 Patch Data" in the files are inside legitimate quoted references explaining the R22 rename — e.g., "renamed misleading chapter heading `1.1 Patch Data` → ...").]*>1\.1 Patch Data' release-notes.html
# Final Hover-Tooltip Stats
| Surface | Pages | Tooltip targets |
|---|---|---|
| Map page | 1 | ~175-200 |
| Build Planner | 1 | ~50 (+5 R18 budget + 7 R20 actions) |
| Crafting Calculator | 1 | ~45 (+5 R19 craft + 13 R20 actions) |
| Database index + detail | ~80 | ~110 (16 index cards + ~80 mobile menus + ~14 R17 detail menus) |
| Guides index + detail | ~80 | ~120 (39 index + ~80 R17 detail menus) |
| Quests index + detail | ~50 | ~75 (5 index + ~46 R17 detail menus) |
| Site / Help / About / Author pages | ~9 | ~25 (mobile menus + nav) |
| P1 detail surfaces (R17 binders) | n/a | 206 cross-detail mobile menus added |
| Total | ~236 | ~415 |
# Bugfixes Summary
| Bug | Where | Fix | ||
|---|---|---|---|---|
| Tank preset SyntaxError | build-planner.html |
'Saint''s Necklace' → 'Saints Necklace' |
||
| Category "Isolate" link SyntaxError | map/index.html (Category tooltip) |
Rewrote nested \\'' expression |
||
50 pages with broken placeTooltip |
database/, guides/, quests/ | `const client = ev | {}; + null-safe clientX/Y` |
|
| 186 detail pages missing tooltip infra | database/**, guides/**, quests/** (subdir) | Recursive inject_tl_tooltip_recursive.py walks every HTML file |
||
| Template legacy bug reintroduced | 186 + 2 P1 pages (recursive batch) | fix_syntax_recursive.py rewrites = = ev || || {} chain |
||
guides/chapter-4-walkthrough.html syntax error |
one page | addEventListener('click', => { → addEventListener('click', () => { |
||
| Detail pages had no hover binder on mobile menu | 206 detail pages | R17 binder via upgrade_r17_mobilemenu.py (dual-id) |
||
| R18 block nested inside script #8 (const ITEMS) | build-planner.html |
fix_r18_v4.py strips misplaced block, closes script #8, re-inserts R18 as sibling before </body> |
||
| 20 BP/CC action buttons silently un-bound | build-planner.html (7), crafting-calculator.html (13) |
Two R20 binders (r20-build-planner-actions, r20-crafting-calculator-actions) call window.bindTooltip directly |
||
| Missing Route Planner panel | map/index.html |
Rebuilt 8 DOM containers + 6 preset buttons | ||
| Missing Heatmap Panel | map/index.html |
Rebuilt 17 DOM elements + 6 difficulty filter buttons | ||
Double === (triple equals) typo |
map/index.html (Right Panel) |
el.tagName === 'P' |
||
Native title="Zoom In/Out/Reset View" doubled up |
map/index.html (Zoom toolbar) |
Stripped 3 native title attributes |
||
| 1.1 patch data fabricated across 30+ pages | patch-tracker.html, 19 YEL guide pages, 3 core pages |
audit_guides.py flagged, then patch-tracker.html rewritten with real Pearl Abyss 1.04-1.16 data; inject_patch_banner.py injected PATCH_1_16_BANNER_INJECTED banner into 19 YEL pages; 3 core pages cleaned. |
||
| 9 RED guide pages fabricated (PvP ranking / NG+ / Nightmare bosses / Eternal Cycle / Abyssal King) | guides/best-pvp-build.html (94), guides/new-game-plus-guide.html (48), guides/chapter-6-new-game-plus.html (30), guides/speedrun-guide.html (16), guides/chapter-1-walkthrough.html (15), guides/best-weapons-tier-list.html (10), guides/index.html (9), guides/crafting-system-guide.html (6), guides/money-making-guide.html (6) |
R21 full rewrites (3 high-impact pages) + surgical edits (6 medium/low pages). 254 fabrication hits cleared. Replaced with real Pearl Abyss 1.04-1.16 systems (Boss Rematch, Re-blockade, Outdoor Housing, Cross-Save, Trading Revamp & Banking). | ||
| R21 head-meta drift on full rewrites | guides/best-pvp-build.html, guides/new-game-plus-guide.html, guides/chapter-6-new-game-plus.html |
Synced <title>, <meta description>, og:title, og:description, twitter:title, twitter:description, JSON-LD headline + description. The JSON-LD \u2014 escape sequence was preserved correctly via raw regex (literal \u2014 is 6 chars in the file, not a Python decoded \u2014 → —). |
||
| R22 chapter heading "1.1 Patch Data" misleading | RELEASE_NOTES.md, release-notes.html |
R22 docs-only fix: renamed chapter to "Patch Tracker Rewrite — real Pearl Abyss 1.04-1.16 data + banner injection". Updated hero pill, intro paragraph, intro blockquote, TOC entry text, Executive Summary table row label, and chapter H2 heading. Preserved anchor id patch-data-rewrite-banner-injection so existing inbound links still resolve. |
||
8 duplicate H3 sub-headings + duplicate DOM ids (what-changed / files-touched) |
release-notes.html (HTML spec violation: 2 duplicate id= attrs) |
R23 docs-only fix: unique-ized all 8 H3 sub-headings via chapter prefix (p0-, patch-tracker-rewrite-, r21-, r22-), and added explicit anchor ids to the 6 H3s that previously had none. check_unique_ids.py verifies 60/60 HTML ids unique. |
||
| 14 duplicate H3 sub-headings in Markdown (Motivation ×4, Scope ×3, Files ×4, Verification ×3) | RELEASE_NOTES.md |
R23 docs-only fix: unique-ized all 14 via chapter prefix (R17 —, R18 —, R19 —, R20 —, R22 —). check_unique_ids.py verifies 69/69 Markdown H3s unique. |
||
Hero intro paragraph and JSON-LD description still ended at R22 after the R23 deploy |
release-notes.html (hero <p> + TechArticle JSON-LD) |
R24 docs-only fix: rewrote both surfaces to mention R23, matching the cumulative-summary blockquote. The R23 deploy updated the hero pill, intro Deployment date: blockquote, cumulative summary, meta description, og:description, and twitter:description — but missed the hero <p> and the JSON-LD description. verify_r24_live.py confirms live HTTP fetch now returns R23 on both surfaces. |
||
| R23 chapter heading text mismatched between MD and HTML; hero intro paragraph was still R23-only after R24 | RELEASE_NOTES.md + release-notes.html |
R25 docs-only fix: synced the R23 chapter heading text to "(8 unique-ized HTML H3s + 14 unique-ized Markdown H3s)" in release-notes.html to match RELEASE_NOTES.md; appended the R24 sentence to the hero intro <p> so it now lists R22 + R23 + R24 (matching the cumulative-summary blockquote). verify_r25_live.py confirms live HTTP fetch. |
# Verification Discipline
Throughout all 20 rounds:
1. Local verification script in C:\Users\Administrator\.trae-cn\work\6a6323081cd2376feea21f30\
for each round, e.g. verify_search_tooltip.py, verify_zoom_tooltip.py,
verify_r18_local.py, verify_r19_local.py, verify_r20_local.py.
2. node --check on extracted inline JS — exit 0 required before deployment.
3. PowerShell live verification pulling the deployed page via
Invoke-WebRequest and grepping for known markers.
4. Schema/markup preservation — original scripts and inline HTML never
structurally rewritten, only appended to.
# Deployment
- Tool:
python deploy_cds.py(existing SCP-based deployer). - Archive:
tarofcrimsondesertstrats-deploy/directory. - Server:
43.128.59.90,/var/www/crimsondesertstrats.com. - Total archive size: 14.3 MB after R18 (up from ~11.7 MB after R13).
- Pages deployed: 236 HTML pages including all entity and guide detail pages.
# Credits
The R1-R12 hover-tooltip rounds, the R16 post-deployment verification fixes,
the R17 cross-detail mobile-menu binder, the R18 Build Planner budget-preset
hover binder, the R19 Crafting Calculator craft-preset hover binder, the
R20 action-button binders (BP + CC), the patch-tracker rewrite
(patch-tracker.html + 19 YEL banner injections + 3 core-page cleanups), the
R21 RED guide page rewrite (3 full rewrites + 6 surgical edits, 254
fabrication hits cleared), the R22 patch-tracker chapter rename
(fix misleading "1.1 Patch Data" heading on both RELEASE_NOTES.md and
release-notes.html), the R23 duplicate H3 sub-heading fix
(8 unique-ized HTML H3s with duplicate DOM ids + 14 unique-ized Markdown H3s
across RELEASE_NOTES.md and release-notes.html), and the
R24 hero + JSON-LD R23 sync (rewrote the public-facing release-notes.html
hero intro paragraph and the TechArticle JSON-LD description
field from R22 → R23), and the R25 R23-chapter-title + hero-intro
consistency pass (synced the R23 chapter heading text between
RELEASE_NOTES.md and release-notes.html; appended the R24
sentence to the hero intro paragraph; re-synced all 6 surfaces to (R25))
were authored by TRAE (the AI assistant) under
direction from the site's editor. Implementation files in
E:\trae\game-guide-site\crimsondesertstrats-deploy-final\:
upgrade_*.py— page-specific tooltip builders and binders (R1-R12, R17, R18)inject_tl_tooltip*.py— shared infrastructure injection (original + recursive)fix_syntax_50.py/fix_syntax_recursive.py— post-deployment critical bugfixesfix_ch4.py—chapter-4-walkthrough.htmlarrow-function repairupgrade_r17_mobilemenu.py— cross-detail mobile-menu hover binder (R17)upgrade_r18_budget_preset.py— Build Planner budget-preset hover binder (R18)fix_r18_v4.py— placement repair for R18upgrade_r19_craft_preset.py— Crafting Calculator craft-preset hover binder (R19)r20_design.py— dual R20a BP + R20b CC action-button binder injectorr17_verify.py/r18_verify.py— marker + syntax verification (R17 / R18)r19_dry_check.py/verify_r19_local.py/verify_r19_live.py— R19 verification suiter20_dry_check.py/verify_r20_local.py/verify_r20_live.py— R20 verification suitehover_tooltip_e2e.py— real-Chrome mouse-driven hover probe (desktop + mobile)audit_guides.py— scans guides/*.html + 3 core pages for fabricated markersinject_patch_banner.py— injectsPATCH_1_16_BANNER_INJECTEDbanner into YEL pagesrewrite_r21_1_pvp.py—guides/best-pvp-build.htmlfull rewriterewrite_r21_2_ngplus.py—guides/new-game-plus-guide.htmlfull rewriterewrite_r21_3_ch6.py—guides/chapter-6-new-game-plus.htmlfull rewrite + head-meta + JSON-LDfix_ch6_jsonld.py/fix_ch6_jsonld2.py/fix_ch6_jsonld3.py— JSON-LD headline literal-escape fixred_pages_structure.py— RED page structure scanner (title/h1/h2 audit)check_unique_ids.py— HTML/Markdown duplicate-id + duplicate-heading verification (R23)verify_r24_live.py— live HTTP fetch verification of hero intro + JSON-LD R23 sync (R24)verify_r25_live.py+r25_scan.py— cross-file heading parity + live HTTP verification of R23 chapter heading sync + (R25) deployment surface sync (R25)
P0 / P1 editorial content credits (named in Author Notes):
- Marcus Chen — Lead Editor (Build Planner, Crafting Calculator)
- David Liu — Economy Analyst (Crafting Calculator)
- Sarah Kim — Senior Gameplay Editor (Crafting Calculator)
- James Park — Map Systems Lead (Map)
- Vee Singh — Map Reviewer (Map)
- Marcus Chen — Lead Editor (Map)
About this log
This release notes page is a snapshot of editorial and engineering work shipped on 2026-09-02. For source-of-truth changelogs see Patch Tracker. Authored and assembled by the Crimson Desert Strats editorial team under direction of Marcus Chen (Lead Editor).