# Semantic Publication Substrate — FULL RESEARCH CORPUS (share wrapper) Abbreviation: sps Version: v0.1.0 Bundle name: llm-full-docs-sps Upstream artifact: .agents/llms-full-sps-v0.1.0.txt Generated: unspecified ======================================================================== # SEMANTIC PUBLICATION SUBSTRATE (SPS): CONSOLIDATED SPECIFICATION & SUBSTRATE CORPUS Version: v0.1.0 (2026-09-29) | Modules: 16 | Total Lines: 609 TABLE OF CONTENTS & SUBSYSTEM SUMMARY: - Architecture & Protocol Governance: 8 files - Substrate Implementation & Prototype: 3 files - Evidence & Work Records: 4 files - Other Modules: 1 files ======================================================================== ======================================================================== ## FILE: AGENTS.md ======================================================================== # Semantic Publication Substrate Agent Operating Contract (`.agents/AGENTS.md`) ## IEPE authority This project operates under `IEPE-001`, version `0.2.0`, from `https://github.com/zachshallbetter/IEPE` at immutable revision `56f82de8cca122cc4d347cdd55bb32bdcd31ed27`. The pin is recorded in `.iepe/protocol-reference.json`. IEPE Core governs claim, context, dispatch, evidence, perturbation, promotion, memory, and stop semantics. Local canonical sources govern this project's intent, experience, architecture, work graph, evaluators, adapters, and protected actions. Preserve this trace: ```text intent -> epic -> issue -> claim -> context -> artifact -> evaluation -> evidence -> qualification -> promotion ``` ## Authority order 1. `INTENT.md` 2. `docs/EXPERIENCE.md` 3. `docs/ARCHITECTURE.md` 4. `PROJECT_PROFILE.json` 5. Authorized issues and decisions 6. Implementation and operational observations 7. Generated agent context (`.agents/llms-full-sps-v0.1.0.txt`) ## Operational loop ```text reconcile -> select -> validate -> claim -> assemble bounded context -> dispatch -> observe -> evaluate -> stress test when required -> record evidence -> disposition -> release claim -> repeat ``` ## Status honesty $$\text{Documented} \neq \text{Implemented} \neq \text{Tested} \neq \text{Empirically Validated}$$ Artifact existence, a passing API call, or completion language does not establish qualification. ## Verification Gates & Execution Standard Before proposing modifications or additions to the substrate, run the context exporter script: ```bash python3 scripts/gen-llms.py ``` ## Agent-First Publishing Architecture (`.agents/llms-full-sps-v0.1.0.txt`) 1. **Single-Pass Deterministic Context (`llms-full-sps-v0.1.0.txt`)**: - `.agents/llms-full-sps-v0.1.0.txt` is an auto-generated, single-file concatenation of all intent docs, architecture specs, project profiles, and prototype code. - Reading `llms-full-sps-v0.1.0.txt` provides AI agents with instant, zero-search access to all SPS capabilities without multi-step file discovery latency. 2. **Automated Downstream Generation**: - Generated via `python3 scripts/gen-llms.py`. ======================================================================== ## SUBSYSTEM: ARCHITECTURE & PROTOCOL GOVERNANCE (8 files) ======================================================================== --- FILE: AGENTS.md (59 lines, 2.6 KiB) --- # Semantic Publication Substrate Agent Operating Contract ## IEPE authority This project operates under `IEPE-001`, version `0.2.0`, from `https://github.com/zachshallbetter/IEPE` at immutable revision `56f82de8cca122cc4d347cdd55bb32bdcd31ed27`. The pin is recorded in `.iepe/protocol-reference.json`. IEPE Core governs claim, context, dispatch, evidence, perturbation, promotion, memory, and stop semantics. Local canonical sources govern this project's intent, experience, architecture, work graph, evaluators, adapters, and protected actions. Local instructions may specialize IEPE but may not weaken its invariants. Preserve this trace: ```text intent -> epic -> issue -> claim -> context -> artifact -> evaluation -> evidence -> qualification -> promotion ``` ## Authority order 1. `INTENT.md` 2. `docs/EXPERIENCE.md` 3. `docs/ARCHITECTURE.md` 4. `PROJECT_PROFILE.json` 5. Authorized issues and decisions 6. Implementation and operational observations 7. Generated agent context Conversation and generated files are evidence inputs, not automatic authority. ## Operational loop ```text reconcile -> select -> validate -> claim -> assemble bounded context -> dispatch -> observe -> evaluate -> stress test when required -> record evidence -> disposition -> release claim -> repeat ``` ## Startup 1. Verify `.iepe/protocol-reference.json` and `PROJECT_PROFILE.json` against the pinned IEPE revision. 2. Inspect repository, documentation, work graph, claims, dependencies, tests, and evidence without mutation. 3. Reconcile contradictions and missing authority. 4. Select only a complete Ready issue. 5. Claim bounded scope, assemble minimal context, dispatch, evaluate, record, and release. The first agent cycle is read-only reconciliation. Do not infer mutation authority from repository access. ## Status honesty `Documented != Implemented != Tested != Empirically Validated` Artifact existence, a passing API call, or completion language does not establish qualification. ## Process routing Use the narrowest procedure under `.agents/skills/`: initialize, reconcile, operate, qualify, stress test, or maintain the package. These procedures are projections from the pinned IEPE revision and cannot expand local authority. ## Protected actions Read `PROJECT_PROFILE.json`. Protected actions require its named promotion authority and issue-level authorization. ## Stop conditions Stop and record a typed result when authority, ownership, context, dependencies, permissions, evidence, evaluator availability, provider health, or recovery becomes ambiguous. Stop when capacity or retry limits are exhausted. Silence is not approval. --- FILE: INTENT.md (37 lines, 1.9 KiB) --- # Semantic Publication Substrate Intent ## Purpose Provide a publication-aware semantic substrate that preserves canonical publication meaning while enabling relational discovery, radically replaceable interface expression, inspectable field behavior, and governed consequential interaction. ## Beneficiaries - Readers discovering, comparing, and returning to publications. - Publication and interface architects modeling meaning independently from presentation. - Renderer and runtime implementers building accessible, relational experiences. - Operators who need governed, inspectable interaction boundaries. ## Protected qualities - Publication identity and reading order remain stable across expressions. - Required semantic content and operation identity remain exposed. - Entitlement boundaries protect readable text and restricted resources. - Derived observations retain provenance and uncertainty. - Visual expression may change radically without changing canonical meaning. - Read projections do not silently mutate canonical or user state. ## Exclusions - Replacing a publication repository or content-management system. - Defining a specific frontend framework as a protocol requirement. - Treating inferred visual observations as authoritative facts. - Production deployment, external publication, payments, or destructive migrations during the prototype. ## Success evidence - A local browser prototype renders one canonical publication model through multiple expressions. - The same semantic publication supports library, series, detail, field, and reading-entry projections. - Relationship and observation signals are inspectable with provenance labels. - Filtering, selection, expression switching, and reader entry have explicit state transitions. - Entitlement-gated text is represented without exposing text content in discovery mode. - Browser visual verification and local smoke checks are recorded before promotion. --- FILE: PROJECT_PROFILE.json (58 lines, 1.3 KiB) --- { "$schema": "https://iepe.dev/schema/project-profile.schema.json", "authorityOrder": [ "INTENT.md", "docs/EXPERIENCE.md", "docs/ARCHITECTURE.md", "PROJECT_PROFILE.json", "AGENTS.md" ], "coordinator": { "capacity": 1, "identity": "coordinator.local", "stopPolicyRef": "AGENTS.md#stop-conditions" }, "evaluators": [ "manual.acceptance", "browser.visual", "schema.conformance" ], "id": "sps", "intentRefs": [ "INTENT.md" ], "memory": { "institutional": "docs", "negativeResults": "docs/NEGATIVE_RESULTS.md", "operational": "work" }, "name": "Semantic Publication Substrate", "profileStatus": "established", "promotionAuthorities": [ "project.owner" ], "protectedActions": [ "external-publication", "production-deployment", "spending", "destructive-migration", "credential-or-iam-change", "authoritative-intent-change", "external-communication" ], "protocol": { "protocolId": "IEPE-001", "protocolVersion": "0.2.0", "revision": "56f82de8cca122cc4d347cdd55bb32bdcd31ed27", "source": "https://github.com/zachshallbetter/IEPE" }, "workGraph": { "projectRefs": [ "work" ], "provider": "local" }, "workspaces": [ "." ] } --- FILE: README.md (33 lines, 1.2 KiB) --- # Semantic Publication Substrate **Protocol version:** `0.1.0` **Project profile:** `0.2.0` **Status:** Working prototype An integrated local prototype for publication truth, semantic interface expression, relational field behavior, and governed interaction boundaries. ## Run From this directory: ```sh python3 -m http.server 4177 --bind 0.0.0.0 ``` Open `http://localhost:4177/`. ## Prototype surfaces - Overview: reader state, semantic projections, protected-resource boundary. - Library: series grouping by `seriesId` and volume ordering by `ordinal`. - Series: connected publication and relationship entry points. - Field: relational topology, signal readings, and provenance. - Publication detail: canonical identity, edition presence, reading order, relations, and options. - Reader entry: separate reading projection with entitlement-gated text. - Expression selector: Neo Capsule, Edo Ink, Nordic Frontier, and Cosmic Comic. The data is intentionally local and authored as a fixture adapter. The field view attaches the published signals-first Fundamental Engine adapter when the CDN is reachable, while retaining the same visible projection if it is unavailable. The prototype does not publish content, mutate external state, or expose readable text. --- FILE: ROADMAP.md (43 lines, 1.5 KiB) --- # Semantic Publication Substrate Roadmap ## M0: Governed baseline Exit evidence: - intent, beneficiaries, protected qualities, exclusions, and success evidence are confirmed - project profile and protocol pin conform - zero-state or operational baseline is recorded - one material unknown is registered - one bounded, reversible issue is Ready ## M1: First qualified outcome ### M0 exit evidence - Browser-rendered prototype with publication, semantic, expression, field, and interaction surfaces. - Smoke-checkable state transitions and no external side effects. ### Ready issue - `SPS-001` Build the integrated publication substrate prototype. ## M2: Contract-backed publication adapters - Replace fixtures with typed publication, series, resource, and progress adapters. - Reconcile resource delivery, digest, compression, and canonical-source rules. - Add schema and invariant conformance gates. ## M3: Governed reader operations - Define ICP contracts for entitlement, reading, download, progress, library mutation, and recovery. - Add receipts, conflict handling, and explicit terminal outcomes. ## M4: Qualified expression system - Implement SES semantic schemas, resolver cascade, projection contracts, and negative fixtures. - Validate multiple visual languages against one semantic composition. ## M5: Relational field runtime - Bind Fundamental Engine patterns to publication geometry, relationships, observations, and snapshots. - Add field query, diagnostics, reduced-motion projection, and performance evidence. --- FILE: docs/ARCHITECTURE.md (48 lines, 2.2 KiB) --- # Semantic Publication Substrate Architecture ## System boundary ```text Publication / iPub truth ↓ Semantic publication adapters ↓ SES semantic contracts + expression resolver ↓ Fundamental field bindings and relational signals ↓ Host renderer and accessible projections ↓ ICP interaction contracts for consequential operations ``` ## Source-of-truth ownership | Layer | Owns | Does not own | |---|---|---| | Publication | identity, revision, reading order, resources, edition | UI layout or reader state | | iPub | spreads, panels, regions, roles, text-layer entitlement | visual language | | SES | semantic interface meaning and expression freedom | canonical publication bytes | | Fundamental | field coupling, metrics, relationships, projections | authorization or business truth | | ICP | authority, transitions, evidence, receipts, recovery | visual styling | | Host app | routes, composition, loading, adapters | redefining lower-layer contracts | ## Prototype implementation The first vertical slice is deliberately framework-free and local. `index.html` supplies the host; `styles.css` supplies expression tokens and topology; `app.js` contains the typed fixture model, semantic projection functions, a purpose/evidence morphology resolver, field-signal derivation, and interaction state machine. The prototype has no generic dashboard shell: each shelf resolves its own container from semantic purpose, available evidence, content count, and expression. Prototype morphology forms include `hero`, `banner`, `rail`, `split`, `matrix`, and `portals`. This is the reference behavior for future SES Recipes: the container is resolved after semantic purpose and evidence, not selected as a fixed page template before content arrives. ## Required boundaries - Discovery may use geometry, relationships, metrics, and observations without exposing text layers. - Text content is entitlement-gated and is represented in discovery as a protected resource. - Expression switching must not change publication identity or required operations. - Field signals influence emphasis and discovery explanation, not canonical metadata. - Every future write operation must cross an ICP contract boundary. --- FILE: docs/EXPERIENCE.md (35 lines, 1.5 KiB) --- # Experience Contract ## Primary experience Readers encounter a library as a connected publication field rather than a flat list. They can move from a reading path to a series, publication detail, related work, or reading entry while the same publication identity remains stable. ## Critical journeys 1. Discover from current reading state. 2. Inspect why a publication surfaced. 3. Browse a library grouped by `series_id` and ordered by `series_ordinal`. 4. Open publication options without confusing them with the reader. 5. Enter a reader projection without exposing protected text in discovery. 6. Change visual expression without changing semantic identity or operation labels. ## States The prototype expresses selected, filtered, in-library, reading-entry, protected-resource, and staged- access-request states. Future production adapters must map these to ICP contract states and outcomes. ## Accessibility requirements - Native buttons and labels remain operable by keyboard and assistive technology. - Status feedback is textual and not color-only. - Protected content has an explicit entitlement explanation. - Responsive layout must not require horizontal scrolling. - Reduced-motion expression must preserve the same semantic changes. ## Observation method Prototype evaluation uses DOM state inspection, desktop and narrow viewport screenshots, and interaction smoke checks. Visual fidelity is evidence of the prototype projection only; it does not establish publication-schema or backend conformance. --- FILE: docs/NEGATIVE_RESULTS.md (13 lines, 0.9 KiB) --- # Negative and Inconclusive Results Retain rejected candidates, failed evaluations, contradictions, limitations, and the evidence that produced each disposition. ## 2026-08-17 — initial prototype verification - Browser visual verification passed at the default desktop viewport and at 390×844. - Core interaction smoke checks passed for grouped library, publication detail, reader entry, expression switching, and field view. Browser console reported no errors or warnings. - The first narrow-layout pass exposed horizontal overflow in the topbar. The responsive breakpoint was corrected by wrapping the search and expression controls; the second narrow pass passed. - Upstream IEPE `validate.py` could not run in this environment because the Python `yaml` dependency is unavailable. The compiled project package remains provisional and is not treated as conformance evidence. ======================================================================== ## SUBSYSTEM: SUBSTRATE IMPLEMENTATION & PROTOTYPE (3 files) ======================================================================== --- FILE: app.js (61 lines, 23.1 KiB) --- const publications = [ { id:'pub-crimson', seriesId:'series-crimson', series:'Crimson Bloom', ordinal:1, title:'Crimson Bloom', subtitle:'The first garden remembers everything.', author:'H. Mori', year:2025, kind:'Volume', chapters:12, progress:68, color:'crimson', cover:'✦', world:'Crimson Reach', tags:['close-ups','dialogue','colour'], observations:{'Panel density':.52,'Dialogue density':.78,'Close-up frequency':.86,'Palette range':.74}, relations:[['same creator','Silent Requiem'],['shares character','Liora'],['part of','Crimson Bloom']] }, { id:'pub-crimson-2', seriesId:'series-crimson', series:'Crimson Bloom', ordinal:2, title:'Crimson Court', subtitle:'The house at the edge of the map.', author:'H. Mori', year:2022, kind:'Volume', chapters:78, progress:0, color:'court', cover:'◈', world:'Crimson Reach', tags:['dialogue','close-ups','dark'], observations:{'Panel density':.58,'Dialogue density':.82,'Close-up frequency':.81,'Ink coverage':.44}, relations:[['precedes','Crimson Bloom'],['same creator','Silent Requiem'],['features','Liora']] }, { id:'pub-eclipse', seriesId:'series-eclipse', series:'Eclipse of Stars', ordinal:12, title:'Eclipse of Stars', subtitle:'A horizon is only a promise seen from far away.', author:'H. Mori', year:2019, kind:'Volume', chapters:169, progress:63, color:'eclipse', cover:'☾', world:'Celestia', tags:['wide panels','slow pacing','dark ink'], observations:{'Negative space':.78,'Panel density':.28,'Slow pacing':.82,'Ink coverage':.74}, relations:[['sequel to',"Void's Eclipse"],['adapts','Path of the Eclipse'],['features','Airi · Kael']] }, { id:'pub-reverse', seriesId:'series-reverse', series:'Re:Verse', ordinal:8, title:'Re:Verse', subtitle:'Every city has a second version of itself.', author:'Y. Tanabe', year:2021, kind:'Volume', chapters:104, progress:81, color:'neon', cover:'⌁', world:'Neo-Tokyo', tags:['dense panels','sound effects','close-ups'], observations:{'Panel density':.72,'Dialogue density':.64,'Onomatopoeia':.68,'Close-up frequency':.62}, relations:[['same creator','Starbound Atlas'],['shares character','Nyx'],['part of','Neo-Tokyo cycle']] }, { id:'pub-chronicles', seriesId:'series-eldoria', series:'Aether Chronicles', ordinal:15, title:'Aether Chronicles', subtitle:'The old world is not as quiet as it looks.', author:'R. Ito', year:1998, kind:'Volume', chapters:212, progress:100, color:'aether', cover:'△', world:'Eldoria', tags:['1990s','wide panels','colour'], observations:{'Negative space':.66,'Panel density':.34,'Palette range':.62,'Slow pacing':.71}, relations:[['part of','Eldoria archive'],['adapts','Verdant Crown'],['features','Soren']] }, { id:'pub-atlas', seriesId:'series-atlas', series:'Starbound Atlas', ordinal:1, title:'Starbound Atlas', subtitle:'A field guide to places that should not exist.', author:'Y. Tanabe', year:2023, kind:'Worldguide', chapters:0, progress:0, color:'atlas', cover:'✧', world:'Stellar Rift', tags:['world guide','wide panels','colour'], observations:{'Negative space':.69,'Palette range':.66,'Slow pacing':.74,'Image density':.36}, relations:[['same creator','Re:Verse'],['part of','Stellar Rift'],['references','The Last Signal']] }, ]; const expressions = { capsule:{label:'Neo Capsule', note:'bright clarity · open space'}, ink:{label:'Edo Ink', note:'paper grain · editorial weight'}, frontier:{label:'Nordic Frontier', note:'weathered material · quiet depth'}, comic:{label:'Cosmic Comic', note:'bold panels · kinetic contrast'}, }; const shelves = [ { id:'current', purpose:'reading-continuity', label:'Your active thread', title:'The path you already started', description:'A return surface for works with active reader state. Progress and next action matter more than catalog completeness.', form:'hero', lens:p=>p.progress>0 }, { id:'vast', purpose:'world-atmosphere', label:'morphology · cinematic banner', title:'Worlds that make the person small', description:'Wide space, low dialogue, and slow pacing resolve into an atmospheric field rather than a card rail.', form:'banner', lens:p=>p.observations['Negative space']>.6 }, { id:'relations', purpose:'relationship-discovery', label:'morphology · comparison rail', title:'Complicated relationships', description:'Works are side by side because the useful question is not “what is this?” but “what does this connect to?”', form:'rail', lens:p=>p.relations.length>=2 }, { id:'breathe', purpose:'page-quality', label:'morphology · editorial split', title:'Pages that breathe', description:'One visual anchor and a measured list of page qualities. The container gives the evidence room to speak.', form:'split', lens:p=>p.observations['Slow pacing']>.7 || p.observations['Negative space']>.7 }, { id:'chaos', purpose:'kinetic-contrast', label:'morphology · dense matrix', title:'Beautiful chaos', description:'High panel density, close-ups, and sound effects turn the shelf into a compact visual index.', form:'matrix', lens:p=>p.observations['Panel density']>.5 || p.observations['Onomatopoeia']>.5 }, { id:'places', purpose:'world-navigation', label:'morphology · portal field', title:'Places you keep returning to', description:'Worlds become portals. The content is spatial, so the container is circular, image-led, and navigational.', form:'portals', lens:p=>p.world }, ]; const state = { view:'home', expression:'capsule', query:'', selected:null, toast:'', library:new Set(['pub-crimson','pub-eclipse','pub-reverse']), readMode:false }; const fieldRuntime = { handle:null, loading:false }; const $ = (s) => document.querySelector(s); const esc = (v) => String(v).replace(/[&<>"']/g, (c) => ({'&':'&','<':'<','>':'>','"':'"',"'":'''}[c])); const pub = (id) => publications.find((p) => p.id === id); const cover = (p, extra='') => `
`; const coverGradient = (color) => ({crimson:'linear-gradient(145deg,#461f35,#e46e51 48%,#172938)',court:'linear-gradient(145deg,#351d24,#9e3a32 48%,#131a29)',eclipse:'linear-gradient(145deg,#111b40,#5746a9 45%,#0a151d)',neon:'linear-gradient(145deg,#1f1a4d,#c154a5 48%,#0d6072)',aether:'linear-gradient(145deg,#3a544e,#d0aa75 50%,#1a2630)',atlas:'linear-gradient(145deg,#182d3f,#78a1ad 50%,#333750)'}[color] || 'linear-gradient(145deg,#234,#111)'); const toast = (message) => { state.toast = message; render(); setTimeout(() => { state.toast=''; render(); }, 2200); }; function nav() { return ''; } function topbar() { return `
Ssemantic publication field
`; } function stats() { return `
1,248publications indexed
42series connected
18.7ksemantic relations
06active reading paths
`; } function card(p) { return `
${cover(p)}

