codemble 0.22.0__tar.gz → 0.24.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 (373) hide show
  1. {codemble-0.22.0 → codemble-0.24.0}/.github/workflows/ci.yml +9 -1
  2. {codemble-0.22.0 → codemble-0.24.0}/CHANGELOG.md +168 -0
  3. {codemble-0.22.0 → codemble-0.24.0}/CLAUDE.md +368 -54
  4. codemble-0.24.0/CONTEXT.md +114 -0
  5. {codemble-0.22.0 → codemble-0.24.0}/PKG-INFO +54 -42
  6. {codemble-0.22.0 → codemble-0.24.0}/README.md +49 -39
  7. {codemble-0.22.0 → codemble-0.24.0}/codemble/adapters/python_ast.py +203 -14
  8. {codemble-0.22.0 → codemble-0.24.0}/codemble/adapters/source_text.py +11 -3
  9. {codemble-0.22.0 → codemble-0.24.0}/codemble/checks/service.py +13 -11
  10. {codemble-0.22.0 → codemble-0.24.0}/codemble/cli.py +4 -0
  11. {codemble-0.22.0 → codemble-0.24.0}/codemble/llm/providers.py +3 -2
  12. {codemble-0.22.0 → codemble-0.24.0}/codemble/llm/study.py +21 -9
  13. codemble-0.24.0/codemble/progress/__init__.py +14 -0
  14. {codemble-0.22.0 → codemble-0.24.0}/codemble/progress/store.py +190 -47
  15. {codemble-0.22.0 → codemble-0.24.0}/codemble/server/app.py +184 -33
  16. {codemble-0.22.0 → codemble-0.24.0}/codemble/server/project_activation.py +42 -3
  17. codemble-0.24.0/codemble/share/__init__.py +70 -0
  18. codemble-0.24.0/codemble/share/alerts.py +352 -0
  19. codemble-0.24.0/codemble/share/artifact.py +613 -0
  20. codemble-0.24.0/codemble/share/delivery.py +662 -0
  21. codemble-0.24.0/codemble/share/http_delivery.py +493 -0
  22. codemble-0.24.0/codemble/share/interpretation.py +588 -0
  23. codemble-0.24.0/codemble/share/operations.py +2514 -0
  24. codemble-0.24.0/codemble/share/ops_cli.py +446 -0
  25. codemble-0.24.0/codemble/share/persistent_storage.py +1097 -0
  26. codemble-0.24.0/codemble/share/preview.py +217 -0
  27. codemble-0.24.0/codemble/share/retirement.py +112 -0
  28. codemble-0.24.0/codemble/web_dist/assets/index-CqqCF7q-.css +1 -0
  29. codemble-0.24.0/codemble/web_dist/assets/index-DkAHbjB1.js +5667 -0
  30. {codemble-0.22.0 → codemble-0.24.0}/codemble/web_dist/index.html +2 -2
  31. codemble-0.24.0/docs/design/2026-09-10-planetary-expedition.md +79 -0
  32. codemble-0.24.0/docs/plans/2026-09-26-dev-review-sol-execution.md +603 -0
  33. codemble-0.24.0/docs/releases/v0.23.0.md +43 -0
  34. codemble-0.24.0/docs/releases/v0.24.0.md +53 -0
  35. codemble-0.24.0/docs/research/2026-08-26-read-only-share-privacy-boundary.md +232 -0
  36. codemble-0.24.0/docs/superpowers/specs/2026-08-26-read-only-share-privacy-design.md +324 -0
  37. codemble-0.24.0/ops/share/Caddyfile.example +10 -0
  38. codemble-0.24.0/ops/share/README.md +243 -0
  39. codemble-0.24.0/ops/share/codemble-rest-server.service +21 -0
  40. codemble-0.24.0/ops/share/codemble-share-alert-tmpfiles.conf +5 -0
  41. codemble-0.24.0/ops/share/codemble-share-alert@.service +19 -0
  42. codemble-0.24.0/ops/share/codemble-share-operator.service +19 -0
  43. codemble-0.24.0/ops/share/codemble-share-operator.timer +11 -0
  44. codemble-0.24.0/ops/share/codemble-share-tmpfiles.conf +6 -0
  45. codemble-0.24.0/ops/share/codemble-share-writer.service +19 -0
  46. codemble-0.24.0/ops/share/codemble-share-writer.timer +11 -0
  47. codemble-0.24.0/ops/share/share-alert.toml.example +5 -0
  48. codemble-0.24.0/ops/share/share-journal-operator.toml.example +14 -0
  49. codemble-0.24.0/ops/share/share-operator.toml.example +25 -0
  50. codemble-0.24.0/ops/share/share-writer.toml.example +33 -0
  51. {codemble-0.22.0 → codemble-0.24.0}/pyproject.toml +19 -13
  52. codemble-0.24.0/scripts/serve_share_delivery_fixture.py +64 -0
  53. {codemble-0.22.0 → codemble-0.24.0}/tests/fixtures/check_suites.json +108 -87
  54. {codemble-0.22.0 → codemble-0.24.0}/tests/test_checks.py +66 -5
  55. {codemble-0.22.0 → codemble-0.24.0}/tests/test_narration_rescue.py +163 -1
  56. codemble-0.24.0/tests/test_progress.py +431 -0
  57. {codemble-0.22.0 → codemble-0.24.0}/tests/test_project_activation.py +72 -0
  58. {codemble-0.22.0 → codemble-0.24.0}/tests/test_project_parser.py +23 -0
  59. {codemble-0.22.0 → codemble-0.24.0}/tests/test_providers.py +83 -1
  60. {codemble-0.22.0 → codemble-0.24.0}/tests/test_python_resolution.py +144 -0
  61. {codemble-0.22.0 → codemble-0.24.0}/tests/test_server.py +118 -0
  62. codemble-0.24.0/tests/test_share_alerts.py +208 -0
  63. codemble-0.24.0/tests/test_share_artifact.py +915 -0
  64. codemble-0.24.0/tests/test_share_delivery.py +394 -0
  65. codemble-0.24.0/tests/test_share_http_delivery.py +449 -0
  66. codemble-0.24.0/tests/test_share_operations.py +1046 -0
  67. codemble-0.24.0/tests/test_share_operations_assets.py +149 -0
  68. codemble-0.24.0/tests/test_share_operations_identity.py +437 -0
  69. codemble-0.24.0/tests/test_share_ops_cli.py +322 -0
  70. codemble-0.24.0/tests/test_share_persistent_storage.py +539 -0
  71. codemble-0.24.0/tests/test_share_preview.py +582 -0
  72. {codemble-0.22.0 → codemble-0.24.0}/tests/test_study.py +152 -3
  73. {codemble-0.22.0 → codemble-0.24.0}/web/package-lock.json +6 -6
  74. {codemble-0.22.0 → codemble-0.24.0}/web/package.json +8 -3
  75. {codemble-0.22.0 → codemble-0.24.0}/web/scripts/capture_product_shots.mjs +45 -12
  76. {codemble-0.22.0 → codemble-0.24.0}/web/scripts/capture_support.mjs +74 -5
  77. {codemble-0.22.0 → codemble-0.24.0}/web/scripts/check_canvas_occlusion.mjs +2 -2
  78. {codemble-0.22.0 → codemble-0.24.0}/web/scripts/check_capture_safety.mjs +9 -0
  79. {codemble-0.22.0 → codemble-0.24.0}/web/scripts/check_celestial_bodies.mjs +7 -0
  80. {codemble-0.22.0 → codemble-0.24.0}/web/scripts/check_escape_surfaces.mjs +12 -6
  81. {codemble-0.22.0 → codemble-0.24.0}/web/scripts/check_galaxy_runtime.mjs +3 -0
  82. {codemble-0.22.0 → codemble-0.24.0}/web/scripts/check_galaxy_view.mjs +32 -1
  83. {codemble-0.22.0 → codemble-0.24.0}/web/scripts/check_large_project.mjs +10 -4
  84. {codemble-0.22.0 → codemble-0.24.0}/web/scripts/check_learner_session.mjs +432 -0
  85. {codemble-0.22.0 → codemble-0.24.0}/web/scripts/check_mode_gate_portal.mjs +1 -1
  86. {codemble-0.22.0 → codemble-0.24.0}/web/scripts/check_name_atlas.mjs +16 -0
  87. {codemble-0.22.0 → codemble-0.24.0}/web/scripts/check_panel_reach.mjs +140 -0
  88. codemble-0.24.0/web/scripts/check_planetary_graphics.mjs +91 -0
  89. codemble-0.24.0/web/scripts/check_planetary_interactions.mjs +57 -0
  90. codemble-0.24.0/web/scripts/check_planetary_visuals.mjs +59 -0
  91. {codemble-0.22.0 → codemble-0.24.0}/web/scripts/check_public_site.mjs +51 -1
  92. codemble-0.24.0/web/scripts/check_share_delivery.mjs +280 -0
  93. codemble-0.24.0/web/scripts/check_share_preview_run.mjs +93 -0
  94. {codemble-0.22.0 → codemble-0.24.0}/web/scripts/check_space_budget.mjs +12 -6
  95. codemble-0.24.0/web/scripts/check_text_containment.mjs +166 -0
  96. {codemble-0.22.0 → codemble-0.24.0}/web/scripts/check_userflow_repairs.mjs +218 -46
  97. {codemble-0.22.0 → codemble-0.24.0}/web/src/App.jsx +65 -15
  98. {codemble-0.22.0 → codemble-0.24.0}/web/src/GalaxyCanvas.jsx +7 -1
  99. {codemble-0.22.0 → codemble-0.24.0}/web/src/ModeControl.jsx +10 -6
  100. codemble-0.24.0/web/src/SharePreviewDialog.jsx +306 -0
  101. {codemble-0.22.0 → codemble-0.24.0}/web/src/StudyPanel.jsx +4 -2
  102. {codemble-0.22.0 → codemble-0.24.0}/web/src/canvasOcclusion.js +2 -2
  103. {codemble-0.22.0 → codemble-0.24.0}/web/src/celestialBodies.js +134 -116
  104. {codemble-0.22.0 → codemble-0.24.0}/web/src/galaxyMaterials.js +73 -27
  105. {codemble-0.22.0 → codemble-0.24.0}/web/src/galaxyRuntime.js +44 -12
  106. {codemble-0.22.0 → codemble-0.24.0}/web/src/galaxyView.js +50 -2
  107. {codemble-0.22.0 → codemble-0.24.0}/web/src/learnerSession.js +238 -15
  108. {codemble-0.22.0 → codemble-0.24.0}/web/src/nameAtlas.js +17 -6
  109. codemble-0.24.0/web/src/sharePreviewRun.js +214 -0
  110. {codemble-0.22.0 → codemble-0.24.0}/web/src/styles.css +439 -4
  111. codemble-0.22.0/CONTEXT.md +0 -46
  112. codemble-0.22.0/codemble/progress/__init__.py +0 -9
  113. codemble-0.22.0/codemble/web_dist/assets/index-C3498IDT.js +0 -5609
  114. codemble-0.22.0/codemble/web_dist/assets/index-ZndcOj-s.css +0 -1
  115. codemble-0.22.0/tests/test_progress.py +0 -152
  116. {codemble-0.22.0 → codemble-0.24.0}/.env.example +0 -0
  117. {codemble-0.22.0 → codemble-0.24.0}/.gitattributes +0 -0
  118. {codemble-0.22.0 → codemble-0.24.0}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
  119. {codemble-0.22.0 → codemble-0.24.0}/.github/ISSUE_TEMPLATE/config.yml +0 -0
  120. {codemble-0.22.0 → codemble-0.24.0}/.github/ISSUE_TEMPLATE/early_tester.yml +0 -0
  121. {codemble-0.22.0 → codemble-0.24.0}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
  122. {codemble-0.22.0 → codemble-0.24.0}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
  123. {codemble-0.22.0 → codemble-0.24.0}/.github/dependabot.yml +0 -0
  124. {codemble-0.22.0 → codemble-0.24.0}/.github/workflows/pages.yml +0 -0
  125. {codemble-0.22.0 → codemble-0.24.0}/.github/workflows/publish-pypi.yml +0 -0
  126. {codemble-0.22.0 → codemble-0.24.0}/.gitignore +0 -0
  127. {codemble-0.22.0 → codemble-0.24.0}/.graphifyignore +0 -0
  128. {codemble-0.22.0 → codemble-0.24.0}/AGENTS.md +0 -0
  129. {codemble-0.22.0 → codemble-0.24.0}/CODE_OF_CONDUCT.md +0 -0
  130. {codemble-0.22.0 → codemble-0.24.0}/CONTRIBUTING.md +0 -0
  131. {codemble-0.22.0 → codemble-0.24.0}/LICENSE +0 -0
  132. {codemble-0.22.0 → codemble-0.24.0}/NOTES.md +0 -0
  133. {codemble-0.22.0 → codemble-0.24.0}/NOTICE +0 -0
  134. {codemble-0.22.0 → codemble-0.24.0}/SECURITY.md +0 -0
  135. {codemble-0.22.0 → codemble-0.24.0}/TESTING.md +0 -0
  136. {codemble-0.22.0 → codemble-0.24.0}/assets/demo.gif +0 -0
  137. {codemble-0.22.0 → codemble-0.24.0}/codemble/__init__.py +0 -0
  138. {codemble-0.22.0 → codemble-0.24.0}/codemble/adapters/__init__.py +0 -0
  139. {codemble-0.22.0 → codemble-0.24.0}/codemble/adapters/base.py +0 -0
  140. {codemble-0.22.0 → codemble-0.24.0}/codemble/adapters/csharp_tree_sitter.py +0 -0
  141. {codemble-0.22.0 → codemble-0.24.0}/codemble/adapters/discovery.py +0 -0
  142. {codemble-0.22.0 → codemble-0.24.0}/codemble/adapters/evidence_cache.py +0 -0
  143. {codemble-0.22.0 → codemble-0.24.0}/codemble/adapters/go_tree_sitter.py +0 -0
  144. {codemble-0.22.0 → codemble-0.24.0}/codemble/adapters/java_tree_sitter.py +0 -0
  145. {codemble-0.22.0 → codemble-0.24.0}/codemble/adapters/parse_progress.py +0 -0
  146. {codemble-0.22.0 → codemble-0.24.0}/codemble/adapters/php_tree_sitter.py +0 -0
  147. {codemble-0.22.0 → codemble-0.24.0}/codemble/adapters/project.py +0 -0
  148. {codemble-0.22.0 → codemble-0.24.0}/codemble/adapters/role_rules.py +0 -0
  149. {codemble-0.22.0 → codemble-0.24.0}/codemble/adapters/ruby_tree_sitter.py +0 -0
  150. {codemble-0.22.0 → codemble-0.24.0}/codemble/adapters/rust_tree_sitter.py +0 -0
  151. {codemble-0.22.0 → codemble-0.24.0}/codemble/adapters/tree_sitter_core.py +0 -0
  152. {codemble-0.22.0 → codemble-0.24.0}/codemble/adapters/typescript_tree_sitter.py +0 -0
  153. {codemble-0.22.0 → codemble-0.24.0}/codemble/checks/__init__.py +0 -0
  154. {codemble-0.22.0 → codemble-0.24.0}/codemble/graph/__init__.py +0 -0
  155. {codemble-0.22.0 → codemble-0.24.0}/codemble/graph/finalize.py +0 -0
  156. {codemble-0.22.0 → codemble-0.24.0}/codemble/graph/impact.py +0 -0
  157. {codemble-0.22.0 → codemble-0.24.0}/codemble/graph/layout.py +0 -0
  158. {codemble-0.22.0 → codemble-0.24.0}/codemble/graph/learning.py +0 -0
  159. {codemble-0.22.0 → codemble-0.24.0}/codemble/graph/mapview.py +0 -0
  160. {codemble-0.22.0 → codemble-0.24.0}/codemble/lens/__init__.py +0 -0
  161. {codemble-0.22.0 → codemble-0.24.0}/codemble/lens/dynamic_languages.py +0 -0
  162. {codemble-0.22.0 → codemble-0.24.0}/codemble/lens/javascript_typescript.py +0 -0
  163. {codemble-0.22.0 → codemble-0.24.0}/codemble/lens/python.py +0 -0
  164. {codemble-0.22.0 → codemble-0.24.0}/codemble/lens/systems_languages.py +0 -0
  165. {codemble-0.22.0 → codemble-0.24.0}/codemble/llm/__init__.py +0 -0
  166. {codemble-0.22.0 → codemble-0.24.0}/codemble/llm/local_status.py +0 -0
  167. {codemble-0.22.0 → codemble-0.24.0}/codemble/llm/structural.py +0 -0
  168. {codemble-0.22.0 → codemble-0.24.0}/codemble/paths.py +0 -0
  169. {codemble-0.22.0 → codemble-0.24.0}/codemble/server/__init__.py +0 -0
  170. {codemble-0.22.0 → codemble-0.24.0}/codemble/server/parse_job.py +0 -0
  171. {codemble-0.22.0 → codemble-0.24.0}/codemble/server/project_selection.py +0 -0
  172. {codemble-0.22.0 → codemble-0.24.0}/codemble/server/runtime.py +0 -0
  173. {codemble-0.22.0 → codemble-0.24.0}/codemble/web_dist/assets/jetbrains-mono-latin-400-normal-6-qcROiO.woff +0 -0
  174. {codemble-0.22.0 → codemble-0.24.0}/codemble/web_dist/assets/jetbrains-mono-latin-400-normal-V6pRDFza.woff2 +0 -0
  175. {codemble-0.22.0 → codemble-0.24.0}/codemble/web_dist/assets/jetbrains-mono-latin-500-normal-BWZEU5yA.woff2 +0 -0
  176. {codemble-0.22.0 → codemble-0.24.0}/codemble/web_dist/assets/jetbrains-mono-latin-500-normal-CJOVTJB7.woff +0 -0
  177. {codemble-0.22.0 → codemble-0.24.0}/codemble/web_dist/assets/shippori-mincho-latin-500-normal-C-QwvIb3.woff +0 -0
  178. {codemble-0.22.0 → codemble-0.24.0}/codemble/web_dist/assets/shippori-mincho-latin-500-normal-XI1O8euf.woff2 +0 -0
  179. {codemble-0.22.0 → codemble-0.24.0}/codemble/web_dist/assets/shippori-mincho-latin-700-normal-CkoCYOiI.woff +0 -0
  180. {codemble-0.22.0 → codemble-0.24.0}/codemble/web_dist/assets/shippori-mincho-latin-700-normal-DHcmzUO5.woff2 +0 -0
  181. {codemble-0.22.0 → codemble-0.24.0}/codemble/web_dist/assets/zen-kaku-gothic-new-latin-400-normal-BEdayliK.woff2 +0 -0
  182. {codemble-0.22.0 → codemble-0.24.0}/codemble/web_dist/assets/zen-kaku-gothic-new-latin-400-normal-CPSmNJAU.woff +0 -0
  183. {codemble-0.22.0 → codemble-0.24.0}/docs/adr/README.md +0 -0
  184. {codemble-0.22.0 → codemble-0.24.0}/docs/plans/2026-07-19-audience-modes-and-local-narration-design.md +0 -0
  185. {codemble-0.22.0 → codemble-0.24.0}/docs/plans/2026-07-19-audience-modes-backend-plan.md +0 -0
  186. {codemble-0.22.0 → codemble-0.24.0}/docs/plans/2026-07-19-audience-modes-frontend-plan.md +0 -0
  187. {codemble-0.22.0 → codemble-0.24.0}/docs/plans/2026-07-19-install-ux-folder-picker-design.md +0 -0
  188. {codemble-0.22.0 → codemble-0.24.0}/docs/plans/2026-07-19-install-ux-folder-picker-plan.md +0 -0
  189. {codemble-0.22.0 → codemble-0.24.0}/docs/plans/2026-07-20-oss-inspired-map-and-constellations.md +0 -0
  190. {codemble-0.22.0 → codemble-0.24.0}/docs/plans/README.md +0 -0
  191. {codemble-0.22.0 → codemble-0.24.0}/docs/plans/phase-1.md +0 -0
  192. {codemble-0.22.0 → codemble-0.24.0}/docs/releases/checklist.md +0 -0
  193. {codemble-0.22.0 → codemble-0.24.0}/docs/releases/v0.1.0.md +0 -0
  194. {codemble-0.22.0 → codemble-0.24.0}/docs/releases/v0.16.0.md +0 -0
  195. {codemble-0.22.0 → codemble-0.24.0}/docs/releases/v0.17.0.md +0 -0
  196. {codemble-0.22.0 → codemble-0.24.0}/docs/releases/v0.18.0.md +0 -0
  197. {codemble-0.22.0 → codemble-0.24.0}/docs/releases/v0.19.1.md +0 -0
  198. {codemble-0.22.0 → codemble-0.24.0}/docs/releases/v0.19.2.md +0 -0
  199. {codemble-0.22.0 → codemble-0.24.0}/docs/releases/v0.2.0.md +0 -0
  200. {codemble-0.22.0 → codemble-0.24.0}/docs/releases/v0.20.0.md +0 -0
  201. {codemble-0.22.0 → codemble-0.24.0}/docs/releases/v0.21.0.md +0 -0
  202. {codemble-0.22.0 → codemble-0.24.0}/docs/releases/v0.21.1.md +0 -0
  203. {codemble-0.22.0 → codemble-0.24.0}/docs/releases/v0.22.0.md +0 -0
  204. {codemble-0.22.0 → codemble-0.24.0}/docs/releases/v0.4.0.md +0 -0
  205. {codemble-0.22.0 → codemble-0.24.0}/docs/releases/v0.5.0.md +0 -0
  206. {codemble-0.22.0 → codemble-0.24.0}/docs/releases/v0.5.1.md +0 -0
  207. {codemble-0.22.0 → codemble-0.24.0}/docs/releases/v0.5.2.md +0 -0
  208. {codemble-0.22.0 → codemble-0.24.0}/docs/releases/v0.5.3.md +0 -0
  209. {codemble-0.22.0 → codemble-0.24.0}/docs/releases/v0.6.1.md +0 -0
  210. {codemble-0.22.0 → codemble-0.24.0}/docs/releases/v0.6.2.md +0 -0
  211. {codemble-0.22.0 → codemble-0.24.0}/docs/releases/v0.6.3.md +0 -0
  212. {codemble-0.22.0 → codemble-0.24.0}/docs/releases/v0.6.4.md +0 -0
  213. {codemble-0.22.0 → codemble-0.24.0}/docs/releases/v0.7.0.md +0 -0
  214. {codemble-0.22.0 → codemble-0.24.0}/docs/releases/v0.9.0.md +0 -0
  215. {codemble-0.22.0 → codemble-0.24.0}/docs/research/2026-07-20-opensource-graph-architecture-inspiration.md +0 -0
  216. {codemble-0.22.0 → codemble-0.24.0}/docs/research/2026-08-25-adventure-galaxy-and-ruby-php.md +0 -0
  217. {codemble-0.22.0 → codemble-0.24.0}/docs/research/README.md +0 -0
  218. {codemble-0.22.0 → codemble-0.24.0}/docs/superpowers/plans/2026-07-19-galaxy-ux-phase-a.md +0 -0
  219. {codemble-0.22.0 → codemble-0.24.0}/docs/superpowers/plans/2026-07-19-galaxy-ux-phase-b.md +0 -0
  220. {codemble-0.22.0 → codemble-0.24.0}/docs/superpowers/plans/2026-07-19-galaxy-ux-phase-c.md +0 -0
  221. {codemble-0.22.0 → codemble-0.24.0}/docs/superpowers/plans/2026-07-19-galaxy-ux-shared-contract.md +0 -0
  222. {codemble-0.22.0 → codemble-0.24.0}/docs/superpowers/plans/2026-07-28-shell-space-budget.md +0 -0
  223. {codemble-0.22.0 → codemble-0.24.0}/docs/superpowers/specs/2026-07-19-galaxy-ux-overhaul-design.md +0 -0
  224. {codemble-0.22.0 → codemble-0.24.0}/docs/superpowers/specs/2026-07-21-navigation-design-clarity-design.md +0 -0
  225. {codemble-0.22.0 → codemble-0.24.0}/docs/superpowers/specs/2026-07-22-cinematic-website-design.md +0 -0
  226. {codemble-0.22.0 → codemble-0.24.0}/docs/superpowers/specs/2026-07-27-unsupported-source-reporting-design.md +0 -0
  227. {codemble-0.22.0 → codemble-0.24.0}/docs/superpowers/specs/2026-07-28-product-screenshot-recapture-design.md +0 -0
  228. {codemble-0.22.0 → codemble-0.24.0}/docs/superpowers/specs/2026-07-28-shell-space-budget-design.md +0 -0
  229. {codemble-0.22.0 → codemble-0.24.0}/docs/superpowers/specs/2026-08-02-explorable-galaxy-redesign.md +0 -0
  230. {codemble-0.22.0 → codemble-0.24.0}/scripts/audit_parser_evidence.py +0 -0
  231. {codemble-0.22.0 → codemble-0.24.0}/scripts/benchmark_parser_scale.py +0 -0
  232. {codemble-0.22.0 → codemble-0.24.0}/scripts/benchmark_study_queries.py +0 -0
  233. {codemble-0.22.0 → codemble-0.24.0}/scripts/dev.sh +0 -0
  234. {codemble-0.22.0 → codemble-0.24.0}/scripts/record_demo.sh +0 -0
  235. {codemble-0.22.0 → codemble-0.24.0}/scripts/serve_large_project_gate.py +0 -0
  236. {codemble-0.22.0 → codemble-0.24.0}/tests/conftest.py +0 -0
  237. {codemble-0.22.0 → codemble-0.24.0}/tests/fixtures/concepts_sample.py +0 -0
  238. {codemble-0.22.0 → codemble-0.24.0}/tests/fixtures/csharp_sample/obj/Debug/AssemblyInfo.cs +0 -0
  239. {codemble-0.22.0 → codemble-0.24.0}/tests/fixtures/csharp_sample/src/Broken.cs +0 -0
  240. {codemble-0.22.0 → codemble-0.24.0}/tests/fixtures/csharp_sample/src/Core/Shapes.cs +0 -0
  241. {codemble-0.22.0 → codemble-0.24.0}/tests/fixtures/csharp_sample/src/Core/Store.cs +0 -0
  242. {codemble-0.22.0 → codemble-0.24.0}/tests/fixtures/csharp_sample/src/Program.cs +0 -0
  243. {codemble-0.22.0 → codemble-0.24.0}/tests/fixtures/csharp_sample/src/Query/Reports.cs +0 -0
  244. {codemble-0.22.0 → codemble-0.24.0}/tests/fixtures/csharp_sample/src/Tests/StoreTests.cs +0 -0
  245. {codemble-0.22.0 → codemble-0.24.0}/tests/fixtures/go_sample/cmd/app/main.go +0 -0
  246. {codemble-0.22.0 → codemble-0.24.0}/tests/fixtures/go_sample/go.mod +0 -0
  247. {codemble-0.22.0 → codemble-0.24.0}/tests/fixtures/go_sample/internal/report/broken.go +0 -0
  248. {codemble-0.22.0 → codemble-0.24.0}/tests/fixtures/go_sample/internal/report/report.go +0 -0
  249. {codemble-0.22.0 → codemble-0.24.0}/tests/fixtures/go_sample/internal/store/store.go +0 -0
  250. {codemble-0.22.0 → codemble-0.24.0}/tests/fixtures/go_sample/internal/store/store_test.go +0 -0
  251. {codemble-0.22.0 → codemble-0.24.0}/tests/fixtures/go_sample/testdata/fake.go +0 -0
  252. {codemble-0.22.0 → codemble-0.24.0}/tests/fixtures/go_sample/vendor/example.com/dep/dep.go +0 -0
  253. {codemble-0.22.0 → codemble-0.24.0}/tests/fixtures/impact/alpha.py +0 -0
  254. {codemble-0.22.0 → codemble-0.24.0}/tests/fixtures/impact/beta.py +0 -0
  255. {codemble-0.22.0 → codemble-0.24.0}/tests/fixtures/impact/gamma.py +0 -0
  256. {codemble-0.22.0 → codemble-0.24.0}/tests/fixtures/impact/helpers.py +0 -0
  257. {codemble-0.22.0 → codemble-0.24.0}/tests/fixtures/impact/noisy.py +0 -0
  258. {codemble-0.22.0 → codemble-0.24.0}/tests/fixtures/java_sample/src/com/example/app/App.java +0 -0
  259. {codemble-0.22.0 → codemble-0.24.0}/tests/fixtures/java_sample/src/com/example/app/Broken.java +0 -0
  260. {codemble-0.22.0 → codemble-0.24.0}/tests/fixtures/java_sample/src/com/example/app/Service.java +0 -0
  261. {codemble-0.22.0 → codemble-0.24.0}/tests/fixtures/java_sample/src/com/example/model/Catalog.java +0 -0
  262. {codemble-0.22.0 → codemble-0.24.0}/tests/fixtures/java_sample/src/com/example/model/Shapes.java +0 -0
  263. {codemble-0.22.0 → codemble-0.24.0}/tests/fixtures/java_sample/src/com/example/util/Formatter.java +0 -0
  264. {codemble-0.22.0 → codemble-0.24.0}/tests/fixtures/java_sample/src/com/example/util/Helper.java +0 -0
  265. {codemble-0.22.0 → codemble-0.24.0}/tests/fixtures/java_sample/target/com/example/app/Generated.java +0 -0
  266. {codemble-0.22.0 → codemble-0.24.0}/tests/fixtures/java_sample/test/com/example/app/AppTest.java +0 -0
  267. {codemble-0.22.0 → codemble-0.24.0}/tests/fixtures/parser_evidence_oracle.json +0 -0
  268. {codemble-0.22.0 → codemble-0.24.0}/tests/fixtures/php_sample/bin/atlas.php +0 -0
  269. {codemble-0.22.0 → codemble-0.24.0}/tests/fixtures/php_sample/composer.json +0 -0
  270. {codemble-0.22.0 → codemble-0.24.0}/tests/fixtures/php_sample/src/Broken.php +0 -0
  271. {codemble-0.22.0 → codemble-0.24.0}/tests/fixtures/php_sample/src/Names.php +0 -0
  272. {codemble-0.22.0 → codemble-0.24.0}/tests/fixtures/php_sample/src/Navigator.php +0 -0
  273. {codemble-0.22.0 → codemble-0.24.0}/tests/fixtures/php_sample/src/Ship.php +0 -0
  274. {codemble-0.22.0 → codemble-0.24.0}/tests/fixtures/polyglot/python_worker.py +0 -0
  275. {codemble-0.22.0 → codemble-0.24.0}/tests/fixtures/polyglot/src/broken.ts +0 -0
  276. {codemble-0.22.0 → codemble-0.24.0}/tests/fixtures/polyglot/src/legacy.js +0 -0
  277. {codemble-0.22.0 → codemble-0.24.0}/tests/fixtures/polyglot/src/local.js +0 -0
  278. {codemble-0.22.0 → codemble-0.24.0}/tests/fixtures/polyglot/src/main.ts +0 -0
  279. {codemble-0.22.0 → codemble-0.24.0}/tests/fixtures/polyglot/src/reexport.ts +0 -0
  280. {codemble-0.22.0 → codemble-0.24.0}/tests/fixtures/polyglot/src/util.ts +0 -0
  281. {codemble-0.22.0 → codemble-0.24.0}/tests/fixtures/polyglot/src/widget.tsx +0 -0
  282. {codemble-0.22.0 → codemble-0.24.0}/tests/fixtures/repeated_calls.py +0 -0
  283. {codemble-0.22.0 → codemble-0.24.0}/tests/fixtures/ruby_sample/bin/atlas.rb +0 -0
  284. {codemble-0.22.0 → codemble-0.24.0}/tests/fixtures/ruby_sample/lib/atlas/navigation.rb +0 -0
  285. {codemble-0.22.0 → codemble-0.24.0}/tests/fixtures/ruby_sample/lib/atlas.rb +0 -0
  286. {codemble-0.22.0 → codemble-0.24.0}/tests/fixtures/ruby_sample/lib/broken.rb +0 -0
  287. {codemble-0.22.0 → codemble-0.24.0}/tests/fixtures/rust_sample/src/broken.rs +0 -0
  288. {codemble-0.22.0 → codemble-0.24.0}/tests/fixtures/rust_sample/src/lib.rs +0 -0
  289. {codemble-0.22.0 → codemble-0.24.0}/tests/fixtures/rust_sample/src/main.rs +0 -0
  290. {codemble-0.22.0 → codemble-0.24.0}/tests/fixtures/rust_sample/src/render.rs +0 -0
  291. {codemble-0.22.0 → codemble-0.24.0}/tests/fixtures/rust_sample/src/util.rs +0 -0
  292. {codemble-0.22.0 → codemble-0.24.0}/tests/fixtures/rust_sample/target/generated.rs +0 -0
  293. {codemble-0.22.0 → codemble-0.24.0}/tests/fixtures/sampleproj/.gitignore +0 -0
  294. {codemble-0.22.0 → codemble-0.24.0}/tests/fixtures/sampleproj/ambiguous.py +0 -0
  295. {codemble-0.22.0 → codemble-0.24.0}/tests/fixtures/sampleproj/api.py +0 -0
  296. {codemble-0.22.0 → codemble-0.24.0}/tests/fixtures/sampleproj/app.py +0 -0
  297. {codemble-0.22.0 → codemble-0.24.0}/tests/fixtures/sampleproj/broken.py +0 -0
  298. {codemble-0.22.0 → codemble-0.24.0}/tests/fixtures/sampleproj/cli.py +0 -0
  299. {codemble-0.22.0 → codemble-0.24.0}/tests/fixtures/sampleproj/pkg/__init__.py +0 -0
  300. {codemble-0.22.0 → codemble-0.24.0}/tests/fixtures/sampleproj/pkg/helpers.py +0 -0
  301. {codemble-0.22.0 → codemble-0.24.0}/tests/fixtures/sampleproj/pkg/service.py +0 -0
  302. {codemble-0.22.0 → codemble-0.24.0}/tests/fixtures/sampleproj/pkg/util.py +0 -0
  303. {codemble-0.22.0 → codemble-0.24.0}/tests/fixtures/sampleproj/runner/__main__.py +0 -0
  304. {codemble-0.22.0 → codemble-0.24.0}/tests/fixtures/sampleproj/shared.py +0 -0
  305. {codemble-0.22.0 → codemble-0.24.0}/tests/test_csharp_tree_sitter.py +0 -0
  306. {codemble-0.22.0 → codemble-0.24.0}/tests/test_dependency_compatibility.py +0 -0
  307. {codemble-0.22.0 → codemble-0.24.0}/tests/test_discovery.py +0 -0
  308. {codemble-0.22.0 → codemble-0.24.0}/tests/test_explorer_trail.py +0 -0
  309. {codemble-0.22.0 → codemble-0.24.0}/tests/test_go_tree_sitter.py +0 -0
  310. {codemble-0.22.0 → codemble-0.24.0}/tests/test_graph_finalization.py +0 -0
  311. {codemble-0.22.0 → codemble-0.24.0}/tests/test_impact.py +0 -0
  312. {codemble-0.22.0 → codemble-0.24.0}/tests/test_java_tree_sitter.py +0 -0
  313. {codemble-0.22.0 → codemble-0.24.0}/tests/test_learning_journey.py +0 -0
  314. {codemble-0.22.0 → codemble-0.24.0}/tests/test_mapview.py +0 -0
  315. {codemble-0.22.0 → codemble-0.24.0}/tests/test_parse_job.py +0 -0
  316. {codemble-0.22.0 → codemble-0.24.0}/tests/test_parse_progress.py +0 -0
  317. {codemble-0.22.0 → codemble-0.24.0}/tests/test_parser_evidence_oracle.py +0 -0
  318. {codemble-0.22.0 → codemble-0.24.0}/tests/test_parser_scale_benchmark.py +0 -0
  319. {codemble-0.22.0 → codemble-0.24.0}/tests/test_polyglot_composition.py +0 -0
  320. {codemble-0.22.0 → codemble-0.24.0}/tests/test_project_selection.py +0 -0
  321. {codemble-0.22.0 → codemble-0.24.0}/tests/test_python_ast.py +0 -0
  322. {codemble-0.22.0 → codemble-0.24.0}/tests/test_role_evidence.py +0 -0
  323. {codemble-0.22.0 → codemble-0.24.0}/tests/test_ruby_php_adapters.py +0 -0
  324. {codemble-0.22.0 → codemble-0.24.0}/tests/test_rust_tree_sitter.py +0 -0
  325. {codemble-0.22.0 → codemble-0.24.0}/tests/test_smoke.py +0 -0
  326. {codemble-0.22.0 → codemble-0.24.0}/tests/test_structural.py +0 -0
  327. {codemble-0.22.0 → codemble-0.24.0}/tests/test_tree_sitter_lifecycle.py +0 -0
  328. {codemble-0.22.0 → codemble-0.24.0}/tests/test_typescript_resolution.py +0 -0
  329. {codemble-0.22.0 → codemble-0.24.0}/tests/test_typescript_tree_sitter.py +0 -0
  330. {codemble-0.22.0 → codemble-0.24.0}/web/README.md +0 -0
  331. {codemble-0.22.0 → codemble-0.24.0}/web/index.html +0 -0
  332. {codemble-0.22.0 → codemble-0.24.0}/web/scripts/benchmark_learner_projection.mjs +0 -0
  333. {codemble-0.22.0 → codemble-0.24.0}/web/scripts/check_camera_framing.mjs +0 -0
  334. {codemble-0.22.0 → codemble-0.24.0}/web/scripts/check_escape_arbiter.mjs +0 -0
  335. {codemble-0.22.0 → codemble-0.24.0}/web/scripts/check_first_flight.mjs +0 -0
  336. {codemble-0.22.0 → codemble-0.24.0}/web/scripts/check_focus_handoffs.mjs +0 -0
  337. {codemble-0.22.0 → codemble-0.24.0}/web/scripts/check_galaxy_effects.mjs +0 -0
  338. {codemble-0.22.0 → codemble-0.24.0}/web/scripts/check_graph_data.mjs +0 -0
  339. {codemble-0.22.0 → codemble-0.24.0}/web/scripts/check_interface_semantics.mjs +0 -0
  340. {codemble-0.22.0 → codemble-0.24.0}/web/scripts/check_learner_projection.mjs +0 -0
  341. {codemble-0.22.0 → codemble-0.24.0}/web/scripts/check_learning_journey.mjs +0 -0
  342. {codemble-0.22.0 → codemble-0.24.0}/web/scripts/check_map_canvas_renderer.mjs +0 -0
  343. {codemble-0.22.0 → codemble-0.24.0}/web/scripts/check_map_viewport.mjs +0 -0
  344. {codemble-0.22.0 → codemble-0.24.0}/web/scripts/check_orbit_pointer_guard.mjs +0 -0
  345. {codemble-0.22.0 → codemble-0.24.0}/web/scripts/check_possible_routes.mjs +0 -0
  346. {codemble-0.22.0 → codemble-0.24.0}/web/scripts/check_project_brief.mjs +0 -0
  347. {codemble-0.22.0 → codemble-0.24.0}/web/scripts/check_project_mapping.mjs +0 -0
  348. {codemble-0.22.0 → codemble-0.24.0}/web/scripts/check_sky_palette.mjs +0 -0
  349. {codemble-0.22.0 → codemble-0.24.0}/web/scripts/check_system_orbits.mjs +0 -0
  350. {codemble-0.22.0 → codemble-0.24.0}/web/scripts/record_demo.mjs +0 -0
  351. {codemble-0.22.0 → codemble-0.24.0}/web/src/GuidanceLayer.jsx +0 -0
  352. {codemble-0.22.0 → codemble-0.24.0}/web/src/MapView.jsx +0 -0
  353. {codemble-0.22.0 → codemble-0.24.0}/web/src/SystemNavigator.jsx +0 -0
  354. {codemble-0.22.0 → codemble-0.24.0}/web/src/cameraFraming.js +0 -0
  355. {codemble-0.22.0 → codemble-0.24.0}/web/src/dawnSequence.js +0 -0
  356. {codemble-0.22.0 → codemble-0.24.0}/web/src/escapeArbiter.js +0 -0
  357. {codemble-0.22.0 → codemble-0.24.0}/web/src/firstFlight.js +0 -0
  358. {codemble-0.22.0 → codemble-0.24.0}/web/src/galaxyEffects.js +0 -0
  359. {codemble-0.22.0 → codemble-0.24.0}/web/src/graphData.js +0 -0
  360. {codemble-0.22.0 → codemble-0.24.0}/web/src/learnerProjection.js +0 -0
  361. {codemble-0.22.0 → codemble-0.24.0}/web/src/learningJourney.js +0 -0
  362. {codemble-0.22.0 → codemble-0.24.0}/web/src/localServerErrors.js +0 -0
  363. {codemble-0.22.0 → codemble-0.24.0}/web/src/main.jsx +0 -0
  364. {codemble-0.22.0 → codemble-0.24.0}/web/src/mapCanvasRenderer.js +0 -0
  365. {codemble-0.22.0 → codemble-0.24.0}/web/src/mapViewport.js +0 -0
  366. {codemble-0.22.0 → codemble-0.24.0}/web/src/orbitPointerGuard.js +0 -0
  367. {codemble-0.22.0 → codemble-0.24.0}/web/src/possibleRoutes.js +0 -0
  368. {codemble-0.22.0 → codemble-0.24.0}/web/src/projectBrief.js +0 -0
  369. {codemble-0.22.0 → codemble-0.24.0}/web/src/projectMapping.js +0 -0
  370. {codemble-0.22.0 → codemble-0.24.0}/web/src/systemOrbits.js +0 -0
  371. {codemble-0.22.0 → codemble-0.24.0}/web/src/tokens.css +0 -0
  372. {codemble-0.22.0 → codemble-0.24.0}/web/vite.config.js +0 -0
  373. {codemble-0.22.0 → codemble-0.24.0}/workflows/cinematic-public-site-refinement.md +0 -0
