dreamcatcher 5.5.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 (290) hide show
  1. dreamcatcher-5.5.0/.agents/skills/uncoded-code-navigation/SKILL.md +113 -0
  2. dreamcatcher-5.5.0/.agents/skills/uncoded-consistency-review/SKILL.md +145 -0
  3. dreamcatcher-5.5.0/.agents/skills/uncoded-doc-navigation/SKILL.md +29 -0
  4. dreamcatcher-5.5.0/.claude/skills/uncoded-code-navigation/SKILL.md +113 -0
  5. dreamcatcher-5.5.0/.claude/skills/uncoded-consistency-review/SKILL.md +145 -0
  6. dreamcatcher-5.5.0/.claude/skills/uncoded-doc-navigation/SKILL.md +29 -0
  7. dreamcatcher-5.5.0/.gitattributes +17 -0
  8. dreamcatcher-5.5.0/.github/dependabot.yml +38 -0
  9. dreamcatcher-5.5.0/.github/workflows/ci.yml +87 -0
  10. dreamcatcher-5.5.0/.github/workflows/dependency-review.yml +17 -0
  11. dreamcatcher-5.5.0/.github/workflows/docs.yml +44 -0
  12. dreamcatcher-5.5.0/.github/workflows/publish.yml +57 -0
  13. dreamcatcher-5.5.0/.gitignore +218 -0
  14. dreamcatcher-5.5.0/.markdownlint-cli2.yaml +14 -0
  15. dreamcatcher-5.5.0/.pre-commit-config.yaml +120 -0
  16. dreamcatcher-5.5.0/.prettierignore +4 -0
  17. dreamcatcher-5.5.0/.prettierrc +4 -0
  18. dreamcatcher-5.5.0/.python-version +1 -0
  19. dreamcatcher-5.5.0/AGENTS.md +308 -0
  20. dreamcatcher-5.5.0/CLAUDE.md +1 -0
  21. dreamcatcher-5.5.0/LICENSE +21 -0
  22. dreamcatcher-5.5.0/PKG-INFO +38 -0
  23. dreamcatcher-5.5.0/README.md +17 -0
  24. dreamcatcher-5.5.0/docs/architecture.md +641 -0
  25. dreamcatcher-5.5.0/docs/changelog.md +335 -0
  26. dreamcatcher-5.5.0/docs/command-reference.md +232 -0
  27. dreamcatcher-5.5.0/docs/compatibility.md +75 -0
  28. dreamcatcher-5.5.0/docs/configuration-reference.md +142 -0
  29. dreamcatcher-5.5.0/docs/configure.md +124 -0
  30. dreamcatcher-5.5.0/docs/contract.md +230 -0
  31. dreamcatcher-5.5.0/docs/customise-skills.md +56 -0
  32. dreamcatcher-5.5.0/docs/discuss-an-issue.md +67 -0
  33. dreamcatcher-5.5.0/docs/index.md +89 -0
  34. dreamcatcher-5.5.0/docs/measurement.md +136 -0
  35. dreamcatcher-5.5.0/docs/ontology.md +564 -0
  36. dreamcatcher-5.5.0/docs/releasing.md +61 -0
  37. dreamcatcher-5.5.0/docs/review-an-assignment.md +68 -0
  38. dreamcatcher-5.5.0/docs/run-and-monitor.md +102 -0
  39. dreamcatcher-5.5.0/docs/special-cases.md +21 -0
  40. dreamcatcher-5.5.0/docs/standard.md +260 -0
  41. dreamcatcher-5.5.0/docs/stop-and-recover.md +127 -0
  42. dreamcatcher-5.5.0/docs/stylesheets/dusk.css +189 -0
  43. dreamcatcher-5.5.0/docs/stylesheets/hero.css +341 -0
  44. dreamcatcher-5.5.0/docs/stylesheets/nature.css +211 -0
  45. dreamcatcher-5.5.0/docs/testing.md +81 -0
  46. dreamcatcher-5.5.0/docs/tutorial.md +206 -0
  47. dreamcatcher-5.5.0/dreamcatcher.toml +33 -0
  48. dreamcatcher-5.5.0/mkdocs.yml +93 -0
  49. dreamcatcher-5.5.0/overrides/home.html +98 -0
  50. dreamcatcher-5.5.0/overrides/main.html +5 -0
  51. dreamcatcher-5.5.0/pyproject.toml +174 -0
  52. dreamcatcher-5.5.0/specs/2026-08-17-skeleton/design.md +702 -0
  53. dreamcatcher-5.5.0/specs/2026-08-17-skeleton/plan.md +480 -0
  54. dreamcatcher-5.5.0/specs/2026-08-17-skeleton/requirements.md +120 -0
  55. dreamcatcher-5.5.0/specs/2026-08-17-skeleton/state.md +350 -0
  56. dreamcatcher-5.5.0/specs/2026-09-08-watchtower/design.md +405 -0
  57. dreamcatcher-5.5.0/specs/2026-09-08-watchtower/plan.md +205 -0
  58. dreamcatcher-5.5.0/specs/2026-09-08-watchtower/requirements.md +107 -0
  59. dreamcatcher-5.5.0/specs/2026-09-15-architecture-migration/roadmap.md +698 -0
  60. dreamcatcher-5.5.0/specs/2026-09-17-web-ui/design-v1/Dreamcatcher Status.dc.html +525 -0
  61. dreamcatcher-5.5.0/specs/2026-09-17-web-ui/design-v1/README.md +271 -0
  62. dreamcatcher-5.5.0/specs/2026-09-17-web-ui/design-v1/assets/dreamcatcher-lockup.png +0 -0
  63. dreamcatcher-5.5.0/specs/2026-09-17-web-ui/design-v1/assets/dreamcatcher-mark-phosphor.png +0 -0
  64. dreamcatcher-5.5.0/specs/2026-09-17-web-ui/design-v1/assets/dreamcatcher-mark.png +0 -0
  65. dreamcatcher-5.5.0/specs/2026-09-17-web-ui/design-v1/screenshots/01-home.png +0 -0
  66. dreamcatcher-5.5.0/specs/2026-09-17-web-ui/design-v1/screenshots/02-feed.png +0 -0
  67. dreamcatcher-5.5.0/specs/2026-09-17-web-ui/design-v1/support.js +1911 -0
  68. dreamcatcher-5.5.0/specs/2026-09-17-web-ui/design-v2/Dreamcatcher Status Natural.dc.html +589 -0
  69. dreamcatcher-5.5.0/specs/2026-09-17-web-ui/design-v2/Dreamcatcher Status.dc.html +528 -0
  70. dreamcatcher-5.5.0/specs/2026-09-17-web-ui/design-v2/README.md +423 -0
  71. dreamcatcher-5.5.0/specs/2026-09-17-web-ui/design-v2/assets/dreamcatcher-lockup.png +0 -0
  72. dreamcatcher-5.5.0/specs/2026-09-17-web-ui/design-v2/assets/dreamcatcher-mark-ink.png +0 -0
  73. dreamcatcher-5.5.0/specs/2026-09-17-web-ui/design-v2/assets/dreamcatcher-mark-phosphor.png +0 -0
  74. dreamcatcher-5.5.0/specs/2026-09-17-web-ui/design-v2/assets/dreamcatcher-mark.png +0 -0
  75. dreamcatcher-5.5.0/specs/2026-09-17-web-ui/design-v2/screenshots/01-matrix-home.png +0 -0
  76. dreamcatcher-5.5.0/specs/2026-09-17-web-ui/design-v2/screenshots/02-matrix-feed.png +0 -0
  77. dreamcatcher-5.5.0/specs/2026-09-17-web-ui/design-v2/screenshots/03-nature-home.png +0 -0
  78. dreamcatcher-5.5.0/specs/2026-09-17-web-ui/design-v2/screenshots/04-nature-feed.png +0 -0
  79. dreamcatcher-5.5.0/specs/2026-09-17-web-ui/design-v2/support.js +1911 -0
  80. dreamcatcher-5.5.0/specs/2026-09-17-web-ui/design.md +464 -0
  81. dreamcatcher-5.5.0/specs/2026-09-17-web-ui/roadmap.md +288 -0
  82. dreamcatcher-5.5.0/specs/2026-09-21-issue-conversations/design.md +377 -0
  83. dreamcatcher-5.5.0/specs/2026-09-21-issue-conversations/reading-guide.md +245 -0
  84. dreamcatcher-5.5.0/specs/2026-09-21-issue-conversations/requirements.md +92 -0
  85. dreamcatcher-5.5.0/specs/2026-09-21-issue-conversations/roadmap.md +371 -0
  86. dreamcatcher-5.5.0/specs/2026-09-29-stop-controls/design.md +93 -0
  87. dreamcatcher-5.5.0/specs/2026-09-30-engineering-standard/agent-work-shape.md +1306 -0
  88. dreamcatcher-5.5.0/specs/2026-09-30-engineering-standard/documentation-plan.md +260 -0
  89. dreamcatcher-5.5.0/specs/2026-09-30-engineering-standard/roadmap.md +559 -0
  90. dreamcatcher-5.5.0/specs/2026-10-03-cancel-assignments/design.md +112 -0
  91. dreamcatcher-5.5.0/specs/2026-10-05-agent-work-facts/design.md +81 -0
  92. dreamcatcher-5.5.0/specs/2026-10-06-init/design.md +106 -0
  93. dreamcatcher-5.5.0/specs/AGENTS.md +26 -0
  94. dreamcatcher-5.5.0/src/dreamcatcher/__init__.py +1 -0
  95. dreamcatcher-5.5.0/src/dreamcatcher/agent_assignment_pull_requests.py +155 -0
  96. dreamcatcher-5.5.0/src/dreamcatcher/agent_assignments.py +571 -0
  97. dreamcatcher-5.5.0/src/dreamcatcher/agent_rounds.py +658 -0
  98. dreamcatcher-5.5.0/src/dreamcatcher/agent_work.py +116 -0
  99. dreamcatcher-5.5.0/src/dreamcatcher/claude.py +401 -0
  100. dreamcatcher-5.5.0/src/dreamcatcher/cli.py +477 -0
  101. dreamcatcher-5.5.0/src/dreamcatcher/clock.py +15 -0
  102. dreamcatcher-5.5.0/src/dreamcatcher/codex.py +380 -0
  103. dreamcatcher-5.5.0/src/dreamcatcher/commands.py +271 -0
  104. dreamcatcher-5.5.0/src/dreamcatcher/config.py +206 -0
  105. dreamcatcher-5.5.0/src/dreamcatcher/daemon.py +260 -0
  106. dreamcatcher-5.5.0/src/dreamcatcher/daemon_runs.py +16 -0
  107. dreamcatcher-5.5.0/src/dreamcatcher/default_config.toml +39 -0
  108. dreamcatcher-5.5.0/src/dreamcatcher/documents.py +343 -0
  109. dreamcatcher-5.5.0/src/dreamcatcher/errors.py +10 -0
  110. dreamcatcher-5.5.0/src/dreamcatcher/feed.py +195 -0
  111. dreamcatcher-5.5.0/src/dreamcatcher/git.py +219 -0
  112. dreamcatcher-5.5.0/src/dreamcatcher/github.py +703 -0
  113. dreamcatcher-5.5.0/src/dreamcatcher/harness_adapters.py +204 -0
  114. dreamcatcher-5.5.0/src/dreamcatcher/harnesses.py +74 -0
  115. dreamcatcher-5.5.0/src/dreamcatcher/issue_conversations.py +366 -0
  116. dreamcatcher-5.5.0/src/dreamcatcher/lock.py +121 -0
  117. dreamcatcher-5.5.0/src/dreamcatcher/prompts.py +158 -0
  118. dreamcatcher-5.5.0/src/dreamcatcher/relay.py +58 -0
  119. dreamcatcher-5.5.0/src/dreamcatcher/repository_setup.py +190 -0
  120. dreamcatcher-5.5.0/src/dreamcatcher/scheduler/__init__.py +22 -0
  121. dreamcatcher-5.5.0/src/dreamcatcher/scheduler/agent_work.py +112 -0
  122. dreamcatcher-5.5.0/src/dreamcatcher/scheduler/assignments.py +446 -0
  123. dreamcatcher-5.5.0/src/dreamcatcher/scheduler/conversations.py +510 -0
  124. dreamcatcher-5.5.0/src/dreamcatcher/scheduler/faults.py +101 -0
  125. dreamcatcher-5.5.0/src/dreamcatcher/scheduler/issues.py +249 -0
  126. dreamcatcher-5.5.0/src/dreamcatcher/scheduler/models.py +261 -0
  127. dreamcatcher-5.5.0/src/dreamcatcher/scheduler/tick.py +263 -0
  128. dreamcatcher-5.5.0/src/dreamcatcher/state.py +90 -0
  129. dreamcatcher-5.5.0/src/dreamcatcher/static/assignment.js +172 -0
  130. dreamcatcher-5.5.0/src/dreamcatcher/static/base.js +5 -0
  131. dreamcatcher-5.5.0/src/dreamcatcher/static/dreamcatcher-mark-ink.png +0 -0
  132. dreamcatcher-5.5.0/src/dreamcatcher/static/dreamcatcher-mark-phosphor.png +0 -0
  133. dreamcatcher-5.5.0/src/dreamcatcher/static/home.js +82 -0
  134. dreamcatcher-5.5.0/src/dreamcatcher/static/matrix.css +797 -0
  135. dreamcatcher-5.5.0/src/dreamcatcher/static/nature.css +837 -0
  136. dreamcatcher-5.5.0/src/dreamcatcher/static/nature.js +38 -0
  137. dreamcatcher-5.5.0/src/dreamcatcher/static/vendor/README.md +10 -0
  138. dreamcatcher-5.5.0/src/dreamcatcher/static/vendor/htmx-2.0.10.LICENSE +13 -0
  139. dreamcatcher-5.5.0/src/dreamcatcher/static/vendor/htmx-2.0.10.min.js +1 -0
  140. dreamcatcher-5.5.0/src/dreamcatcher/static/vendor/idiomorph-0.7.4.LICENSE +13 -0
  141. dreamcatcher-5.5.0/src/dreamcatcher/static/vendor/idiomorph-ext-0.7.4.min.js +1 -0
  142. dreamcatcher-5.5.0/src/dreamcatcher/status/__init__.py +49 -0
  143. dreamcatcher-5.5.0/src/dreamcatcher/status/agent_work.py +94 -0
  144. dreamcatcher-5.5.0/src/dreamcatcher/status/assignments.py +342 -0
  145. dreamcatcher-5.5.0/src/dreamcatcher/status/conversations.py +448 -0
  146. dreamcatcher-5.5.0/src/dreamcatcher/status/report.py +524 -0
  147. dreamcatcher-5.5.0/src/dreamcatcher/status/rounds.py +116 -0
  148. dreamcatcher-5.5.0/src/dreamcatcher/teardown.py +115 -0
  149. dreamcatcher-5.5.0/src/dreamcatcher/templates/assignment.html +48 -0
  150. dreamcatcher-5.5.0/src/dreamcatcher/templates/base.html +20 -0
  151. dreamcatcher-5.5.0/src/dreamcatcher/templates/conversation.html +49 -0
  152. dreamcatcher-5.5.0/src/dreamcatcher/templates/error.html +9 -0
  153. dreamcatcher-5.5.0/src/dreamcatcher/templates/home.html +52 -0
  154. dreamcatcher-5.5.0/src/dreamcatcher/templates/partials/agent-work-control.html +8 -0
  155. dreamcatcher-5.5.0/src/dreamcatcher/templates/partials/agent-work-detail.html +1 -0
  156. dreamcatcher-5.5.0/src/dreamcatcher/templates/partials/agent-work-foot.html +12 -0
  157. dreamcatcher-5.5.0/src/dreamcatcher/templates/partials/agent-work-retry.html +1 -0
  158. dreamcatcher-5.5.0/src/dreamcatcher/templates/partials/agent-work-status.html +1 -0
  159. dreamcatcher-5.5.0/src/dreamcatcher/templates/partials/assignment-card.html +15 -0
  160. dreamcatcher-5.5.0/src/dreamcatcher/templates/partials/assignment-rounds.html +15 -0
  161. dreamcatcher-5.5.0/src/dreamcatcher/templates/partials/conversation-card.html +16 -0
  162. dreamcatcher-5.5.0/src/dreamcatcher/templates/partials/failed-setup-row.html +4 -0
  163. dreamcatcher-5.5.0/src/dreamcatcher/templates/partials/feed-line.html +4 -0
  164. dreamcatcher-5.5.0/src/dreamcatcher/templates/partials/instance.html +10 -0
  165. dreamcatcher-5.5.0/src/dreamcatcher/templates/partials/issue-reference.html +7 -0
  166. dreamcatcher-5.5.0/src/dreamcatcher/templates/partials/issue-row.html +7 -0
  167. dreamcatcher-5.5.0/src/dreamcatcher/templates/partials/site-header.html +12 -0
  168. dreamcatcher-5.5.0/src/dreamcatcher/templates/tail.html +12 -0
  169. dreamcatcher-5.5.0/src/dreamcatcher/tui/__init__.py +17 -0
  170. dreamcatcher-5.5.0/src/dreamcatcher/tui/shared.py +156 -0
  171. dreamcatcher-5.5.0/src/dreamcatcher/tui/status.py +200 -0
  172. dreamcatcher-5.5.0/src/dreamcatcher/tui/views.py +553 -0
  173. dreamcatcher-5.5.0/src/dreamcatcher/version.py +5 -0
  174. dreamcatcher-5.5.0/src/dreamcatcher/web/__init__.py +6 -0
  175. dreamcatcher-5.5.0/src/dreamcatcher/web/app.py +598 -0
  176. dreamcatcher-5.5.0/src/dreamcatcher/web/feed.py +242 -0
  177. dreamcatcher-5.5.0/src/dreamcatcher/web/models.py +204 -0
  178. dreamcatcher-5.5.0/src/dreamcatcher/web/server.py +81 -0
  179. dreamcatcher-5.5.0/src/dreamcatcher/web/views.py +302 -0
  180. dreamcatcher-5.5.0/src/dreamcatcher/words.py +71 -0
  181. dreamcatcher-5.5.0/tests/clocks.py +24 -0
  182. dreamcatcher-5.5.0/tests/conftest.py +406 -0
  183. dreamcatcher-5.5.0/tests/fakes.py +270 -0
  184. dreamcatcher-5.5.0/tests/fixtures/assignment/fault.txt +23 -0
  185. dreamcatcher-5.5.0/tests/fixtures/assignment/older-assignments.txt +25 -0
  186. dreamcatcher-5.5.0/tests/fixtures/assignment/silent-round.txt +18 -0
  187. dreamcatcher-5.5.0/tests/fixtures/assignment/waiting-to-start.txt +14 -0
  188. dreamcatcher-5.5.0/tests/fixtures/assignment/working.txt +19 -0
  189. dreamcatcher-5.5.0/tests/fixtures/claude/background-command.feed.txt +8 -0
  190. dreamcatcher-5.5.0/tests/fixtures/claude/background-command.harness-feed.txt +8 -0
  191. dreamcatcher-5.5.0/tests/fixtures/claude/background-command.jsonl +16 -0
  192. dreamcatcher-5.5.0/tests/fixtures/claude/failed-round.feed.txt +4 -0
  193. dreamcatcher-5.5.0/tests/fixtures/claude/failed-round.harness-feed.txt +4 -0
  194. dreamcatcher-5.5.0/tests/fixtures/claude/failed-round.jsonl +5 -0
  195. dreamcatcher-5.5.0/tests/fixtures/claude/rate-limited.feed.txt +14 -0
  196. dreamcatcher-5.5.0/tests/fixtures/claude/rate-limited.harness-feed.txt +14 -0
  197. dreamcatcher-5.5.0/tests/fixtures/claude/rate-limited.jsonl +15 -0
  198. dreamcatcher-5.5.0/tests/fixtures/claude/round.feed.txt +16 -0
  199. dreamcatcher-5.5.0/tests/fixtures/claude/round.harness-feed.txt +16 -0
  200. dreamcatcher-5.5.0/tests/fixtures/claude/round.jsonl +26 -0
  201. dreamcatcher-5.5.0/tests/fixtures/codex/failed-round.feed.txt +3 -0
  202. dreamcatcher-5.5.0/tests/fixtures/codex/failed-round.harness-feed.txt +3 -0
  203. dreamcatcher-5.5.0/tests/fixtures/codex/failed-round.jsonl +5 -0
  204. dreamcatcher-5.5.0/tests/fixtures/codex/rate-limited.feed.txt +2 -0
  205. dreamcatcher-5.5.0/tests/fixtures/codex/rate-limited.harness-feed.txt +2 -0
  206. dreamcatcher-5.5.0/tests/fixtures/codex/rate-limited.jsonl +4 -0
  207. dreamcatcher-5.5.0/tests/fixtures/codex/resumed-round.feed.txt +5 -0
  208. dreamcatcher-5.5.0/tests/fixtures/codex/resumed-round.harness-feed.txt +5 -0
  209. dreamcatcher-5.5.0/tests/fixtures/codex/resumed-round.jsonl +7 -0
  210. dreamcatcher-5.5.0/tests/fixtures/codex/round.feed.txt +9 -0
  211. dreamcatcher-5.5.0/tests/fixtures/codex/round.harness-feed.txt +9 -0
  212. dreamcatcher-5.5.0/tests/fixtures/codex/round.jsonl +13 -0
  213. dreamcatcher-5.5.0/tests/fixtures/feed/older-assignments.txt +2 -0
  214. dreamcatcher-5.5.0/tests/fixtures/feed/working.txt +11 -0
  215. dreamcatcher-5.5.0/tests/fixtures/github/pull-request-52/conversation.json +1 -0
  216. dreamcatcher-5.5.0/tests/fixtures/github/pull-request-52/inline-comments.json +1 -0
  217. dreamcatcher-5.5.0/tests/fixtures/github/pull-request-52/reviews.json +1 -0
  218. dreamcatcher-5.5.0/tests/fixtures/status/at-cap.txt +13 -0
  219. dreamcatcher-5.5.0/tests/fixtures/status/dead-daemon.txt +23 -0
  220. dreamcatcher-5.5.0/tests/fixtures/status/everything.txt +26 -0
  221. dreamcatcher-5.5.0/tests/fixtures/status/failed-setup.txt +12 -0
  222. dreamcatcher-5.5.0/tests/fixtures/status/nothing.txt +9 -0
  223. dreamcatcher-5.5.0/tests/fixtures/status/repeat-assignments.txt +10 -0
  224. dreamcatcher-5.5.0/tests/fixtures/status/silent-round.txt +10 -0
  225. dreamcatcher-5.5.0/tests/fixtures/web/assignments/cancelled.html +95 -0
  226. dreamcatcher-5.5.0/tests/fixtures/web/assignments/complete.html +109 -0
  227. dreamcatcher-5.5.0/tests/fixtures/web/assignments/fault.html +113 -0
  228. dreamcatcher-5.5.0/tests/fixtures/web/assignments/silent-round.html +109 -0
  229. dreamcatcher-5.5.0/tests/fixtures/web/assignments/waiting-to-start.html +81 -0
  230. dreamcatcher-5.5.0/tests/fixtures/web/assignments/working.html +130 -0
  231. dreamcatcher-5.5.0/tests/fixtures/web/at-cap.html +111 -0
  232. dreamcatcher-5.5.0/tests/fixtures/web/dead-daemon.html +257 -0
  233. dreamcatcher-5.5.0/tests/fixtures/web/everything.html +262 -0
  234. dreamcatcher-5.5.0/tests/fixtures/web/failed-setup.html +106 -0
  235. dreamcatcher-5.5.0/tests/fixtures/web/nothing.html +69 -0
  236. dreamcatcher-5.5.0/tests/fixtures/web/repeat-assignments.html +121 -0
  237. dreamcatcher-5.5.0/tests/fixtures/web/silent-round.html +90 -0
  238. dreamcatcher-5.5.0/tests/fixtures/web/tail.html +27 -0
  239. dreamcatcher-5.5.0/tests/fixtures/web/titles-and-pull-requests.html +178 -0
  240. dreamcatcher-5.5.0/tests/observations.py +120 -0
  241. dreamcatcher-5.5.0/tests/recordings.py +21 -0
  242. dreamcatcher-5.5.0/tests/records.py +229 -0
  243. dreamcatcher-5.5.0/tests/serve_fabricated_web.py +37 -0
  244. dreamcatcher-5.5.0/tests/status_fabrications.py +590 -0
  245. dreamcatcher-5.5.0/tests/test_agent_assignments.py +1365 -0
  246. dreamcatcher-5.5.0/tests/test_agent_rounds.py +1008 -0
  247. dreamcatcher-5.5.0/tests/test_agent_work.py +103 -0
  248. dreamcatcher-5.5.0/tests/test_architecture.py +147 -0
  249. dreamcatcher-5.5.0/tests/test_assignment_scheduling.py +569 -0
  250. dreamcatcher-5.5.0/tests/test_browser.py +236 -0
  251. dreamcatcher-5.5.0/tests/test_claude.py +421 -0
  252. dreamcatcher-5.5.0/tests/test_cli.py +753 -0
  253. dreamcatcher-5.5.0/tests/test_clock.py +7 -0
  254. dreamcatcher-5.5.0/tests/test_codex.py +395 -0
  255. dreamcatcher-5.5.0/tests/test_commands.py +207 -0
  256. dreamcatcher-5.5.0/tests/test_config.py +431 -0
  257. dreamcatcher-5.5.0/tests/test_conversation_scheduling.py +2127 -0
  258. dreamcatcher-5.5.0/tests/test_conversation_status.py +750 -0
  259. dreamcatcher-5.5.0/tests/test_conversation_tui.py +594 -0
  260. dreamcatcher-5.5.0/tests/test_conversation_web.py +705 -0
  261. dreamcatcher-5.5.0/tests/test_daemon.py +709 -0
  262. dreamcatcher-5.5.0/tests/test_documents.py +377 -0
  263. dreamcatcher-5.5.0/tests/test_encoding_gate.py +9 -0
  264. dreamcatcher-5.5.0/tests/test_fakes.py +101 -0
  265. dreamcatcher-5.5.0/tests/test_feed.py +265 -0
  266. dreamcatcher-5.5.0/tests/test_git.py +350 -0
  267. dreamcatcher-5.5.0/tests/test_github.py +687 -0
  268. dreamcatcher-5.5.0/tests/test_github_integration.py +95 -0
  269. dreamcatcher-5.5.0/tests/test_harnesses.py +10 -0
  270. dreamcatcher-5.5.0/tests/test_issue_availability.py +520 -0
  271. dreamcatcher-5.5.0/tests/test_issue_conversations.py +547 -0
  272. dreamcatcher-5.5.0/tests/test_lock.py +214 -0
  273. dreamcatcher-5.5.0/tests/test_prompts.py +156 -0
  274. dreamcatcher-5.5.0/tests/test_recordings.py +74 -0
  275. dreamcatcher-5.5.0/tests/test_relay.py +263 -0
  276. dreamcatcher-5.5.0/tests/test_repository_setup.py +329 -0
  277. dreamcatcher-5.5.0/tests/test_scheduler.py +1451 -0
  278. dreamcatcher-5.5.0/tests/test_state.py +61 -0
  279. dreamcatcher-5.5.0/tests/test_status.py +1118 -0
  280. dreamcatcher-5.5.0/tests/test_teardown.py +54 -0
  281. dreamcatcher-5.5.0/tests/test_tui.py +920 -0
  282. dreamcatcher-5.5.0/tests/test_view_goldens.py +31 -0
  283. dreamcatcher-5.5.0/tests/test_web.py +1730 -0
  284. dreamcatcher-5.5.0/tests/test_words.py +68 -0
  285. dreamcatcher-5.5.0/tests/web_browser.py +71 -0
  286. dreamcatcher-5.5.0/tools/forbid_invisible_characters.py +41 -0
  287. dreamcatcher-5.5.0/tools/measure_source.py +127 -0
  288. dreamcatcher-5.5.0/tools/mkdocs_static.py +34 -0
  289. dreamcatcher-5.5.0/tools/require_keyword_parameters.py +85 -0
  290. dreamcatcher-5.5.0/uv.lock +1389 -0
