Spaces:
Running
Running
feat(domain-v4): publish panels.html
Browse files- panels.html +149 -0
panels.html
ADDED
|
@@ -0,0 +1,149 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
<!doctype html>
|
| 2 |
+
<html lang="en" data-szl-public-experience-v3="true" data-szl-domain-experience-v4="true" data-domain="finance">
|
| 3 |
+
<head><meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1,viewport-fit=cover"><meta name="theme-color" content="#05070a"><title>PURIQ Finance β SZL Holdings</title><style>
|
| 4 |
+
:root{color-scheme:dark;--touch:44px;--stage:1440px;--gutter:clamp(16px,3vw,42px);--line:rgba(255,255,255,.12);--muted:#98a4b3;--ink:#f8fafc;--bg:#05070a;--panel:rgba(12,16,22,.86);--accent:#7dd3fc;--accent2:#a7f3d0}
|
| 5 |
+
*{box-sizing:border-box;min-inline-size:0}html{max-inline-size:100%;overflow-x:clip;text-size-adjust:100%}body{margin:0;min-height:100vh;max-inline-size:100%;overflow-x:clip;background:var(--bg);color:var(--ink);font:15px/1.55 Inter,ui-sans-serif,system-ui,sans-serif}a,button{min-block-size:var(--touch)}a{color:inherit;overflow-wrap:anywhere}button{border:1px solid var(--line);background:var(--ink);color:var(--bg);padding:10px 15px;border-radius:9px;font-weight:800;cursor:pointer}button:focus-visible,a:focus-visible{outline:3px solid var(--accent);outline-offset:3px}.shell{width:min(100%,var(--stage));margin:auto;padding:calc(24px + env(safe-area-inset-top)) var(--gutter) calc(64px + env(safe-area-inset-bottom))}.top{display:flex;justify-content:space-between;align-items:center;gap:16px;flex-wrap:wrap}.brand{font-weight:900;letter-spacing:.16em}.eyebrow,.mono,.status{font:700 11px/1.4 ui-monospace,SFMono-Regular,Menlo,monospace;letter-spacing:.12em;text-transform:uppercase}.eyebrow{color:var(--accent)}h1{font-size:clamp(44px,8vw,116px);line-height:.88;letter-spacing:-.06em;margin:16px 0 22px;max-inline-size:12ch;overflow-wrap:anywhere}.lede{font-size:clamp(17px,2vw,22px);max-inline-size:70ch;color:var(--muted)}.flow{display:flex;gap:8px;flex-wrap:wrap;margin:30px 0}.flow span{border:1px solid var(--line);padding:8px 10px;border-radius:999px;font:700 10px ui-monospace,monospace;letter-spacing:.1em}.panel{border:1px solid var(--line);background:var(--panel);border-radius:18px;padding:18px}.livebar{display:flex;justify-content:space-between;align-items:center;gap:12px;flex-wrap:wrap}.status{display:flex;align-items:center;gap:8px}.dot{inline-size:8px;block-size:8px;border-radius:50%;background:#64748b}.is-live .dot{background:var(--accent2);box-shadow:0 0 18px var(--accent2)}pre{white-space:pre-wrap;overflow-wrap:anywhere;word-break:break-word;max-block-size:360px;overflow:auto;font:12px/1.55 ui-monospace,monospace;color:#cbd5e1}.footer{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:12px;margin-top:18px}.footer .panel{font-size:12px;color:var(--muted)}.footer b{display:block;color:var(--ink);margin-bottom:8px}.truth{display:flex;gap:7px;flex-wrap:wrap}.truth span{font:700 10px ui-monospace,monospace;border:1px solid var(--line);padding:6px 8px;border-radius:6px}@media(max-width:760px){.footer{grid-template-columns:1fr}h1{font-size:clamp(42px,16vw,72px)}}@media(pointer:coarse){a,button{min-block-size:48px}}@media(prefers-reduced-motion:reduce){*,*::before,*::after{animation-duration:.001ms!important;animation-iteration-count:1!important;transition-duration:.001ms!important;scroll-behavior:auto!important}}@media(forced-colors:active){*{forced-color-adjust:auto}.panel{border:1px solid CanvasText}}
|
| 6 |
+
.illus{display:inline-block;font:700 9.5px ui-monospace,monospace;letter-spacing:.14em;text-transform:uppercase;color:#d4a444;border:1px dashed rgba(212,164,68,.55);border-radius:6px;padding:4px 8px;margin-bottom:10px}
|
| 7 |
+
.tape>.illus{grid-column:1/-1;margin:10px 12px 9px}
|
| 8 |
+
:root{--bg:#030403;--panel:rgba(7,10,7,.95);--muted:#9ca892;--accent:#f6c85f;--accent2:#7cf29a}.domain{margin-top:48px;display:grid;grid-template-columns:1fr;gap:12px}.tape{display:grid;grid-template-columns:repeat(5,minmax(0,1fr));gap:1px;background:var(--line);border:1px solid var(--line)}.quote{background:#050805;padding:14px}.quote b{display:block;font:900 18px ui-monospace,monospace;color:var(--accent2)}.quote span{font:700 10px ui-monospace,monospace;color:var(--muted)}.matrix{display:grid;grid-template-columns:minmax(0,1.25fr) minmax(280px,.75fr);gap:12px}.ledger{font:12px ui-monospace,monospace}.row{display:grid;grid-template-columns:1.2fr .7fr .7fr .8fr;gap:8px;padding:10px 0;border-bottom:1px solid var(--line)}.row b{color:var(--accent)}.stress{display:grid;gap:10px}.bar{display:grid;grid-template-columns:90px 1fr 50px;gap:8px;align-items:center}.bar i{display:block;block-size:8px;background:linear-gradient(90deg,var(--accent2),var(--accent));border-radius:9px}@media(max-width:850px){.tape{grid-template-columns:1fr 1fr}.matrix{grid-template-columns:1fr}.row{grid-template-columns:1fr 1fr}}
|
| 9 |
+
.finance-desk{margin-top:32px;display:grid;gap:16px;min-width:0}.finance-desk *{box-sizing:border-box;min-width:0}.finance-desk .fin-head{display:flex;gap:12px;flex-wrap:wrap;justify-content:space-between;align-items:center}.finance-desk h2{margin:0;font-size:clamp(22px,4vw,34px)}.finance-desk h3{font-size:18px;margin:0 0 12px}.finance-desk .fin-note{font-size:14px;line-height:1.65;color:var(--muted);overflow-wrap:anywhere}.finance-desk .fin-state{font:700 12px ui-monospace,monospace;letter-spacing:.08em;border:1px solid var(--line);padding:10px;overflow-wrap:anywhere}.finance-desk .fin-grid{display:grid;grid-template-columns:minmax(0,.85fr) minmax(0,1.4fr);gap:16px}.finance-desk .fin-fields{display:grid;grid-template-columns:repeat(auto-fit,minmax(min(100%,190px),1fr));gap:12px;margin:16px 0}.finance-desk label{display:block;font-size:14px;line-height:1.6}.finance-desk input,.finance-desk select{display:block;width:100%;max-width:100%;min-height:44px;background:#0b1119;color:var(--text,#edf3ff);border:1px solid #50637d;border-radius:6px;padding:10px;font-size:16px}.finance-desk button{min-width:44px;min-height:44px;white-space:normal}.finance-desk button:disabled{opacity:.65;cursor:not-allowed}.finance-desk .fin-actions{display:flex;flex-wrap:wrap;gap:10px}.finance-desk :focus-visible{outline:3px solid var(--accent,#a6c8ff);outline-offset:3px}.finance-desk .fin-scroll{overflow:auto;max-width:100%;border:1px solid var(--line)}.finance-desk table{width:100%;border-collapse:collapse;table-layout:fixed;font-size:13px}.finance-desk th,.finance-desk td{padding:10px;text-align:left;vertical-align:top;border-bottom:1px solid var(--line);overflow-wrap:anywhere}.finance-desk summary{min-height:44px;padding:12px;cursor:pointer}.finance-desk caption{padding:10px;text-align:left;line-height:1.5}.finance-desk svg{display:block;width:100%;height:auto;max-height:280px;border:1px solid var(--line);background:linear-gradient(130deg,rgba(86,136,255,.09),rgba(136,80,255,.04))}.finance-desk .fin-provenance{white-space:pre-wrap;overflow-wrap:anywhere;max-height:380px;overflow:auto;font-size:12px;line-height:1.6}.finance-desk .fin-instrument{min-height:170px;background:radial-gradient(ellipse at 30% 0,rgba(94,143,255,.13),transparent 70%)}.finance-desk [hidden]{display:none!important}@media(max-width:800px){.finance-desk .fin-grid{grid-template-columns:1fr}.finance-desk th,.finance-desk td{padding:6px}}@media(prefers-reduced-motion:reduce){.finance-desk *{animation:none!important;transition:none!important;scroll-behavior:auto!important}}@media(forced-colors:active){.finance-desk input,.finance-desk select,.finance-desk button,.finance-desk svg{border:1px solid CanvasText}.finance-desk polyline{stroke:CanvasText!important}}
|
| 10 |
+
</style></head>
|
| 11 |
+
<body><main class="shell"><header class="top"><div class="brand">SZL HOLDINGS / PURIQ FINANCE</div><div class="mono">DOMAIN EXPERIENCE V4 Β· SOURCE BOUND</div></header><section style="margin-top:clamp(52px,9vw,112px)"><div class="eyebrow">FINANCIAL INTELLIGENCE</div><h1>PURIQ Finance</h1><p class="lede">Provenance-first financial signal and decision console. One governed runtime underneath; a domain-native workbench above it. Observed evidence, modeled analysis, human authority, and audit receipts remain separate states.</p><div class="flow"><span>INGEST</span><span>PRICE</span><span>STRESS</span><span>DECIDE</span><span>AUDIT</span></div></section>
|
| 12 |
+
<section id="fin-desk" class="finance-desk" data-szl-finance-workspace="1" aria-labelledby="fin-title">
|
| 13 |
+
<div class="panel fin-head"><div><div class="mono">PURIQ / SOURCE WORKBENCH</div><h2 id="fin-title">Inspect the evidence before the thesis.</h2></div><button id="fin-refresh" type="button">Refresh source status</button></div>
|
| 14 |
+
<div class="panel"><p id="fin-registry-state" class="fin-state" role="status">NOT PROBED</p><p class="fin-note">Configuration is not connectivity. Status describes the last request for an adapter, not every market or instrument. Source revision: <span id="fin-revision">UNAVAILABLE</span>.</p><details><summary>Inspect the 16-source access register</summary><div class="fin-scroll" tabindex="0" role="region" aria-label="Provider status table"><table><caption>Canonical market-data adapters. Owner-only sources are not exposed by this public Space.</caption><thead><tr><th scope="col">Source</th><th scope="col">Last-request state</th><th scope="col">Access</th></tr></thead><tbody id="fin-provider-body"></tbody></table></div></details></div>
|
| 15 |
+
<div class="fin-grid"><section class="panel"><h3>One bounded observation</h3><form id="fin-form"><label for="fin-source">Source</label><select id="fin-source" name="source" disabled></select><p id="fin-operation" class="fin-note">Waiting for the canonical source contract.</p><div id="fin-fields" class="fin-fields"></div><div class="fin-actions"><button id="fin-observe" type="submit" disabled>Read public source</button><button id="fin-export" type="button" disabled>Export observation</button></div></form><p class="fin-note">Public observations only. No account, wallet, order, credential entry, model inference, or trading authorization. Polymarket and Kalshi contract equivalence is not established. Filings retain period and filing-date context.</p></section>
|
| 16 |
+
<section class="panel fin-instrument"><h3>Source instrument</h3><p id="fin-result-state" class="fin-state" role="status">UNAVAILABLE</p><div id="fin-chart"></div><p id="fin-chart-note" class="fin-note">No chart observation.</p></section></div>
|
| 17 |
+
<section class="panel"><h3>Returned records</h3><div id="fin-result-table" class="fin-scroll" tabindex="0" role="region" aria-label="Returned source records"></div><details><summary>Source envelope and provenance</summary><p class="fin-note">Digests establish internal consistency, not signatures, investment performance, or source authenticity. Display is limited to 250,000 characters; export preserves the accepted public response.</p><pre id="fin-detail" class="fin-provenance">No accepted observation.</pre></details></section>
|
| 18 |
+
</section>
|
| 19 |
+
<script>
|
| 20 |
+
(()=>{'use strict';
|
| 21 |
+
const $=id=>document.getElementById(id), area=$('fin-desk');
|
| 22 |
+
if(!area)return;
|
| 23 |
+
const defaults={
|
| 24 |
+
'polymarket-markets':{limit:'12',offset:'0'},'polymarket-book':{token_id:''},
|
| 25 |
+
'polymarket-history':{token_id:'',interval:'1d',fidelity:'60'},
|
| 26 |
+
'kalshi-markets':{limit:'12',cursor:'',series_ticker:''},'kalshi-book':{ticker:'',depth:'20'},
|
| 27 |
+
'coinbase-products':{},'coinbase-ticker':{product:'BTC-USD'},
|
| 28 |
+
'coinbase-candles':{product:'BTC-USD',granularity:'3600',end:'',count:'60'},
|
| 29 |
+
'sec-submissions':{cik:'320193',limit:'10'},'sec-companyfacts':{cik:'320193',limit:'10'},
|
| 30 |
+
'treasury-rates':{limit:'12'},'treasury-debt':{limit:'12'},'bls-series':{series_id:'CUUR0000SA0'},
|
| 31 |
+
'fred-series':{},'alpaca-quote':{},'alpaca-bars':{}};
|
| 32 |
+
const privateIds=new Set(['fred-series','alpaca-quote','alpaca-bars']);
|
| 33 |
+
const sha=/^[0-9a-f]{40}$/, digest=/^[0-9a-f]{64}$/, code=/^[A-Z][A-Z0-9_]{0,95}$/;
|
| 34 |
+
const states=new Set(['NOT_PROBED','SNAPSHOT','CACHED','STALE','UNAVAILABLE','EXPIRED']);
|
| 35 |
+
let revision=null, specs=new Map(), registryEpoch=0, queryEpoch=0, pending=null, receipt=null;
|
| 36 |
+
function text(tag,value){const e=document.createElement(tag);e.textContent=value;return e;}
|
| 37 |
+
function showState(value){$('fin-result-state').textContent=value;}
|
| 38 |
+
function clearResult(){receipt=null;$('fin-export').disabled=true;$('fin-result-table').replaceChildren();$('fin-chart').replaceChildren();$('fin-detail').textContent='No accepted observation.';$('fin-chart-note').textContent='No chart observation.';}
|
| 39 |
+
function invalidate(){queryEpoch++;if(pending)pending.abort();pending=null;clearResult();}
|
| 40 |
+
async function readJson(path,signal){
|
| 41 |
+
const response=await fetch(path,{method:'GET',credentials:'omit',cache:'no-store',redirect:'error',signal,headers:{Accept:'application/json'}});
|
| 42 |
+
if(!/^application\/(json|[a-z0-9.+-]+\+json)(;|$)/i.test(response.headers.get('content-type')||''))throw Error('INVALID_RESPONSE_TYPE');
|
| 43 |
+
const rawLength=response.headers.get('content-length');
|
| 44 |
+
if(rawLength!==null&&(!/^\d+$/.test(rawLength)||Number(rawLength)>4000000))throw Error('RESPONSE_TOO_LARGE');
|
| 45 |
+
const reader=response.body.getReader(),chunks=[];let bytes=0;
|
| 46 |
+
try{for(;;){const part=await reader.read();if(part.done)break;bytes+=part.value.length;if(bytes>4000000)throw Error('RESPONSE_TOO_LARGE');chunks.push(part.value);}}
|
| 47 |
+
catch(error){await reader.cancel();throw error;}
|
| 48 |
+
const raw=new Uint8Array(bytes);let at=0;for(const part of chunks){raw.set(part,at);at+=part.length;}
|
| 49 |
+
return {status:response.status,body:JSON.parse(new TextDecoder('utf-8',{fatal:true}).decode(raw))};
|
| 50 |
+
}
|
| 51 |
+
function identity(body,schema){return body&&body.schema===schema&&body.source_revision===revision&&body.execution_enabled===false;}
|
| 52 |
+
function form(){
|
| 53 |
+
invalidate();const source=$('fin-source').value,spec=specs.get(source);$('fin-fields').replaceChildren();
|
| 54 |
+
$('fin-observe').disabled=!spec||privateIds.has(source)||spec.private!==false;
|
| 55 |
+
if(!spec){showState('UNAVAILABLE');return;}
|
| 56 |
+
$('fin-operation').textContent=spec.operation;
|
| 57 |
+
if(privateIds.has(source)){showState('OWNER-ONLY SOURCE β unavailable in this public Space');return;}
|
| 58 |
+
for(const name of spec.parameters){const label=text('label',name.replaceAll('_',' '));const input=document.createElement('input');input.name=name;input.id='fin-param-'+name;input.maxLength=2048;input.autocomplete='off';input.value=defaults[source][name]||'';label.htmlFor=input.id;label.append(input);$('fin-fields').append(label);}
|
| 59 |
+
showState('READY TO REQUEST β not a connectivity claim');
|
| 60 |
+
}
|
| 61 |
+
async function registry(){
|
| 62 |
+
const generation=++registryEpoch;invalidate();revision=null;specs.clear();$('fin-source').replaceChildren();$('fin-source').disabled=true;$('fin-observe').disabled=true;$('fin-provider-body').replaceChildren();$('fin-registry-state').textContent='CHECKING SOURCE IDENTITY';
|
| 63 |
+
const controller=new AbortController(),timer=setTimeout(()=>controller.abort(),15000);
|
| 64 |
+
try{
|
| 65 |
+
const witness=await readJson('/api/source',controller.signal);const value=witness.body;
|
| 66 |
+
if(witness.status!==200||value.deployment_source!=='szl-holdings/a11oy'||!sha.test(value.source_revision)||value.source_revision==='0'.repeat(40))throw Error('INVALID_SOURCE_WITNESS');
|
| 67 |
+
const result=await readJson('/api/finance/providers',controller.signal);
|
| 68 |
+
if(generation!==registryEpoch)return;
|
| 69 |
+
revision=value.source_revision;const body=result.body;
|
| 70 |
+
if(result.status!==200||!identity(body,'szl.finance.providers/v1')||body.read_only!==true||body.canonical_repository!=='szl-holdings/a11oy'||!Array.isArray(body.sources)||body.sources.length!==Object.keys(defaults).length)throw Error('INVALID_PROVIDER_CONTRACT');
|
| 71 |
+
const next=new Map();
|
| 72 |
+
for(const row of body.sources){
|
| 73 |
+
if(!row||!Object.hasOwn(defaults,row.id)||next.has(row.id)||typeof row.operation!=='string'||row.operation.length>500||typeof row.provider!=='string'||row.private!==privateIds.has(row.id)||!Array.isArray(row.parameters)||row.parameters.length>8||!states.has(row.observed_connection)||!['PRESENT','MISSING'].includes(row.configuration))throw Error('INVALID_PROVIDER_CONTRACT');
|
| 74 |
+
if(!row.private&&(row.parameters.length!==Object.keys(defaults[row.id]).length||row.parameters.some(k=>!Object.hasOwn(defaults[row.id],k))||new Set(row.parameters).size!==row.parameters.length))throw Error('INVALID_PARAMETERS');
|
| 75 |
+
next.set(row.id,row);
|
| 76 |
+
}
|
| 77 |
+
specs=next;
|
| 78 |
+
for(const [id,row] of specs){const option=text('option',id+(row.private?' β owner-only':''));option.value=id;option.disabled=row.private;$('fin-source').append(option);const tr=document.createElement('tr');for(const value of [id,row.observed_connection,row.private?'OWNER-ONLY':row.configuration==='MISSING'?'CONFIGURATION MISSING':'PUBLIC READ'])tr.append(text('td',value));$('fin-provider-body').append(tr);}
|
| 79 |
+
$('fin-source').disabled=false;$('fin-source').value='coinbase-ticker';$('fin-registry-state').textContent='16 ADAPTERS / 13 PUBLIC / 3 OWNER-ONLY β last-request state only';$('fin-revision').textContent=revision;form();
|
| 80 |
+
}catch(error){if(generation!==registryEpoch)return;revision=null;specs.clear();$('fin-source').disabled=true;$('fin-observe').disabled=true;$('fin-registry-state').textContent='UNAVAILABLE β provider registry not accepted';$('fin-revision').textContent='UNAVAILABLE';showState('UNAVAILABLE');clearResult();}
|
| 81 |
+
finally{clearTimeout(timer);}
|
| 82 |
+
}
|
| 83 |
+
function scalar(value){return value===null||value===undefined?'Unavailable':typeof value==='object'?JSON.stringify(value):String(value);}
|
| 84 |
+
function table(data){
|
| 85 |
+
const rows=Array.isArray(data.items)?data.items:[data];const table=document.createElement('table');table.append(text('caption','Displaying '+Math.min(rows.length,30)+' of '+rows.length+' returned records. Bounded response, not an all-market census. Null is unavailable; zero is retained.'));
|
| 86 |
+
if(!rows.length){$('fin-result-table').append(text('p','EMPTY β the source returned no records.'));return;}
|
| 87 |
+
const keys=[...new Set(rows.flatMap(row=>Object.keys(row)))].slice(0,6),head=document.createElement('thead'),hr=document.createElement('tr');for(const key of keys){const th=text('th',key.replaceAll('_',' '));th.scope='col';hr.append(th);}head.append(hr);table.append(head);
|
| 88 |
+
const tbody=document.createElement('tbody');for(const row of rows.slice(0,30)){const tr=document.createElement('tr');for(const key of keys)tr.append(text('td',scalar(row[key]).slice(0,300)));tbody.append(tr);}table.append(tbody);$('fin-result-table').append(table);
|
| 89 |
+
}
|
| 90 |
+
function chart(source,data){
|
| 91 |
+
const note=$('fin-chart-note');if(source!=='coinbase-candles'){note.textContent='Structured source records below. No chart inferred for this data type.';return;}
|
| 92 |
+
if(data.window_complete!==true||!Array.isArray(data.missing_intervals)||data.missing_intervals.length||!Array.isArray(data.items)||data.items.length<2||!Number.isSafeInteger(data.granularity_seconds)||data.granularity_seconds<=0){note.textContent='Chart withheld β complete contiguous candles were not established. No gap filling.';return;}
|
| 93 |
+
const points=data.items.map(row=>[row.time,typeof row.close==='string'&&/^(\d+)(\.\d+)?$/.test(row.close)?Number(row.close):NaN]);
|
| 94 |
+
if(points.length>300||points.some(([t,v],i)=>!Number.isSafeInteger(t)||!Number.isFinite(v)||v<=0||(i>0&&t-points[i-1][0]!==data.granularity_seconds))){note.textContent='Chart withheld β invalid chart inputs.';return;}
|
| 95 |
+
const lo=Math.min(...points.map(p=>p[1])),hi=Math.max(...points.map(p=>p[1])),span=hi-lo||1,elapsed=points.at(-1)[0]-points[0][0];
|
| 96 |
+
const NS='http://www.w3.org/2000/svg',svg=document.createElementNS(NS,'svg');svg.setAttribute('viewBox','0 0 800 260');svg.setAttribute('role','img');svg.setAttribute('aria-label','Historical candle close prices. Approximate drawing only; exact source values are in the records and export.');
|
| 97 |
+
const title=document.createElementNS(NS,'title');title.textContent='Historical close, quote-currency units; no execution or performance claim';svg.append(title);
|
| 98 |
+
const poly=document.createElementNS(NS,'polyline');poly.setAttribute('points',points.map(([t,v])=>[20+(t-points[0][0])/elapsed*760,220-(v-lo)/span*190].join(',')).join(' '));poly.setAttribute('fill','none');poly.setAttribute('stroke','currentColor');poly.setAttribute('stroke-width','2');svg.append(poly);$('fin-chart').append(svg);
|
| 99 |
+
note.textContent=data.product+' / '+points.length+' completed candles / '+data.granularity_seconds+' seconds per candle. Visual range '+lo+'β'+hi+' quote units. Approximate rendering only; source decimals are unchanged in the export.';
|
| 100 |
+
}
|
| 101 |
+
async function observe(event){
|
| 102 |
+
event.preventDefault();invalidate();const generation=queryEpoch,source=$('fin-source').value,spec=specs.get(source);
|
| 103 |
+
if(!revision||!spec||spec.private!==false||privateIds.has(source)){showState('DENIED β source is not public');return;}
|
| 104 |
+
const params=new URLSearchParams();for(const [key,value] of new FormData($('fin-form'))){if(key==='source')continue;if(!spec.parameters.includes(key)||typeof value!=='string'||value.length>2048){showState('INVALID PARAMETERS');return;}if(value.trim())params.set(key,value.trim());}
|
| 105 |
+
const controller=new AbortController();pending=controller;const timer=setTimeout(()=>controller.abort(),15000);showState('REQUESTING β previous result cleared');$('fin-observe').disabled=true;
|
| 106 |
+
try{
|
| 107 |
+
const result=await readJson('/api/finance/observations/'+source+(params.size?'?'+params:''),controller.signal);if(generation!==queryEpoch)return;const body=result.body;
|
| 108 |
+
if(!identity(body,'szl.finance.observation/v1')||body.source!==source)throw Error('INVALID_OBSERVATION');
|
| 109 |
+
if(result.status!==200||body.ok!==true||!['SNAPSHOT','CACHED'].includes(body.state)){showState('UNAVAILABLE / '+(code.test(body.error||'')?body.error:'NO_CURRENT_OBSERVATION'));return;}
|
| 110 |
+
if(!body.data||typeof body.data!=='object'||Array.isArray(body.data)||body.truth_label!=='REPORTED'||!body.provenance||body.provenance.signed!==false||!digest.test(body.provenance.observation_id||'')||body.provenance.retrieved_at!==body.retrieved_at||body.provenance.runtime_reported_source_revision!==revision)throw Error('INVALID_OBSERVATION');
|
| 111 |
+
if(Array.isArray(body.data.items)&&body.data.items.some(row=>!row||typeof row!=='object'||Array.isArray(row)))throw Error('INVALID_RECORDS');
|
| 112 |
+
table(body.data);chart(source,body.data);receipt=body;$('fin-export').disabled=false;$('fin-detail').textContent=JSON.stringify(body,null,2).slice(0,250000);showState(body.state+' / REPORTED / retrieved '+body.retrieved_at+' β not current-price assurance');
|
| 113 |
+
}catch(error){if(generation===queryEpoch){clearResult();showState('UNAVAILABLE β request failed or response was rejected');}}
|
| 114 |
+
finally{clearTimeout(timer);if(generation===queryEpoch){pending=null;$('fin-observe').disabled=!specs.has(source)||privateIds.has(source);}}
|
| 115 |
+
}
|
| 116 |
+
$('fin-form').addEventListener('input',event=>{if(event.target.id==='fin-source')return;invalidate();const spec=specs.get($('fin-source').value);$('fin-observe').disabled=!spec||spec.private!==false;showState('PARAMETERS CHANGED β request a new observation');});
|
| 117 |
+
$('fin-form').addEventListener('submit',observe);$('fin-source').addEventListener('change',form);$('fin-refresh').addEventListener('click',registry);
|
| 118 |
+
$('fin-export').addEventListener('click',()=>{if(!receipt)return;const blob=new Blob([JSON.stringify(receipt,null,2)+'\n'],{type:'application/json'}),url=URL.createObjectURL(blob),link=document.createElement('a');link.href=url;link.download='puriq-'+receipt.source+'-observation.json';link.click();setTimeout(()=>URL.revokeObjectURL(url),1000);});
|
| 119 |
+
window.addEventListener('pagehide',invalidate);registry();
|
| 120 |
+
})();
|
| 121 |
+
</script>
|
| 122 |
+
<section class="finance-desk" id="fin-analytics" aria-labelledby="fin-analytics-title">
|
| 123 |
+
<section class="panel"><div class="mono">PURIQ / ADVISORY ANALYTICS V2</div><h2 id="fin-analytics-title">From source evidence to measured inputs.</h2>
|
| 124 |
+
<p class="fin-note">Daily-close indicators are modeled analysis, not investment advice or an execution quote. Paper use only. Live history comes from the canonical Coinbase adapter; the fixture is synthetic. Missing daily intervals block calculation.</p>
|
| 125 |
+
<form id="fin-analysis-form"><div class="fin-fields"><label>Instrument<input id="fin-analysis-symbol" value="BTC-USD" maxlength="24" pattern="[A-Z0-9][A-Z0-9.\-]{0,23}" required></label><label>Input lane<select id="fin-analysis-origin"><option value="coinbase">Coinbase completed daily candles</option><option value="fixture">Synthetic fixture β offline demonstration</option></select></label><label>Analysis<select id="fin-analysis-kind"><option value="signals">Indicator suite</option><option value="quote">Historical risk statistics</option></select></label></div><button type="submit" id="fin-analysis-run">Compute advisory analysis</button></form>
|
| 126 |
+
<p id="fin-analysis-state" class="fin-state" role="status">NOT COMPUTED</p><pre id="fin-analysis-summary" class="fin-provenance">No inputs accepted.</pre>
|
| 127 |
+
<div class="fin-actions"><button type="button" id="fin-analysis-export" disabled>Export result and receipt</button><button type="button" id="fin-analysis-verify" disabled>Verify receipt integrity</button></div><p class="fin-note">Receipts are unsigned and caller-held. Integrity does not prove authenticity, profitability, or trading authority. No shared portfolio state or ledger is written.</p>
|
| 128 |
+
<details><summary>Bounded portfolio statistics</summary><p class="fin-note">Enter 3β300 positive closes per asset, at most 16 assets. These are unverified caller inputs. The output contains per-asset statistics and simple means, not a weighted portfolio or backtest.</p><label for="fin-portfolio">Holdings as JSON</label><textarea id="fin-portfolio" rows="5" style="width:100%;max-width:100%;background:#0b1119;color:#edf3ff" maxlength="150000">{"BTC-USD":[100,102,101,104]}</textarea><label>Annual periods<select id="fin-annual"><option value="365">365 β daily crypto</option><option value="252">252 β trading days</option></select></label><button type="button" id="fin-portfolio-run">Compute caller-supplied series</button></details>
|
| 129 |
+
<details><summary>Full source binding and computation evidence</summary><pre id="fin-analysis-evidence" class="fin-provenance">No evidence yet.</pre></details></section>
|
| 130 |
+
</section>
|
| 131 |
+
<script>
|
| 132 |
+
(()=>{'use strict';const $=id=>document.getElementById(id);let accepted=null,epoch=0,controller=null;
|
| 133 |
+
function clear(){accepted=null;$('fin-analysis-export').disabled=true;$('fin-analysis-verify').disabled=true;$('fin-analysis-summary').textContent='No inputs accepted.';$('fin-analysis-evidence').textContent='No evidence yet.';}
|
| 134 |
+
function invalidate(){epoch++;if(controller)controller.abort();clear();$('fin-analysis-state').textContent='INPUTS CHANGED β compute again';}
|
| 135 |
+
async function call(path,body){const serial=++epoch;if(controller)controller.abort();controller=new AbortController();const timer=setTimeout(()=>controller.abort(),20000);clear();$('fin-analysis-state').textContent='COMPUTING';
|
| 136 |
+
try{const r=await fetch(path,{method:body===undefined?'GET':'POST',credentials:'omit',cache:'no-store',redirect:'error',signal:controller.signal,headers:{Accept:'application/json','Content-Type':'application/json'},...(body===undefined?{}:{body:JSON.stringify(body)})});
|
| 137 |
+
if(!(r.headers.get('content-type')||'').startsWith('application/json'))throw Error('INVALID_RESPONSE');const reader=r.body.getReader(),chunks=[];let size=0;for(;;){const part=await reader.read();if(part.done)break;size+=part.value.length;if(size>4000000){await reader.cancel();throw Error('RESPONSE_TOO_LARGE');}chunks.push(part.value);}const bytes=new Uint8Array(size);let at=0;for(const chunk of chunks){bytes.set(chunk,at);at+=chunk.length;}const data=JSON.parse(new TextDecoder('utf-8',{fatal:true}).decode(bytes));if(serial!==epoch)return;
|
| 138 |
+
if(!r.ok||data.ok!==true)throw Error(typeof data.error==='string'&&/^[A-Z_]+$/.test(data.error)?data.error:'UNAVAILABLE');
|
| 139 |
+
if(data.schema!=='szl.finance.analytics/v2'||data.execution_enabled!==false||data.advisory_only!==true||data.paper_only!==true||data.not_financial_advice!==true||data.receipt?.signing!=='UNSIGNED_HONEST')throw Error('INVALID_CONTRACT');accepted=data;
|
| 140 |
+
const origin=data.inputs?.asset?.origin||data.inputs?.origin||'integrity check';$('fin-analysis-state').textContent='COMPUTED / '+origin.toUpperCase()+' / ADVISORY ONLY';$('fin-analysis-summary').textContent=JSON.stringify(data.result,null,2);$('fin-analysis-evidence').textContent=JSON.stringify(data,null,2);$('fin-analysis-export').disabled=false;$('fin-analysis-verify').disabled=false;
|
| 141 |
+
}catch(e){if(serial===epoch){clear();$('fin-analysis-state').textContent='BLOCKED / '+(e.name==='AbortError'?'DEADLINE':e.message);}}finally{clearTimeout(timer);}}
|
| 142 |
+
$('fin-analysis-form').addEventListener('submit',e=>{e.preventDefault();call('/api/finance/v2/'+$('fin-analysis-kind').value+'/'+encodeURIComponent($('fin-analysis-symbol').value)+'?origin='+$('fin-analysis-origin').value);});
|
| 143 |
+
for(const id of ['fin-analysis-form','fin-portfolio','fin-annual'])$(id).addEventListener('input',invalidate);
|
| 144 |
+
$('fin-portfolio-run').addEventListener('click',()=>{try{call('/api/finance/v2/portfolio',{holdings:JSON.parse($('fin-portfolio').value),periods_per_year:Number($('fin-annual').value)});}catch(e){invalidate();$('fin-analysis-state').textContent='INVALID JSON';}});
|
| 145 |
+
$('fin-analysis-verify').addEventListener('click',()=>{if(accepted)call('/api/finance/v2/receipts/verify',accepted);});
|
| 146 |
+
$('fin-analysis-export').addEventListener('click',()=>{if(!accepted)return;const url=URL.createObjectURL(new Blob([JSON.stringify(accepted,null,2)+'\n'],{type:'application/json'})),a=document.createElement('a');a.href=url;a.download='puriq-computation.json';a.click();setTimeout(()=>URL.revokeObjectURL(url),1000);});window.addEventListener('pagehide',invalidate);
|
| 147 |
+
})();
|
| 148 |
+
</script>
|
| 149 |
+
<section class="panel" style="margin-top:14px"><div class="livebar"><div id="st" class="status"><span class="dot"></span><span>PROBING GOVERNED EVIDENCE</span></div><button type="button" onclick="loadEvidence()">Refresh evidence</button></div><pre id="out">Loading governed evidenceβ¦</pre></section><footer class="footer"><div class="panel"><b>Decision tape</b><span>Domain-specific visualization remains distinct from the shared execution contract.</span></div><div class="panel"><b>Exposure matrix</b><span>Every decision surface keeps provenance and evidence status visible.</span></div><div class="panel"><b>Evidence ledger</b><div class="truth"><span>MEASURED</span><span>REPORTED</span><span>MODELED</span><span>UNAVAILABLE</span></div></div></footer><p class="mono" style="margin-top:18px;color:var(--muted)">Canonical product source: <a href="https://github.com/szl-holdings/a11oy/tree/main/verticals/puriq-markets" target="_blank" rel="noopener">https://github.com/szl-holdings/a11oy/tree/main/verticals/puriq-markets</a> Β· Portfolio: <a href="https://a-11-oy.com/products/" target="_blank" rel="noopener">a-11-oy.com/products/</a></p></main><script>async function loadEvidence(){const s=document.getElementById('st'),o=document.getElementById('out');try{const r=await fetch('/api/live',{cache:'no-store'}),j=await r.json();const verified=j.status==='MEASURED'&&j.receipt_verified===true;const reachable=j.status==='REACHABLE'||j.status==='LIVE';s.className='status';s.dataset.reachability=reachable?'REACHABLE':'UNAVAILABLE';s.children[1].textContent=(verified?'MEASURED':(reachable?'REACHABLE':'UNAVAILABLE'))+' / '+(j.latency_ms??'-')+' ms';const root=document.documentElement;if(root.dataset.domain==='sentra'){root.dataset.iris='closed';}o.textContent=JSON.stringify(j,null,2)}catch(e){s.children[1].textContent='UNAVAILABLE';o.textContent=String(e)}}loadEvidence();setInterval(loadEvidence,60000)</script></body></html>
|