-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathframework.html
More file actions
199 lines (169 loc) · 12.3 KB
/
framework.html
File metadata and controls
199 lines (169 loc) · 12.3 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Framework — GEOINT Terminal</title>
<link rel="preconnect" href="https://fonts.googleapis.com">
<link href="https://fonts.googleapis.com/css2?family=Playfair+Display:ital,wght@0,400;0,700;0,900;1,400&family=IBM+Plex+Mono:ital,wght@0,300;0,400;0,600;0,700;1,400&family=Crimson+Pro:ital,wght@0,300;0,400;0,600;1,400&display=swap" rel="stylesheet">
<style>
:root {
--ink: #08090d; --ink2: #0d0f15; --ink3: #111420;
--paper: #f0ece3; --sand: #e2d9c8;
--gold: #c9922a; --gold2: #a0711c;
--mist: #7a8da0; --slate: #3d4a5c;
--green: #3a8a5a; --danger: #c42222;
--border: rgba(240,236,227,0.07);
--border2: rgba(240,236,227,0.13);
--mono: 'IBM Plex Mono', monospace;
--serif: 'Playfair Display', Georgia, serif;
--body: 'Crimson Pro', Georgia, serif;
}
*, *::before, *::after { margin:0; padding:0; box-sizing:border-box; }
html { font-size:14px; scroll-behavior:smooth; }
body { background:var(--ink); color:var(--paper); font-family:var(--mono); overflow-x:hidden; min-height:100vh; }
a { color:inherit; text-decoration:none; }
::selection { background:rgba(201,146,42,.22); }
::-webkit-scrollbar { width:4px; }
::-webkit-scrollbar-track { background:var(--ink); }
::-webkit-scrollbar-thumb { background:var(--slate); border-radius:2px; }
/* CHROME */
.chrome { background:#050608; border-bottom:1px solid var(--border); display:flex; align-items:center; height:32px; padding:0 1.5rem; font-family:var(--mono); font-size:0.68rem; letter-spacing:0.06em; position:sticky; top:0; z-index:200; }
.chrome-logo { color:var(--gold); font-weight:700; font-size:0.72rem; letter-spacing:0.14em; padding-right:1.5rem; border-right:1px solid var(--border2); margin-right:1.5rem; white-space:nowrap; }
.chrome-logo span { color:var(--mist); font-weight:400; }
.chrome-nav { display:flex; gap:1.4rem; align-items:center; flex:1; }
.chrome-nav a { color:var(--mist); font-size:0.66rem; letter-spacing:0.1em; text-transform:uppercase; transition:color 0.12s; }
.chrome-nav a:hover { color:var(--paper); }
.chrome-nav a.active { color:var(--gold); }
.chrome-divider { width:1px; height:14px; background:var(--border2); margin:0 0.2rem; }
.chrome-right { display:flex; align-items:center; gap:1.5rem; margin-left:auto; }
.chrome-clock { color:var(--slate); font-size:0.64rem; font-variant-numeric:tabular-nums; white-space:nowrap; }
.live-pill { display:flex; align-items:center; gap:0.4rem; background:rgba(196,34,34,0.14); border:1px solid rgba(196,34,34,0.3); padding:0.15rem 0.55rem; font-size:0.6rem; font-weight:700; letter-spacing:0.12em; color:#e04444; }
.live-dot { width:5px; height:5px; border-radius:50%; background:#e04444; animation:blink 1.1s ease-in-out infinite; }
@keyframes blink { 0%,100%{opacity:1;} 50%{opacity:0.2;} }
/* TICKER */
.ticker { background:#0d0f15; border-bottom:1px solid rgba(201,146,42,0.15); height:26px; overflow:hidden; display:flex; align-items:center; }
.ticker-track { display:flex; align-items:center; animation:scroll 60s linear infinite; white-space:nowrap; }
.t-item { font-family:var(--mono); font-size:0.62rem; color:var(--mist); padding:0 1.6rem; border-right:1px solid var(--border); white-space:nowrap; letter-spacing:0.04em; }
.t-lbl { color:var(--slate); margin-right:0.4rem; font-size:0.58rem; text-transform:uppercase; letter-spacing:0.08em; }
.t-warn { color:var(--gold); }
@keyframes scroll { 0%{transform:translateX(0);} 100%{transform:translateX(-50%);} }
/* PAGE */
.page { max-width:760px; margin:0 auto; padding:4rem 2rem 6rem; }
.page-kicker { font-family:var(--mono); font-size:0.62rem; letter-spacing:0.14em; color:var(--gold); text-transform:uppercase; margin-bottom:0.8rem; }
.page-title { font-family:var(--serif); font-size:2.6rem; font-weight:900; line-height:1.1; color:var(--paper); margin-bottom:2.5rem; border-bottom:1px solid var(--border2); padding-bottom:2rem; }
.body-text p { font-family:var(--body); font-size:1.1rem; color:rgba(240,236,227,0.8); line-height:1.85; margin-bottom:1.5rem; }
.body-text strong { color:var(--paper); font-weight:600; }
.step { background:var(--ink2); border:1px solid var(--border2); border-left:3px solid var(--gold); padding:1.4rem 1.6rem; margin:2rem 0; }
.step-num { font-family:var(--mono); font-size:0.58rem; letter-spacing:0.14em; color:var(--gold); text-transform:uppercase; margin-bottom:0.5rem; }
.step-title { font-family:var(--serif); font-size:1.1rem; font-weight:700; color:var(--paper); margin-bottom:0.6rem; }
.step-body { font-family:var(--body); font-size:0.95rem; color:rgba(240,236,227,0.7); line-height:1.75; }
.principle-box { background:rgba(201,146,42,0.06); border:1px solid rgba(201,146,42,0.2); padding:1.4rem 1.8rem; margin:2.5rem 0; text-align:center; }
.principle-box p { font-family:var(--serif); font-size:1.15rem; font-style:italic; color:rgba(240,236,227,0.9); line-height:1.7; margin:0; }
.section-hdr { font-family:var(--mono); font-size:0.65rem; letter-spacing:0.16em; color:var(--slate); text-transform:uppercase; border-bottom:1px solid var(--border); padding-bottom:0.6rem; margin:3rem 0 1.5rem; }
.bias-grid { display:grid; grid-template-columns:1fr 1fr; gap:0.8rem; margin:1.5rem 0; }
@media(max-width:640px) { .bias-grid { grid-template-columns:1fr; } }
.bias-item { background:var(--ink2); border:1px solid var(--border); padding:0.8rem 1rem; }
.bias-name { font-family:var(--mono); font-size:0.62rem; font-weight:600; color:var(--paper); letter-spacing:0.06em; margin-bottom:0.3rem; }
.bias-desc { font-family:var(--body); font-size:0.82rem; color:rgba(240,236,227,0.5); line-height:1.55; }
.nav-links { display:flex; gap:1.5rem; margin-top:3rem; padding-top:2rem; border-top:1px solid var(--border); flex-wrap:wrap; }
.nav-link { font-family:var(--mono); font-size:0.68rem; letter-spacing:0.1em; color:var(--mist); border:1px solid var(--border2); padding:0.5rem 1rem; transition:all 0.15s; }
.nav-link:hover { color:var(--gold); border-color:rgba(201,146,42,0.3); }
.page-foot { border-top:1px solid var(--border); margin-top:4rem; padding:2rem; text-align:center; font-family:var(--mono); font-size:0.58rem; color:var(--slate); letter-spacing:0.08em; line-height:2; }
@media(max-width:640px) { .chrome-nav{display:none;} .page{padding:2rem 1.2rem 4rem;} .page-title{font-size:2rem;} }
</style>
</head>
<body>
<header class="chrome">
<div class="chrome-logo"><a href="index.html" style="color:inherit;">GEOINT<span> // TERMINAL</span></a></div>
<nav class="chrome-nav">
<a href="index.html">← Index</a>
<div class="chrome-divider"></div>
<a href="about.html">About</a>
<a href="framework.html" class="active">Framework</a>
<a href="track-record.html">Track Record</a>
</nav>
<div class="chrome-right">
<div class="live-pill"><div class="live-dot"></div>LIVE</div>
<div class="chrome-clock" id="clock">UTC 00:00:00</div>
</div>
</header>
<div class="ticker">
<div class="ticker-track">
<div class="t-item"><span class="t-lbl">Iran War</span><span class="t-warn" id="warday">D+?</span></div>
<div class="t-item"><span class="t-lbl">Hormuz</span><span class="t-warn">DEGRADED</span></div>
<div class="t-item"><span class="t-lbl">Taiwan Strait</span><span class="t-warn">ELEVATED</span></div>
<div class="t-item"><span class="t-lbl">NPT</span><span class="t-warn">UNDER STRESS</span></div>
<div class="t-item"><span class="t-lbl">Russia Posture</span><span class="t-warn">ACTIVE SIGNAL</span></div>
<div class="t-item"><span class="t-lbl">Iran War</span><span class="t-warn" id="warday2">D+?</span></div>
<div class="t-item"><span class="t-lbl">Hormuz</span><span class="t-warn">DEGRADED</span></div>
<div class="t-item"><span class="t-lbl">Taiwan Strait</span><span class="t-warn">ELEVATED</span></div>
<div class="t-item"><span class="t-lbl">NPT</span><span class="t-warn">UNDER STRESS</span></div>
<div class="t-item"><span class="t-lbl">Russia Posture</span><span class="t-warn">ACTIVE SIGNAL</span></div>
</div>
</div>
<div class="page">
<div class="page-kicker">// Analytical Framework</div>
<h1 class="page-title">How This Analysis Is Made</h1>
<div class="body-text">
<p>This started with a question I kept coming back to: <strong>why are expert forecasts wrong so often, and wrong in the same ways?</strong> Not random errors. Predictable ones. The same blind spots showing up across different analysts, different events, different years. After a while it becomes clear the problem is not information. The information is usually there. The problem is the process.</p>
<p>I spent about a year building a framework to fix that. Early versions overcorrected and produced their own errors. Later versions were too minimal to catch anything. Eventually something emerged that works consistently, and every analysis on this site runs through it. The full methodology stays private. What follows is enough to understand how the analysis is structured.</p>
</div>
<div class="principle-box">
<p>When the consensus speaks, interrogate its completeness, challenge its assumptions, and actively seek the unseen forces that will drive divergence.</p>
</div>
<div class="section-hdr">// The Five Steps</div>
<div class="step">
<div class="step-num">Step 01</div>
<div class="step-title">Consensus Mapping</div>
<div class="step-body">What does the mainstream view actually say, where does it come from, and what does it need to be true in order to hold? Those underlying assumptions are where the analysis starts.</div>
</div>
<div class="step">
<div class="step-num">Step 02</div>
<div class="step-title">Bias Deconstruction</div>
<div class="step-body">Which institutional and cognitive biases are holding the consensus together? Where is the analysis steering away from uncomfortable conclusions? The framework runs a structured examination here that goes beyond the obvious ones.</div>
</div>
<div class="step">
<div class="step-num">Step 03</div>
<div class="step-title">Suppressed and Emergent Drivers</div>
<div class="step-body">What is the consensus not pricing in? The absent actors, the feedback loops being ignored, the forces that are real but not yet visible in mainstream analysis. This is where the actual forecast gets built.</div>
</div>
<div class="step">
<div class="step-num">Step 04</div>
<div class="step-title">Deviation Forecast with Scenarios</div>
<div class="step-body">Three scenario bands, explicit probability weightings, specific enough to be falsifiable. A forecast that can't be wrong isn't a forecast.</div>
</div>
<div class="step">
<div class="step-num">Step 05</div>
<div class="step-title">Falsifiable Watchpoints</div>
<div class="step-body">Specific, observable, time-bound markers logged publicly the moment an analysis goes up. Never edited after publication. The track record page is where they resolve, right or wrong.</div>
</div>
<div class="section-hdr">// A Note on What This Is Not</div>
<div class="body-text">
<p>This is not a contrarian site. Flipping whatever the consensus says is a different kind of lazy, not better analysis. The framework looks for deviation where the evidence and structural logic actually point to it.</p>
<p>It is also not trying to produce certainty. The three scenario structure exists because the future genuinely branches. The public track record exists because getting things wrong and explaining why is more useful than hedging everything into unfalsifiability.</p>
</div>
<div class="nav-links">
<a href="track-record.html" class="nav-link">→ Track Record</a>
<a href="about.html" class="nav-link">→ About</a>
<a href="index.html" class="nav-link">→ Analysis Index</a>
</div>
</div>
<div class="page-foot">
GEOINT TERMINAL — INDEPENDENT GEOPOLITICAL ANALYSIS<br>
ALL ANALYSIS IS PROBABILISTIC, NOT DETERMINISTIC. NOT AFFILIATED WITH ANY GOVERNMENT OR INTELLIGENCE AGENCY.
</div>
<script>
(function tick(){
const el = document.getElementById('clock');
const now = new Date();
const p = n => String(n).padStart(2,'0');
if(el) el.textContent = 'UTC '+p(now.getUTCHours())+':'+p(now.getUTCMinutes())+':'+p(now.getUTCSeconds());
setTimeout(tick,1000);
})();
const ws = new Date('2026-03-04');
const dd = Math.max(1,Math.floor((new Date()-ws)/864e5));
['warday','warday2'].forEach(id=>{const e=document.getElementById(id);if(e)e.textContent='D+'+dd;});
</script>
</body>
</html>