From 1a3550b276e34bd2647c302cf18791efc067bb6f Mon Sep 17 00:00:00 2001 From: stunspot Date: Tue, 8 Sep 2026 07:27:52 -0500 Subject: [PATCH 1/2] Rebuild Pages around an interactive investigation file --- .github/workflows/test.yml | 4 +- docs/assets/evidence-board.js | 127 ++++++ .../assets/fonts/BarlowCondensed-SemiBold.ttf | Bin 0 -> 109428 bytes docs/assets/fonts/BebasNeue-Regular.ttf | Bin 0 -> 61400 bytes docs/assets/fonts/OFL-Barlow-Condensed.txt | 93 ++++ docs/assets/fonts/OFL-Bebas-Neue.txt | 93 ++++ docs/assets/fonts/README.md | 30 ++ docs/assets/site.css | 49 +- docs/guide.html | 10 +- docs/index.html | 132 +++--- tools/test_evidence_board.cjs | 426 ++++++++++++++++++ 11 files changed, 871 insertions(+), 93 deletions(-) create mode 100644 docs/assets/evidence-board.js create mode 100644 docs/assets/fonts/BarlowCondensed-SemiBold.ttf create mode 100644 docs/assets/fonts/BebasNeue-Regular.ttf create mode 100644 docs/assets/fonts/OFL-Barlow-Condensed.txt create mode 100644 docs/assets/fonts/OFL-Bebas-Neue.txt create mode 100644 docs/assets/fonts/README.md create mode 100644 tools/test_evidence_board.cjs diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index d4721dd..0e90127 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -23,4 +23,6 @@ jobs: - name: Build release from source run: python -B tools/build_release.py - name: Check public site links and fictional demo parity - run: python -B tools/check_site.py \ No newline at end of file + run: python -B tools/check_site.py + - name: Exercise homepage evidence selection and fallback + run: node tools/test_evidence_board.cjs diff --git a/docs/assets/evidence-board.js b/docs/assets/evidence-board.js new file mode 100644 index 0000000..debc6a1 --- /dev/null +++ b/docs/assets/evidence-board.js @@ -0,0 +1,127 @@ +(function (root, factory) { + 'use strict'; + const api = factory(); + if (typeof module === 'object' && module.exports) module.exports = api; + if (root && root.document) { + const document = root.document; + if (document.readyState === 'loading') { + document.addEventListener('DOMContentLoaded', function () { + api.initEvidenceBoard(document); + }, { once: true }); + } else { + api.initEvidenceBoard(document); + } + } +}(typeof globalThis !== 'undefined' ? globalThis : this, function () { + 'use strict'; + + const records = Object.freeze({ + award: Object.freeze({ + id: 'award', + edge: 'e-grant', + nodes: Object.freeze(['cobalt', 'meridian']), + announcement: 'The award notice: Cobalt Foundation awarded a research grant to Meridian Institute.' + }), + agreement: Object.freeze({ + id: 'agreement', + edge: 'e-approval', + nodes: Object.freeze(['cobalt', 'brief']), + announcement: 'The signed agreement: Cobalt Foundation holds approval rights over the funded policy brief.' + }), + revision: Object.freeze({ + id: 'revision', + edge: 'e-leo-revisions', + nodes: Object.freeze(['leo', 'brief']), + announcement: 'The revision register: Leo Venn requested in-scope revisions to the funded policy brief.' + }) + }); + const edgeIds = ['e-grant', 'e-approval', 'e-leo-revisions', 'e-direction']; + const nodeIds = ['cobalt', 'meridian', 'leo', 'brief', 'astera']; + const controllers = new WeakMap(); + + function getRecord(id) { + return typeof id === 'string' && Object.prototype.hasOwnProperty.call(records, id) + ? records[id] : null; + } + + function unique(scope, selector) { + const matches = scope.querySelectorAll(selector); + return matches.length === 1 ? matches[0] : null; + } + + function initEvidenceBoard(document) { + if (!document || typeof document.querySelectorAll !== 'function') return null; + const board = unique(document, '#evidence-board'); + if (!board) return null; + if (controllers.has(board)) return controllers.get(board); + + // Resolve the whole contract before changing the readable HTML fallback. + const controls = unique(board, '[data-record-controls]'); + const announcement = unique(board, '[data-record-announcement]'); + if (!controls || !announcement) return null; + const entries = Object.keys(records).map(function (id) { + return { + record: records[id], + article: unique(board, '[data-record="' + id + '"]'), + button: unique(controls, '[data-select-record="' + id + '"]') + }; + }); + const edges = edgeIds.map(function (id) { + return { id: id, element: unique(board, '[data-edge="' + id + '"]') }; + }); + const nodes = nodeIds.map(function (id) { + return { id: id, element: unique(board, '[data-node="' + id + '"]') }; + }); + const validEntries = entries.every(function (entry) { + return entry.article && entry.button && + entry.article.tagName.toLowerCase() === 'article' && + entry.button.tagName.toLowerCase() === 'button' && + entry.article.id === 'record-' + entry.record.id && + entry.button.getAttribute('aria-controls') === entry.article.id; + }); + if (!validEntries || !edges.every(function (edge) { return edge.element; }) || + !nodes.every(function (node) { return node.element; }) || + board.querySelectorAll('[data-record]').length !== entries.length || + controls.querySelectorAll('[data-select-record]').length !== entries.length || + announcement.getAttribute('role') !== 'status' || + announcement.getAttribute('aria-live') !== 'polite' || + entries.some(function (entry) { return entry.article.contains(announcement); })) return null; + + let selectedId = null; + function select(id, fromUser) { + const record = getRecord(id); + if (!record) return false; + if (selectedId === id) return true; + entries.forEach(function (entry) { + const active = entry.record.id === id; + entry.article.hidden = !active; + entry.button.setAttribute('aria-pressed', String(active)); + }); + edges.forEach(function (edge) { + edge.element.classList.toggle('is-active', edge.id === record.edge); + }); + nodes.forEach(function (node) { + node.element.classList.toggle('is-active', record.nodes.indexOf(node.id) !== -1); + }); + selectedId = id; + if (fromUser) announcement.textContent = record.announcement; + return true; + } + + entries.forEach(function (entry) { + // Native button activation supplies keyboard behavior and retains focus. + entry.button.addEventListener('click', function () { select(entry.record.id, true); }); + }); + select('award', false); + board.classList.add('is-enhanced'); + controls.hidden = false; + const controller = Object.freeze({ + select: function (id) { return select(id, false); }, + get selectedId() { return selectedId; } + }); + controllers.set(board, controller); + return controller; + } + + return Object.freeze({ getRecord: getRecord, initEvidenceBoard: initEvidenceBoard }); +})); diff --git a/docs/assets/fonts/BarlowCondensed-SemiBold.ttf b/docs/assets/fonts/BarlowCondensed-SemiBold.ttf new file mode 100644 index 0000000000000000000000000000000000000000..9df66576492bee4bd0559066825472808fa98adc GIT binary patch literal 109428 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 literal 0 HcmV?d00001 diff --git a/docs/assets/fonts/OFL-Barlow-Condensed.txt b/docs/assets/fonts/OFL-Barlow-Condensed.txt new file mode 100644 index 0000000..11f2528 --- /dev/null +++ b/docs/assets/fonts/OFL-Barlow-Condensed.txt @@ -0,0 +1,93 @@ +Copyright 2017 The Barlow Project Authors (https://github.com/jpt/barlow) + +This Font Software is licensed under the SIL Open Font License, Version 1.1. +This license is copied below, and is also available with a FAQ at: +http://scripts.sil.org/OFL + + +----------------------------------------------------------- +SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 +----------------------------------------------------------- + +PREAMBLE +The goals of the Open Font License (OFL) are to stimulate worldwide +development of collaborative font projects, to support the font creation +efforts of academic and linguistic communities, and to provide a free and +open framework in which fonts may be shared and improved in partnership +with others. + +The OFL allows the licensed fonts to be used, studied, modified and +redistributed freely as long as they are not sold by themselves. The +fonts, including any derivative works, can be bundled, embedded, +redistributed and/or sold with any software provided that any reserved +names are not used by derivative works. The fonts and derivatives, +however, cannot be released under any other type of license. The +requirement for fonts to remain under this license does not apply +to any document created using the fonts or their derivatives. + +DEFINITIONS +"Font Software" refers to the set of files released by the Copyright +Holder(s) under this license and clearly marked as such. This may +include source files, build scripts and documentation. + +"Reserved Font Name" refers to any names specified as such after the +copyright statement(s). + +"Original Version" refers to the collection of Font Software components as +distributed by the Copyright Holder(s). + +"Modified Version" refers to any derivative made by adding to, deleting, +or substituting -- in part or in whole -- any of the components of the +Original Version, by changing formats or by porting the Font Software to a +new environment. + +"Author" refers to any designer, engineer, programmer, technical +writer or other person who contributed to the Font Software. + +PERMISSION & CONDITIONS +Permission is hereby granted, free of charge, to any person obtaining +a copy of the Font Software, to use, study, copy, merge, embed, modify, +redistribute, and sell modified and unmodified copies of the Font +Software, subject to the following conditions: + +1) Neither the Font Software nor any of its individual components, +in Original or Modified Versions, may be sold by itself. + +2) Original or Modified Versions of the Font Software may be bundled, +redistributed and/or sold with any software, provided that each copy +contains the above copyright notice and this license. These can be +included either as stand-alone text files, human-readable headers or +in the appropriate machine-readable metadata fields within text or +binary files as long as those fields can be easily viewed by the user. + +3) No Modified Version of the Font Software may use the Reserved Font +Name(s) unless explicit written permission is granted by the corresponding +Copyright Holder. This restriction only applies to the primary font name as +presented to the users. + +4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font +Software shall not be used to promote, endorse or advertise any +Modified Version, except to acknowledge the contribution(s) of the +Copyright Holder(s) and the Author(s) or with their explicit written +permission. + +5) The Font Software, modified or unmodified, in part or in whole, +must be distributed entirely under this license, and must not be +distributed under any other license. The requirement for fonts to +remain under this license does not apply to any document created +using the Font Software. + +TERMINATION +This license becomes null and void if any of the above conditions are +not met. + +DISCLAIMER +THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT +OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE +COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM +OTHER DEALINGS IN THE FONT SOFTWARE. diff --git a/docs/assets/fonts/OFL-Bebas-Neue.txt b/docs/assets/fonts/OFL-Bebas-Neue.txt new file mode 100644 index 0000000..2ca164f --- /dev/null +++ b/docs/assets/fonts/OFL-Bebas-Neue.txt @@ -0,0 +1,93 @@ +Copyright © 2010 by Dharma Type. + +This Font Software is licensed under the SIL Open Font License, Version 1.1. +This license is copied below, and is also available with a FAQ at: +http://scripts.sil.org/OFL + + +----------------------------------------------------------- +SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 +----------------------------------------------------------- + +PREAMBLE +The goals of the Open Font License (OFL) are to stimulate worldwide +development of collaborative font projects, to support the font creation +efforts of academic and linguistic communities, and to provide a free and +open framework in which fonts may be shared and improved in partnership +with others. + +The OFL allows the licensed fonts to be used, studied, modified and +redistributed freely as long as they are not sold by themselves. The +fonts, including any derivative works, can be bundled, embedded, +redistributed and/or sold with any software provided that any reserved +names are not used by derivative works. The fonts and derivatives, +however, cannot be released under any other type of license. The +requirement for fonts to remain under this license does not apply +to any document created using the fonts or their derivatives. + +DEFINITIONS +"Font Software" refers to the set of files released by the Copyright +Holder(s) under this license and clearly marked as such. This may +include source files, build scripts and documentation. + +"Reserved Font Name" refers to any names specified as such after the +copyright statement(s). + +"Original Version" refers to the collection of Font Software components as +distributed by the Copyright Holder(s). + +"Modified Version" refers to any derivative made by adding to, deleting, +or substituting -- in part or in whole -- any of the components of the +Original Version, by changing formats or by porting the Font Software to a +new environment. + +"Author" refers to any designer, engineer, programmer, technical +writer or other person who contributed to the Font Software. + +PERMISSION & CONDITIONS +Permission is hereby granted, free of charge, to any person obtaining +a copy of the Font Software, to use, study, copy, merge, embed, modify, +redistribute, and sell modified and unmodified copies of the Font +Software, subject to the following conditions: + +1) Neither the Font Software nor any of its individual components, +in Original or Modified Versions, may be sold by itself. + +2) Original or Modified Versions of the Font Software may be bundled, +redistributed and/or sold with any software, provided that each copy +contains the above copyright notice and this license. These can be +included either as stand-alone text files, human-readable headers or +in the appropriate machine-readable metadata fields within text or +binary files as long as those fields can be easily viewed by the user. + +3) No Modified Version of the Font Software may use the Reserved Font +Name(s) unless explicit written permission is granted by the corresponding +Copyright Holder. This restriction only applies to the primary font name as +presented to the users. + +4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font +Software shall not be used to promote, endorse or advertise any +Modified Version, except to acknowledge the contribution(s) of the +Copyright Holder(s) and the Author(s) or with their explicit written +permission. + +5) The Font Software, modified or unmodified, in part or in whole, +must be distributed entirely under this license, and must not be +distributed under any other license. The requirement for fonts to +remain under this license does not apply to any document created +using the Font Software. + +TERMINATION +This license becomes null and void if any of the above conditions are +not met. + +DISCLAIMER +THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT +OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE +COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM +OTHER DEALINGS IN THE FONT SOFTWARE. diff --git a/docs/assets/fonts/README.md b/docs/assets/fonts/README.md new file mode 100644 index 0000000..67ee4fd --- /dev/null +++ b/docs/assets/fonts/README.md @@ -0,0 +1,30 @@ +# Self-hosted fonts + +RED THREADS serves these fonts locally. They are original, unmodified TTF files from the official [Google Fonts repository](https://github.com/google/fonts/tree/5e35378e6bda803962ee6fd257e444a7d459660d), downloaded on 2026-09-08. No font service is contacted at runtime. + +| Font | Use | Version | Weight | Size | Source | License notice | +| --- | --- | --- | --- | --- | --- | --- | +| Bebas Neue Regular | Display lettering | 2.000 | 400 | 61,400 bytes | [Original TTF](https://github.com/google/fonts/blob/5e35378e6bda803962ee6fd257e444a7d459660d/ofl/bebasneue/BebasNeue-Regular.ttf) | [OFL-Bebas-Neue.txt](OFL-Bebas-Neue.txt) | +| Barlow Condensed SemiBold | Headings | 1.408 | 600 | 109,428 bytes | [Original TTF](https://github.com/google/fonts/blob/5e35378e6bda803962ee6fd257e444a7d459660d/ofl/barlowcondensed/BarlowCondensed-SemiBold.ttf) | [OFL-Barlow-Condensed.txt](OFL-Barlow-Condensed.txt) | + +Both families use the SIL Open Font License 1.1. The full upstream copyright and license notices accompany the fonts with their wording preserved (line endings and trailing whitespace normalized), from [Bebas Neue's OFL.txt](https://github.com/google/fonts/blob/5e35378e6bda803962ee6fd257e444a7d459660d/ofl/bebasneue/OFL.txt) and [Barlow Condensed's OFL.txt](https://github.com/google/fonts/blob/5e35378e6bda803962ee6fd257e444a7d459660d/ofl/barlowcondensed/OFL.txt). Font metadata, names, glyphs, and embedded copyright notices are preserved. These font licenses remain separate from the surrounding project's license. + +The TTF files retain the upstream character coverage. No local font installation, external stylesheet, or conversion is required. For CSS in `docs/assets/site.css`, use: + +```css +@font-face { + font-family: "Bebas Neue"; + src: url("./fonts/BebasNeue-Regular.ttf") format("truetype"); + font-style: normal; + font-weight: 400; + font-display: swap; +} + +@font-face { + font-family: "Barlow Condensed"; + src: url("./fonts/BarlowCondensed-SemiBold.ttf") format("truetype"); + font-style: normal; + font-weight: 600; + font-display: swap; +} +``` diff --git a/docs/assets/site.css b/docs/assets/site.css index 26e8afe..8d3186c 100644 --- a/docs/assets/site.css +++ b/docs/assets/site.css @@ -1,31 +1,20 @@ -/* RED THREADS: an editorial front door to an evidence-first investigation. */ -:root{color-scheme:dark;--ink:#171716;--ink-deep:#101110;--ink-soft:#20211f;--paper:#f2eddf;--paper-muted:#c2bbae;--line:#49473e;--red:#f26454;--red-deep:#9b2f28;--warm:#bba987;--serif:Georgia,'Times New Roman',serif;--sans:'Segoe UI',Arial,sans-serif;--mono:Consolas,'Courier New',monospace;--max:1400px;--gutter:clamp(22px,4.4vw,78px)} -*{box-sizing:border-box}html{scroll-behavior:smooth;scroll-padding-top:28px}body{margin:0;background:var(--ink);color:var(--paper);font-family:var(--sans);font-size:17px;line-height:1.65;-webkit-font-smoothing:antialiased} -a{color:inherit;text-underline-offset:5px;text-decoration-thickness:1px}a:hover{color:var(--red)}button,a,summary{-webkit-tap-highlight-color:transparent}button{font:inherit}a:focus-visible,button:focus-visible,summary:focus-visible{outline:3px solid var(--red);outline-offset:6px}::selection{background:var(--red);color:var(--ink-deep)}img{display:block;max-width:100%;height:auto}button[hidden],[hidden]{display:none!important} -.wrap{width:min(calc(100% - var(--gutter)*2),var(--max));margin-inline:auto}.skip-link{position:absolute;z-index:20;left:20px;top:12px;padding:10px 18px;background:var(--paper);color:var(--ink);transform:translateY(-160%)}.skip-link:focus{transform:none} -.site-header{min-height:116px;display:flex;gap:35px;align-items:center;justify-content:space-between;border-bottom:1px solid var(--line)}.wordmark{display:block;position:relative;padding-left:26px;font-family:var(--serif);font-size:22px;font-weight:bold;line-height:1.05;letter-spacing:.04em;text-decoration:none;flex-shrink:0}.wordmark-sub{display:block;font-family:var(--mono);font-size:8px;font-weight:normal;letter-spacing:.19em;margin-top:8px}.thread-mark{position:absolute;left:0;top:0;width:3px;height:43px;background:var(--red)}.thread-mark:before,.thread-mark:after{content:'';position:absolute;left:-3px;width:9px;height:9px;border:2px solid var(--red);background:var(--ink);border-radius:50%}.thread-mark:before{top:-2px}.thread-mark:after{bottom:-2px} -.site-header nav{display:flex;gap:clamp(20px,2.6vw,40px);align-items:center;font-size:13px}.site-header nav a{text-decoration:none;padding-block:12px;white-space:nowrap}.site-header nav a[aria-current=page]{color:var(--red);text-decoration:underline;text-underline-offset:8px}.site-header nav a span{margin-left:4px;color:var(--red)} -.hero{padding-top:66px;padding-bottom:68px;display:grid;grid-template-columns:minmax(0,.87fr) minmax(0,1.13fr);gap:clamp(30px,4vw,65px);align-items:center}.eyebrow,.section-label,.fine-print,.edition-line,.case-stamp,.record-locator,.fiction-label,.work-note,.atlas-caption>span{font-family:var(--mono)}.eyebrow{font-size:10px;letter-spacing:.11em;color:var(--paper-muted);margin:0 0 25px;text-wrap:balance}.status-dot{display:inline-block;width:6px;height:6px;border-radius:50%;background:var(--red);margin-right:9px;vertical-align:middle} -h1,h2,h3,p,figure{margin-top:0}h1,h2{font-family:var(--serif);font-weight:normal;letter-spacing:-.055em;line-height:1.05}h1{font-size:clamp(49px,5.1vw,83px);margin-bottom:26px}h1 em,h2 em{font-weight:normal;color:var(--red)}h2{font-size:clamp(40px,4.1vw,64px);margin-bottom:24px}h3{font-family:var(--serif);font-size:25px;letter-spacing:-.025em;line-height:1.3;font-weight:normal;margin-bottom:10px}p{margin-bottom:21px}.hero-description{font-size:20px;line-height:1.5;margin-bottom:16px}.hero-detail{font-size:16px;color:var(--paper-muted);max-width:420px;line-height:1.7;margin-bottom:26px} -.actions{display:flex;gap:22px;align-items:center;flex-wrap:wrap}.button{display:inline-flex;justify-content:space-between;align-items:center;gap:28px;padding:15px 22px;font-size:14px;font-weight:600;line-height:1.4;min-height:52px;text-decoration:none;border:1px solid transparent;transition:background .15s ease,color .15s ease}.button-red{background:var(--red);color:var(--ink-deep)}.button-red:hover{background:var(--paper);color:var(--ink-deep)}.button-red:focus-visible{outline-color:var(--paper)}.button span{font-size:22px;line-height:1}.text-link{display:inline-block;min-height:30px;font-size:13px;text-decoration:none;border-bottom:1px solid var(--line);padding-block:4px;line-height:1.6}.text-link span{color:var(--red);margin-left:10px}.fine-print{font-size:10px;color:var(--paper-muted);line-height:1.7;margin:15px 0 0;letter-spacing:.015em} -.hero-art{margin:0}.hero-art img{width:100%;height:auto;aspect-ratio:1672/941;object-fit:contain;border:1px solid #34322a}.hero-art figcaption{display:flex;gap:16px;justify-content:space-between;border-top:1px solid var(--line);margin-top:20px;padding-top:12px;font-size:10px;color:var(--paper-muted);line-height:1.5}.hero-art figcaption span:first-child{color:var(--red);font-family:var(--mono);font-size:10px;letter-spacing:.09em;white-space:nowrap} -.edition-line{display:flex;flex-wrap:wrap;justify-content:space-between;gap:14px 24px;padding:20px 0;border-block:1px solid var(--line);font-size:10px;letter-spacing:.09em;color:var(--paper-muted)}.section-space{padding-block:96px}.section-label{display:flex;gap:18px;font-size:10px;letter-spacing:.13em;margin-bottom:40px;color:var(--paper-muted);line-height:1.7}.section-label>span{color:var(--red);font-weight:600}.manifesto-body{display:grid;grid-template-columns:1fr 1fr;gap:clamp(35px,8vw,150px)}.prose{max-width:600px;font-size:17px;line-height:1.8;color:var(--paper-muted)}.prose p:last-child{margin-bottom:0}.prose .lead{font-size:23px;line-height:1.55;color:var(--paper)}.prose em{color:var(--paper)} -.method-section{background:var(--paper);color:var(--ink);color-scheme:light}.method-section .section-label,.method-section .prose,.method-section .case-margin p{color:#5b564c}.method-section h2 em,.method-section .section-label>span{color:var(--red-deep)}.section-heading{display:grid;grid-template-columns:1.2fr 1fr;gap:clamp(40px,6vw,95px);align-items:start;margin-bottom:45px}.section-heading .prose{padding-top:7px;margin-bottom:0}.evidence-chain{display:grid;grid-template-columns:.45fr 1fr;gap:clamp(40px,6vw,95px);padding-top:16px}.case-margin{padding-top:28px}.case-stamp{display:inline-block;font-size:10px;letter-spacing:.12em;color:var(--red-deep);border:1px solid #b4a691;padding:6px 10px;margin-bottom:21px}.case-margin p{font-size:12px;line-height:1.7;margin-bottom:22px}.method-section .text-link{border-color:#b4a691}.method-section .text-link span{color:var(--red-deep)} -.record-stack{position:relative;border-top:1px solid #b9ae9d}.record{border-bottom:1px solid #b9ae9d}.record summary{list-style:none;cursor:pointer;display:grid;grid-template-columns:45px 1fr 24px;align-items:center;gap:17px;padding:24px 3px;min-height:99px}.record summary::-webkit-details-marker{display:none}.record-no{font-family:var(--mono);font-size:12px;color:var(--red-deep)}.record-title{font-family:var(--serif);font-size:28px;line-height:1.1;letter-spacing:-.03em}.record-title small{display:block;font-family:var(--mono);font-size:9px;letter-spacing:.08em;text-transform:uppercase;color:#62594d;margin-top:9px}.detail-sign{width:18px;height:18px;position:relative;color:var(--red-deep)}.detail-sign:before,.detail-sign:after{content:'';position:absolute;background:currentColor}.detail-sign:before{width:16px;height:1px;top:8px;left:1px}.detail-sign:after{width:1px;height:16px;left:8px;top:1px}.record[open] .detail-sign:after{display:none}.record summary:hover .record-title{color:var(--red-deep)}.record-body{padding:0 35px 26px 65px;font-size:15px;line-height:1.8;color:#524b42}.record-fact{font-family:var(--serif);font-size:23px;color:var(--ink);line-height:1.45}.record-fact strong{font-weight:normal;color:var(--red-deep)}.record-locator{font-size:9px;letter-spacing:.06em;margin-bottom:0}.method-conclusion{margin:52px 0 0 34.48%;font-size:18px;line-height:1.7;color:#645a4e}.method-conclusion strong{color:var(--ink);font-weight:500} -.demo-brief{border:1px solid var(--line);display:grid;grid-template-columns:.78fr 1fr;margin-top:48px}.demo-question{background:var(--ink-deep);padding:40px clamp(26px,3.6vw,54px);display:flex;flex-direction:column;justify-content:center}.demo-question .eyebrow{color:var(--red);margin-bottom:24px}.demo-question>p{font-family:var(--serif);font-size:clamp(27px,2.4vw,38px);line-height:1.25;letter-spacing:-.035em}.fiction-label{font-size:9px;line-height:1.8;letter-spacing:.055em;color:var(--paper-muted);margin-top:12px;max-width:290px}.demo-probes{padding:8px 36px}.demo-probes article{display:grid;grid-template-columns:24px 1fr;gap:18px;padding:26px 0;border-bottom:1px solid var(--line)}.demo-probes article:last-child{border-bottom:0}.probe-no{font-family:var(--serif);font-size:20px;color:var(--red)}.demo-probes h3{font-size:22px;margin-bottom:9px}.demo-probes p{font-size:14px;color:var(--paper-muted);line-height:1.75;margin-bottom:0}.atlas-caption{display:grid;grid-template-columns:.6fr 1.2fr auto;align-items:center;gap:30px;padding:24px 0;border-bottom:1px solid var(--line)}.atlas-caption>span{color:var(--red);font-size:10px;letter-spacing:.07em}.atlas-caption p{font-size:13px;line-height:1.7;color:var(--paper-muted);margin-bottom:0} -.work-section{background:var(--ink-deep);border-block:1px solid #34352f}.work-rows{border-top:1px solid var(--line)}.work-rows article{display:grid;grid-template-columns:.8fr 1.2fr .65fr;gap:36px;padding:30px 0;border-bottom:1px solid var(--line);align-items:start}.work-rows h3{font-size:25px;max-width:240px;margin-bottom:0}.work-rows p{font-size:14px;color:var(--paper-muted);line-height:1.8;margin:0;max-width:530px}.work-note{font-size:9px;line-height:1.7;color:var(--warm);letter-spacing:.045em;max-width:190px;padding-top:6px}.custody-note{display:grid;grid-template-columns:.65fr 1.15fr auto;gap:40px;align-items:start;padding-top:38px}.custody-note .eyebrow{color:var(--red);padding-top:5px}.custody-note>p:not(.eyebrow){font-size:14px;line-height:1.8;color:var(--paper-muted);margin-bottom:0}.custody-note .text-link{margin-top:1px;max-width:200px}code{font-family:var(--mono);font-size:.92em;color:var(--paper)} -.start-grid{display:grid;grid-template-columns:1.3fr .7fr;gap:clamp(45px,8vw,140px)}.start-grid>.prose{max-width:550px}.start-note{border-top:3px solid var(--red);padding-top:24px}.start-note .eyebrow{color:var(--red)}.start-note p:not(.eyebrow){color:var(--paper-muted);font-size:14px;line-height:1.8}.reading-room{border-top:1px solid var(--line);display:grid;grid-template-columns:1fr 1fr;gap:clamp(45px,8vw,140px);padding-block:64px 86px}.reading-room h2{font-size:clamp(36px,3.3vw,52px)}.doc-links{border-top:1px solid var(--line)}.doc-links>a{display:flex;justify-content:space-between;align-items:center;gap:25px;padding:17px 0;border-bottom:1px solid var(--line);font-size:17px;text-decoration:none}.doc-links>a>span:last-child{color:var(--red)}.doc-links small{display:block;font-size:12px;color:var(--paper-muted);font-weight:normal;margin-top:2px}.site-footer{border-top:1px solid var(--line);display:grid;grid-template-columns:1.35fr 1fr .7fr;gap:50px;padding-block:38px 42px;font-size:12px;line-height:1.7}.footer-brand{font-family:var(--serif);font-size:20px;letter-spacing:.04em;text-decoration:none}.site-footer p{font-size:11px;color:var(--paper-muted);margin-block:7px 0}.site-footer nav{display:flex;flex-direction:column;align-items:flex-start;gap:8px}.site-footer nav a{text-decoration:none}.site-footer .footer-end{font-family:var(--serif);font-size:18px;line-height:1.4;color:var(--paper);margin-top:0}.footer-end em{color:var(--red)} -/* Task guide. */ -.guide-hero{max-width:890px;padding-block:76px 52px;margin-left:0}.guide-hero h1{font-size:clamp(53px,6vw,84px)}.guide-hero .prose{font-size:20px;max-width:680px}.guide-jump{display:flex;flex-wrap:wrap;gap:12px 26px;border-block:1px solid var(--line);padding-block:17px;margin-bottom:64px;font-family:var(--mono);font-size:11px}.guide-jump a{text-decoration:none;padding-block:5px}.guide-layout{display:grid;grid-template-columns:minmax(0,1fr) 280px;gap:clamp(45px,7vw,115px);padding-bottom:80px}.guide-body{min-width:0}.guide-step{border-bottom:1px solid var(--line);padding-bottom:50px;margin-bottom:50px;scroll-margin-top:30px}.guide-step:last-child{margin-bottom:0}.guide-step .section-label{margin-bottom:18px}.guide-step h2{font-size:clamp(33px,3.2vw,45px);letter-spacing:-.04em}.guide-step>p,.guide-step>div>p{max-width:750px;color:var(--paper-muted);font-size:16px;line-height:1.8}.guide-step strong{color:var(--paper);font-weight:600}.guide-step a:not(.button){text-decoration-color:var(--red)}.guide-step .button{margin-bottom:20px}.guide-note{border-left:2px solid var(--red);padding:3px 0 3px 19px;margin-block:24px}.guide-step .guide-note{font-size:14px;color:var(--paper)}.guide-aside{padding-top:4px}.guide-aside section{border-top:1px solid var(--line);padding-top:22px;margin-bottom:30px}.guide-aside h2{font-size:26px;letter-spacing:-.03em}.guide-aside p{font-size:13px;color:var(--paper-muted);line-height:1.8}.guide-aside .text-link{font-size:12px}.code-block{border:1px solid var(--line);background:var(--ink-deep);margin:25px 0}.code-label{display:flex;justify-content:space-between;align-items:center;gap:15px;min-height:44px;border-bottom:1px solid var(--line);padding:7px 15px;color:var(--paper-muted);font-family:var(--mono);font-size:10px}.copy-button{border:1px solid var(--line);background:transparent;color:var(--paper);padding:7px 13px;cursor:pointer;font-family:var(--mono);font-size:10px;min-height:34px;flex-shrink:0}.copy-button:hover{background:var(--paper);color:var(--ink-deep)}.code-block pre{white-space:pre-wrap;overflow-wrap:anywhere;line-height:1.9;padding:21px;margin:0;font-size:13px}.copy-status{font-family:var(--mono);font-size:11px!important;min-height:1.7em;margin:0;color:var(--warm)!important;line-height:1.7!important}.prompt-text{padding:23px;margin:0;font-family:var(--serif);font-size:21px;line-height:1.65;color:var(--paper)}.tour-stops{counter-reset:tour}.tour-stop{padding:22px 0 3px 43px;position:relative;counter-increment:tour;border-top:1px solid var(--line)}.tour-stop:before{content:counter(tour,decimal-leading-zero);position:absolute;left:0;top:25px;font-family:var(--mono);font-size:11px;color:var(--red)}.tour-stop h3{font-size:24px}.tour-stop p{font-size:15px;color:var(--paper-muted);line-height:1.8}.guide-close{padding-block:0 60px;max-width:750px}.guide-close h2{font-size:38px}.guide-close p{color:var(--paper-muted)} -@media(min-width:1600px){.hero{gap:80px}.hero-art{margin-right:-12px}} -@media(max-width:1100px){.site-header{gap:20px}.site-header nav{gap:19px;font-size:12px}.hero{grid-template-columns:.9fr 1.1fr;gap:32px}.hero .actions{gap:16px}.hero .text-link{font-size:12px}.hero h1{font-size:clamp(45px,5.3vw,63px)}.hero-description{font-size:18px}.hero-art figcaption{display:block}.hero-art figcaption span{display:block;margin-top:5px}.work-rows article{grid-template-columns:.9fr 1.3fr;gap:28px}.work-note{grid-column:2;padding-top:0;margin-top:-15px}.custody-note{grid-template-columns:.75fr 1.4fr;gap:24px}.custody-note .text-link{grid-column:2;max-width:none;justify-self:start}.atlas-caption{grid-template-columns:1fr 2fr}.atlas-caption .text-link{grid-column:2;justify-self:start;margin-top:-12px}.guide-layout{grid-template-columns:minmax(0,1fr) 230px;gap:45px}.site-footer{grid-template-columns:1.2fr 1fr;gap:35px}.footer-end{grid-column:1 / -1}} -@media(max-width:800px){.site-header{min-height:120px;align-items:flex-start;flex-direction:column;justify-content:center;gap:12px;padding-block:22px}.site-header nav{width:100%;justify-content:space-between;gap:16px;font-size:12px}.site-header nav a{padding-block:7px}.wordmark{font-size:20px}.wordmark-sub{font-size:7px}.thread-mark{height:37px}.hero{grid-template-columns:1fr;padding-top:45px;padding-bottom:37px;gap:37px}.hero h1{font-size:clamp(53px,9.5vw,76px);line-height:1.02;max-width:700px}.wide-break{display:none}.hero-copy{max-width:620px}.hero-description{font-size:21px}.hero-detail{max-width:520px}.hero-art figcaption{display:flex}.hero-art figcaption span{margin-top:0}.eyebrow{font-size:10px}.edition-line{justify-content:flex-start;column-gap:26px;row-gap:9px;font-size:9px}.edition-line span{flex-basis:calc(50% - 13px)}.section-space{padding-block:64px}.section-label{margin-bottom:29px}.manifesto-body{grid-template-columns:1fr;gap:16px}.manifesto-body h2 br{display:none}.prose{max-width:none}.section-heading{grid-template-columns:1fr;gap:7px;margin-bottom:32px}.section-heading h2{margin-bottom:10px}.section-heading .prose{max-width:600px}.evidence-chain{grid-template-columns:1fr;gap:20px}.case-margin{display:flex;flex-wrap:wrap;gap:10px 25px;align-items:center;padding-top:0}.case-margin p{margin-bottom:0;font-size:11px}.case-margin .case-stamp{margin-bottom:0}.case-margin .text-link{display:block;margin-left:auto}.method-conclusion{margin:35px 0 0 65px;font-size:17px}.demo-brief{grid-template-columns:1fr;margin-top:30px}.demo-question{padding:28px 32px}.demo-question>p{max-width:590px;font-size:33px}.fiction-label{max-width:none;margin-top:0}.demo-probes{padding:2px 30px}.atlas-caption{gap:15px 25px}.work-rows article{grid-template-columns:1fr;gap:12px}.work-rows h3{max-width:none}.work-rows p{max-width:620px}.work-note{grid-column:auto;max-width:none;margin-top:0}.custody-note{grid-template-columns:1fr;gap:12px}.custody-note .eyebrow{margin-bottom:0}.custody-note .text-link{grid-column:auto;margin-top:0}.start-grid{grid-template-columns:1fr;gap:40px}.start-note{max-width:620px}.start-note p:not(.eyebrow){font-size:15px}.reading-room{grid-template-columns:1fr;gap:15px;padding-block:49px 56px}.reading-room h2{font-size:43px}.reading-room h2 br{display:none}.reading-room .section-label{margin-bottom:25px}.doc-links small{font-size:12px}.guide-hero{padding-block:52px 33px}.guide-jump{margin-bottom:38px}.guide-layout{grid-template-columns:1fr;gap:40px;padding-bottom:42px}.guide-aside{display:grid;grid-template-columns:1fr 1fr;gap:30px}.guide-aside section{margin-bottom:0}.guide-aside section:last-child{grid-column:1/-1}.guide-step{padding-bottom:37px;margin-bottom:37px}} -@media(max-width:480px){.site-header nav{flex-wrap:wrap;justify-content:flex-start;gap:4px 22px}.site-header nav .nav-source{margin-left:auto}.hero h1{font-size:52px}.hero-description{font-size:19px}.hero .actions{gap:15px 20px}.hero-art figcaption{gap:12px;font-size:9px}.hero-art figcaption span:first-child{font-size:9px}.fine-print{font-size:9px}.hero .eyebrow{font-size:8px;letter-spacing:.065em}.section-label{font-size:9px;gap:12px}h2{font-size:40px}.prose{font-size:16px}.prose .lead{font-size:22px}.record summary{grid-template-columns:27px 1fr 20px;gap:12px;padding-block:23px}.record-title{font-size:25px}.record-body{padding:0 8px 23px 40px;font-size:14px}.record-fact{font-size:21px}.record-title small{font-size:9px}.record-locator{font-size:8px}.method-conclusion{margin-left:40px;font-size:15px}.case-margin .text-link{margin-left:0}.demo-question{padding:26px}.demo-question>p{font-size:30px}.demo-probes{padding-inline:23px}.demo-probes article{grid-template-columns:18px 1fr;gap:12px}.demo-probes h3{font-size:23px}.atlas-caption{grid-template-columns:1fr}.atlas-caption .text-link{grid-column:auto;margin-top:0}.site-footer{grid-template-columns:1fr;gap:28px}.site-footer .footer-end{grid-column:auto}.guide-hero h1{font-size:52px}.guide-hero .prose{font-size:18px}.guide-aside{grid-template-columns:1fr;gap:30px}.guide-aside section:last-child{grid-column:auto}.code-block pre{padding:16px;font-size:12px}.code-label{font-size:9px}.tour-stop{padding-left:34px}.prompt-text{font-size:20px;padding:19px}} +/* RED THREADS: an open investigation file. No external assets or dependencies. */ +@font-face{font-family:'Bebas Neue';src:url('./fonts/BebasNeue-Regular.ttf') format('truetype');font-style:normal;font-weight:400;font-display:swap} +@font-face{font-family:'Barlow Condensed';src:url('./fonts/BarlowCondensed-SemiBold.ttf') format('truetype');font-style:normal;font-weight:600;font-display:swap} +:root{color-scheme:dark;--ink:#151716;--deep:#0e100f;--panel:#1c201e;--paper:#eee9dc;--muted:#b7bcb5;--line:#454b45;--red:#ff6257;--red-dark:#ad3028;--paper-line:#b6ad98;--sans:'Segoe UI',Arial,sans-serif;--display:'Bebas Neue',Impact,'Arial Narrow',sans-serif;--heading:'Barlow Condensed','Arial Narrow',Arial,sans-serif;--mono:Consolas,'Liberation Mono',monospace;--gutter:clamp(18px,4vw,64px);--max:1440px} +*{box-sizing:border-box}html{scroll-behavior:smooth;scroll-padding-top:24px}body{margin:0;background:var(--ink);color:var(--paper);font-family:var(--sans);font-size:16px;line-height:1.6;-webkit-font-smoothing:antialiased}a{color:inherit;text-underline-offset:4px;text-decoration-thickness:1px}a:hover{color:var(--red)}button{font:inherit}button,a{-webkit-tap-highlight-color:transparent}a:focus-visible,button:focus-visible{outline:3px solid var(--red);outline-offset:5px}::selection{background:var(--red);color:var(--deep)}[hidden]{display:none!important}img{display:block;max-width:100%;height:auto}h1,h2,h3,p,figure{margin:0 0 1em}h1,h2,h3{font-family:var(--heading);font-weight:600;line-height:1.03;letter-spacing:-.015em}h2{font-size:clamp(36px,4.2vw,64px)}h3{font-size:30px}h1 em,h2 em{font-style:normal;color:var(--red)}p{max-width:68ch}code,pre{font-family:var(--mono)}code{overflow-wrap:anywhere}.wrap{width:min(calc(100% - var(--gutter)*2),var(--max));margin-inline:auto}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}.skip-link{position:absolute;z-index:20;top:12px;left:18px;transform:translateY(-180%);padding:12px 20px;background:var(--paper);color:var(--ink)}.skip-link:focus{transform:none} +.site-header{min-height:86px;display:flex;align-items:center;justify-content:space-between;gap:28px;border-bottom:1px solid var(--line)}.wordmark{display:block;position:relative;padding-left:20px;font-family:var(--heading);font-weight:600;font-size:24px;line-height:1;letter-spacing:.035em;text-decoration:none;flex-shrink:0}.wordmark-sub{display:block;font:9px var(--mono);letter-spacing:.075em;margin-top:7px}.thread-mark{position:absolute;left:0;top:0;height:100%;width:4px;background:var(--red)}.site-header nav{display:flex;gap:clamp(16px,2.4vw,36px);flex-wrap:wrap;font:12px var(--mono)}.site-header nav a{display:flex;align-items:center;gap:8px;min-height:44px;text-decoration:none}.site-header nav a[aria-current=page]{box-shadow:inset 0 -2px var(--red)}.site-header nav a span{color:var(--red)} +.eyebrow,.issue-line,.product-subtitle,.download-note,.board-toolbar,.plot-heading,.map-legend,.plot-note,.inspector-heading,.record-index,.source-locator,.next-question>span,.lead-number,.cover-label,.case-cover figcaption,.requirements,.section-label,.fine-print{font-family:var(--mono);font-size:11px;line-height:1.6;letter-spacing:.04em}.eyebrow{color:var(--red);margin-bottom:14px}.issue-line{display:flex;justify-content:space-between;gap:18px;padding-block:21px;color:var(--muted)}.issue-line span:last-child{flex-shrink:0}.masthead{font-family:var(--display);font-size:clamp(60px,22.5vw,365px);font-weight:400;line-height:.83;letter-spacing:-.018em;word-spacing:.025em;overflow-wrap:anywhere;margin:8px 0 24px}.masthead span{color:var(--red)}.opening-deck{border-top:4px solid var(--paper);padding:24px 0 34px;display:grid;grid-template-columns:1.1fr 1fr;gap:50px}.product-subtitle{letter-spacing:.25em;color:var(--muted);margin-bottom:15px}.opening-deck h2{font-size:clamp(34px,3.5vw,54px);margin:0}.opening-copy{align-self:end}.opening-copy>p{font-size:16px;color:var(--muted);margin-bottom:15px;max-width:570px}.opening-copy>p:first-child{color:var(--paper);font-size:18px;font-weight:600;margin-bottom:5px}.button{display:inline-flex;justify-content:space-between;align-items:center;min-height:50px;padding:13px 21px;gap:35px;border:1px solid transparent;text-decoration:none;font-family:var(--mono);font-size:12px;line-height:1.5;font-weight:bold;transition:background .15s,color .15s}.button-red{background:var(--red);color:var(--deep)}.button-red:hover{background:var(--paper);color:var(--deep)}.button-red:focus-visible{outline-color:var(--paper)}.button>span{font-size:22px;font-weight:normal}.download-note{display:block;color:var(--muted);margin-top:9px;font-size:10px}.text-link{display:inline-block;min-height:40px;padding-block:8px;font-family:var(--mono);font-size:12px}.text-link span{margin-left:8px;color:var(--red)} +.case-section{padding-top:35px}.case-heading{display:flex;justify-content:space-between;align-items:end;gap:50px;margin-bottom:24px}.case-heading .eyebrow{margin-bottom:8px}.case-heading h2{font-size:clamp(35px,3.9vw,56px);margin:0}.case-heading h2 span{color:var(--muted)}.fiction-note{border-left:2px solid var(--red);padding-left:16px;max-width:280px;color:var(--muted);font-size:12px;margin:0 0 4px}.fiction-note strong{display:block;font-weight:600;color:var(--paper);margin-bottom:4px}.evidence-board{border:1px solid var(--line);background:var(--deep)}.board-toolbar{display:flex;justify-content:space-between;gap:15px;padding:13px 21px;border-bottom:1px solid var(--line);color:var(--muted)}.board-title{color:var(--paper)}.board-layout{display:grid;grid-template-columns:minmax(0,1fr) 370px}.network-panel{display:flex;flex-direction:column;min-width:0;padding:20px 16px 16px;background-image:radial-gradient(#41463d 1px,transparent 1px);background-size:24px 24px}.plot-heading{display:flex;justify-content:space-between;gap:20px;font-size:9px;color:var(--muted);padding:0 7px}.plot-heading span:last-child{max-width:190px;text-align:right}.evidence-map{display:block;width:100%;height:auto;margin:auto 0;overflow:visible}.map-edge>path{fill:none;stroke:#9ea69a;stroke-width:2;marker-end:url(#arrow-context)}.map-edge>text{fill:#bdc5b9;font:11px var(--mono);text-anchor:middle;paint-order:stroke;stroke:var(--deep);stroke-width:6px;stroke-linejoin:round}.map-edge>text.edge-caveat{font-size:9px}.map-node>rect{fill:#191e1a;stroke:#8c968a;stroke-width:1}.node-category{fill:#bbc3b5;font:10px var(--mono);letter-spacing:.07em}.node-name{fill:var(--paper);font:600 20px var(--heading)}.disputed-edge>path{stroke:#9ca794;stroke-dasharray:6 7;stroke-width:1.5}.disputed-node>rect{stroke-dasharray:5 4}.is-enhanced .map-edge.is-active>path{stroke:var(--red);stroke-width:3}.is-enhanced .map-edge.is-active>text{fill:var(--red);font-weight:bold}.is-enhanced .map-node.is-active>rect{stroke:var(--red);stroke-width:2}.is-enhanced .map-node.is-active .node-category{fill:var(--red)}.map-legend{display:flex;justify-content:center;gap:22px;flex-wrap:wrap;color:var(--muted);font-size:9px;margin:14px 0 8px}.map-legend span{display:flex;align-items:center;gap:8px}.legend-line{width:21px;border-top:2px solid #9ea69a;display:inline-block}.legend-line.dashed{border-top-style:dashed}.plot-note{text-align:center;margin:0 auto;color:var(--muted);font-size:9px;letter-spacing:0} +.record-inspector{color-scheme:light;background:var(--paper);color:var(--ink);border-left:1px solid var(--line);min-width:0}.inspector-heading{display:flex;justify-content:space-between;align-items:center;padding:12px 20px;background:#ddd6c5;border-bottom:1px solid var(--paper-line);font-size:10px}.inspector-heading>span:last-child{font-size:23px;line-height:1}.record-controls{display:grid;grid-template-columns:repeat(3,1fr);border-bottom:1px solid var(--paper-line);background:#e0d9c8}.record-controls button{border:0;border-right:1px solid var(--paper-line);background:transparent;color:var(--ink);padding:13px 8px 11px;text-align:left;font-size:11px;line-height:1.45;cursor:pointer;min-height:64px;position:relative}.record-controls button:last-child{border-right:0}.record-controls button>span{display:block;font:10px var(--mono);margin-bottom:3px}.record-controls button[aria-pressed=true]{background:var(--paper);font-weight:bold;box-shadow:inset 0 -4px var(--red-dark)}.record-controls button[aria-pressed=true]>span{color:var(--red-dark)}.record-controls button:hover{background:#f9f5e9}.record-controls button:focus-visible{outline:3px solid var(--red-dark);outline-offset:-4px}.record-content{padding:24px 23px 10px}.evidence-record{margin:0}.evidence-record+.evidence-record{border-top:3px solid var(--red-dark);padding-top:25px;margin-top:26px}.evidence-record[hidden]+.evidence-record{border:0;padding-top:0;margin-top:0}.record-index{color:#625947;font-size:9px;margin-bottom:13px}.evidence-record h3{font-size:36px;line-height:1.02;margin-bottom:20px}.evidence-record>p{font-size:13px;line-height:1.65}.record-route{display:flex;flex-direction:column;border-block:1px solid var(--paper-line);padding-block:13px;gap:4px}.record-route>span{font-size:12px}.record-route>strong{font-family:var(--heading);color:var(--red-dark);font-size:24px;line-height:1.15;font-weight:600}.evidence-record .source-locator{font-size:10px;color:#615847;margin-block:20px}.source-locator strong{display:block;color:var(--ink);font-size:9px;margin-bottom:5px}.next-question{padding-top:13px;border-top:1px solid var(--paper-line);font-weight:600}.next-question>span{display:block;color:var(--red-dark);font-size:9px;margin-bottom:5px}.board-footer{border-top:1px solid var(--line);display:flex;justify-content:space-between;align-items:center;gap:25px;padding:17px 22px;font-size:13px}.board-footer p{margin:0;color:var(--muted)}.board-footer strong{color:var(--paper)}.board-footer a{display:flex;align-items:center;gap:20px;min-height:38px;color:var(--red);font:12px var(--mono);flex-shrink:0}.board-footer a:hover{color:var(--paper)} +.atlas-invitation{display:grid;grid-template-columns:1fr 1.3fr;gap:70px;padding-block:60px}.atlas-invitation h2{font-size:clamp(36px,3.6vw,54px);margin-bottom:22px}.case-leads>a{display:grid;grid-template-columns:112px 1fr 20px;gap:18px;padding:22px 0;border-top:1px solid var(--line);text-decoration:none;color:var(--muted);font-size:13px;line-height:1.65}.case-leads>a:last-child{border-bottom:1px solid var(--line)}.case-leads strong{display:block;font:600 26px/1.15 var(--heading);color:var(--paper);margin-bottom:7px}.case-leads>a:hover strong,.case-leads>a:hover>span:last-child{color:var(--red)}.lead-number{color:var(--red);font-size:9px;padding-top:5px}.case-leads>a>span:last-child{font-size:21px;color:var(--paper)}.case-cover{margin-block:0 65px;background:var(--deep);border:1px solid var(--line)}.cover-label{display:flex;justify-content:space-between;gap:25px;padding:13px 18px;color:var(--muted);font-size:10px;border-bottom:1px solid var(--line)}.cover-label span:last-child{color:var(--red)}.case-cover img{width:100%}.case-cover figcaption{padding:12px 18px;color:var(--muted);margin:0;border-top:1px solid var(--line);font-size:10px}.get-section{display:grid;grid-template-columns:1fr 1fr;gap:90px;padding-bottom:65px}.get-intro h2{font-family:var(--display);font-weight:400;font-size:clamp(56px,6.2vw,94px);line-height:.98}.get-intro h2 span{color:var(--red)}.get-intro>p:not(.eyebrow){color:var(--muted);max-width:410px;margin-bottom:28px}.kit-contents{border-top:3px solid var(--paper);padding-top:19px}.kit-contents dl{margin:0}.kit-contents dl>div{display:grid;grid-template-columns:150px 1fr;gap:23px;padding-block:17px;border-bottom:1px solid var(--line)}.kit-contents dt{font-family:var(--heading);font-size:23px;line-height:1.12;font-weight:600}.kit-contents dd{font-size:13px;color:var(--muted);margin:0}.requirements{color:var(--muted);font-size:10px;margin:22px 0 12px;line-height:1.8}.reading-room{display:grid;grid-template-columns:1fr 1fr;gap:90px;border-block:1px solid var(--line);padding-block:40px;margin-bottom:0}.reading-room h2{font-size:44px}.doc-links a{display:flex;justify-content:space-between;gap:25px;padding:15px 0;text-decoration:none;border-bottom:1px solid var(--line);font-family:var(--heading);font-size:24px;line-height:1.2}.doc-links a:first-child{padding-top:0}.doc-links a:last-child{border-bottom:0;padding-bottom:0}.doc-links small{display:block;color:var(--muted);font:11px/1.6 var(--sans);margin-top:5px}.doc-links a>span:last-child{color:var(--red)}.site-footer{display:grid;grid-template-columns:1fr 1fr auto;gap:35px;padding-block:35px 45px}.footer-brand{font:400 36px/1 var(--display);text-decoration:none}.site-footer p{font:10px/1.7 var(--mono);color:var(--muted);margin:12px 0 0}.site-footer nav{display:grid;grid-template-columns:1fr 1fr;gap:8px 25px;font:11px/1.5 var(--mono);align-content:start}.site-footer nav a{min-height:32px}.site-footer .footer-end{font:600 23px/1.2 var(--heading);color:var(--paper);margin:0} +/* Field manual: the same instrument, with the reading column given priority. */ +.guide-hero{padding-block:45px 32px;border-bottom:4px solid var(--paper)}.guide-hero h1{font-family:var(--display);font-weight:400;font-size:clamp(54px,7vw,106px);line-height:.96;margin-bottom:22px}.guide-hero .prose{font-size:19px;color:var(--muted);max-width:650px;margin:0}.guide-jump{display:flex;flex-wrap:wrap;gap:14px 30px;padding-block:19px;border-bottom:1px solid var(--line);margin-bottom:45px;font:11px/1.6 var(--mono)}.guide-jump a{display:flex;align-items:center;min-height:36px;text-decoration:none}.guide-layout{display:grid;grid-template-columns:minmax(0,1fr) 260px;gap:75px;padding-bottom:25px}.guide-body{min-width:0;max-width:850px}.guide-step{border-bottom:1px solid var(--line);padding-bottom:38px;margin-bottom:40px;scroll-margin-top:24px}.section-label{color:var(--red);display:flex;gap:16px;margin-bottom:16px}.section-label>span{font-weight:bold}.guide-step h2{font-size:48px;margin-bottom:22px}.guide-step>p{font-size:16px;line-height:1.85;color:var(--muted);max-width:none}.guide-step strong{color:var(--paper);font-weight:600}.guide-step>p a{color:var(--paper)}.guide-step>p a:hover{color:var(--red)}.guide-step .button{margin-bottom:24px}.guide-note{border-left:3px solid var(--red);padding:13px 19px;background:var(--panel);font-size:14px!important}.guide-aside section{padding-top:17px;border-top:1px solid var(--line);margin-bottom:32px}.guide-aside h2{font-size:30px;line-height:1.1;margin-bottom:15px}.guide-aside p{font-size:13px;line-height:1.75;color:var(--muted)}.guide-aside .eyebrow{font-size:9px;color:var(--red)}.guide-aside .text-link{font-size:10px}.code-block{border:1px solid var(--line);background:var(--deep);margin:24px 0 8px}.code-label{display:flex;justify-content:space-between;align-items:center;gap:15px;padding:7px 15px;min-height:48px;border-bottom:1px solid var(--line);color:var(--muted);font:10px var(--mono)}.copy-button{border:1px solid #737a70;background:transparent;color:var(--paper);padding:8px 13px;cursor:pointer;font:11px var(--mono);min-height:38px;flex-shrink:0}.copy-button:hover{background:var(--paper);color:var(--ink)}.copy-button:disabled{opacity:.65;cursor:wait}.code-block pre{margin:0;padding:22px;white-space:pre-wrap;overflow-wrap:anywhere;font-size:13px;line-height:1.8}.copy-status{font:11px/1.7 var(--mono)!important;color:var(--muted)!important;min-height:1.7em;margin:0 0 15px}.prompt-text{padding:24px;margin:0;color:var(--paper);font-size:18px;line-height:1.65}.tour-stops{counter-reset:tour;margin-top:30px}.tour-stop{counter-increment:tour;position:relative;padding:22px 0 10px 40px;border-top:1px solid var(--line)}.tour-stop:before{content:counter(tour,decimal-leading-zero);position:absolute;left:0;top:25px;font:11px var(--mono);color:var(--red)}.tour-stop h3{font-size:30px;margin-bottom:12px}.tour-stop p{font-size:15px;line-height:1.8;color:var(--muted)}.guide-close{padding-bottom:45px;max-width:760px}.guide-close h2{font-size:52px;margin-bottom:24px}.guide-close>p{color:var(--muted)}.mobile-context{display:none} +@media(min-width:1001px){.guide-jump{position:sticky;top:0;z-index:5;background:var(--ink);margin-top:0}.guide-step{scroll-margin-top:92px}} +@media(max-width:1200px){.board-layout{grid-template-columns:minmax(0,1fr) 345px}.record-content{padding:22px 20px 10px}.network-panel{padding-inline:10px}.plot-heading{display:block}.plot-heading span{display:block}.plot-heading span:last-child{text-align:left;max-width:none;margin-top:5px}.atlas-invitation{gap:45px}.case-leads>a{grid-template-columns:1fr 20px;gap:6px 15px}.case-leads .lead-number{grid-column:1/-1}.get-section,.reading-room{gap:55px}.kit-contents dl>div{grid-template-columns:120px 1fr;gap:20px}.guide-layout{gap:45px}.site-footer{grid-template-columns:1fr 1fr}.site-footer .footer-end{grid-column:1/-1}} +@media(max-width:1000px){.board-layout{grid-template-columns:1fr}.network-panel{padding:22px;min-height:0}.evidence-map{max-width:820px;margin:12px auto}.plot-heading{display:flex}.plot-heading span:last-child{margin:0;text-align:right}.record-inspector{border-left:0;border-top:1px solid var(--line)}.record-controls button{padding:12px 18px;min-height:65px;font-size:13px}.record-controls button>span{display:inline-block;margin:0 10px 0 0}.record-content{padding:28px;min-height:0}.evidence-record{display:grid;grid-template-columns:1fr 1fr;gap:0 35px}.record-index,.evidence-record h3,.record-route{grid-column:1}.evidence-record .record-route{margin-bottom:0}.evidence-record>p:nth-of-type(3){grid-column:2;grid-row:1/3;align-self:end}.evidence-record>p:nth-of-type(4){grid-column:2;grid-row:3}.evidence-record .source-locator{grid-column:1;margin:20px 0 0}.evidence-record .next-question{grid-column:2;grid-row:4;align-self:end;margin-bottom:0}.evidence-record h3{font-size:40px}.board-footer{flex-wrap:wrap;gap:8px}.opening-deck{gap:30px}.atlas-invitation{grid-template-columns:1fr 1.2fr;gap:40px}.kit-contents dl>div{grid-template-columns:1fr;gap:8px}.guide-layout{grid-template-columns:minmax(0,1fr) 220px;gap:35px}} +@media(max-width:720px){.site-header{align-items:flex-start;flex-direction:column;gap:12px;padding-block:22px}.site-header nav{width:100%;justify-content:space-between;gap:8px 16px;font-size:11px}.site-header nav a{min-height:35px}.issue-line{font-size:8px;letter-spacing:0;padding-block:18px}.issue-line span:first-child{max-width:210px}.masthead{margin-top:8px;margin-bottom:18px}.opening-deck{grid-template-columns:1fr;gap:23px;padding-top:20px}.opening-deck h2{font-size:42px}.product-subtitle{font-size:9px;letter-spacing:.18em}.opening-copy>p{font-size:15px}.opening-copy>p:first-child{font-size:16px}.case-section{padding-top:18px}.case-heading{display:block;margin-bottom:20px}.case-heading h2{font-size:42px}.fiction-note{margin-top:20px;max-width:420px;font-size:11px}.board-toolbar{font-size:9px;padding:12px 15px;flex-wrap:wrap;gap:4px 20px}.board-layout{display:flex;flex-direction:column}.network-panel{order:2;border-top:1px solid var(--line);padding:16px}.record-inspector{border-top:0}.plot-heading{display:block;font-size:9px}.plot-heading span:last-child{display:none}.evidence-map{display:none}.map-legend{justify-content:flex-start;margin-top:18px}.plot-note{text-align:left;margin-left:0}.network-panel .mobile-context{display:block;font:12px/1.8 var(--mono);color:var(--muted);border-left:2px dashed #9ca794;padding-left:12px}.mobile-context strong{display:block;color:var(--paper);margin-bottom:5px}.network-panel .plot-heading,.network-panel .map-legend,.network-panel .plot-note{display:none}.record-inspector .record-content{padding:24px 20px}.evidence-record{display:block}.evidence-record h3{font-size:38px}.evidence-record>p{font-size:14px}.evidence-record .record-route{margin-bottom:18px;border-left:3px solid var(--red-dark);padding-left:13px}.evidence-record .source-locator{font-size:10px;margin:20px 0}.evidence-record .next-question{margin-bottom:8px}.record-controls button{font-size:11px;padding:12px 9px}.record-controls button>span{display:block;margin-bottom:3px}.board-footer{padding:16px;font-size:12px;gap:8px}.board-footer a{font-size:11px}.atlas-invitation,.get-section,.reading-room{grid-template-columns:1fr;gap:28px;padding-block:40px}.atlas-invitation h2{font-size:42px;margin-bottom:12px}.case-leads>a{padding-block:18px}.case-cover{margin-bottom:0}.cover-label{font-size:8px;padding:11px 13px}.case-cover figcaption{font-size:9px;padding:11px 13px}.get-intro h2{font-size:68px}.kit-contents dl>div{grid-template-columns:140px 1fr}.reading-room h2{font-size:42px;margin-bottom:0}.site-footer{gap:30px;padding-block:30px}.site-footer nav{grid-template-columns:1fr;gap:6px}.site-footer .footer-end{font-size:24px}.guide-hero{padding-top:35px}.guide-hero h1{font-size:68px}.guide-hero .prose{font-size:17px}.guide-jump{gap:10px 25px;margin-bottom:30px}.guide-layout{grid-template-columns:1fr;gap:0}.guide-step h2{font-size:42px}.guide-step>p{font-size:15px}.guide-aside{display:grid;grid-template-columns:1fr 1fr;gap:22px}.guide-aside section{margin-bottom:20px}.guide-aside section:last-child{grid-column:1/-1}.guide-close h2{font-size:46px}} +@media(max-width:400px){.site-header nav{font-size:10px;gap:6px 13px}.issue-line{font-size:7px}.opening-deck h2,.case-heading h2{font-size:38px}.kit-contents dl>div{grid-template-columns:1fr}.get-intro h2{font-size:59px}.site-footer,.guide-aside{grid-template-columns:1fr}.guide-aside section:last-child{grid-column:auto}.guide-hero h1{font-size:58px}.code-label{flex-wrap:wrap;font-size:9px}.code-block pre{font-size:12px;padding:16px}.prompt-text{padding:18px;font-size:16px}.guide-jump{display:grid;grid-template-columns:1fr 1fr;font-size:10px}} @media(prefers-reduced-motion:reduce){html{scroll-behavior:auto}*,*:before,*:after{transition:none!important;animation:none!important}} -@media(forced-colors:active){.button,.thread-mark,.case-stamp{border:1px solid ButtonText}.thread-mark:before,.thread-mark:after{border-color:CanvasText}.detail-sign:before,.detail-sign:after{background:CanvasText}.record-fact strong{color:CanvasText}a:focus-visible,button:focus-visible,summary:focus-visible{outline-color:Highlight}} -@media print{body{background:#fff;color:#111}.site-header,.site-footer,.skip-link,.actions,.guide-jump,.copy-button{display:none!important}.wrap{width:100%}.hero,.section-heading,.manifesto-body,.start-grid,.reading-room,.guide-layout{display:block}.hero-art{max-width:600px}.section-space{padding-block:25px}.prose,.hero-detail,.fine-print,.guide-step>p{color:#333}.method-section,.work-section,.demo-question,.code-block{background:white;color:#111}.guide-aside{display:none}h1,h2,h3{break-after:avoid}figure,article,.record{break-inside:avoid}a{color:#111}code{color:#111}} -/* Keep interactive text and focus distinct on the light evidence surface. */ -.method-section a:hover{color:var(--red-deep)} -.method-section a:focus-visible,.method-section summary:focus-visible{outline-color:var(--red-deep)} -.copy-button:disabled{opacity:.65;cursor:wait} -@media(forced-colors:active){.method-section a:focus-visible,.method-section summary:focus-visible{outline-color:Highlight}} \ No newline at end of file +@media(forced-colors:active){.button,.record-controls button,.record-route{border:1px solid ButtonText}.record-controls button[aria-pressed=true]{border-bottom:4px solid Highlight}.map-node>rect{fill:Canvas;stroke:CanvasText}.map-node text,.map-edge>text{fill:CanvasText;stroke:none}.map-edge>path{stroke:CanvasText}.is-enhanced .map-edge.is-active>path,.is-enhanced .map-node.is-active>rect{stroke:Highlight}.is-enhanced .map-edge.is-active>text,.is-enhanced .map-node.is-active .node-category{fill:Highlight}.legend-line{border-color:CanvasText}a:focus-visible,button:focus-visible,.record-controls button:focus-visible{outline-color:Highlight}} +@media print{body{background:#fff;color:#111}.site-header,.site-footer,.skip-link,.record-controls,.guide-jump,.guide-index,.copy-button,.button{display:none!important}.wrap{width:100%}.masthead{font-size:80px}.opening-deck,.board-layout,.atlas-invitation,.get-section,.reading-room,.guide-layout{display:block}.network-panel{display:none}.record-inspector{background:white;color:black}.evidence-record[hidden]{display:block!important}.evidence-record{display:block;break-inside:avoid;padding-top:22px!important;border-top:1px solid #777!important}.record-inspector .record-content{padding:0}.case-cover{max-width:600px}.guide-aside{display:none}.guide-step>p,.opening-copy>p,.kit-contents dd,.requirements,.guide-close p,.fiction-note{color:#333}.code-block,.guide-note{background:#fff;color:#111}.guide-step strong,.prompt-text{color:#111}h1,h2,h3{break-after:avoid}a{color:#111!important}} diff --git a/docs/guide.html b/docs/guide.html index c1dbae1..1b7e02a 100644 --- a/docs/guide.html +++ b/docs/guide.html @@ -1,19 +1,19 @@ - + Your first case — RED THREADS - + - +
-

FIELD GUIDE / FIRST CASE / v0.1.0

Start with a thread.
Keep the receipts.

Explore the fictional Meridian investigation, see what makes a connection meaningful, and create an atlas you can keep.

+

RED THREADS / FIELD MANUAL 01 / v0.1.0

Start with a thread.
Keep the receipts.

Explore the fictional Meridian investigation, see what makes a connection meaningful, and create an atlas you can keep.

Four things to inspect.

The Meridian File asks who can influence a proposed compute-licensing rule—and what would distinguish patron direction from coordinated or independent agreement. Every actor, amount, document, and quotation is invented teaching material.

Open the fictional atlas

Use your browser’s Back action to return to this guide, or open the atlas in a separate tab using your browser’s link menu.

@@ -38,6 +38,6 @@

The next record
should change something.

A useful investigation leaves you with the best supported mechanism, a serious rival, and the observation that would change your mind.

Open the complete documentation
- + \ No newline at end of file diff --git a/docs/index.html b/docs/index.html index aa2d9a6..bb427d5 100644 --- a/docs/index.html +++ b/docs/index.html @@ -3,7 +3,7 @@ - + RED THREADS — Follow the evidence. Find the mechanism. @@ -22,7 +22,9 @@ + + @@ -31,70 +33,86 @@
-
-
-

FOLLOW THE MONEY. QUESTION THE LINE.

-

Pull the thread.
Find the
mechanism.

-

Investigative craft for your AI.
A portable case for you.

-

Turn a hunch, a document, or an institutional hairball into an investigation you can explore, challenge, and pick up again.

- -

v0.1.0 · Complete skill ZIP · Your AI host supplies the model

-
-
RED THREADS — Conspiracy Unraveler. A magnifying glass reveals a network of red connections linking institutions on a dark map.
LOOK CLOSER.Connections are the beginning of the inquiry.
-
-
ONE SELF-CONTAINED AI SKILLPORTABLE EVIDENCEOFFLINE ATLASFREE · 0.1.0
-
- -

Who can make
what happen?

Money moves. People change roles. A briefing becomes a headline becomes “everybody knows.”

RED THREADS follows resources into activities, access, persuasion, and actual decision rights. It keeps the verbs precise: funded, appointed, distributed, approved. A line needs a mechanism, a date, and a source.

Your intuition gets a seat at the table. So does the explanation that could prove it wrong.

+
+
COLLABORATIVE DYNAMICS / INVESTIGATIVE AI AUGMENTFREE / VOL. 0.1.0
+

RED THREADS

+

CONSPIRACY UNRAVELER

Follow the money.
Find the mechanism.

Power has a paper trail. Sometimes it has a missing page.

Give your AI the craft to investigate money, influence, and hidden ties—with a case you can explore, challenge, and keep.

Get RED THREADS Free skill ZIP · Your host supplies the AI
-
-
- -

A grant is a fact.
Control is a question.

In the fictional Meridian case, one foundation funds a policy institute. Look at what each record actually adds. Open the documents below.

-
-
THE MERIDIAN FILE

Fictional teaching case
All records and actors are invented.

Inspect the full case
-
-
01The award noticeFunding

Cobalt Foundation → awarded a research grant to → Meridian Institute

The $1.8m award establishes funding. The $900,000 first installment belongs to that award; adding them would count the same money twice. The notice establishes no editorial command.

BASIS: FICTIONAL AWARD AND REMITTANCE RECORDS

-
02The signed agreementA specific right

Cobalt Foundation → holds approval rights over → the funded policy brief

Section 4 grants review and revision rights for this deliverable. That is a real, bounded mechanism. It does not give Cobalt general authority over Meridian or the separate company Astera AI.

BASIS: FICTIONAL AGREEMENT, SECTION 4

-
03The revision registerThe right in use

Leo Venn, Cobalt’s liaison → requested in-scope revisions to → the funded brief

Record R-07 shows the limited approval right being exercised. Now the case has an observed action to investigate. Whether a wider campaign was directed remains a separate question requiring its own evidence.

BASIS: FICTIONAL REVISION REGISTER, R-07

+
+

OPEN FILE / THE MERIDIAN CASE

The money is real.
What does it buy?

A fictional teaching case. Every actor, amount, and record here is invented. The distinctions are the point.

+
+
TRACE THE MECHANISM3 RECORDS / 3 DIFFERENT CLAIMS
+
+
+
RELATIONSHIP MAPSELECT A RECORD TO FOLLOW ITS THREAD
+ + Funding, approval, and an exercised right + Cobalt Foundation awarded a grant to Meridian Institute and holds approval rights over the funded Licensing policy brief. Leo Venn requested in-scope revisions to that brief. The separate allegation that Cobalt directed Astera AI is disputed: no orders are supplied. Read the record inspector for sources and scope. + + RESEARCH GRANT + APPROVAL RIGHT + REVISION REQUEST + ALLEGED DIRECTIONDISPUTED · NO ORDER SUPPLIED + FUNDERCobalt Foundation + POLICY INSTITUTEMeridian Institute + FUNDED DELIVERABLELicensing policybrief + PROGRAM LIAISONLeo Venn + SEPARATE COMPANYAstera AI + +
Documented relationshipDisputed allegation
+

Position is a reading aid. A line earns its meaning from the record.

+
The wider claim / disputed

Cobalt Foundation → allegedly directed the licensing campaign of → Astera AI

No orders are supplied. The allegation traces back to the grant notice about Meridian.

+
+
+
EXAMINE THE RECORD
+ +
+
+

01 / AWARD NOTICE / 10 JAN 2025

$1.8 million.
One funding relationship.

+

Cobalt Foundationawarded a research grant toMeridian Institute

+

The notice establishes a two-year research award. It supplies no editorial orders.

The $900,000 first installment is part of that award. Add them together and you have invented $900,000.

+

SOURCE / s-awardFictional grant announcement, paragraph 2. Installment: agreement, remittance appendix B.

+

THE NEXT QUESTIONDoes the agreement give the funder any decision rights?

+
+
+

02 / SIGNED AGREEMENT / 15 JAN 2025

A right to approve.
A boundary around it.

+

Cobalt Foundationholds approval rights overLicensing policy brief

+

Section 4 requires liaison approval for the funded brief. The contract establishes a specific mechanism: review and revision of this deliverable.

It grants no general authority over Meridian or the separate company Astera AI.

+

SOURCE / s-agreementFictional signed grant agreement, section 4. Teaching paraphrase; limited to the research scope.

+

THE NEXT QUESTIONWas that approval right ever exercised?

+
+
+

03 / REVISION REGISTER / 02 JUL 2025

Now there’s
an action to trace.

+

Leo Venn, program liaisonrequested in-scope revisions toLicensing policy brief

+

Record R-07 asks for clarification of the audit-threshold section before approval. The limited right was used.

That supports influence over this brief. A claim about directing Astera’s wider campaign still needs its own evidence.

+

SOURCE / s-revisionsFictional revision register, R-07, read with agreement section 4. Teaching paraphrase.

+

THE NEXT QUESTIONWhat record would establish a route to Astera?

+
+
+

-

Funding. Alignment. Coordination. Control.
Different claims. Different evidence.

+
-
- -

Meet the case.
Then interrogate it.

The offline atlas links the network to its timeline, sources, rival hypotheses, next leads, and actor strategies. This demo is generated by the shipped renderer from the included fictional case.

Explore the Meridian atlas

Opens the real atlas · No installation needed to explore

-
YOUR QUESTION

Is one patron directing the campaign—or are different actors arriving at the same position?

EVERY PERSON, ORGANIZATION, AND SOURCE IN THIS DEMO IS FICTIONAL.
-
I.

Three headlines. One origin.

Trace the direction allegation through Sentinel, Ledger, and Streamcast. Separate URLs do not create independent corroboration.

-
II.

The calendar has an objection.

Astera’s June endorsement precedes the July briefing packet. What earlier record would be needed to explain the initial agreement?

-
III.

Remove the patron. Look again.

Inspect the advisory route that remains. Removing a node tests the supplied graph’s connectivity; it cannot establish real-world independence.

-
-
A MAP YOU CAN QUESTION

Open a relationship and inspect its basis. Compare a time slice or rival explanation. Save the view you want to return to.

Follow the guided tour
-
-
- -

Follow the strongest lead.
Keep the case intact.

Research, intuition, rival explanations, and game theory share one case. The AI investigates with the tools your host provides. The bundled Python tools preserve and display the work.

-
-

Look for the mechanism

Trace grants, contracts, roles, resource dependencies, access, and decision rights. Keep an institution’s different actors and powers distinguishable.

PRECISE VERBS + DATES + SOURCES
-

Give rivals a real chance

Work inside a hunch while keeping its assumptions attached. Compare explanations that predict different observations, then choose the record that could separate them.

HYPOTHESES + DISCRIMINATING LEADS
-

Ask who can credibly act

Examine objectives, constraints, outside options, and responses. A dependency becomes strategic leverage only when the ability to withhold or redirect is established.

ACTOR GAMES + EXPLICIT ASSUMPTIONS
-

Let corrections travel

Trace a changed source through declared dependencies. Review the affected relationships, hypotheses, and strategies; preserve independent support and save a new revision.

SOURCE ANCESTRY + REVIEW FRONTIER
-
-

THE CASE STAYS PORTABLE

case.json holds the investigation. The HTML atlas and CSV exports are views of it. Store the case where you choose, preserve the evidence, and resume from what remains unresolved.

Working with your own records
-
-
- -

Bring a question.
Leave with a next move.

Download the complete skill, install it through your AI host’s supported skill route, and begin with the fictional case. Python 3.10+ is needed for the supplied case tools and atlas; conversational investigation can continue without it.

+
+

THERE’S MORE IN THE FILE

The map is where
the questions start.

Take the four-stop field tour
+
-
-

Keep the useful
instructions close.

- +
RED THREADS / CONSPIRACY UNRAVELERLOOK CLOSER.
RED THREADS — Conspiracy Unraveler. A magnifying glass reveals a network of red connections linking institutions on a dark map.
Connections are the beginning of the inquiry.
+
+

YOUR FIRST THREAD

Bring a hunch.
Keep the receipts.

Research, intuition, rival explanations, and game theory—working inside one portable investigation.

Download free · v0.1.0
+

INSIDE THE COMPLETE SKILL ZIP

Investigative craft
One self-contained AI skill with references for mechanisms, source ancestry, rival hypotheses, and strategy.
A case you can carry
A worked fictional investigation, local Python tools, an offline HTML atlas, and CSV exports.
A place to pick up again
Your case.json holds the evidence. Save revisions, inspect corrections, and return to the strongest unresolved lead.

Your host supplies the AI, browsing, and source access. Python 3.10+ runs the bundled case tools. The renderer displays the case; it performs no research.

Install it. Open your first case.
+

THE FIELD MANUAL

Less guessing.
More investigating.

- + - \ No newline at end of file + diff --git a/tools/test_evidence_board.cjs b/tools/test_evidence_board.cjs new file mode 100644 index 0000000..1465998 --- /dev/null +++ b/tools/test_evidence_board.cjs @@ -0,0 +1,426 @@ +'use strict'; + +const assert = require('node:assert/strict'); +const fs = require('node:fs'); +const path = require('node:path'); +const vm = require('node:vm'); +const { execFileSync } = require('node:child_process'); +const { test } = require('node:test'); +const scriptPath = path.join(__dirname, '../docs/assets/evidence-board.js'); +const { getRecord, initEvidenceBoard } = require(scriptPath); + +// A deliberately small DOM fixture, not a browser or a keyboard emulator. +// It implements the DOM operations used by the shipped enhancement itself. +class Element { + constructor(tagName, attributes = {}, children = []) { + this.tagName = tagName.toUpperCase(); + this.attributes = { ...attributes }; + this.children = children; + this.listeners = new Map(); + this.textContent = ''; + const classes = new Set((attributes.class || '').split(/\s+/).filter(Boolean)); + this.classList = { + add: (value) => classes.add(value), + contains: (value) => classes.has(value), + toggle(value, force) { + const enabled = force === undefined ? !classes.has(value) : force; + if (enabled) classes.add(value); + else classes.delete(value); + return enabled; + } + }; + } + get id() { return this.getAttribute('id') || ''; } + get hidden() { return this.getAttribute('hidden') !== null; } + set hidden(value) { + if (value) this.setAttribute('hidden', ''); + else delete this.attributes.hidden; + } + getAttribute(name) { return Object.hasOwn(this.attributes, name) ? this.attributes[name] : null; } + setAttribute(name, value) { this.attributes[name] = String(value); } + contains(element) { return this === element || this.children.some((child) => child.contains(element)); } + querySelectorAll(selector) { + let matches; + if (selector.startsWith('#')) matches = (element) => element.id === selector.slice(1); + else { + const attribute = selector.match(/^\[([\w-]+)(?:="([^"]*)")?\]$/); + assert.ok(attribute, 'The fixture needs an explicit implementation for selector ' + selector); + matches = (element) => element.getAttribute(attribute[1]) !== null && + (attribute[2] === undefined || element.getAttribute(attribute[1]) === attribute[2]); + } + const found = []; + const visit = (element) => element.children.forEach((child) => { + if (matches(child)) found.push(child); + visit(child); + }); + visit(this); + return found; + } + addEventListener(type, listener, options) { + if (!this.listeners.has(type)) this.listeners.set(type, []); + this.listeners.get(type).push({ listener, options }); + } + dispatch(type) { + for (const handler of [...(this.listeners.get(type) || [])]) { + handler.listener({ type, target: this, currentTarget: this }); + if (handler.options && handler.options.once) { + this.listeners.set(type, this.listeners.get(type).filter((item) => item !== handler)); + } + } + } + focus() { throw new Error('The enhancement must not move focus.'); } +} + +function fixture() { + const buttons = Object.fromEntries(['award', 'agreement', 'revision'].map((id) => [id, + new Element('button', { type: 'button', 'data-select-record': id, 'aria-controls': 'record-' + id }) + ])); + const articles = Object.fromEntries(['award', 'agreement', 'revision'].map((id) => [id, + new Element('article', { id: 'record-' + id, 'data-record': id }) + ])); + for (const [id, article] of Object.entries(articles)) article.textContent = 'Full readable ' + id + ' evidence.'; + const controls = new Element('div', { hidden: '', 'data-record-controls': '' }, Object.values(buttons)); + const announcement = new Element('p', { 'data-record-announcement': '', role: 'status', 'aria-live': 'polite' }); + const edges = Object.fromEntries(['e-grant', 'e-approval', 'e-leo-revisions', 'e-direction'].map((id) => [id, + new Element('g', { 'data-edge': id }, [new Element('path'), new Element('text')]) + ])); + const nodes = Object.fromEntries(['cobalt', 'meridian', 'leo', 'brief', 'astera'].map((id) => [id, + new Element('g', { 'data-node': id }, [new Element('rect'), new Element('text')]) + ])); + const svg = new Element('svg', {}, [...Object.values(edges), ...Object.values(nodes)]); + const board = new Element('section', { id: 'evidence-board' }, [controls, svg, ...Object.values(articles), announcement]); + const document = new Element('document', {}, [board]); + document.readyState = 'complete'; + document.activeElement = new Element('a'); + return { document, board, controls, announcement, buttons, articles, edges, nodes, svg }; +} + +function activeIds(elements) { + return Object.entries(elements).filter(([, element]) => element.classList.contains('is-active')).map(([id]) => id); +} +function assertReadableFallback(view) { + assert.equal(view.controls.hidden, true); + assert.equal(view.board.classList.contains('is-enhanced'), false); + for (const article of Object.values(view.articles)) { + assert.equal(article.hidden, false); + assert.match(article.textContent, /^Full readable /); + } + for (const button of Object.values(view.buttons)) { + assert.equal(button.getAttribute('aria-pressed'), null); + assert.equal(button.listeners.size, 0); + } + assert.equal(view.announcement.textContent, ''); + assert.deepEqual(activeIds(view.edges), []); + assert.deepEqual(activeIds(view.nodes), []); +} +function assertDiagramStillPresent(view) { + for (const element of [...Object.values(view.edges), ...Object.values(view.nodes)]) { + assert.equal(element.hidden, false); + assert.equal(element.getAttribute('aria-hidden'), null); + } + assert.equal(view.edges['e-direction'].classList.contains('is-active'), false); + assert.equal(view.nodes.astera.classList.contains('is-active'), false); +} + +test('the record model preserves specific relationships and rejects unrecognized IDs', () => { + assert.deepEqual(getRecord('award').nodes, ['cobalt', 'meridian']); + assert.equal(getRecord('agreement').edge, 'e-approval'); + assert.deepEqual(getRecord('revision').nodes, ['leo', 'brief']); + for (const id of ['', 'other', '__proto__', 'constructor', null, undefined, 1, {}]) { + assert.equal(getRecord(id), null); + } + assert.throws(() => { getRecord('award').nodes.push('astera'); }, TypeError); + assert.throws(() => { getRecord('agreement').edge = 'e-direction'; }, TypeError); +}); + +test('the fallback is readable and initialization selects the award without announcing or moving focus', () => { + const view = fixture(); + assertReadableFallback(view); + const previousFocus = view.document.activeElement; + const controller = initEvidenceBoard(view.document); + assert.equal(controller.selectedId, 'award'); + assert.equal(view.controls.hidden, false); + assert.equal(view.board.classList.contains('is-enhanced'), true); + assert.equal(view.articles.award.hidden, false); + assert.equal(view.articles.agreement.hidden, true); + assert.equal(view.articles.revision.hidden, true); + assert.equal(view.buttons.award.getAttribute('aria-pressed'), 'true'); + assert.equal(view.buttons.agreement.getAttribute('aria-pressed'), 'false'); + assert.equal(view.buttons.revision.getAttribute('aria-pressed'), 'false'); + assert.deepEqual(activeIds(view.edges), ['e-grant']); + assert.deepEqual(activeIds(view.nodes), ['cobalt', 'meridian']); + assert.equal(view.announcement.textContent, ''); + assert.equal(view.document.activeElement, previousFocus); + assertDiagramStillPresent(view); +}); + +test('native button clicks select the relation and its actual endpoints, preserving context and focus', () => { + const view = fixture(); + const controller = initEvidenceBoard(view.document); + for (const button of Object.values(view.buttons)) { + assert.equal(button.tagName, 'BUTTON'); + assert.equal(button.getAttribute('type'), 'button'); + assert.deepEqual([...button.listeners.keys()], ['click']); + } + view.document.activeElement = view.buttons.agreement; + view.buttons.agreement.dispatch('click'); + assert.equal(controller.selectedId, 'agreement'); + assert.equal(view.articles.award.hidden, true); + assert.equal(view.articles.agreement.hidden, false); + assert.equal(view.articles.revision.hidden, true); + assert.equal(view.buttons.award.getAttribute('aria-pressed'), 'false'); + assert.equal(view.buttons.agreement.getAttribute('aria-pressed'), 'true'); + assert.deepEqual(activeIds(view.edges), ['e-approval']); + assert.deepEqual(activeIds(view.nodes), ['cobalt', 'brief']); + assert.equal(view.announcement.textContent, + 'The signed agreement: Cobalt Foundation holds approval rights over the funded policy brief.'); + assert.equal(view.document.activeElement, view.buttons.agreement); + assertDiagramStillPresent(view); + + view.document.activeElement = view.buttons.revision; + view.buttons.revision.dispatch('click'); + assert.equal(controller.selectedId, 'revision'); + assert.equal(view.articles.agreement.hidden, true); + assert.equal(view.articles.revision.hidden, false); + assert.equal(view.buttons.agreement.getAttribute('aria-pressed'), 'false'); + assert.equal(view.buttons.revision.getAttribute('aria-pressed'), 'true'); + assert.deepEqual(activeIds(view.edges), ['e-leo-revisions']); + assert.deepEqual(activeIds(view.nodes), ['leo', 'brief']); + assert.equal(view.announcement.textContent, + 'The revision register: Leo Venn requested in-scope revisions to the funded policy brief.'); + assert.equal(view.document.activeElement, view.buttons.revision); + assertDiagramStillPresent(view); + + view.buttons.award.dispatch('click'); + assert.equal(controller.selectedId, 'award'); + assert.equal(view.articles.award.hidden, false); + assert.equal(view.articles.revision.hidden, true); + assert.deepEqual(activeIds(view.edges), ['e-grant']); + assert.deepEqual(activeIds(view.nodes), ['cobalt', 'meridian']); + assert.equal(view.announcement.textContent, + 'The award notice: Cobalt Foundation awarded a research grant to Meridian Institute.'); +}); + +test('invalid or unchanged selections do not alter state or produce a new announcement', () => { + const view = fixture(); + const controller = initEvidenceBoard(view.document); + view.buttons.award.dispatch('click'); + assert.equal(view.announcement.textContent, ''); + for (const id of ['invalid', '__proto__', null, undefined]) { + assert.equal(controller.select(id), false); + } + assert.equal(controller.selectedId, 'award'); + assert.equal(view.articles.award.hidden, false); + assert.deepEqual(activeIds(view.edges), ['e-grant']); + assert.equal(view.announcement.textContent, ''); + assert.equal(controller.select('revision'), true); + assert.equal(controller.selectedId, 'revision'); + assert.equal(view.announcement.textContent, '', 'Programmatic changes stay quiet.'); +}); + +test('reinitializing a board reuses its controller and does not reset selection or duplicate handlers', () => { + const view = fixture(); + const original = initEvidenceBoard(view.document); + view.buttons.revision.dispatch('click'); + assert.equal(initEvidenceBoard(view.document), original); + assert.equal(original.selectedId, 'revision'); + for (const button of Object.values(view.buttons)) assert.equal(button.listeners.get('click').length, 1); +}); + +test('every missing required part preserves the unmodified readable fallback', () => { + const missingParts = [ + '[data-record-controls]', '[data-record-announcement]', + ...['award', 'agreement', 'revision'].map((id) => '[data-record="' + id + '"]'), + ...['award', 'agreement', 'revision'].map((id) => '[data-select-record="' + id + '"]'), + ...['e-grant', 'e-approval', 'e-leo-revisions', 'e-direction'].map((id) => '[data-edge="' + id + '"]'), + ...['cobalt', 'meridian', 'leo', 'brief', 'astera'].map((id) => '[data-node="' + id + '"]') + ]; + for (const selector of missingParts) { + const view = fixture(); + const target = view.board.querySelectorAll(selector)[0]; + const remove = (element) => { + element.children = element.children.filter((child) => child !== target); + element.children.forEach(remove); + }; + remove(view.board); + assert.equal(initEvidenceBoard(view.document), null, selector); + assertReadableFallback(view); + } + assert.equal(initEvidenceBoard(null), null); + assert.equal(initEvidenceBoard({}), null); + assert.equal(initEvidenceBoard(new Element('document')), null); +}); + +test('ambiguous markup, incorrect panel links, and an announcement inside a panel fail before mutation', () => { + const mutations = [ + (view) => view.buttons.award.setAttribute('aria-controls', 'record-revision'), + (view) => view.articles.award.setAttribute('id', 'wrong-panel'), + (view) => { view.buttons.agreement.tagName = 'A'; }, + (view) => view.announcement.setAttribute('aria-live', 'assertive'), + (view) => view.board.children.push(new Element('g', { 'data-node': 'leo' })), + (view) => view.controls.children.push(new Element('button', { 'data-select-record': 'unexpected' })), + (view) => view.board.children.push(new Element('article', { 'data-record': 'unexpected' })), + (view) => { + view.board.children = view.board.children.filter((child) => child !== view.announcement); + view.articles.award.children.push(view.announcement); + } + ]; + for (const mutate of mutations) { + const view = fixture(); + mutate(view); + assert.equal(initEvidenceBoard(view.document), null); + assertReadableFallback(view); + } +}); + +test('the standalone script initializes after DOM readiness and can load with no document', () => { + const source = fs.readFileSync(scriptPath, 'utf8'); + assert.doesNotThrow(() => vm.runInNewContext(source, {})); + const ready = fixture(); + vm.runInNewContext(source, { document: ready.document }); + assert.equal(ready.controls.hidden, false); + assert.equal(ready.announcement.textContent, ''); + const loading = fixture(); + loading.document.readyState = 'loading'; + vm.runInNewContext(source, { document: loading.document }); + assertReadableFallback(loading); + loading.document.dispatch('DOMContentLoaded'); + assert.equal(loading.controls.hidden, false); + assert.equal(loading.articles.award.hidden, false); + assert.equal(loading.articles.agreement.hidden, true); + assert.equal(loading.announcement.textContent, ''); + assert.equal(loading.document.listeners.get('DOMContentLoaded').length, 0); +}); + +function readHomepageDocument() { + // HTMLParser reads the checked-in page, including nesting, attributes, and + // fallback copy. The fixture supplies DOM operations, not browser rendering. + const parser = String.raw` +import json +import sys +from html.parser import HTMLParser +from pathlib import Path + +class PageParser(HTMLParser): + void_tags = {'area', 'base', 'br', 'col', 'embed', 'hr', 'img', 'input', 'link', 'meta', 'param', 'source', 'track', 'wbr'} + + def __init__(self): + super().__init__(convert_charrefs=True) + self.root = {'tag': 'document', 'attributes': {}, 'children': [], 'text': ''} + self.stack = [self.root] + + def add_node(self, tag, attrs): + node = {'tag': tag, 'attributes': {key: value if value is not None else '' for key, value in attrs}, 'children': [], 'text': ''} + self.stack[-1]['children'].append(node) + return node + + def handle_starttag(self, tag, attrs): + node = self.add_node(tag, attrs) + if tag not in self.void_tags: + self.stack.append(node) + + def handle_startendtag(self, tag, attrs): + self.add_node(tag, attrs) + + def handle_endtag(self, tag): + for index in range(len(self.stack) - 1, 0, -1): + if self.stack[index]['tag'] == tag: + del self.stack[index:] + return + + def handle_data(self, data): + for node in self.stack: + node['text'] += data + +parser = PageParser() +parser.feed(Path(sys.argv[1]).read_text(encoding='utf-8')) +parser.close() +print(json.dumps(parser.root, ensure_ascii=True)) +`; + const tree = JSON.parse(execFileSync('python', [ + '-c', parser, path.join(__dirname, '../docs/index.html') + ], { encoding: 'utf8' })); + const toElement = (node) => { + const element = new Element(node.tag, node.attributes, node.children.map(toElement)); + element.textContent = node.text; + return element; + }; + const document = toElement(tree); + document.readyState = 'complete'; + return document; +} + +const canonicalCase = JSON.parse(fs.readFileSync( + path.join(__dirname, '../src/red-threads/examples/meridian-case.json'), 'utf8' +)); +const canonicalRouteIds = { + award: 'e-grant', agreement: 'e-approval', revision: 'e-leo-revisions' +}; + +test('all record relations and endpoints agree with the canonical Meridian case', () => { + for (const [recordId, edgeId] of Object.entries(canonicalRouteIds)) { + const edge = canonicalCase.edges.find((candidate) => candidate.id === edgeId); + assert.ok(edge, 'Canonical relation is missing: ' + edgeId); + const record = getRecord(recordId); + assert.equal(record.edge, edge.id, recordId + ' selects the canonical relationship.'); + assert.deepEqual(record.nodes, [edge.source, edge.target], + recordId + ' highlights the actual source and target.'); + for (const endpoint of record.nodes) { + assert.ok(canonicalCase.nodes.some((node) => node.id === endpoint), + 'Canonical endpoint is missing: ' + endpoint); + } + } +}); + +test('the actual homepage activates the shipped enhancement and selects every canonical route', () => { + const document = readHomepageDocument(); + const scripts = document.querySelectorAll('[src="assets/evidence-board.js"]'); + assert.equal(scripts.length, 1, 'The homepage must load the shipped enhancement once.'); + assert.equal(scripts[0].tagName, 'SCRIPT'); + assert.notEqual(scripts[0].getAttribute('defer'), null); + const board = document.querySelectorAll('#evidence-board')[0]; + assert.ok(board, 'The homepage must contain the evidence board.'); + const controls = board.querySelectorAll('[data-record-controls]')[0]; + const announcement = board.querySelectorAll('[data-record-announcement]')[0]; + assert.ok(controls); + assert.ok(announcement); + assert.equal(controls.hidden, true, 'Controls stay hidden until enhancement succeeds.'); + assert.equal(announcement.textContent.trim(), ''); + const byAttribute = (attribute) => Object.fromEntries( + board.querySelectorAll('[' + attribute + ']').map((element) => [element.getAttribute(attribute), element]) + ); + const articles = byAttribute('data-record'); + const buttons = byAttribute('data-select-record'); + const edges = byAttribute('data-edge'); + const nodes = byAttribute('data-node'); + assert.deepEqual(Object.keys(articles).sort(), ['agreement', 'award', 'revision']); + for (const article of Object.values(articles)) { + assert.equal(article.hidden, false, 'Every actual article must be available without JavaScript.'); + assert.ok(article.textContent.trim(), 'Each fallback article must contain readable evidence.'); + } + + // Execute the same standalone boot path the page loads, against its parsed DOM. + vm.runInNewContext(fs.readFileSync(scriptPath, 'utf8'), { document }); + assert.equal(board.classList.contains('is-enhanced'), true, + 'Actual page hooks must satisfy the enhancement preflight.'); + assert.equal(controls.hidden, false); + assert.equal(articles.award.hidden, false); + assert.equal(articles.agreement.hidden, true); + assert.equal(articles.revision.hidden, true); + assert.equal(announcement.textContent.trim(), '', 'Initial activation must stay quiet.'); + + for (const recordId of ['agreement', 'revision', 'award']) { + const edge = canonicalCase.edges.find((candidate) => candidate.id === canonicalRouteIds[recordId]); + assert.equal(buttons[recordId].tagName, 'BUTTON'); + assert.equal(buttons[recordId].getAttribute('type'), 'button'); + buttons[recordId].dispatch('click'); + for (const [articleId, article] of Object.entries(articles)) { + assert.equal(article.hidden, articleId !== recordId, recordId + ' selects its actual article.'); + assert.equal(buttons[articleId].getAttribute('aria-pressed'), String(articleId === recordId)); + } + assert.deepEqual(activeIds(edges), [edge.id]); + assert.deepEqual(activeIds(nodes).sort(), [edge.source, edge.target].sort()); + assert.ok(announcement.textContent.trim(), 'A user selection must announce its relation.'); + assertDiagramStillPresent({ edges, nodes }); + } +}); From 6f7b5feea9a28c51072c932feaa493921749fa0c Mon Sep 17 00:00:00 2001 From: stunspot Date: Tue, 8 Sep 2026 07:29:23 -0500 Subject: [PATCH 2/2] Mark self-hosted font files as binary --- .gitattributes | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitattributes b/.gitattributes index 518b349..e20a156 100644 --- a/.gitattributes +++ b/.gitattributes @@ -15,3 +15,4 @@ *.ico binary *.webp binary *.mp4 binary +*.ttf binary