feat(ai-atlas): the push sets the map, the cards and every page word - #243
Conversation
…s the cross-vendor review Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
A push may carry cards (card id to paragraphs); a card listed there replaces its copy in features.ts, so text edits reach /ai-atlas without a build. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
Claude finished @manager's task in 2m 17s —— View job Reviewing PR #243
SummarySmall, well-scoped diff (27/-8 across 3 files). No inline comments — nothing rose to a real issue. What I checked:
Minor, non-blocking observation: No AGENTS.md convention violations (barrel files, import order, App Router patterns, styling, etc.) — this diff doesn't touch components or styles. |
A push may now carry, beside cards: - stages: per stage, in step order, a label and up to three tiles; - copy: any page text key (copy.json strings, ring and node labels, SEO title and description) mapped to new text. Each is validated before storing; the map keeps its built-in selection and words for anything the push leaves out. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
Claude finished @manager's task in 3m 3s —— View job Reviewing PR #243
SummaryThis PR grew since the earlier automated pass on this branch: a third commit ("the Terminal's push sets the map and every page word") landed on top and now lets a push replace One inline finding on What else I checked, no issues found:
Could not run |
| ([key, words]) => | ||
| PAGE_TEXT_KEYS.has(key) && | ||
| typeof words === 'string' && | ||
| words.length <= 4000, |
There was a problem hiding this comment.
isCopy applies one blanket <= 4000 cap to every PAGE_TEXT_KEYS entry, but those keys aren't all the same kind of text. Several are short labels rendered in small fixed-size map nodes — apexLabel, orderLabel, resourceAgents/Memory/Tools/Models, the four ring*Label keys — via NodeBody's <foreignObject ... style={{ overflow: 'visible' }}> (src/pages/ai-atlas.tsx:234-239). A pushed value near the 4000-char ceiling for one of these would render as unclipped overflowing text across the circular Atlas map, since overflow: visible doesn't truncate. stagesError right below already caps stage.label at 40 chars for exactly this reason (arc width) — the same discipline isn't applied here.
Separately, words.length <= 4000 doesn't require words.length > 0, so an empty string passes. Unlike card paragraphs (isCards), which get .filter(Boolean)-ed downstream by DossierDesc, these copy values are consumed directly (text(key) in adapter.ts uses ??, so '' isn't replaced by the default) and include seoTitle/seoDescription/ogImageAlt (confirmed plain strings in copy.json). A pushed empty seoDescription would blank the page's meta description/OG tags, not just a UI label.
Consider per-key max lengths (short label keys vs. long-form seoDescription/ringDevEnvDesc/etc.) and words.length > 0 in isCopy.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
Claude finished @manager's task in 2m 28s —— View job Reviewing PR #243
SummaryThe branch grew by one more commit since the last automated pass:
One new finding (posted inline on Re-verified, still hold from earlier passes:
Could not run |
| export const SHORT_LABEL_KEYS = new Set([ | ||
| 'apexLabel', | ||
| 'apexSub', | ||
| 'orderLabel', | ||
| 'resourceAgents', | ||
| 'resourceMemory', | ||
| 'resourceTools', | ||
| 'resourceModels', | ||
| 'ringOrderLabel', | ||
| 'ringDevEnvLabel', | ||
| 'ringProjectsLabel', | ||
| 'ringTerritoriesLabel', | ||
| 'metaLabel', | ||
| 'topicsPlaceholder', | ||
| ]); |
There was a problem hiding this comment.
Good fix for the map-node overflow risk, but brandTitle is missing from this list. It renders in the same .doc-header .header-left row as metaLabel (src/pages/ai-atlas.tsx:1546-1559), and that row is white-space: nowrap with no overflow handling (src/styles/ai-atlas.css:116-133). brandTitle is also run through .split(' ').map(w => w.toUpperCase().split('').join(' ')).join(' · ') before rendering (ai-atlas.tsx:1549-1552), which inserts a space between every letter — so a pushed value near the 4000-char general cap would blow out to several times its length and overflow the header, the same failure mode metaLabel/apexLabel/etc. were just capped to prevent.
Since brandTitle sits in the identical nowrap row as metaLabel, it should get the same SHORT_LABEL_MAX treatment.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
Claude finished @manager's task in 40s —— View job Reviewing PR #243
SummaryThe branch gained one more commit since the last automated pass: Verified the fix closes the loop correctly, not just cosmetically:
All findings from the three earlier passes on this branch are now resolved:
No new issues found. Could not run |
Everything visible on /ai-atlas becomes pushable by the Terminal, so the page changes on prod without a build. Authorized by Wolf on 2026-09-24.
A push to /api/ai-atlas/guide may now carry, beside the guide:
cards: card id to paragraphs; replaces the copy in features.ts.stages: all six stages in step order, each with an optional label and 1 to 3 tiles (every tile must be an entry).copy: page text key to text: copy.json strings, ring and node labels, the header label, SEO title and description.Anything left out keeps its built-in value. Invalid shapes are refused with 400.
Also three sentences appended to the Engine, Delivered work and Models cards.
Verified on a local production build: a push with stages, copy and cards changed the Result stage tiles and label, a ring label, a card text, the header label and the page title in en, ru and hy; a plain push restored the built-in selection.
🤖 Generated with Claude Code