# Final editorial integration — two bounded decisions before PR

**15/19 redesigns remain live at4fad8fb0bdd77bc5645c1f60bcbdd82607841753. PR43 rollout is complete.** This final Batch01 integration is uncommitted on isolated `feat/accepted-batch01-editorial`, based on that fresh main. No PR, merge or deployment yet. Four canonical sources are still EXACT accepted Astra bytes; neither proposed comment nor runtime candidate has been applied.

## Decision1: two measured lint-only exceptions

Current full check finds34 errors:33 `noRedundantRoles` errors in Case Study's explicit table-family roles, and1 `useSemanticElements` error on Launch's existing named code-scrolling region. These are distinct rules; the previously approved per-file exceptions do not automatically authorize these files.

Recommendation: approve the two exact comment-only candidates below. Case gets the already established file-local compatibility directive; Launch gets only one element-local directive immediately before its code region. No other rule suppression, no global config, no tags, CSS, text, IDs, scope, roles, SVG, meters or command changes. Both candidate stdin lint runs return0 and echo exact bytes. Eight paired actual app-sandbox captures at1440/768/390/320 have identical PNG bytes, accessibility trees and native header/column/record relationships. Case keeps33 explicit roles,4native column headers and5 complete meter/value tuples; Launch keeps its named CODE region and native scrolling. Chromium-only evidence, not a Safari/Firefox certification.

- **case-study** accepted `233536866e325c46d0e2617b00bee26c6cbdfcb485aeed2e424374c0497b44d5` → proposed `bda5f8984424f791f6707dc0565c198a6607fcd98f41d851eaed001e2151b007`. [Exact delta](case-study-proposed-delta.diff).
- **launch-announcement** accepted `18088f881dfa7580a720549b6903040dd695034f9768a6b7909ccf4a0851dfc1` → proposed `c50f7b44e6e2193126e085fa2b3d3b89266d5dfbb5760dd11633de51fd26fa19`. [Exact delta](launch-announcement-proposed-delta.diff).

[Candidate source mapping](candidate-mapping.json) · [Eight paired sandbox/AX checks](candidate-parity.json) · [34-error inventory and warning classification](lint-results.json).

## Decision2: the existing viewer circuit breaker fires on the required real fixture

The actual locally created and published Daily12-story fixture runs through the real artifact viewer, usercontent frame route, appended height reporter and opaque sandbox — **not just the bounded catalog detail preview**. All12 stories stay open and the six-item native archive remains intact.

| Actual viewer width | Closed document / outer frame | Archive open document / outer frame |
|---|---|---|
|390|11456 /11456|12316 /12000|
|320|13757 /12000|14745 /12000|

The existing `FRAME_MAX_HEIGHT=12000` in `src/ui/client/viewer.js` clamps legitimate content. At320, opening the archive cannot grow the outer frame. **Nothing is deleted or hidden: the footer remains reachable using nested iframe scrolling.** Nevertheless, automatic whole-document sizing and archive-resize expectations are not met. The source author’s390 height was11455; the actual viewer reports11456 due measurement rounding, not extra content.

Recommendation: authorize one bounded runtime change,12000→32768, with the proposed explanatory comment replacing obsolete approximately3000px design-budget advice, and strengthen existing frame-height tests plus the real Daily fixture regression. This is a finite abuse circuit breaker, not a template design-height budget or an unbounded number. Existing unit policy already permits a ceiling up to40000. Same sender/finite/positive/floor checks and nested-scroll fallback remain.

A **browser-only intercepted candidate**, not a repository change, makes the actual outer frame match11456→12316 at390 and13757→14745 at320 when the archive opens. No internal vertical remainder. All stories and footer stay reachable. Launch's200-character command fixture remains keyboard-accessible through the same actual artifact viewer at390/320. Nine candidate controls preserve unmatched-source rejection, NaN/infinity/zero/negative rejection, floor48, valid60/15000 and1e9→32768 clamping. This requires explicit scope approval because the current batch contract otherwise excludes runtime changes.

