chipgraph 0.1.0rc1__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 (615) hide show
  1. chipgraph-0.1.0rc1/.claude-plugin/marketplace.json +15 -0
  2. chipgraph-0.1.0rc1/.dockerignore +29 -0
  3. chipgraph-0.1.0rc1/.editorconfig +15 -0
  4. chipgraph-0.1.0rc1/.github/CODEOWNERS +1 -0
  5. chipgraph-0.1.0rc1/.github/workflows/ci.yml +55 -0
  6. chipgraph-0.1.0rc1/.github/workflows/evals.yml +132 -0
  7. chipgraph-0.1.0rc1/.github/workflows/image.yml +142 -0
  8. chipgraph-0.1.0rc1/.github/workflows/release.yml +128 -0
  9. chipgraph-0.1.0rc1/.gitignore +24 -0
  10. chipgraph-0.1.0rc1/.pre-commit-config.yaml +7 -0
  11. chipgraph-0.1.0rc1/.python-version +1 -0
  12. chipgraph-0.1.0rc1/AGENTS.md +68 -0
  13. chipgraph-0.1.0rc1/CLAUDE.md +1 -0
  14. chipgraph-0.1.0rc1/CONTRIBUTING.md +17 -0
  15. chipgraph-0.1.0rc1/DESIGN.md +1191 -0
  16. chipgraph-0.1.0rc1/LICENSE +202 -0
  17. chipgraph-0.1.0rc1/Makefile +52 -0
  18. chipgraph-0.1.0rc1/PKG-INFO +50 -0
  19. chipgraph-0.1.0rc1/README.md +27 -0
  20. chipgraph-0.1.0rc1/SECURITY.md +20 -0
  21. chipgraph-0.1.0rc1/docker/Dockerfile +114 -0
  22. chipgraph-0.1.0rc1/docker/README.md +83 -0
  23. chipgraph-0.1.0rc1/docs/DECISIONS.md +470 -0
  24. chipgraph-0.1.0rc1/docs/IMPLEMENTATION_PLAN.md +296 -0
  25. chipgraph-0.1.0rc1/docs/RELEASING.md +85 -0
  26. chipgraph-0.1.0rc1/docs/RESEARCH.md +99 -0
  27. chipgraph-0.1.0rc1/docs/archive/DESIGN_v0.1.md +1119 -0
  28. chipgraph-0.1.0rc1/docs/ask-claude-code/report.py +188 -0
  29. chipgraph-0.1.0rc1/docs/ask-claude-code/run.sh +93 -0
  30. chipgraph-0.1.0rc1/docs/examples/README.md +24 -0
  31. chipgraph-0.1.0rc1/docs/examples/qsoc.chipgraph.yml +142 -0
  32. chipgraph-0.1.0rc1/docs/plugin-claude-code/report.py +333 -0
  33. chipgraph-0.1.0rc1/docs/plugin-claude-code/run.sh +132 -0
  34. chipgraph-0.1.0rc1/docs/runtime-claude-code/report.py +140 -0
  35. chipgraph-0.1.0rc1/docs/runtime-claude-code/run.sh +80 -0
  36. chipgraph-0.1.0rc1/docs/spikes/S2.md +66 -0
  37. chipgraph-0.1.0rc1/docs/spikes/S5.md +68 -0
  38. chipgraph-0.1.0rc1/docs/spikes/S7.md +101 -0
  39. chipgraph-0.1.0rc1/docs/spikes/s7/hook_guard.py +95 -0
  40. chipgraph-0.1.0rc1/docs/spikes/s7/report.py +84 -0
  41. chipgraph-0.1.0rc1/docs/spikes/s7/run.sh +40 -0
  42. chipgraph-0.1.0rc1/docs/spikes/s7/s7_server.py +171 -0
  43. chipgraph-0.1.0rc1/docs/spikes/s7/selftest.py +144 -0
  44. chipgraph-0.1.0rc1/docs/spikes/s7/setup.sh +79 -0
  45. chipgraph-0.1.0rc1/docs/triage-claude-code/report.py +210 -0
  46. chipgraph-0.1.0rc1/docs/triage-claude-code/rules_only_holdout.py +105 -0
  47. chipgraph-0.1.0rc1/docs/triage-claude-code/rules_only_holdout2.py +138 -0
  48. chipgraph-0.1.0rc1/docs/triage-claude-code/run.sh +124 -0
  49. chipgraph-0.1.0rc1/evals/README.md +219 -0
  50. chipgraph-0.1.0rc1/evals/ask/grade.py +312 -0
  51. chipgraph-0.1.0rc1/evals/ask/tinysoc.yml +206 -0
  52. chipgraph-0.1.0rc1/evals/harness/__init__.py +33 -0
  53. chipgraph-0.1.0rc1/evals/harness/project.py +67 -0
  54. chipgraph-0.1.0rc1/evals/harness/report.py +154 -0
  55. chipgraph-0.1.0rc1/evals/harness/run.py +230 -0
  56. chipgraph-0.1.0rc1/evals/harness/runtimes.py +373 -0
  57. chipgraph-0.1.0rc1/evals/harness/streams.py +183 -0
  58. chipgraph-0.1.0rc1/evals/harness/suites.py +119 -0
  59. chipgraph-0.1.0rc1/evals/harness/tasks.py +84 -0
  60. chipgraph-0.1.0rc1/evals/run-claude-code.sh +45 -0
  61. chipgraph-0.1.0rc1/evals/triage/faults.yml +277 -0
  62. chipgraph-0.1.0rc1/evals/triage/gen_logs.py +435 -0
  63. chipgraph-0.1.0rc1/evals/triage/grade.py +230 -0
  64. chipgraph-0.1.0rc1/evals/triage/holdout.yml +167 -0
  65. chipgraph-0.1.0rc1/evals/triage/holdout2.yml +215 -0
  66. chipgraph-0.1.0rc1/evals/triage/logs/log-01.json +7 -0
  67. chipgraph-0.1.0rc1/evals/triage/logs/log-01.log +8 -0
  68. chipgraph-0.1.0rc1/evals/triage/logs/log-02.json +7 -0
  69. chipgraph-0.1.0rc1/evals/triage/logs/log-02.log +3 -0
  70. chipgraph-0.1.0rc1/evals/triage/logs/log-03.json +7 -0
  71. chipgraph-0.1.0rc1/evals/triage/logs/log-03.log +2 -0
  72. chipgraph-0.1.0rc1/evals/triage/logs/log-04.json +7 -0
  73. chipgraph-0.1.0rc1/evals/triage/logs/log-04.log +4 -0
  74. chipgraph-0.1.0rc1/evals/triage/logs/log-05.json +7 -0
  75. chipgraph-0.1.0rc1/evals/triage/logs/log-05.log +17 -0
  76. chipgraph-0.1.0rc1/evals/triage/logs/log-06.json +7 -0
  77. chipgraph-0.1.0rc1/evals/triage/logs/log-06.log +14 -0
  78. chipgraph-0.1.0rc1/evals/triage/logs/log-07.json +7 -0
  79. chipgraph-0.1.0rc1/evals/triage/logs/log-07.log +17 -0
  80. chipgraph-0.1.0rc1/evals/triage/logs/log-08.json +7 -0
  81. chipgraph-0.1.0rc1/evals/triage/logs/log-08.log +9 -0
  82. chipgraph-0.1.0rc1/evals/triage/logs/log-09.json +7 -0
  83. chipgraph-0.1.0rc1/evals/triage/logs/log-09.log +2 -0
  84. chipgraph-0.1.0rc1/evals/triage/logs/log-10.json +7 -0
  85. chipgraph-0.1.0rc1/evals/triage/logs/log-10.log +1 -0
  86. chipgraph-0.1.0rc1/evals/triage/logs/log-11.json +7 -0
  87. chipgraph-0.1.0rc1/evals/triage/logs/log-11.log +17 -0
  88. chipgraph-0.1.0rc1/evals/triage/logs/log-12.json +7 -0
  89. chipgraph-0.1.0rc1/evals/triage/logs/log-12.log +17 -0
  90. chipgraph-0.1.0rc1/evals/triage/logs/log-13.json +7 -0
  91. chipgraph-0.1.0rc1/evals/triage/logs/log-13.log +2 -0
  92. chipgraph-0.1.0rc1/evals/triage/logs/log-14.json +7 -0
  93. chipgraph-0.1.0rc1/evals/triage/logs/log-14.log +5 -0
  94. chipgraph-0.1.0rc1/evals/triage/logs/log-15.json +7 -0
  95. chipgraph-0.1.0rc1/evals/triage/logs/log-15.log +14 -0
  96. chipgraph-0.1.0rc1/evals/triage/logs/log-16.json +7 -0
  97. chipgraph-0.1.0rc1/evals/triage/logs/log-16.log +23 -0
  98. chipgraph-0.1.0rc1/evals/triage/logs/log-17.json +7 -0
  99. chipgraph-0.1.0rc1/evals/triage/logs/log-17.log +3 -0
  100. chipgraph-0.1.0rc1/evals/triage/logs/log-18.json +7 -0
  101. chipgraph-0.1.0rc1/evals/triage/logs/log-18.log +23 -0
  102. chipgraph-0.1.0rc1/evals/triage/logs/log-19.json +7 -0
  103. chipgraph-0.1.0rc1/evals/triage/logs/log-19.log +2 -0
  104. chipgraph-0.1.0rc1/evals/triage/logs/log-20.json +7 -0
  105. chipgraph-0.1.0rc1/evals/triage/logs/log-20.log +2 -0
  106. chipgraph-0.1.0rc1/evals/triage/logs/log-21.json +7 -0
  107. chipgraph-0.1.0rc1/evals/triage/logs/log-21.log +16 -0
  108. chipgraph-0.1.0rc1/evals/triage/logs/log-22.json +7 -0
  109. chipgraph-0.1.0rc1/evals/triage/logs/log-22.log +3 -0
  110. chipgraph-0.1.0rc1/evals/triage/logs-holdout/hold-01.json +7 -0
  111. chipgraph-0.1.0rc1/evals/triage/logs-holdout/hold-01.log +2 -0
  112. chipgraph-0.1.0rc1/evals/triage/logs-holdout/hold-02.json +7 -0
  113. chipgraph-0.1.0rc1/evals/triage/logs-holdout/hold-02.log +1 -0
  114. chipgraph-0.1.0rc1/evals/triage/logs-holdout/hold-03.json +7 -0
  115. chipgraph-0.1.0rc1/evals/triage/logs-holdout/hold-03.log +19 -0
  116. chipgraph-0.1.0rc1/evals/triage/logs-holdout/hold-04.json +7 -0
  117. chipgraph-0.1.0rc1/evals/triage/logs-holdout/hold-04.log +17 -0
  118. chipgraph-0.1.0rc1/evals/triage/logs-holdout/hold-05.json +7 -0
  119. chipgraph-0.1.0rc1/evals/triage/logs-holdout/hold-05.log +2 -0
  120. chipgraph-0.1.0rc1/evals/triage/logs-holdout/hold-06.json +7 -0
  121. chipgraph-0.1.0rc1/evals/triage/logs-holdout/hold-06.log +1 -0
  122. chipgraph-0.1.0rc1/evals/triage/logs-holdout/hold-07.json +7 -0
  123. chipgraph-0.1.0rc1/evals/triage/logs-holdout/hold-07.log +2 -0
  124. chipgraph-0.1.0rc1/evals/triage/logs-holdout/hold-08.json +7 -0
  125. chipgraph-0.1.0rc1/evals/triage/logs-holdout/hold-08.log +5 -0
  126. chipgraph-0.1.0rc1/evals/triage/logs-holdout/hold-09.json +7 -0
  127. chipgraph-0.1.0rc1/evals/triage/logs-holdout/hold-09.log +4 -0
  128. chipgraph-0.1.0rc1/evals/triage/logs-holdout/hold-10.json +7 -0
  129. chipgraph-0.1.0rc1/evals/triage/logs-holdout/hold-10.log +19 -0
  130. chipgraph-0.1.0rc1/evals/triage/logs-holdout/hold-11.json +7 -0
  131. chipgraph-0.1.0rc1/evals/triage/logs-holdout/hold-11.log +16 -0
  132. chipgraph-0.1.0rc1/evals/triage/logs-holdout/hold-12.json +7 -0
  133. chipgraph-0.1.0rc1/evals/triage/logs-holdout/hold-12.log +2 -0
  134. chipgraph-0.1.0rc1/evals/triage/logs-holdout2/h2-01.json +7 -0
  135. chipgraph-0.1.0rc1/evals/triage/logs-holdout2/h2-01.log +36 -0
  136. chipgraph-0.1.0rc1/evals/triage/logs-holdout2/h2-02.json +7 -0
  137. chipgraph-0.1.0rc1/evals/triage/logs-holdout2/h2-02.log +2 -0
  138. chipgraph-0.1.0rc1/evals/triage/logs-holdout2/h2-03.json +7 -0
  139. chipgraph-0.1.0rc1/evals/triage/logs-holdout2/h2-03.log +7 -0
  140. chipgraph-0.1.0rc1/evals/triage/logs-holdout2/h2-04.json +7 -0
  141. chipgraph-0.1.0rc1/evals/triage/logs-holdout2/h2-04.log +2 -0
  142. chipgraph-0.1.0rc1/evals/triage/logs-holdout2/h2-05.json +7 -0
  143. chipgraph-0.1.0rc1/evals/triage/logs-holdout2/h2-05.log +9 -0
  144. chipgraph-0.1.0rc1/evals/triage/logs-holdout2/h2-06.json +7 -0
  145. chipgraph-0.1.0rc1/evals/triage/logs-holdout2/h2-06.log +7 -0
  146. chipgraph-0.1.0rc1/evals/triage/logs-holdout2/h2-07.json +7 -0
  147. chipgraph-0.1.0rc1/evals/triage/logs-holdout2/h2-07.log +1 -0
  148. chipgraph-0.1.0rc1/evals/triage/logs-holdout2/h2-08.json +7 -0
  149. chipgraph-0.1.0rc1/evals/triage/logs-holdout2/h2-08.log +2 -0
  150. chipgraph-0.1.0rc1/evals/triage/logs-holdout2/h2-09.json +7 -0
  151. chipgraph-0.1.0rc1/evals/triage/logs-holdout2/h2-09.log +9 -0
  152. chipgraph-0.1.0rc1/evals/triage/logs-holdout2/h2-10.json +7 -0
  153. chipgraph-0.1.0rc1/evals/triage/logs-holdout2/h2-10.log +4 -0
  154. chipgraph-0.1.0rc1/evals/triage/logs-holdout2/h2-11.json +7 -0
  155. chipgraph-0.1.0rc1/evals/triage/logs-holdout2/h2-11.log +8 -0
  156. chipgraph-0.1.0rc1/evals/triage/logs-holdout2/h2-12.json +7 -0
  157. chipgraph-0.1.0rc1/evals/triage/logs-holdout2/h2-12.log +2 -0
  158. chipgraph-0.1.0rc1/evals/triage/rules_only.py +90 -0
  159. chipgraph-0.1.0rc1/evals/triage/tb/holdout/tb_soc_regs.sv +144 -0
  160. chipgraph-0.1.0rc1/evals/triage/tb/holdout2/tb_gpio_pins.sv +89 -0
  161. chipgraph-0.1.0rc1/evals/triage/tb/holdout2/tb_timer_sva.sv +98 -0
  162. chipgraph-0.1.0rc1/evals/triage/tb/holdout2/tb_top_irq.sv +108 -0
  163. chipgraph-0.1.0rc1/evals/triage/tb/holdout2/tb_top_scoreboard.sv +148 -0
  164. chipgraph-0.1.0rc1/evals/triage/tb/tb_tiny_gpio.sv +101 -0
  165. chipgraph-0.1.0rc1/evals/triage/tb/tb_tiny_timer.sv +106 -0
  166. chipgraph-0.1.0rc1/examples/tinysoc/.chipgraph/packs/tinysoc/pack.yml +21 -0
  167. chipgraph-0.1.0rc1/examples/tinysoc/.chipgraph/packs/tinysoc/rules/lint_manifest.yml +17 -0
  168. chipgraph-0.1.0rc1/examples/tinysoc/.chipgraph/packs/tinysoc/rules/rtl.yml +22 -0
  169. chipgraph-0.1.0rc1/examples/tinysoc/.chipgraph.yml +51 -0
  170. chipgraph-0.1.0rc1/examples/tinysoc/.gitignore +3 -0
  171. chipgraph-0.1.0rc1/examples/tinysoc/Makefile +27 -0
  172. chipgraph-0.1.0rc1/examples/tinysoc/README.md +77 -0
  173. chipgraph-0.1.0rc1/examples/tinysoc/chip.yml +42 -0
  174. chipgraph-0.1.0rc1/examples/tinysoc/doc/specs/TINY_GPIO_MAS.md +124 -0
  175. chipgraph-0.1.0rc1/examples/tinysoc/doc/specs/TINY_TIMER_MAS.md +131 -0
  176. chipgraph-0.1.0rc1/examples/tinysoc/dv/test_tiny_gpio.py +26 -0
  177. chipgraph-0.1.0rc1/examples/tinysoc/dv/test_tiny_timer.py +38 -0
  178. chipgraph-0.1.0rc1/examples/tinysoc/filelists/gpio.f +1 -0
  179. chipgraph-0.1.0rc1/examples/tinysoc/filelists/timer.f +1 -0
  180. chipgraph-0.1.0rc1/examples/tinysoc/filelists/top.f +3 -0
  181. chipgraph-0.1.0rc1/examples/tinysoc/rtl/tiny_gpio.sv +54 -0
  182. chipgraph-0.1.0rc1/examples/tinysoc/rtl/tiny_timer.sv +68 -0
  183. chipgraph-0.1.0rc1/examples/tinysoc/rtl/tiny_top.sv +67 -0
  184. chipgraph-0.1.0rc1/examples/tinysoc/scripts/gen_manifest.py +47 -0
  185. chipgraph-0.1.0rc1/plugin/.claude-plugin/plugin.json +14 -0
  186. chipgraph-0.1.0rc1/plugin/.mcp.json +8 -0
  187. chipgraph-0.1.0rc1/plugin/README.md +220 -0
  188. chipgraph-0.1.0rc1/plugin/agents/asker.md +34 -0
  189. chipgraph-0.1.0rc1/plugin/agents/author.md +35 -0
  190. chipgraph-0.1.0rc1/plugin/agents/decider.md +26 -0
  191. chipgraph-0.1.0rc1/plugin/commands/ask.md +29 -0
  192. chipgraph-0.1.0rc1/plugin/commands/decide.md +34 -0
  193. chipgraph-0.1.0rc1/plugin/commands/init-chipgraph.md +34 -0
  194. chipgraph-0.1.0rc1/plugin/commands/run.md +43 -0
  195. chipgraph-0.1.0rc1/plugin/commands/status.md +31 -0
  196. chipgraph-0.1.0rc1/plugin/commands/trace.md +54 -0
  197. chipgraph-0.1.0rc1/plugin/commands/triage.md +44 -0
  198. chipgraph-0.1.0rc1/plugin/hooks/guard.py +344 -0
  199. chipgraph-0.1.0rc1/plugin/hooks/hooks.json +18 -0
  200. chipgraph-0.1.0rc1/pyproject.toml +135 -0
  201. chipgraph-0.1.0rc1/renovate.json +19 -0
  202. chipgraph-0.1.0rc1/schemas/AgentResult.schema.json +84 -0
  203. chipgraph-0.1.0rc1/schemas/Approval.schema.json +65 -0
  204. chipgraph-0.1.0rc1/schemas/Artifact.schema.json +160 -0
  205. chipgraph-0.1.0rc1/schemas/ArtifactRef.schema.json +80 -0
  206. chipgraph-0.1.0rc1/schemas/CheckResult.schema.json +125 -0
  207. chipgraph-0.1.0rc1/schemas/CheckSpec.schema.json +42 -0
  208. chipgraph-0.1.0rc1/schemas/Decision.schema.json +61 -0
  209. chipgraph-0.1.0rc1/schemas/Event.schema.json +95 -0
  210. chipgraph-0.1.0rc1/schemas/Finding.schema.json +277 -0
  211. chipgraph-0.1.0rc1/schemas/GateSpec.schema.json +134 -0
  212. chipgraph-0.1.0rc1/schemas/README.md +8 -0
  213. chipgraph-0.1.0rc1/schemas/RuleInstance.schema.json +140 -0
  214. chipgraph-0.1.0rc1/schemas/RuleSpec.schema.json +262 -0
  215. chipgraph-0.1.0rc1/schemas/RunManifest.schema.json +100 -0
  216. chipgraph-0.1.0rc1/schemas/formats/chip.schema.json +311 -0
  217. chipgraph-0.1.0rc1/schemas/formats/naming-rules.schema.json +180 -0
  218. chipgraph-0.1.0rc1/schemas/model/BlockEntity.schema.json +175 -0
  219. chipgraph-0.1.0rc1/schemas/model/ClockEntity.schema.json +163 -0
  220. chipgraph-0.1.0rc1/schemas/model/DecisionEntity.schema.json +175 -0
  221. chipgraph-0.1.0rc1/schemas/model/ExtEntity.schema.json +149 -0
  222. chipgraph-0.1.0rc1/schemas/model/FieldEntity.schema.json +219 -0
  223. chipgraph-0.1.0rc1/schemas/model/InterfaceEntity.schema.json +162 -0
  224. chipgraph-0.1.0rc1/schemas/model/InterruptEntity.schema.json +176 -0
  225. chipgraph-0.1.0rc1/schemas/model/MemoryRegionEntity.schema.json +194 -0
  226. chipgraph-0.1.0rc1/schemas/model/ModuleEntity.schema.json +175 -0
  227. chipgraph-0.1.0rc1/schemas/model/OpenItemEntity.schema.json +166 -0
  228. chipgraph-0.1.0rc1/schemas/model/ParameterEntity.schema.json +184 -0
  229. chipgraph-0.1.0rc1/schemas/model/PortEntity.schema.json +222 -0
  230. chipgraph-0.1.0rc1/schemas/model/ProjectEntity.schema.json +149 -0
  231. chipgraph-0.1.0rc1/schemas/model/RegisterEntity.schema.json +221 -0
  232. chipgraph-0.1.0rc1/schemas/model/Relation.schema.json +149 -0
  233. chipgraph-0.1.0rc1/schemas/model/RequirementEntity.schema.json +234 -0
  234. chipgraph-0.1.0rc1/schemas/model/ResetEntity.schema.json +175 -0
  235. chipgraph-0.1.0rc1/schemas/model/TestEntity.schema.json +158 -0
  236. chipgraph-0.1.0rc1/src/chipgraph/__init__.py +7 -0
  237. chipgraph-0.1.0rc1/src/chipgraph/adapters/__init__.py +1 -0
  238. chipgraph-0.1.0rc1/src/chipgraph/adapters/format/__init__.py +6 -0
  239. chipgraph-0.1.0rc1/src/chipgraph/adapters/format/__main__.py +16 -0
  240. chipgraph-0.1.0rc1/src/chipgraph/adapters/format/_yaml_lines.py +54 -0
  241. chipgraph-0.1.0rc1/src/chipgraph/adapters/format/chip_yaml.py +323 -0
  242. chipgraph-0.1.0rc1/src/chipgraph/adapters/format/qsoc_contract.py +246 -0
  243. chipgraph-0.1.0rc1/src/chipgraph/adapters/llm/__init__.py +58 -0
  244. chipgraph-0.1.0rc1/src/chipgraph/adapters/llm/_budget.py +168 -0
  245. chipgraph-0.1.0rc1/src/chipgraph/adapters/llm/_errors.py +50 -0
  246. chipgraph-0.1.0rc1/src/chipgraph/adapters/llm/_nda.py +30 -0
  247. chipgraph-0.1.0rc1/src/chipgraph/adapters/llm/_retry.py +85 -0
  248. chipgraph-0.1.0rc1/src/chipgraph/adapters/llm/anthropic.py +240 -0
  249. chipgraph-0.1.0rc1/src/chipgraph/adapters/llm/decide_backend.py +179 -0
  250. chipgraph-0.1.0rc1/src/chipgraph/adapters/llm/fake.py +87 -0
  251. chipgraph-0.1.0rc1/src/chipgraph/adapters/llm/guard.py +68 -0
  252. chipgraph-0.1.0rc1/src/chipgraph/adapters/parser/__init__.py +22 -0
  253. chipgraph-0.1.0rc1/src/chipgraph/adapters/parser/generic_regex.py +75 -0
  254. chipgraph-0.1.0rc1/src/chipgraph/adapters/parser/verible.py +55 -0
  255. chipgraph-0.1.0rc1/src/chipgraph/adapters/parser/verilator.py +46 -0
  256. chipgraph-0.1.0rc1/src/chipgraph/adapters/review/__init__.py +7 -0
  257. chipgraph-0.1.0rc1/src/chipgraph/adapters/review/file.py +123 -0
  258. chipgraph-0.1.0rc1/src/chipgraph/adapters/runner/__init__.py +7 -0
  259. chipgraph-0.1.0rc1/src/chipgraph/adapters/runner/local.py +89 -0
  260. chipgraph-0.1.0rc1/src/chipgraph/adapters/runtime/__init__.py +5 -0
  261. chipgraph-0.1.0rc1/src/chipgraph/adapters/runtime/claude_code/__init__.py +18 -0
  262. chipgraph-0.1.0rc1/src/chipgraph/adapters/runtime/claude_code/decisions.py +280 -0
  263. chipgraph-0.1.0rc1/src/chipgraph/adapters/runtime/claude_code/runtime.py +102 -0
  264. chipgraph-0.1.0rc1/src/chipgraph/adapters/runtime/claude_code/service.py +590 -0
  265. chipgraph-0.1.0rc1/src/chipgraph/adapters/tool/__init__.py +7 -0
  266. chipgraph-0.1.0rc1/src/chipgraph/adapters/tool/cmd.py +229 -0
  267. chipgraph-0.1.0rc1/src/chipgraph/adapters/tool/filelist.py +259 -0
  268. chipgraph-0.1.0rc1/src/chipgraph/adapters/tool/pyslang.py +485 -0
  269. chipgraph-0.1.0rc1/src/chipgraph/adapters/vcs/__init__.py +1 -0
  270. chipgraph-0.1.0rc1/src/chipgraph/adapters/vcs/git.py +107 -0
  271. chipgraph-0.1.0rc1/src/chipgraph/app/__init__.py +10 -0
  272. chipgraph-0.1.0rc1/src/chipgraph/app/baseline.py +339 -0
  273. chipgraph-0.1.0rc1/src/chipgraph/app/build.py +139 -0
  274. chipgraph-0.1.0rc1/src/chipgraph/app/checks.py +193 -0
  275. chipgraph-0.1.0rc1/src/chipgraph/app/context.py +178 -0
  276. chipgraph-0.1.0rc1/src/chipgraph/app/errors.py +11 -0
  277. chipgraph-0.1.0rc1/src/chipgraph/app/executors.py +79 -0
  278. chipgraph-0.1.0rc1/src/chipgraph/app/findings.py +203 -0
  279. chipgraph-0.1.0rc1/src/chipgraph/app/ingest.py +523 -0
  280. chipgraph-0.1.0rc1/src/chipgraph/checks/__init__.py +52 -0
  281. chipgraph-0.1.0rc1/src/chipgraph/checks/_cdc_analyze.py +272 -0
  282. chipgraph-0.1.0rc1/src/chipgraph/checks/_cdc_elaborate.py +455 -0
  283. chipgraph-0.1.0rc1/src/chipgraph/checks/_common.py +268 -0
  284. chipgraph-0.1.0rc1/src/chipgraph/checks/_cross.py +96 -0
  285. chipgraph-0.1.0rc1/src/chipgraph/checks/_model.py +64 -0
  286. chipgraph-0.1.0rc1/src/chipgraph/checks/_naming_pyslang.py +235 -0
  287. chipgraph-0.1.0rc1/src/chipgraph/checks/_naming_rules.py +127 -0
  288. chipgraph-0.1.0rc1/src/chipgraph/checks/_xref_syntax.py +260 -0
  289. chipgraph-0.1.0rc1/src/chipgraph/checks/cdc_struct.py +235 -0
  290. chipgraph-0.1.0rc1/src/chipgraph/checks/connect.py +353 -0
  291. chipgraph-0.1.0rc1/src/chipgraph/checks/cross_chip.py +454 -0
  292. chipgraph-0.1.0rc1/src/chipgraph/checks/duplicate.py +151 -0
  293. chipgraph-0.1.0rc1/src/chipgraph/checks/filelist.py +323 -0
  294. chipgraph-0.1.0rc1/src/chipgraph/checks/generated.py +151 -0
  295. chipgraph-0.1.0rc1/src/chipgraph/checks/hardcode.py +233 -0
  296. chipgraph-0.1.0rc1/src/chipgraph/checks/layout.py +155 -0
  297. chipgraph-0.1.0rc1/src/chipgraph/checks/naming.py +311 -0
  298. chipgraph-0.1.0rc1/src/chipgraph/checks/ports_diff.py +203 -0
  299. chipgraph-0.1.0rc1/src/chipgraph/checks/spec_schema.py +257 -0
  300. chipgraph-0.1.0rc1/src/chipgraph/checks/trace.py +207 -0
  301. chipgraph-0.1.0rc1/src/chipgraph/cli/__init__.py +1500 -0
  302. chipgraph-0.1.0rc1/src/chipgraph/core/__init__.py +1 -0
  303. chipgraph-0.1.0rc1/src/chipgraph/core/config/__init__.py +81 -0
  304. chipgraph-0.1.0rc1/src/chipgraph/core/config/defaults.py +14 -0
  305. chipgraph-0.1.0rc1/src/chipgraph/core/config/errors.py +32 -0
  306. chipgraph-0.1.0rc1/src/chipgraph/core/config/loader.py +598 -0
  307. chipgraph-0.1.0rc1/src/chipgraph/core/config/models.py +612 -0
  308. chipgraph-0.1.0rc1/src/chipgraph/core/config/templates.py +340 -0
  309. chipgraph-0.1.0rc1/src/chipgraph/core/contracts/__init__.py +75 -0
  310. chipgraph-0.1.0rc1/src/chipgraph/core/contracts/_paths.py +26 -0
  311. chipgraph-0.1.0rc1/src/chipgraph/core/contracts/agent.py +49 -0
  312. chipgraph-0.1.0rc1/src/chipgraph/core/contracts/artifact.py +68 -0
  313. chipgraph-0.1.0rc1/src/chipgraph/core/contracts/check.py +76 -0
  314. chipgraph-0.1.0rc1/src/chipgraph/core/contracts/event.py +70 -0
  315. chipgraph-0.1.0rc1/src/chipgraph/core/contracts/export.py +128 -0
  316. chipgraph-0.1.0rc1/src/chipgraph/core/contracts/finding.py +171 -0
  317. chipgraph-0.1.0rc1/src/chipgraph/core/contracts/gate.py +50 -0
  318. chipgraph-0.1.0rc1/src/chipgraph/core/contracts/rule.py +177 -0
  319. chipgraph-0.1.0rc1/src/chipgraph/core/contracts/types.py +45 -0
  320. chipgraph-0.1.0rc1/src/chipgraph/core/engine/__init__.py +70 -0
  321. chipgraph-0.1.0rc1/src/chipgraph/core/engine/baseline.py +283 -0
  322. chipgraph-0.1.0rc1/src/chipgraph/core/engine/decide.py +462 -0
  323. chipgraph-0.1.0rc1/src/chipgraph/core/engine/gate.py +170 -0
  324. chipgraph-0.1.0rc1/src/chipgraph/core/engine/graph.py +533 -0
  325. chipgraph-0.1.0rc1/src/chipgraph/core/engine/records.py +60 -0
  326. chipgraph-0.1.0rc1/src/chipgraph/core/engine/rules.py +92 -0
  327. chipgraph-0.1.0rc1/src/chipgraph/core/engine/scheduler.py +540 -0
  328. chipgraph-0.1.0rc1/src/chipgraph/core/model/__init__.py +98 -0
  329. chipgraph-0.1.0rc1/src/chipgraph/core/model/entities.py +244 -0
  330. chipgraph-0.1.0rc1/src/chipgraph/core/model/export.py +16 -0
  331. chipgraph-0.1.0rc1/src/chipgraph/core/model/ingest.py +693 -0
  332. chipgraph-0.1.0rc1/src/chipgraph/core/model/json_value.py +4 -0
  333. chipgraph-0.1.0rc1/src/chipgraph/core/model/keys.py +95 -0
  334. chipgraph-0.1.0rc1/src/chipgraph/core/model/model.py +153 -0
  335. chipgraph-0.1.0rc1/src/chipgraph/core/model/provenance.py +27 -0
  336. chipgraph-0.1.0rc1/src/chipgraph/core/model/query.py +583 -0
  337. chipgraph-0.1.0rc1/src/chipgraph/core/model/registry.py +80 -0
  338. chipgraph-0.1.0rc1/src/chipgraph/core/model/relations.py +61 -0
  339. chipgraph-0.1.0rc1/src/chipgraph/core/model/store.py +279 -0
  340. chipgraph-0.1.0rc1/src/chipgraph/core/plugin_api/__init__.py +81 -0
  341. chipgraph-0.1.0rc1/src/chipgraph/core/plugin_api/local.py +167 -0
  342. chipgraph-0.1.0rc1/src/chipgraph/core/plugin_api/pack.py +159 -0
  343. chipgraph-0.1.0rc1/src/chipgraph/core/plugin_api/protocols.py +177 -0
  344. chipgraph-0.1.0rc1/src/chipgraph/core/plugin_api/registry.py +111 -0
  345. chipgraph-0.1.0rc1/src/chipgraph/core/plugin_api/types.py +94 -0
  346. chipgraph-0.1.0rc1/src/chipgraph/core/runtime/__init__.py +40 -0
  347. chipgraph-0.1.0rc1/src/chipgraph/core/runtime/executor.py +79 -0
  348. chipgraph-0.1.0rc1/src/chipgraph/core/runtime/queue.py +380 -0
  349. chipgraph-0.1.0rc1/src/chipgraph/core/state/__init__.py +1 -0
  350. chipgraph-0.1.0rc1/src/chipgraph/core/state/artifacts.py +156 -0
  351. chipgraph-0.1.0rc1/src/chipgraph/core/state/backend.py +117 -0
  352. chipgraph-0.1.0rc1/src/chipgraph/core/state/findings.py +151 -0
  353. chipgraph-0.1.0rc1/src/chipgraph/core/state/handoff.py +321 -0
  354. chipgraph-0.1.0rc1/src/chipgraph/core/state/idempotency.py +59 -0
  355. chipgraph-0.1.0rc1/src/chipgraph/core/state/journal.py +238 -0
  356. chipgraph-0.1.0rc1/src/chipgraph/core/state/layout.py +73 -0
  357. chipgraph-0.1.0rc1/src/chipgraph/core/state/lock.py +195 -0
  358. chipgraph-0.1.0rc1/src/chipgraph/core/state/trace.py +225 -0
  359. chipgraph-0.1.0rc1/src/chipgraph/learn/__init__.py +96 -0
  360. chipgraph-0.1.0rc1/src/chipgraph/learn/draft.py +187 -0
  361. chipgraph-0.1.0rc1/src/chipgraph/learn/infer.py +580 -0
  362. chipgraph-0.1.0rc1/src/chipgraph/learn/models.py +145 -0
  363. chipgraph-0.1.0rc1/src/chipgraph/learn/try_run.py +228 -0
  364. chipgraph-0.1.0rc1/src/chipgraph/mcp/__init__.py +12 -0
  365. chipgraph-0.1.0rc1/src/chipgraph/mcp/model_tools.py +167 -0
  366. chipgraph-0.1.0rc1/src/chipgraph/mcp/server.py +605 -0
  367. chipgraph-0.1.0rc1/src/chipgraph/orgs/qnsc/naming-v1.yml +113 -0
  368. chipgraph-0.1.0rc1/src/chipgraph/orgs/qnsc/profile.yml +5 -0
  369. chipgraph-0.1.0rc1/src/chipgraph/packs/__init__.py +8 -0
  370. chipgraph-0.1.0rc1/src/chipgraph/packs/assist/__init__.py +16 -0
  371. chipgraph-0.1.0rc1/src/chipgraph/packs/assist/ask/__init__.py +58 -0
  372. chipgraph-0.1.0rc1/src/chipgraph/packs/assist/ask/_db.py +57 -0
  373. chipgraph-0.1.0rc1/src/chipgraph/packs/assist/ask/_project.py +230 -0
  374. chipgraph-0.1.0rc1/src/chipgraph/packs/assist/ask/answer.py +266 -0
  375. chipgraph-0.1.0rc1/src/chipgraph/packs/assist/ask/check.py +182 -0
  376. chipgraph-0.1.0rc1/src/chipgraph/packs/assist/ask/contract.py +115 -0
  377. chipgraph-0.1.0rc1/src/chipgraph/packs/assist/ask/documents.py +157 -0
  378. chipgraph-0.1.0rc1/src/chipgraph/packs/assist/ask/fts.py +80 -0
  379. chipgraph-0.1.0rc1/src/chipgraph/packs/assist/ask/retrieve.py +331 -0
  380. chipgraph-0.1.0rc1/src/chipgraph/packs/assist/audit/__init__.py +383 -0
  381. chipgraph-0.1.0rc1/src/chipgraph/packs/assist/pack.yml +13 -0
  382. chipgraph-0.1.0rc1/src/chipgraph/packs/assist/triage/__init__.py +64 -0
  383. chipgraph-0.1.0rc1/src/chipgraph/packs/assist/triage/contract.py +94 -0
  384. chipgraph-0.1.0rc1/src/chipgraph/packs/assist/triage/parse.py +371 -0
  385. chipgraph-0.1.0rc1/src/chipgraph/packs/assist/triage/question.py +384 -0
  386. chipgraph-0.1.0rc1/src/chipgraph/packs/assist/triage/report.py +160 -0
  387. chipgraph-0.1.0rc1/src/chipgraph/packs/assist/triage/rules.py +447 -0
  388. chipgraph-0.1.0rc1/src/chipgraph/packs/assist/triage/run.py +224 -0
  389. chipgraph-0.1.0rc1/src/chipgraph/packs/spec_core/__init__.py +9 -0
  390. chipgraph-0.1.0rc1/src/chipgraph/packs/spec_core/extract/__init__.py +12 -0
  391. chipgraph-0.1.0rc1/src/chipgraph/packs/spec_core/extract/_markdown.py +371 -0
  392. chipgraph-0.1.0rc1/src/chipgraph/packs/spec_core/extract/_text.py +116 -0
  393. chipgraph-0.1.0rc1/src/chipgraph/packs/spec_core/extract/mas.py +895 -0
  394. chipgraph-0.1.0rc1/src/chipgraph/packs/spec_core/gen/__init__.py +11 -0
  395. chipgraph-0.1.0rc1/src/chipgraph/packs/spec_core/gen/agents_md/__init__.py +148 -0
  396. chipgraph-0.1.0rc1/src/chipgraph/packs/spec_core/gen/agents_md/_context.py +239 -0
  397. chipgraph-0.1.0rc1/src/chipgraph/packs/spec_core/gen/agents_md/_markers.py +131 -0
  398. chipgraph-0.1.0rc1/src/chipgraph/packs/spec_core/gen/agents_md/agents_md.md.j2 +178 -0
  399. chipgraph-0.1.0rc1/src/chipgraph/packs/spec_core/gen/diagram/__init__.py +110 -0
  400. chipgraph-0.1.0rc1/src/chipgraph/packs/spec_core/gen/diagram/__main__.py +44 -0
  401. chipgraph-0.1.0rc1/src/chipgraph/packs/spec_core/gen/diagram/_diagrams.py +403 -0
  402. chipgraph-0.1.0rc1/src/chipgraph/packs/spec_core/gen/diagram/_scene.py +163 -0
  403. chipgraph-0.1.0rc1/src/chipgraph/packs/spec_core/pack.yml +6 -0
  404. chipgraph-0.1.0rc1/src/chipgraph/py.typed +0 -0
  405. chipgraph-0.1.0rc1/tests/adapters/format/__init__.py +1 -0
  406. chipgraph-0.1.0rc1/tests/adapters/format/fixtures/qsoc_contract.yml +356 -0
  407. chipgraph-0.1.0rc1/tests/adapters/format/fixtures/tiny_chip.yml +46 -0
  408. chipgraph-0.1.0rc1/tests/adapters/format/test_chip_yaml.py +172 -0
  409. chipgraph-0.1.0rc1/tests/adapters/format/test_qsoc_contract.py +176 -0
  410. chipgraph-0.1.0rc1/tests/adapters/llm/llm_helpers.py +29 -0
  411. chipgraph-0.1.0rc1/tests/adapters/llm/test_decide_backend.py +193 -0
  412. chipgraph-0.1.0rc1/tests/adapters/llm/test_llm_anthropic.py +263 -0
  413. chipgraph-0.1.0rc1/tests/adapters/llm/test_llm_entry_points.py +23 -0
  414. chipgraph-0.1.0rc1/tests/adapters/llm/test_llm_fake.py +77 -0
  415. chipgraph-0.1.0rc1/tests/adapters/llm/test_llm_guard.py +267 -0
  416. chipgraph-0.1.0rc1/tests/adapters/parser/logs/verible.log +4 -0
  417. chipgraph-0.1.0rc1/tests/adapters/parser/logs/verilator_5020.log +6 -0
  418. chipgraph-0.1.0rc1/tests/adapters/parser/logs/verilator_5052.log +25 -0
  419. chipgraph-0.1.0rc1/tests/adapters/parser/test_generic_regex.py +82 -0
  420. chipgraph-0.1.0rc1/tests/adapters/parser/test_init.py +20 -0
  421. chipgraph-0.1.0rc1/tests/adapters/parser/test_verible.py +80 -0
  422. chipgraph-0.1.0rc1/tests/adapters/parser/test_verilator.py +112 -0
  423. chipgraph-0.1.0rc1/tests/adapters/review/test_file.py +148 -0
  424. chipgraph-0.1.0rc1/tests/adapters/runner/test_local.py +105 -0
  425. chipgraph-0.1.0rc1/tests/adapters/runtime/test_claude_code_decisions.py +300 -0
  426. chipgraph-0.1.0rc1/tests/adapters/runtime/test_claude_code_runtime.py +186 -0
  427. chipgraph-0.1.0rc1/tests/adapters/test_entry_points.py +14 -0
  428. chipgraph-0.1.0rc1/tests/adapters/tool/rtl_fixtures/fsm.sv +47 -0
  429. chipgraph-0.1.0rc1/tests/adapters/tool/rtl_fixtures/simple_core.sv +31 -0
  430. chipgraph-0.1.0rc1/tests/adapters/tool/rtl_fixtures/test.f +5 -0
  431. chipgraph-0.1.0rc1/tests/adapters/tool/rtl_fixtures/types_pkg.sv +14 -0
  432. chipgraph-0.1.0rc1/tests/adapters/tool/rtl_fixtures/wrapper.sv +26 -0
  433. chipgraph-0.1.0rc1/tests/adapters/tool/test_cmd.py +292 -0
  434. chipgraph-0.1.0rc1/tests/adapters/tool/test_filelist_reader.py +240 -0
  435. chipgraph-0.1.0rc1/tests/adapters/tool/test_pyslang.py +375 -0
  436. chipgraph-0.1.0rc1/tests/adapters/vcs/test_git.py +131 -0
  437. chipgraph-0.1.0rc1/tests/app/conftest.py +43 -0
  438. chipgraph-0.1.0rc1/tests/app/test_app_findings.py +174 -0
  439. chipgraph-0.1.0rc1/tests/app/test_baseline_app.py +144 -0
  440. chipgraph-0.1.0rc1/tests/app/test_build.py +164 -0
  441. chipgraph-0.1.0rc1/tests/app/test_checks.py +196 -0
  442. chipgraph-0.1.0rc1/tests/app/test_context.py +79 -0
  443. chipgraph-0.1.0rc1/tests/app/test_context_local_plugins.py +152 -0
  444. chipgraph-0.1.0rc1/tests/app/test_executors.py +84 -0
  445. chipgraph-0.1.0rc1/tests/app/test_ingest_app.py +202 -0
  446. chipgraph-0.1.0rc1/tests/app/test_ingest_documents.py +117 -0
  447. chipgraph-0.1.0rc1/tests/checks/cdc_fixtures/hier_cross.sv +24 -0
  448. chipgraph-0.1.0rc1/tests/checks/cdc_fixtures/hier_same.sv +23 -0
  449. chipgraph-0.1.0rc1/tests/checks/cdc_helpers.py +151 -0
  450. chipgraph-0.1.0rc1/tests/checks/conftest.py +45 -0
  451. chipgraph-0.1.0rc1/tests/checks/cross_a_helpers.py +126 -0
  452. chipgraph-0.1.0rc1/tests/checks/naming_fixtures/clean.sv +22 -0
  453. chipgraph-0.1.0rc1/tests/checks/naming_fixtures/violations.sv +21 -0
  454. chipgraph-0.1.0rc1/tests/checks/test_cdc_struct.py +221 -0
  455. chipgraph-0.1.0rc1/tests/checks/test_cross_chip.py +243 -0
  456. chipgraph-0.1.0rc1/tests/checks/test_cross_duplicate.py +80 -0
  457. chipgraph-0.1.0rc1/tests/checks/test_cross_ports_diff.py +145 -0
  458. chipgraph-0.1.0rc1/tests/checks/test_cross_spec_schema.py +124 -0
  459. chipgraph-0.1.0rc1/tests/checks/test_filelist.py +191 -0
  460. chipgraph-0.1.0rc1/tests/checks/test_generated.py +110 -0
  461. chipgraph-0.1.0rc1/tests/checks/test_layout.py +128 -0
  462. chipgraph-0.1.0rc1/tests/checks/test_naming.py +268 -0
  463. chipgraph-0.1.0rc1/tests/checks/test_xref_connect.py +108 -0
  464. chipgraph-0.1.0rc1/tests/checks/test_xref_hardcode.py +150 -0
  465. chipgraph-0.1.0rc1/tests/checks/test_xref_trace.py +140 -0
  466. chipgraph-0.1.0rc1/tests/checks/xref_b_helpers.py +138 -0
  467. chipgraph-0.1.0rc1/tests/cli/conftest.py +23 -0
  468. chipgraph-0.1.0rc1/tests/cli/test_audit_cli.py +152 -0
  469. chipgraph-0.1.0rc1/tests/cli/test_baseline_cli.py +171 -0
  470. chipgraph-0.1.0rc1/tests/cli/test_check_per_block.py +58 -0
  471. chipgraph-0.1.0rc1/tests/cli/test_cli.py +314 -0
  472. chipgraph-0.1.0rc1/tests/cli/test_cli_findings.py +147 -0
  473. chipgraph-0.1.0rc1/tests/cli/test_cli_severity_bind.py +129 -0
  474. chipgraph-0.1.0rc1/tests/cli/test_config_check_plugins.py +86 -0
  475. chipgraph-0.1.0rc1/tests/cli/test_eval_cli.py +71 -0
  476. chipgraph-0.1.0rc1/tests/cli/test_ingest_cli.py +78 -0
  477. chipgraph-0.1.0rc1/tests/cli/test_learn_cli.py +111 -0
  478. chipgraph-0.1.0rc1/tests/core/config/config_fakes.py +19 -0
  479. chipgraph-0.1.0rc1/tests/core/config/templates_fixtures/block/rtl_module.sv.j2 +5 -0
  480. chipgraph-0.1.0rc1/tests/core/config/templates_fixtures/org/rtl_module.sv.j2 +3 -0
  481. chipgraph-0.1.0rc1/tests/core/config/templates_fixtures/pack/needs_var.j2 +1 -0
  482. chipgraph-0.1.0rc1/tests/core/config/templates_fixtures/pack/rtl_module.sv.j2 +18 -0
  483. chipgraph-0.1.0rc1/tests/core/config/templates_fixtures/pack/sandbox_probe.j2 +1 -0
  484. chipgraph-0.1.0rc1/tests/core/config/templates_fixtures/pack/whole_replace.j2 +3 -0
  485. chipgraph-0.1.0rc1/tests/core/config/templates_fixtures/project/header_override.j2 +4 -0
  486. chipgraph-0.1.0rc1/tests/core/config/templates_fixtures/project/rtl_module.sv.j2 +5 -0
  487. chipgraph-0.1.0rc1/tests/core/config/templates_fixtures/project_whole/whole_replace.j2 +1 -0
  488. chipgraph-0.1.0rc1/tests/core/config/test_loader.py +377 -0
  489. chipgraph-0.1.0rc1/tests/core/config/test_models.py +227 -0
  490. chipgraph-0.1.0rc1/tests/core/config/test_policy.py +113 -0
  491. chipgraph-0.1.0rc1/tests/core/config/test_resolved.py +259 -0
  492. chipgraph-0.1.0rc1/tests/core/config/test_templates.py +204 -0
  493. chipgraph-0.1.0rc1/tests/core/contracts/test_agent.py +41 -0
  494. chipgraph-0.1.0rc1/tests/core/contracts/test_artifact.py +67 -0
  495. chipgraph-0.1.0rc1/tests/core/contracts/test_check.py +76 -0
  496. chipgraph-0.1.0rc1/tests/core/contracts/test_event.py +58 -0
  497. chipgraph-0.1.0rc1/tests/core/contracts/test_export.py +57 -0
  498. chipgraph-0.1.0rc1/tests/core/contracts/test_finding.py +122 -0
  499. chipgraph-0.1.0rc1/tests/core/contracts/test_gate.py +85 -0
  500. chipgraph-0.1.0rc1/tests/core/contracts/test_rule.py +167 -0
  501. chipgraph-0.1.0rc1/tests/core/engine/_resume_kill_worker.py +76 -0
  502. chipgraph-0.1.0rc1/tests/core/engine/scheduler_fixtures.py +116 -0
  503. chipgraph-0.1.0rc1/tests/core/engine/test_baseline_core.py +169 -0
  504. chipgraph-0.1.0rc1/tests/core/engine/test_decide.py +460 -0
  505. chipgraph-0.1.0rc1/tests/core/engine/test_decide_cfg.py +87 -0
  506. chipgraph-0.1.0rc1/tests/core/engine/test_gate_evaluator.py +211 -0
  507. chipgraph-0.1.0rc1/tests/core/engine/test_graph.py +372 -0
  508. chipgraph-0.1.0rc1/tests/core/engine/test_records.py +82 -0
  509. chipgraph-0.1.0rc1/tests/core/engine/test_resume_kill.py +132 -0
  510. chipgraph-0.1.0rc1/tests/core/engine/test_rules.py +130 -0
  511. chipgraph-0.1.0rc1/tests/core/engine/test_scheduler.py +461 -0
  512. chipgraph-0.1.0rc1/tests/core/engine/test_scheduler_trace.py +153 -0
  513. chipgraph-0.1.0rc1/tests/core/model/test_entities.py +223 -0
  514. chipgraph-0.1.0rc1/tests/core/model/test_entity_registry.py +71 -0
  515. chipgraph-0.1.0rc1/tests/core/model/test_ingest_core.py +245 -0
  516. chipgraph-0.1.0rc1/tests/core/model/test_ingest_instances.py +209 -0
  517. chipgraph-0.1.0rc1/tests/core/model/test_keys.py +79 -0
  518. chipgraph-0.1.0rc1/tests/core/model/test_model.py +150 -0
  519. chipgraph-0.1.0rc1/tests/core/model/test_query.py +516 -0
  520. chipgraph-0.1.0rc1/tests/core/model/test_relations.py +27 -0
  521. chipgraph-0.1.0rc1/tests/core/model/test_store.py +236 -0
  522. chipgraph-0.1.0rc1/tests/core/plugin_api/fakes.py +152 -0
  523. chipgraph-0.1.0rc1/tests/core/plugin_api/local_plugin_fixtures/duplicate.py +23 -0
  524. chipgraph-0.1.0rc1/tests/core/plugin_api/local_plugin_fixtures/no_register.py +3 -0
  525. chipgraph-0.1.0rc1/tests/core/plugin_api/local_plugin_fixtures/raises_on_import.py +3 -0
  526. chipgraph-0.1.0rc1/tests/core/plugin_api/local_plugin_fixtures/tiny_layout.py +63 -0
  527. chipgraph-0.1.0rc1/tests/core/plugin_api/test_local_plugins.py +265 -0
  528. chipgraph-0.1.0rc1/tests/core/plugin_api/test_pack.py +148 -0
  529. chipgraph-0.1.0rc1/tests/core/plugin_api/test_protocols.py +73 -0
  530. chipgraph-0.1.0rc1/tests/core/plugin_api/test_registry.py +123 -0
  531. chipgraph-0.1.0rc1/tests/core/plugin_api/test_tool_context.py +18 -0
  532. chipgraph-0.1.0rc1/tests/core/runtime/test_task_queue.py +213 -0
  533. chipgraph-0.1.0rc1/tests/core/state/test_artifacts.py +141 -0
  534. chipgraph-0.1.0rc1/tests/core/state/test_backend.py +116 -0
  535. chipgraph-0.1.0rc1/tests/core/state/test_findings.py +145 -0
  536. chipgraph-0.1.0rc1/tests/core/state/test_handoff.py +302 -0
  537. chipgraph-0.1.0rc1/tests/core/state/test_idempotency.py +53 -0
  538. chipgraph-0.1.0rc1/tests/core/state/test_journal.py +170 -0
  539. chipgraph-0.1.0rc1/tests/core/state/test_lock.py +102 -0
  540. chipgraph-0.1.0rc1/tests/core/state/test_trace.py +120 -0
  541. chipgraph-0.1.0rc1/tests/e2e/conftest.py +69 -0
  542. chipgraph-0.1.0rc1/tests/e2e/test_tinysoc.py +195 -0
  543. chipgraph-0.1.0rc1/tests/evals/test_ask_grader.py +247 -0
  544. chipgraph-0.1.0rc1/tests/evals/test_eval_claude_code.py +302 -0
  545. chipgraph-0.1.0rc1/tests/evals/test_eval_framework.py +201 -0
  546. chipgraph-0.1.0rc1/tests/evals/test_eval_workflow.py +82 -0
  547. chipgraph-0.1.0rc1/tests/evals/test_triage_grader.py +126 -0
  548. chipgraph-0.1.0rc1/tests/evals/test_triage_holdout.py +251 -0
  549. chipgraph-0.1.0rc1/tests/evals/test_triage_holdout2.py +344 -0
  550. chipgraph-0.1.0rc1/tests/evals/test_triage_samples.py +201 -0
  551. chipgraph-0.1.0rc1/tests/learn/learn_helpers.py +149 -0
  552. chipgraph-0.1.0rc1/tests/learn/test_learn_accept.py +170 -0
  553. chipgraph-0.1.0rc1/tests/learn/test_learn_infer.py +160 -0
  554. chipgraph-0.1.0rc1/tests/mcp/conftest.py +52 -0
  555. chipgraph-0.1.0rc1/tests/mcp/runtime_tools_helpers.py +176 -0
  556. chipgraph-0.1.0rc1/tests/mcp/test_audit_mcp.py +104 -0
  557. chipgraph-0.1.0rc1/tests/mcp/test_model_tools.py +444 -0
  558. chipgraph-0.1.0rc1/tests/mcp/test_runtime_tools.py +227 -0
  559. chipgraph-0.1.0rc1/tests/mcp/test_server.py +223 -0
  560. chipgraph-0.1.0rc1/tests/mcp/test_stdio.py +53 -0
  561. chipgraph-0.1.0rc1/tests/packs/assist/ask_helpers.py +45 -0
  562. chipgraph-0.1.0rc1/tests/packs/assist/audit_helpers.py +95 -0
  563. chipgraph-0.1.0rc1/tests/packs/assist/test_ask_answer.py +147 -0
  564. chipgraph-0.1.0rc1/tests/packs/assist/test_ask_check.py +144 -0
  565. chipgraph-0.1.0rc1/tests/packs/assist/test_ask_context.py +139 -0
  566. chipgraph-0.1.0rc1/tests/packs/assist/test_ask_fts.py +99 -0
  567. chipgraph-0.1.0rc1/tests/packs/assist/test_ask_surfaces.py +155 -0
  568. chipgraph-0.1.0rc1/tests/packs/assist/test_audit.py +219 -0
  569. chipgraph-0.1.0rc1/tests/packs/assist/test_triage_question.py +180 -0
  570. chipgraph-0.1.0rc1/tests/packs/assist/test_triage_rules.py +320 -0
  571. chipgraph-0.1.0rc1/tests/packs/assist/test_triage_run.py +359 -0
  572. chipgraph-0.1.0rc1/tests/packs/spec_core/agents_md_snapshots/full.md +140 -0
  573. chipgraph-0.1.0rc1/tests/packs/spec_core/agents_md_snapshots/qsoc.md +117 -0
  574. chipgraph-0.1.0rc1/tests/packs/spec_core/agents_md_snapshots/tinysoc.md +72 -0
  575. chipgraph-0.1.0rc1/tests/packs/spec_core/conftest.py +15 -0
  576. chipgraph-0.1.0rc1/tests/packs/spec_core/diagram_snapshots/qsoc/block_diagram.drawio +66 -0
  577. chipgraph-0.1.0rc1/tests/packs/spec_core/diagram_snapshots/qsoc/block_diagram.svg +44 -0
  578. chipgraph-0.1.0rc1/tests/packs/spec_core/diagram_snapshots/qsoc/clock_reset_tree.drawio +102 -0
  579. chipgraph-0.1.0rc1/tests/packs/spec_core/diagram_snapshots/qsoc/clock_reset_tree.svg +56 -0
  580. chipgraph-0.1.0rc1/tests/packs/spec_core/diagram_snapshots/qsoc/interrupt_map.drawio +48 -0
  581. chipgraph-0.1.0rc1/tests/packs/spec_core/diagram_snapshots/qsoc/interrupt_map.svg +32 -0
  582. chipgraph-0.1.0rc1/tests/packs/spec_core/diagram_snapshots/qsoc/memory_map.drawio +84 -0
  583. chipgraph-0.1.0rc1/tests/packs/spec_core/diagram_snapshots/qsoc/memory_map.svg +62 -0
  584. chipgraph-0.1.0rc1/tests/packs/spec_core/diagram_snapshots/tiny_chip/block_diagram.drawio +26 -0
  585. chipgraph-0.1.0rc1/tests/packs/spec_core/diagram_snapshots/tiny_chip/block_diagram.svg +16 -0
  586. chipgraph-0.1.0rc1/tests/packs/spec_core/diagram_snapshots/tiny_chip/clock_reset_tree.drawio +39 -0
  587. chipgraph-0.1.0rc1/tests/packs/spec_core/diagram_snapshots/tiny_chip/clock_reset_tree.svg +22 -0
  588. chipgraph-0.1.0rc1/tests/packs/spec_core/diagram_snapshots/tiny_chip/interrupt_map.drawio +18 -0
  589. chipgraph-0.1.0rc1/tests/packs/spec_core/diagram_snapshots/tiny_chip/interrupt_map.svg +12 -0
  590. chipgraph-0.1.0rc1/tests/packs/spec_core/diagram_snapshots/tiny_chip/memory_map.drawio +20 -0
  591. chipgraph-0.1.0rc1/tests/packs/spec_core/diagram_snapshots/tiny_chip/memory_map.svg +14 -0
  592. chipgraph-0.1.0rc1/tests/packs/spec_core/mas_fixtures/QNSC_DMA_MAS.md +407 -0
  593. chipgraph-0.1.0rc1/tests/packs/spec_core/mas_fixtures/QNSC_Interrupt_Map_MAS.md +288 -0
  594. chipgraph-0.1.0rc1/tests/packs/spec_core/mas_fixtures/QNSC_SCRC_MAS.md +591 -0
  595. chipgraph-0.1.0rc1/tests/packs/spec_core/mas_fixtures/QNSC_SYSCSR_MAS.md +314 -0
  596. chipgraph-0.1.0rc1/tests/packs/spec_core/mas_fixtures/QNSC_TIMER_MAS.md +314 -0
  597. chipgraph-0.1.0rc1/tests/packs/spec_core/mas_fixtures/QNSC_UART_MAS.md +318 -0
  598. chipgraph-0.1.0rc1/tests/packs/spec_core/test_agents_md.py +325 -0
  599. chipgraph-0.1.0rc1/tests/packs/spec_core/test_agents_md_cli.py +169 -0
  600. chipgraph-0.1.0rc1/tests/packs/spec_core/test_agents_md_markers.py +111 -0
  601. chipgraph-0.1.0rc1/tests/packs/spec_core/test_diagram.py +267 -0
  602. chipgraph-0.1.0rc1/tests/packs/spec_core/test_mas_extract.py +156 -0
  603. chipgraph-0.1.0rc1/tests/packs/spec_core/test_mas_fixtures.py +133 -0
  604. chipgraph-0.1.0rc1/tests/packs/spec_core/test_mas_modes.py +230 -0
  605. chipgraph-0.1.0rc1/tests/packs/spec_core/test_mas_shorthand.py +120 -0
  606. chipgraph-0.1.0rc1/tests/packs/spec_core/test_registration.py +25 -0
  607. chipgraph-0.1.0rc1/tests/plugin/test_guard.py +347 -0
  608. chipgraph-0.1.0rc1/tests/plugin/test_init_tool.py +205 -0
  609. chipgraph-0.1.0rc1/tests/plugin/test_plugin_acceptance_report.py +166 -0
  610. chipgraph-0.1.0rc1/tests/plugin/test_plugin_commands.py +196 -0
  611. chipgraph-0.1.0rc1/tests/test_example_profiles.py +38 -0
  612. chipgraph-0.1.0rc1/tests/test_release_metadata.py +70 -0
  613. chipgraph-0.1.0rc1/tests/test_release_workflow.py +52 -0
  614. chipgraph-0.1.0rc1/tests/test_version.py +17 -0
  615. chipgraph-0.1.0rc1/uv.lock +3171 -0
