dorian-vwp 1.0.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 (227) hide show
  1. dorian_vwp-1.0.0/.github/ISSUE_TEMPLATE/benchmark_submission.yml +63 -0
  2. dorian_vwp-1.0.0/.github/ISSUE_TEMPLATE/bug_report.yml +58 -0
  3. dorian_vwp-1.0.0/.github/ISSUE_TEMPLATE/checker_request.yml +34 -0
  4. dorian_vwp-1.0.0/.github/ISSUE_TEMPLATE/config.yml +10 -0
  5. dorian_vwp-1.0.0/.github/ISSUE_TEMPLATE/false_alarm.yml +34 -0
  6. dorian_vwp-1.0.0/.github/ISSUE_TEMPLATE/false_pass.yml +44 -0
  7. dorian_vwp-1.0.0/.github/workflows/ci.yml +22 -0
  8. dorian_vwp-1.0.0/.github/workflows/public-microbench.yml +62 -0
  9. dorian_vwp-1.0.0/.github/workflows/publish-testpypi.yml +61 -0
  10. dorian_vwp-1.0.0/.github/workflows/publish.yml +70 -0
  11. dorian_vwp-1.0.0/.github/workflows/release-gate.yml +87 -0
  12. dorian_vwp-1.0.0/.gitignore +31 -0
  13. dorian_vwp-1.0.0/.python-version +1 -0
  14. dorian_vwp-1.0.0/.warrant/.gitignore +2 -0
  15. dorian_vwp-1.0.0/LICENSE +201 -0
  16. dorian_vwp-1.0.0/Makefile +47 -0
  17. dorian_vwp-1.0.0/PKG-INFO +527 -0
  18. dorian_vwp-1.0.0/README.md +509 -0
  19. dorian_vwp-1.0.0/SECURITY.md +85 -0
  20. dorian_vwp-1.0.0/action/README.md +160 -0
  21. dorian_vwp-1.0.0/action/action.yml +161 -0
  22. dorian_vwp-1.0.0/archive/CHURN_BENCHMARK_v0.3.0.md +71 -0
  23. dorian_vwp-1.0.0/archive/CHURN_BENCHMARK_v0.4.0.md +71 -0
  24. dorian_vwp-1.0.0/archive/CHURN_BENCHMARK_v0.5.0.md +79 -0
  25. dorian_vwp-1.0.0/archive/EXTRACT_GATE_RESULTS.md +96 -0
  26. dorian_vwp-1.0.0/archive/KILL_REPORT_TEMPLATE.md +39 -0
  27. dorian_vwp-1.0.0/archive/KILL_REPORT_v0.0.md +159 -0
  28. dorian_vwp-1.0.0/archive/README.md +23 -0
  29. dorian_vwp-1.0.0/archive/RELEASE_NOTES_v0.1.0.md +83 -0
  30. dorian_vwp-1.0.0/archive/RELEASE_NOTES_v0.2.0.md +104 -0
  31. dorian_vwp-1.0.0/archive/RELEASE_NOTES_v0.3.0.md +62 -0
  32. dorian_vwp-1.0.0/archive/RELEASE_NOTES_v0.4.0.md +71 -0
  33. dorian_vwp-1.0.0/archive/RELEASE_NOTES_v0.5.0.md +60 -0
  34. dorian_vwp-1.0.0/archive/RELEASE_NOTES_v0.6.0.md +69 -0
  35. dorian_vwp-1.0.0/archive/RELEASE_NOTES_v0.7.0.md +59 -0
  36. dorian_vwp-1.0.0/archive/RELEASE_NOTES_v0.7.1.md +75 -0
  37. dorian_vwp-1.0.0/archive/RELEASE_VALIDATION_REPORT_v0.2.0.md +135 -0
  38. dorian_vwp-1.0.0/bench/__init__.py +7 -0
  39. dorian_vwp-1.0.0/bench/binding_lifecycle.py +830 -0
  40. dorian_vwp-1.0.0/bench/binding_lifecycle_domains.py +666 -0
  41. dorian_vwp-1.0.0/bench/churn.py +191 -0
  42. dorian_vwp-1.0.0/bench/controlled_mutation.py +1036 -0
  43. dorian_vwp-1.0.0/bench/extract_gate.py +318 -0
  44. dorian_vwp-1.0.0/bench/extract_real_gate.py +925 -0
  45. dorian_vwp-1.0.0/bench/ground_truth.py +127 -0
  46. dorian_vwp-1.0.0/bench/large_mutation.py +910 -0
  47. dorian_vwp-1.0.0/bench/large_mutation_domains.py +1684 -0
  48. dorian_vwp-1.0.0/bench/metamorph.py +70 -0
  49. dorian_vwp-1.0.0/bench/metrics.py +220 -0
  50. dorian_vwp-1.0.0/bench/plant.py +236 -0
  51. dorian_vwp-1.0.0/bench/public/README.md +24 -0
  52. dorian_vwp-1.0.0/bench/public/manifest.example.json +37 -0
  53. dorian_vwp-1.0.0/bench/public/manifest.v1.yaml +107 -0
  54. dorian_vwp-1.0.0/bench/public/reports/.gitkeep +0 -0
  55. dorian_vwp-1.0.0/bench/public/repos/bandit/claims.json +7 -0
  56. dorian_vwp-1.0.0/bench/public/repos/humanize/claims.draft.json +65 -0
  57. dorian_vwp-1.0.0/bench/public/repos/humanize/claims.generated.json +117 -0
  58. dorian_vwp-1.0.0/bench/public/repos/humanize/claims.json +117 -0
  59. dorian_vwp-1.0.0/bench/public/repos/humanize/mutations.yaml +37 -0
  60. dorian_vwp-1.0.0/bench/public/repos/humanize/rejected.json +1 -0
  61. dorian_vwp-1.0.0/bench/public/repos/humanize/targets.json +58 -0
  62. dorian_vwp-1.0.0/bench/public/repos/jaffle_shop_duckdb/claims.json +7 -0
  63. dorian_vwp-1.0.0/bench/public/repos/python-dotenv/claims.draft.json +65 -0
  64. dorian_vwp-1.0.0/bench/public/repos/python-dotenv/claims.generated.json +117 -0
  65. dorian_vwp-1.0.0/bench/public/repos/python-dotenv/claims.json +117 -0
  66. dorian_vwp-1.0.0/bench/public/repos/python-dotenv/mutations.yaml +37 -0
  67. dorian_vwp-1.0.0/bench/public/repos/python-dotenv/rejected.json +1 -0
  68. dorian_vwp-1.0.0/bench/public/repos/python-dotenv/targets.json +58 -0
  69. dorian_vwp-1.0.0/bench/public/repos/tomli/claims.json +7 -0
  70. dorian_vwp-1.0.0/bench/public/repos.public.json +26 -0
  71. dorian_vwp-1.0.0/bench/public/results/.gitignore +3 -0
  72. dorian_vwp-1.0.0/bench/public/results/.gitkeep +0 -0
  73. dorian_vwp-1.0.0/bench/public/results/REPORT.md +13 -0
  74. dorian_vwp-1.0.0/bench/public_claims.py +440 -0
  75. dorian_vwp-1.0.0/bench/public_repos.py +753 -0
  76. dorian_vwp-1.0.0/bench/real_metamorph.py +227 -0
  77. dorian_vwp-1.0.0/bench/realworld_usecases.py +567 -0
  78. dorian_vwp-1.0.0/bench/release_state.py +752 -0
  79. dorian_vwp-1.0.0/bench/replay.py +349 -0
  80. dorian_vwp-1.0.0/bench/repos.json +16 -0
  81. dorian_vwp-1.0.0/bench/selftest_claims.json +60 -0
  82. dorian_vwp-1.0.0/bench/warrant_quality.py +241 -0
  83. dorian_vwp-1.0.0/docs/AGENT_CLAIMS.md +234 -0
  84. dorian_vwp-1.0.0/docs/BENCHMARK_BINDING_LIFECYCLE.md +92 -0
  85. dorian_vwp-1.0.0/docs/BENCHMARK_BINDING_LIFECYCLE_PROTOCOL.md +142 -0
  86. dorian_vwp-1.0.0/docs/BENCHMARK_CURRENT.md +86 -0
  87. dorian_vwp-1.0.0/docs/BENCHMARK_PROTOCOL_v0.7.0.md +156 -0
  88. dorian_vwp-1.0.0/docs/BENCHMARK_PUBLIC_REAL_REPOS.md +106 -0
  89. dorian_vwp-1.0.0/docs/BENCHMARK_REPRODUCIBILITY.md +57 -0
  90. dorian_vwp-1.0.0/docs/BENCHMARK_v0.6.0.md +73 -0
  91. dorian_vwp-1.0.0/docs/BENCHMARK_v0.7.0.md +131 -0
  92. dorian_vwp-1.0.0/docs/DEPENDENCIES.md +68 -0
  93. dorian_vwp-1.0.0/docs/EXTRACT_GATE.md +139 -0
  94. dorian_vwp-1.0.0/docs/NAMING_AND_PRIOR_ART.md +62 -0
  95. dorian_vwp-1.0.0/docs/NEXT_ALGORITHMIC_BETS.md +100 -0
  96. dorian_vwp-1.0.0/docs/PUBLIC_BENCHMARK_PROTOCOL.md +93 -0
  97. dorian_vwp-1.0.0/docs/REALWORLD_USECASES.md +88 -0
  98. dorian_vwp-1.0.0/docs/REALWORLD_USECASES_PROTOCOL.md +93 -0
  99. dorian_vwp-1.0.0/docs/REAL_CATCH_LOG.md +50 -0
  100. dorian_vwp-1.0.0/docs/REAL_DOC_METAMORPHIC_GATE.md +337 -0
  101. dorian_vwp-1.0.0/docs/RELEASE_CHECKLIST.md +79 -0
  102. dorian_vwp-1.0.0/docs/RELEASE_DECISION_1_0.md +28 -0
  103. dorian_vwp-1.0.0/docs/RELEASE_GATE_1_0.md +95 -0
  104. dorian_vwp-1.0.0/docs/ROADMAP_BACKLOG.md +169 -0
  105. dorian_vwp-1.0.0/docs/SECURITY_BOUNDARY.md +99 -0
  106. dorian_vwp-1.0.0/docs/SHADOW_PILOT_TEMPLATE.md +66 -0
  107. dorian_vwp-1.0.0/docs/SOLO_VALIDATION_LADDER.md +60 -0
  108. dorian_vwp-1.0.0/docs/START_HERE.md +50 -0
  109. dorian_vwp-1.0.0/docs/TESTING.md +78 -0
  110. dorian_vwp-1.0.0/docs/TRUSTED_BASE_ACTION_DESIGN.md +91 -0
  111. dorian_vwp-1.0.0/docs/USE_WITH_CLAUDE_CODE.md +157 -0
  112. dorian_vwp-1.0.0/docs/V1_SCOPE.md +64 -0
  113. dorian_vwp-1.0.0/docs/VALIDATION_HONESTY.md +67 -0
  114. dorian_vwp-1.0.0/docs/assets/dorian-hero-light.png +0 -0
  115. dorian_vwp-1.0.0/docs/assets/dorian-hero.png +0 -0
  116. dorian_vwp-1.0.0/docs/assets/social-preview.png +0 -0
  117. dorian_vwp-1.0.0/docs/changes/launch-train-claude-code-onboarding.claims.json +39 -0
  118. dorian_vwp-1.0.0/docs/changes/launch-train-claude-code-onboarding.md +23 -0
  119. dorian_vwp-1.0.0/docs/changes/launch-train-claude-code-onboarding.md.warrant +164 -0
  120. dorian_vwp-1.0.0/docs/changes/weak-binding-gate.claims.json +44 -0
  121. dorian_vwp-1.0.0/docs/changes/weak-binding-gate.md +10 -0
  122. dorian_vwp-1.0.0/docs/changes/weak-binding-gate.md.warrant +173 -0
  123. dorian_vwp-1.0.0/examples/claude-code/README.md +52 -0
  124. dorian_vwp-1.0.0/examples/claude-code/app.py +17 -0
  125. dorian_vwp-1.0.0/examples/claude-code/change-note.md +7 -0
  126. dorian_vwp-1.0.0/examples/claude-code/claims.json +18 -0
  127. dorian_vwp-1.0.0/examples/claude-code/settings.example.json +9 -0
  128. dorian_vwp-1.0.0/examples/claude-code/settings.trusted-local.example.json +11 -0
  129. dorian_vwp-1.0.0/examples/demo-repo/docs/design.md +34 -0
  130. dorian_vwp-1.0.0/pyproject.toml +49 -0
  131. dorian_vwp-1.0.0/spec/checkers.md +169 -0
  132. dorian_vwp-1.0.0/spec/warrant.schema.json +99 -0
  133. dorian_vwp-1.0.0/src/dorian/__init__.py +6 -0
  134. dorian_vwp-1.0.0/src/dorian/__main__.py +10 -0
  135. dorian_vwp-1.0.0/src/dorian/_regex_worker.py +30 -0
  136. dorian_vwp-1.0.0/src/dorian/bindings.py +366 -0
  137. dorian_vwp-1.0.0/src/dorian/blast.py +119 -0
  138. dorian_vwp-1.0.0/src/dorian/capture/__init__.py +0 -0
  139. dorian_vwp-1.0.0/src/dorian/capture/manual.py +53 -0
  140. dorian_vwp-1.0.0/src/dorian/capture/transcript.py +179 -0
  141. dorian_vwp-1.0.0/src/dorian/checkers/__init__.py +42 -0
  142. dorian_vwp-1.0.0/src/dorian/checkers/base.py +96 -0
  143. dorian_vwp-1.0.0/src/dorian/checkers/c1_span.py +85 -0
  144. dorian_vwp-1.0.0/src/dorian/checkers/c3_ref.py +376 -0
  145. dorian_vwp-1.0.0/src/dorian/checkers/c4_test.py +89 -0
  146. dorian_vwp-1.0.0/src/dorian/checkers/c5_data.py +320 -0
  147. dorian_vwp-1.0.0/src/dorian/claims_io.py +70 -0
  148. dorian_vwp-1.0.0/src/dorian/cli.py +241 -0
  149. dorian_vwp-1.0.0/src/dorian/commands.py +807 -0
  150. dorian_vwp-1.0.0/src/dorian/datachecks.py +275 -0
  151. dorian_vwp-1.0.0/src/dorian/extract.py +583 -0
  152. dorian_vwp-1.0.0/src/dorian/fold.py +96 -0
  153. dorian_vwp-1.0.0/src/dorian/gitio.py +105 -0
  154. dorian_vwp-1.0.0/src/dorian/model.py +344 -0
  155. dorian_vwp-1.0.0/src/dorian/policy.py +94 -0
  156. dorian_vwp-1.0.0/src/dorian/pyast.py +308 -0
  157. dorian_vwp-1.0.0/src/dorian/report.py +125 -0
  158. dorian_vwp-1.0.0/src/dorian/revalidate.py +450 -0
  159. dorian_vwp-1.0.0/src/dorian/seal.py +469 -0
  160. dorian_vwp-1.0.0/src/dorian/store.py +443 -0
  161. dorian_vwp-1.0.0/src/dorian/strength.py +226 -0
  162. dorian_vwp-1.0.0/src/dorian/symbol_index.py +345 -0
  163. dorian_vwp-1.0.0/tests/conftest.py +152 -0
  164. dorian_vwp-1.0.0/tests/test_action_security.py +109 -0
  165. dorian_vwp-1.0.0/tests/test_action_security_defaults.py +103 -0
  166. dorian_vwp-1.0.0/tests/test_audit.py +182 -0
  167. dorian_vwp-1.0.0/tests/test_bench_public_claim_synthesis.py +237 -0
  168. dorian_vwp-1.0.0/tests/test_bench_public_harness.py +400 -0
  169. dorian_vwp-1.0.0/tests/test_bench_public_manifest.py +166 -0
  170. dorian_vwp-1.0.0/tests/test_bench_public_report.py +95 -0
  171. dorian_vwp-1.0.0/tests/test_bench_smoke.py +232 -0
  172. dorian_vwp-1.0.0/tests/test_benchmark_evidence.py +74 -0
  173. dorian_vwp-1.0.0/tests/test_binding_gate.py +347 -0
  174. dorian_vwp-1.0.0/tests/test_binding_lifecycle_bench.py +229 -0
  175. dorian_vwp-1.0.0/tests/test_bindings.py +419 -0
  176. dorian_vwp-1.0.0/tests/test_blast.py +272 -0
  177. dorian_vwp-1.0.0/tests/test_c1.py +253 -0
  178. dorian_vwp-1.0.0/tests/test_c3.py +319 -0
  179. dorian_vwp-1.0.0/tests/test_c3_regex_timeout.py +57 -0
  180. dorian_vwp-1.0.0/tests/test_c4.py +337 -0
  181. dorian_vwp-1.0.0/tests/test_c5.py +326 -0
  182. dorian_vwp-1.0.0/tests/test_capture.py +232 -0
  183. dorian_vwp-1.0.0/tests/test_churn.py +635 -0
  184. dorian_vwp-1.0.0/tests/test_claims_io.py +81 -0
  185. dorian_vwp-1.0.0/tests/test_claude_code_docs.py +163 -0
  186. dorian_vwp-1.0.0/tests/test_cli_blackbox.py +180 -0
  187. dorian_vwp-1.0.0/tests/test_cli_docs_sync.py +62 -0
  188. dorian_vwp-1.0.0/tests/test_cli_edge_cases.py +174 -0
  189. dorian_vwp-1.0.0/tests/test_config_binding.py +218 -0
  190. dorian_vwp-1.0.0/tests/test_config_value.py +258 -0
  191. dorian_vwp-1.0.0/tests/test_controlled_mutation.py +206 -0
  192. dorian_vwp-1.0.0/tests/test_datachecks.py +378 -0
  193. dorian_vwp-1.0.0/tests/test_deny_exec_policy.py +267 -0
  194. dorian_vwp-1.0.0/tests/test_determinism.py +176 -0
  195. dorian_vwp-1.0.0/tests/test_docs.py +76 -0
  196. dorian_vwp-1.0.0/tests/test_docs_polish.py +112 -0
  197. dorian_vwp-1.0.0/tests/test_e2e.py +150 -0
  198. dorian_vwp-1.0.0/tests/test_examples_claude_code.py +73 -0
  199. dorian_vwp-1.0.0/tests/test_extract_anchor.py +200 -0
  200. dorian_vwp-1.0.0/tests/test_extract_candidate.py +198 -0
  201. dorian_vwp-1.0.0/tests/test_extract_gate.py +333 -0
  202. dorian_vwp-1.0.0/tests/test_extract_real_gate.py +563 -0
  203. dorian_vwp-1.0.0/tests/test_fold.py +256 -0
  204. dorian_vwp-1.0.0/tests/test_gitio.py +58 -0
  205. dorian_vwp-1.0.0/tests/test_large_mutation.py +376 -0
  206. dorian_vwp-1.0.0/tests/test_model.py +116 -0
  207. dorian_vwp-1.0.0/tests/test_packaging.py +123 -0
  208. dorian_vwp-1.0.0/tests/test_perf_smoke.py +60 -0
  209. dorian_vwp-1.0.0/tests/test_pystructural.py +349 -0
  210. dorian_vwp-1.0.0/tests/test_readme_example.py +79 -0
  211. dorian_vwp-1.0.0/tests/test_real_metamorph.py +224 -0
  212. dorian_vwp-1.0.0/tests/test_realworld_usecases.py +121 -0
  213. dorian_vwp-1.0.0/tests/test_release_state.py +396 -0
  214. dorian_vwp-1.0.0/tests/test_render_md.py +271 -0
  215. dorian_vwp-1.0.0/tests/test_revalidate.py +765 -0
  216. dorian_vwp-1.0.0/tests/test_scope_lint.py +286 -0
  217. dorian_vwp-1.0.0/tests/test_seal.py +721 -0
  218. dorian_vwp-1.0.0/tests/test_security.py +151 -0
  219. dorian_vwp-1.0.0/tests/test_semantic_context.py +124 -0
  220. dorian_vwp-1.0.0/tests/test_store.py +411 -0
  221. dorian_vwp-1.0.0/tests/test_strength.py +219 -0
  222. dorian_vwp-1.0.0/tests/test_symbol_index.py +736 -0
  223. dorian_vwp-1.0.0/tests/test_trusted_base.py +292 -0
  224. dorian_vwp-1.0.0/tests/test_verify.py +258 -0
  225. dorian_vwp-1.0.0/tests/test_version_sync.py +47 -0
  226. dorian_vwp-1.0.0/tests/test_warrant_quality.py +167 -0
  227. dorian_vwp-1.0.0/uv.lock +738 -0