Current viewer source `ae2fb2d086a955e352cc960728ff7670965c89a665ebec03d6c017b2e658fcc4` → proposed `43142918625f52d55ac08c0659dcc3eb05e286cf4637199636ac33e391bc1cd4`. [Exact runtime candidate diff](viewer-height-proposed-delta.diff).

[Unmodified actual viewer measurements](actual-viewer-growth.json) · [Browser-only candidate measurements](candidate-viewer-growth.json) · [Candidate sender/number guards](candidate-viewer-guard.json).

## Completed integration and QA

- Allfour accepted source files copied exactly; no title normalization needed. Baseline four canonical hashes matched frozen originals before adoption. Rejected inherited-Sol material was never adopted.
- Original307 text nodes /303 retained after the already accepted four decorative quote-mark removals;170 numeric occurrences, keyed story/quote/ledger/feature records, exact code descendants, links, SVG and meter data preserved. No new integration content exception. [Content proof](content-parity.json), [source mapping](source-mapping.json).
- Accurate four descriptions; unchanged canonical pnpm/tsx generator. Viewports Daily1600, Interview1440, Case1280, Launch1440. Exactly four PNGs changed. Actual gallery1440/390 and all four phone/desktop cards inspected: newspaper, serif quote spread, evidence ledger and dark/light poster are distinct. Whole19HTML+Markdown gallery is locally assembled; still only15 redesigns are live.
- Fresh16 main captures1440/768/390/320,48 actual/prior boundary captures,19HTML+Markdown regression,4no-JS and8ephemeral growth checks:0 failures. Sixteen accepted-to-integrated decoded pixel pairs exact; encoded PNG comparison separately recorded. [Validation](integrated-validation.json), [pixel proof](pixel-proof.json).
- Build and typecheck pass; full1132unit/12skips and268e2e/12skips pass on current unchanged sources. **Full check is NOT green** because of34errors above.41warnings=40 exact previous warnings+one Case mobile `.l-chg display:grid!important`, needed to retain the approved grid over generic cell display:block; no CSS cleanup/suppression. Final scoped regressions, commit/push/PR and final-head CI remain pending approval/application.
- Fresh disposable authenticated V1 router:20 exact source/metadata/slug/type/category/slot/thumbnail contracts. Fresh read-only HTTP checks preserve all15 already live sources/PNGs.32 other canonical files and225 frozen original files remain unchanged;72 original capture bindings checked. [API20](api-verification.json), [preservation](preservation.json), [original capture audit](accepted-evidence-audit.json).

## Harness corrections and honest limits

The first thumbnail command incorrectly invoked the TypeScript-importing generator directly with node and failed module resolution. No new thumbnails were written; initial images therefore showed the old designs despite new descriptions. Actual-image and hash inspection caught this. The established `pnpm run build:template-thumbs` entrypoint then generated the correct four PNGs; actual cards and full regression were rerun. No generator/global config/runtime change. Diagnostic collection initially retained ANSI codes; parsing was corrected. Capture audit now resolves the author's explicit frozen-baseline aliases and labelled inherited-state source bindings. The first public review-page check also caught a one-pixel table overflow at390; the evidence page now contains that table in a horizontal scroll wrapper. None of these are product source fixes.

Chromium/Linux only. Author fallback/contrast/48 fixture records are inherited, source-hash-bound evidence rather than claimed fresh cross-platform tests. Current actual-viewer tests are genuinely fresh local app tests. No production fixture, customer artifact/financial mutation, environment/key/Nginx/launch/Stripe/tax/4700/neighbor change. Private runtime, logs, auth and backup paths remain excluded from public files.

## Next

Parent: approve or amend the two bounded exceptions above. Then apply exactly approved candidates, add scoped red/green regressions (including actual viewer Daily archive sizing), rerun finalcheck/build/unit/e2e and final-head CI, and submit a separate final integrated PR for review. **Do not merge/deploy this batch without that later integrated review.** Do not change accepted template CSS/text to dodge the viewer limit.