@@ -94,11 +94,19 @@ jobs:
94
94
  - name: Escape surfaces
95
95
  if: ${{ !cancelled() }}
96
96
  run: cd web && CODEMBLE_URL=http://127.0.0.1:8899 npm run check:escape
97
+ - name: Study text containment
98
+ if: ${{ !cancelled() }}
99
+ run: cd web && CODEMBLE_URL=http://127.0.0.1:8899 npm run check:text
97
100
  # Owns separate project-bound and unbound-picker servers with disposable
98
101
  # data roots, then exercises the repaired journeys in both browser engines.
99
102
  - name: User-flow repairs
100
103
  if: ${{ !cancelled() }}
101
104
  run: cd web && npm run check:userflows
105
+ # Owns a disposable TLS endpoint and proves the capability viewer in both
106
+ # engines without connecting the local preview to upload or cloud state.
107
+ - name: Private share delivery
108
+ if: ${{ !cancelled() }}
109
+ run: cd web && npm run check:share-delivery
102
110
  package-check:
103
111
  runs-on: ubuntu-latest
104
112
  steps:
@@ -109,4 +117,4 @@ jobs:
109
117
  - name: Build wheel and verify packaged SPA
110
118
  run: |
111
119
  python -m pip wheel . --no-deps --wheel-dir /tmp/codemble-wheel
