ms408 0.1.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (365) hide show
  1. ms408-0.1.0/.claude/skills/package-paper/SKILL.md +87 -0
  2. ms408-0.1.0/.claude/skills/package-paper/assets/metadata.example.yaml +15 -0
  3. ms408-0.1.0/.claude/skills/package-paper/assets/refs.bib +83 -0
  4. ms408-0.1.0/.claude/skills/package-paper/assets/template.tex +66 -0
  5. ms408-0.1.0/.env.example +13 -0
  6. ms408-0.1.0/.github/ISSUE_TEMPLATE/activity-submission.yml +91 -0
  7. ms408-0.1.0/.github/ISSUE_TEMPLATE/bug_report.md +23 -0
  8. ms408-0.1.0/.github/ISSUE_TEMPLATE/config.yml +8 -0
  9. ms408-0.1.0/.github/ISSUE_TEMPLATE/hypothesis_eval.md +20 -0
  10. ms408-0.1.0/.github/PULL_REQUEST_TEMPLATE.md +32 -0
  11. ms408-0.1.0/.github/workflows/ci.yml +59 -0
  12. ms408-0.1.0/.github/workflows/pages.yml +64 -0
  13. ms408-0.1.0/.github/workflows/publish.yml +53 -0
  14. ms408-0.1.0/.gitignore +28 -0
  15. ms408-0.1.0/CHANGELOG.md +30 -0
  16. ms408-0.1.0/CITATION.cff +30 -0
  17. ms408-0.1.0/CLAUDE.md +41 -0
  18. ms408-0.1.0/CODE_OF_CONDUCT.md +51 -0
  19. ms408-0.1.0/CONTRIBUTING.md +71 -0
  20. ms408-0.1.0/LICENSE +202 -0
  21. ms408-0.1.0/NOTICE +21 -0
  22. ms408-0.1.0/OSS_RELEASE.md +120 -0
  23. ms408-0.1.0/PKG-INFO +188 -0
  24. ms408-0.1.0/README.md +153 -0
  25. ms408-0.1.0/SECURITY.md +25 -0
  26. ms408-0.1.0/data/processed/.gitkeep +0 -0
  27. ms408-0.1.0/data/processed/h4/manifest.json +200 -0
  28. ms408-0.1.0/data/processed/harness/h2/naibbe_pliny_deck52_seed408_manifest.json +23 -0
  29. ms408-0.1.0/data/processed/harness/h3/selfcitation_B_seed19_lines1200_manifest.json +1 -0
  30. ms408-0.1.0/data/processed/manifest.json +29 -0
  31. ms408-0.1.0/data/processed/scan_map.json +1403 -0
  32. ms408-0.1.0/docs/DEPLOY.md +44 -0
  33. ms408-0.1.0/docs/GLOSSARY.md +68 -0
  34. ms408-0.1.0/docs/LIMITS.md +57 -0
  35. ms408-0.1.0/docs/METHODOLOGY.md +75 -0
  36. ms408-0.1.0/docs/RELEASE-READINESS.md +183 -0
  37. ms408-0.1.0/docs/RELEASE_NOTES_v0.1.0.md +55 -0
  38. ms408-0.1.0/docs/SEO_STRATEGY.md +130 -0
  39. ms408-0.1.0/docs/SITE_PLAN.md +72 -0
  40. ms408-0.1.0/docs/THEME_PLAN.md +86 -0
  41. ms408-0.1.0/docs/TUTORIAL.md +115 -0
  42. ms408-0.1.0/docs/dossiers/.gitkeep +0 -0
  43. ms408-0.1.0/docs/dossiers/astrological-iconography.md +223 -0
  44. ms408-0.1.0/docs/dossiers/balneology.md +246 -0
  45. ms408-0.1.0/docs/dossiers/cipher-culture.md +240 -0
  46. ms408-0.1.0/docs/dossiers/gynecological-reading.md +250 -0
  47. ms408-0.1.0/docs/dossiers/provenance-chain.md +248 -0
  48. ms408-0.1.0/docs/planning/CONCEPT-variable-introduction.md +130 -0
  49. ms408-0.1.0/docs/planning/i01/DECISIONS.md +60 -0
  50. ms408-0.1.0/docs/planning/i01/README.md +29 -0
  51. ms408-0.1.0/docs/planning/i01/RESEARCH-PLAN.md +123 -0
  52. ms408-0.1.0/docs/planning/i01/SOURCES.md +71 -0
  53. ms408-0.1.0/docs/planning/i01/STATUS.md +49 -0
  54. ms408-0.1.0/docs/planning/i01/T12-annotation-schema.md +285 -0
  55. ms408-0.1.0/docs/planning/i01/W6a-assumption-audit.md +269 -0
  56. ms408-0.1.0/docs/planning/i01/WORKFLOW.md +104 -0
  57. ms408-0.1.0/docs/planning/i01/specs/T03-h4-acquisition.md +93 -0
  58. ms408-0.1.0/docs/planning/i01/specs/T03-naibbe-spec.md +342 -0
  59. ms408-0.1.0/docs/planning/i01/specs/T03-selfcitation-spec.md +940 -0
  60. ms408-0.1.0/docs/planning/i01/specs/T11-currier-positional-targets.md +137 -0
  61. ms408-0.1.0/docs/planning/i01/specs/T11-entropy-targets.md +319 -0
  62. ms408-0.1.0/docs/planning/i01/specs/T11-montemurro-targets.md +287 -0
  63. ms408-0.1.0/docs/planning/i02/EXPERIMENTS.md +103 -0
  64. ms408-0.1.0/docs/planning/i02/README.md +40 -0
  65. ms408-0.1.0/docs/planning/i02/STATUS.md +62 -0
  66. ms408-0.1.0/docs/planning/i03/E9-preregistration.md +127 -0
  67. ms408-0.1.0/docs/planning/i03/EXPERIMENTS.md +143 -0
  68. ms408-0.1.0/docs/planning/i03/README.md +70 -0
  69. ms408-0.1.0/docs/planning/i03/STATUS.md +45 -0
  70. ms408-0.1.0/docs/planning/i04/EXPERIMENTS.md +60 -0
  71. ms408-0.1.0/docs/planning/i04/README.md +40 -0
  72. ms408-0.1.0/docs/planning/i04/STATUS.md +38 -0
  73. ms408-0.1.0/docs/planning/i05/EXPERIMENTS.md +93 -0
  74. ms408-0.1.0/docs/planning/i05/README.md +51 -0
  75. ms408-0.1.0/docs/planning/i05/STATUS.md +56 -0
  76. ms408-0.1.0/docs/planning/i06/EXPERIMENTS.md +58 -0
  77. ms408-0.1.0/docs/planning/i06/README.md +38 -0
  78. ms408-0.1.0/docs/planning/i06/STATUS.md +38 -0
  79. ms408-0.1.0/docs/planning/i07/EXPERIMENTS.md +50 -0
  80. ms408-0.1.0/docs/planning/i07/README.md +56 -0
  81. ms408-0.1.0/docs/planning/i07/STATUS.md +62 -0
  82. ms408-0.1.0/docs/planning/i08/EXPERIMENTS.md +36 -0
  83. ms408-0.1.0/docs/planning/i08/README.md +41 -0
  84. ms408-0.1.0/docs/planning/i08/STATUS.md +45 -0
  85. ms408-0.1.0/docs/planning/i09/README.md +42 -0
  86. ms408-0.1.0/docs/planning/i09/STATUS.md +44 -0
  87. ms408-0.1.0/docs/planning/i10/EXPERIMENTS.md +73 -0
  88. ms408-0.1.0/docs/planning/i10/README.md +69 -0
  89. ms408-0.1.0/docs/planning/i10/STATUS.md +60 -0
  90. ms408-0.1.0/docs/planning/i11/README.md +54 -0
  91. ms408-0.1.0/docs/planning/i11/STATUS.md +93 -0
  92. ms408-0.1.0/docs/planning/publication-h2-2026/PATHWAYS.md +50 -0
  93. ms408-0.1.0/docs/planning/publication-h2-2026/README.md +60 -0
  94. ms408-0.1.0/docs/planning/publication-h2-2026/SCORING.md +53 -0
  95. ms408-0.1.0/docs/planning/publication-h2-2026/VENUE-LANDSCAPE.md +84 -0
  96. ms408-0.1.0/docs/planning/publication-h2-2026/outreach/voynich-conf-2026-email.md +49 -0
  97. ms408-0.1.0/docs/planning/publication-h2-2026/pathways/alpha/v1.md +53 -0
  98. ms408-0.1.0/docs/planning/publication-h2-2026/pathways/beta/v1.md +52 -0
  99. ms408-0.1.0/docs/planning/publication-h2-2026/pathways/delta/v1.md +68 -0
  100. ms408-0.1.0/docs/planning/publication-h2-2026/pathways/gamma/v1.md +52 -0
  101. ms408-0.1.0/docs/refutations/2026-07-15-e21-positional-generator.md +35 -0
  102. ms408-0.1.0/docs/refutations/2026-07-15-e22-e23-genericity-reuse.md +35 -0
  103. ms408-0.1.0/docs/refutations/2026-07-16-e25-e26-v5-deflation.md +37 -0
  104. ms408-0.1.0/docs/refutations/2026-07-17-e29-naibbe.md +44 -0
  105. ms408-0.1.0/docs/refutations/2026-07-17-methods-paper.md +82 -0
  106. ms408-0.1.0/docs/refutations/2026-07-17-paper-v6.md +48 -0
  107. ms408-0.1.0/docs/refutations/2026-07-22-e33-block-scale-di.md +57 -0
  108. ms408-0.1.0/docs/refutations/README.md +45 -0
  109. ms408-0.1.0/docs/synthesis/FLAGSHIP.md +488 -0
  110. ms408-0.1.0/docs/synthesis/FRAMEWORKS.md +142 -0
  111. ms408-0.1.0/docs/synthesis/T33-critique-log.md +155 -0
  112. ms408-0.1.0/docs/synthesis/TIMELINE.md +101 -0
  113. ms408-0.1.0/examples/README.md +23 -0
  114. ms408-0.1.0/examples/evaluate_naibbe.py +104 -0
  115. ms408-0.1.0/paper/CHANGELOG.md +182 -0
  116. ms408-0.1.0/paper/SUBMISSION.md +130 -0
  117. ms408-0.1.0/paper/make_arxiv_bundle.sh +31 -0
  118. ms408-0.1.0/paper/metadata.yaml +16 -0
  119. ms408-0.1.0/paper/methods/main.tex +340 -0
  120. ms408-0.1.0/paper/methods/refs.bib +159 -0
  121. ms408-0.1.0/paper/methods/v2/main.tex +378 -0
  122. ms408-0.1.0/paper/methods/v2/refs.bib +177 -0
  123. ms408-0.1.0/paper/methods/v3/main.tex +403 -0
  124. ms408-0.1.0/paper/methods/v3/refs.bib +183 -0
  125. ms408-0.1.0/paper/pathways/README.md +30 -0
  126. ms408-0.1.0/paper/pathways/alpha-tacl/main.tex +206 -0
  127. ms408-0.1.0/paper/pathways/alpha-tacl/refs.bib +126 -0
  128. ms408-0.1.0/paper/pathways/beta-lre/main.tex +199 -0
  129. ms408-0.1.0/paper/pathways/beta-lre/refs.bib +183 -0
  130. ms408-0.1.0/paper/pathways/delta-conf/main.tex +92 -0
  131. ms408-0.1.0/paper/pathways/delta-conf/refs.bib +111 -0
  132. ms408-0.1.0/paper/pathways/gamma-dhq/main.tex +164 -0
  133. ms408-0.1.0/paper/pathways/gamma-dhq/refs.bib +119 -0
  134. ms408-0.1.0/paper/v1/main.tex +253 -0
  135. ms408-0.1.0/paper/v1/refs.bib +83 -0
  136. ms408-0.1.0/paper/v2/main.tex +313 -0
  137. ms408-0.1.0/paper/v2/refs.bib +97 -0
  138. ms408-0.1.0/paper/v3/main.tex +400 -0
  139. ms408-0.1.0/paper/v3/refs.bib +97 -0
  140. ms408-0.1.0/paper/v4/main.tex +507 -0
  141. ms408-0.1.0/paper/v4/refs.bib +97 -0
  142. ms408-0.1.0/paper/v5/main.tex +532 -0
  143. ms408-0.1.0/paper/v5/refs.bib +97 -0
  144. ms408-0.1.0/paper/v5b/main.tex +569 -0
  145. ms408-0.1.0/paper/v5b/refs.bib +97 -0
  146. ms408-0.1.0/paper/v6/main.tex +601 -0
  147. ms408-0.1.0/paper/v6/refs.bib +111 -0
  148. ms408-0.1.0/paper/v6b/main.tex +616 -0
  149. ms408-0.1.0/paper/v6b/refs.bib +111 -0
  150. ms408-0.1.0/paper/v7/main.tex +644 -0
  151. ms408-0.1.0/paper/v7/refs.bib +111 -0
  152. ms408-0.1.0/pyproject.toml +77 -0
  153. ms408-0.1.0/reports/.gitkeep +0 -0
  154. ms408-0.1.0/reports/e1_meaning_detector.md +34 -0
  155. ms408-0.1.0/reports/e21_positional_generator.md +31 -0
  156. ms408-0.1.0/reports/e22_generator_genericity.md +25 -0
  157. ms408-0.1.0/reports/e23_reuse_generator.md +23 -0
  158. ms408-0.1.0/reports/e24_typelevel_lexicon.md +18 -0
  159. ms408-0.1.0/reports/e25_decoupled_ed1.md +17 -0
  160. ms408-0.1.0/reports/e26_length_variance.md +17 -0
  161. ms408-0.1.0/reports/e27_symbol_quantification.md +20 -0
  162. ms408-0.1.0/reports/e28_angular_anchor.md +26 -0
  163. ms408-0.1.0/reports/e29_naibbe_discriminators.md +20 -0
  164. ms408-0.1.0/reports/e2_wordorder_confound.md +23 -0
  165. ms408-0.1.0/reports/e30_cipher_reexamination.md +31 -0
  166. ms408-0.1.0/reports/e31_harden_syntax.md +19 -0
  167. ms408-0.1.0/reports/e33_block_scale_di.md +52 -0
  168. ms408-0.1.0/reports/e3_anchor_power.md +28 -0
  169. ms408-0.1.0/reports/e4_root_leaf.md +28 -0
  170. ms408-0.1.0/reports/e5_encoding_fair.md +32 -0
  171. ms408-0.1.0/reports/e6_cipher_reconstruction.md +34 -0
  172. ms408-0.1.0/reports/harness_benchmark.md +55 -0
  173. ms408-0.1.0/reports/replication_report.md +74 -0
  174. ms408-0.1.0/reports/study_anchor_hunt.md +44 -0
  175. ms408-0.1.0/reports/study_anchor_labels.md +36 -0
  176. ms408-0.1.0/reports/study_encoding_bracket.md +30 -0
  177. ms408-0.1.0/reports/study_morphology.md +30 -0
  178. ms408-0.1.0/reports/study_p1_variants.md +37 -0
  179. ms408-0.1.0/reports/study_referential_realism.md +39 -0
  180. ms408-0.1.0/reports/study_topics.md +33 -0
  181. ms408-0.1.0/reports/synthesis_competing_narratives.md +102 -0
  182. ms408-0.1.0/results/.gitkeep +0 -0
  183. ms408-0.1.0/results/annotations/archive/t13_annotations_v0.1-coarse.jsonl +227 -0
  184. ms408-0.1.0/results/annotations/archive/t13_qa_v0.1-coarse.json +455 -0
  185. ms408-0.1.0/results/annotations/t13_manifest.json +9 -0
  186. ms408-0.1.0/results/annotations/t13_qa.json +410 -0
  187. ms408-0.1.0/results/experiments/e10_haiku_annotations.jsonl +129 -0
  188. ms408-0.1.0/results/experiments/e12_openai_annotations.jsonl +129 -0
  189. ms408-0.1.0/results/experiments/e4b_opus_annotations.jsonl +129 -0
  190. ms408-0.1.0/results/harness/benchmark.json +981 -0
  191. ms408-0.1.0/results/replication/measurements.json +172 -0
  192. ms408-0.1.0/results/replication/replication.json +840 -0
  193. ms408-0.1.0/results/studies/anchor_hunt.json +194 -0
  194. ms408-0.1.0/results/studies/anchor_labels.json +124 -0
  195. ms408-0.1.0/results/studies/encoding_bracket.json +140 -0
  196. ms408-0.1.0/results/studies/morphology.json +935 -0
  197. ms408-0.1.0/results/studies/p1_variants.json +296 -0
  198. ms408-0.1.0/results/studies/referential_realism.json +136 -0
  199. ms408-0.1.0/results/studies/topics.json +127 -0
  200. ms408-0.1.0/scripts/load-env.sh +14 -0
  201. ms408-0.1.0/site/.gitignore +8 -0
  202. ms408-0.1.0/site/README.md +38 -0
  203. ms408-0.1.0/site/astro.config.mjs +22 -0
  204. ms408-0.1.0/site/package-lock.json +5669 -0
  205. ms408-0.1.0/site/package.json +22 -0
  206. ms408-0.1.0/site/public/CNAME +1 -0
  207. ms408-0.1.0/site/public/papers/adversarial-self-correction.pdf +0 -0
  208. ms408-0.1.0/site/public/papers/constraint-envelope.pdf +0 -0
  209. ms408-0.1.0/site/scripts/build-font.mjs +131 -0
  210. ms408-0.1.0/site/scripts/build-papers.sh +20 -0
  211. ms408-0.1.0/site/scripts/sync-content.mjs +68 -0
  212. ms408-0.1.0/site/src/components/BalneoBathers.astro +42 -0
  213. ms408-0.1.0/site/src/components/BalneoPool.astro +30 -0
  214. ms408-0.1.0/site/src/components/BalneoTubes.astro +26 -0
  215. ms408-0.1.0/site/src/components/BotanicalDivider.astro +30 -0
  216. ms408-0.1.0/site/src/components/Frame.astro +36 -0
  217. ms408-0.1.0/site/src/components/GlyphFrieze.astro +30 -0
  218. ms408-0.1.0/site/src/components/HerbalSprig.astro +41 -0
  219. ms408-0.1.0/site/src/components/Rosette.astro +30 -0
  220. ms408-0.1.0/site/src/components/RosettesFoldout.astro +49 -0
  221. ms408-0.1.0/site/src/config.ts +14 -0
  222. ms408-0.1.0/site/src/content/activities/is-it-a-language.md +66 -0
  223. ms408-0.1.0/site/src/content/activities/make-and-test-a-cipher.md +62 -0
  224. ms408-0.1.0/site/src/content/activities/observe-like-a-scholar.md +53 -0
  225. ms408-0.1.0/site/src/content.config.ts +33 -0
  226. ms408-0.1.0/site/src/data/media.json +45 -0
  227. ms408-0.1.0/site/src/data/papers.json +28 -0
  228. ms408-0.1.0/site/src/data/timeline.json +64 -0
  229. ms408-0.1.0/site/src/layouts/Base.astro +76 -0
  230. ms408-0.1.0/site/src/pages/about.astro +65 -0
  231. ms408-0.1.0/site/src/pages/balneo/index.astro +68 -0
  232. ms408-0.1.0/site/src/pages/cite.astro +42 -0
  233. ms408-0.1.0/site/src/pages/docs/[...slug].astro +26 -0
  234. ms408-0.1.0/site/src/pages/docs/index.astro +21 -0
  235. ms408-0.1.0/site/src/pages/index.astro +67 -0
  236. ms408-0.1.0/site/src/pages/library/activities/[...slug].astro +41 -0
  237. ms408-0.1.0/site/src/pages/library/index.astro +75 -0
  238. ms408-0.1.0/site/src/pages/library/submit.astro +46 -0
  239. ms408-0.1.0/site/src/pages/media/index.astro +97 -0
  240. ms408-0.1.0/site/src/pages/papers/index.astro +32 -0
  241. ms408-0.1.0/site/src/pages/robots.txt.ts +17 -0
  242. ms408-0.1.0/site/src/pages/timeline/index.astro +81 -0
  243. ms408-0.1.0/site/src/styles/global.css +174 -0
  244. ms408-0.1.0/site/src/styles/theme-ms408.css +148 -0
  245. ms408-0.1.0/site/tsconfig.json +5 -0
  246. ms408-0.1.0/src/ms408/__init__.py +18 -0
  247. ms408-0.1.0/src/ms408/__main__.py +45 -0
  248. ms408-0.1.0/src/ms408/acquire.py +64 -0
  249. ms408-0.1.0/src/ms408/annotate/__init__.py +6 -0
  250. ms408-0.1.0/src/ms408/annotate/pipeline.py +223 -0
  251. ms408-0.1.0/src/ms408/annotate/qa.py +204 -0
  252. ms408-0.1.0/src/ms408/annotate/schema.py +217 -0
  253. ms408-0.1.0/src/ms408/benchmark.py +245 -0
  254. ms408-0.1.0/src/ms408/data/__init__.py +7 -0
  255. ms408-0.1.0/src/ms408/data/reference_bands.json +122 -0
  256. ms408-0.1.0/src/ms408/dataset.py +97 -0
  257. ms408-0.1.0/src/ms408/env.py +46 -0
  258. ms408-0.1.0/src/ms408/experiments/__init__.py +5 -0
  259. ms408-0.1.0/src/ms408/experiments/e10_third_rater.py +312 -0
  260. ms408-0.1.0/src/ms408/experiments/e11_style_control.py +184 -0
  261. ms408-0.1.0/src/ms408/experiments/e12_independent_rater.py +446 -0
  262. ms408-0.1.0/src/ms408/experiments/e13_function_content.py +290 -0
  263. ms408-0.1.0/src/ms408/experiments/e13b_function_content.py +181 -0
  264. ms408-0.1.0/src/ms408/experiments/e13c_function_content_corrected.py +156 -0
  265. ms408-0.1.0/src/ms408/experiments/e13d_band_robustness.py +169 -0
  266. ms408-0.1.0/src/ms408/experiments/e14_word_classes.py +210 -0
  267. ms408-0.1.0/src/ms408/experiments/e14b_word_class_robustness.py +166 -0
  268. ms408-0.1.0/src/ms408/experiments/e15_morphology.py +206 -0
  269. ms408-0.1.0/src/ms408/experiments/e15b_morphology_corrected.py +167 -0
  270. ms408-0.1.0/src/ms408/experiments/e17_ab_contrast.py +168 -0
  271. ms408-0.1.0/src/ms408/experiments/e18_corpus_completeness.py +107 -0
  272. ms408-0.1.0/src/ms408/experiments/e19_joint_signature.py +187 -0
  273. ms408-0.1.0/src/ms408/experiments/e19b_language_universality.py +139 -0
  274. ms408-0.1.0/src/ms408/experiments/e1_meaning_detector.py +253 -0
  275. ms408-0.1.0/src/ms408/experiments/e20_transposition_closure.py +148 -0
  276. ms408-0.1.0/src/ms408/experiments/e21_positional_generator.py +408 -0
  277. ms408-0.1.0/src/ms408/experiments/e22_generator_genericity.py +273 -0
  278. ms408-0.1.0/src/ms408/experiments/e23_reuse_generator.py +294 -0
  279. ms408-0.1.0/src/ms408/experiments/e24_typelevel_lexicon.py +287 -0
  280. ms408-0.1.0/src/ms408/experiments/e25_decoupled_ed1.py +359 -0
  281. ms408-0.1.0/src/ms408/experiments/e26_length_variance.py +277 -0
  282. ms408-0.1.0/src/ms408/experiments/e27_symbol_quantification.py +228 -0
  283. ms408-0.1.0/src/ms408/experiments/e28_angular_anchor.py +350 -0
  284. ms408-0.1.0/src/ms408/experiments/e29_naibbe_discriminators.py +265 -0
  285. ms408-0.1.0/src/ms408/experiments/e2_wordorder_confound.py +282 -0
  286. ms408-0.1.0/src/ms408/experiments/e30_cipher_reexamination.py +223 -0
  287. ms408-0.1.0/src/ms408/experiments/e31_harden_syntax.py +264 -0
  288. ms408-0.1.0/src/ms408/experiments/e32_reference_bands.py +158 -0
  289. ms408-0.1.0/src/ms408/experiments/e33_block_scale_di.py +281 -0
  290. ms408-0.1.0/src/ms408/experiments/e3_anchor_power.py +269 -0
  291. ms408-0.1.0/src/ms408/experiments/e4_root_leaf.py +282 -0
  292. ms408-0.1.0/src/ms408/experiments/e4b_reannotate.py +263 -0
  293. ms408-0.1.0/src/ms408/experiments/e5_encoding_fair.py +565 -0
  294. ms408-0.1.0/src/ms408/experiments/e6_cipher_reconstruction.py +338 -0
  295. ms408-0.1.0/src/ms408/experiments/e7_fine_anchor.py +305 -0
  296. ms408-0.1.0/src/ms408/experiments/e8_whitened_bracket.py +332 -0
  297. ms408-0.1.0/src/ms408/experiments/e9_vms_coordinate.py +204 -0
  298. ms408-0.1.0/src/ms408/experiments/mid_level_null.py +42 -0
  299. ms408-0.1.0/src/ms408/h4.py +270 -0
  300. ms408-0.1.0/src/ms408/harness/__init__.py +1 -0
  301. ms408-0.1.0/src/ms408/harness/naibbe.py +303 -0
  302. ms408-0.1.0/src/ms408/harness/selfcitation.py +1221 -0
  303. ms408-0.1.0/src/ms408/ivtff.py +184 -0
  304. ms408-0.1.0/src/ms408/mz.py +107 -0
  305. ms408-0.1.0/src/ms408/replication.py +798 -0
  306. ms408-0.1.0/src/ms408/scanmap.py +84 -0
  307. ms408-0.1.0/src/ms408/scans.py +123 -0
  308. ms408-0.1.0/src/ms408/signature.py +257 -0
  309. ms408-0.1.0/src/ms408/sources.py +151 -0
  310. ms408-0.1.0/src/ms408/studies/__init__.py +1 -0
  311. ms408-0.1.0/src/ms408/studies/anchor_hunt.py +363 -0
  312. ms408-0.1.0/src/ms408/studies/anchor_labels.py +276 -0
  313. ms408-0.1.0/src/ms408/studies/encoding.py +335 -0
  314. ms408-0.1.0/src/ms408/studies/morphology.py +373 -0
  315. ms408-0.1.0/src/ms408/studies/referential_realism.py +331 -0
  316. ms408-0.1.0/src/ms408/studies/topics.py +374 -0
  317. ms408-0.1.0/src/ms408/studies/variants.py +428 -0
  318. ms408-0.1.0/src/ms408/synthesis/__init__.py +5 -0
  319. ms408-0.1.0/src/ms408/synthesis/narratives.py +259 -0
  320. ms408-0.1.0/src/ms408/synthesis/registry.py +213 -0
  321. ms408-0.1.0/src/ms408/textstats.py +145 -0
  322. ms408-0.1.0/src/ms408/verify.py +109 -0
  323. ms408-0.1.0/tests/.gitkeep +0 -0
  324. ms408-0.1.0/tests/test_anchor_hunt.py +77 -0
  325. ms408-0.1.0/tests/test_anchor_labels.py +40 -0
  326. ms408-0.1.0/tests/test_annotate_schema.py +52 -0
  327. ms408-0.1.0/tests/test_dataset.py +32 -0
  328. ms408-0.1.0/tests/test_e1.py +35 -0
  329. ms408-0.1.0/tests/test_e2.py +45 -0
  330. ms408-0.1.0/tests/test_e3.py +28 -0
  331. ms408-0.1.0/tests/test_e4.py +24 -0
  332. ms408-0.1.0/tests/test_encoding.py +56 -0
  333. ms408-0.1.0/tests/test_env.py +32 -0
  334. ms408-0.1.0/tests/test_h4.py +95 -0
  335. ms408-0.1.0/tests/test_ivtff.py +124 -0
  336. ms408-0.1.0/tests/test_morphology.py +60 -0
  337. ms408-0.1.0/tests/test_mz.py +103 -0
  338. ms408-0.1.0/tests/test_naibbe.py +128 -0
  339. ms408-0.1.0/tests/test_qa_scoring.py +51 -0
  340. ms408-0.1.0/tests/test_referential_realism.py +53 -0
  341. ms408-0.1.0/tests/test_replication.py +72 -0
  342. ms408-0.1.0/tests/test_scanmap.py +41 -0
  343. ms408-0.1.0/tests/test_selfcitation.py +184 -0
  344. ms408-0.1.0/tests/test_signature.py +120 -0
  345. ms408-0.1.0/tests/test_synthesis.py +43 -0
  346. ms408-0.1.0/tests/test_textstats.py +86 -0
  347. ms408-0.1.0/tests/test_topics.py +63 -0
  348. ms408-0.1.0/tests/test_verify.py +81 -0
  349. ms408-0.1.0/theme-kit/README.md +67 -0
  350. ms408-0.1.0/theme-kit/bootstrap/_ms408-variables.scss +42 -0
  351. ms408-0.1.0/theme-kit/demo.html +95 -0
  352. ms408-0.1.0/theme-kit/font/ms408-dingbats.css +37 -0
  353. ms408-0.1.0/theme-kit/font/ms408-dingbats.otf +0 -0
  354. ms408-0.1.0/theme-kit/font/specimen.json +82 -0
  355. ms408-0.1.0/theme-kit/motifs/balneo-bathers.svg +1 -0
  356. ms408-0.1.0/theme-kit/motifs/balneo-pool.svg +12 -0
  357. ms408-0.1.0/theme-kit/motifs/balneo-tubes.svg +11 -0
  358. ms408-0.1.0/theme-kit/motifs/botanical-divider.svg +12 -0
  359. ms408-0.1.0/theme-kit/motifs/glyph-frieze.svg +11 -0
  360. ms408-0.1.0/theme-kit/motifs/herbal-sprig.svg +19 -0
  361. ms408-0.1.0/theme-kit/motifs/rosette.svg +22 -0
  362. ms408-0.1.0/theme-kit/motifs/rosettes-foldout.svg +1 -0
  363. ms408-0.1.0/theme-kit/package.json +12 -0
  364. ms408-0.1.0/theme-kit/tokens.css +39 -0
  365. ms408-0.1.0/theme-kit/wordpress/theme.json +42 -0