${esc(p.title)}

${esc(p.subtitle)}

${esc(p.series)} · Vol. ${p.ordinal}${p.progress ? p.progress+'%' : p.year}
`; } function morphologyFor(shelf) { const expression = state.expression; const density = publications.filter(shelf.lens).length; const tone = density>=3?'earned':density===2?'steady':'fading'; return `${shelf.form} expression-${expression} evidence-${tone}`; } function relationTags(p) { return p.relations.slice(0,2).map(([a,b])=>`${esc(a)} · ${esc(b)}`).join(''); } function miniCard(p, variant='') { return `
${cover(p)}
${esc(p.series)} · vol. ${p.ordinal}

${esc(p.title)}

${esc(p.subtitle)}

`; } function shelfHeader(shelf) { const members=publications.filter(shelf.lens); const strength=Math.min(1,members.length/3); return `
${esc(shelf.label)} · ${members.length} works · ${Math.round(strength*100)}% evidence

${esc(shelf.title)}

${esc(shelf.description)}

`; } function renderShelf(shelf) { const members=publications.filter(shelf.lens); if(!members.length)return ''; const shell=morphologyFor(shelf); if(shelf.form==='hero'){const p=members.find(x=>x.progress)||members[0];return `
${shelfHeader(shelf)}
${cover(p,'purpose-cover')}
${p.progress}% read · ${esc(p.world)}

