The decisions and limitations that matter when changing or operating the site.

Reference Value
Subject Current decisions, tradeoffs and support limits
Verified source Repository main at f40e87044407625d285578c6819f8e03e7163aee, checked November 7, 2026; build images, project share copy, image editing, section defaults and design adoption re-verified on main at 0461e045, checked November 10, 2026; claim owners below
Support state Decisions implemented in main f40e8704; main 0461e045 (#692) pins design v0.40.0. Public requests on November 7, 2026 returned the f40e8704 revision's project redirect and robots tag; scenario-specific runtime receipts are in their owning records

Key decisions

Decision Why / consequence Source
Export content at build time No editorial CMS read on public page requests. Production builds read live CMS content; a merge to main publishes saved editorial content when its build succeeds export-fallbacks.ts, catalog/index.ts
Production-only live-content build CI and Vercel previews use fixtures without CMS credentials; explicit local operator live export is available Exporter source policy
One production CMS One editorial truth; configuration writes require exact review and live readback apps/cms/README.md
Manual Publish with delayed feedback One build request per editing session; two version reads, ten-minute wait and one notice. Changed version is observation, not deployment attribution flows.json, operations.json; ‣
Owner-browser configuration writes Admin uses two-factor auth and is not stored in .env. Confirmed packets use the owner's authenticated session; GitHub's token runs the read-only diff ‣
Keep sync identities with manual configuration creates New operations, permissions and translations need map rows; logical tables are operations, permissions, translations, policies apps/cms/ops/impact-proof.md
Keep broad production policy/permission sync refused Snapshot alignment and exact browser grants do not authorize global access repair sync-push.ts; ‣
Released design packages, one version v0.40.0 from yesid-dev/yesid.design supplies shared UI, pointer policy, station tabs, first-visit expanded content and the remembered bulk section choice; consumers use released packages. API/migration changes require an rc.N rehearsal in a draft adoption PR in each of the three consumers Root/web manifests, bun.lock; connect release/adoption slices
Shared static security policy except apex HSTS Drift test compares installed SECURITY_HEADERS; apex HSTS is provider-owned max-age only, without includeSubDomains/preload. Adding either needs Yesito's answer security-headers.test.ts, vercel.json
One content catalog and availability policy Routes, prerender, sitemap, OG and LLM text use site-page, entity-status and locale rules; public and wip projects are available, private ones are excluded catalog/index.ts, catalog/availability.ts, agreement tests
App owns header and language copy EN/FR/ES locale files own header, language and control labels apps/web/src/lib/locales/, CMS snapshot
Retain real hero data through one failed check The displayed real reading keeps ageing; a second consecutive failure switches to labelled DEMO. Manual and automatic checks share the budget and one in-flight request HeroBanner.svelte, HeroBanner.polling.test.ts
Optional metric evidence in CMS Project/Service metrics show a value and label. The CMS holds optional source and measurement-date fields; the site and llms-full.txt do not display those fields. Editor validation, export schema and two narrow Human Editor grants apply to this data Shared metric schema, CMS fields/grants, fetchers and server/llms.ts; ‣
Eight events, four measuring tools Plausible owns eight named custom events; Vercel Web Analytics, Speed Insights and Cloudflare beacon are separate measuring tools analytics/preset.ts, analytics/client.ts; Cloudflare injection is provider-owned
No automated contact send Web3Forms blocks headless signatures. Keep provider delivery as an owner-browser check; failure copy offers email and emits contact_form_error ‣ and connect Handoff
Preserve reading position Back and locale restoration reveal the target chain before restoring position. Expanded history uses the click-time offset. Diagram anchoring is bounded until layout settles or reader input reading-position-plan.ts, reading-session.ts, detail-reading.ts, detail-reading-position.ts
Remember one bulk section choice On eligible pages with at least two collapsible content sections, a first visit or a malformed stored choice starts with every section expanded and a neutral bulk control labelled Collapse all. Bulk actions store collapsed or expanded in origin-wide localStorage['sections-choice']; that choice applies across pages and visits, so a stored Collapse all collapses content on later pages. Individual toggles, TOC/fragment jumps and restoration do not write it. The TOC and independent panels keep their own state; pages below the threshold use their declared defaults. @yesid/ui v0.40.0 (expanded default since design v0.37.0, #647), tests/remembered-sections.spec.ts; cookies policy
Upload-only images, optional mirrors Each live build publishes referenced raster uploads under /images/cms/, trading per-image code review for editorial review at Publish site. Committed mirrors are optional reviewed pinning and win for their UUID; new SVGs still need one. One article media controller serves inline images and galleries. Café Arona has four source mirrors: Home desktop/mobile, Product desktop and Team desktop, with responsive variants build-media.ts, apps/cms/README.md, asset manifest, article-media.svelte.ts (#677)
CMS owns project share copy Card subtitle and metadata description derive from the localized one_liner and overview sentences, not code. Export fails a one-liner the card cannot render in full og/project-copy.ts, validate-project-lines.ts (#678)
Wrap, don't replace, the Directus block editor The Article Block Editor interface keeps Directus's built-in editor and adds image layout, light-version and show-both-themes controls, preserving image extras by block ID apps/cms/extensions/article-editor (#693)
Hosting plans Keep the paid Neon Launch plan and the build-time content export, which lets Neon sleep. A Directus cache or Neon materialized views don't replace the export. Stay on Vercel Hobby until Vercel enforces its non-commercial rule Yesito's cost decisions, October 30, 2026
Public but proprietary source Inspectable portfolio source; external code contributions are not accepted LICENSE, CONTRIBUTING.md

Current limitations

Limitation Effect / boundary Evidence
Publish targets production Every Publish is a production build; fixture previews cannot validate live editorial rows One hook and source policy
Publish wait is not durable CMS restart loses that notice; stalled requests lack a per-operation timeout; concurrent deployments prevent causal attribution Operations snapshot and c-3d receipt
Publish error scenarios not runtime-observed Hook rejection, read/script failure and overlapping requests have offline coverage, not forced production trials c-3d receipt
Hero production failure hold not observed Source/tests cover the two-check transition; night behavior, production browser hold and cross-isolate R2 behavior are separate runtime gaps ‣
Rapid Back during outgoing transition Reload guard can lose exact reading position; the exact E2E case is fixme tests/back-restore.spec.ts
Proof does not establish truth A link/date can be absent or stale. Case-study body figures can differ from metric fields; each claim needs editorial review c-s5 receipt; no automatic verification
Narrow Human Editor proof grants Two service-proof fields do not provide access to all service editor fields Permission snapshot and c-s5 receipt
Clean sync diff is not a semantic access audit Separate duplicate/untracked permission findings need their own read-only audit and authority c-s7 receipt
No real automated contact test Mocked success proves UI behavior only. The connect Handoff records the owner's delivery acknowledgement; no recurring send is configured Contact component tests, Handoff
First scheduled cross-site link run not observed Transit owns the weekly checker; a manual successful run is not scheduled-run evidence c-3c receipt
Sync extension host range is patched Image widens 3.0.6's declared host range to Directus 12 and fails on patch drift apps/cms/Dockerfile
Single Directus instance, in-memory cache/limiter No horizontal scaling or durable Publish timer. Set no REDIS or REDIS_* variable: one switches Directus 12's message bus, locks and shared stores to Redis apps/cms/.env.example:92
Asset setup script refuses production The offline plan supports tests; setup:asset-registry refuses production applies Script host guard
Build images fail closed A referenced image that is missing, outside the Build Bot delivery folders, over the limits, animated or a new SVG fails the production build; the last successful site keeps serving. Fixture previews show a placeholder for unmirrored uploads, so only a live build shows the real image build-media.ts, build-media-policy.test.ts, apps/cms/README.md
Article editor needs a configuration write The CMS image ships the extension, but the four field interface changes in the snapshot apply only through the confirmed owner packet. Live field state is not verified by source apps/cms/README.md, field snapshots
Checklist blocks fail Blog export The Blog body editor offers a checklist tool, but the shared block schema has no checklist type and no renderer. A checklist in a published Blog language makes BlockEditorDocSchema.parse throw, failing the export and the production build. Use a nested list until checklist support exists blog_posts_translations/body.json, packages/shared/src/types/blocks.ts, fetchers/blog-posts.ts:159 at 9dc18495
Rebuild required for content removal Archiving changes generated routes, cards, sitemap and LLM text on the next successful build Exporter and catalog
Localized fields can fall back to English Language publication, integrity tests and optional schema fields have separate contracts Shared schemas, blog grouping tests
YouTube-only playback Click-to-play iframe; no CMS video upload field. Production video playback has no acceptance receipt in this audit youtube.ts, shared media
Package updates are manual Dependabot handles GitHub Actions only; lockfile portability is decided by frozen Linux CI dependabot.yml, CONTRIBUTING.md

Use Laws & Footguns for recurring enforcement rules and GLOSSARY.md for settled terms.