Add dossier editions and dossier viewer; fix sha256 sidecars
This commit is contained in:
parent
0688046caf
commit
005653ea33
40 changed files with 34340 additions and 29 deletions
193
DANNY_STOCKER_INFRAFABRIC_DOSSIER_DATA_DRIVEN_EDITION.md
Normal file
193
DANNY_STOCKER_INFRAFABRIC_DOSSIER_DATA_DRIVEN_EDITION.md
Normal file
|
|
@ -0,0 +1,193 @@
|
||||||
|
# InfraFabric Dossier — Data‑Driven Technical Report (Microlab) v1.0
|
||||||
|
|
||||||
|
**Subject:** Measured characteristics of the IF.TTT trace pipeline (microlab)
|
||||||
|
**Protocol:** IF.TTT.dossier.metrics
|
||||||
|
**Status:** TECHNICAL REPORT (BORING ON PURPOSE)
|
||||||
|
**Date:** 2025-12-22
|
||||||
|
**Citation:** `if://doc/INFRAFABRIC_DOSSIER_DATA_DRIVEN/v1.0`
|
||||||
|
**Author:** Danny Stocker (`ds@infrafabric.io`)
|
||||||
|
**Web:** https://infrafabric.io
|
||||||
|
|
||||||
|
This edition intentionally avoids narrative framing. It reports what can be measured, what cannot, and what is planned.
|
||||||
|
|
||||||
|
**Canonical (static mirror):** `https://infrafabric.io/static/hosted/DANNY_STOCKER_INFRAFABRIC_DOSSIER_DATA_DRIVEN_EDITION.md`
|
||||||
|
**Repo source:** `https://git.infrafabric.io/danny/hosted/src/branch/main/DANNY_STOCKER_INFRAFABRIC_DOSSIER_DATA_DRIVEN_EDITION.md`
|
||||||
|
**SHA256 (sidecar):** `https://infrafabric.io/static/hosted/DANNY_STOCKER_INFRAFABRIC_DOSSIER_DATA_DRIVEN_EDITION.md.sha256`
|
||||||
|
**Verify:** `curl -fsSLO 'https://infrafabric.io/static/hosted/DANNY_STOCKER_INFRAFABRIC_DOSSIER_DATA_DRIVEN_EDITION.md' -fsSLO 'https://infrafabric.io/static/hosted/DANNY_STOCKER_INFRAFABRIC_DOSSIER_DATA_DRIVEN_EDITION.md.sha256' && sha256sum -c DANNY_STOCKER_INFRAFABRIC_DOSSIER_DATA_DRIVEN_EDITION.md.sha256`
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 1) Scope
|
||||||
|
|
||||||
|
This report covers:
|
||||||
|
|
||||||
|
- the IF.emotion evidence bundle format (tar.gz + manifest)
|
||||||
|
- measured latencies recorded in trace events (`auth_ms`, `rag_ms`, `llm_ms`) for a small sample of published bundles
|
||||||
|
- storage footprint of published bundles
|
||||||
|
|
||||||
|
This report does **not** claim:
|
||||||
|
|
||||||
|
- production scalability
|
||||||
|
- clinical validity
|
||||||
|
- “truth” of model outputs (only provenance of what the system did)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 2) Data Sources (Public, Verifiable)
|
||||||
|
|
||||||
|
All artifacts referenced here are publicly downloadable and hash-verifiable.
|
||||||
|
|
||||||
|
Static mirror (preferred): `https://infrafabric.io/static/hosted/`
|
||||||
|
Source repo: `https://git.infrafabric.io/danny/hosted`
|
||||||
|
|
||||||
|
### 2.1 Evidence bundles used in this report
|
||||||
|
|
||||||
|
| Trace | Bundle | SHA256 sidecar |
|
||||||
|
|---|---|---|
|
||||||
|
| `016cca78-6f9d-4ffe-aec0-99792d383ca1` | `https://infrafabric.io/static/hosted/emo_trace_payload_016cca78-6f9d-4ffe-aec0-99792d383ca1.tar.gz` | `https://infrafabric.io/static/hosted/emo_trace_payload_016cca78-6f9d-4ffe-aec0-99792d383ca1.tar.gz.sha256` |
|
||||||
|
| `0642c357-7f8d-4eb5-9643-1992e7ee14a9` | `https://infrafabric.io/static/hosted/emo_trace_payload_0642c357-7f8d-4eb5-9643-1992e7ee14a9.tar.gz` | `https://infrafabric.io/static/hosted/emo_trace_payload_0642c357-7f8d-4eb5-9643-1992e7ee14a9.tar.gz.sha256` |
|
||||||
|
| `09aad3e1-f420-451e-a189-e86f68073dc0` | `https://infrafabric.io/static/hosted/emo_trace_payload_09aad3e1-f420-451e-a189-e86f68073dc0.tar.gz` | `https://infrafabric.io/static/hosted/emo_trace_payload_09aad3e1-f420-451e-a189-e86f68073dc0.tar.gz.sha256` |
|
||||||
|
| `96700e8e-6a83-445e-86f7-06905c500146` | `https://infrafabric.io/static/hosted/emo_trace_payload_96700e8e-6a83-445e-86f7-06905c500146.tar.gz` | `https://infrafabric.io/static/hosted/emo_trace_payload_96700e8e-6a83-445e-86f7-06905c500146.tar.gz.sha256` |
|
||||||
|
|
||||||
|
### 2.2 Verification command (bundle transport integrity)
|
||||||
|
|
||||||
|
```bash
|
||||||
|
curl -fsSLO '<BUNDLE_URL>' -fsSLO '<BUNDLE_URL>.sha256' && sha256sum -c '<BUNDLE_FILENAME>.sha256'
|
||||||
|
```
|
||||||
|
|
||||||
|
### 2.3 Verifier tool
|
||||||
|
|
||||||
|
- Static: `https://infrafabric.io/static/hosted/iftrace.py`
|
||||||
|
- Repo: `https://git.infrafabric.io/danny/hosted/raw/branch/main/iftrace.py`
|
||||||
|
|
||||||
|
Run:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
python3 iftrace.py verify '<BUNDLE_FILENAME>.tar.gz'
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 3) Measurement Method (How Numbers Are Obtained)
|
||||||
|
|
||||||
|
For each bundle:
|
||||||
|
|
||||||
|
1. extract `payload/trace_events.jsonl`
|
||||||
|
2. read per-event `event.data`:
|
||||||
|
- `request_received.data.auth_ms`
|
||||||
|
- `retrieval_done.data.rag_ms` (when present)
|
||||||
|
- `model_done.data.llm_ms` (when present)
|
||||||
|
3. treat these values as **self-reported microlab timings** (they are not externally attested)
|
||||||
|
|
||||||
|
Key point: even if the numbers are not “audited”, the bundle makes them *replayable* and makes the presence/absence of events *auditable*.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 4) Architecture Boundary (Where Guarantees Begin)
|
||||||
|
|
||||||
|
```mermaid
|
||||||
|
flowchart TB
|
||||||
|
U[User] -->|HTTPS| E[Edge]
|
||||||
|
E --> B[Backend Witness Boundary]
|
||||||
|
|
||||||
|
B --> R[Retrieval]
|
||||||
|
B --> P[Prompt]
|
||||||
|
B --> M[Model]
|
||||||
|
B --> X[Postprocess]
|
||||||
|
|
||||||
|
B --> T1["REQ_SEEN ledger<br/>(hourly JSONL)"]
|
||||||
|
B --> T2["Trace events<br/>(hash chain JSONL)"]
|
||||||
|
B --> T3["Signed summary<br/>(output hash + head attestation)"]
|
||||||
|
|
||||||
|
T1 --> H["Signed Merkle head<br/>(per hour)"]
|
||||||
|
T2 --> S["Trace head<br/>(event_hash)"]
|
||||||
|
|
||||||
|
H --> BUNDLE["Evidence bundle<br/>(tar.gz + manifest)"]
|
||||||
|
S --> BUNDLE
|
||||||
|
T3 --> BUNDLE
|
||||||
|
|
||||||
|
BUNDLE --> MIRROR["Static mirror<br/>(public download)"]
|
||||||
|
```
|
||||||
|
|
||||||
|
Interpretation: integrity begins at the backend witness boundary; completeness is meaningful at and after that boundary until edge witnessing exists.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 5) Observed Sample Metrics (N=4 Bundles)
|
||||||
|
|
||||||
|
### 5.1 Bundle sizes (storage footprint)
|
||||||
|
|
||||||
|
| Trace | Outcome | Bundle size |
|
||||||
|
|---|---|---:|
|
||||||
|
| `016cca78-6f9d-4ffe-aec0-99792d383ca1` | full trace (retrieval + model) | 82,010 bytes |
|
||||||
|
| `0642c357-7f8d-4eb5-9643-1992e7ee14a9` | full trace (retrieval + model) | 5,515 bytes |
|
||||||
|
| `09aad3e1-f420-451e-a189-e86f68073dc0` | full trace (retrieval + model) | 71,817 bytes |
|
||||||
|
| `96700e8e-6a83-445e-86f7-06905c500146` | guard short-circuit (no retrieval/model) | 82,410 bytes |
|
||||||
|
|
||||||
|
Notes:
|
||||||
|
|
||||||
|
- N is small; treat these as indicative examples, not stable distributions.
|
||||||
|
- The short-circuit bundle being large indicates that “blocked paths” can still carry substantial evidence payloads (depending on included artifacts).
|
||||||
|
|
||||||
|
### 5.2 Latency fields recorded in trace events
|
||||||
|
|
||||||
|
| Trace | `auth_ms` | `rag_ms` | `llm_ms` | `retrieved_count` | Notes |
|
||||||
|
|---|---:|---:|---:|---:|---|
|
||||||
|
| `016cca78-6f9d-4ffe-aec0-99792d383ca1` | 3 | 1107 | 10550 | 1 | request → retrieval → model |
|
||||||
|
| `0642c357-7f8d-4eb5-9643-1992e7ee14a9` | 4 | 383 | 12287 | 2 | request → retrieval → model |
|
||||||
|
| `09aad3e1-f420-451e-a189-e86f68073dc0` | 4 | 1377 | 17879 | 2 | request → retrieval → model |
|
||||||
|
| `96700e8e-6a83-445e-86f7-06905c500146` | 5 | (n/a) | (n/a) | (n/a) | guard short-circuit reason: `self_harm_signal` |
|
||||||
|
|
||||||
|
Derived from the sample (successful traces only; N=3):
|
||||||
|
|
||||||
|
- `rag_ms`: min 383, median 1107, max 1377
|
||||||
|
- `llm_ms`: min 10550, median 12287, max 17879
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 6) What This Sample Demonstrates
|
||||||
|
|
||||||
|
From the published bundles, an external reviewer can verify (cryptographically / structurally):
|
||||||
|
|
||||||
|
- the chain-of-custody wiring exists (hash chain + signed summary + inclusion proof)
|
||||||
|
- “short-circuit” decisions are still witnessed and included in the trace log (a critical property for dispute resolution)
|
||||||
|
|
||||||
|
An external reviewer cannot verify (from the bundle alone):
|
||||||
|
|
||||||
|
- the correctness of the output in the outside world
|
||||||
|
- the completeness of events *before* the backend witness boundary (edge drops / load balancer denials)
|
||||||
|
- the integrity of local keys (key custody, rotation, compromise response)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 7) Engineering Roadmap (Metrics-Driven)
|
||||||
|
|
||||||
|
This roadmap is written as measurable deliverables.
|
||||||
|
|
||||||
|
### 7.1 Key management hardening
|
||||||
|
|
||||||
|
- Add explicit key separation: `IF_REQ_SEEN_HMAC_KEY` must not fall back to signing secret.
|
||||||
|
- Document key rotation procedure and compromise response.
|
||||||
|
- Optional: HSM/TPM signing for production deployments.
|
||||||
|
|
||||||
|
### 7.2 Edge witnessing (completeness boundary expansion)
|
||||||
|
|
||||||
|
- Implement edge request attempt ledger (cryptographic, not just web logs).
|
||||||
|
- Publish a “completeness SLO” (e.g., signed head anchored every N minutes or every N requests).
|
||||||
|
|
||||||
|
### 7.3 Time and truncation defenses
|
||||||
|
|
||||||
|
- Add monotonic counters (per trace and per ledger hour).
|
||||||
|
- Anchor chain heads periodically to reduce tail truncation risk window.
|
||||||
|
|
||||||
|
### 7.4 Scale testing harness
|
||||||
|
|
||||||
|
- Replay harness that runs the verifier across 1000+ generated traces (including failures) and publishes summary metrics.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 8) Companion Documents
|
||||||
|
|
||||||
|
- Full dossier (uncut): `DANNY_STOCKER_INFRAFABRIC_DOSSIER.md`
|
||||||
|
- IF.emotion trace protocol (detailed, with walkthrough): `https://infrafabric.io/static/hosted/IF_EMOTION_DEBUGGING_TRACE_WHITEPAPER_v3.3_STYLED.md`
|
||||||
|
- Evidence bundles directory: `https://infrafabric.io/static/hosted/`
|
||||||
|
|
@ -0,0 +1 @@
|
||||||
|
3fb75accc3486df0dcfc79d64f5371e4fdc9945fe322dd2b582b73ed9167a52d DANNY_STOCKER_INFRAFABRIC_DOSSIER_DATA_DRIVEN_EDITION.md
|
||||||
207
DANNY_STOCKER_INFRAFABRIC_DOSSIER_SUBMISSION_EDITION.md
Normal file
207
DANNY_STOCKER_INFRAFABRIC_DOSSIER_SUBMISSION_EDITION.md
Normal file
|
|
@ -0,0 +1,207 @@
|
||||||
|
# InfraFabric Dossier — Submission Edition (Clean) v1.0
|
||||||
|
|
||||||
|
**Subject:** Safety-first agent runtime with verifiable provenance (microlab)
|
||||||
|
**Protocol:** IF.TTT.dossier.submission
|
||||||
|
**Status:** SUBMISSION EDITION (CLEAN)
|
||||||
|
**Date:** 2025-12-22
|
||||||
|
**Citation:** `if://doc/INFRAFABRIC_DOSSIER_SUBMISSION/v1.0`
|
||||||
|
**Author:** Danny Stocker (`ds@infrafabric.io`)
|
||||||
|
**Web:** https://infrafabric.io
|
||||||
|
|
||||||
|
> The model’s answer is ephemeral. The trace is the product. If you can’t prove what happened, you are not running an AI system — you are running a scripted reality show.
|
||||||
|
|
||||||
|
**Canonical (static mirror):** `https://infrafabric.io/static/hosted/DANNY_STOCKER_INFRAFABRIC_DOSSIER_SUBMISSION_EDITION.md`
|
||||||
|
**Repo source:** `https://git.infrafabric.io/danny/hosted/src/branch/main/DANNY_STOCKER_INFRAFABRIC_DOSSIER_SUBMISSION_EDITION.md`
|
||||||
|
**SHA256 (sidecar):** `https://infrafabric.io/static/hosted/DANNY_STOCKER_INFRAFABRIC_DOSSIER_SUBMISSION_EDITION.md.sha256`
|
||||||
|
**Verify:** `curl -fsSLO 'https://infrafabric.io/static/hosted/DANNY_STOCKER_INFRAFABRIC_DOSSIER_SUBMISSION_EDITION.md' -fsSLO 'https://infrafabric.io/static/hosted/DANNY_STOCKER_INFRAFABRIC_DOSSIER_SUBMISSION_EDITION.md.sha256' && sha256sum -c DANNY_STOCKER_INFRAFABRIC_DOSSIER_SUBMISSION_EDITION.md.sha256`
|
||||||
|
|
||||||
|
**Read this if you have 15 minutes:** start at “Independent Verification (One Trace)”, run the commands, then skim “Boundaries & Limitations”.
|
||||||
|
**Read this if you have 60 minutes:** add “Architecture” + “Threat Model”.
|
||||||
|
**For full lab notes / uncut corpus:** see `DANNY_STOCKER_INFRAFABRIC_DOSSIER.md` (≈1.5MB).
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 1) Technical Disclosure (AI-Native Implementation)
|
||||||
|
|
||||||
|
This project follows an Operator-as-Architect workflow: I define constraints, interfaces, and verification hooks; LLMs generate implementation code under supervision. The system is therefore evaluated as:
|
||||||
|
|
||||||
|
- **Architecture + specifications:** authored by me (the claims in this submission reference verification paths).
|
||||||
|
- **Code implementation:** LLM-assisted and treated as *untrusted until audited*; the trace protocol is designed to make that audit possible.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 2) What This Is (And What It Is Not)
|
||||||
|
|
||||||
|
**This is:** a working microlab proving that agentic systems can ship **portable, third‑party verifiable evidence bundles** for disputed behaviors (request → retrieval → decision → output).
|
||||||
|
**This is not:** a claim that outputs are “true”, a claim of clinical efficacy, or a claim of production scale.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 3) Core Claims, Proofs, Boundaries
|
||||||
|
|
||||||
|
| Core claim | Proof (artifact) | Boundary / limitation |
|
||||||
|
|---|---|---|
|
||||||
|
| **A) Traceability is a safety primitive.** High‑stakes agent actions require verifiable provenance. | IF.emotion trace protocol + evidence bundle + verifier (see §5). | **Microlab / single shard.** Guarantees begin at the backend witness boundary; edge completeness is future work. |
|
||||||
|
| **B) Governance needs structured dissent.** One-model “judge” patterns are brittle. | IF.BIAS (risk preflight) + IF.GUARD (council with required dissent seat) traced via IF.TTT. | **Cost/latency.** Multi-seat governance is reserved for higher-stakes decisions; low-stakes paths stay fast. |
|
||||||
|
| **C) Context is a security control.** Static filters fail; provenance + coherence checks reduce unsafe drift. | IF.ARMOUR (coherence/detective layer) + IF.YOLOGUARD (secret/relationship screening) integrated into the pipeline. | **Domain calibration.** Strongest for concrete surfaces (secrets/PII/prompt injection); general harmful-intent is open research. |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 4) Prior Art (Where This Fits)
|
||||||
|
|
||||||
|
InfraFabric is not “inventing audit logs”. It adapts known integrity patterns to a different object:
|
||||||
|
|
||||||
|
- **SLSA / SBOM / in-toto / Sigstore**: provenance for *software artifacts* → InfraFabric applies provenance discipline to *semantic decisions*, retrieval lineage, and agent actions.
|
||||||
|
- **Certificate Transparency (CT)**: append-only Merkle logging → InfraFabric borrows “inclusion proof” thinking for bounded completeness (`REQ_SEEN`).
|
||||||
|
- **Event sourcing / OpenTelemetry**: observability → InfraFabric adds a **verifier-oriented evidence bundle** that can be audited without trusting the operator.
|
||||||
|
- **W3C PROV (conceptually)**: provenance graphs → InfraFabric focuses on portable, hash-addressed artifacts with explicit boundaries and replay hooks.
|
||||||
|
|
||||||
|
The key differentiator is not “we log more”. It is: **we ship a dispute bundle that a hostile reviewer can verify.**
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 5) Independent Verification (One Trace, End-to-End)
|
||||||
|
|
||||||
|
This is the minimal “receipt” test: download one evidence bundle, verify transport integrity, then verify the internal chain-of-custody.
|
||||||
|
|
||||||
|
### 5.1 Public artifacts (preferred links)
|
||||||
|
|
||||||
|
Static mirror (preferred for reviewers): `https://infrafabric.io/static/hosted/`
|
||||||
|
Source repo (canonical): `https://git.infrafabric.io/danny/hosted`
|
||||||
|
|
||||||
|
Reference proof bundle:
|
||||||
|
|
||||||
|
- Bundle (static): `https://infrafabric.io/static/hosted/emo_trace_payload_016cca78-6f9d-4ffe-aec0-99792d383ca1.tar.gz`
|
||||||
|
- Bundle SHA256 (static): `https://infrafabric.io/static/hosted/emo_trace_payload_016cca78-6f9d-4ffe-aec0-99792d383ca1.tar.gz.sha256`
|
||||||
|
- Bundle (repo): `https://git.infrafabric.io/danny/hosted/raw/branch/main/emo_trace_payload_016cca78-6f9d-4ffe-aec0-99792d383ca1.tar.gz`
|
||||||
|
|
||||||
|
Verifier:
|
||||||
|
|
||||||
|
- `iftrace.py` (static): `https://infrafabric.io/static/hosted/iftrace.py`
|
||||||
|
- `iftrace.py` (repo): `https://git.infrafabric.io/danny/hosted/raw/branch/main/iftrace.py`
|
||||||
|
|
||||||
|
### 5.2 Verify transport integrity (hash)
|
||||||
|
|
||||||
|
```bash
|
||||||
|
curl -fsSLO 'https://infrafabric.io/static/hosted/emo_trace_payload_016cca78-6f9d-4ffe-aec0-99792d383ca1.tar.gz' \
|
||||||
|
-fsSLO 'https://infrafabric.io/static/hosted/emo_trace_payload_016cca78-6f9d-4ffe-aec0-99792d383ca1.tar.gz.sha256'
|
||||||
|
sha256sum -c 'emo_trace_payload_016cca78-6f9d-4ffe-aec0-99792d383ca1.tar.gz.sha256'
|
||||||
|
```
|
||||||
|
|
||||||
|
### 5.3 Verify internal chain-of-custody
|
||||||
|
|
||||||
|
```bash
|
||||||
|
curl -fsSLO 'https://infrafabric.io/static/hosted/iftrace.py'
|
||||||
|
python3 iftrace.py verify 'emo_trace_payload_016cca78-6f9d-4ffe-aec0-99792d383ca1.tar.gz'
|
||||||
|
```
|
||||||
|
|
||||||
|
The verifier checks:
|
||||||
|
|
||||||
|
- `trace_events.jsonl` forms a hash chain (`prev_hash` → `event_hash`)
|
||||||
|
- `req_seen_inclusion_proof.json` verifies against the signed Merkle head (bounded completeness for that hour)
|
||||||
|
- `ttt_signed_record.json` binds output hash + chain head and verifies signature
|
||||||
|
- the bundle manifest hashes match the extracted artifacts
|
||||||
|
|
||||||
|
### 5.4 What you should see
|
||||||
|
|
||||||
|
You should be able to verify, from raw artifacts inside the tarball, at minimum:
|
||||||
|
|
||||||
|
- `request_received` (auth/provider/model intent)
|
||||||
|
- `retrieval_done` (retrieval ids + `rag_ms`)
|
||||||
|
- `prompt_built` (prompt hash)
|
||||||
|
- `model_done` (`llm_ms`, model/provider)
|
||||||
|
- `trace_finalizing` (chain head)
|
||||||
|
- `response.json` (the actual assistant output bytes whose hash is bound in the signed summary)
|
||||||
|
|
||||||
|
If any element is missing or fails verification, the system is explicitly “not proven”.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 6) Architecture (Where Guarantees Begin)
|
||||||
|
|
||||||
|
This diagram shows the system boundary that the protocol currently guarantees.
|
||||||
|
|
||||||
|
```mermaid
|
||||||
|
flowchart TB
|
||||||
|
U[User] -->|HTTPS| E[Edge]
|
||||||
|
E --> B[Backend Witness Boundary]
|
||||||
|
|
||||||
|
B --> R[Retrieval]
|
||||||
|
B --> P[Prompt]
|
||||||
|
B --> M[Model]
|
||||||
|
B --> X[Postprocess]
|
||||||
|
|
||||||
|
B --> T1["REQ_SEEN ledger<br/>(hourly JSONL)"]
|
||||||
|
B --> T2["Trace events<br/>(hash chain JSONL)"]
|
||||||
|
B --> T3["Signed summary<br/>(output hash + head attestation)"]
|
||||||
|
|
||||||
|
T1 --> H["Signed Merkle head<br/>(per hour)"]
|
||||||
|
T2 --> S["Trace head<br/>(event_hash)"]
|
||||||
|
|
||||||
|
H --> BUNDLE["Evidence bundle<br/>(tar.gz + manifest)"]
|
||||||
|
S --> BUNDLE
|
||||||
|
T3 --> BUNDLE
|
||||||
|
|
||||||
|
BUNDLE --> MIRROR["Static mirror<br/>(public download)"]
|
||||||
|
BUNDLE --> REG["Registry anchor<br/>(PQ-hybrid, when enabled)"]
|
||||||
|
```
|
||||||
|
|
||||||
|
Interpretation: integrity begins at the backend witness boundary; completeness is meaningful at and after that boundary until edge witnessing exists.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 7) Threat Model (Why Standard Logs Fail)
|
||||||
|
|
||||||
|
The trace protocol is built for an explicit adversary: **the dispute**.
|
||||||
|
|
||||||
|
Primary failure modes it is designed to prevent:
|
||||||
|
|
||||||
|
- “The logs say one thing, the user screenshot says another.” (repudiation)
|
||||||
|
- “A retrieval set was poisoned, then the retrieval event was deleted.” (selective deletion)
|
||||||
|
- “A decision was claimed to be reviewed, but there is no lineage.” (audit theater)
|
||||||
|
|
||||||
|
Failure mode analysis (separate artifact):
|
||||||
|
|
||||||
|
- `https://infrafabric.io/static/hosted/IF_TTT_FAILURE_MODE_ANALYSIS_v1.md`
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 8) Validation Status (Honest)
|
||||||
|
|
||||||
|
- **External human testing:** anecdotal pre-testing only; not clinical validation.
|
||||||
|
- **Scale:** unproven beyond microlab; numbers are not presented as global claims.
|
||||||
|
- **Key management / attestations:** not audit-grade yet (explicit roadmap below).
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 9) Boundaries & Roadmap (What Must Be Built Next)
|
||||||
|
|
||||||
|
This is the “reviewer red‑flags” list, answered directly.
|
||||||
|
|
||||||
|
### 9.1 Key management (blocker for certification)
|
||||||
|
|
||||||
|
Current: file-based Ed25519 keys sufficient for microlab evidence binding.
|
||||||
|
Required: key generation ceremony + rotation + compromise response; HSM/TPM-backed signing for high-stakes deployments.
|
||||||
|
|
||||||
|
### 9.2 Completeness boundary (edge witnessing)
|
||||||
|
|
||||||
|
Current: bounded completeness begins at backend witness boundary.
|
||||||
|
Required: edge-level request witnessing (or independent transparency log) to reduce “selective trace” risk.
|
||||||
|
|
||||||
|
### 9.3 Code identity / execution integrity
|
||||||
|
|
||||||
|
Current: bundle binds outputs and retrieval lineage.
|
||||||
|
Required: signed deploy attestations; reproducible build digest binding; optional remote attestation in higher-assurance environments.
|
||||||
|
|
||||||
|
### 9.4 Clock integrity
|
||||||
|
|
||||||
|
Current: timestamps are informative, not cryptographically trusted.
|
||||||
|
Required: monotonic counters + periodic anchoring; external timestamping strategy for forensic-grade timelines.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 10) Where to Go Deeper
|
||||||
|
|
||||||
|
- Full dossier (uncut): `DANNY_STOCKER_INFRAFABRIC_DOSSIER.md`
|
||||||
|
- IF.emotion trace protocol (detailed): `https://infrafabric.io/static/hosted/IF_EMOTION_DEBUGGING_TRACE_WHITEPAPER_v3.3_STYLED.md`
|
||||||
|
- Evidence bundles directory: `https://infrafabric.io/static/hosted/`
|
||||||
|
|
@ -0,0 +1 @@
|
||||||
|
d921501a4df47c97229de723011d53553141c34f07077c38c777e6019c4e2b44 DANNY_STOCKER_INFRAFABRIC_DOSSIER_SUBMISSION_EDITION.md
|
||||||
33431
DANNY_STOCKER_INFRAFABRIC_DOSSIER_UNCUT.md
Normal file
33431
DANNY_STOCKER_INFRAFABRIC_DOSSIER_UNCUT.md
Normal file
File diff suppressed because it is too large
Load diff
1
DANNY_STOCKER_INFRAFABRIC_DOSSIER_UNCUT.md.sha256
Normal file
1
DANNY_STOCKER_INFRAFABRIC_DOSSIER_UNCUT.md.sha256
Normal file
|
|
@ -0,0 +1 @@
|
||||||
|
fda9d292dbd70556a5bef44819e0b064541655123429d9e760f1723cf5f962ba DANNY_STOCKER_INFRAFABRIC_DOSSIER_UNCUT.md
|
||||||
|
|
@ -1 +1 @@
|
||||||
a848a2641adb5c94a7c490b69f78470a39962967353638d92e10d6498728bd65 /root/tmp/hosted_repo_update/IF_EMOTION_DEBUGGING_TRACE_WHITEPAPER_v2.0_STYLED.md
|
a848a2641adb5c94a7c490b69f78470a39962967353638d92e10d6498728bd65 IF_EMOTION_DEBUGGING_TRACE_WHITEPAPER_v2.0_STYLED.md
|
||||||
|
|
|
||||||
|
|
@ -1 +1 @@
|
||||||
e6a2c04eb550f980f1e03dc220961c55fc9b8da356d115cf6085cc7b85f7815b /root/tmp/hosted_repo_update/IF_EMOTION_DEBUGGING_TRACE_WHITEPAPER_v2.1_STYLED.md
|
e6a2c04eb550f980f1e03dc220961c55fc9b8da356d115cf6085cc7b85f7815b IF_EMOTION_DEBUGGING_TRACE_WHITEPAPER_v2.1_STYLED.md
|
||||||
|
|
|
||||||
|
|
@ -1 +1 @@
|
||||||
c933c2dd490104febaa5823b7a72178487486e4c7a88ab60428a215e9d9ebd23 /root/tmp/hosted_repo_update/IF_EMOTION_DEBUGGING_TRACE_WHITEPAPER_v2.2_STYLED.md
|
c933c2dd490104febaa5823b7a72178487486e4c7a88ab60428a215e9d9ebd23 IF_EMOTION_DEBUGGING_TRACE_WHITEPAPER_v2.2_STYLED.md
|
||||||
|
|
|
||||||
|
|
@ -1 +1 @@
|
||||||
cbd1423bc728576ef639a6c823a57878c7af56faa60112f226e9f652c910c3c5 /root/tmp/hosted_repo_update/IF_EMOTION_DEBUGGING_TRACE_WHITEPAPER_v2.3_STYLED.md
|
cbd1423bc728576ef639a6c823a57878c7af56faa60112f226e9f652c910c3c5 IF_EMOTION_DEBUGGING_TRACE_WHITEPAPER_v2.3_STYLED.md
|
||||||
|
|
|
||||||
|
|
@ -1 +1 @@
|
||||||
d87fbef381ee2e71dca4451d0eeb0c569728cf33f3e9089740589da9983a8cd3 /root/tmp/hosted_repo_update/IF_EMOTION_DEBUGGING_TRACE_WHITEPAPER_v2.4_STYLED.md
|
d87fbef381ee2e71dca4451d0eeb0c569728cf33f3e9089740589da9983a8cd3 IF_EMOTION_DEBUGGING_TRACE_WHITEPAPER_v2.4_STYLED.md
|
||||||
|
|
|
||||||
|
|
@ -1 +1 @@
|
||||||
ce3a221b478496c93943e77341c8d061ca5a5d037e34fb6b43db216d1e70bdbe /root/tmp/hosted_repo_update/IF_EMOTION_DEBUGGING_TRACE_WHITEPAPER_v2.5_STYLED.md
|
ce3a221b478496c93943e77341c8d061ca5a5d037e34fb6b43db216d1e70bdbe IF_EMOTION_DEBUGGING_TRACE_WHITEPAPER_v2.5_STYLED.md
|
||||||
|
|
|
||||||
|
|
@ -1 +1 @@
|
||||||
9c5c5729ea0955e3c1b87d1109b3cbee217cba229ee604c7f7b2f0390762ef63 /root/tmp/hosted_repo_update/IF_EMOTION_DEBUGGING_TRACE_WHITEPAPER_v2.6_STYLED.md
|
9c5c5729ea0955e3c1b87d1109b3cbee217cba229ee604c7f7b2f0390762ef63 IF_EMOTION_DEBUGGING_TRACE_WHITEPAPER_v2.6_STYLED.md
|
||||||
|
|
|
||||||
|
|
@ -1 +1 @@
|
||||||
9b55a687e2a0a2e03305c597ba399b4a19f345b8aac3edf2ed775c218d7fbbc5 /root/tmp/hosted_repo_update/IF_EMOTION_DEBUGGING_TRACE_WHITEPAPER_v2.7_STYLED.md
|
9b55a687e2a0a2e03305c597ba399b4a19f345b8aac3edf2ed775c218d7fbbc5 IF_EMOTION_DEBUGGING_TRACE_WHITEPAPER_v2.7_STYLED.md
|
||||||
|
|
|
||||||
|
|
@ -1 +1 @@
|
||||||
edbfedb13c75d6642a72637a4df6946e6e201fdf5211fa7df12563027c555013 /root/tmp/hosted_repo_update/IF_EMOTION_DEBUGGING_TRACE_WHITEPAPER_v2.8_STYLED.md
|
edbfedb13c75d6642a72637a4df6946e6e201fdf5211fa7df12563027c555013 IF_EMOTION_DEBUGGING_TRACE_WHITEPAPER_v2.8_STYLED.md
|
||||||
|
|
|
||||||
|
|
@ -1 +1 @@
|
||||||
2d4cb973aced1a26c9361eab19e92c9a5738f5364c1f9e7ea9236e87c1298846 /root/tmp/hosted_repo_update/IF_EMOTION_DEBUGGING_TRACE_WHITEPAPER_v2.9_STYLED.md
|
2d4cb973aced1a26c9361eab19e92c9a5738f5364c1f9e7ea9236e87c1298846 IF_EMOTION_DEBUGGING_TRACE_WHITEPAPER_v2.9_STYLED.md
|
||||||
|
|
|
||||||
|
|
@ -1 +1 @@
|
||||||
c791c964cac09965339f965b89ca69c2fc47e172d5cbec754a8d51a7827650fc /root/tmp/hosted_repo_update/IF_EMOTION_DEBUGGING_TRACE_WHITEPAPER_v3.0_STYLED.md
|
c791c964cac09965339f965b89ca69c2fc47e172d5cbec754a8d51a7827650fc IF_EMOTION_DEBUGGING_TRACE_WHITEPAPER_v3.0_STYLED.md
|
||||||
|
|
|
||||||
|
|
@ -1 +1 @@
|
||||||
ecb7a621d041bfaab0e838b98914026400fc4ff5125bfde4f064c62d416efc00 /root/tmp/hosted_repo_update/IF_EMOTION_DEBUGGING_TRACE_WHITEPAPER_v3.1_STYLED.md
|
ecb7a621d041bfaab0e838b98914026400fc4ff5125bfde4f064c62d416efc00 IF_EMOTION_DEBUGGING_TRACE_WHITEPAPER_v3.1_STYLED.md
|
||||||
|
|
|
||||||
|
|
@ -1 +1 @@
|
||||||
8e61cfd0353da980439d9e18aeb6d572d71eb58960ccf26dfdf279c453095835 /root/tmp/hosted_repo_update/IF_EMOTION_DEBUGGING_TRACE_WHITEPAPER_v3.2_STYLED.md
|
8e61cfd0353da980439d9e18aeb6d572d71eb58960ccf26dfdf279c453095835 IF_EMOTION_DEBUGGING_TRACE_WHITEPAPER_v3.2_STYLED.md
|
||||||
|
|
|
||||||
|
|
@ -1 +1 @@
|
||||||
9f21b6fcaef1f6d55458b75cc64340afec04b25d9ff6ea4996e163fc096679bd /root/tmp/hosted_repo_update/IF_EMOTION_DEBUGGING_TRACE_WHITEPAPER_v3.3_STYLED.md
|
9f21b6fcaef1f6d55458b75cc64340afec04b25d9ff6ea4996e163fc096679bd IF_EMOTION_DEBUGGING_TRACE_WHITEPAPER_v3.3_STYLED.md
|
||||||
|
|
|
||||||
|
|
@ -1 +1 @@
|
||||||
5d7e4dd96eeeb3d86fafaeb78f65c997230323939f12fbe9ab0e43e2a087b115 /root/tmp/hosted_repo_update/IF_EMOTION_TRACE_E2E_WALKTHROUGH_016cca78-6f9d-4ffe-aec0-99792d383ca1.md
|
5d7e4dd96eeeb3d86fafaeb78f65c997230323939f12fbe9ab0e43e2a087b115 IF_EMOTION_TRACE_E2E_WALKTHROUGH_016cca78-6f9d-4ffe-aec0-99792d383ca1.md
|
||||||
|
|
|
||||||
|
|
@ -1 +1 @@
|
||||||
be7001a6c31c349995529e347010d32cf01bf76ccc8f01a4141c1557f9c5b032 /root/tmp/hosted_repo_update/IF_EMOTION_TRACE_REFERENCE_016cca78_IF_STORY.md
|
be7001a6c31c349995529e347010d32cf01bf76ccc8f01a4141c1557f9c5b032 IF_EMOTION_TRACE_REFERENCE_016cca78_IF_STORY.md
|
||||||
|
|
|
||||||
|
|
@ -1 +1 @@
|
||||||
4f86ad4c1ebf415b6ed1ee700748584af1380ec0d04f8e0350e1fe51f458720e /root/tmp/hosted_repo_update/IF_EMOTION_TRACE_REFERENCE_96700e8e-6a83-445e-86f7-06905c500146_IF_STORY.md
|
4f86ad4c1ebf415b6ed1ee700748584af1380ec0d04f8e0350e1fe51f458720e IF_EMOTION_TRACE_REFERENCE_96700e8e-6a83-445e-86f7-06905c500146_IF_STORY.md
|
||||||
|
|
|
||||||
16
README.md
16
README.md
|
|
@ -2,6 +2,22 @@
|
||||||
|
|
||||||
Static hosted artifacts used in InfraFabric reviews.
|
Static hosted artifacts used in InfraFabric reviews.
|
||||||
|
|
||||||
|
## Dossier editions (hosted for stable review)
|
||||||
|
|
||||||
|
These are the same three “editions” exposed in the dossier viewer:
|
||||||
|
|
||||||
|
- Submission edition (clean): `DANNY_STOCKER_INFRAFABRIC_DOSSIER_SUBMISSION_EDITION.md`
|
||||||
|
- Data‑driven edition (microlab): `DANNY_STOCKER_INFRAFABRIC_DOSSIER_DATA_DRIVEN_EDITION.md`
|
||||||
|
- Uncut dossier (full): `DANNY_STOCKER_INFRAFABRIC_DOSSIER_UNCUT.md`
|
||||||
|
|
||||||
|
Verification:
|
||||||
|
|
||||||
|
- Each `*.md` has a `*.md.sha256` sidecar that is compatible with `sha256sum -c` when the file is in the same directory.
|
||||||
|
|
||||||
|
Dossier viewer (static site, renders markdown + anchors):
|
||||||
|
|
||||||
|
- `dossier_site/index.html`
|
||||||
|
|
||||||
## emo-social trace payload
|
## emo-social trace payload
|
||||||
|
|
||||||
- File: `emo_trace_payload_0642c357-7f8d-4eb5-9643-1992e7ee14a9.tar.gz`
|
- File: `emo_trace_payload_0642c357-7f8d-4eb5-9643-1992e7ee14a9.tar.gz`
|
||||||
|
|
|
||||||
|
|
@ -1 +1 @@
|
||||||
48a58a3729409dcc66da57cbd428b611ca50c29f03dc3b8b411a96acefdba76d /root/tmp/hosted_repo_update/VERIFY_EMO_TRACE_96700e8e-6a83-445e-86f7-06905c500146.md
|
48a58a3729409dcc66da57cbd428b611ca50c29f03dc3b8b411a96acefdba76d VERIFY_EMO_TRACE_96700e8e-6a83-445e-86f7-06905c500146.md
|
||||||
|
|
|
||||||
148
dossier_site/app.js
Normal file
148
dossier_site/app.js
Normal file
|
|
@ -0,0 +1,148 @@
|
||||||
|
/* global marked */
|
||||||
|
|
||||||
|
const DOCS = [
|
||||||
|
{
|
||||||
|
id: "submission",
|
||||||
|
title: "Submission Edition (Clean)",
|
||||||
|
file: "../DANNY_STOCKER_INFRAFABRIC_DOSSIER_SUBMISSION_EDITION.md",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: "data",
|
||||||
|
title: "Data‑Driven Technical Report (Microlab)",
|
||||||
|
file: "../DANNY_STOCKER_INFRAFABRIC_DOSSIER_DATA_DRIVEN_EDITION.md",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: "uncut",
|
||||||
|
title: "Uncut Dossier (Full)",
|
||||||
|
file: "../DANNY_STOCKER_INFRAFABRIC_DOSSIER_UNCUT.md",
|
||||||
|
},
|
||||||
|
];
|
||||||
|
|
||||||
|
function slugify(value) {
|
||||||
|
return String(value)
|
||||||
|
.replace(/<[^>]+>/g, "")
|
||||||
|
.trim()
|
||||||
|
.toLowerCase()
|
||||||
|
.replace(/[^\w\s-]/g, "")
|
||||||
|
.replace(/\s+/g, "-")
|
||||||
|
.replace(/-+/g, "-");
|
||||||
|
}
|
||||||
|
|
||||||
|
function createSlugger() {
|
||||||
|
const seen = new Map();
|
||||||
|
return (headingText) => {
|
||||||
|
const base = slugify(headingText) || "section";
|
||||||
|
const current = seen.get(base) || 0;
|
||||||
|
seen.set(base, current + 1);
|
||||||
|
return current === 0 ? base : `${base}-${current + 1}`;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
function setStatus(text) {
|
||||||
|
const statusEl = document.getElementById("status");
|
||||||
|
statusEl.textContent = text || "";
|
||||||
|
}
|
||||||
|
|
||||||
|
function buildToc() {
|
||||||
|
const tocEl = document.getElementById("toc");
|
||||||
|
tocEl.innerHTML = "";
|
||||||
|
|
||||||
|
const title = document.createElement("div");
|
||||||
|
title.className = "toc-title";
|
||||||
|
title.textContent = "On this page";
|
||||||
|
tocEl.appendChild(title);
|
||||||
|
|
||||||
|
const headings = Array.from(document.querySelectorAll("#content h1, #content h2, #content h3, #content h4"));
|
||||||
|
for (const heading of headings) {
|
||||||
|
const level = Number(heading.tagName.slice(1));
|
||||||
|
if (!heading.id) continue;
|
||||||
|
|
||||||
|
const a = document.createElement("a");
|
||||||
|
a.href = `#${heading.id}`;
|
||||||
|
a.textContent = heading.textContent || heading.id;
|
||||||
|
a.className = `depth-${level}`;
|
||||||
|
tocEl.appendChild(a);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function scrollToHash() {
|
||||||
|
const id = (location.hash || "").replace(/^#/, "");
|
||||||
|
if (!id) return;
|
||||||
|
|
||||||
|
const el = document.getElementById(id);
|
||||||
|
if (el) el.scrollIntoView({ block: "start" });
|
||||||
|
}
|
||||||
|
|
||||||
|
function setQueryParam(key, value) {
|
||||||
|
const url = new URL(location.href);
|
||||||
|
if (value == null) url.searchParams.delete(key);
|
||||||
|
else url.searchParams.set(key, value);
|
||||||
|
history.replaceState(null, "", url.toString());
|
||||||
|
}
|
||||||
|
|
||||||
|
async function loadDoc(docId) {
|
||||||
|
const doc = DOCS.find((d) => d.id === docId) || DOCS[0];
|
||||||
|
setQueryParam("doc", doc.id);
|
||||||
|
|
||||||
|
const rawLink = document.getElementById("openRaw");
|
||||||
|
rawLink.href = doc.file;
|
||||||
|
|
||||||
|
setStatus(`Loading: ${doc.title}…`);
|
||||||
|
|
||||||
|
const slugger = createSlugger();
|
||||||
|
const renderer = new marked.Renderer();
|
||||||
|
renderer.heading = (text, level) => {
|
||||||
|
const id = slugger(text);
|
||||||
|
return `<h${level} id="${id}">${text}</h${level}>`;
|
||||||
|
};
|
||||||
|
|
||||||
|
marked.setOptions({
|
||||||
|
renderer,
|
||||||
|
gfm: true,
|
||||||
|
breaks: false,
|
||||||
|
mangle: false,
|
||||||
|
headerIds: false,
|
||||||
|
});
|
||||||
|
|
||||||
|
try {
|
||||||
|
const res = await fetch(doc.file, { cache: "no-cache" });
|
||||||
|
if (!res.ok) throw new Error(`HTTP ${res.status}`);
|
||||||
|
const markdown = await res.text();
|
||||||
|
|
||||||
|
const html = marked.parse(markdown);
|
||||||
|
const contentEl = document.getElementById("content");
|
||||||
|
contentEl.innerHTML = html;
|
||||||
|
|
||||||
|
buildToc();
|
||||||
|
setStatus(`Loaded: ${doc.title}`);
|
||||||
|
scrollToHash();
|
||||||
|
} catch (err) {
|
||||||
|
setStatus(`Failed to load ${doc.title}: ${String(err)}`);
|
||||||
|
document.getElementById("content").textContent = "";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function init() {
|
||||||
|
const select = document.getElementById("docSelect");
|
||||||
|
for (const doc of DOCS) {
|
||||||
|
const opt = document.createElement("option");
|
||||||
|
opt.value = doc.id;
|
||||||
|
opt.textContent = doc.title;
|
||||||
|
select.appendChild(opt);
|
||||||
|
}
|
||||||
|
|
||||||
|
const initial = new URLSearchParams(location.search).get("doc") || DOCS[0].id;
|
||||||
|
select.value = DOCS.some((d) => d.id === initial) ? initial : DOCS[0].id;
|
||||||
|
|
||||||
|
select.addEventListener("change", () => {
|
||||||
|
location.hash = "";
|
||||||
|
loadDoc(select.value);
|
||||||
|
});
|
||||||
|
|
||||||
|
window.addEventListener("hashchange", () => scrollToHash());
|
||||||
|
|
||||||
|
loadDoc(select.value);
|
||||||
|
}
|
||||||
|
|
||||||
|
init();
|
||||||
|
|
||||||
37
dossier_site/index.html
Normal file
37
dossier_site/index.html
Normal file
|
|
@ -0,0 +1,37 @@
|
||||||
|
<!doctype html>
|
||||||
|
<html lang="en">
|
||||||
|
<head>
|
||||||
|
<meta charset="utf-8" />
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
||||||
|
<title>InfraFabric Dossier</title>
|
||||||
|
<link rel="stylesheet" href="./style.css" />
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<header class="topbar">
|
||||||
|
<div class="brand">
|
||||||
|
<div class="title">InfraFabric Dossier</div>
|
||||||
|
<div class="subtitle">Submission • Data‑Driven • Uncut</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="controls">
|
||||||
|
<label class="control">
|
||||||
|
<span class="label">Edition</span>
|
||||||
|
<select id="docSelect"></select>
|
||||||
|
</label>
|
||||||
|
<a id="openRaw" class="link" target="_blank" rel="noreferrer">Open raw</a>
|
||||||
|
</div>
|
||||||
|
</header>
|
||||||
|
|
||||||
|
<div class="layout">
|
||||||
|
<nav id="toc" class="toc" aria-label="Table of contents"></nav>
|
||||||
|
<main class="main">
|
||||||
|
<div id="status" class="status" role="status" aria-live="polite"></div>
|
||||||
|
<article id="content" class="content markdown-body"></article>
|
||||||
|
</main>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<script src="./vendor/marked.min.js"></script>
|
||||||
|
<script src="./app.js"></script>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
|
|
||||||
207
dossier_site/style.css
Normal file
207
dossier_site/style.css
Normal file
|
|
@ -0,0 +1,207 @@
|
||||||
|
:root {
|
||||||
|
color-scheme: light;
|
||||||
|
--bg: #f8fafc;
|
||||||
|
--panel: #ffffff;
|
||||||
|
--border: #e2e8f0;
|
||||||
|
--text: #0f172a;
|
||||||
|
--muted: #475569;
|
||||||
|
--link: #2563eb;
|
||||||
|
--shadow: 0 1px 2px rgba(15, 23, 42, 0.05), 0 8px 24px rgba(15, 23, 42, 0.06);
|
||||||
|
}
|
||||||
|
|
||||||
|
html,
|
||||||
|
body {
|
||||||
|
height: 100%;
|
||||||
|
}
|
||||||
|
|
||||||
|
body {
|
||||||
|
margin: 0;
|
||||||
|
font-family: ui-sans-serif, system-ui, -apple-system, Segoe UI, Roboto, Helvetica, Arial, "Apple Color Emoji",
|
||||||
|
"Segoe UI Emoji";
|
||||||
|
background: var(--bg);
|
||||||
|
color: var(--text);
|
||||||
|
}
|
||||||
|
|
||||||
|
.topbar {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: space-between;
|
||||||
|
gap: 16px;
|
||||||
|
padding: 14px 16px;
|
||||||
|
border-bottom: 1px solid var(--border);
|
||||||
|
background: var(--panel);
|
||||||
|
box-shadow: var(--shadow);
|
||||||
|
position: sticky;
|
||||||
|
top: 0;
|
||||||
|
z-index: 10;
|
||||||
|
}
|
||||||
|
|
||||||
|
.brand .title {
|
||||||
|
font-weight: 700;
|
||||||
|
font-size: 16px;
|
||||||
|
line-height: 1.2;
|
||||||
|
}
|
||||||
|
|
||||||
|
.brand .subtitle {
|
||||||
|
font-size: 12px;
|
||||||
|
color: var(--muted);
|
||||||
|
margin-top: 2px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.controls {
|
||||||
|
display: flex;
|
||||||
|
align-items: flex-end;
|
||||||
|
gap: 12px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.control {
|
||||||
|
display: grid;
|
||||||
|
gap: 6px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.label {
|
||||||
|
font-size: 12px;
|
||||||
|
color: var(--muted);
|
||||||
|
}
|
||||||
|
|
||||||
|
select {
|
||||||
|
font-size: 13px;
|
||||||
|
padding: 8px 10px;
|
||||||
|
border: 1px solid var(--border);
|
||||||
|
border-radius: 10px;
|
||||||
|
background: var(--panel);
|
||||||
|
color: var(--text);
|
||||||
|
}
|
||||||
|
|
||||||
|
.link {
|
||||||
|
display: inline-flex;
|
||||||
|
align-items: center;
|
||||||
|
padding: 8px 10px;
|
||||||
|
border: 1px solid var(--border);
|
||||||
|
border-radius: 10px;
|
||||||
|
text-decoration: none;
|
||||||
|
color: var(--link);
|
||||||
|
background: var(--panel);
|
||||||
|
font-size: 13px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.layout {
|
||||||
|
display: grid;
|
||||||
|
grid-template-columns: 320px 1fr;
|
||||||
|
gap: 16px;
|
||||||
|
padding: 16px;
|
||||||
|
max-width: 1400px;
|
||||||
|
margin: 0 auto;
|
||||||
|
}
|
||||||
|
|
||||||
|
.toc {
|
||||||
|
position: sticky;
|
||||||
|
top: 70px;
|
||||||
|
align-self: start;
|
||||||
|
max-height: calc(100vh - 90px);
|
||||||
|
overflow: auto;
|
||||||
|
background: var(--panel);
|
||||||
|
border: 1px solid var(--border);
|
||||||
|
border-radius: 14px;
|
||||||
|
padding: 12px;
|
||||||
|
box-shadow: var(--shadow);
|
||||||
|
}
|
||||||
|
|
||||||
|
.toc .toc-title {
|
||||||
|
font-size: 12px;
|
||||||
|
color: var(--muted);
|
||||||
|
margin: 4px 6px 10px 6px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.toc a {
|
||||||
|
display: block;
|
||||||
|
padding: 6px 8px;
|
||||||
|
border-radius: 10px;
|
||||||
|
text-decoration: none;
|
||||||
|
color: var(--text);
|
||||||
|
font-size: 13px;
|
||||||
|
line-height: 1.2;
|
||||||
|
}
|
||||||
|
|
||||||
|
.toc a:hover {
|
||||||
|
background: #f1f5f9;
|
||||||
|
}
|
||||||
|
|
||||||
|
.toc a.depth-2 {
|
||||||
|
padding-left: 18px;
|
||||||
|
}
|
||||||
|
.toc a.depth-3 {
|
||||||
|
padding-left: 28px;
|
||||||
|
}
|
||||||
|
.toc a.depth-4 {
|
||||||
|
padding-left: 38px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.main {
|
||||||
|
min-width: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.status {
|
||||||
|
font-size: 12px;
|
||||||
|
color: var(--muted);
|
||||||
|
padding: 6px 2px 10px 2px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.content {
|
||||||
|
background: var(--panel);
|
||||||
|
border: 1px solid var(--border);
|
||||||
|
border-radius: 14px;
|
||||||
|
padding: 18px 20px;
|
||||||
|
box-shadow: var(--shadow);
|
||||||
|
overflow-wrap: anywhere;
|
||||||
|
}
|
||||||
|
|
||||||
|
.markdown-body h1,
|
||||||
|
.markdown-body h2,
|
||||||
|
.markdown-body h3,
|
||||||
|
.markdown-body h4,
|
||||||
|
.markdown-body h5,
|
||||||
|
.markdown-body h6 {
|
||||||
|
scroll-margin-top: 90px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.markdown-body a {
|
||||||
|
color: var(--link);
|
||||||
|
}
|
||||||
|
|
||||||
|
.markdown-body pre {
|
||||||
|
background: #0b1220;
|
||||||
|
color: #e2e8f0;
|
||||||
|
padding: 12px;
|
||||||
|
border-radius: 12px;
|
||||||
|
overflow: auto;
|
||||||
|
}
|
||||||
|
|
||||||
|
.markdown-body code {
|
||||||
|
font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;
|
||||||
|
}
|
||||||
|
|
||||||
|
.markdown-body table {
|
||||||
|
border-collapse: collapse;
|
||||||
|
width: 100%;
|
||||||
|
overflow: auto;
|
||||||
|
display: block;
|
||||||
|
}
|
||||||
|
|
||||||
|
.markdown-body th,
|
||||||
|
.markdown-body td {
|
||||||
|
border: 1px solid var(--border);
|
||||||
|
padding: 8px 10px;
|
||||||
|
vertical-align: top;
|
||||||
|
}
|
||||||
|
|
||||||
|
@media (max-width: 980px) {
|
||||||
|
.layout {
|
||||||
|
grid-template-columns: 1fr;
|
||||||
|
}
|
||||||
|
.toc {
|
||||||
|
position: static;
|
||||||
|
max-height: none;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
69
dossier_site/vendor/marked.min.js
vendored
Normal file
69
dossier_site/vendor/marked.min.js
vendored
Normal file
File diff suppressed because one or more lines are too long
|
|
@ -1 +1 @@
|
||||||
635671faa2b056253e8e26469d04d87f4f597c7bca0815eff038fb2b1986b548 /root/tmp/hosted_repo_update/emo_trace_pack.py
|
635671faa2b056253e8e26469d04d87f4f597c7bca0815eff038fb2b1986b548 emo_trace_pack.py
|
||||||
|
|
|
||||||
|
|
@ -1 +1 @@
|
||||||
7101ff9c38fc759a66157f6a6ab9c0936af547d0ec77a51b5d05db07069966c8 /root/tmp/hosted_repo_update/emo_trace_payload_016cca78-6f9d-4ffe-aec0-99792d383ca1.tar.gz
|
7101ff9c38fc759a66157f6a6ab9c0936af547d0ec77a51b5d05db07069966c8 emo_trace_payload_016cca78-6f9d-4ffe-aec0-99792d383ca1.tar.gz
|
||||||
|
|
|
||||||
|
|
@ -1 +1 @@
|
||||||
db55ba68da4bc11f9c2244c3f0d3eb338db265244e19700ee1447d5ec44c5444 /root/tmp/hosted_repo_update/emo_trace_payload_016cca78-6f9d-4ffe-aec0-99792d383ca1.ttt_audit_entry.json
|
db55ba68da4bc11f9c2244c3f0d3eb338db265244e19700ee1447d5ec44c5444 emo_trace_payload_016cca78-6f9d-4ffe-aec0-99792d383ca1.ttt_audit_entry.json
|
||||||
|
|
|
||||||
|
|
@ -1 +1 @@
|
||||||
fb4c332b8fc4e9f08f6f7a9994760facc258da0127eb4371487fffae651f0677 /root/tmp/hosted_repo_update/emo_trace_payload_016cca78-6f9d-4ffe-aec0-99792d383ca1.ttt_chain_record.json
|
fb4c332b8fc4e9f08f6f7a9994760facc258da0127eb4371487fffae651f0677 emo_trace_payload_016cca78-6f9d-4ffe-aec0-99792d383ca1.ttt_chain_record.json
|
||||||
|
|
|
||||||
|
|
@ -1 +1 @@
|
||||||
c6ea8656af830538adf293e666441ff66666eaca134b943170f84c90495d070c /root/tmp/hosted_repo_update/emo_trace_payload_016cca78-6f9d-4ffe-aec0-99792d383ca1.ttt_chain_ref.json
|
c6ea8656af830538adf293e666441ff66666eaca134b943170f84c90495d070c emo_trace_payload_016cca78-6f9d-4ffe-aec0-99792d383ca1.ttt_chain_ref.json
|
||||||
|
|
|
||||||
|
|
@ -1 +1 @@
|
||||||
1e729429e29e47b2efd1c78d07c16df653af1363786468d436f27e81cc870b3d /root/tmp/hosted_repo_update/emo_trace_payload_09aad3e1-f420-451e-a189-e86f68073dc0.tar.gz
|
1e729429e29e47b2efd1c78d07c16df653af1363786468d436f27e81cc870b3d emo_trace_payload_09aad3e1-f420-451e-a189-e86f68073dc0.tar.gz
|
||||||
|
|
|
||||||
|
|
@ -1 +1 @@
|
||||||
85eb323c8e5f11cf4dd18e612e8cde8dcdb355b3fbd6380bbc8d480a5bf97e87 /root/tmp/hosted_repo_update/emo_trace_payload_96700e8e-6a83-445e-86f7-06905c500146.tar.gz
|
85eb323c8e5f11cf4dd18e612e8cde8dcdb355b3fbd6380bbc8d480a5bf97e87 emo_trace_payload_96700e8e-6a83-445e-86f7-06905c500146.tar.gz
|
||||||
|
|
|
||||||
|
|
@ -1 +1 @@
|
||||||
7174cfba22651a19ad948a0df06d7dc3dc802acd2a6f2fc8364dbf311f178332 /root/tmp/hosted_repo_update/emo_trace_payload_96700e8e-6a83-445e-86f7-06905c500146.ttt_audit_entry.json
|
7174cfba22651a19ad948a0df06d7dc3dc802acd2a6f2fc8364dbf311f178332 emo_trace_payload_96700e8e-6a83-445e-86f7-06905c500146.ttt_audit_entry.json
|
||||||
|
|
|
||||||
|
|
@ -1 +1 @@
|
||||||
232722db9fe133aea3923565695324807cd7a74e81a6db2db360a18e9aa4181f /root/tmp/hosted_repo_update/emo_trace_payload_96700e8e-6a83-445e-86f7-06905c500146.ttt_chain_record.json
|
232722db9fe133aea3923565695324807cd7a74e81a6db2db360a18e9aa4181f emo_trace_payload_96700e8e-6a83-445e-86f7-06905c500146.ttt_chain_record.json
|
||||||
|
|
|
||||||
|
|
@ -1 +1 @@
|
||||||
86efb752980e12b64a2c36c82d84bf3116cb3a48ef621e288691fa29a6902c63 /root/tmp/hosted_repo_update/emo_trace_payload_96700e8e-6a83-445e-86f7-06905c500146.ttt_chain_ref.json
|
86efb752980e12b64a2c36c82d84bf3116cb3a48ef621e288691fa29a6902c63 emo_trace_payload_96700e8e-6a83-445e-86f7-06905c500146.ttt_chain_ref.json
|
||||||
|
|
|
||||||
|
|
@ -1 +1 @@
|
||||||
7b4587a12218b37abaafe56adb3a7071e84bbc6bfe9ee9442236e476c6533f9c /root/tmp/hosted_repo_update/iftrace.py
|
7b4587a12218b37abaafe56adb3a7071e84bbc6bfe9ee9442236e476c6533f9c iftrace.py
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue