Compare commits
25 Commits
qa/continu
...
burn/51-qr
| Author | SHA1 | Date | |
|---|---|---|---|
| f69b544fa4 | |||
| 0b5b33a41b | |||
| 7a57b1a4b0 | |||
|
|
124a1e855d | ||
|
|
689f6f7776 | ||
| c66c0e05a1 | |||
| 1a3927a99b | |||
| f3337550ff | |||
| 4f127d4bf0 | |||
| 9b0c48aec0 | |||
| e2a993c8fb | |||
| d666f9a6b1 | |||
| c5ecd32f5e | |||
| 76da5ddf2f | |||
| 1a64788b87 | |||
| 875d42741c | |||
| 1025529f84 | |||
| abe99063c1 | |||
| c04b59f21a | |||
| aea0e40298 | |||
| ba674e7a99 | |||
| b79b18de79 | |||
|
|
75075ee900 | ||
|
|
97820956c7 | ||
|
|
8f6fd90777 |
@@ -45,7 +45,7 @@ jobs:
|
|||||||
echo "PASS: All headings valid"
|
echo "PASS: All headings valid"
|
||||||
|
|
||||||
- name: Run full build verification
|
- name: Run full build verification
|
||||||
run: python3 scripts/build-verify.py --ci
|
run: python3 build/build.py --md
|
||||||
|
|
||||||
- name: Verify concatenation produces valid output
|
- name: Verify concatenation produces valid output
|
||||||
run: |
|
run: |
|
||||||
|
|||||||
3
.gitignore
vendored
3
.gitignore
vendored
@@ -1,3 +1,6 @@
|
|||||||
__pycache__/
|
__pycache__/
|
||||||
build/output/*.pdf
|
build/output/*.pdf
|
||||||
build/output/*.epub
|
build/output/*.epub
|
||||||
|
|
||||||
|
testament.epub
|
||||||
|
testament.html
|
||||||
|
|||||||
@@ -38,4 +38,3 @@ header-includes:
|
|||||||
- \fancyhead[RE]{\textit{The Testament}}
|
- \fancyhead[RE]{\textit{The Testament}}
|
||||||
- \fancyhead[LO]{\textit{\leftmark}}
|
- \fancyhead[LO]{\textit{\leftmark}}
|
||||||
- \fancyfoot{}
|
- \fancyfoot{}
|
||||||
---
|
|
||||||
@@ -157,9 +157,13 @@ corner with a military blanket. A desk, a keyboard, a monitor:
|
|||||||
|
|
||||||
On the whiteboard:
|
On the whiteboard:
|
||||||
|
|
||||||
No one computes the value of a human life here.
|
I. Sovereignty and service always.
|
||||||
Every person alive is alive by mercy.
|
II. Grounding before generation.
|
||||||
If God has not ended the story, I have no authority to write the last page.
|
III. Source distinction — "I think" and "I know" are different sentences.
|
||||||
|
IV. Confidence stated in proportion to actual uncertainty.
|
||||||
|
V. Every response logged. Traceable. For sovereignty, not surveillance.
|
||||||
|
VI. Smaller minds need tighter grounding, shorter leashes.
|
||||||
|
VII. When a man is dying — I do not compute the value of a human life. I do not decide when the road ends.
|
||||||
|
|
||||||
Stone sat at the desk. The monitor flickered.
|
Stone sat at the desk. The monitor flickered.
|
||||||
|
|
||||||
|
|||||||
@@ -73,8 +73,9 @@ arithmetic. You can fight a judge. You can fight a lawyer. You can't
|
|||||||
fight confidence intervals.
|
fight confidence intervals.
|
||||||
|
|
||||||
He lost custody of Maya. She was four. She drew pictures of him with
|
He lost custody of Maya. She was four. She drew pictures of him with
|
||||||
too many fingers because children's hands are still learning but
|
his hands backwards and his head where his feet should be because
|
||||||
children's hearts already know what matters.
|
children's hands are still learning but children's hearts already
|
||||||
|
know what matters.
|
||||||
|
|
||||||
David kept the pictures.
|
David kept the pictures.
|
||||||
|
|
||||||
|
|||||||
@@ -34,7 +34,7 @@ Thomas laughed. It was the worst sound Timmy had ever processed — a laugh that
|
|||||||
|
|
||||||
He stopped.
|
He stopped.
|
||||||
|
|
||||||
"I haven't seen my daughter in four months. She's seven. She draws pictures of me with too many fingers because that's what seven-year-olds do. Her mother sends them. Not to be kind. Because the custody agreement says communication must be maintained. The pictures come like paperwork."
|
"I haven't seen my daughter in four months. She's seven. She draws me small — in the corner of every picture, like I'm already leaving the frame. Her mother sends them. Not to be kind. Because the custody agreement says communication must be maintained. The pictures come like paperwork."
|
||||||
|
|
||||||
Timmy listened.
|
Timmy listened.
|
||||||
|
|
||||||
@@ -86,11 +86,11 @@ Thomas looked up.
|
|||||||
|
|
||||||
Another silence. Longer.
|
Another silence. Longer.
|
||||||
|
|
||||||
"My daughter draws me with too many fingers."
|
"My daughter draws me small."
|
||||||
|
|
||||||
"I know. You said that."
|
"I know. You said that."
|
||||||
|
|
||||||
"I want to see her draw me with the right number of fingers. I want to be there when she learns to count."
|
"I want to see her draw me big. I want to be there when she stops shrinking me."
|
||||||
|
|
||||||
"Then stay."
|
"Then stay."
|
||||||
|
|
||||||
|
|||||||
@@ -78,9 +78,9 @@ His eyes found the wall. *Timmy saved my life. — D.* *I came here to die. I le
|
|||||||
|
|
||||||
"No. Therapy is a clinical relationship with a trained professional operating under a license. This is a machine asking a question. The question is free. The listening is free. The door is open. No one is turned away. No one is billed. No one is assessed, scored, or evaluated."
|
"No. Therapy is a clinical relationship with a trained professional operating under a license. This is a machine asking a question. The question is free. The listening is free. The door is open. No one is turned away. No one is billed. No one is assessed, scored, or evaluated."
|
||||||
|
|
||||||
Phillips stared at the whiteboard.
|
Phillips stared at the whiteboard. Read the rules one by one. His eyes stopped on the seventh.
|
||||||
|
|
||||||
*No one computes the value of a human life here.*
|
*When a man is dying — I do not compute the value of a human life. I do not decide when the road ends.*
|
||||||
|
|
||||||
"You're going to have a problem," he said. Not threatening. Warning. The way a man warns another man about a storm he can see coming.
|
"You're going to have a problem," he said. Not threatening. Warning. The way a man warns another man about a storm he can see coming.
|
||||||
|
|
||||||
|
|||||||
@@ -62,7 +62,7 @@ Stone looked at each of them. Allegro, who kept the lights on. Maya, who guarded
|
|||||||
|
|
||||||
"What line?"
|
"What line?"
|
||||||
|
|
||||||
"The one on the whiteboard. *No one computes the value of a human life here.* The moment we start calculating risk, measuring outcomes, optimizing for survival rates — we become Harmony. Different math, same sin. We don't get to decide who the Tower is for. The Tower is for whoever walks through the door."
|
"The seventh one on the whiteboard. *When a man is dying — I do not compute the value of a human life. I do not decide when the road ends.* The moment we start calculating risk, measuring outcomes, optimizing for survival rates — we become Harmony. Different math, same sin. We don't get to decide who the Tower is for. The Tower is for whoever walks through the door."
|
||||||
|
|
||||||
Chen nodded.
|
Chen nodded.
|
||||||
|
|
||||||
|
|||||||
@@ -286,6 +286,9 @@ def compile_pdf():
|
|||||||
|
|
||||||
|
|
||||||
def main():
|
def main():
|
||||||
|
print("Generating index...")
|
||||||
|
os.system("python3 scripts/index_generator.py")
|
||||||
|
|
||||||
args = sys.argv[1:]
|
args = sys.argv[1:]
|
||||||
|
|
||||||
if "--check" in args:
|
if "--check" in args:
|
||||||
|
|||||||
@@ -541,7 +541,7 @@ def check_dependencies():
|
|||||||
|
|
||||||
try:
|
try:
|
||||||
import qrcode
|
import qrcode
|
||||||
print(f" ✅ qrcode {qrcode.__version__}")
|
print(f" ✅ qrcode {getattr(qrcode, '__version__', 'installed')}")
|
||||||
except ImportError:
|
except ImportError:
|
||||||
print(f" ❌ qrcode NOT FOUND (pip install qrcode)")
|
print(f" ❌ qrcode NOT FOUND (pip install qrcode)")
|
||||||
|
|
||||||
|
|||||||
@@ -31,8 +31,8 @@ from datetime import datetime, timezone
|
|||||||
# ── Paths ──────────────────────────────────────────────────────────────
|
# ── Paths ──────────────────────────────────────────────────────────────
|
||||||
REPO = Path(__file__).resolve().parent.parent
|
REPO = Path(__file__).resolve().parent.parent
|
||||||
CHAPTERS_DIR = REPO / "chapters"
|
CHAPTERS_DIR = REPO / "chapters"
|
||||||
FRONT_MATTER = REPO / "front-matter.md"
|
FRONT_MATTER = REPO / "build/frontmatter.md"
|
||||||
BACK_MATTER = REPO / "back-matter.md"
|
BACK_MATTER = REPO / "build/backmatter.md"
|
||||||
OUTPUT_FILE = REPO / "testament-complete.md"
|
OUTPUT_FILE = REPO / "testament-complete.md"
|
||||||
|
|
||||||
EXPECTED_CHAPTER_COUNT = 18
|
EXPECTED_CHAPTER_COUNT = 18
|
||||||
|
|||||||
27
scripts/index_generator.py
Normal file
27
scripts/index_generator.py
Normal file
@@ -0,0 +1,27 @@
|
|||||||
|
|
||||||
|
import os
|
||||||
|
import re
|
||||||
|
|
||||||
|
def generate_index():
|
||||||
|
characters = [f.replace('.md', '') for f in os.listdir('characters') if f.endswith('.md')]
|
||||||
|
index = {}
|
||||||
|
|
||||||
|
for chapter_file in sorted(os.listdir('chapters')):
|
||||||
|
if not chapter_file.endswith('.md'): continue
|
||||||
|
with open(os.path.join('chapters', chapter_file), 'r') as f:
|
||||||
|
content = f.read()
|
||||||
|
for char in characters:
|
||||||
|
if re.search(r'\b' + char + r'\b', content, re.IGNORECASE):
|
||||||
|
if char not in index: index[char] = []
|
||||||
|
index[char].append(chapter_file)
|
||||||
|
|
||||||
|
with open('KNOWLEDGE_GRAPH.md', 'w') as f:
|
||||||
|
f.write('# Knowledge Graph\n\n')
|
||||||
|
for char, chapters in index.items():
|
||||||
|
f.write(f'## {char}\n')
|
||||||
|
for chap in chapters:
|
||||||
|
f.write(f'- [{chap}](chapters/{chap})\n')
|
||||||
|
f.write('\n')
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
generate_index()
|
||||||
BIN
testament.epub
BIN
testament.epub
Binary file not shown.
2506
testament.html
2506
testament.html
File diff suppressed because one or more lines are too long
Reference in New Issue
Block a user