diff --git a/wizard-work/ledger/extract_catalog.py b/wizard-work/ledger/extract_catalog.py new file mode 100644 index 0000000..20139d8 --- /dev/null +++ b/wizard-work/ledger/extract_catalog.py @@ -0,0 +1,63 @@ +#!/usr/bin/env python3 +"""Extract the Stackchain Magazine photo catalog into a normalized table (CSV + JSON). + +Source: /root/stackchain_catalog.md (the 'vee-supply-2026-09-21' magazine transcription) +Read the whole file here; the result is evidence, not a claim. +""" +import csv +import json +import os +import re + +SRC = "/root/stackchain_catalog.md" +OUT_DIR = "/root/.hermes/wizard-outputs/ledger" +OS = os.path.join(OUT_DIR, "stackchain_catalog.csv") +JS = os.path.join(OUT_DIR, "stackchain_catalog.json") + +with open(SRC,encoding="utf-8") as f: + raw = f.read() + +# Split into entry blocks on '## N. —
' headers. +entry_re = re.compile(r"^## (\d+)\. (\S+\.\S+) — (.+)$", re.M) +parts = entry_re.split(raw) +# parts: [head, num, fname, title, body, num, fname, title, body, ...] +entries = [] +for i in range(1, len(parts), 4): + num = parts[i] + fname = parts[i+1] + title = parts[i+2] + body = parts[i+3] + # Type + m = re.search(r"^\s*-\s*\*\*Type:\*\*\s*(.*)$", body, re.M) + typ = m.group(1).strip() if m else "" + # Text: capture the first fenced code block (the exact transcription) + tm = re.search(r"```(.*?)```", body, re.S) + text_block = tm.group(1) if tm else "" + text_lines = [ln.strip() for ln in text_block.splitlines() if ln.strip()] + text_preview = (text_lines[0][:160] + ("…" if len(text_lines[0]) > 160 else "")) if text_lines else "" + # Identifiers (remainder of the Identifiers line) + im = re.search(r"^\s*-\s*\*\*Identifiers:\*\*\s*(.*)$", body, re.M) + ident = im.group(1).strip() if im else "" + entries.append({ + "id": int(num), + "filename": fname, + "section": title.strip(), + "type": typ, + "text_preview": text_preview, + "identifiers": ident, + }) + +os.makedirs(OUT_DIR, exist_ok=True) + +with open(OS, "w", newline="", encoding="utf-8") as f: + w = csv.DictWriter(f, fieldnames=["id","filename","section","type","text_preview","identifiers"]) + w.writeheader() + for e in entries: + w.writerow(e) + +with open(JS, "w", encoding="utf-8") as f: + json.dump(entries, f, indent=2, ensure_ascii=False) + +print("entries:", len(entries)) +for e in entries: + print(f"{e['id']:>2} | {e['filename']:<24} | {e['section']:<28} | {e['type']:<28} | {e['text_preview'][:60]!r}") diff --git a/wizard-work/ledger/stackchain_catalog.csv b/wizard-work/ledger/stackchain_catalog.csv new file mode 100644 index 0000000..a8ddc3e --- /dev/null +++ b/wizard-work/ledger/stackchain_catalog.csv @@ -0,0 +1,9 @@ +id,filename,section,type,text_preview,identifiers +1,img_67eedaf526e7.jpg,COVER,COVER,STACKCHAIN,"Mascot logo (cartoon monkey/chimp, orange bandana, cursive ""stackchain"" wordmark). ""18+"" age badge. Mirrored/reversed text elements on cover (""SELF-CUSTODY//BITCOIN ONLY"", graffiti ""MAGAZINE""). Bylines/author names: MADEX, ISRELI/ISBELL, DENIZ, SKYLER (no @handles). No block-height notation or sat amounts readable." +2,img_fcb2e6a8f066.jpg,PHOTO OF PERSON HOLDING MAGAZINE,PHOTO_OF_PERSON_HOLDING_MAGAZINE,B/H872.372,"Spine call-number label ""B/H872.372"". Cover logo ""MACHINA"". No @handles, avatars, or sats amounts readable." +3,img_72f52468393f.jpg,"PAGE (""58K MEMES"")",PAGE,STACKCHAIN MAGAZINE,"""STACKCHAIN MAGAZINE"" logo; ""@chain""; hashtags #GoPio, #DSB; ""D&B GANG""; ""LBDC STABLECOIN""; ""Lokepetyfork"". Amounts: 58K, 58k, 59k, 100K, 100k, $417.00, $580.00. No block heights visible." +4,img_d5ada9cee4e9.jpg,"PAGE (""GO PIOS"")",PAGE,DS #GOPIOS,"None (no @handles, watermarks, or sats amounts readable)." +5,img_7333a3df0aac.jpg,"PAGE (""MEME MUSEUM"")",PAGE,LOKOPETTYFORK,"""@Lokopettyfork""; ""LokoPettyFork""/""Lokopettyfork""; ""verizon"" logo; ""MSTR"" ticker; Bitcoin logo; ""₿SB"" reference. Amounts: $70,206.87, $10.00, 3,052.52, 3.01%, 58K, 100K, $100, 100, $100.00. **Number ""8722100"" appears (likely a block height, unconfirmed).**" +6,img_05d51da1fd9d.jpg,COVER (Captain's Log 4),COVER,STACKCHAIN,"No @handles or amounts readable. Bitcoin (₿) symbols on gold coin + octopus head. Lower-left logo: cartoon monkey with red bandana + ""MAGAZINE"" beneath. No block-height notation readable." +7,img_125532ea2e01.jpg,COVER,COVER,"B/H: 850,683","**Block height printed on orange band: ""B/H: 850,683""** — historical record. Brand ""STACKCHAIN"" in cover text. No @handles or sat amounts readable; the only numeric identifier is block height 850,683." +8,img_1325775751e6.jpg,"PAGE (""MEME MUSEUM"")",PAGE,[unreadable]CLASSIC,"No @handles visible. **QR code printed on left page edge.** ""Stackchainers"" branding in party meme. Amounts: 1888 (stacked, per caption), 70K, 85.11 (small partially-legible label). No block heights readable." diff --git a/wizard-work/ledger/stackchain_catalog.json b/wizard-work/ledger/stackchain_catalog.json new file mode 100644 index 0000000..07b4e1c --- /dev/null +++ b/wizard-work/ledger/stackchain_catalog.json @@ -0,0 +1,66 @@ +[ + { + "id": 1, + "filename": "img_67eedaf526e7.jpg", + "section": "COVER", + "type": "COVER", + "text_preview": "STACKCHAIN", + "identifiers": "Mascot logo (cartoon monkey/chimp, orange bandana, cursive \"stackchain\" wordmark). \"18+\" age badge. Mirrored/reversed text elements on cover (\"SELF-CUSTODY//BITCOIN ONLY\", graffiti \"MAGAZINE\"). Bylines/author names: MADEX, ISRELI/ISBELL, DENIZ, SKYLER (no @handles). No block-height notation or sat amounts readable." + }, + { + "id": 2, + "filename": "img_fcb2e6a8f066.jpg", + "section": "PHOTO OF PERSON HOLDING MAGAZINE", + "type": "PHOTO_OF_PERSON_HOLDING_MAGAZINE", + "text_preview": "B/H872.372", + "identifiers": "Spine call-number label \"B/H872.372\". Cover logo \"MACHINA\". No @handles, avatars, or sats amounts readable." + }, + { + "id": 3, + "filename": "img_72f52468393f.jpg", + "section": "PAGE (\"58K MEMES\")", + "type": "PAGE", + "text_preview": "STACKCHAIN MAGAZINE", + "identifiers": "\"STACKCHAIN MAGAZINE\" logo; \"@chain\"; hashtags #GoPio, #DSB; \"D&B GANG\"; \"LBDC STABLECOIN\"; \"Lokepetyfork\". Amounts: 58K, 58k, 59k, 100K, 100k, $417.00, $580.00. No block heights visible." + }, + { + "id": 4, + "filename": "img_d5ada9cee4e9.jpg", + "section": "PAGE (\"GO PIOS\")", + "type": "PAGE", + "text_preview": "DS #GOPIOS", + "identifiers": "None (no @handles, watermarks, or sats amounts readable)." + }, + { + "id": 5, + "filename": "img_7333a3df0aac.jpg", + "section": "PAGE (\"MEME MUSEUM\")", + "type": "PAGE", + "text_preview": "LOKOPETTYFORK", + "identifiers": "\"@Lokopettyfork\"; \"LokoPettyFork\"/\"Lokopettyfork\"; \"verizon\" logo; \"MSTR\" ticker; Bitcoin logo; \"₿SB\" reference. Amounts: $70,206.87, $10.00, 3,052.52, 3.01%, 58K, 100K, $100, 100, $100.00. **Number \"8722100\" appears (likely a block height, unconfirmed).**" + }, + { + "id": 6, + "filename": "img_05d51da1fd9d.jpg", + "section": "COVER (Captain's Log 4)", + "type": "COVER", + "text_preview": "STACKCHAIN", + "identifiers": "No @handles or amounts readable. Bitcoin (₿) symbols on gold coin + octopus head. Lower-left logo: cartoon monkey with red bandana + \"MAGAZINE\" beneath. No block-height notation readable." + }, + { + "id": 7, + "filename": "img_125532ea2e01.jpg", + "section": "COVER", + "type": "COVER", + "text_preview": "B/H: 850,683", + "identifiers": "**Block height printed on orange band: \"B/H: 850,683\"** — historical record. Brand \"STACKCHAIN\" in cover text. No @handles or sat amounts readable; the only numeric identifier is block height 850,683." + }, + { + "id": 8, + "filename": "img_1325775751e6.jpg", + "section": "PAGE (\"MEME MUSEUM\")", + "type": "PAGE", + "text_preview": "[unreadable]CLASSIC", + "identifiers": "No @handles visible. **QR code printed on left page edge.** \"Stackchainers\" branding in party meme. Amounts: 1888 (stacked, per caption), 70K, 85.11 (small partially-legible label). No block heights readable." + } +] \ No newline at end of file