@@ -0,0 +1,87 @@
1
+ ---
2
+ name: package-paper
3
+ description: Package the current MS408 research state into a versioned LaTeX/arXiv preprint (PDF). Reads FLAGSHIP.md + results/ + reports/, assembles a graded paper snapshot, compiles to PDF. Re-run each iteration to re-release. Invoke when the user asks to build/update the paper, cut a preprint, or package research for peer feedback.
4
+ ---
5
+
6
+ # package-paper — MS408 preprint packaging
7
+
8
+ Turn the program's current, already-graded synthesis into a self-contained
9
+ LaTeX/arXiv preprint PDF. This is a **re-releasable** snapshot: run it at the end of
10
+ any iteration to produce the next version. It does NOT do new analysis — it packages
11
+ what is already firewall-verified.
12
+
13
+ ## Binding rules (inherit the program's discipline)
14
+
15
+ - **Firewall (L3).** Every number in the paper is copied from `results/**/*.json` or a
16
+ `reports/*.md` table — never estimated or recalled. If a needed number isn't in
17
+ `results/`, stop and say so; do not invent it.
18
+ - **Evidence grading (L6).** Carry the A–D grade on every claim, exactly as graded in
19
+ `docs/synthesis/FLAGSHIP.md`. Do not upgrade a claim to make the paper stronger.
20
+ - **No translation / no over-reach (L7).** No decipherment, plaintext, or real-taxon
21
+ claims. The paper's thesis is the *constraint envelope* + the *method*, not meaning.
22
+ - **Scope = the latest COMPLETED iteration.** Anything still in flight → "Future Work".
23
+ - **Honesty is the selling point.** The self-correction record (refutation passes
24
+ overturning the program's own conclusions) is a headline contribution, not an
25
+ embarrassment — report it plainly.
26
+
27
+ ## Inputs (read in this order)
28
+
29
+ 1. `docs/synthesis/FLAGSHIP.md` — the primary content source; it is already the
30
+ graded, refutation-passed synthesis. The paper is essentially a formatted,
31
+ citation-backed rendering of it.
32
+ 2. `docs/planning/i0*/STATUS.md` — per-experiment verdicts and grades.
33
+ 3. `results/experiments/*.json` and `results/**/*.json` — exact numbers (cite the
34
+ producing script + the value; spot-check that FLAGSHIP's numbers match the JSON).
35
+ 4. `reports/*.md` — human-readable per-study tables for figures/appendix.
36
+ 5. `paper/metadata.yaml` — title, authors, affiliations, venue, keywords (create from
37
+ `.claude/skills/package-paper/assets/metadata.example.yaml` if missing; if author
38
+ fields are placeholders, compile anyway and WARN the user to fill them).
39
+
40
+ ## Procedure
41
+
42
+ 1. **Determine version.** Next `paper/vN/` (v1 if none). Read `paper/metadata.yaml`
43
+ for `version` override; else N = highest existing + 1.
44
+ 2. **Assemble `paper/vN/main.tex`** from the template
45
+ (`.claude/skills/package-paper/assets/template.tex`), filling:
46
+ - **Abstract** — the honest headline from FLAGSHIP: a genuine constrained two-system
47
+ script; meaning underdetermined and *provably* so with current statistics; the
48
+ one positive lead (root↔leaf) unresolved/underpowered; the method (harness +
49
+ firewall + adversarial self-correction) as the transferable contribution.
50
+ - **1 Introduction** — the manuscript; why prior decipherment claims fail; the
51
+ program's stance (shrink the constraint envelope, every claim graded; decipherment
52
+ is NOT the goal).
53
+ - **2 Data & Transliteration** — Beinecke MS 408; EVA (Zandbergen–Landini) primary,
54
+ v101 sensitivity; Currier A/B; Fagin Davis hands; the annotation pipeline.
55
+ - **3 Method: harness, firewall, adversarial refutation** — H1–H4 controls; the
56
+ replication gate; deterministic code→results→reports; evidence grades A–D; the
57
+ standing clean-context refutation pass. This section is the methodological
58
+ contribution; make it concrete.
59
+ - **4 Results** — grouped as in FLAGSHIP §1–§3: (a) established [A] facts
60
+ (entropy anomaly, A/B split, positional grammar, replication gate, ED1 network);
61
+ (b) disfavoured [C] (no lexical herbal naming system; verbose ciphers excluded,
62
+ abjad revived); (c) not established / underdetermined (meaning not localizable —
63
+ E9; no encoding family distinguished — E5/E8); (d) the root↔leaf arc E4→E12 →
64
+ UNRESOLVED-underpowered. Every subsection cites exact numbers from `results/`.
65
+ - **5 Discussion** — meaning-vs-meaningless is underdetermined and E9 shows *why*
66
+ (structure statistics ≠ meaning detectors); the abjad revival; the self-
67
+ correction meta-result (list the overturned own-conclusions).
68
+ - **6 Limitations** — annotation noise (leaf κ≈0.45), model-lineage dependence,
69
+ single-corpus power limits, EVA-dependence (v101 sensitivity).
70
+ - **7 Future Work** — everything post-scope: the human-panel root↔leaf adjudication;
71
+ the i05 mid-level linguistic program (morphology, word-classes, function/content
72
+ bimodality) with A/B stratification; abjad joint-signature test; second cross-
73
+ vendor rater.
74
+ - **References** — use `assets/refs.bib`; add any missing key works; mark any
75
+ citation whose details you could not verify with a `% UNVERIFIED` comment.
76
+ 3. **Copy** `assets/refs.bib` → `paper/vN/refs.bib`; copy any figures.
77
+ 4. **Compile:** `cd paper/vN && latexmk -pdf -interaction=nonstopmode main.tex`
78
+ (fallback: two `pdflatex` passes + `bibtex`). Fix LaTeX errors and recompile.
79
+ 5. **Verify & report:** confirm `paper/vN/main.pdf` exists and page count > 0; list
80
+ any `% UNVERIFIED` citations and placeholder metadata; print the version + path.
81
+ Do NOT auto-send anywhere (publishing is a user decision).
82
+
83
+ ## Re-release
84
+
85
+ Each run writes a new `paper/vN/`; prior versions are immutable. Bump the version in
86
+ `paper/metadata.yaml` or let the skill auto-increment. A changelog line per version
87
+ lives in `paper/CHANGELOG.md` (create/append).
@@ -0,0 +1,15 @@
1
+ # Copy to paper/metadata.yaml and fill in. The package-paper skill reads this.
2
+ title: "Shrinking the Constraint Envelope of the Voynich Manuscript: A Firewall-Disciplined, Self-Correcting Computational Program"
3
+ authors:
4
+ - "FILL IN — e.g. Tim <Surname>"
5
+ affiliations:
6
+ - "FILL IN — affiliation / independent researcher"
7
+ contact: "tim@mims.ms"
8
+ keywords:
9
+ - "Voynich Manuscript"
10
+ - "computational philology"
11
+ - "constraint-based analysis"
12
+ - "adversarial validation"
13
+ - "evidence grading"
14
+ venue: "arXiv preprint" # or a target venue name
15
+ version: auto # 'auto' -> next vN; or pin e.g. v1
@@ -0,0 +1,83 @@
1
+ % Seed bibliography for MS408 preprints. Details for well-known works are standard;
2
+ % VERIFY volume/page/year before submission. Add new refs as the program cites them.
3
+
4
+ @article{montemurro2013keywords,
5
+ title = {Keywords and Co-Occurrence Patterns in the Voynich Manuscript: An Information-Theoretic Analysis},
6
+ author = {Montemurro, Marcelo A. and Zanette, Damian H.},
7
+ journal = {PLoS ONE},
8
+ volume = {8}, number = {6}, pages = {e66344}, year = {2013},
9
+ doi = {10.1371/journal.pone.0066344}
10
+ }
11
+
12
+ @article{bowern2021linguistics,
13
+ title = {The Linguistics of the Voynich Manuscript},
14
+ author = {Bowern, Claire L. and Lindemann, Luke},
15
+ journal = {Annual Review of Linguistics},
16
+ volume = {7}, pages = {285--308}, year = {2021},
17
+ doi = {10.1146/annurev-linguistics-011619-030613}
18
+ }
19
+
20
+ @article{reddy2011know,
21
+ title = {What We Know About the Voynich Manuscript},
22
+ author = {Reddy, Sravana and Knight, Kevin},
23
+ journal = {Proceedings of the 5th ACL-HLT Workshop on Language Technology for Cultural Heritage, Social Sciences, and Humanities (LaTeCH)},
24
+ pages = {78--86}, year = {2011}
25
+ }
26
+
27
+ @article{hauer2016decoding,
28
+ title = {Decoding Anagrammed Texts Written in an Unknown Language and Script},
29
+ author = {Hauer, Bradley and Kondrak, Grzegorz},
30
+ journal = {Transactions of the Association for Computational Linguistics},
31
+ volume = {4}, pages = {75--86}, year = {2016}
32
+ }
33
+
34
+ @techreport{currier1976,
35
+ title = {Papers on the Voynich Manuscript},
36
+ author = {Currier, Prescott H.},
37
+ institution = {Unpublished; collected in the New Signals seminars},
38
+ year = {1976},
39
+ note = {Origin of the Currier A/B language distinction. % UNVERIFIED details}
40
+ }
41
+
42
+ @book{dimperio1978elegant,
43
+ title = {The Voynich Manuscript: An Elegant Enigma},
44
+ author = {D'Imperio, Mary E.},
45
+ publisher = {National Security Agency / Aegean Park Press},
46
+ year = {1978}
47
+ }
48
+
49
+ @misc{fagindavis2020hands,
50
+ title = {How Many Glyphs and How Many Scribes? Digital Paleography and the Voynich Manuscript},
51
+ author = {Fagin Davis, Lisa},
52
+ year = {2020},
53
+ note = {Manuscript Studies; identification of multiple scribal hands. % UNVERIFIED details}
54
+ }
55
+
56
+ @misc{zandbergen_voynichnu,
57
+ title = {The Voynich Manuscript ({voynich.nu})},
58
+ author = {Zandbergen, Ren\'e},
59
+ year = {2024},
60
+ note = {EVA and ZL transliterations; IVTFF format. \url{https://www.voynich.nu}}
61
+ }
62
+
63
+ @misc{timm2020selfcitation,
64
+ title = {The Voynich Manuscript: Symbol Roots, Features, and a Self-Citation Generative Method},
65
+ author = {Timm, Torsten and Schinner, Andreas},
66
+ year = {2020},
67
+ note = {Self-citation / auto-copying generation hypothesis. % UNVERIFIED details}
68
+ }
69
+
70
+ @misc{stolfi_grammar,
71
+ title = {A Prefix-Midfix-Suffix Grammar for Voynichese Words},
72
+ author = {Stolfi, Jorge},
73
+ year = {2000},
74
+ note = {Word-structure ``crust-mantle-core'' model. \url{https://www.ic.unicamp.br/~stolfi/voynich/}}
75
+ }
76
+
77
+ @article{lindemann2022entropy,
78
+ title = {Character Entropy and the Voynich Manuscript},
79
+ author = {Lindemann, Luke and Bowern, Claire L.},
80
+ journal = {Working paper},
81
+ year = {2022},
82
+ note = {Conditional character entropy (h1/h2) with spaces. % UNVERIFIED details}
83
+ }
@@ -0,0 +1,66 @@
1
+ % MS408 preprint template (arXiv-style, self-contained; compiles with pdflatex).
2
+ % Placeholders in <ANGLE BRACKETS> are filled by the package-paper skill.
3
+ \documentclass[11pt]{article}
4
+
5
+ \usepackage[utf8]{inputenc}
6
+ \usepackage[T1]{fontenc}
7
+ \usepackage{lmodern}
8
+ \usepackage[margin=1in]{geometry}
9
+ \usepackage{microtype}
10
+ \usepackage{amsmath,amssymb}
11
+ \usepackage{booktabs}
12
+ \usepackage{graphicx}
13
+ \usepackage{xcolor}
14
+ \usepackage{enumitem}
15
+ \usepackage[hidelinks]{hyperref}
16
+ \usepackage{natbib}
17
+ \usepackage{titlesec}
18
+ \titleformat{\section}{\normalfont\large\bfseries}{\thesection}{0.6em}{}
19
+
20
+ % Evidence-grade tag, e.g. \grade{A}
21
+ \newcommand{\grade}[1]{{\small\textbf{[Grade #1]}}}
22
+
23
+ \title{\textbf{<TITLE>}}
24
+ \author{<AUTHORS> \\ \small <AFFILIATIONS> \\ \small \texttt{<CONTACT>}}
25
+ \date{Preprint <VERSION> --- <DATE>}
26
+
27
+ \begin{document}
28
+ \maketitle
29
+
30
+ \begin{abstract}
31
+ \noindent <ABSTRACT>
32
+ \end{abstract}
33
+
34
+ \noindent\textbf{Keywords:} <KEYWORDS>
35
+
36
+ \section{Introduction}
37
+ <INTRODUCTION>
38
+
39
+ \section{Data and Transliteration}
40
+ <DATA>
41
+
42
+ \section{Method: Harness, Firewall, and Adversarial Refutation}
43
+ <METHOD>
44
+
45
+ \section{Results}
46
+ <RESULTS>
47
+
48
+ \section{Discussion}
49
+ <DISCUSSION>
50
+
51
+ \section{Limitations}
52
+ <LIMITATIONS>
53
+
54
+ \section{Future Work}
55
+ <FUTUREWORK>
56
+
57
+ \section*{Reproducibility}
58
+ All statistics are produced by deterministic, versioned code (fixed seeds) writing
59
+ machine-readable JSON to \texttt{results/}; every reported number records its
60
+ producing script, git commit, dataset version, and parameters. Source and data-
61
+ processing code accompany this preprint.
62
+
63
+ \bibliographystyle{plainnat}
64
+ \bibliography{refs}
65
+
66
+ \end{document}
@@ -0,0 +1,13 @@
1
+ # Copy to .env (which is gitignored) and fill in real values. NEVER commit real keys.
2
+ # These are needed ONLY for the optional vision-annotation / cross-rater track
3
+ # (the `[vision]` extra). The core evaluator — ms408.evaluate / the CLI / verify —
4
+ # needs NO keys and makes no network calls.
5
+
6
+ # Anthropic — vision annotation pipeline (ms408.annotate, e4b, e10)
7
+ ANTHROPIC_API_KEY=sk-ant-your-key-here
8
+
9
+ # OpenAI — cross-vendor independent rater (e12, "openai")
10
+ OPENAI_API_KEY=sk-proj-your-key-here
11
+
12
+ # Google — cross-vendor independent rater (e12, "gemini")
13
+ GOOGLE_API_KEY=your-google-api-key-here
@@ -0,0 +1,91 @@
1
+ name: Guided activity submission
2
+ description: Submit a guided activity for the library/education portal. Educators only; must be classroom-tested.
3
+ title: "[activity] "
4
+ labels: ["activity-submission"]
5
+ body:
6
+ - type: markdown
7
+ attributes:
8
+ value: |
9
+ Thanks for contributing! Two requirements keep this collection trustworthy:
10
+ **(1)** you are an educational practitioner, and **(2)** you have run this activity
11
+ with real learners. Please answer honestly — untested ideas can't be published.
12
+ - type: dropdown
13
+ id: practitioner
14
+ attributes:
15
+ label: Are you an educational practitioner?
16
+ description: Required. Roughly — do you work with learners?
17
+ options:
18
+ - Teacher (K–12)
19
+ - Librarian
20
+ - Museum / informal educator
21
+ - Homeschool educator
22
+ - Tutor / after-school
23
+ - University / college educator
24
+ - Other educator
25
+ validations:
26
+ required: true
27
+ - type: checkboxes
28
+ id: qualify
29
+ attributes:
30
+ label: Required confirmations
31
+ options:
32
+ - label: I have run this activity with a real class or group of learners (at least once).
33
+ required: true
34
+ - label: I can describe how it went and what I would change.
35
+ required: true
36
+ - label: I agree to license the submitted activity under CC BY 4.0 so others can use it.
37
+ required: true
38
+ - type: input
39
+ id: title
40
+ attributes:
41
+ label: Activity title
42
+ validations:
43
+ required: true
44
+ - type: input
45
+ id: ages
46
+ attributes:
47
+ label: Age range
48
+ placeholder: "e.g. 8–12"
49
+ validations:
50
+ required: true
51
+ - type: input
52
+ id: duration
53
+ attributes:
54
+ label: Duration
55
+ placeholder: "e.g. 30–45 min"
56
+ validations:
57
+ required: true
58
+ - type: textarea
59
+ id: summary
60
+ attributes:
61
+ label: One-paragraph summary
62
+ description: What learners do and take away.
63
+ validations:
64
+ required: true
65
+ - type: textarea
66
+ id: objectives
67
+ attributes:
68
+ label: Learning goals (one per line)
69
+ validations:
70
+ required: true
71
+ - type: textarea
72
+ id: materials
73
+ attributes:
74
+ label: Materials (one per line)
75
+ - type: textarea
76
+ id: steps
77
+ attributes:
78
+ label: Step-by-step instructions
79
+ validations:
80
+ required: true
81
+ - type: textarea
82
+ id: classroom_experience
83
+ attributes:
84
+ label: How did it go with real learners?
85
+ description: The group/setting, what worked, and what you would change. This is how we know it's tested.
86
+ validations:
87
+ required: true
88
+ - type: input
89
+ id: credit
90
+ attributes:
91
+ label: Name / affiliation for credit (optional)
@@ -0,0 +1,23 @@
1
+ ---
2
+ name: Bug report
3
+ about: Something in the toolkit is broken or behaves incorrectly
4
+ title: "[bug] "
5
+ labels: bug
6
+ ---
7
+
8
+ **What happened**
9
+ <!-- and what you expected instead -->
10
+
11
+ **To reproduce**
12
+ ```
13
+ # exact command / code, e.g. python -m ms408 my_tokens.txt
14
+ ```
15
+
16
+ **Environment**
17
+ - ms408 version / commit:
18
+ - Python version:
19
+ - OS:
20
+
21
+ **Reproducibility check (if relevant)**
22
+ - [ ] `python -m ms408.verify` output:
23
+ - [ ] Did the input have at least 1000 tokens? (the evaluator refuses shorter streams — see docs/LIMITS.md)
@@ -0,0 +1,8 @@
1
+ blank_issues_enabled: true
2
+ contact_links:
3
+ - name: Read the limits first
4
+ url: https://github.com/DireLabs/ms408/blob/main/docs/LIMITS.md
5
+ about: "Most 'unexpected verdict' questions are answered here — matching is necessary, not sufficient."
6
+ - name: Security issue
7
+ url: https://github.com/DireLabs/ms408/blob/main/SECURITY.md
8
+ about: "Please report security issues privately, not as a public issue."
@@ -0,0 +1,20 @@
1
+ ---
2
+ name: Hypothesis / evaluation question
3
+ about: A question about evaluating a hypothesis, or an unexpected verdict
4
+ title: "[eval] "
5
+ labels: question
6
+ ---
7
+
8
+ **Your hypothesis**
9
+ <!-- e.g. "my generator output should match the manuscript" / "is this cipher scheme excluded?" -->
10
+
11
+ **What the evaluator reported**
12
+ <!-- paste the `python -m ms408 --json ...` verdict, or the hard/soft axis counts -->
13
+
14
+ **What's confusing / what you expected**
15
+ <!-- Remember: matching the bands is NECESSARY, not SUFFICIENT. Out-of-band on a CONFOUNDED
16
+ axis (dI, *_global) or an ADVISORY axis (ttr) is not exclusion — see docs/LIMITS.md and the
17
+ Naibbe worked example (examples/evaluate_naibbe.py). -->
18
+
19
+ **Token budget**
20
+ - Number of tokens evaluated (bands are built at 10,000; below ~8,000 axes aren't strictly comparable):
@@ -0,0 +1,32 @@
1
+ <!-- Thanks for contributing. This project runs on a firewall discipline (see CONTRIBUTING.md);
2
+ the checklist below is that discipline at the door. -->
3
+
4
+ ## What this PR does
5
+
6
+ <!-- one or two sentences -->
7
+
8
+ ## Discipline checklist
9
+
10
+ - [ ] **Firewall:** every reported number is produced by deterministic, versioned code
11
+ writing to `results/` — none hand-entered, estimated, or recalled.
12
+ - [ ] **Determinism:** fixed seeds; no wall-clock/randomness in reported computations. The
13
+ result reproduces from committed code + acquired data.
14
+ - [ ] **Evidence grade:** any empirical claim states its grade (A–D). I have not raised a
15
+ grade to make a result look stronger.
16
+ - [ ] **No decipherment / meaning claims (L7).** This PR makes no plaintext/meaning/symbol-value
17
+ claim; "matches the manuscript" is treated as necessary, not sufficient.
18
+ - [ ] **Data (L19):** no third-party corpora committed; any new source is added to
19
+ `ms408.sources` pinned by URL + sha256 + licence note.
20
+ - [ ] **Tests:** added/updated. If I changed a reported number or an axis definition, I
21
+ rebuilt the reference bands and re-pinned `tests/test_verify.py`, and
22
+ `python -m ms408.verify --full` passes.
23
+ - [ ] `ruff check src tests examples` and `pytest -q` pass locally.
24
+
25
+ ## Adversarial check (for A/B-grade claims)
26
+
27
+ <!-- If this PR asserts a strong empirical claim, describe (or link) the clean-context
28
+ refutation it survived, per docs/METHODOLOGY.md. -->
29
+
30
+ ## Notes / limitations
31
+
32
+ <!-- Be honest about what this does NOT establish. An accurately-scoped negative is welcome. -->
@@ -0,0 +1,59 @@
1
+ name: ci
2
+
3
+ on:
4
+ push:
5
+ branches: [main]
6
+ pull_request:
7
+
8
+ permissions:
9
+ contents: read
10
+
11
+ concurrency:
12
+ group: ci-${{ github.ref }}
13
+ cancel-in-progress: true
14
+
15
+ jobs:
16
+ test:
17
+ runs-on: ubuntu-latest
18
+ strategy:
19
+ fail-fast: false
20
+ matrix:
21
+ python-version: ["3.11", "3.12", "3.13"]
22
+ steps:
23
+ - uses: actions/checkout@v4
24
+ - uses: actions/setup-python@v5
25
+ with:
26
+ python-version: ${{ matrix.python-version }}
27
+ cache: pip
28
+ - name: Install (core + dev)
29
+ run: pip install -e ".[dev]"
30
+ - name: Lint
31
+ run: ruff check src tests examples
32
+ # Tests needing the acquired corpus (L19 consume-only) skip automatically; the
33
+ # value-pinning test (test_shipped_bands_are_pinned) runs data-free and guards the
34
+ # exact numbers the tool reports.
35
+ - name: Test
36
+ run: pytest -q
37
+
38
+ build:
39
+ # Packaging guard: the wheel must build and ship the reference-band artifact.
40
+ runs-on: ubuntu-latest
41
+ steps:
42
+ - uses: actions/checkout@v4
43
+ - uses: actions/setup-python@v5
44
+ with:
45
+ python-version: "3.12"
46
+ cache: pip
47
+ - name: Build wheel
48
+ run: pip install build && python -m build --wheel
49
+ - name: Assert bands artifact is in the wheel
50
+ run: |
51
+ python - <<'PY'
52
+ import glob, zipfile, sys
53
+ whl = sorted(glob.glob("dist/*.whl"))[-1]
54
+ names = zipfile.ZipFile(whl).namelist()
55
+ assert any(n.endswith("ms408/data/reference_bands.json") for n in names), \
56
+ "reference_bands.json missing from wheel"
57
+ assert any(n.endswith("ms408/__main__.py") for n in names), "CLI missing from wheel"
58
+ print("wheel OK:", whl)
59
+ PY
@@ -0,0 +1,64 @@
1
+ name: pages
2
+
3
+ on:
4
+ push:
5
+ branches: [main]
6
+ paths:
7
+ - 'site/**'
8
+ - 'docs/**'
9
+ - 'paper/**'
10
+ - 'CONTRIBUTING.md'
11
+ - '.github/workflows/pages.yml'
12
+ workflow_dispatch:
13
+
14
+ permissions:
15
+ contents: read
16
+ pages: write
17
+ id-token: write
18
+
19
+ concurrency:
20
+ group: pages
21
+ cancel-in-progress: true
22
+
23
+ jobs:
24
+ build:
25
+ runs-on: ubuntu-latest
26
+ steps:
27
+ - uses: actions/checkout@v4
28
+ - uses: actions/setup-node@v4
29
+ with:
30
+ node-version: '20'
31
+ cache: npm
32
+ cache-dependency-path: site/package-lock.json
33
+ - name: Configure Pages
34
+ id: pages
35
+ # Requires Pages to be enabled once in repo Settings → Pages → Source: GitHub Actions
36
+ # (auto-enablement needs an admin-scoped token the default GITHUB_TOKEN lacks).
37
+ uses: actions/configure-pages@v5
38
+ - name: Install
39
+ working-directory: site
40
+ run: npm ci
41
+ # Paper PDFs are committed under site/public/papers/ (see site/.gitignore) — no
42
+ # LaTeX-in-CI step, which was fragile. Regenerate locally with scripts/build-papers.sh.
43
+ - name: Build
44
+ working-directory: site
45
+ # base_path / origin auto-derive the correct base for project vs user/org Pages;
46
+ # PUBLIC_REPO_URL replaces the OWNER placeholder in links.
47
+ env:
48
+ SITE_BASE: ${{ steps.pages.outputs.base_path }}
49
+ SITE_URL: ${{ steps.pages.outputs.origin }}
50
+ PUBLIC_REPO_URL: ${{ github.server_url }}/${{ github.repository }}
51
+ run: npm run build
52
+ - uses: actions/upload-pages-artifact@v3
53
+ with:
54
+ path: site/dist
55
+
56
+ deploy:
57
+ needs: build
58
+ runs-on: ubuntu-latest
59
+ environment:
60
+ name: github-pages
61
+ url: ${{ steps.deployment.outputs.page_url }}
62
+ steps:
63
+ - id: deployment
64
+ uses: actions/deploy-pages@v4
@@ -0,0 +1,53 @@
1
+ name: publish
2
+
3
+ # Publishes ms408 to PyPI when a GitHub Release is published, via PyPI Trusted Publishing
4
+ # (OIDC) — no API tokens stored. ONE-TIME SETUP on PyPI: pypi.org → your project (or "pending
5
+ # publisher") → add a Trusted Publisher: owner=DireLabs, repo=ms408, workflow=publish.yml,
6
+ # environment=pypi. Then each GitHub Release triggers a publish. Bump `version` in
7
+ # pyproject.toml before tagging — PyPI refuses to overwrite an existing version.
8
+
9
+ on:
10
+ release:
11
+ types: [published]
12
+ workflow_dispatch: # allow a manual dry run (build only; publish step is release-gated)
13
+
14
+ permissions:
15
+ contents: read
16
+
17
+ jobs:
18
+ build:
19
+ runs-on: ubuntu-latest
20
+ steps:
21
+ - uses: actions/checkout@v4
22
+ - uses: actions/setup-python@v5
23
+ with:
24
+ python-version: "3.12"
25
+ - name: Build sdist + wheel
26
+ run: |
27
+ pip install build
28
+ python -m build
29
+ - name: Check metadata
30
+ run: |
31
+ pip install twine
32
+ twine check dist/*
33
+ - uses: actions/upload-artifact@v4
34
+ with:
35
+ name: dist
36
+ path: dist/
37
+
38
+ pypi:
39
+ needs: build
40
+ runs-on: ubuntu-latest
41
+ if: github.event_name == 'release'
42
+ environment:
43
+ name: pypi
44
+ url: https://pypi.org/project/ms408/
45
+ permissions:
46
+ id-token: write # required for Trusted Publishing (OIDC)
47
+ steps:
48
+ - uses: actions/download-artifact@v4
49
+ with:
50
+ name: dist
51
+ path: dist/
52
+ - name: Publish to PyPI
53
+ uses: pypa/gh-action-pypi-publish@release/v1
ms408-0.1.0/.gitignore ADDED
@@ -0,0 +1,28 @@
1
+ .DS_Store
2
+ __pycache__/
3
+ *.pyc
4
+ .venv/
5
+ venv/
6
+ .pytest_cache/
7
+ .ipynb_checkpoints/
8
+ *.egg-info/
9
+ data/raw/
10
+ data/processed/*.jsonl
11
+ data/processed/harness/**/*.txt
12
+ data/processed/h4/*.txt
13
+ .env
14
+ results/annotations/*.jsonl
15
+ results/synthesis/*.json
16
+ results/experiments/*.json
17
+
18
+ # LaTeX build artifacts — keep .tex/.bib source; PDFs are built on demand
19
+ # (make_arxiv_bundle.sh) or hosted on the site, not committed.
20
+ paper/**/main.pdf
21
+ paper/**/*.aux
22
+ paper/**/*.bbl
23
+ paper/**/*.blg
24
+ paper/**/*.fls
25
+ paper/**/*.fdb_latexmk
26
+ paper/**/*.out
27
+ paper/**/*.log
28
+ paper/dist/