thesis: seed 5 Architect positioning framings into the Workshop (v0.1.0:58)

Saves the 2026-06-05 Architect positioning pass as competing CANDIDATE options
under the core line's positioning variant group, beside Option A/B: Convergence
(47/60), Access (40), Asymmetry (36), Scarcity/chokepoints (35), Freedom-tech (28),
each with its red-team weakness inline. One-time, additive, non-canonical
(guardrail #4); idempotent via an interaction_log sentinel so a partner-deleted
option is never resurrected. ensure_positioning_framings runs after the v5 seed.
Test: test_positioning_framings.py (count/candidacy/idempotency/no-resurrection/log).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
Keysat
2026-06-05 19:40:25 -05:00
parent c898ad8530
commit 196f1f6c65
6 changed files with 201 additions and 4 deletions
+7
View File
@@ -478,6 +478,13 @@ def init_db():
except Exception as _e: except Exception as _e:
print(f"[thesis] seed warning: {_e}") print(f"[thesis] seed warning: {_e}")
# One-time: add the 2026-06-05 Architect positioning framings as candidate options.
try:
from thesis_seed import ensure_positioning_framings as _ensure_positioning_framings
_ensure_positioning_framings(conn)
except Exception as _e:
print(f"[thesis] positioning framings warning: {_e}")
conn.close() conn.close()
print(f"Database initialized at {DB_PATH}") print(f"Database initialized at {DB_PATH}")
+77
View File
@@ -0,0 +1,77 @@
#!/usr/bin/env python3
"""Test the one-time Architect positioning-framings seed (thesis_seed.ensure_positioning_framings).
Verifies: the 5 framings land as CANDIDATE options under the core line's positioning
variant group (beside Option A/B); the insert is idempotent; an interaction_log sentinel
prevents resurrection after a partner soft-deletes one; and per-framing + sentinel audit
rows are written. Synthetic schema only (guardrail #9). Run: cd backend && python3 test_positioning_framings.py
"""
import os
import sqlite3
import sys
import tempfile
sys.path.insert(0, os.path.dirname(os.path.abspath(__file__)))
import thesis_seed as ts # noqa: E402
SCHEMA = """
CREATE TABLE thesis_lines (id TEXT PRIMARY KEY, line_key TEXT, name TEXT, segment_key TEXT, is_core INT, description TEXT, created_at TEXT, updated_at TEXT, deleted_at TEXT);
CREATE TABLE thesis_nodes (id TEXT PRIMARY KEY, line_id TEXT, parent_id TEXT, node_type TEXT, ord REAL, title TEXT, body TEXT, status TEXT, variant_group TEXT, created_at TEXT, updated_at TEXT, deleted_at TEXT);
CREATE TABLE segments (id TEXT PRIMARY KEY, segment_key TEXT, name TEXT, definition TEXT, needs_to_hear TEXT, avoid TEXT, version_no INT, status TEXT, created_at TEXT, updated_at TEXT);
CREATE TABLE interaction_log (id TEXT PRIMARY KEY, ts TEXT, actor_type TEXT, actor_id TEXT, action TEXT, target_type TEXT, target_id TEXT, payload TEXT, source TEXT, created_at TEXT);
"""
FAILS = []
def check(cond, msg):
print((" PASS " if cond else " FAIL ") + msg)
if not cond:
FAILS.append(msg)
def positioning(conn):
return conn.execute(
"SELECT title, status FROM thesis_nodes WHERE variant_group='positioning' AND deleted_at IS NULL ORDER BY ord"
).fetchall()
def main():
db = os.path.join(tempfile.mkdtemp(), "t.db")
conn = sqlite3.connect(db)
conn.executescript(SCHEMA)
conn.commit()
ts.ensure_thesis_seed(conn) # core line + Option A/B + segments
ts.ensure_positioning_framings(conn) # + 5 Architect framings
opts = positioning(conn)
check(len(opts) == 7, f"7 positioning options after seed (A,B + 5 framings), got {len(opts)}")
check(all(s == "candidate" for _, s in opts), "every positioning option is candidate (nothing canonical)")
check(sum("Architect" in t for t, _ in opts) == 5, "exactly 5 Architect framings inserted")
ts.ensure_positioning_framings(conn) # idempotent
check(len(positioning(conn)) == 7, "second run adds nothing (idempotent)")
# a partner soft-deletes one framing; a restart must NOT resurrect it
conn.execute("UPDATE thesis_nodes SET deleted_at='x' WHERE title LIKE 'Option C%'")
conn.commit()
ts.ensure_positioning_framings(conn)
check(len(positioning(conn)) == 6, "soft-deleted framing is not resurrected on re-run (sentinel guard)")
sentinel = conn.execute("SELECT COUNT(*) FROM interaction_log WHERE action='thesis.positioning_framings_seeded'").fetchone()[0]
perframe = conn.execute("SELECT COUNT(*) FROM interaction_log WHERE action='thesis.framing_seeded'").fetchone()[0]
check(sentinel == 1, f"exactly one sentinel row (got {sentinel})")
check(perframe == 5, f"one audit row per framing (got {perframe})")
conn.close()
if FAILS:
print(f"\nFAILED ({len(FAILS)})")
for f in FAILS:
print(" - " + f)
sys.exit(1)
print("\nALL PASS (positioning framings seed)")
if __name__ == "__main__":
main()
+91
View File
@@ -200,3 +200,94 @@ def ensure_thesis_seed(conn):
_log(conn, "thesis.seeded_v5", out["core_line"], {"segments": out["segments"], "source": "thesis-seed-v5"}) _log(conn, "thesis.seeded_v5", out["core_line"], {"segments": out["segments"], "source": "thesis-seed-v5"})
conn.commit() conn.commit()
print(f"[thesis] seeded v5 thesis (core line + {out['segments']} segment lines)") print(f"[thesis] seeded v5 thesis (core line + {out['segments']} segment lines)")
# ── Architect positioning pass (2026-06-05) ──────────────────────────────────
# Generated from the Architect positioning workflow: five divergent framings of the
# core banner, each red-teamed and scored. Banners/throughlines are voice-checked
# (no em dashes). The `weakness`/`objection` are Architect red-team commentary, not
# LP-facing copy. Saved as competing CANDIDATE options alongside Option A/B so the
# partners can review and mark one up. Nothing here is canonical (guardrail #4).
POSITIONING_FRAMINGS = [
{
"key": "convergence",
"score": 47,
"title": "Option C - Convergence (Architect, 47/60)",
"body": "Bitcoin, AI, and energy are now one supply chain. Ten31 owns the scarce links.\n\nThree of the largest growth markets of the decade have collapsed onto the same physical inputs: cheap power, raw compute, and final settlement. An AI data center is an energy problem. A bitcoin mine is an energy problem. The settlement layer underneath both is converging on the one money that cannot be printed to meet demand. Ten31 has spent six years deploying into the scarce parts of that stack, the generation, the compute, and the settlement, where supply is hard to create and demand is compounding. The convergence is already happening in physical reality. The capital markets have not priced it as one thing yet, and that lag is the entry point.",
"weakness": "The word scarce is asserted, not yet proven. The verifiable legs (generation, compute) are exactly where Ten31 has no structural edge over Brookfield or a hyperscaler with cheaper capital, and the leg Ten31 uniquely owns (bitcoin settlement) is the unconfirmed one. Without two or three named deals where bitcoin-alignment was the actual unlock, it lands as a TED talk and goes flat with the largest checks.",
"objection": "You're describing a correlation as if you own a position in it. The two links a skeptic can actually verify (generation, compute) are links where you have no structural advantage over a hyperscaler or energy PE shop with 100x your capital, and the one link you uniquely own (bitcoin settlement) is the speculative one. Where, specifically, in your $200M is the value that ONLY a bitcoin-aligned operator could have captured?",
},
{
"key": "access",
"score": 40,
"title": "Option D - Access & track record (Architect, 40/60)",
"body": "Founders bring us the deal before it exists. That access is earned, and it compounds.\n\nOver six years Ten31 has deployed more than $200M across two funds into 30+ of the strongest companies in bitcoin, energy, and AI infrastructure, including Strike, Start9, and core mining and energy assets. The best founders in this space come to us first, often before a round is public, because we understand where energy, compute, and hard money converge better than anyone writing checks. That conviction is the lens. The track record, including real M&A and public-markets outcomes, is the proof the lens works. Fund III continues the same strategy with the same deal flow, now deeper.",
"weakness": "Proprietary deal flow is the most overclaimed and least falsifiable phrase in venture, so as a banner it lands flat and undifferentiated. Worse, leading with access quietly drops the one genuinely non-consensus idea Ten31 owns, trading the only thing that cannot be copied for the one thing every fund claims. It also needs at least one realized distribution figure to survive contact, since deployment is a spend metric, not a result.",
"objection": "Every manager says founders come to them first and almost none can prove it. Naming Strike and Start9 proves you invested, not that you saw them before anyone else. And access without returns is just busy-ness: $200M deployed is a spend metric. Where is realized DPI, not M&A and public-markets activity as a vague gesture?",
},
{
"key": "asymmetry",
"score": 36,
"title": "Option E - Asymmetry (Architect, 36/60)",
"body": "The world is building AI and energy on top of a money it cannot keep. We own the supply side of the money it will have to use.\n\nAI and energy are the two largest demand sinks of the next decade, and both run on resources that are physically scarce. The money funding them is not scarce. Dollars can be printed; the power plants, the chips, and the compute cannot. Over time, infrastructure that produces real scarce output gets priced and settled in the one money that is also hard to produce, which is bitcoin. That convergence has not happened yet, and that is precisely why the assets sitting at the intersection are still cheap. Ten31 has spent six years buying the scarce supply side, energy generation, mining, and the rails that secure capital, before the market connects compute, energy, and hard money into a single trade.",
"weakness": "It concedes its own load-bearing premise has not happened yet, so the whole return gates on an un-dated macro event the firm does not control, which an IC reads as a levered, illiquid proxy for the bitcoin price with extra steps. It is more abstract and more inside-baseball than the status quo, the exact opposite of the partners' diagnosis.",
"objection": "You've told me WHEN the trade pays off but not THAT it will, and your own words give it away: that convergence has not happened yet. The entire return depends on a single macro event you can't date and don't control. If the line you've drawn from AI/energy demand back to bitcoin never gets drawn by the market, I don't get a re-rate, I get a levered, illiquid proxy for the bitcoin price with extra steps.",
},
{
"key": "scarcity",
"score": 35,
"title": "Option F - Scarcity (chokepoints) (Architect, 35/60)",
"body": "Ten31 owns the chokepoints. Bitcoin, AI, and energy all run out of the same three things, and we hold equity in the companies that supply them.\n\nEvery market everyone is excited about right now is demand racing ahead of a fixed supply of energy, compute, and hard money. You cannot will more of these into existence on a roadmap. Ten31 takes ownership positions in the private companies that produce and control that supply, so as demand for bitcoin, AI, and energy compounds, the value accrues to the things that stay scarce, and we already hold them. The non-consensus part is where this settles: we expect energy, compute, and AI infrastructure to increasingly price and clear in money that is hard to produce, which is not how it works today, and that gap between today and where it goes is the whole opportunity.",
"weakness": "It commits overclaim-then-deflate inside a single paragraph. Chokepoint implies pricing power and a moat, but the proof supports ownership and revenue, not control of a bottleneck, and the very next breath admits the differentiated claim is not true today. A sophisticated reader pressure-tests the word against the proof and the banner converts from a fact into a forecast.",
"objection": "The framing rests on a settlement migration you admit is not true today. Strip that out and what's proven is equity in 30+ companies that sell energy, mining, and bitcoin-financial services: a thematic portfolio, not control of a bottleneck. Do you OWN scarce supply (a checkable balance-sheet claim) or are you forecasting a non-consensus repricing? The banner conflates the two.",
},
{
"key": "freedom-tech",
"score": 28,
"title": "Option G - Freedom technology (Architect, 28/60)",
"body": "Freedom technology is becoming the supply layer of the real economy, and Ten31 owns the scarce side of it.\n\nFreedom technology is the hard infrastructure a less centralized economy runs on: energy that someone controls, computation that someone controls, and money that no one can dilute. The next decade's largest growth markets, bitcoin and AI, both consume the same two scarce inputs, cheap power and compute, and we expect both to increasingly settle on the hardest money available. Ten31 funds the companies that produce that scarce supply and earn revenue today from generating energy, securing capital, and powering computation. We are not financing a worldview. We are buying the constrained supply side of three markets before the demand fully arrives.",
"weakness": "It leads with the single most polarizing, least underwritable word in the deck and then spends the rest of the paragraph apologizing for it. The disclaimer 'We are not financing a worldview' is a self-inflicted wound that names the objection and thereby plants it. It actively costs ground with the three segments the partners most fear losing: institutions, family offices, and operators.",
"objection": "You don't have to say this isn't ideological unless the banner made the reader suspect it was. Either freedom is load-bearing (and diligence prices in political/regulatory risk) or it's decorative (strip it and you have the plain scarcity thesis, which is stronger). Why am I being made to swallow the ideology to reach the cash flows?",
},
]
def ensure_positioning_framings(conn):
"""One-time, additive insert of the 2026-06-05 Architect positioning pass as
competing CANDIDATE options under the core line's positioning variant group, so
the partners can review and mark up the Architect's framings beside Option A/B.
Idempotent via an interaction_log sentinel (survives soft-deletes and restarts);
additive and non-canonical (guardrail #4). No-ops gracefully if the core line or
positioning group is not present yet."""
try:
already = conn.execute(
"SELECT 1 FROM interaction_log WHERE action='thesis.positioning_framings_seeded' LIMIT 1"
).fetchone()
except sqlite3.OperationalError:
return # thesis / interaction_log tables not present yet
if already:
return
row = conn.execute("SELECT id FROM thesis_lines WHERE line_key='core' AND deleted_at IS NULL").fetchone()
if not row:
return # core line not seeded yet (ensure_thesis_seed runs first)
core = row[0]
prow = conn.execute(
"SELECT parent_id, MAX(ord) FROM thesis_nodes "
"WHERE line_id=? AND variant_group='positioning' AND deleted_at IS NULL",
(core,),
).fetchone()
if not prow or not prow[0]:
return # positioning variant group not found; do not guess a location
parent_id, max_ord = prow[0], (prow[1] or 0.0)
inserted = []
for i, fr in enumerate(POSITIONING_FRAMINGS, start=1):
body = f"{fr['body']}\n\n--- Architect red-team ({fr['score']}/60) ---\n{fr['weakness']}"
nid = _node(conn, core, parent_id, "claim", float(max_ord) + i, fr["title"], body,
status="candidate", variant_group="positioning")
_log(conn, "thesis.framing_seeded", nid,
{"key": fr["key"], "score": fr["score"], "objection": fr["objection"]})
inserted.append(nid)
_log(conn, "thesis.positioning_framings_seeded", core,
{"count": len(inserted), "source": "architect-pass-2026-06-05", "node_ids": inserted})
conn.commit()
print(f"[thesis] seeded {len(inserted)} Architect positioning framings into the Workshop")
+3 -2
View File
@@ -22,8 +22,9 @@ export const PACKAGE_TITLE = 'Ten31 Database'
// * 0.1.0:54 (unification polish: LinkedIn in grid inline contact editor) // * 0.1.0:54 (unification polish: LinkedIn in grid inline contact editor)
// * 0.1.0:55 (Architect grounding boundary: redaction/re-hydration privacy gate) // * 0.1.0:55 (Architect grounding boundary: redaction/re-hydration privacy gate)
// * 0.1.0:56 (Thesis Workshop redesign: edit/choose/delete + approve-as-current) // * 0.1.0:56 (Thesis Workshop redesign: edit/choose/delete + approve-as-current)
// * Current: 0.1.0:57 (redaction fix: magnitude regex no longer eats the word after an amount) // * 0.1.0:57 (redaction fix: magnitude regex no longer eats the word after an amount)
export const PACKAGE_VERSION = '0.1.0:57' // * Current: 0.1.0:58 (seed 5 Architect positioning framings into the Workshop as candidate options)
export const PACKAGE_VERSION = '0.1.0:58'
export const DATA_MOUNT_PATH = '/data' export const DATA_MOUNT_PATH = '/data'
export const WEB_PORT = 8080 export const WEB_PORT = 8080
+3 -2
View File
@@ -18,8 +18,9 @@ import { v_0_1_0_54 } from './v0.1.0.54'
import { v_0_1_0_55 } from './v0.1.0.55' import { v_0_1_0_55 } from './v0.1.0.55'
import { v_0_1_0_56 } from './v0.1.0.56' import { v_0_1_0_56 } from './v0.1.0.56'
import { v_0_1_0_57 } from './v0.1.0.57' import { v_0_1_0_57 } from './v0.1.0.57'
import { v_0_1_0_58 } from './v0.1.0.58'
export const versionGraph = VersionGraph.of({ export const versionGraph = VersionGraph.of({
current: v_0_1_0_57, current: v_0_1_0_58,
other: [v_0_1_0_39, v_0_1_0_40, v_0_1_0_41, v_0_1_0_42, v_0_1_0_43, v_0_1_0_44, v_0_1_0_45, v_0_1_0_46, v_0_1_0_47, v_0_1_0_48, v_0_1_0_49, v_0_1_0_50, v_0_1_0_51, v_0_1_0_52, v_0_1_0_53, v_0_1_0_54, v_0_1_0_55, v_0_1_0_56], other: [v_0_1_0_39, v_0_1_0_40, v_0_1_0_41, v_0_1_0_42, v_0_1_0_43, v_0_1_0_44, v_0_1_0_45, v_0_1_0_46, v_0_1_0_47, v_0_1_0_48, v_0_1_0_49, v_0_1_0_50, v_0_1_0_51, v_0_1_0_52, v_0_1_0_53, v_0_1_0_54, v_0_1_0_55, v_0_1_0_56, v_0_1_0_57],
}) })
+20
View File
@@ -0,0 +1,20 @@
import { VersionInfo } from '@start9labs/start-sdk'
// Saves the 2026-06-05 Architect positioning pass into the Thesis Workshop: five
// divergent framings of the core banner (Convergence, Access, Asymmetry, Scarcity,
// Freedom-tech), each scored and red-teamed, added as competing CANDIDATE options
// beside Option A/B so the partners can review and mark one up. One-time, additive,
// non-canonical (guardrail #4); idempotent via an interaction_log sentinel so a
// soft-deleted option is never resurrected. No schema migration.
export const v_0_1_0_58 = VersionInfo.of({
version: '0.1.0:58',
releaseNotes: {
en_US: [
'Thesis Workshop now starts with five Architect-drafted positioning options for the',
'core banner, each scored and pressure-tested, sitting beside the original Option A/B',
'for you and your partner to compare and pick from. They are drafts only; nothing is',
'made canonical without two admins signing off.',
].join(' '),
},
migrations: { up: async () => {}, down: async () => {} },
})