112
- python -c 'import pathlib, zipfile; wheel = next(pathlib.Path("/tmp/codemble-wheel").glob("*.whl")); names = zipfile.ZipFile(wheel).namelist(); assert "codemble/web_dist/index.html" in names; assert any(name.startswith("codemble/web_dist/assets/") for name in names)'
120
+ python -c 'import pathlib, zipfile; wheel = next(pathlib.Path("/tmp/codemble-wheel").glob("*.whl")); archive = zipfile.ZipFile(wheel); names = archive.namelist(); metadata = archive.read(next(name for name in names if name.endswith(".dist-info/METADATA"))).decode(); assert "codemble/web_dist/index.html" in names; assert "codemble/share/http_delivery.py" in names; assert "codemble/share/persistent_storage.py" in names; assert "Requires-Dist: cryptography<51,>=45" in metadata; assert any(name.startswith("codemble/web_dist/assets/") for name in names)'
@@ -5,6 +5,174 @@ Format: [Keep a Changelog](https://keepachangelog.com/en/1.1.0/) · Versioning:
5
5
 
6
6
  ## [Unreleased]
7
7
 
8
+ ## [0.24.0] - 2026-09-27
9
+
10
+ ### Fixed
11
+ - Keep Python call edges conservative when parameters, assignments, closures,
12
+ comprehensions, lambdas, nested definition expressions, `global`, or
13
+ `nonlocal` bindings shadow an imported name.
14
+ - Bind every Study response to one parser-verified source snapshot. Changed,
15
+ missing, replaced, or undecodable source now refuses Study and narration with
16
+ a clear instruction to reopen the folder.
17
+ - Replace the unsupported “first call” quiz with a multi-answer question over
18
+ every parser-certain direct call target, and invalidate stale question IDs
19
+ without erasing saved file-hash-based understanding.
20
+ - Bypass ambient proxies for validated loopback narration, retain narration
21
+ admission until blocking workers actually finish, and keep parser routes
22
+ responsive under repeated provider timeouts.
23
+ - Serialize progress mutations across threads and processes, prevent invalidated
24
+ graph and Map work from republishing stale caches, and report uncertain
25
+ multi-file mode saves without pretending that a rollback succeeded.
26
+ - Refuse obsolete progress clears before their first client commit. First-run
27
+ launch retries now preserve the visible voyage and explanation choices, while
28
+ returning mode-save failures stay visible beside the control that failed.
29
+ - Bound empty Impact copy to the parser map instead of claiming that no runtime
30
+ dependency or dependent exists.
31
+
32
+ ### Documentation
33
+ - Synchronize the README, public site, captures, correctness and architecture
34
+ guides, release notes, artifact ledger, and installation paths with v0.24.0.
35
+
36
+ ## [0.23.0] - 2026-09-25
37
+
38
+ ### Documentation
39
+ - Align the README, public site, installation guides, artifact ledger, and
40
+ release notes with v0.23.0, pin public assets to the exact tag, and refresh
41
+ Study captures with the selected world visible beside its parser evidence.
42
+
43
+ ### Dependencies
44
+ - Accept cryptography 50, tree-sitter-go 0.25, tree-sitter-rust 0.24, and
45
+ JetBrains Mono 5.3 after focused compatibility, semantic-oracle, real-corpus,
46
+ package, and full-suite verification.
47
+
48
+ ### Fixed
49
+ - Product capture now fixes the visible project label to `Codemble`, making the
50
+ committed screenshots reproducible from arbitrarily named clones and
51
+ worktrees, and parses a Git-filtered source snapshot so ignored build output
52
+ cannot alter the public counts.
53
+ - Missing scheduled-maintenance locks now fail startup instead of silently
54
+ skipping the service, making failures eligible for the existing alert relay.
55
+ The preflight also rejects paths that do not resolve to regular files.
56
+
57
+ ### Performance
58
+ - Avoid repeated whole-project scans while resolving Python import namespaces and generating check options, preserving parser meaning and pinned check answers.
59
+
60
+ ### Added
61
+ - Seeded ocean, ice, rocky, and banded worlds with cloud cover, relief lighting,
62
+ thin atmospheres, a granular Sun, and layered nebula scenery. Surface patterns
63
+ are illustrative; parser-owned positions, roles, routes, and progress retain
64
+ their existing meanings.
65
+ - Study now frames the selected world beside source evidence, with slimmer
66
+ close-up routes and live reduced-motion support. System panels leave more
67
+ space for exploration and orbit explanations no longer overlap world names.
68
+ - A local `ShareArtifact` interface now compiles the render-ready graph into an
69
+ immutable read-only snapshot with per-artifact keyed IDs, source-ID-independent
70
+ collision-aware placement, RFC 8785 canonical bytes, an exact payload digest,
71
+ source-safe provenance, and an absolute expiry capped at 30 days. It adds no
72
+ upload, provider, account, or cloud request.
73
+ - A local share workbench now makes the privacy boundary visible before delivery:
74
+ choose a one-, seven-, or thirty-day lifetime, opt into names and learner
75
+ understanding separately, inspect the exact canonical artifact and its digest,
76
+ then acknowledge only the fields present. Its same-origin preview and
77
+ confirmation routes retain one candidate in process memory and expose no upload
78
+ capability.
79
+ - A provider-neutral capability module now issues independent 256-bit view and
80
+ deletion capabilities for one immutable artifact, stores only derived lookup,
81
+ reuse-detection, and capability-keyed authentication values, irreversibly
82
+ tombstones observed expiry, revalidates the closed schema, relationships,
83
+ digests, and bound storage identity, and atomically revokes access with
84
+ retry-safe results even across a server-clock rollback.
85
+ Its reference adapter is process-local; no provider or cloud storage is
86
+ enabled.
87
+ - A standalone share-delivery application now serves one immutable capability
88
+ over HTTPS-only `GET`, accepts confirmed revocation only through a protected
89
+ deletion-capability header, context-encodes artifact labels into a script-free
90
+ viewer, and normalizes every bearer-bearing or unknown target before ASGI access
91
+ logging. It is not connected to the local preview or any upload route.
92
+ - One trusted Share Artifact interpreter now validates canonical bytes and
93
+ derives the preview and delivery facts consumed by every boundary. The
94
+ compiler lays out and summarizes the exact deduplicated relationship
95
+ projection it serializes while separately validating the parser's full graph.
96
+ - The Share Preview Run now owns the complete choose, compile, inspect,
97
+ acknowledge, confirm, restart, and project-release lifecycle, including stale
98
+ response refusal and focus handoffs, instead of spreading that state between
99
+ the session and dialog.
100
+ - A zero-license-cost operations reference uses Caddy, restic, and rest-server
101
+ with separate append-only writer and local operator roles. It adds hourly
102
+ sweep/backup and daily full-data-check/prune commands, pinned restic bytes,
103
+ operator-managed Caddy configuration and a fixed absolute rest-server path,
104
+ closed configuration templates, a process-serialized create-only Retirement
105
+ Journal that advances only after two named authenticated repositories return
106
+ snapshot- and entry-bound receipts, role-local credential-derived deployment
107
+ attestations, independent journal materialization, application-host-local
108
+ production restore with writer-journal rehydration, a stable application-host
109
+ operation lock outside the replaceable store whose root-owned parent is not
110
+ replaceable by the non-root writer, with trusted-directory and inode checks
111
+ plus process-level exclusion proof for writer and root-operator transitions.
112
+ The public writer cycle acquires that lock before opening its store or journal,
113
+ every writer-owned sibling path is pre-provisioned, and root restores verify a
114
+ recursive ownership handoff to the configured non-root writer before promotion.
115
+ Exact snapshot retirement stays behind a durable creation seal, with
116
+ repository-bound finite whole-key-store retirement authorization.
117
+ Hardware, storage, DNS, electricity, and network access may still cost money.
118
+ - Scheduled writer, operator, and append-only receiver failures now enter one
119
+ provider-neutral alert relay. It writes a closed token-free event to a private
120
+ root-owned spool before invoking a digest-pinned local notifier, retries a
121
+ failed handoff with the same alert ID, and keeps delivered evidence separate
122
+ from the next failure. Real channel delivery remains an operational gate.
123
+
124
+ ### Privacy
125
+ - Raw source, snippets, filesystem paths, dedicated filename metadata, file
126
+ hashes, source positions, external targets, narration/provider data, checks,
127
+ visits, recents, and logs are excluded. Source-derived labels (which can still
128
+ reveal file or module names) and learner understanding are separate,
129
+ false-by-default publisher choices. The compiler closes language/schema/value
130
+ bounds, rejects contradictory or incomplete certain relationships, recomputes
131
+ Home/routes/orbits over represented edges, and deduplicates viewer marks.
132
+ - Preview and confirmation responses are `no-store`, accept strict JSON bodies,
133
+ bind confirmation to the current preview ID and payload digest, and disappear
134
+ with the active project or process. A confirmed preview creates no link and
135
+ performs no outbound or cloud request.
136
+ - Invalid, expired, and revoked view capabilities have one indistinguishable
137
+ result. Deletion requires an explicit confirmation, removes active bytes on
138
+ the first atomic revocation, and retains only a non-serving tombstone so a
139
+ lost response can be retried without restoring access. Raw capabilities and
140
+ artifact bytes are excluded from storage-record representations.
141
+ - Every viewer, revocation, validation-error, and not-found response carries
142
+ `no-store`, `no-referrer`, a self-contained restrictive CSP, no-index and
143
+ opener/resource isolation headers. Lifecycle logs accept only an internal share
144
+ ID, UTC timestamp, closed operation, and closed outcome; raw capabilities,
145
+ request targets, artifacts, IP addresses, and User-Agent data have no logging
146
+ interface. A failed telemetry sink is non-authoritative and cannot strand an
147
+ active share or change view/revocation state. Chromium and WebKit verify no
148
+ cookie or other browser storage, service worker, or third-party request is created.
149
+ - Backups bind the authenticated database digest and backup-repository identity
150
+ to the exact Retirement Journal fully anchored high-water and immutable
151
+ name-to-repository replica inventory, captured before the SQLite snapshot so a
152
+ concurrent retirement cannot be skipped. Restore requires independently
153
+ materialized replicas and their repository-bound receipts to agree, replays
154
+ every later revocation or expiry, rehydrates the writer journal, and fails
155
+ closed on gaps, forks, stale copies, or missing rollback authority. Only the
156
+ independently held operator role can check, restore, prune, inventory, or
157
+ remove snapshots. Explicit removal installs an authenticated durable seal that
158
+ closes later creates and writer cycles, then deletes only the exact live
159
+ inventory; final authorization re-queries that repository rather than
160
+ accepting caller-asserted emptiness. The separately held recovery-key copy
161
+ must authenticate the same active storage key while role-local attestations
162
+ prove authority credentials stay different without bringing both secret
163
+ configurations together.
164
+ The local compiler and exact disclosure preview ship connected in v0.23.0,
165
+ while capability persistence, standalone delivery, backup, and operations
166
+ remain disconnected from public delivery. Public share delivery stays blocked
167
+ until the intended independent node, timers, alerts, restore drill, deletion
168
+ deadline, and approved media-erasure procedure are observed in operation.
169
+
170
+ ### Release boundary
171
+ - v0.23.0 publishes the graphics, local learning experience, dependency updates,
172
+ documentation, local-only share preview, and disconnected delivery foundations.
173
+ It does not connect an upload or public delivery route and makes no
174
+ operational-erasure claim.
175
+
8
176
  ## [0.22.0] - 2026-08-25
9
177
 
10
178
  ### Added