${esc(p.title)}

${esc(p.subtitle)}

reader memory${p.progress}%semantic proximity0.82
`;} if(shelf.form==='banner'){const p=members[0];return `
${shelfHeader(shelf)}
`;} if(shelf.form==='split'){const lead=members[0];return `
${shelfHeader(shelf)}
${cover(lead,'purpose-cover')}measured page quality
${members.slice(0,4).map((m,i)=>``).join('')}
`;} if(shelf.form==='matrix')return `
${shelfHeader(shelf)}
${members.map((m,i)=>miniCard(m,i===0?'featured':'')).join('')}
`; if(shelf.form==='portals')return `
${shelfHeader(shelf)}
${[...new Set(members.map(m=>m.world))].map((world,i)=>{const p=members.find(m=>m.world===world);return ``;}).join('')}
`; return `
${shelfHeader(shelf)}
${members.map(m=>miniCard(m)).join('')}
`; } function hero() { const e=expressions[state.expression]; return `
Semantic publication substrate · ${esc(e.note)}

The library
finds its form.

Every shelf is a projection of purpose, evidence, and reader state. The container changes because the content asks it to.

semantic identitystableexpression topologyfreefield evidenceinspectable
`; } function home() { return `
resolved library · purpose-driven morphology

Relational Books Field

