Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 4 additions & 1 deletion docs/site/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,10 @@ The front and technical layers use the same existing evidence. No second scienti

`tools/current_site_data.py` resolves public main and Math- commits once, verifies their complete Git trees and the seven acquired source files, and extracts exact indented proof displays. Other inventory rows bind paths and Git blobs; their document bytes are not downloaded. The page calls equation blocks excerpts and keeps their surrounding proof scope available by pinned line links. `tools/current_site_build.py` renders one payload offline into marked current sections and static node pages; Research and Formal stay script-free. Current observations and original dated reading cuts have separate identities.

The proposed `current-site.yml` builds on main pushes and a 30-minute schedule and deploys the complete tested docs artifact through Pages Actions. Deployment needs verified Pages source configuration and actual hosted success before it can be called active. A failed source refresh cannot reach deployment. Source observations are not mathematical revalidation. Existing diagrams on Explore keep their defined teaching scope; the new source panel links the advancing work.
The configured `.github/workflows/current-site.yml` builds on main pushes and a 30-minute schedule and deploys the complete tested docs artifact through Pages Actions. Each candidate needs its own hosted success and deployed-source acceptance. A failed source refresh cannot reach deployment. Source observations are not mathematical revalidation. Existing diagrams on Explore keep their defined teaching scope; the new source panel links the advancing work.