@@ -0,0 +1,15 @@
1
+ {
2
+ "name": "chipgraph",
3
+ "description": "chipgraph: an AI agent system for chip (IC) design",
4
+ "owner": {
5
+ "name": "quynhonsemiconductor",
6
+ "url": "https://github.com/quynhonsemiconductor"
7
+ },
8
+ "plugins": [
9
+ {
10
+ "name": "chipgraph",
11
+ "source": "./plugin",
12
+ "description": "chipgraph for chip (IC) design in Claude Code: /chipgraph:status, /chipgraph:trace, /chipgraph:ask, /chipgraph:triage, /chipgraph:init-chipgraph and /chipgraph:run, over the chipgraph MCP server."
13
+ }
14
+ ]
15
+ }
@@ -0,0 +1,29 @@
1
+ # Root .dockerignore — the build context is the repo root (docker/Dockerfile COPYs
2
+ # pyproject.toml, uv.lock, README.md, src/, and, for the `test` target, tests/ and
3
+ # examples/ from there), so this lives at the root rather than under docker/.
4
+
5
+ .git
6
+ .github
7
+ .venv
8
+ venv
9
+ __pycache__
10
+ *.py[cod]
11
+ *.egg-info
12
+ .eggs
13
+ .mypy_cache
14
+ .ruff_cache
15
+ .pytest_cache
16
+ .cache
17
+ dist
18
+ build
19
+ docs
20
+ doc
21
+ plugin
22
+ .claude-plugin
23
+ evals
24
+ interfaces
25
+ presets
26
+ orgs
27
+ *.md
28
+ !README.md
29
+ .DS_Store
@@ -0,0 +1,15 @@
1
+ root = true
2
+
3
+ [*]
4
+ charset = utf-8
5
+ end_of_line = lf
6
+ insert_final_newline = true
7
+ trim_trailing_whitespace = true
8
+
9
+ [*.py]
10
+ indent_style = space
11
+ indent_size = 4
12
+
13
+ [*.{yml,yaml,json,toml,md}]
14
+ indent_style = space
15
+ indent_size = 2
@@ -0,0 +1 @@
1
+ * @Nghia-VanTrong
@@ -0,0 +1,55 @@
1
+ name: CI
2
+
3
+ on:
4
+ pull_request:
5
+ push:
6
+ branches: [main]
7
+
8
+ permissions:
9
+ contents: read
10
+
11
+ concurrency:
12
+ group: ${{ github.workflow }}-${{ github.ref }}
13
+ cancel-in-progress: true
14
+
15
+ jobs:
16
+ check:
17
+ strategy:
18
+ matrix:
19
+ os: [ubuntu-latest, macos-latest]
20
+ python: ["3.13", "3.14"]
21
+ runs-on: ${{ matrix.os }}
22
+ steps:
23
+ - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
24
+ with:
25
+ persist-credentials: false
26
+
27
+ - uses: astral-sh/setup-uv@c18668ad3cf93ea998bef934396af7bb5c839dc7 # v10.2.0
28
+ with:
29
+ python-version: ${{ matrix.python }}
30
+
31
+ - run: uv sync --locked
32
+
33
+ - run: uv run ruff check .
34
+
35
+ - run: uv run ruff format --check .
36
+
37
+ - run: uv run lint-imports
38
+
39
+ - run: uv run mypy
40
+
41
+ - run: uv run pytest
42
+
43
+ - run: make schemas-check
44
+
45
+ secrets:
46
+ runs-on: ubuntu-latest
47
+ steps:
48
+ - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
49
+ with:
50
+ persist-credentials: false
51
+ fetch-depth: 0
52
+
53
+ - uses: trufflesecurity/trufflehog@4dd8831c5f12599465d4d45c3c447b4018a34c85 # v3.97.9
54
+ with:
55
+ extra_args: --only-verified
@@ -0,0 +1,132 @@
1
+ name: evals
2
+
3
+ # Real-model evals (task M1-17): `chipgraph eval` with runtime claude-code (headless
4
+ # Claude Code, haiku main session by default) on the ask, triage, triage-holdout and
5
+ # triage-holdout2 suites. Never on push or pull requests: started by hand or weekly. The
6
+ # framework itself is checked on every PR by the fake-runtime tests in the normal CI
7
+ # (tests/evals).
8
+ #
9
+ # Auth: the repository secret CHIPGRAPH_EVALS_CLAUDE_TOKEN, a Claude Code OAuth token of
10
+ # a separate account (`claude setup-token`), passed to `claude` as
11
+ # CLAUDE_CODE_OAUTH_TOKEN. Without the secret the job skips, green, with a notice.
12
+ # Cost cap: --budget-usd per suite (claude's --max-budget-usd per sample, and the suite
13
+ # stops once the summed total_cost_usd reaches it); --time-limit per suite.
14
+
15
+ on:
16
+ workflow_dispatch:
17
+ inputs:
18
+ suite:
19
+ description: Suite to run
20
+ type: choice
21
+ options: [all, ask, triage, triage-holdout, triage-holdout2]
22
+ default: all
23
+ main_model:
24
+ description: Main session model
25
+ type: string
26
+ default: haiku
27
+ budget_usd:
28
+ description: Cost cap per suite, in USD
29
+ type: string
30
+ default: "3"
31
+ schedule:
32
+ - cron: "17 3 * * 1" # Mondays 03:17 UTC
33
+
34
+ permissions:
35
+ contents: read
36
+
37
+ concurrency:
38
+ group: ${{ github.workflow }}
39
+ cancel-in-progress: false
40
+
41
+ env:
42
+ CLAUDE_CODE_VERSION: 2.1.286
43
+
44
+ jobs:
45
+ evals:
46
+ runs-on: ubuntu-latest
47
+ timeout-minutes: 240
48
+ steps:
49
+ - name: Check for the evals secret
50
+ id: auth
51
+ env:
52
+ TOKEN: ${{ secrets.CHIPGRAPH_EVALS_CLAUDE_TOKEN }}
53
+ run: |
54
+ if [ -n "$TOKEN" ]; then
55
+ echo "ok=true" >> "$GITHUB_OUTPUT"
56
+ else
57
+ echo "ok=false" >> "$GITHUB_OUTPUT"
58
+ msg="CHIPGRAPH_EVALS_CLAUDE_TOKEN is not set: real-model evals skipped (see evals/README.md)."
59
+ echo "::notice::$msg"
60
+ echo "$msg" >> "$GITHUB_STEP_SUMMARY"
61
+ fi
62
+
63
+ - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
64
+ if: steps.auth.outputs.ok == 'true'
65
+ with:
66
+ persist-credentials: false
67
+
68
+ - uses: astral-sh/setup-uv@c18668ad3cf93ea998bef934396af7bb5c839dc7 # v10.2.0
69
+ if: steps.auth.outputs.ok == 'true'
70
+ with:
71
+ python-version: "3.14"
72
+
73
+ - uses: actions/setup-node@820762786026740c76f36085b0efc47a31fe5020 # v7.0.0
74
+ if: steps.auth.outputs.ok == 'true'
75
+ with:
76
+ node-version: "24"
77
+
78
+ - name: Install Claude Code
79
+ if: steps.auth.outputs.ok == 'true'
80
+ run: |
81
+ npm install -g "@anthropic-ai/claude-code@${CLAUDE_CODE_VERSION}"
82
+ claude --version
83
+
84
+ - run: uv sync --locked
85
+ if: steps.auth.outputs.ok == 'true'
86
+
87
+ - name: Run the evals
88
+ id: run
89
+ if: steps.auth.outputs.ok == 'true'
90
+ env:
91
+ CLAUDE_CODE_OAUTH_TOKEN: ${{ secrets.CHIPGRAPH_EVALS_CLAUDE_TOKEN }}
92
+ SUITE: ${{ inputs.suite || 'all' }}
93
+ MAIN_MODEL: ${{ inputs.main_model || 'haiku' }}
94
+ BUDGET_USD: ${{ inputs.budget_usd || '3' }}
95
+ EVAL_OUT: ${{ runner.temp }}/eval-report
96
+ run: |
97
+ set -u
98
+ if [ "$SUITE" = all ]; then suites="ask triage triage-holdout triage-holdout2"; else suites="$SUITE"; fi
99
+ mkdir -p "$EVAL_OUT"
100
+ failed=""
101
+ for suite in $suites; do
102
+ echo "::group::chipgraph eval $suite"
103
+ rc=0
104
+ uv run chipgraph eval "$suite" --runtime claude-code \
105
+ --main-model "$MAIN_MODEL" --budget-usd "$BUDGET_USD" \
106
+ --out "$EVAL_OUT/$suite" || rc=$?
107
+ echo "::endgroup::"
108
+ if [ -f "$EVAL_OUT/$suite/summary.md" ]; then
109
+ cat "$EVAL_OUT/$suite/summary.md" >> "$GITHUB_STEP_SUMMARY"
110
+ else
111
+ echo "chipgraph eval $suite: no report (exit $rc)" >> "$GITHUB_STEP_SUMMARY"
112
+ fi
113
+ [ "$rc" -eq 0 ] || failed="$failed $suite"
114
+ done
115
+ echo "failed=$failed" >> "$GITHUB_OUTPUT"
116
+
117
+ - name: Upload the eval report
118
+ if: always() && steps.auth.outputs.ok == 'true'
119
+ uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
120
+ with:
121
+ name: eval-report-${{ github.run_id }}
122
+ path: ${{ runner.temp }}/eval-report
123
+ if-no-files-found: error
124
+ retention-days: 90
125
+
126
+ - name: Fail if a suite failed
127
+ if: steps.auth.outputs.ok == 'true' && steps.run.outputs.failed != ''
128
+ env:
129
+ FAILED: ${{ steps.run.outputs.failed }}
130
+ run: |
131
+ echo "::error::eval suites failed:$FAILED"
132
+ exit 1
@@ -0,0 +1,142 @@
1
+ name: image
2
+
3
+ on:
4
+ pull_request:
5
+ paths:
6
+ - docker/**
7
+ - pyproject.toml
8
+ - uv.lock
9
+ - src/**
10
+ - tests/e2e/**
11
+ - examples/**
12
+ - .github/workflows/image.yml
13
+ push:
14
+ branches: [main]
15
+ tags: ["v*"]
16
+ paths:
17
+ - docker/**
18
+ - pyproject.toml
19
+ - uv.lock
20
+ - src/**
21
+ - tests/e2e/**
22
+ - examples/**
23
+ - .github/workflows/image.yml
24
+
25
+ permissions:
26
+ contents: read
27
+
28
+ concurrency:
29
+ group: ${{ github.workflow }}-${{ github.ref }}
30
+ cancel-in-progress: true
31
+
32
+ env:
33
+ IMAGE: ghcr.io/quynhonsemiconductor/chipgraph-eda
34
+
35
+ jobs:
36
+ build-test:
37
+ name: build test image, run tinysoc e2e
38
+ runs-on: ubuntu-latest
39
+ permissions:
40
+ contents: read
41
+ steps:
42
+ - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
43
+ with:
44
+ persist-credentials: false
45
+
46
+ - uses: docker/setup-buildx-action@f87e5991a6d7451dcb8d9637bfbc97413f497069 # v4.4.1
47
+
48
+ - uses: docker/build-push-action@c3c9e263c25d99ce0380d002d59b67737d91b0dc # v7.4.0
49
+ with:
50
+ context: .
51
+ file: docker/Dockerfile
52
+ target: test
53
+ tags: chipgraph-eda:test
54
+ load: true
55
+ push: false
56
+ cache-from: type=gha
57
+ cache-to: type=gha,mode=max
58
+
59
+ - name: Run the tinysoc e2e suite inside the image
60
+ env:
61
+ REPORT_DIR: ${{ runner.temp }}/e2e-report
62
+ run: |
63
+ set -eu
64
+ mkdir -p "$REPORT_DIR"
65
+ docker run --rm \
66
+ -v "$REPORT_DIR:/tmp/report" \
67
+ chipgraph-eda:test \
68
+ sh -c 'uv run --no-sync pytest -m e2e tests/e2e -q --junitxml=/tmp/report/e2e-junit.xml'
69
+
70
+ - name: Fail if the e2e tests did not actually run
71
+ env:
72
+ REPORT_DIR: ${{ runner.temp }}/e2e-report
73
+ run: |
74
+ python3 - "$REPORT_DIR/e2e-junit.xml" <<'PY'
75
+ import sys
76
+ import xml.etree.ElementTree as ET
77
+
78
+ root = ET.parse(sys.argv[1]).getroot()
79
+ suite = root if root.tag == "testsuite" else root.find("testsuite")
80
+ if suite is None:
81
+ raise SystemExit("no <testsuite> found in the junit report")
82
+
83
+ tests = int(suite.get("tests", 0))
84
+ failures = int(suite.get("failures", 0))
85
+ errors = int(suite.get("errors", 0))
86
+ skipped = int(suite.get("skipped", 0))
87
+ passed = tests - failures - errors - skipped
88
+
89
+ print(f"tests={tests} passed={passed} failures={failures} errors={errors} skipped={skipped}")
90
+
91
+ if skipped:
92
+ raise SystemExit(
93
+ f"{skipped} e2e test(s) were skipped inside the image "
94
+ "(verilator/make missing?) — the image must run them, not skip them"
95
+ )
96
+ if failures or errors:
97
+ raise SystemExit("e2e tests failed inside the image")
98
+ if passed < 5:
99
+ raise SystemExit(f"expected at least 5 passing e2e tests, got {passed}")
100
+ PY
101
+
102
+ publish:
103
+ name: publish image to GHCR
104
+ needs: build-test
105
+ if: >-
106
+ github.event_name == 'push' &&
107
+ (github.ref == 'refs/heads/main' || startsWith(github.ref, 'refs/tags/v'))
108
+ runs-on: ubuntu-latest
109
+ permissions:
110
+ contents: read
111
+ packages: write # push chipgraph-eda to ghcr.io
112
+ steps:
113
+ - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
114
+ with:
115
+ persist-credentials: false
116
+
117
+ - uses: docker/setup-buildx-action@f87e5991a6d7451dcb8d9637bfbc97413f497069 # v4.4.1
118
+
119
+ - id: meta
120
+ uses: docker/metadata-action@dc802804100637a589fabce1cb79ff13a1411302 # v6.2.0
121
+ with:
122
+ images: ${{ env.IMAGE }}
123
+ tags: |
124
+ type=raw,value=main,enable={{is_default_branch}}
125
+ type=sha,prefix=sha-,format=short
126
+ type=semver,pattern={{version}}
127
+
128
+ - uses: docker/login-action@dbcb813823bdd20940b903addbd779551569679f # v4.6.0
129
+ with:
130
+ registry: ghcr.io
131
+ username: ${{ github.actor }}
132
+ password: ${{ secrets.GITHUB_TOKEN }}
133
+
134
+ - uses: docker/build-push-action@c3c9e263c25d99ce0380d002d59b67737d91b0dc # v7.4.0
135
+ with:
136
+ context: .
137
+ file: docker/Dockerfile
138
+ push: true
139
+ tags: ${{ steps.meta.outputs.tags }}
140
+ labels: ${{ steps.meta.outputs.labels }}
141
+ cache-from: type=gha
142
+ cache-to: type=gha,mode=max
@@ -0,0 +1,128 @@
1
+ name: Release
2
+
3
+ on:
4
+ push:
5
+ tags: ["v*"]
6
+ workflow_dispatch:
7
+ inputs:
8
+ target:
9
+ description: "Where to publish"
10
+ required: true
11
+ type: choice
12
+ options: ["testpypi", "pypi"]
13
+ default: "testpypi"
14
+
15
+ permissions:
16
+ contents: read
17
+
18
+ jobs:
19
+ build:
20
+ runs-on: ubuntu-latest
21
+ outputs:
22
+ version: ${{ steps.version.outputs.version }}
23
+ steps:
24
+ - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
25
+ with:
26
+ persist-credentials: false
27
+
28
+ - uses: astral-sh/setup-uv@c18668ad3cf93ea998bef934396af7bb5c839dc7 # v10.2.0
29
+ with:
30
+ python-version: "3.13"
31
+
32
+ - name: Check that the tag matches pyproject.toml's version
33
+ if: startsWith(github.ref, 'refs/tags/')
34
+ run: |
35
+ tag="${GITHUB_REF_NAME#v}"
36
+ version="$(uv run --no-project python -c 'import tomllib; print(tomllib.load(open("pyproject.toml", "rb"))["project"]["version"])')"
37
+ if [ "$tag" != "$version" ]; then
38
+ echo "::error::tag v$tag does not match pyproject.toml version $version"
39
+ exit 1
40
+ fi
41
+
42
+ - name: Read the version
43
+ id: version
44
+ run: |
45
+ version="$(uv run --no-project python -c 'import tomllib; print(tomllib.load(open("pyproject.toml", "rb"))["project"]["version"])')"
46
+ echo "version=$version" >> "$GITHUB_OUTPUT"
47
+
48
+ - run: uv build
49
+
50
+ - uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
51
+ with:
52
+ name: dist
53
+ path: dist/
54
+
55
+ publish-testpypi:
56
+ needs: build
57
+ if: |
58
+ (startsWith(github.ref, 'refs/tags/') && contains(github.ref_name, 'rc')) ||
59
+ (github.event_name == 'workflow_dispatch' && inputs.target == 'testpypi')
60
+ runs-on: ubuntu-latest
61
+ environment: testpypi
62
+ permissions:
63
+ id-token: write
64
+ steps:
65
+ - uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1
66
+ with:
67
+ name: dist
68
+ path: dist/
69
+
70
+ - uses: pypa/gh-action-pypi-publish@dc37677b2e1c63e2034f94d8a5b11f265b73ba33 # v1.14.2
71
+ with:
72
+ repository-url: https://test.pypi.org/legacy/
73
+
74
+ # A release candidate goes to TestPyPI first; this job installs that exact build from
75
+ # TestPyPI and runs it. Only if it works does the same build go on to PyPI, because the
76
+ # marketplace plugin runs `uvx chipgraph@<version>`, which resolves from PyPI.
77
+ smoke-testpypi:
78
+ needs: [build, publish-testpypi]
79
+ runs-on: ubuntu-latest
80
+ steps:
81
+ - uses: astral-sh/setup-uv@c18668ad3cf93ea998bef934396af7bb5c839dc7 # v10.2.0
82
+ with:
83
+ python-version: "3.13"
84
+
85
+ - name: Install the TestPyPI build with uvx and run it
86
+ env:
87
+ VERSION: ${{ needs.build.outputs.version }}
88
+ run: |
89
+ # TestPyPI can take a minute to serve a new upload: retry for up to ~5 minutes.
90
+ for attempt in 1 2 3 4 5 6 7 8 9 10; do
91
+ if out="$(uvx --no-cache --index https://test.pypi.org/simple/ \
92
+ --index-strategy unsafe-best-match "chipgraph@$VERSION" --version 2>&1)"; then
93
+ echo "$out"
94
+ case "$out" in
95
+ *"$VERSION"*) ;;
96
+ *) echo "::error::expected version $VERSION, got: $out"; exit 1 ;;
97
+ esac
98
+ uvx --no-cache --index https://test.pypi.org/simple/ \
99
+ --index-strategy unsafe-best-match "chipgraph@$VERSION" --help > /dev/null
100
+ exit 0
101
+ fi
102
+ echo "attempt $attempt: not installable yet"; sleep 30
103
+ done
104
+ echo "::error::chipgraph $VERSION could not be installed from TestPyPI"
105
+ exit 1
106
+
107
+ # A final tag goes straight to PyPI; a release-candidate tag only after the TestPyPI
108
+ # smoke test passed. Either way the `pypi` environment's reviewer must approve.
109
+ publish-pypi:
110
+ needs: [build, smoke-testpypi]
111
+ if: |
112
+ !cancelled() && needs.build.result == 'success' && (
113
+ (startsWith(github.ref, 'refs/tags/') && !contains(github.ref_name, 'rc')) ||
114
+ (startsWith(github.ref, 'refs/tags/') && contains(github.ref_name, 'rc') &&
115
+ needs.smoke-testpypi.result == 'success') ||
116
+ (github.event_name == 'workflow_dispatch' && inputs.target == 'pypi')
117
+ )
118
+ runs-on: ubuntu-latest
119
+ environment: pypi
120
+ permissions:
121
+ id-token: write
122
+ steps:
123
+ - uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1
124
+ with:
125
+ name: dist
126
+ path: dist/
127
+
128
+ - uses: pypa/gh-action-pypi-publish@dc37677b2e1c63e2034f94d8a5b11f265b73ba33 # v1.14.2
@@ -0,0 +1,24 @@
1
+ # Python
2
+ __pycache__/
3
+ *.py[cod]
4
+ *$py.class
5
+ *.egg-info/
6
+ .eggs/
7
+ build/
8
+ dist/
9
+
10
+ # uv / venv
11
+ .venv/
12
+ venv/
13
+
14
+ # Caches
15
+ .mypy_cache/
16
+ .ruff_cache/
17
+ .pytest_cache/
18
+ .cache/
19
+
20
+ # chipgraph runtime state
21
+ .chipgraph/state/
22
+
23
+ # OS
24
+ .DS_Store
@@ -0,0 +1,7 @@
1
+ repos:
2
+ - repo: https://github.com/astral-sh/ruff-pre-commit
3
+ rev: v0.16.9
4
+ hooks:
5
+ - id: ruff-check
6
+ args: [--fix]
7
+ - id: ruff-format
@@ -0,0 +1 @@
1
+ 3.14
@@ -0,0 +1,68 @@
1
+ # AGENTS.md — working on the chipgraph repository
2
+
3
+ `chipgraph` is an AI agent system for chip (IC) design. It treats a chip project as a
4
+ **build graph**: specs, RTL, tests and reports are artifacts; rules produce them (code,
5
+ AI agents or humans); deterministic EDA checks verify every step; humans approve at gates.
6
+ All of this runs over a typed **Design Model** of the chip.
7
+
8
+ This file tells coding agents (and humans) how to work on this repository.
9
+
10
+ ## Read first, in this order
11
+
12
+ 1. [`docs/IMPLEMENTATION_PLAN.md`](docs/IMPLEMENTATION_PLAN.md): find your task ID, its `depends`, `writes` and `accept`.
13
+ 2. [`DESIGN.md`](DESIGN.md): the section your task refers to. It is written in Vietnamese; identifiers are English.
14
+ 3. [`docs/DECISIONS.md`](docs/DECISIONS.md): the reasons behind the design. Do not re-litigate a decision in code; propose an ADR instead.
15
+
16
+ ## Hard rules
17
+
18
+ 1. **One task, one PR.** Branch `feat/<task-id>-<slug>`, for example `feat/m0-06-graph`. Take a task only when every `depends` is merged.
19
+ 2. **Stay inside `writes`.** If you need to change another file, open an issue and stop.
20
+ 3. **Contracts are frozen.** Do not change `src/chipgraph/core/contracts/` or `src/chipgraph/core/plugin_api/` unless your task says so. Other agents build against them.
21
+ 4. **Core knows nothing about chips or tools.** `chipgraph.core` must not import `chipgraph.adapters` or any pack, and must not contain project, bus, PDK or tool names (QSoC, APB, GF180, Verilator). `import-linter` enforces the import rule in CI.
22
+ 5. **Tests for every `accept` criterion.** CI never calls a real model: use `adapters/llm/fake.py`. Real-model evals run only in the nightly `evals` job.
23
+ 6. **Public repository.** Never commit secrets, API keys, internal or NDA data, or files from private projects. Examples and fixtures use open-source IP and PDKs only (`examples/tinysoc`, GF180, Sky130).
24
+ 7. **Nothing from the teacher's flow.** Do not copy files, prompts or code from `VLSIT_RTL_Generator_AI_Model`. chipgraph is independent.
25
+ 8. **Commits and PRs** use Conventional Commits (`feat:`, `fix:`, `docs:`, `test:`, `chore:`). Do not add AI attribution lines ("Co-Authored-By", "Generated with …") to commits or PR descriptions.
26
+
27
+ ## Commands
28
+
29
+ ```bash
30
+ uv sync # install (Python 3.14; 3.13 supported)
31
+ uv run chipgraph --help # CLI
32
+ uv run pytest # all tests
33
+ uv run pytest tests/e2e # end-to-end on examples/tinysoc (needs the EDA tools or the chipgraph-eda image)
34
+ uv run ruff check . && uv run ruff format --check .
35
+ uv run mypy src/chipgraph/core
36
+ uv run lint-imports # dependency rules
37
+ make schemas # regenerate schemas/ from the pydantic contracts
38
+ ```
39
+
40
+ ## Layout
41
+
42
+ ```
43
+ src/chipgraph/core/ contracts, engine, model, runtime, state, config, plugin_api
44
+ src/chipgraph/adapters/ tool, parser, format, llm, runtime, runner, vcs, review
45
+ src/chipgraph/checks/ built-in checks
46
+ src/chipgraph/cli/ mcp/ user surfaces
47
+ src/chipgraph/packs/ built-in packs: pack.yml + code, one snake_case dir each (D36)
48
+ src/chipgraph/orgs/ presets/ interfaces/ built-in data, not code
49
+ plugin/ Claude Code plugin
50
+ examples/tinysoc/ open-source sample project for end-to-end tests
51
+ evals/ Inspect AI evals
52
+ docs/ plan, decisions, research, spikes, pilots
53
+ ```
54
+
55
+ ## Code style
56
+
57
+ - Modern typing (PEP 604 unions, PEP 695 generics). `mypy --strict` for `core/`.
58
+ - Data models are pydantic v2 with a `schema_version` field. Data files (rules, packs, profiles) have a JSON Schema in `schemas/`.
59
+ - Async I/O with `asyncio`. Subprocesses go through a `Runner`, never direct `subprocess` calls in core.
60
+ - Every adapter returns the shared result schema (`CheckResult`, `AgentResult` …), never raw logs.
61
+ - Names: packs, rules, checks, roles and skills are `lower_snake_case` with a namespace, `<pack>/<name>`.
62
+ - Code, comments and docstrings in English.
63
+
64
+ ## Definition of done
65
+
66
+ See `docs/IMPLEMENTATION_PLAN.md`, section 10. In short: only `writes` touched, tests for
67
+ every `accept`, CI green, docs updated, no secrets, and a PR description with the task ID,
68
+ what changed, how it was verified and remaining risks.
@@ -0,0 +1 @@
1
+ @AGENTS.md
@@ -0,0 +1,17 @@
1
+ # Contributing
2
+
3
+ Work is organized as tasks in [`docs/IMPLEMENTATION_PLAN.md`](docs/IMPLEMENTATION_PLAN.md),
4
+ each with an ID, `depends`, `writes` and `accept` criteria. The working rules are in
5
+ [`AGENTS.md`](AGENTS.md) — read it before opening a PR.
6
+
7
+ In short:
8
+
9
+ - Pick a task whose `depends` are already merged. Only touch files in its `writes`.
10
+ - One task, one PR. Branch name: `feat/<task-id>-<slug>` (e.g. `feat/m0-06-graph`).
11
+ - Commit messages follow [Conventional Commits](https://www.conventionalcommits.org/)
12
+ (`feat:`, `fix:`, `docs:`, `test:`, `chore:`).
13
+ - Run `make check` (lint, type, test) before pushing.
14
+ - Do not add AI attribution lines ("Co-Authored-By", "Generated with …") to commits or
15
+ PR descriptions.
16
+ - A PR description names the task ID, what changed, how it was verified, and remaining
17
+ risks.