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