@@ -0,0 +1,113 @@
1
+ ---
2
+ name: uncoded-code-navigation
3
+ description: Load once per session, before the first search, read, or edit of Python source in a codebase indexed by uncoded. Covers locating a symbol, reading a definition, or checking references before you refactor, rename, or delete.
4
+ ---
5
+
6
+ <!-- Generated by uncoded — do not edit; regeneration overwrites. -->
7
+
8
+ # Code Navigation
9
+
10
+ This codebase uses [uncoded](https://github.com/alimanfoo/uncoded) to maintain a
11
+ symbol index over its source code, with two associated CLI tools: `uncoded body`
12
+ for reading a symbol's body and `uncoded refs` for finding references.
13
+
14
+ ## The dispatch rule
15
+
16
+ **If your search term is the name of a Python symbol, use the index. Python
17
+ symbols are classes, functions, methods, attributes, and module-level constants.
18
+ If it's a pattern, regex, or free-text phrase, use grep.**
19
+
20
+ This dispatch rule applies to every tool call where you find code, not just the
21
+ first in the session. The pretrained reflex for "find X" is grep, and that
22
+ reflex is wrong here. Reaching for `grep -rn 'def parse_config'` to read a
23
+ function's body is a case for `uncoded body`. Reaching for
24
+ `grep -rn 'validate_input'` to check callers before a refactor is a case for
25
+ `uncoded refs`. Reaching for `grep` then `Edit` to delete dead code is a case
26
+ for `uncoded refs` to confirm the code is dead, then `Edit`. The grep version of
27
+ any of these is noisier and less reliable. Grep matches comments, strings, and
28
+ unrelated attributes. Grep misses re-exports, so caller and delete checks come
29
+ back incomplete. Grep forces offset arithmetic to slice a body. The indexed
30
+ tools don't.
31
+
32
+ ## How to execute the rule
33
+
34
+ The index has two parts: a namespace map and per-file stubs. Follow this
35
+ sequence.
36
+
37
+ **Step 1: Orient. Read the namespace map first.** If the map is missing, run the
38
+ repository's configured `uncoded sync` command. Then, before answering the user,
39
+ before any other tool call:
40
+
41
+ ```text
42
+ Read .uncoded/namespace.yaml
43
+ ```
44
+
45
+ This lists every symbol in the codebase: directories, files, classes, methods,
46
+ functions. Without it loaded, "find X" answers come from pretrained guesses.
47
+ They reflect what a project like this probably contains, not what is actually
48
+ here. Read it once, in full, at session start.
49
+
50
+ **Step 2: Understand. Read the `.pyi` stub before any `.py` source.** Stub paths
51
+ mirror source paths under `.uncoded/stubs/`:
52
+
53
+ ```text
54
+ src/foo/bar.py → .uncoded/stubs/src/foo/bar.pyi
55
+ tests/test_foo.py → .uncoded/stubs/tests/test_foo.pyi
56
+ ```
57
+
58
+ Read the stub for every file you intend to touch or reference, including tests.
59
+ The stub contains imports, every signature with types, module-level assignments,
60
+ and class attributes. That is enough for most navigation. Skipping straight to
61
+ source means reading many lines to learn what the stub would have told you in
62
+ one. If no stub exists at the expected path, the file has no symbols indexed. In
63
+ that narrow case, read source directly.
64
+
65
+ **Step 3: Act.** Use `uncoded body` to read a symbol's body. Use `uncoded refs`
66
+ to find every reference to a symbol. Use `Edit` (with `uncoded body`'s output as
67
+ `old_string`) to change a symbol. With the map and stub loaded, you have the
68
+ exact `relative_path` and `name_path` each tool needs. Use `ClassName/method`
69
+ for a method and `function_name` for a top-level function. Per task:
70
+
71
+ - **Read a symbol's body.** `uvx uncoded body <name_path> --in <relative_path>`
72
+ prints the symbol's source text to stdout, byte-identical to disk. Returns
73
+ exactly the symbol. No offset arithmetic, no risk of reading too much. Its
74
+ output has every byte `Edit` needs as `old_string`. You need no extra `Read`
75
+ for partial edits. Stay on stubs for a wider sweep.
76
+
77
+ - **Find every reference to a symbol.**
78
+ `uvx uncoded refs <name_path> --in <relative_path>`. Prints one reference per
79
+ line as `<path>:<line>:<col>`, sorted by path, then line, then column. Each
80
+ path is relative to the current working directory when possible and otherwise
81
+ absolute. Grep on the name misses re-exports and adds false positives from
82
+ comments, strings, and attribute lookups on other types. If the next move
83
+ depends on the answer being complete, grep cannot give you that.
84
+
85
+ - **Edit a symbol.** `uvx uncoded body <name_path> --in <relative_path>` gives
86
+ the exact `old_string`; then `Edit` to apply the change.
87
+
88
+ - **Rename.** `uvx uncoded refs <name_path> --in <relative_path>` enumerates
89
+ every site; then `Edit` at each.
90
+
91
+ - **Safely delete.** `uvx uncoded refs <name_path> --in <relative_path>` must
92
+ return empty; then `Edit` to remove.
93
+
94
+ **Step 4: Refresh.** After every modification to indexed Python source, run the
95
+ repository's configured `uncoded sync` command before the next code-navigation
96
+ operation. The modification can change the namespace map and stubs.
97
+
98
+ ## Where Read, Edit, and grep are still the right tools
99
+
100
+ The rule is about source navigation by symbol name. Outside that, Read, Edit,
101
+ and grep stay correct:
102
+
103
+ - Free-text or pattern search outside source: Markdown, YAML, TOML, configs,
104
+ commit messages, notebook JSON, fixture data.
105
+ - Pattern search across signatures (regex over type annotations, decorator
106
+ usage, alias declarations). These are not symbol-name lookups, even though
107
+ they sit inside source.
108
+ - Partial-line edits inside a symbol body, once you have retrieved it via
109
+ `uncoded body`.
110
+ - The rare stub-less Python file that needs exploratory reading.
111
+
112
+ The dispatch rule turns on the search term. A symbol name goes to the index. A
113
+ regex or free-text phrase goes to grep.
@@ -0,0 +1,145 @@
1
+ ---
2
+ name: uncoded-consistency-review
3
+ description: Review a Python codebase for semantic and naming consistency. It reports only concrete disagreements between two claims about the same concept, with verbatim evidence for each claim. It assumes uncoded is installed (.uncoded/namespace.yaml and .uncoded/stubs/ present).
4
+ ---
5
+
6
+ <!-- Generated by uncoded — do not edit; regeneration overwrites. -->
7
+
8
+ # Semantic Consistency Review
9
+
10
+ Review a Python codebase for concrete disagreements in its vocabulary and symbol
11
+ contracts. A finding must identify two claims about the same concept that ought
12
+ to agree, but do not.
13
+
14
+ ## Guardrails
15
+
16
+ Admit a finding only when the codebase supports both claims, their observable
17
+ difference, and the reason that they should agree. Quote both claims verbatim.
18
+ Omit a candidate when either claim or the reason for comparing them is
19
+ unsupported.
20
+
21
+ Review semantic and naming consistency, not formatting or style consistency. Do
22
+ not report general bugs, complexity, performance, security, or design
23
+ preferences unless they appear as a disagreement between two supported claims.
24
+ Do not report overgrown public surfaces, private imports, cross-domain imports,
25
+ zero-reference symbols, or redundant public surfaces merely because they exist.
26
+
27
+ ## Prerequisites
28
+
29
+ Run the repository's configured `uncoded sync` command. Read the repository's
30
+ agent instructions and follow its navigation rules.
31
+
32
+ ## Orientation
33
+
34
+ Read `.uncoded/namespace.yaml` in full. Use its package structure and symbol
35
+ names to map the codebase's main concepts and vocabulary.
36
+
37
+ ## Vocabulary sweep
38
+
39
+ Use the namespace and stubs to find candidates, then confirm semantic overlap
40
+ from signatures, docstrings, or bodies. Look for:
41
+
42
+ - **Competing terms:** different names for substantively the same concept.
43
+ - **Conflicting use:** the same term used incompatibly within a shared context.
44
+ - **Stale qualifiers:** names such as `legacy`, `v2`, or `final` whose
45
+ distinction conflicts with another symbol or a symbol's docstring.
46
+
47
+ Similar spelling, low vocabulary overlap, or the presence of a qualifier is not
48
+ evidence on its own. A finding needs two concrete claims that establish the
49
+ shared concept and the disagreement.
50
+
51
+ ## Symbol-contract sweep
52
+
53
+ Compare a symbol's name, signature, docstring, and, when needed, behaviour.
54
+ Findings may cover:
55
+
56
+ - name-signature disagreement
57
+ - name-docstring disagreement
58
+ - docstring-signature disagreement
59
+ - name-behaviour disagreement
60
+
61
+ Read each relevant source file's stub for names and signatures. Run the
62
+ repository's configured `uncoded body` command only when a docstring or
63
+ implementation is needed to confirm a candidate. Do not retrieve every symbol
64
+ body.
65
+
66
+ ## Report
67
+
68
+ Return the report directly as the final turn output.
69
+
70
+ Use this structure:
71
+
72
+ ```markdown
73
+ ## Semantic Consistency Review
74
+
75
+ ### Scope
76
+
77
+ <What was reviewed and intentionally omitted.>
78
+
79
+ ### Summary
80
+
81
+ <Two or three sentences that summarise the supported findings.>
82
+
83
+ ### Vocabulary findings
84
+
85
+ #### 1. <Summary>
86
+
87
+ **Claim A** — `<path>` · `<symbol>` · name | signature | docstring | body
88
+
89
+ > Verbatim evidence
90
+
91
+ **Claim B** — `<path>` · `<symbol>` · name | signature | docstring | body
92
+
93
+ > Verbatim evidence
94
+
95
+ **How they differ:** <The observable disagreement.>
96
+
97
+ **Why these should agree:** <Evidence that both claims describe the same
98
+ concept.>
99
+
100
+ ### Symbol-contract findings
101
+
102
+ #### 1. <Summary>
103
+
104
+ <Use the same finding structure.>
105
+ ```
106
+
107
+ Keep both finding headings. If a group has no supported findings, state that
108
+ under its heading. Number findings independently within each group.
109
+
110
+ ## Examples
111
+
112
+ ### Vocabulary finding
113
+
114
+ #### 1. Customer lookup uses competing verbs
115
+
116
+ **Claim A** — `storage.py` · `fetch_customer` · signature
117
+
118
+ > `fetch_customer(customer_id: str) -> Customer`
119
+
120
+ **Claim B** — `adapter.py` · `load_customer` · signature
121
+
122
+ > `load_customer(customer_id: str) -> Customer`
123
+
124
+ **How they differ:** The same lookup uses `fetch` in one module and `load` in
125
+ another.
126
+
127
+ **Why these should agree:** Both signatures accept a customer ID and return a
128
+ customer through sibling adapters.
129
+
130
+ ### Symbol-contract finding
131
+
132
+ #### 1. Predicate name promises a boolean but returns a value
133
+
134
+ **Claim A** — `cache.py` · `is_cached` · name
135
+
136
+ > `is_cached`
137
+
138
+ **Claim B** — `cache.py` · `is_cached` · signature
139
+
140
+ > `is_cached(key: str) -> str | None`
141
+
142
+ **How they differ:** The name promises a predicate, while the return type holds
143
+ a cached value or absence.
144
+
145
+ **Why these should agree:** Both claims describe the contract of `is_cached`.
@@ -0,0 +1,29 @@
1
+ ---
2
+ name: uncoded-doc-navigation
3
+ description: Load once per session, before the first search or read of a codebase's Markdown documentation indexed by uncoded. Covers locating which file and section cover a topic, or orienting to what documentation exists.
4
+ ---
5
+
6
+ <!-- Generated by uncoded — do not edit; regeneration overwrites. -->
7
+
8
+ # Documentation Navigation
9
+
10
+ This codebase uses [uncoded](https://github.com/alimanfoo/uncoded) to maintain a
11
+ documentation index.
12
+
13
+ **Step 1: Orient. Read the docs map first.** If the map is missing, run the
14
+ repository's configured `uncoded sync` command. Then, before answering the user,
15
+ before any other tool call:
16
+
17
+ ```text
18
+ Read .uncoded/docs.yaml
19
+ ```
20
+
21
+ `.uncoded/docs.yaml` is an orientation outline: it lists every Markdown file and
22
+ its heading hierarchy. Read it once, in full, at session start.
23
+
24
+ **Step 2: Navigate.** Headings in the map are literal text. Use `Read` or `grep`
25
+ to navigate to a specific section identified in the map.
26
+
27
+ **Step 3: Refresh.** After every modification to indexed Markdown, run the
28
+ repository's configured `uncoded sync` command before the next
29
+ documentation-navigation operation. The modification can change the heading map.
@@ -0,0 +1,113 @@
1
+ ---
2
+ name: uncoded-code-navigation
3
+ description: Load once per session, before the first search, read, or edit of Python source in a codebase indexed by uncoded. Covers locating a symbol, reading a definition, or checking references before you refactor, rename, or delete.
4
+ ---
5
+
6
+ <!-- Generated by uncoded — do not edit; regeneration overwrites. -->
7
+
8
+ # Code Navigation
9
+
10
+ This codebase uses [uncoded](https://github.com/alimanfoo/uncoded) to maintain a
11
+ symbol index over its source code, with two associated CLI tools: `uncoded body`
12
+ for reading a symbol's body and `uncoded refs` for finding references.
13
+
14
+ ## The dispatch rule
15
+
16
+ **If your search term is the name of a Python symbol, use the index. Python
17
+ symbols are classes, functions, methods, attributes, and module-level constants.
18
+ If it's a pattern, regex, or free-text phrase, use grep.**
19
+
20
+ This dispatch rule applies to every tool call where you find code, not just the
21
+ first in the session. The pretrained reflex for "find X" is grep, and that
22
+ reflex is wrong here. Reaching for `grep -rn 'def parse_config'` to read a
23
+ function's body is a case for `uncoded body`. Reaching for
24
+ `grep -rn 'validate_input'` to check callers before a refactor is a case for
25
+ `uncoded refs`. Reaching for `grep` then `Edit` to delete dead code is a case
26
+ for `uncoded refs` to confirm the code is dead, then `Edit`. The grep version of
27
+ any of these is noisier and less reliable. Grep matches comments, strings, and
28
+ unrelated attributes. Grep misses re-exports, so caller and delete checks come
29
+ back incomplete. Grep forces offset arithmetic to slice a body. The indexed
30
+ tools don't.
31
+
32
+ ## How to execute the rule
33
+
34
+ The index has two parts: a namespace map and per-file stubs. Follow this
35
+ sequence.
36
+
37
+ **Step 1: Orient. Read the namespace map first.** If the map is missing, run the
38
+ repository's configured `uncoded sync` command. Then, before answering the user,
39
+ before any other tool call:
40
+
41
+ ```text
42
+ Read .uncoded/namespace.yaml
43
+ ```
44
+
45
+ This lists every symbol in the codebase: directories, files, classes, methods,
46
+ functions. Without it loaded, "find X" answers come from pretrained guesses.
47
+ They reflect what a project like this probably contains, not what is actually
48
+ here. Read it once, in full, at session start.
49
+
50
+ **Step 2: Understand. Read the `.pyi` stub before any `.py` source.** Stub paths
51
+ mirror source paths under `.uncoded/stubs/`:
52
+
53
+ ```text
54
+ src/foo/bar.py → .uncoded/stubs/src/foo/bar.pyi
55
+ tests/test_foo.py → .uncoded/stubs/tests/test_foo.pyi
56
+ ```
57
+
58
+ Read the stub for every file you intend to touch or reference, including tests.
59
+ The stub contains imports, every signature with types, module-level assignments,
60
+ and class attributes. That is enough for most navigation. Skipping straight to
61
+ source means reading many lines to learn what the stub would have told you in
62
+ one. If no stub exists at the expected path, the file has no symbols indexed. In
63
+ that narrow case, read source directly.
64
+
65
+ **Step 3: Act.** Use `uncoded body` to read a symbol's body. Use `uncoded refs`
66
+ to find every reference to a symbol. Use `Edit` (with `uncoded body`'s output as
67
+ `old_string`) to change a symbol. With the map and stub loaded, you have the
68
+ exact `relative_path` and `name_path` each tool needs. Use `ClassName/method`
69
+ for a method and `function_name` for a top-level function. Per task:
70
+
71
+ - **Read a symbol's body.** `uvx uncoded body <name_path> --in <relative_path>`
72
+ prints the symbol's source text to stdout, byte-identical to disk. Returns
73
+ exactly the symbol. No offset arithmetic, no risk of reading too much. Its
74
+ output has every byte `Edit` needs as `old_string`. You need no extra `Read`
75
+ for partial edits. Stay on stubs for a wider sweep.
76
+
77
+ - **Find every reference to a symbol.**
78
+ `uvx uncoded refs <name_path> --in <relative_path>`. Prints one reference per
79
+ line as `<path>:<line>:<col>`, sorted by path, then line, then column. Each
80
+ path is relative to the current working directory when possible and otherwise
81
+ absolute. Grep on the name misses re-exports and adds false positives from
82
+ comments, strings, and attribute lookups on other types. If the next move
83
+ depends on the answer being complete, grep cannot give you that.
84
+
85
+ - **Edit a symbol.** `uvx uncoded body <name_path> --in <relative_path>` gives
86
+ the exact `old_string`; then `Edit` to apply the change.
87
+
88
+ - **Rename.** `uvx uncoded refs <name_path> --in <relative_path>` enumerates
89
+ every site; then `Edit` at each.
90
+
91
+ - **Safely delete.** `uvx uncoded refs <name_path> --in <relative_path>` must
92
+ return empty; then `Edit` to remove.
93
+
94
+ **Step 4: Refresh.** After every modification to indexed Python source, run the
95
+ repository's configured `uncoded sync` command before the next code-navigation
96
+ operation. The modification can change the namespace map and stubs.
97
+
98
+ ## Where Read, Edit, and grep are still the right tools
99
+
100
+ The rule is about source navigation by symbol name. Outside that, Read, Edit,
101
+ and grep stay correct:
102
+
103
+ - Free-text or pattern search outside source: Markdown, YAML, TOML, configs,
104
+ commit messages, notebook JSON, fixture data.
105
+ - Pattern search across signatures (regex over type annotations, decorator
106
+ usage, alias declarations). These are not symbol-name lookups, even though
107
+ they sit inside source.
108
+ - Partial-line edits inside a symbol body, once you have retrieved it via
109
+ `uncoded body`.
110
+ - The rare stub-less Python file that needs exploratory reading.
111
+
112
+ The dispatch rule turns on the search term. A symbol name goes to the index. A
113
+ regex or free-text phrase goes to grep.
@@ -0,0 +1,145 @@
1
+ ---
2
+ name: uncoded-consistency-review
3
+ description: Review a Python codebase for semantic and naming consistency. It reports only concrete disagreements between two claims about the same concept, with verbatim evidence for each claim. It assumes uncoded is installed (.uncoded/namespace.yaml and .uncoded/stubs/ present).
4
+ ---
5
+
6
+ <!-- Generated by uncoded — do not edit; regeneration overwrites. -->
7
+
8
+ # Semantic Consistency Review
9
+
10
+ Review a Python codebase for concrete disagreements in its vocabulary and symbol
11
+ contracts. A finding must identify two claims about the same concept that ought
12
+ to agree, but do not.
13
+
14
+ ## Guardrails
15
+
16
+ Admit a finding only when the codebase supports both claims, their observable
17
+ difference, and the reason that they should agree. Quote both claims verbatim.
18
+ Omit a candidate when either claim or the reason for comparing them is
19
+ unsupported.
20
+
21
+ Review semantic and naming consistency, not formatting or style consistency. Do
22
+ not report general bugs, complexity, performance, security, or design
23
+ preferences unless they appear as a disagreement between two supported claims.
24
+ Do not report overgrown public surfaces, private imports, cross-domain imports,
25
+ zero-reference symbols, or redundant public surfaces merely because they exist.
26
+
27
+ ## Prerequisites
28
+
29
+ Run the repository's configured `uncoded sync` command. Read the repository's
30
+ agent instructions and follow its navigation rules.
31
+
32
+ ## Orientation
33
+
34
+ Read `.uncoded/namespace.yaml` in full. Use its package structure and symbol
35
+ names to map the codebase's main concepts and vocabulary.
36
+
37
+ ## Vocabulary sweep
38
+
39
+ Use the namespace and stubs to find candidates, then confirm semantic overlap
40
+ from signatures, docstrings, or bodies. Look for:
41
+
42
+ - **Competing terms:** different names for substantively the same concept.
43
+ - **Conflicting use:** the same term used incompatibly within a shared context.
44
+ - **Stale qualifiers:** names such as `legacy`, `v2`, or `final` whose
45
+ distinction conflicts with another symbol or a symbol's docstring.
46
+
47
+ Similar spelling, low vocabulary overlap, or the presence of a qualifier is not
48
+ evidence on its own. A finding needs two concrete claims that establish the
49
+ shared concept and the disagreement.
50
+
51
+ ## Symbol-contract sweep
52
+
53
+ Compare a symbol's name, signature, docstring, and, when needed, behaviour.
54
+ Findings may cover:
55
+
56
+ - name-signature disagreement
57
+ - name-docstring disagreement
58
+ - docstring-signature disagreement
59
+ - name-behaviour disagreement
60
+
61
+ Read each relevant source file's stub for names and signatures. Run the
62
+ repository's configured `uncoded body` command only when a docstring or
63
+ implementation is needed to confirm a candidate. Do not retrieve every symbol
64
+ body.
65
+
66
+ ## Report
67
+
68
+ Return the report directly as the final turn output.
69
+
70
+ Use this structure:
71
+
72
+ ```markdown
73
+ ## Semantic Consistency Review
74
+
75
+ ### Scope
76
+
77
+ <What was reviewed and intentionally omitted.>
78
+
79
+ ### Summary
80
+
81
+ <Two or three sentences that summarise the supported findings.>
82
+
83
+ ### Vocabulary findings
84
+
85
+ #### 1. <Summary>
86
+
87
+ **Claim A** — `<path>` · `<symbol>` · name | signature | docstring | body
88
+
89
+ > Verbatim evidence
90
+
91
+ **Claim B** — `<path>` · `<symbol>` · name | signature | docstring | body
92
+
93
+ > Verbatim evidence
94
+
95
+ **How they differ:** <The observable disagreement.>
96
+
97
+ **Why these should agree:** <Evidence that both claims describe the same
98
+ concept.>
99
+
100
+ ### Symbol-contract findings
101
+
102
+ #### 1. <Summary>
103
+
104
+ <Use the same finding structure.>
105
+ ```
106
+
107
+ Keep both finding headings. If a group has no supported findings, state that
108
+ under its heading. Number findings independently within each group.
109
+
110
+ ## Examples
111
+
112
+ ### Vocabulary finding
113
+
114
+ #### 1. Customer lookup uses competing verbs
115
+
116
+ **Claim A** — `storage.py` · `fetch_customer` · signature
117
+
118
+ > `fetch_customer(customer_id: str) -> Customer`
119
+
120
+ **Claim B** — `adapter.py` · `load_customer` · signature
121
+
122
+ > `load_customer(customer_id: str) -> Customer`
123
+
124
+ **How they differ:** The same lookup uses `fetch` in one module and `load` in
125
+ another.
126
+
127
+ **Why these should agree:** Both signatures accept a customer ID and return a
128
+ customer through sibling adapters.
129
+
130
+ ### Symbol-contract finding
131
+
132
+ #### 1. Predicate name promises a boolean but returns a value
133
+
134
+ **Claim A** — `cache.py` · `is_cached` · name
135
+
136
+ > `is_cached`
137
+
138
+ **Claim B** — `cache.py` · `is_cached` · signature
139
+
140
+ > `is_cached(key: str) -> str | None`
141
+
142
+ **How they differ:** The name promises a predicate, while the return type holds
143
+ a cached value or absence.
144
+
145
+ **Why these should agree:** Both claims describe the contract of `is_cached`.
@@ -0,0 +1,29 @@
1
+ ---
2
+ name: uncoded-doc-navigation
3
+ description: Load once per session, before the first search or read of a codebase's Markdown documentation indexed by uncoded. Covers locating which file and section cover a topic, or orienting to what documentation exists.
4
+ ---
5
+
6
+ <!-- Generated by uncoded — do not edit; regeneration overwrites. -->
7
+
8
+ # Documentation Navigation
9
+
10
+ This codebase uses [uncoded](https://github.com/alimanfoo/uncoded) to maintain a
11
+ documentation index.
12
+
13
+ **Step 1: Orient. Read the docs map first.** If the map is missing, run the
14
+ repository's configured `uncoded sync` command. Then, before answering the user,
15
+ before any other tool call:
16
+
17
+ ```text
18
+ Read .uncoded/docs.yaml
19
+ ```
20
+
21
+ `.uncoded/docs.yaml` is an orientation outline: it lists every Markdown file and
22
+ its heading hierarchy. Read it once, in full, at session start.
23
+
24
+ **Step 2: Navigate.** Headings in the map are literal text. Use `Read` or `grep`
25
+ to navigate to a specific section identified in the map.
26
+
27
+ **Step 3: Refresh.** After every modification to indexed Markdown, run the
28
+ repository's configured `uncoded sync` command before the next
29
+ documentation-navigation operation. The modification can change the heading map.
@@ -0,0 +1,17 @@
1
+ # Collapse generated files in a diff, and keep them out of the language
2
+ # statistics. uncoded writes the skills; uv writes the lock.
3
+ .claude/skills/** linguist-generated=true
4
+ .agents/skills/** linguist-generated=true
5
+ uv.lock linguist-generated=true
6
+
7
+ # A recorded stream is read back byte for byte by a golden test, so no checkout
8
+ # rewrites its line endings.
9
+ tests/fixtures/** -text
10
+
11
+ # Vendored release files are checked against upstream by checksum, so a
12
+ # checkout must not rewrite their line endings.
13
+ src/dreamcatcher/static/vendor/** -text
14
+
15
+ # init writes the default configuration into a user's checkout as it is here,
16
+ # so no checkout rewrites its line endings.
17
+ src/dreamcatcher/default_config.toml text eol=lf
@@ -0,0 +1,38 @@
1
+ version: 2
2
+
3
+ # Each ecosystem opens one pull request for its version updates and one for
4
+ # its security updates, majors included, because a group applies to one kind.
5
+
6
+ updates:
7
+ - package-ecosystem: "uv"
8
+ directory: "/"
9
+ schedule:
10
+ interval: "weekly"
11
+ groups:
12
+ uv:
13
+ patterns: ["*"]
14
+ uv-security:
15
+ applies-to: security-updates
16
+ patterns: ["*"]
17
+
18
+ - package-ecosystem: "pre-commit"
19
+ directory: "/"
20
+ schedule:
21
+ interval: "weekly"
22
+ groups:
23
+ pre-commit:
24
+ patterns: ["*"]
25
+ pre-commit-security:
26
+ applies-to: security-updates
27
+ patterns: ["*"]
28
+
29
+ - package-ecosystem: "github-actions"
30
+ directory: "/"
31
+ schedule:
32
+ interval: "weekly"
33
+ groups:
34
+ github-actions:
35
+ patterns: ["*"]
36
+ github-actions-security:
37
+ applies-to: security-updates
38
+ patterns: ["*"]