@@ -0,0 +1,63 @@
1
+ name: Benchmark / reproduction submission
2
+ description: A reproducible public-repo case for the micro-benchmark (a real catch, a false alarm, or a clean case).
3
+ labels: [benchmark, reproduction]
4
+ body:
5
+ - type: markdown
6
+ attributes:
7
+ value: >-
8
+ See docs/PUBLIC_BENCHMARK_PROTOCOL.md and bench/public/manifest.example.json.
9
+ Submissions must be reproducible from frozen inputs; results are scoped to
10
+ those inputs, never a broad real-world claim (docs/VALIDATION_HONESTY.md).
11
+ - type: input
12
+ id: repo
13
+ attributes:
14
+ label: Public repo URL
15
+ validations:
16
+ required: true
17
+ - type: input
18
+ id: base_sha
19
+ attributes:
20
+ label: Frozen base SHA
21
+ validations:
22
+ required: true
23
+ - type: input
24
+ id: head
25
+ attributes:
26
+ label: Head SHA or patch
27
+ description: A frozen head SHA, or a patch applied to base (preferred for injected mutations).
28
+ validations:
29
+ required: true
30
+ - type: textarea
31
+ id: claims
32
+ attributes:
33
+ label: claims.json
34
+ render: json
35
+ validations:
36
+ required: true
37
+ - type: dropdown
38
+ id: layer
39
+ attributes:
40
+ label: Which layer does this exercise?
41
+ options: ["trigger/selection", "truth/alarm", "both"]
42
+ validations:
43
+ required: true
44
+ - type: input
45
+ id: expected
46
+ attributes:
47
+ label: Expected outcome
48
+ description: e.g. "claim X selected and BROKEN" / "no claim selected"
49
+ validations:
50
+ required: true
51
+ - type: input
52
+ id: license
53
+ attributes:
54
+ label: Repo license
55
+ validations:
56
+ required: true
57
+ - type: dropdown
58
+ id: outcome
59
+ attributes:
60
+ label: What is this case
61
+ options: ["true catch", "false alarm", "miss", "partial (trigger only)", "clean (no break)"]
62
+ validations:
63
+ required: true
@@ -0,0 +1,58 @@
1
+ name: Bug report
2
+ description: dorian crashed, errored, or did something other than its documented behavior.
3
+ labels: [bug]
4
+ body:
5
+ - type: input
6
+ id: version
7
+ attributes:
8
+ label: dorian version
9
+ description: Output of `dorian --version`.
10
+ placeholder: dorian 0.10.0
11
+ validations:
12
+ required: true
13
+ - type: input
14
+ id: command
15
+ attributes:
16
+ label: Exact command run
17
+ placeholder: dorian verify note.md --claims claims.json
18
+ validations:
19
+ required: true
20
+ - type: dropdown
21
+ id: checker
22
+ attributes:
23
+ label: Checker family involved
24
+ options: ["C1 span", "C3 path/symbol/string/regex", "C4 pytest", "C5 typed data", "C5 shell", "none / not sure"]
25
+ validations:
26
+ required: true
27
+ - type: dropdown
28
+ id: executable
29
+ attributes:
30
+ label: Were executable checkers (C4 pytest / C5 shell) involved?
31
+ options: ["No", "Yes", "Not sure"]
32
+ validations:
33
+ required: true
34
+ - type: dropdown
35
+ id: trust
36
+ attributes:
37
+ label: Context
38
+ options: ["Trusted/internal repo", "Untrusted claims (used --deny-exec)", "CI / GitHub Action", "Other"]
39
+ validations:
40
+ required: true
41
+ - type: textarea
42
+ id: expected_actual
43
+ attributes:
44
+ label: Expected vs. actual
45
+ description: What you expected, what happened, and the exit code.
46
+ validations:
47
+ required: true
48
+ - type: textarea
49
+ id: sidecar
50
+ attributes:
51
+ label: Relevant claim / sidecar excerpt
52
+ description: The claim or `.warrant` snippet. Redact anything sensitive.
53
+ render: json
54
+ - type: input
55
+ id: artifact
56
+ attributes:
57
+ label: Artifact path
58
+ placeholder: docs/changes/login.md
@@ -0,0 +1,34 @@
1
+ name: Checker request
2
+ description: A kind of claim you want to make deterministically that no current checker can verify.
3
+ labels: [checker-request, enhancement]
4
+ body:
5
+ - type: textarea
6
+ id: claim_kind
7
+ attributes:
8
+ label: What claim do you want to hold true over time?
9
+ description: A concrete example sentence an agent or human would write.
10
+ placeholder: '"the /login route still requires the rate-limit decorator"'
11
+ validations:
12
+ required: true
13
+ - type: textarea
14
+ id: deterministic
15
+ attributes:
16
+ label: How could this be checked deterministically (no model at check time)?
17
+ description: dorian only adds checkers that are deterministic and, ideally, non-executing. What file would it read, and what would it look for?
18
+ validations:
19
+ required: true
20
+ - type: dropdown
21
+ id: closest
22
+ attributes:
23
+ label: Closest existing checker
24
+ options: ["C1 span", "C3 path/symbol/string/regex", "C4 pytest", "C5 typed data", "C5 shell", "none fit"]
25
+ validations:
26
+ required: true
27
+ - type: dropdown
28
+ id: executing
29
+ attributes:
30
+ label: Would it need to execute code?
31
+ description: Non-executing checkers are strongly preferred (deny-exec keeps them usable in untrusted contexts).
32
+ options: ["No — reads files only", "Yes — runs code", "Not sure"]
33
+ validations:
34
+ required: true
@@ -0,0 +1,10 @@
1
+ blank_issues_enabled: false
2
+ contact_links:
3
+ - name: Security vulnerability (private)
4
+ url: https://github.com/ajaysurya1221/dorian/security/advisories/new
5
+ about: >-
6
+ Report a vulnerability privately via a GitHub security advisory. Do NOT
7
+ open a public issue with working exploit details. See SECURITY.md.
8
+ - name: Question / discussion
9
+ url: https://github.com/ajaysurya1221/dorian/discussions
10
+ about: Open-ended questions about claims, checkers, or the trust model.
@@ -0,0 +1,34 @@
1
+ name: False alarm
2
+ description: dorian flipped a claim to BROKEN/REVOKED but the claim was actually still true.
3
+ labels: [false-alarm, accuracy]
4
+ body:
5
+ - type: input
6
+ id: version
7
+ attributes:
8
+ label: dorian version
9
+ validations:
10
+ required: true
11
+ - type: textarea
12
+ id: claim
13
+ attributes:
14
+ label: The claim and its checker(s)
15
+ render: json
16
+ validations:
17
+ required: true
18
+ - type: textarea
19
+ id: still_true
20
+ attributes:
21
+ label: Why the claim is still true
22
+ description: Show that the fact still holds despite the BROKEN verdict (e.g. the value moved but the checker was brittle).
23
+ validations:
24
+ required: true
25
+ - type: input
26
+ id: change
27
+ attributes:
28
+ label: Change that triggered the false alarm
29
+ placeholder: reformatted the constant; renamed the file; etc.
30
+ - type: input
31
+ id: command
32
+ attributes:
33
+ label: Command + exit code
34
+ placeholder: dorian revalidate --since main (exit 4)
@@ -0,0 +1,44 @@
1
+ name: False pass / false confidence
2
+ description: A claim stayed TRUSTED (or sealed) when the underlying fact was actually false or unverified.
3
+ labels: [false-pass, accuracy]
4
+ body:
5
+ - type: markdown
6
+ attributes:
7
+ value: >-
8
+ This is the most important report dorian can get: a verdict that said
9
+ "true" when it wasn't. It usually means a **weak binding** (the watched
10
+ source didn't include the file that defines the fact) or a **checker too
11
+ weak** to see the change (the trigger-vs-truth ceiling).
12
+ - type: input
13
+ id: version
14
+ attributes:
15
+ label: dorian version
16
+ validations:
17
+ required: true
18
+ - type: textarea
19
+ id: claim
20
+ attributes:
21
+ label: The claim and its checker(s)
22
+ description: The natural-language claim plus the `type:program` of each checker.
23
+ render: json
24
+ validations:
25
+ required: true
26
+ - type: textarea
27
+ id: why_false
28
+ attributes:
29
+ label: Why the fact was actually false / unverified
30
+ description: What changed in the source that the verdict missed.
31
+ validations:
32
+ required: true
33
+ - type: dropdown
34
+ id: suspected
35
+ attributes:
36
+ label: Suspected cause
37
+ options: ["Weak binding (watched file didn't define the fact)", "Checker too weak (e.g. symbol exists but behavior changed)", "Not sure"]
38
+ validations:
39
+ required: true
40
+ - type: input
41
+ id: command
42
+ attributes:
43
+ label: Command + exit code
44
+ placeholder: dorian revalidate --since HEAD~1 (exit 0)
@@ -0,0 +1,22 @@
1
+ name: ci
2
+ on:
3
+ push: { branches: [main] }
4
+ pull_request:
5
+ # Least privilege: CI only reads the repo. No write scopes, so a malicious PR
6
+ # cannot use the default GITHUB_TOKEN to mutate the repo or releases.
7
+ permissions:
8
+ contents: read
9
+ jobs:
10
+ test:
11
+ runs-on: ubuntu-latest
12
+ strategy:
13
+ matrix:
14
+ python: ["3.11", "3.12", "3.13"]
15
+ steps:
16
+ - uses: actions/checkout@v6.0.3
17
+ - uses: astral-sh/setup-uv@v8.2.0
18
+ with: { python-version: "${{ matrix.python }}" }
19
+ - run: uv sync --all-extras
20
+ - run: uv run ruff check src tests bench
21
+ - run: uv run ruff format --check src tests bench
22
+ - run: uv run pytest
@@ -0,0 +1,62 @@
1
+ # Public real-repo micro-benchmark — MANUAL dispatch only, read-only, fail-closed.
2
+ #
3
+ # Safe by design: workflow_dispatch only (never auto/PR-triggered), read-only token, NO
4
+ # pull_request_target, clones cached by frozen SHA, results uploaded as artifacts. The harness
5
+ # runs with --deny-exec by default (a fail-closed re-check policy, NOT a sandbox): C4/C5 checkers
6
+ # are blocked and fold to ERRORED. While claims are draft/human-review-required the run reports
7
+ # NO_CLAIMS — no numbers are produced. Do NOT add this to branch protection.
8
+ name: public-microbench
9
+
10
+ on:
11
+ workflow_dispatch:
12
+ inputs:
13
+ repo:
14
+ description: "limit to one manifest repo (blank = all eligible)"
15
+ required: false
16
+ default: ""
17
+ deny_exec:
18
+ description: "block C4/C5 at re-check (fail-closed; not a sandbox)"
19
+ type: boolean
20
+ required: false
21
+ default: true
22
+
23
+ permissions:
24
+ contents: read
25
+
26
+ jobs:
27
+ microbench:
28
+ runs-on: ubuntu-latest
29
+ steps:
30
+ - uses: actions/checkout@v6.0.3
31
+ - uses: astral-sh/setup-uv@v8.2.0
32
+ with: { python-version: "3.12" }
33
+ - run: uv sync --all-extras
34
+
35
+ # Cache cloned public subjects keyed by the manifest's frozen SHAs, so a re-run is offline.
36
+ - name: Cache frozen subject checkouts
37
+ uses: actions/cache@v4
38
+ with:
39
+ path: .bench/public-work/checkouts
40
+ key: public-microbench-checkouts-${{ hashFiles('bench/public/manifest.v1.yaml') }}
41
+
42
+ - name: Plan (dry-run — no clone, no seal, no results)
43
+ run: >-
44
+ uv run python -m dorian.cli bench public-repos
45
+ --manifest bench/public/manifest.v1.yaml
46
+ --out bench/public/results --dry-run
47
+
48
+ - name: Run harness (fail-closed re-check)
49
+ run: >-
50
+ uv run python -m dorian.cli bench public-repos
51
+ --manifest bench/public/manifest.v1.yaml
52
+ --out bench/public/results --workdir .bench/public-work
53
+ ${{ inputs.repo != '' && format('--repo {0}', inputs.repo) || '' }}
54
+ ${{ inputs.deny_exec && '--deny-exec' || '' }}
55
+
56
+ - name: Upload results
57
+ if: always()
58
+ uses: actions/upload-artifact@v4
59
+ with:
60
+ name: public-microbench-results
61
+ path: bench/public/results/
62
+ if-no-files-found: ignore
@@ -0,0 +1,61 @@
1
+ # TestPyPI dry-run via Trusted Publishing (OIDC) — MANUAL ONLY.
2
+ #
3
+ # A rehearsal of the real publish (publish.yml) against TestPyPI. It exists so the
4
+ # Trusted-Publisher / OIDC path is verified BEFORE a real release, and it never
5
+ # touches production PyPI. Like publish.yml it:
6
+ # - runs only on workflow_dispatch (never push/PR/fork),
7
+ # - uses OIDC (id-token: write) — NO stored API token, no long-lived secret,
8
+ # - is gated behind a GitHub Environment with required reviewers.
9
+ #
10
+ # Prerequisite (one-time, off-CI): create a TestPyPI Trusted Publisher for
11
+ # project `dorian-vwp` pointing at this repo + workflow `publish-testpypi.yml` +
12
+ # environment `testpypi`. Until then the upload step has no credentials and is a
13
+ # no-op rehearsal of the wiring. The real publish to pypi.org stays in publish.yml.
14
+ name: publish-testpypi
15
+
16
+ on:
17
+ workflow_dispatch:
18
+ inputs:
19
+ ref:
20
+ description: Tag to build and dry-run-publish to TestPyPI (e.g. v1.0.0rc2)
21
+ required: true
22
+
23
+ permissions:
24
+ contents: read
25
+
26
+ jobs:
27
+ build:
28
+ runs-on: ubuntu-latest
29
+ steps:
30
+ - uses: actions/checkout@v6.0.3
31
+ with:
32
+ ref: ${{ inputs.ref }}
33
+ - uses: actions/setup-python@v5
34
+ with: { python-version: "3.12" }
35
+ - name: Build sdist + wheel
36
+ run: |
37
+ python -m pip install --upgrade build twine
38
+ python -m build
39
+ python -m twine check dist/*
40
+ - uses: actions/upload-artifact@v4
41
+ with:
42
+ name: dist
43
+ path: dist/
44
+
45
+ testpypi:
46
+ needs: build
47
+ runs-on: ubuntu-latest
48
+ # the environment gates the dry-run behind required reviewers and is the
49
+ # subject the TestPyPI Trusted Publisher is bound to
50
+ environment: testpypi
51
+ permissions:
52
+ id-token: write # OIDC: mint a short-lived token, no stored secret
53
+ steps:
54
+ - uses: actions/download-artifact@v4
55
+ with:
56
+ name: dist
57
+ path: dist/
58
+ - name: Publish to TestPyPI (Trusted Publishing dry-run)
59
+ uses: pypa/gh-action-pypi-publish@release/v1
60
+ with:
61
+ repository-url: https://test.pypi.org/legacy/
@@ -0,0 +1,70 @@
1
+ # PyPI publish via Trusted Publishing (OIDC) — MANUAL ONLY.
2
+ #
3
+ # This workflow does NOT run on push or tag. It runs only when a maintainer
4
+ # triggers it by hand (workflow_dispatch) against a tag, and only after the PyPI
5
+ # side is configured:
6
+ # 1. Create a PyPI Trusted Publisher for project `dorian-vwp` pointing at this
7
+ # repo + workflow `publish.yml` + environment `pypi` (no API token anywhere).
8
+ # 2. Create a GitHub Environment named `pypi` with required-reviewer protection.
9
+ # Until both exist, the publish step has no credentials and cannot upload.
10
+ #
11
+ # It deliberately uses OIDC (id-token: write) instead of a stored token, and
12
+ # never triggers from an arbitrary branch — see docs/RELEASE_CHECKLIST.md.
13
+ name: publish
14
+
15
+ on:
16
+ workflow_dispatch:
17
+ inputs:
18
+ ref:
19
+ description: Tag to build and publish (e.g. v0.10.0)
20
+ required: true
21
+
22
+ permissions:
23
+ contents: read
24
+
25
+ jobs:
26
+ build:
27
+ runs-on: ubuntu-latest
28
+ steps:
29
+ - uses: actions/checkout@v4
30
+ with:
31
+ ref: ${{ inputs.ref }}
32
+ - uses: actions/setup-python@v5
33
+ with:
34
+ python-version: "3.12"
35
+ - name: Build sdist + wheel
36
+ run: |
37
+ python -m pip install --upgrade build twine
38
+ python -m build
39
+ python -m twine check dist/*
40
+ - name: Verify the built version matches the tag
41
+ run: |
42
+ python - <<'PY'
43
+ import os, pathlib, tomllib
44
+ tag = os.environ["REF"].lstrip("v")
45
+ ver = tomllib.loads(pathlib.Path("pyproject.toml").read_text())["project"]["version"]
46
+ assert ver == tag, f"tag {tag!r} != pyproject version {ver!r}"
47
+ print(f"ok: building {ver}")
48
+ PY
49
+ env:
50
+ REF: ${{ inputs.ref }}
51
+ - uses: actions/upload-artifact@v4
52
+ with:
53
+ name: dist
54
+ path: dist/
55
+
56
+ publish:
57
+ needs: build
58
+ runs-on: ubuntu-latest
59
+ # the environment gates publishing behind required reviewers and is the
60
+ # subject the PyPI Trusted Publisher is bound to
61
+ environment: pypi
62
+ permissions:
63
+ id-token: write # OIDC: mint a short-lived token, no stored secret
64
+ steps:
65
+ - uses: actions/download-artifact@v4
66
+ with:
67
+ name: dist
68
+ path: dist/
69
+ - name: Publish to PyPI (Trusted Publishing)
70
+ uses: pypa/gh-action-pypi-publish@release/v1
@@ -0,0 +1,87 @@
1
+ # Release gate — build, test-matrix, hash, and ATTEST PROVENANCE for a tag.
2
+ #
3
+ # Build + verification automation for the 1.0.0 line. It does NOT publish to PyPI
4
+ # (that is publish.yml / publish-testpypi.yml, manual + OIDC). It runs only on a
5
+ # manual dispatch against a tag or on a pushed tag — never on a fork PR — so the
6
+ # id-token / attestations write scopes are never exposed to untrusted code.
7
+ #
8
+ # Provenance lane: GitHub artifact attestations (actions/attest-build-provenance),
9
+ # an in-toto/SLSA build-provenance statement signed via Sigstore and recorded in
10
+ # the public transparency log. This is the accepted GA provenance lane when a
11
+ # signed git tag is not available (see docs/RELEASE_GATE_1_0.md).
12
+ name: release-gate
13
+
14
+ on:
15
+ workflow_dispatch:
16
+ inputs:
17
+ ref:
18
+ description: Tag to build, verify, and attest (e.g. v1.0.0rc2)
19
+ required: true
20
+ push:
21
+ tags: ["v*"]
22
+
23
+ # Default to read-only; elevate per-job only where strictly required.
24
+ permissions:
25
+ contents: read
26
+
27
+ jobs:
28
+ test:
29
+ runs-on: ubuntu-latest
30
+ strategy:
31
+ matrix:
32
+ python: ["3.11", "3.12", "3.13"]
33
+ steps:
34
+ - uses: actions/checkout@v6.0.3
35
+ with:
36
+ ref: ${{ inputs.ref || github.ref }}
37
+ fetch-depth: 0
38
+ - uses: astral-sh/setup-uv@v8.2.0
39
+ with: { python-version: "${{ matrix.python }}" }
40
+ - run: uv sync --all-extras
41
+ - run: uv run ruff check src tests bench
42
+ - run: uv run ruff format --check src tests bench
43
+ - run: uv run pytest -m "not slow"
44
+
45
+ build-attest:
46
+ needs: test
47
+ runs-on: ubuntu-latest
48
+ permissions:
49
+ contents: read
50
+ id-token: write # OIDC for Sigstore signing — short-lived, no stored secret
51
+ attestations: write # write the build-provenance attestation
52
+ steps:
53
+ - uses: actions/checkout@v6.0.3
54
+ with:
55
+ ref: ${{ inputs.ref || github.ref }}
56
+ fetch-depth: 0
57
+ - uses: actions/setup-python@v5
58
+ with: { python-version: "3.12" }
59
+ - name: Build sdist + wheel
60
+ run: |
61
+ python -m pip install --upgrade build twine
62
+ python -m build
63
+ python -m twine check dist/*
64
+ - name: Verify the built version matches the tag
65
+ if: ${{ inputs.ref != '' || startsWith(github.ref, 'refs/tags/') }}
66
+ run: |
67
+ python - <<'PY'
68
+ import os, pathlib, re, tomllib
69
+ ref = os.environ.get("REF") or os.environ.get("GITHUB_REF", "")
70
+ tag = re.sub(r"^refs/tags/", "", ref).lstrip("v")
71
+ ver = tomllib.loads(pathlib.Path("pyproject.toml").read_text())["project"]["version"]
72
+ assert ver == tag, f"tag {tag!r} != pyproject version {ver!r}"
73
+ print(f"ok: building {ver}")
74
+ PY
75
+ env:
76
+ REF: ${{ inputs.ref }}
77
+ - name: SHA-256 of artifacts
78
+ run: |
79
+ cd dist && sha256sum * | tee SHA256SUMS
80
+ - name: Attest build provenance
81
+ uses: actions/attest-build-provenance@v1
82
+ with:
83
+ subject-path: "dist/*.whl, dist/*.tar.gz"
84
+ - uses: actions/upload-artifact@v4
85
+ with:
86
+ name: dist
87
+ path: dist/
@@ -0,0 +1,31 @@
1
+ __pycache__/
2
+ *.pyc
3
+ .venv/
4
+ dist/
5
+ .warrant/index.sqlite
6
+ .pytest_cache/
7
+ .ruff_cache/
8
+ .coverage
9
+ htmlcov/
10
+ bench/workspace/
11
+ bench/cache/
12
+ .claims_cache/
13
+ bench/results/
14
+ bench/real/
15
+ .DS_Store
16
+ /assets/
17
+ .env
18
+
19
+ # tool working dirs (not release content)
20
+ .claude/
21
+ .gitnexus/
22
+
23
+ # internal program/audit working docs — provenance only, never shipped in the release
24
+ /RESEARCH_REPORT_DORIAN_0_11_0.md
25
+ /V1_IMPLEMENTATION_TRACKER.md
26
+ /V1_ALIGNMENT_REPORT.md
27
+ /AUDIT_RELEASE_GATE.md
28
+ /GITHUB_RELEASE_NOTES.md
29
+ research/
30
+ .bench/
31
+ .release/
@@ -0,0 +1 @@
1
+ 3.12
@@ -0,0 +1,2 @@
1
+ index.sqlite
2
+ index.sqlite-*