Containers resolve from purpose, evidence, and reader state. Select any object to inspect its semantic identity, signals, and relations.

reader stateNova X · 3 active pathsprotected text layersentitlement required
${shelves.map(renderShelf).join('')}`; } function library() { const q=state.query.toLowerCase(); const filtered=publications.filter(p=>[p.title,p.series,p.author,p.world,...p.tags].join(' ').toLowerCase().includes(q)); const groups={}; filtered.forEach(p=>(groups[p.seriesId] ||= {name:p.series,items:[]}).items.push(p)); return `
publication manifest · grouped by series_id

Your library

Volumes are ordered by series ordinal. The flat publication list never appears.

${Object.values(groups).map(g=>`

${esc(g.name)}

${g.items.length} volume${g.items.length===1?'':'s'} · canonical order preserved

series detail →
${g.items.sort((a,b)=>a.ordinal-b.ordinal).map(p=>`
${cover(p)}

Vol. ${p.ordinal} · ${esc(p.title)}

${p.chapters ? p.chapters+' chapters' : 'worldguide'} · rev. 07
`).join('')}
`).join('') || '
No publication matches this query. Try “wide panels”, “Crimson”, or “Neo-Tokyo”.
'}
`; } function series() { return `
composition · series sockets

Connected worlds

Series detail is a semantic page, not a filter state.

${[...new Map(publications.map(p=>[p.seriesId,p])).values()].map(card).join('')}
relationship topology

Routes through the archive

Characters, creators, and worlds form navigable sockets around every volume.

Crimson Reach · 3 worksH. Mori · 4 worksLiora · 5 appearancesCelestia ↔ Stellar Rift · 8 links
`; } function field() { return `
fundamental field · signals-first projection

Relational field

The substrate measures relationships and page qualities without taking ownership of publication truth.

field runtime · live signals

Publication topology

Nodes are semantic publications. Edges are typed relations.

${[['n1','Crimson Bloom','pub-crimson'],['n2','Eclipse of Stars','pub-eclipse'],['n3','Re:Verse','pub-reverse'],['n4','Aether Chronicles','pub-chronicles'],['n5','Starbound Atlas','pub-atlas']].map(([c,n,id])=>``).join('')}

Current field readings

Signals are projections with provenance, not canonical metadata.

${[['attention','0.82'],['relationship strength','0.74'],['reader memory','0.61'],['confidence','0.91'],['semantic proximity','0.68']].map(([n,v])=>`
${n}${v}
`).join('')}
Projection: signals can alter emphasis, grouping, and explanation. They cannot rewrite title, order, entitlement, or identity.
`; } function detail(p) { return `
${cover(p)}
publication detail · ${esc(p.kind)} · revision 07

${esc(p.title)}

${esc(p.subtitle)} This is an options page around the publication, not the reader itself.

Series${esc(p.series)} · volume ${p.ordinal}
EditionPresent · fields optional
Reading order${p.chapters ? 'contiguous · 0-based' : 'reference pages'}
canonical relationships
${p.relations.map(([a,b])=>`${esc(a)} · ${esc(b)}`).join('')}
Protected resource boundary.
Text layers and clean-plate derivatives are available only through entitled resource operations. Discovery can inspect structure, regions, and measurements without receiving readable script content.
`; } function reader(p) { return `
reader projection · ${esc(p.series)} / volume ${p.ordinal}

${esc(p.title)}

Reading entry is a separate projection from publication detail.

chapter 01 · protected text layer

${esc(p.subtitle)}

${p.cover}semantic regions · panels · observations

Entitlement required. The prototype demonstrates the boundary without loading readable text.

`; } function drawer() { const p=state.selected?pub(state.selected):null; if(!p || state.view==='library')return ''; return ``; } async function syncFieldRuntime() { if(fieldRuntime.handle){ try{fieldRuntime.handle.scan();}catch{} return; } if(fieldRuntime.loading || !document.querySelector('[data-body]'))return; fieldRuntime.loading=true; try { const { FieldField } = await import('https://esm.sh/@fundamental-engine/vanilla@0.10.0'); fieldRuntime.handle=new FieldField({render:'none'}); try{fieldRuntime.handle.setRender('none');}catch{} try{fieldRuntime.handle.setOverlay('none');}catch{} fieldRuntime.handle.scan(); } catch {} finally { fieldRuntime.loading=false; } } function render() { const app=$('#app'); app.dataset.expression=state.expression; const body = state.readMode && state.selected ? reader(pub(state.selected)) : state.view==='library' && state.selected ? detail(pub(state.selected)) : state.view==='library'?library():state.view==='series'?series():state.view==='field'?field():state.selected?detail(pub(state.selected)):home(); app.innerHTML=`
${nav()}
${topbar()}
${body}
${drawer()}${state.toast?`
${esc(state.toast)}
`:''}`; bind(); syncFieldRuntime(); } function bind() { document.querySelectorAll('[data-view]').forEach((el)=>el.addEventListener('click',()=>{state.view=el.dataset.view;state.selected=null;state.readMode=false;render();})); document.querySelectorAll('[data-select]').forEach((el)=>el.addEventListener('click',()=>{state.selected=el.dataset.select;state.readMode=false;render();})); $('#expression')?.addEventListener('change',(e)=>{state.expression=e.target.value;toast(`Expression changed to ${expressions[state.expression].label}; semantic identity preserved.`);}); $('#query')?.addEventListener('input',(e)=>{state.query=e.target.value;if(state.view!=='library')state.view='library';render();const input=$('#query');input.focus();input.setSelectionRange(input.value.length,input.value.length);}); document.querySelectorAll('[data-action]').forEach((el)=>el.addEventListener('click',()=>action(el.dataset.action,el.dataset.id))); } function action(name,id) { if(name==='search'){state.view='library';render();return;} if(name==='clear'){state.query='';render();return;} if(name==='close'){state.selected=null;render();return;} if(name==='back'){if(state.readMode){state.readMode=false;}else{state.selected=null;state.view='library';}render();return;} if(name==='continue'){state.selected=id||state.selected||'pub-crimson';state.readMode=true;render();return;} if(name==='entitle'){toast('Access request staged — no external mutation in prototype.');return;} if(name==='library'){const p=pub(id||state.selected);if(!p)return;state.library.has(p.id)?state.library.delete(p.id):state.library.add(p.id);toast(state.library.has(p.id)?'Added to library.':'Removed from library.');render();return;} } render(); --- FILE: index.html (14 lines, 0.5 KiB) --- Semantic Publication Substrate
--- FILE: styles.css (109 lines, 22.5 KiB) --- :root { --bg: #081018; --bg-deep: #050a10; --panel: rgba(16, 27, 38, .84); --panel-strong: #111f2d; --panel-soft: rgba(22, 36, 48, .62); --line: rgba(164, 193, 210, .16); --line-strong: rgba(164, 193, 210, .3); --text: #eef6f8; --muted: #98abb8; --faint: #607481; --accent: #55d7c4; --accent-2: #8c7bff; --hot: #f39c67; --danger: #ef737f; --shadow: 0 22px 70px rgba(0, 0, 0, .24); --radius: 20px; --display: "Iowan Old Style", Georgia, serif; --sans: Inter, ui-sans-serif, system-ui, -apple-system, sans-serif; --mono: "SFMono-Regular", Consolas, monospace; } * { box-sizing: border-box; } html { background: var(--bg-deep); } body { margin: 0; background: var(--bg); color: var(--text); font: 14px/1.5 var(--sans); } button, input { font: inherit; } button { color: inherit; } button, a { -webkit-tap-highlight-color: transparent; } .app { min-height: 100vh; background: radial-gradient(circle at 78% -10%, rgba(85,215,196,.12), transparent 30%), var(--bg); } .app[data-expression="ink"] { --bg:#0b0b0d; --bg-deep:#070708; --panel:#151416; --panel-strong:#1d1b1b; --line:rgba(247,216,168,.18); --line-strong:rgba(247,216,168,.42); --accent:#e6684c; --accent-2:#f6d49b; --text:#f7ecdc; --muted:#b8aa99; --display: Georgia, serif; } .app[data-expression="frontier"] { --bg:#152027; --bg-deep:#0c151b; --panel:#1d3038; --panel-strong:#253b43; --line:rgba(207,226,220,.18); --line-strong:rgba(207,226,220,.4); --accent:#d39b68; --accent-2:#a6c7c6; --text:#e9f0e9; --muted:#a4b6b3; } .app[data-expression="comic"] { --bg:#11121c; --bg-deep:#080a13; --panel:#181b2e; --panel-strong:#242943; --line:rgba(255,255,255,.2); --line-strong:rgba(255,255,255,.45); --accent:#ffd641; --accent-2:#fb5a8d; --text:#fffbe8; --muted:#c5c7d4; --radius:12px; --display: Impact, Haettenschweiler, sans-serif; } .shell { display:grid; grid-template-columns:248px minmax(0,1fr); min-height:100vh; } .rail { position:sticky; top:0; height:100vh; padding:26px 18px; border-right:1px solid var(--line); background:rgba(5,10,16,.72); backdrop-filter:blur(18px); display:flex; flex-direction:column; gap:26px; } .brand { display:flex; align-items:center; gap:12px; padding:2px 10px; } .brand-mark { width:34px; height:34px; border:1px solid var(--accent); border-radius:50%; display:grid; place-items:center; color:var(--accent); font:700 16px var(--mono); box-shadow:0 0 24px color-mix(in srgb, var(--accent) 22%, transparent); } .brand strong { font-size:13px; letter-spacing:.11em; text-transform:uppercase; } .brand span { display:block; color:var(--muted); font:10px var(--mono); margin-top:2px; } .nav { display:grid; gap:6px; } .nav button { border:1px solid transparent; border-radius:12px; background:transparent; color:var(--muted); padding:11px 13px; cursor:pointer; text-align:left; display:flex; gap:11px; align-items:center; } .nav button:hover, .nav button.active { color:var(--text); border-color:var(--line); background:var(--panel-soft); } .nav button.active { box-shadow:inset 3px 0 var(--accent); } .nav i { width:21px; color:var(--accent); font-style:normal; text-align:center; } .rail-card { margin-top:auto; padding:18px; border:1px solid var(--line); border-radius:16px; background:linear-gradient(145deg,rgba(85,215,196,.1),rgba(140,123,255,.06)); } .eyebrow { color:var(--accent); font:10px var(--mono); letter-spacing:.14em; text-transform:uppercase; } .rail-card h3 { margin:8px 0 6px; font:20px var(--display); } .rail-card p { margin:0 0 14px; color:var(--muted); font-size:12px; } .progress { height:5px; border-radius:99px; background:var(--line); overflow:hidden; } .progress span { display:block; height:100%; border-radius:inherit; background:linear-gradient(90deg,var(--accent),var(--accent-2)); } .main { min-width:0; } .topbar { position:sticky; top:0; z-index:5; display:flex; align-items:center; gap:18px; padding:18px 34px; border-bottom:1px solid var(--line); background:color-mix(in srgb, var(--bg) 82%, transparent); backdrop-filter:blur(18px); } .search { flex:1; max-width:520px; display:flex; gap:10px; align-items:center; padding:11px 14px; border:1px solid var(--line); border-radius:999px; background:var(--panel-soft); } .search span { color:var(--accent); font-size:18px; }.search input { min-width:0; flex:1; border:0; outline:0; color:var(--text); background:transparent; }.search input::placeholder { color:var(--faint); } .expression { display:flex; align-items:center; gap:9px; margin-left:auto; color:var(--muted); font-size:12px; } .expression select { border:1px solid var(--line-strong); border-radius:9px; color:var(--text); background:var(--panel-strong); padding:8px 10px; } .top-stat { padding-left:15px; border-left:1px solid var(--line); color:var(--accent-2); font-weight:700; } .content { width:min(1440px,100%); margin:auto; padding:34px; } .hero { min-height:356px; padding:32px; border:1px solid var(--line); border-radius:var(--radius); position:relative; overflow:hidden; display:flex; align-items:end; background:linear-gradient(92deg,rgba(5,10,16,.96) 0%,rgba(5,10,16,.75) 42%,rgba(5,10,16,.17) 100%), radial-gradient(circle at 78% 38%,color-mix(in srgb,var(--accent-2) 45%,transparent),transparent 25%), linear-gradient(135deg,#173d4d,#172032 48%,#43253e); box-shadow:var(--shadow); } .hero:after { content:""; position:absolute; inset:0; opacity:.28; background:repeating-linear-gradient(115deg,transparent 0 28px,rgba(255,255,255,.07) 29px 30px); mix-blend-mode:screen; pointer-events:none; } .hero-copy { position:relative; z-index:1; max-width:620px; }.hero h1 { margin:9px 0 10px; font:clamp(42px,6vw,78px)/.91 var(--display); letter-spacing:-.055em; }.hero h1 em { color:var(--accent); font-style:normal; }.hero p { max-width:520px; color:var(--muted); font-size:16px; }.hero-actions { display:flex; gap:10px; flex-wrap:wrap; margin-top:22px; } .btn { border:1px solid var(--line-strong); border-radius:999px; padding:10px 16px; cursor:pointer; background:transparent; color:var(--text); }.btn:hover { border-color:var(--accent); }.btn.primary { border-color:transparent; background:linear-gradient(100deg,var(--accent),var(--accent-2)); color:#071018; font-weight:800; }.btn.small { padding:7px 11px; font-size:12px; } .section { margin-top:30px; }.section-head { display:flex; align-items:end; justify-content:space-between; gap:18px; margin-bottom:14px; }.section-head h2 { margin:3px 0 0; font:27px var(--display); }.section-head p { margin:4px 0 0; color:var(--muted); font-size:12px; }.section-head a { color:var(--accent); font-size:12px; cursor:pointer; } .stats { display:grid; grid-template-columns:repeat(4,1fr); gap:1px; border:1px solid var(--line); border-radius:16px; overflow:hidden; background:var(--line); }.stat { padding:18px; background:var(--panel); }.stat b { display:block; font:26px var(--display); }.stat span { color:var(--muted); font-size:11px; } .card-row { display:grid; grid-template-columns:repeat(4,minmax(0,1fr)); gap:14px; }.cover { aspect-ratio:4/5; border-radius:12px; background:var(--cover,linear-gradient(145deg,#234,#111)); position:relative; overflow:hidden; }.cover:before { content:""; position:absolute; inset:12% 10%; border:1px solid rgba(255,255,255,.4); transform:rotate(-5deg); }.cover:after { content:attr(data-symbol); position:absolute; right:14px; bottom:8px; color:rgba(255,255,255,.66); font:42px var(--display); }.book-card { min-width:0; border:1px solid var(--line); border-radius:16px; padding:10px; background:var(--panel); cursor:pointer; transition:transform .18s,border-color .18s; }.book-card:hover { transform:translateY(-3px); border-color:var(--accent); }.book-card .cover { margin-bottom:10px; }.book-card h3 { margin:0; font:18px var(--display); }.book-card p { margin:3px 0 0; color:var(--muted); font-size:12px; }.card-meta { display:flex; justify-content:space-between; gap:8px; margin-top:11px; color:var(--faint); font:10px var(--mono); }.pill { display:inline-flex; align-items:center; padding:4px 7px; border:1px solid var(--line); border-radius:999px; color:var(--accent); font:10px var(--mono); } .series-list { display:grid; gap:14px; }.series { border:1px solid var(--line); border-radius:16px; padding:18px; background:var(--panel); }.series-head { display:flex; align-items:center; justify-content:space-between; gap:12px; margin-bottom:13px; }.series-head h3 { margin:0; font:24px var(--display); }.series-head p { margin:3px 0 0; color:var(--muted); font-size:12px; }.volumes { display:grid; grid-template-columns:repeat(4,minmax(0,1fr)); gap:10px; }.volume { display:flex; gap:10px; align-items:center; border:1px solid var(--line); border-radius:12px; padding:8px; cursor:pointer; background:rgba(255,255,255,.025); }.volume:hover { border-color:var(--accent); }.volume .cover { width:52px; flex:none; aspect-ratio:3/4; border-radius:7px; }.volume h4 { margin:0; font:15px var(--display); }.volume span { color:var(--muted); font:10px var(--mono); } .grid-2 { display:grid; grid-template-columns:1.1fr .9fr; gap:16px; }.panel { border:1px solid var(--line); border-radius:16px; background:var(--panel); padding:18px; }.panel h3 { margin:0 0 4px; font:22px var(--display); }.panel > p { margin:0 0 14px; color:var(--muted); font-size:12px; }.field-map { min-height:280px; position:relative; overflow:hidden; border-radius:12px; background:radial-gradient(circle at 50% 52%,color-mix(in srgb,var(--accent) 20%,transparent),transparent 30%),linear-gradient(135deg,#0b2029,#0c111e); }.node { position:absolute; width:84px; aspect-ratio:1; display:grid; place-items:center; text-align:center; border:1px solid var(--accent); border-radius:50%; padding:8px; cursor:pointer; background:rgba(10,22,30,.8); box-shadow:0 0 28px color-mix(in srgb,var(--accent) 20%,transparent); font:11px var(--mono); }.node:after { content:""; position:absolute; width:8px; height:8px; border-radius:50%; background:var(--accent); top:8px; right:10px; }.node.n1{left:8%;top:28%}.node.n2{left:39%;top:10%;border-color:var(--accent-2)}.node.n3{right:8%;top:29%;border-color:var(--hot)}.node.n4{left:28%;bottom:8%;border-color:#72a6ef}.node.n5{right:27%;bottom:7%;border-color:#e878a5}.edge { position:absolute; height:1px; background:linear-gradient(90deg,transparent,var(--accent),transparent); transform-origin:left; opacity:.48; }.e1{left:22%;top:39%;width:25%;transform:rotate(-25deg)}.e2{left:50%;top:39%;width:24%;transform:rotate(22deg)}.e3{left:44%;top:61%;width:20%;transform:rotate(-8deg)}.e4{left:29%;top:68%;width:22%;transform:rotate(-35deg)} .signal-list { display:grid; gap:11px; }.signal { display:grid; gap:5px; }.signal-line { display:flex; justify-content:space-between; color:var(--muted); font:11px var(--mono); }.signal-bar { height:5px; border-radius:99px; background:var(--line); overflow:hidden; }.signal-bar span { display:block; height:100%; background:linear-gradient(90deg,var(--accent),var(--accent-2)); border-radius:inherit; } .detail { display:grid; grid-template-columns:260px minmax(0,1fr); gap:24px; }.detail .cover { width:100%; }.detail h1 { margin:0; font:clamp(36px,5vw,64px) var(--display); }.detail .lede { max-width:680px; color:var(--muted); font-size:16px; }.facts { display:grid; grid-template-columns:repeat(3,1fr); gap:10px; margin:20px 0; }.fact { padding:12px; border:1px solid var(--line); border-radius:12px; background:var(--panel); }.fact strong { display:block; color:var(--accent); font:10px var(--mono); text-transform:uppercase; }.fact span { display:block; margin-top:4px; }.relations { display:flex; flex-wrap:wrap; gap:8px; }.relation { border:1px solid var(--line); border-radius:999px; padding:7px 10px; color:var(--muted); font-size:12px; } .notice { padding:12px 14px; border-left:3px solid var(--accent-2); border-radius:8px; background:rgba(140,123,255,.08); color:var(--muted); font-size:12px; }.notice strong { color:var(--text); } .drawer { position:fixed; z-index:10; inset:0 0 0 auto; width:min(440px,100%); padding:24px; overflow:auto; border-left:1px solid var(--line-strong); background:var(--bg-deep); box-shadow:-30px 0 80px rgba(0,0,0,.3); transform:translateX(100%); transition:transform .22s; }.drawer.open { transform:none; }.drawer-close { float:right; border:1px solid var(--line); border-radius:50%; width:30px; height:30px; background:transparent; cursor:pointer; }.drawer h2 { margin:45px 0 5px; font:32px var(--display); }.drawer-cover { width:140px; margin:20px 0; }.drawer dl { display:grid; grid-template-columns:1fr 1fr; gap:10px; }.drawer dt { color:var(--faint); font:10px var(--mono); text-transform:uppercase; }.drawer dd { margin:2px 0 0; }.toast { position:fixed; z-index:20; left:50%; bottom:24px; transform:translateX(-50%); padding:11px 15px; border:1px solid var(--line-strong); border-radius:999px; background:var(--panel-strong); box-shadow:var(--shadow); } .empty { padding:40px; text-align:center; color:var(--muted); border:1px dashed var(--line-strong); border-radius:16px; }.hidden { display:none!important; } @media (max-width:980px) { .shell{grid-template-columns:82px minmax(0,1fr)} .rail{padding:22px 10px}.brand{justify-content:center}.brand div:last-child,.nav span,.rail-card{display:none}.nav button{justify-content:center;padding:12px}.content{padding:24px}.topbar{padding:15px 24px}.expression label{display:none}.card-row{grid-template-columns:repeat(2,minmax(0,1fr))}.volumes{grid-template-columns:repeat(2,minmax(0,1fr))}.grid-2{grid-template-columns:1fr} } @media (max-width:620px) { .shell{display:block}.rail{position:fixed;z-index:8;bottom:0;top:auto;width:100%;height:auto;padding:7px;border-top:1px solid var(--line);border-right:0}.brand{display:none}.nav{display:flex;justify-content:space-around}.nav button{flex:1;justify-content:center}.main{padding-bottom:64px}.topbar{padding:12px 16px;gap:9px;flex-wrap:wrap}.search{order:1;flex:1 1 100%;max-width:none}.expression{order:2;margin-left:0}.top-stat{display:none}.content{padding:18px 14px}.hero{min-height:400px;padding:22px}.hero h1{font-size:48px}.stats{grid-template-columns:repeat(2,1fr)}.detail{grid-template-columns:1fr}.detail .cover{max-width:220px}.facts{grid-template-columns:1fr}.card-row,.volumes{grid-template-columns:1fr 1fr}.book-card h3{font-size:16px}.section-head h2{font-size:23px} } /* Purpose-driven field surface: no product-shell chrome. */ .shell { display:block; } .topbar { padding:14px 34px; } .top-brand { display:flex; align-items:center; gap:9px; min-width:180px; color:var(--muted); font:10px var(--mono); letter-spacing:.08em; text-transform:uppercase; } .top-brand .brand-mark { width:25px; height:25px; font-size:12px; } .topbar .search { max-width:620px; } .content { width:min(1540px,100%); padding:34px 42px 80px; } .workspace-head { display:flex; align-items:end; justify-content:space-between; gap:30px; padding:8px 0 30px; border-bottom:1px solid var(--line); } .workspace-head h1 { margin:7px 0 4px; font:clamp(34px,5vw,62px)/.95 var(--display); letter-spacing:-.04em; } .workspace-head p { max-width:660px; margin:0; color:var(--muted); font-size:15px; } .workspace-state { min-width:245px; display:grid; gap:3px; padding:14px 16px; border-left:1px solid var(--line); color:var(--muted); font:10px var(--mono); text-transform:uppercase; letter-spacing:.08em; } .workspace-state strong { margin-bottom:8px; color:var(--text); font:12px var(--sans); text-transform:none; letter-spacing:0; } .shelf { margin-top:42px; } .shelf-head { display:flex; align-items:end; justify-content:space-between; gap:20px; margin-bottom:16px; } .shelf-head h2 { margin:4px 0 2px; font:clamp(25px,3vw,38px)/1 var(--display); letter-spacing:-.025em; } .shelf-head p { max-width:740px; margin:0; color:var(--muted); font-size:13px; } .shelf-head .btn { flex:none; } .purpose-hero { min-height:300px; display:grid; grid-template-columns:260px minmax(0,1fr) 180px; gap:28px; align-items:center; padding:24px; border:1px solid var(--line-strong); border-radius:var(--radius); background:linear-gradient(105deg,rgba(85,215,196,.12),rgba(140,123,255,.08) 55%,transparent),var(--panel); } .purpose-cover { width:100%; max-width:260px; aspect-ratio:4/5; } .purpose-copy h3 { margin:5px 0 5px; font:clamp(30px,5vw,68px)/.95 var(--display); } .purpose-copy p { max-width:530px; color:var(--muted); font-size:16px; } .purpose-copy .progress { max-width:460px; margin:22px 0 14px; } .purpose-orbit { display:grid; gap:4px; padding-left:18px; border-left:1px solid var(--line); color:var(--muted); font:10px var(--mono); text-transform:uppercase; } .purpose-orbit b { margin-bottom:16px; color:var(--accent); font-size:25px; } .banner-field { min-height:330px; position:relative; overflow:hidden; border:1px solid var(--line); border-radius:var(--radius); background:radial-gradient(circle at 76% 48%,color-mix(in srgb,var(--accent-2) 35%,transparent),transparent 23%),linear-gradient(105deg,rgba(5,10,16,.96) 16%,rgba(5,10,16,.36) 62%),linear-gradient(135deg,#19374a,#261c42 55%,#7a4246); } .banner-field:before { content:""; position:absolute; inset:0; opacity:.45; background:repeating-linear-gradient(115deg,transparent 0 32px,rgba(255,255,255,.12) 33px 34px); } .banner-copy { position:relative; z-index:1; max-width:470px; padding:48px 42px; }.banner-copy h3 { margin:7px 0; font:clamp(34px,5vw,72px)/.9 var(--display); }.banner-copy p { color:var(--muted); font-size:15px; } .banner-constellation { position:absolute; inset:0; }.constellation-node { position:absolute; z-index:1; width:118px; aspect-ratio:1; display:grid; place-items:center; padding:12px; border:1px solid var(--accent); border-radius:50%; color:var(--text); background:rgba(7,13,24,.65); cursor:pointer; font:12px var(--mono); text-align:center; box-shadow:0 0 30px color-mix(in srgb,var(--accent) 20%,transparent); }.cn0{right:23%;top:18%}.cn1{right:5%;top:38%;border-color:var(--hot)}.cn2{right:28%;bottom:8%;border-color:var(--accent-2)}.cn3{right:7%;bottom:10%;border-color:#72a6ef} .mini-row { display:flex; gap:12px; overflow:auto; padding:3px 2px 12px; }.mini-card { min-width:270px; flex:1; display:grid; grid-template-columns:88px minmax(0,1fr); gap:13px; padding:9px; border:1px solid var(--line); border-radius:14px; background:var(--panel); cursor:pointer; }.mini-card:hover { border-color:var(--accent); }.mini-card .cover { width:88px; aspect-ratio:3/4; }.mini-copy { min-width:0; }.mini-kicker { color:var(--accent); font:10px var(--mono); text-transform:uppercase; }.mini-card h3 { margin:7px 0 3px; font:20px var(--display); }.mini-card p { margin:0; color:var(--muted); font-size:12px; }.mini-footer { display:flex; flex-wrap:wrap; gap:7px; align-items:center; margin-top:12px; color:var(--faint); font:10px var(--mono); }.relation-chip { padding:3px 6px; border:1px solid var(--line); border-radius:999px; color:var(--muted); } .split-field { display:grid; grid-template-columns:minmax(280px,.95fr) minmax(0,1.05fr); gap:18px; }.split-art { min-height:280px; position:relative; overflow:hidden; border:1px solid var(--line); border-radius:var(--radius); background:var(--panel); }.split-art .cover { height:100%; aspect-ratio:auto; border-radius:0; }.split-art > span { position:absolute; left:18px; bottom:15px; color:#fff; font:11px var(--mono); text-transform:uppercase; text-shadow:0 1px 12px #000; }.split-list { border-top:1px solid var(--line); }.evidence-row { width:100%; display:grid; grid-template-columns:34px minmax(0,1fr) 50px; gap:12px; align-items:center; padding:15px 8px; border:0; border-bottom:1px solid var(--line); background:transparent; color:inherit; cursor:pointer; text-align:left; }.evidence-row:hover { background:var(--panel-soft); }.evidence-index { color:var(--accent); font:12px var(--mono); }.evidence-row strong,.evidence-row small { display:block; }.evidence-row strong { font:18px var(--display); }.evidence-row small { color:var(--muted); font:11px var(--mono); }.evidence-row b { color:var(--accent); font:18px var(--display); text-align:right; } .matrix-field { display:grid; grid-template-columns:repeat(4,minmax(0,1fr)); gap:10px; padding:10px; border:1px solid var(--line); background:var(--panel); }.matrix-field .mini-card { min-width:0; display:block; padding:0; border:1px solid var(--line); border-radius:10px; background:var(--bg-deep); }.matrix-field .mini-card .cover { width:100%; aspect-ratio:1/1.08; border-radius:0; }.matrix-field .mini-copy { padding:10px; }.matrix-field .mini-card h3 { font-size:18px; }.matrix-field .mini-card p { display:none; }.matrix-field .mini-footer { margin-top:8px; }.matrix-field .featured { grid-column:span 2; grid-row:span 2; }.matrix-field .featured .cover { aspect-ratio:1.55/1; } .portal-field { display:flex; gap:20px; justify-content:space-between; padding:14px 0 4px; overflow:auto; }.portal { min-width:160px; aspect-ratio:1; display:flex; flex-direction:column; justify-content:end; align-items:center; padding:20px 12px; border:1px solid var(--line-strong); border-radius:50%; color:var(--text); background:radial-gradient(circle at 35% 25%,color-mix(in srgb,var(--accent) 35%,transparent),transparent 25%),linear-gradient(145deg,#1b3142,#121522); cursor:pointer; text-align:center; }.portal:hover { transform:translateY(-4px); border-color:var(--accent); }.portal span { font:20px var(--display); }.portal small { margin-top:4px; color:var(--muted); font:10px var(--mono); }.p1{background:radial-gradient(circle at 35% 25%,rgba(239,115,127,.4),transparent 25%),linear-gradient(145deg,#40233c,#151725)}.p2{background:radial-gradient(circle at 35% 25%,rgba(243,156,103,.4),transparent 25%),linear-gradient(145deg,#403026,#151c24)} @media (max-width:900px) { .top-brand{min-width:auto}.top-brand span:last-child{display:none}.content{padding:26px 22px 70px}.workspace-head{align-items:start;flex-direction:column}.workspace-state{width:100%;grid-template-columns:1fr 1fr;padding:12px;border-left:0;border-top:1px solid var(--line)}.purpose-hero{grid-template-columns:180px minmax(0,1fr);}.purpose-orbit{grid-column:1/-1;grid-template-columns:1fr 1fr;border-left:0;border-top:1px solid var(--line);padding:14px 0 0}.purpose-orbit b{margin-bottom:0}.matrix-field{grid-template-columns:repeat(2,minmax(0,1fr))}.matrix-field .featured{grid-column:span 2} } @media (max-width:620px) { .topbar{padding:12px 14px}.top-brand{order:0}.topbar .search{order:1}.expression{order:2}.content{padding:20px 14px 72px}.shelf-head{align-items:start;flex-direction:column}.shelf-head .btn{align-self:flex-start}.purpose-hero{grid-template-columns:1fr;padding:16px}.purpose-cover{max-width:170px}.purpose-orbit{grid-template-columns:1fr 1fr}.banner-copy{padding:30px 24px}.banner-constellation{opacity:.62}.constellation-node{width:78px;font-size:9px}.cn0{right:25%;top:17%}.cn1{right:2%;top:40%}.cn2{right:29%;bottom:6%}.cn3{right:0;bottom:9%}.split-field{grid-template-columns:1fr}.split-art{min-height:230px}.matrix-field{grid-template-columns:1fr 1fr;gap:7px}.matrix-field .featured{grid-column:span 2}.matrix-field .mini-card h3{font-size:15px}.portal{min-width:125px}.portal span{font-size:16px} } ======================================================================== ## SUBSYSTEM: EVIDENCE & WORK RECORDS (4 files) ======================================================================== --- FILE: evidence/SPS-001-browser.md (28 lines, 1.6 KiB) --- # SPS-001 Browser Evidence Date: 2026-08-17 Environment: local Python HTTP server, `http://localhost:4177/` ## Observed - Overview renders with reader state, semantic publication framing, derived shelves, and the protected- resource boundary. - The refactored field surface removes generic navigation, marketing chrome, and dashboard side items; the visible implementation is the purpose-driven shelf composition itself. - Shelves resolve distinct forms: active-thread hero, world banner, relationship rail, editorial split, dense matrix, and world portals. - Library groups by `seriesId` and sorts volumes by `ordinal`. - Selecting a library volume opens publication detail rather than only a flat card inspector. - Continue reading enters a separate reader projection with an explicit entitlement-required state. - Expression switching changes visual tokens while preserving publication labels and operation identity. - Field view renders relational topology and field signal readings, with an optional signals-first Fundamental Engine adapter bound to the marked publication bodies when the CDN is reachable. - Live verification observed five `[data-body]` nodes and a non-zero `--field-density` write-back on a field node (`0.364` in the verification frame). - Desktop and narrow viewport layouts render without horizontal overflow after the breakpoint correction. ## Evidence limits Fixtures stand in for publication APIs. No backend, CAS, entitlement service, or ICP runtime is connected in this slice. Visual and DOM evidence qualifies the local prototype only; it does not establish production schema, resource-delivery, accessibility, or security conformance. --- FILE: evidence/SPS-002-packaging.md (6 lines, 0.3 KiB) --- # SPS-002 evidence - `node -e "JSON.parse(...)"` on package.json exits 0. - `files` entries exist: docs/, INTENT.md, README.md. - Limitation: private/UNLICENSED until the owner selects a license (scms UD-12); not published to any registry; consumed by local content-digest pin only. --- FILE: work/SPS-001.md (36 lines, 1.7 KiB) --- # SPS-001 — Integrated publication substrate prototype Status: Implemented — prototype evidence recorded Workspace: `.` Scope: local files and local browser preview only Protected actions: none ## Objective Build a comprehensive reversible prototype that makes the SPS architecture tangible in one host: canonical publication data, semantic publication projections, replaceable visual expressions, relational field signals, inspectable provenance, and governed interaction states. The implementation must resolve container morphology from purpose and evidence. Generic dashboard chrome, fixed card grids, and marketing-only surfaces are outside the issue's intended experience. ## Acceptance evidence - Home, library, series, publication detail, and field views are reachable without a backend. - Expression switching preserves the same publication identity and operation labels. - Library groups publications by series and orders volumes by ordinal. - Field explanations expose derived observations and relationship types. - Text-layer entitlement is represented without displaying protected text in discovery views. - Continue, library, filter, and expression interactions have visible state feedback. - Browser visual verification is performed at desktop and narrow viewport sizes. ## Non-goals No production API integration, external communication, deployment, publication, payment, or destructive state changes. ## Evidence See `evidence/SPS-001-browser.md`. The artifact is implemented and browser-tested locally. It is not empirically validated as a production publication system, and package release remains provisional because the upstream YAML validation dependency was unavailable in the environment. --- FILE: work/SPS-002.md (21 lines, 0.8 KiB) --- # SPS-002 — Package manifest for downstream dependency consumption Status: Completed — manifest added, no normative change ## Intent Owner-directed (2026-08-28): downstream project semantic-cms pins SPS as a formal resource under its isolation doctrine and needs a declared consumption boundary (same pattern as semantic-expression-system SES-041). ## Change `package.json` (additive): name/version matching the project, `files` naming the normative surface (docs/, INTENT.md). Marked private with license UNLICENSED — no LICENSE exists in this project; license selection is an open owner decision recorded downstream (scms UD-12). Nothing under docs/, work/, evidence/, or the prototype changed. ## Acceptance Manifest parses; named files exist; no other file touched. ======================================================================== ## SUBSYSTEM: OTHER MODULES (1 files) ======================================================================== --- FILE: package.json (8 lines, 0.4 KiB) --- { "name": "semantic-publication-substrate", "version": "0.1.0", "description": "Semantic Publication Substrate (SPS): publication-aware semantic layering — the six-layer stack, source-of-truth ownership, evidence-resolved morphology, protected-resource discovery. Normative content is docs/; the root HTML/JS is the reference prototype, not a library.", "license": "UNLICENSED", "private": true, "files": ["docs/", "INTENT.md", "README.md"] }