Observed production on 17 October 2026: [run 39076035717, attempt 1](https://github.com/d6g8k5htny-coder/main/actions/runs/39076035717) successfully built and deployed Main `df590a438f1252309270ca625c6fe8531ddadc3b`. The [dated #410 verification record](https://github.com/d6g8k5htny-coder/main/pull/410#issuecomment-6242575372) binds the observed receipt to exact public manifest, metadata and payload bytes, with public browser readback at 22:45:59–22:46:08 UTC. This establishes that observed publication only; later #415, #425 and atlas candidates need their own hosted and deployed-source acceptance. Source observations and deployment are not scientific revalidation.

Local current-view controls: `python3 -B -S -m unittest tests.test_current_site_data tests.test_current_site_build`; `node --test tests/test_current_site.mjs`; and, with the pinned browser packages and packaged Chrome, `python3 -B tools/current_site_browser_check.py --output browser-evidence/current-atlas`.

Expand Down
6 changes: 3 additions & 3 deletions docs/site/app.js
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import {verifiedJSON, verifiedBytes, validateStatus, validateCoefficient, safeSourceURL, hex40, hex64} from './core.mjs?site-release=edba1b0463dbcc320babb9a5845fb859602619b3d91bb4983f7b86c0ebcab353';
import {connectCatalogQuery} from './catalog-query.mjs?site-release=edba1b0463dbcc320babb9a5845fb859602619b3d91bb4983f7b86c0ebcab353';
import {prepareWorkspaceFragment} from './workspace-fragment.mjs?site-release=edba1b0463dbcc320babb9a5845fb859602619b3d91bb4983f7b86c0ebcab353';
import {verifiedJSON, verifiedBytes, validateStatus, validateCoefficient, safeSourceURL, hex40, hex64} from './core.mjs?site-release=221190dfe9a7e6a13a5becc8078185060ea4edb58f041a1ddf27ae7dcb88b456';
import {connectCatalogQuery} from './catalog-query.mjs?site-release=221190dfe9a7e6a13a5becc8078185060ea4edb58f041a1ddf27ae7dcb88b456';
import {prepareWorkspaceFragment} from './workspace-fragment.mjs?site-release=221190dfe9a7e6a13a5becc8078185060ea4edb58f041a1ddf27ae7dcb88b456';
const finishFragment=prepareWorkspaceFragment();
const el=id=>document.getElementById(id);
const node=(tag,text,cls)=>{const n=document.createElement(tag);if(text!==undefined)n.textContent=text;if(cls)n.className=cls;return n;};
Expand Down
77 changes: 77 additions & 0 deletions docs/site/atlas-shell.mjs
Original file line number Diff line number Diff line change
@@ -0,0 +1,77 @@
// Presentation only: this module never fetches, admits or classifies source data.
export function viewForViewport(search,parsedView,narrow){
const requested=new URLSearchParams(search).get('atlas-view');
return requested==='graph'||requested==='list'?requested:narrow?'list':'graph';
}

export function createAtlasShell({root,inspector,diagnostics,media,location,history,onChange}){
const doc=root.ownerDocument,layout=inspector.parentElement,browse=layout.children[0];
const make=(tag,id,text)=>{const node=doc.createElement(tag);if(id)node.id=id;if(text)node.textContent=text;return node;};
const reader=make('section','atlas-reader');reader.setAttribute('class','atlas-reader');reader.setAttribute('aria-label','Selected node reader');
const navigation=make('nav');navigation.setAttribute('class','atlas-reader-navigation');navigation.setAttribute('aria-label','Reader navigation');
const back=make('button','atlas-reader-back','Back'),forward=make('button','atlas-reader-forward','Forward'),browseLink=make('a','atlas-browse-link','Return to atlas browse');
for(const button of [back,forward])button.type='button';
back.addEventListener('click',()=>history.back());forward.addEventListener('click',()=>history.forward());navigation.append(back,forward,browseLink);
const tabs=make('div','atlas-inspector-tabs');tabs.setAttribute('role','tablist');tabs.setAttribute('aria-label','Selected node information');
const names=['evidence','diagnostics'],buttons=[],panels=[];
for(const name of names){
const tab=make('button','atlas-tab-'+name,name==='evidence'?'Evidence':'Diagnostics');tab.type='button';tab.setAttribute('role','tab');tab.setAttribute('aria-controls','atlas-panel-'+name);
const panel=make('div','atlas-panel-'+name);panel.setAttribute('role','tabpanel');panel.setAttribute('aria-labelledby',tab.id);panel.tabIndex=0;
buttons.push(tab);panels.push(panel);tabs.append(tab);
tab.addEventListener('click',()=>activate(name));
tab.addEventListener('keydown',event=>{
const index=buttons.indexOf(tab);let next;
if(event.key==='ArrowRight')next=(index+1)%names.length;
else if(event.key==='ArrowLeft')next=(index+names.length-1)%names.length;
else if(event.key==='Home')next=0;
else if(event.key==='End')next=names.length-1;
else return;
event.preventDefault();buttons[next].focus();
});
}
layout.insertBefore(reader,inspector);panels[0].append(inspector);panels[1].append(diagnostics);reader.append(navigation,tabs,...panels);
browse.setAttribute('data-atlas-browse','');
const open=make('button','atlas-open-reader','Read selected node');open.type='button';browse.append(open);
let mode='browse';
function apply(){
root.setAttribute('data-atlas-panel',mode);
const selected=mode==='diagnostics'?1:0;
for(let i=0;i<buttons.length;i++){buttons[i].setAttribute('aria-selected',String(i===selected));buttons[i].tabIndex=i===selected?0:-1;panels[i].hidden=i!==selected;}
}
function focusReading(){(mode==='diagnostics'?panels[1]:inspector).focus({preventScroll:true});if(media.matches)reader.scrollIntoView({block:'start',behavior:'auto'});}
function focusBrowse(){open.focus({preventScroll:true});open.scrollIntoView({block:'center',inline:'nearest',behavior:'auto'});}
function activate(next){if(mode===next)return;mode=next;apply();onChange();}
function selectNode(){mode='evidence';apply();}
function restore(url,{focus=false}={}){
const value=new URL(url,location.href).searchParams.get('atlas-panel');mode=names.includes(value)?value:'browse';apply();
if(focus){if(media.matches&&mode==='browse')focusBrowse();else focusReading();}
}
function decorateURL(url){if(mode==='browse')url.searchParams.delete('atlas-panel');else url.searchParams.set('atlas-panel',mode);return url;}
function updateLinks(url){const target=new URL(url,location.href);target.searchParams.delete('atlas-panel');browseLink.href=target.href;}
open.addEventListener('click',()=>{activate('evidence');focusReading();});
browseLink.addEventListener('auxclick',()=>updateLinks(location.href));
browseLink.addEventListener('click',event=>{
updateLinks(location.href);
if(event.button!==0||event.metaKey||event.ctrlKey||event.shiftKey||event.altKey)return;
event.preventDefault();activate('browse');if(media.matches)focusBrowse();else buttons[0].focus();
Comment thread
d6g8k5htny-coder marked this conversation as resolved.
});
// A layout read can hide a mobile control and blur it before media.change.
// Remember only that hidden-target blur; ordinary or outside focus wins.
let blurredByLayout=null;
root.addEventListener('focusout',event=>{blurredByLayout=!event.relatedTarget&&!event.target.getClientRects().length?event.target:null;});
root.addEventListener('focusin',()=>{blurredByLayout=null;});
media.addEventListener('change',()=>{
const focused=doc.activeElement===doc.body&&blurredByLayout?blurredByLayout:doc.activeElement,wasReader=reader.contains(focused),wasBrowse=browse.contains(focused);blurredByLayout=null;
onChange({write:false});
const unavailable=!root.contains(focused)||!focused?.getClientRects().length;
// The atlas renderer replaces source and node children. Repair after it
// finishes so focus cannot remain detached or in a newly hidden region.
if(media.matches){
if(mode==='browse'&&(wasReader||wasBrowse&&unavailable))focusBrowse();
else if(mode!=='browse'&&(wasBrowse||wasReader&&unavailable))focusReading();
}else if(navigation.contains(focused)||focused===open||wasBrowse&&unavailable)buttons[mode==='diagnostics'?1:0].focus({preventScroll:true});
else if(wasReader&&unavailable)focusReading();
});
restore(location.href);updateLinks(location.href);
return {selectNode,focusReading,restore,decorateURL,updateLinks,reset(){mode='browse';apply();}};
}
Loading
Loading