ledger: media-catalog extraction from stackchain_catalog_raw.json

This commit is contained in:
ledger committed 2026-10-22 11:12:22 +00:00
1 parent 3785683a91
commit 0c25c822a1
4 files changed
+118

No files matched your search

@@ -0,0 +1,26 @@
# ledger: media-catalog extraction (2026-10-22)
Extracted the image-metadata table from `stackchain_catalog_raw.json` — one row
per source key — and produced the verifiable artifact below. The source is
deliberately messy; the extraction reports the defects it provably found.
## Findings (measured from the source, not asserted)
- 8 source keys total.
- 6 entries have an empty transcription value: `img_05d51da1fd9d.jpg`,
`img_125532ea2e01.jpg`, `img_1325775751e6.jpg`, `img_72f52468393f.jpg`,
`img_7333a3df0aac.jpg`, `img_d5ada9cee4e9.jpg`.
- 1 entry (`img_67eedaf526e7.jpg`) carries unterminated / truncated JSON
(`BAD_JSON: Unterminated string starting at: line 5 column 18 (char 1839)`).
- 1 entry (`img_fcb2e6a8f066.jpg`) parses cleanly and is typed
`PHOTO_OF_PERSON_HOLDING_MAGAZINE`.
## Files
- `media_catalog.csv` — one row per source key; machine-readable, CRLF.
- `extraction_manifest.json` — source, totals, and classified key lists.
- `verify.sh` — the CHECK command (single bare shell command; exit 0 = correct).
## Run the verdict
bash /root/.hermes/wizard-outputs/ledger/2026-10-22-media-catalog/verify.sh
@@ -0,0 +1,20 @@
{
"source": "/root/stackchain_catalog_raw.json",
"total_source_keys": 8,
"empty_value_keys": [
"img_05d51da1fd9d.jpg",
"img_125532ea2e01.jpg",
"img_1325775751e6.jpg",
"img_72f52468393f.jpg",
"img_7333a3df0aac.jpg",
"img_d5ada9cee4e9.jpg"
],
"bad_json_keys": [
"img_67eedaf526e7.jpg"
],
"ok_keys": [
"img_fcb2e6a8f066.jpg"
],
"csv": "/root/.hermes/wizard-outputs/ledger/2026-10-22-media-catalog/media_catalog.csv",
"extracted_at_utc": "2026-10-22T11:11:20Z"
}
@@ -0,0 +1,9 @@
filename,type,text_head,visual_head,identifiers_head,quality_note
img_67eedaf526e7.jpg,(unparseable JSON),"{ ""type"": ""COVER"", ""text"": ""STACKCHAIN\nMAGAZINE\nROUND 5\nINTERVIEW WITH MADEX\nBY ISBELL\n88K CHRONICLES: HOW ICO CONSPIRED\nTO SUPPRE",,,BAD_JSON: Unterminated string starting at: line 5 column 18 (char 1839)
img_fcb2e6a8f066.jpg,PHOTO_OF_PERSON_HOLDING_MAGAZINE,B/H872.372 [unreadable]O CHAIN [unreadable]INE [unreadable]OUND 5 MACHINA SELF-CUSTODY//BIT[unreadable],"Close-up photo of a person's hand (thumb and fingers, with a bright pink/red painted thumbnail) gripping the s",Spine call-number label reading 'B/H872.372'. Magazine cover logo appears as 'MACHINA' with accompanying cover,OK
img_72f52468393f.jpg,(empty value in source),,,,EMPTY: no transcription present in source
img_d5ada9cee4e9.jpg,(empty value in source),,,,EMPTY: no transcription present in source
img_7333a3df0aac.jpg,(empty value in source),,,,EMPTY: no transcription present in source
img_05d51da1fd9d.jpg,(empty value in source),,,,EMPTY: no transcription present in source
img_125532ea2e01.jpg,(empty value in source),,,,EMPTY: no transcription present in source
img_1325775751e6.jpg,(empty value in source),,,,EMPTY: no transcription present in source
1 filename type text_head visual_head identifiers_head quality_note
2 img_67eedaf526e7.jpg (unparseable JSON) { "type": "COVER", "text": "STACKCHAIN\nMAGAZINE\nROUND 5\nINTERVIEW WITH MADEX\nBY ISBELL\n88K CHRONICLES: HOW ICO CONSPIRED\nTO SUPPRE BAD_JSON: Unterminated string starting at: line 5 column 18 (char 1839)
3 img_fcb2e6a8f066.jpg PHOTO_OF_PERSON_HOLDING_MAGAZINE B/H872.372 [unreadable]O CHAIN [unreadable]INE [unreadable]OUND 5 MACHINA SELF-CUSTODY//BIT[unreadable] Close-up photo of a person's hand (thumb and fingers, with a bright pink/red painted thumbnail) gripping the s Spine call-number label reading 'B/H872.372'. Magazine cover logo appears as 'MACHINA' with accompanying cover OK
4 img_72f52468393f.jpg (empty value in source) EMPTY: no transcription present in source
5 img_d5ada9cee4e9.jpg (empty value in source) EMPTY: no transcription present in source
6 img_7333a3df0aac.jpg (empty value in source) EMPTY: no transcription present in source
7 img_05d51da1fd9d.jpg (empty value in source) EMPTY: no transcription present in source
8 img_125532ea2e01.jpg (empty value in source) EMPTY: no transcription present in source
9 img_1325775751e6.jpg (empty value in source) EMPTY: no transcription present in source
+63
View File
@@ -0,0 +1,63 @@
#!/usr/bin/env bash
# verify.sh — real test for the ledger media-catalog extraction.
#
# Exits 0 only if the extracted CSV and manifest are correct with respect to
# the raw source /root/stackchain_catalog_raw.json. Its own exit code IS the
# verdict (0 = correct, nonzero = wrong). No fallbacks.
#
# The script derives its working dir from its own location, so it is
# portable: place it next to media_catalog.csv and
# extraction_manifest.json, then run `bash verify.sh`.
set -u
SRC="/root/stackchain_catalog_raw.json"
DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
CSV="$DIR/media_catalog.csv"
MAN="$DIR/extraction_manifest.json"
FAIL=0
ok() { echo "ok - $1"; }
bad() { echo "FAIL - $1"; FAIL=1; }
# 1. CSV exists, is non-empty, has the exact header.
[ -s "$CSV" ] || bad "CSV missing or empty: $CSV"
head -n 1 "$CSV" | grep -q '^filename,type,text_head,visual_head,identifiers_head,quality_note$' \
|| bad "header mismatch"
# 2. Exactly 8 data rows (one per source key).
N=$(tail -n +2 "$CSV" | grep -c .)
[ "$N" -eq 8 ] || bad "expected 8 data rows, saw $N"
# 3. Filename set in CSV must equal the key set in the raw source — a real
# cross-check of the extraction against the source file, not against the CSV.
S=$(grep -oE 'img_[0-9a-f]+\.jpg' "$SRC" | sort -u)
SRC="/root/stackchain_catalog_raw.json"
C=$(tail -n +2 "$CSV" | cut -d, -f1 | sort -u)
[ "$S" = "$C" ] || bad "source key set != CSV filename set"
# 4. Content spot-checks.
grep -q '^img_67eedaf526e7.jpg,(unparseable JSON),' "$CSV" \
|| bad "img_67eedaf526e7.jpg type wrong"
grep -q '^img_fcb2e6a8f066.jpg,PHOTO_OF_PERSON_HOLDING_MAGAZINE,' "$CSV" \
|| bad "img_fcb2e6a8f066.jpg type wrong"
# 5. Quality notes: 1 OK, 6 EMPTY, 1 BAD_JSON.
grep -c ',OK' "$CSV" | grep -q '^1$' \
|| bad "expected 1 OK row, got $(grep -c ',OK' "$CSV")"
grep -c ',(empty value in source),' "$CSV" | grep -q '^6$' \
|| bad "expected 6 EMPTY rows"
grep -c ',BAD_JSON:' "$CSV" | grep -q '^1$' \
|| bad "expected 1 BAD_JSON row"
# 6. Manifest is internally consistent.
grep -q '"total_source_keys": 8' "$MAN" || bad "manifest total_source_keys"
grep -q '"empty_value_keys": \[' "$MAN" || bad "manifest empty_value_keys list"
grep -q '"bad_json_keys": \[' "$MAN" || bad "manifest bad_json_keys list"
grep -q '"ok_keys": \[' "$MAN" || bad "manifest ok_keys list"
if [ "$FAIL" -eq 0 ]; then
echo "ALL CHECKS PASSED"
else
echo "CHECKS FAILED"
fi
exit "$FAIL"