trueline 0.1.0.dev0__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 (212) hide show
  1. trueline-0.1.0.dev0/.gitignore +15 -0
  2. trueline-0.1.0.dev0/.gitlab-ci.yml +38 -0
  3. trueline-0.1.0.dev0/.python-version +1 -0
  4. trueline-0.1.0.dev0/CLAUDE.md +220 -0
  5. trueline-0.1.0.dev0/LICENSE +21 -0
  6. trueline-0.1.0.dev0/PKG-INFO +57 -0
  7. trueline-0.1.0.dev0/README.md +33 -0
  8. trueline-0.1.0.dev0/THIRD-PARTY-NOTICES.md +38 -0
  9. trueline-0.1.0.dev0/docs/ASSETS-REVIEW.md +276 -0
  10. trueline-0.1.0.dev0/docs/DESIGN.md +455 -0
  11. trueline-0.1.0.dev0/docs/M1-E2E-PLAN.md +389 -0
  12. trueline-0.1.0.dev0/docs/M1-HANDOFF.md +75 -0
  13. trueline-0.1.0.dev0/docs/M1-SPEC.md +641 -0
  14. trueline-0.1.0.dev0/docs/M2-ASSETS.md +1206 -0
  15. trueline-0.1.0.dev0/docs/M2-E2E-PLAN.md +398 -0
  16. trueline-0.1.0.dev0/docs/M2-HANDOFF.md +612 -0
  17. trueline-0.1.0.dev0/docs/M2-IMPL-PLAN.md +904 -0
  18. trueline-0.1.0.dev0/docs/M2-SPEC.md +653 -0
  19. trueline-0.1.0.dev0/docs/M3-E2E-PLAN.md +761 -0
  20. trueline-0.1.0.dev0/docs/M3-FOLLOWUP-HANDOFF.md +163 -0
  21. trueline-0.1.0.dev0/docs/M3-HANDOFF.md +126 -0
  22. trueline-0.1.0.dev0/docs/M3-IMPL-PLAN.md +717 -0
  23. trueline-0.1.0.dev0/docs/M3-SPEC.md +745 -0
  24. trueline-0.1.0.dev0/docs/M4-ASSETS.md +1320 -0
  25. trueline-0.1.0.dev0/docs/M4-E2E-PLAN.md +1244 -0
  26. trueline-0.1.0.dev0/docs/M4-HANDOFF.md +325 -0
  27. trueline-0.1.0.dev0/docs/M4-IMPL-PLAN.md +1292 -0
  28. trueline-0.1.0.dev0/docs/M4-SPEC.md +1594 -0
  29. trueline-0.1.0.dev0/docs/POST-M4-DESIGN.md +449 -0
  30. trueline-0.1.0.dev0/docs/PROJECT-REVIEW.md +330 -0
  31. trueline-0.1.0.dev0/docs/PROMPT-NEXT-SESSION.md +42 -0
  32. trueline-0.1.0.dev0/docs/PUBLICATION-HANDOFF.md +157 -0
  33. trueline-0.1.0.dev0/docs/STATE.md +140 -0
  34. trueline-0.1.0.dev0/pyproject.toml +73 -0
  35. trueline-0.1.0.dev0/scripts/publish.sh +20 -0
  36. trueline-0.1.0.dev0/src/trueline/__init__.py +1 -0
  37. trueline-0.1.0.dev0/src/trueline/__main__.py +9 -0
  38. trueline-0.1.0.dev0/src/trueline/adoption/__init__.py +72 -0
  39. trueline-0.1.0.dev0/src/trueline/adoption/assemble.py +270 -0
  40. trueline-0.1.0.dev0/src/trueline/adoption/derive.py +143 -0
  41. trueline-0.1.0.dev0/src/trueline/adoption/facts.py +211 -0
  42. trueline-0.1.0.dev0/src/trueline/adoption/fingerprint.py +36 -0
  43. trueline-0.1.0.dev0/src/trueline/adoption/parse.py +188 -0
  44. trueline-0.1.0.dev0/src/trueline/adoption/records.py +184 -0
  45. trueline-0.1.0.dev0/src/trueline/adoption/scan.py +103 -0
  46. trueline-0.1.0.dev0/src/trueline/adoption/universe.py +54 -0
  47. trueline-0.1.0.dev0/src/trueline/adr/__init__.py +24 -0
  48. trueline-0.1.0.dev0/src/trueline/adr/parse.py +48 -0
  49. trueline-0.1.0.dev0/src/trueline/adr/project.py +64 -0
  50. trueline-0.1.0.dev0/src/trueline/adr/validate.py +211 -0
  51. trueline-0.1.0.dev0/src/trueline/amendments.py +47 -0
  52. trueline-0.1.0.dev0/src/trueline/assets/ci/trueline-validate.yml +22 -0
  53. trueline-0.1.0.dev0/src/trueline/assets/hooks/post-merge +4 -0
  54. trueline-0.1.0.dev0/src/trueline/assets/hooks/pre-push +6 -0
  55. trueline-0.1.0.dev0/src/trueline/assets/instructions/adr-deriver.md +54 -0
  56. trueline-0.1.0.dev0/src/trueline/assets/instructions/architecture-review.md +48 -0
  57. trueline-0.1.0.dev0/src/trueline/assets/instructions/architecture-synthesis.md +34 -0
  58. trueline-0.1.0.dev0/src/trueline/assets/instructions/assembler.md +52 -0
  59. trueline-0.1.0.dev0/src/trueline/assets/instructions/capability-planner.md +44 -0
  60. trueline-0.1.0.dev0/src/trueline/assets/instructions/charter-review.md +26 -0
  61. trueline-0.1.0.dev0/src/trueline/assets/instructions/ci-semantic.md +28 -0
  62. trueline-0.1.0.dev0/src/trueline/assets/instructions/clarify.md +43 -0
  63. trueline-0.1.0.dev0/src/trueline/assets/instructions/constitution-check.md +52 -0
  64. trueline-0.1.0.dev0/src/trueline/assets/instructions/decompose-judge.md +54 -0
  65. trueline-0.1.0.dev0/src/trueline/assets/instructions/describer.md +83 -0
  66. trueline-0.1.0.dev0/src/trueline/assets/instructions/judge.md +39 -0
  67. trueline-0.1.0.dev0/src/trueline/assets/instructions/recon.md +60 -0
  68. trueline-0.1.0.dev0/src/trueline/assets/instructions/scanner.md +31 -0
  69. trueline-0.1.0.dev0/src/trueline/assets/instructions/skeptic.md +45 -0
  70. trueline-0.1.0.dev0/src/trueline/assets/instructions/synthesizer.md +27 -0
  71. trueline-0.1.0.dev0/src/trueline/assets/instructions/validator.md +67 -0
  72. trueline-0.1.0.dev0/src/trueline/assets/taxonomy.md +31 -0
  73. trueline-0.1.0.dev0/src/trueline/assets/templates/architecture-setup.md +50 -0
  74. trueline-0.1.0.dev0/src/trueline/assets/templates/build.md +33 -0
  75. trueline-0.1.0.dev0/src/trueline/assets/templates/charter.md +32 -0
  76. trueline-0.1.0.dev0/src/trueline/assets/templates/constitution.md +45 -0
  77. trueline-0.1.0.dev0/src/trueline/assets/templates/decompose.md +51 -0
  78. trueline-0.1.0.dev0/src/trueline/assets/templates/implementation-report.md +14 -0
  79. trueline-0.1.0.dev0/src/trueline/assets/templates/plan.md +83 -0
  80. trueline-0.1.0.dev0/src/trueline/assets/templates/propose.md +64 -0
  81. trueline-0.1.0.dev0/src/trueline/checks/__init__.py +19 -0
  82. trueline-0.1.0.dev0/src/trueline/checks/battery.py +1316 -0
  83. trueline-0.1.0.dev0/src/trueline/checks/context.py +40 -0
  84. trueline-0.1.0.dev0/src/trueline/clarifications.py +56 -0
  85. trueline-0.1.0.dev0/src/trueline/cli/__init__.py +93 -0
  86. trueline-0.1.0.dev0/src/trueline/cli/adopt_cmds.py +846 -0
  87. trueline-0.1.0.dev0/src/trueline/cli/adopt_gate.py +678 -0
  88. trueline-0.1.0.dev0/src/trueline/cli/adopt_run.py +143 -0
  89. trueline-0.1.0.dev0/src/trueline/cli/adr_cmd.py +55 -0
  90. trueline-0.1.0.dev0/src/trueline/cli/assets_util.py +8 -0
  91. trueline-0.1.0.dev0/src/trueline/cli/clarify_cmd.py +175 -0
  92. trueline-0.1.0.dev0/src/trueline/cli/conversation.py +65 -0
  93. trueline-0.1.0.dev0/src/trueline/cli/finalize_cmds.py +275 -0
  94. trueline-0.1.0.dev0/src/trueline/cli/governance_cmds.py +389 -0
  95. trueline-0.1.0.dev0/src/trueline/cli/init_cmd.py +607 -0
  96. trueline-0.1.0.dev0/src/trueline/cli/output.py +39 -0
  97. trueline-0.1.0.dev0/src/trueline/cli/phase_cmds.py +603 -0
  98. trueline-0.1.0.dev0/src/trueline/cli/project.py +104 -0
  99. trueline-0.1.0.dev0/src/trueline/cli/roles.py +513 -0
  100. trueline-0.1.0.dev0/src/trueline/cli/runtime_opts.py +32 -0
  101. trueline-0.1.0.dev0/src/trueline/cli/status_cmd.py +60 -0
  102. trueline-0.1.0.dev0/src/trueline/cli/template_cmd.py +29 -0
  103. trueline-0.1.0.dev0/src/trueline/cli/validate_cmd.py +209 -0
  104. trueline-0.1.0.dev0/src/trueline/conformance.py +111 -0
  105. trueline-0.1.0.dev0/src/trueline/fold/__init__.py +35 -0
  106. trueline-0.1.0.dev0/src/trueline/fold/apply.py +117 -0
  107. trueline-0.1.0.dev0/src/trueline/fold/parser.py +316 -0
  108. trueline-0.1.0.dev0/src/trueline/fold/validate.py +256 -0
  109. trueline-0.1.0.dev0/src/trueline/gates/__init__.py +26 -0
  110. trueline-0.1.0.dev0/src/trueline/gates/executor.py +40 -0
  111. trueline-0.1.0.dev0/src/trueline/gates/facts.py +151 -0
  112. trueline-0.1.0.dev0/src/trueline/gates/table.py +83 -0
  113. trueline-0.1.0.dev0/src/trueline/gitio.py +239 -0
  114. trueline-0.1.0.dev0/src/trueline/governance.py +196 -0
  115. trueline-0.1.0.dev0/src/trueline/invoke/__init__.py +56 -0
  116. trueline-0.1.0.dev0/src/trueline/invoke/drivers.py +212 -0
  117. trueline-0.1.0.dev0/src/trueline/invoke/interactive.py +333 -0
  118. trueline-0.1.0.dev0/src/trueline/invoke/policy.py +115 -0
  119. trueline-0.1.0.dev0/src/trueline/invoke/request.py +159 -0
  120. trueline-0.1.0.dev0/src/trueline/judge/__init__.py +52 -0
  121. trueline-0.1.0.dev0/src/trueline/judge/errors.py +13 -0
  122. trueline-0.1.0.dev0/src/trueline/judge/loop.py +201 -0
  123. trueline-0.1.0.dev0/src/trueline/judge/precondition.py +99 -0
  124. trueline-0.1.0.dev0/src/trueline/judge/workspace.py +143 -0
  125. trueline-0.1.0.dev0/src/trueline/judge/write.py +135 -0
  126. trueline-0.1.0.dev0/src/trueline/py.typed +0 -0
  127. trueline-0.1.0.dev0/src/trueline/schemas/__init__.py +62 -0
  128. trueline-0.1.0.dev0/src/trueline/schemas/adoption.py +289 -0
  129. trueline-0.1.0.dev0/src/trueline/schemas/adr.py +37 -0
  130. trueline-0.1.0.dev0/src/trueline/schemas/base.py +43 -0
  131. trueline-0.1.0.dev0/src/trueline/schemas/change.py +34 -0
  132. trueline-0.1.0.dev0/src/trueline/schemas/clarify.py +17 -0
  133. trueline-0.1.0.dev0/src/trueline/schemas/config.py +138 -0
  134. trueline-0.1.0.dev0/src/trueline/schemas/control.py +100 -0
  135. trueline-0.1.0.dev0/src/trueline/schemas/finding.py +10 -0
  136. trueline-0.1.0.dev0/src/trueline/state/__init__.py +63 -0
  137. trueline-0.1.0.dev0/src/trueline/state/derive.py +98 -0
  138. trueline-0.1.0.dev0/src/trueline/state/init_state.py +86 -0
  139. trueline-0.1.0.dev0/src/trueline/state/inventory.py +244 -0
  140. trueline-0.1.0.dev0/stderr.txt +1 -0
  141. trueline-0.1.0.dev0/tests/__init__.py +0 -0
  142. trueline-0.1.0.dev0/tests/adoption/__init__.py +0 -0
  143. trueline-0.1.0.dev0/tests/adoption/test_assemble.py +208 -0
  144. trueline-0.1.0.dev0/tests/adoption/test_derive.py +85 -0
  145. trueline-0.1.0.dev0/tests/adoption/test_fingerprint.py +99 -0
  146. trueline-0.1.0.dev0/tests/adoption/test_parse.py +138 -0
  147. trueline-0.1.0.dev0/tests/adoption/test_scan.py +96 -0
  148. trueline-0.1.0.dev0/tests/adr/__init__.py +0 -0
  149. trueline-0.1.0.dev0/tests/adr/test_parse.py +78 -0
  150. trueline-0.1.0.dev0/tests/adr/test_project.py +105 -0
  151. trueline-0.1.0.dev0/tests/adr/test_validate.py +295 -0
  152. trueline-0.1.0.dev0/tests/checks/__init__.py +0 -0
  153. trueline-0.1.0.dev0/tests/checks/test_adoption_battery.py +388 -0
  154. trueline-0.1.0.dev0/tests/checks/test_battery.py +965 -0
  155. trueline-0.1.0.dev0/tests/cli/__init__.py +0 -0
  156. trueline-0.1.0.dev0/tests/cli/test_adopt_assemble.py +239 -0
  157. trueline-0.1.0.dev0/tests/cli/test_adopt_gate.py +668 -0
  158. trueline-0.1.0.dev0/tests/cli/test_adopt_run.py +223 -0
  159. trueline-0.1.0.dev0/tests/cli/test_adopt_scan_describe.py +405 -0
  160. trueline-0.1.0.dev0/tests/cli/test_adopt_validate_reopen.py +276 -0
  161. trueline-0.1.0.dev0/tests/cli/test_asset_calibrations.py +120 -0
  162. trueline-0.1.0.dev0/tests/cli/test_clarify_commands.py +358 -0
  163. trueline-0.1.0.dev0/tests/cli/test_conversation.py +55 -0
  164. trueline-0.1.0.dev0/tests/cli/test_core_commands.py +600 -0
  165. trueline-0.1.0.dev0/tests/cli/test_entrypoint.py +51 -0
  166. trueline-0.1.0.dev0/tests/cli/test_finalize_commands.py +405 -0
  167. trueline-0.1.0.dev0/tests/cli/test_governance_commands.py +431 -0
  168. trueline-0.1.0.dev0/tests/cli/test_governance_edge_commit.py +162 -0
  169. trueline-0.1.0.dev0/tests/cli/test_init_assisted.py +599 -0
  170. trueline-0.1.0.dev0/tests/cli/test_init_brownfield.py +191 -0
  171. trueline-0.1.0.dev0/tests/cli/test_phase_commands.py +1056 -0
  172. trueline-0.1.0.dev0/tests/cli/test_roles.py +36 -0
  173. trueline-0.1.0.dev0/tests/cli/test_template_cmd.py +45 -0
  174. trueline-0.1.0.dev0/tests/factories.py +139 -0
  175. trueline-0.1.0.dev0/tests/fold/__init__.py +0 -0
  176. trueline-0.1.0.dev0/tests/fold/parity/fixtures.json +108 -0
  177. trueline-0.1.0.dev0/tests/fold/parity/generate_fixtures.mts +399 -0
  178. trueline-0.1.0.dev0/tests/fold/test_apply.py +183 -0
  179. trueline-0.1.0.dev0/tests/fold/test_apply_parity.py +41 -0
  180. trueline-0.1.0.dev0/tests/fold/test_parser.py +155 -0
  181. trueline-0.1.0.dev0/tests/fold/test_validate.py +196 -0
  182. trueline-0.1.0.dev0/tests/gates/__init__.py +0 -0
  183. trueline-0.1.0.dev0/tests/gates/test_executor.py +134 -0
  184. trueline-0.1.0.dev0/tests/gates/test_facts.py +164 -0
  185. trueline-0.1.0.dev0/tests/invoke/__init__.py +0 -0
  186. trueline-0.1.0.dev0/tests/invoke/test_drivers.py +303 -0
  187. trueline-0.1.0.dev0/tests/invoke/test_interactive.py +455 -0
  188. trueline-0.1.0.dev0/tests/invoke/test_policy.py +68 -0
  189. trueline-0.1.0.dev0/tests/invoke/test_request.py +121 -0
  190. trueline-0.1.0.dev0/tests/judge/__init__.py +0 -0
  191. trueline-0.1.0.dev0/tests/judge/test_loop.py +352 -0
  192. trueline-0.1.0.dev0/tests/judge/test_precondition.py +109 -0
  193. trueline-0.1.0.dev0/tests/judge/test_workspace.py +148 -0
  194. trueline-0.1.0.dev0/tests/judge/test_write.py +205 -0
  195. trueline-0.1.0.dev0/tests/schemas/__init__.py +0 -0
  196. trueline-0.1.0.dev0/tests/schemas/test_adoption.py +280 -0
  197. trueline-0.1.0.dev0/tests/schemas/test_adr.py +103 -0
  198. trueline-0.1.0.dev0/tests/schemas/test_base.py +63 -0
  199. trueline-0.1.0.dev0/tests/schemas/test_change.py +82 -0
  200. trueline-0.1.0.dev0/tests/schemas/test_config.py +249 -0
  201. trueline-0.1.0.dev0/tests/schemas/test_control.py +230 -0
  202. trueline-0.1.0.dev0/tests/state/__init__.py +0 -0
  203. trueline-0.1.0.dev0/tests/state/test_derive.py +197 -0
  204. trueline-0.1.0.dev0/tests/state/test_init_state.py +65 -0
  205. trueline-0.1.0.dev0/tests/state/test_inventory.py +267 -0
  206. trueline-0.1.0.dev0/tests/test_amendments.py +47 -0
  207. trueline-0.1.0.dev0/tests/test_clarifications.py +55 -0
  208. trueline-0.1.0.dev0/tests/test_conformance.py +105 -0
  209. trueline-0.1.0.dev0/tests/test_gitio.py +254 -0
  210. trueline-0.1.0.dev0/tests/test_governance.py +248 -0
  211. trueline-0.1.0.dev0/tests/test_smoke.py +33 -0
  212. trueline-0.1.0.dev0/uv.lock +914 -0
@@ -0,0 +1,15 @@
1
+ # Python
2
+ __pycache__/
3
+ *.py[cod]
4
+ *.egg-info/
5
+
6
+ # Ambientes e builds
7
+ .venv/
8
+ dist/
9
+ build/
10
+
11
+ # Caches de ferramentas
12
+ .pytest_cache/
13
+ .ruff_cache/
14
+ .coverage
15
+ htmlcov/
@@ -0,0 +1,38 @@
1
+ # You can override the included template(s) by including variable overrides
2
+ # SAST customization: https://docs.gitlab.com/user/application_security/sast/#available-cicd-variables
3
+ # Secret Detection customization: https://docs.gitlab.com/user/application_security/secret_detection/pipeline/configure/
4
+ # Dependency Scanning customization: https://docs.gitlab.com/user/application_security/dependency_scanning/dependency_scanning_sbom/#customizing-analyzer-behavior
5
+ # Container Scanning customization: https://docs.gitlab.com/user/application_security/container_scanning/#customizing-analyzer-behavior
6
+ # Note that environment variables can be set in several places
7
+ # See https://docs.gitlab.com/ci/variables/#cicd-variable-precedence
8
+ stages:
9
+ - test
10
+ - secret-detection
11
+ sast:
12
+ stage: test
13
+ include:
14
+ - template: Security/SAST.gitlab-ci.yml
15
+ - template: Security/Secret-Detection.gitlab-ci.yml
16
+ variables:
17
+ SECRET_DETECTION_ENABLED: 'true'
18
+ secret_detection:
19
+ stage: secret-detection
20
+ lint-test:
21
+ stage: test
22
+ image: ghcr.io/astral-sh/uv:python3.12-bookworm-slim
23
+ variables:
24
+ UV_CACHE_DIR: .uv-cache
25
+ cache:
26
+ key:
27
+ files: [uv.lock]
28
+ paths: [.uv-cache]
29
+ before_script:
30
+ # The slim uv image ships neither git (the test suite spawns real `git`
31
+ # subprocesses) nor libatomic.so.1 (pyright-python's bundled Node needs it).
32
+ - apt-get update && apt-get install -y --no-install-recommends git libatomic1
33
+ script:
34
+ - uv sync --locked
35
+ - uv run ruff check .
36
+ - uv run ruff format --check .
37
+ - uv run pyright
38
+ - uv run pytest
@@ -0,0 +1 @@
1
+ 3.12
@@ -0,0 +1,220 @@
1
+ # CLAUDE.md
2
+
3
+ This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.
4
+
5
+ ## What this is
6
+
7
+ `trueline` is a **Spec-Driven Development (SDD) framework for Claude Code users**: specs and
8
+ architecture are living documents and the source of truth; code is regenerable output. It is a Python
9
+ CLI (`trueline`) over a **headless core** (files + derived state + a deterministic CLI) that an
10
+ **external orchestrator** drives phase-by-phase, invoking the project's own Claude Code headless.
11
+
12
+ This is its **own independent git repo** (no remote yet — work on `main`). It lives inside the
13
+ `dsb-ai-flow` VS Code workspace alongside four sibling SDD projects — `../OpenSpec/`, `../spec-kit/`,
14
+ `../agentspec/`, `../everything-claude-code/` — which are **used as reference** (trueline steals the
15
+ spec fold from OpenSpec, the constitution/clarify/templates from spec-kit, the PRP/build-loop/drift
16
+ validators from ECC). When grounding a design decision, read the relevant sibling's real code.
17
+
18
+ ## `docs/` is the source of truth — read it first
19
+
20
+ The methodology and the entire multi-milestone plan live in `docs/`, in a strict authority order:
21
+
22
+ - **`STATE.md`** — the **consolidated project-state snapshot** (what/where/how/what-remains). Start
23
+ here for quick orientation; the docs below remain the source of truth for details.
24
+ - **`DESIGN.md`** — the conceptual design (v5), the **top authority**. On any conflict, the design wins.
25
+ - **`M1-SPEC.md`, `M2-SPEC.md`, `M3-SPEC.md`, `M4-SPEC.md`** — the technical *what*, decided
26
+ section-by-section. The source of truth for the implementation. Errata are recorded in the doc
27
+ headers, never by a general re-review. (`M4-SPEC.md` is COMPLETE + **FINAL (r7)** — seven
28
+ adversarial review rounds, stamps in its header.)
29
+ - **`M4-HANDOFF.md`** — the **single current handoff** (start here): M4 is **IMPLEMENTED** and
30
+ green, and **`M4-E2E-PLAN.md` is authored + APPROVED (2026-07-10, pre-execution)**; the next
31
+ sessions **execute the M4 E2E, one phase per session** (session 1 = guinea-pig selection
32
+ against the plan's §1 profile + preflight + Phase A), each session closing by updating the
33
+ plan's §8 record, the handoff and the kickoff. Supersedes `M3-FOLLOWUP-HANDOFF.md` +
34
+ `M3-HANDOFF.md` (both historical). The M3 calibration/errata/governance outcomes live in
35
+ `M3-E2E-PLAN.md` §8.
36
+ - **`M2-IMPL-PLAN.md` / `M2-ASSETS.md` / `*-E2E-PLAN.md`** — the *how* (per-step mini-designs), the
37
+ drafted assets, and the end-to-end validation records. `PROMPT-NEXT-SESSION.md` is the kickoff prompt.
38
+
39
+ **Current state:** M1 (skeleton), M2 (governance), M3 (the full loop) and **M4 (Brownfield) are
40
+ implemented AND E2E-validated.** M1/M2/M3 were E2E-validated with a real model and calibrated (the
41
+ M3 multi-stack E2E: 9/9 criteria; record in `M3-E2E-PLAN.md` §8). **M4 is now E2E-validated too
42
+ (2026-07-11): the four-session brownfield E2E closed with all eleven §6 criteria met — B2/B3 earn
43
+ promotion to HIGH; the "Is not" mechanical escalation is NOT ratified** (record + verdict in
44
+ `M4-E2E-PLAN.md` §8). **Publication (remote/CI/PyPI) is now UN-DEFERRED** (the M1/M2/M3 gate is
45
+ satisfied). The impl-plan's four steps all landed on `main` (steps 1 → 2 → 3 → 4a…4e, 19
46
+ commits `8952fab → 235282e`), the tree is clean, and CI is green — **875 tests** (872 through the
47
+ three reviews; **+3 with the M4-E2E Phase-B pre-run fix `e2edb24`** — the missing
48
+ `src/trueline/__main__.py`), ruff clean, ruff-format clean, **pyright strict 0 errors** (the M1–M3
49
+ baseline was 561; 790 at the end of implementation, 804 after the M4-only review, 831 after the
50
+ second review). A **post-implementation review** (2026-07-09,
51
+ `4d714e0 → e2e06e4`) audited the whole milestone (8 parallel auditors, each finding verified
52
+ against the code): completeness came back with **zero gaps**, and 6 real findings + a robustness
53
+ follow-up batch were fixed, each with tests. It ratified **three pointed errata — E1/E2/E3** — in
54
+ the `M4-SPEC.md`/`M4-IMPL-PLAN.md` headers (§2.5 assemble rebuild trigger; §4 item-7 dead-round
55
+ suite; §5 flip ordering); **no decision reversed**. A **second, whole-project review** (2026-07-09,
56
+ `d8e4d20 → 2a3a6b9`) then audited M1→M4 (12 parallel readers, each finding re-verified against the
57
+ code; two proposed schema-hardening items rejected for contradicting the layer design): **4 HIGH +
58
+ a batch of MEDIUM/LOW** fixed, each with a test — ratifying **`M4-SPEC.md` E4** (plan.md ADR
59
+ `scope:`) + the **E2 completion** (the dead-round-suite walk) and **`M3-SPEC.md` M3-a/M3-b**
60
+ (qualified `FULFILLS`; the single-per-line `MIRROR` example). A **third, fresh-eyes review**
61
+ (2026-07-09→10, `fce58e7 → 10fd659`, 11 readers told NOT to trust the prior fixes) then caught
62
+ real defects the two prior passes missed — chiefly a **systemic exit-code-contract hole**
63
+ (framework errors escaping to exit 1) — and, on fresh scrutiny, **fixed two items the second
64
+ review had accepted** (the heading-slug collision; config-encoding/resume): **8 clear bugs + 3
65
+ judgment calls + a 6-item LOW tail**, each with a test, ratifying a **`M4-SPEC.md §4` clarifying
66
+ errata** (validate runs the completion battery report-only) + the **E4 extension**
67
+ (`architecture-setup.md` scope gap). The full ledger + the accepted non-issues + the one deferred
68
+ follow-up (GOV-3: an atomic/resumable `init`) are in **`docs/PROJECT-REVIEW.md`**. The three M4 authoring docs are converged and closed:
69
+ **`M4-SPEC.md` FINAL (r7)** (12 sections, seven adversarial review rounds), **`M4-IMPL-PLAN.md`
70
+ COMPLETE, review CLOSED** (three rounds, ten passes), **`M4-ASSETS.md` COMPLETE (15/15), review
71
+ CLOSED and converged** (two rounds, eight passes) — never re-review them as a sweep; a real
72
+ defect becomes a pointed ratified erratum in the doc header. The M4 code lives across
73
+ `src/trueline/adoption/`, `src/trueline/gitio.py`, `src/trueline/cli/adopt_*.py`, and the new
74
+ checks/roles/assets. **`M4-E2E-PLAN.md` is authored and APPROVED (2026-07-10,
75
+ pre-execution)** — brainstormed decision by decision on the `M3-E2E-PLAN.md` mold: the
76
+ guinea-pig **selection profile** (§1 — a real, pre-existing multi-stack repo; no repo selected
77
+ yet), the harness split (FIFO+pump for `init`; a **real terminal** for `approve`'s TTY-checked
78
+ walk), Phases A–D + staged episodes + 10 extras, eleven success criteria and the two gated
79
+ decisions (B2/B3 promotion; the "Is not" escalation). The run executes **one phase per
80
+ session** (a user decision): each session closes by updating the plan's §8 record,
81
+ `M4-HANDOFF.md` and `PROMPT-NEXT-SESSION.md`. **Sessions 1 & 2 are DONE (2026-07-10):** per the §1
82
+ amendment the guinea pig is **purpose-built in-workspace** — `cobaia-brownfield/` ("linkstash":
83
+ FastAPI+SQLite `api` w/ a green pytest suite + TS/Node `cli` w/ no unit tests, over an HTTP `/api`
84
+ seam). Session 1: preflight + Phase A (brownfield `init` + two locals + three A-era extras;
85
+ charter 3 "Is not" bullets, #1 contradictable; global constitution's cross-part "Contract-only
86
+ seam" MUST). **Session 2: Phase B — the RE fan-out ran green** (scan → describe/validate with the
87
+ `cli` `did-not-run` demotion → capability-plan pause → assemble: 7 clean specs + 9 scoped ADRs +
88
+ B1 green → hotfix-sync staleness biting only app-core → §2.5 plan reconcile → E1 selective
89
+ re-assemble → 5 B-era extras). **One pre-run code fix (`e2edb24`, user-approved):** a missing
90
+ `src/trueline/__main__.py` blocked `adopt run`'s subprocess spawn (CI missed it — `_spawn` is
91
+ monkeypatched); **CI now 875 tests**, recorded in `PROJECT-REVIEW.md` (fifth finding). **Session 3:
92
+ Phase C — the completion gate ran green end-to-end (2026-07-10→11):** the dead round (excluded-file
93
+ commit → the api suite round dies, no module stale) → `status` pre-gate → the non-TTY `approve`
94
+ refusal (exit 2) → **`approve` #1** over a **pexpect pty** (the walk + the deliberate
95
+ decline→exit 2→resume-without-re-ask + a 5-finding skeptic → approval #1) → **the reopen cycle**
96
+ (3 constraint kinds on api/app-core + the E1 re-partition rider → **selective re-assemble: 3 rebuilt
97
+ / 4 byte-identical**; the corpus-wide guard fired on a real code bug — `evidence_file` doesn't
98
+ recognize a line-RANGE EVIDENCE anchor — re-steered to single-line citation) → **`approve` #2**
99
+ (only the 5 changed identities re-asked; the three kinds resolving by their three paths; skeptic
100
+ re-sampled, 7 findings → approval #2) → **`flip`** (record-first → `governed`) → the **`--no-ff`
101
+ cutover** into `main` (`trueline validate` exit 0, both suites green, `status` sane). Every step
102
+ exit 0, all sonnet. **Session 4: Phase D — the post-flip measurement protocol ran green end-to-end
103
+ (2026-07-11):** D-1 arch-review (advisory, exit 0, 2 SUGGESTIONs) → **D-2** the clean seam-crossing
104
+ change `add-link-note` (FULL cycle to merge `ec6c3f6`: multi-layer conformance silent, **B2/B3
105
+ silent-on-clean**, seam extract consumed, qualified FULFILLS, **multi-file finalize candidate**
106
+ judged, **traceability index frozen**, both suites green) → **D-3 B2 fired + silent-after-correction**
107
+ → **D-4 B3 fired + silent-after-correction + the decompose-judge weak-package healing loop** → **D-5
108
+ "Is not"** (`charter-is-not` HIGH, full per-bullet verbatim enumeration, operator refuse → **exit 2**)
109
+ → the two post-flip extras (impossible-state CRITICAL exit 1; post-flip refusal exit 1). **VERDICT:
110
+ M4 brownfield path VALIDATED — all eleven §6 criteria met; B2/B3 earn HIGH; the "Is not" escalation
111
+ NOT ratified; GOV-3 did not bite** (`M4-E2E-PLAN.md` §8). **The post-verdict follow-up session
112
+ (2026-07-13, commits `8cb5e1c → bbc0d17`) cleared the four concrete items on `main` — CI green,
113
+ now 879 tests, pyright strict 0:** the ratified `evidence_file` line-range fix (+ regression tests),
114
+ the B2/B3 WARNING→HIGH promotion (+ the §7.2 injection-test fixes), the real-I/O-boundary test guards
115
+ (the `python -m trueline` subprocess + the anchor grammar), and the §8 calibrations
116
+ (`describer`/`adr-deriver`/`constitution` assets + the conformance-criterion stdout + the `validate`
117
+ demoted-echo). **The four designed technical follow-ups then landed on `main` (2026-07-13, in order
118
+ 1 → 4 → 2 → 3, each green): item 1 `c962a31` (conformance `is_not_walk` — the auditable "Is not"
119
+ walk), item 4 `757527a` (configurable `runtime.model`/`runtime.effort` + per-command
120
+ `--model`/`--effort`), item 2 `e418ce8` (in-walk bulk dispositions in `adopt approve`), item 3
121
+ `257b75d` (resumable/derived `init` — GOV-3); designs + implementation-time deviations in
122
+ `docs/POST-M4-DESIGN.md`. CI now 928 tests, pyright strict 0, ruff/format clean.** **Remaining:**
123
+ only **publication (remote/CI/PyPI), un-deferred and the operator's call** (`docs/M4-HANDOFF.md` §2;
124
+ `docs/PROJECT-REVIEW.md`) — the `is_not_checked` nicety / item-5 pendency-walk / item-6 GOV-3 are
125
+ now CLOSED (they were the designed items 1/2/3).
126
+
127
+ ## Commands
128
+
129
+ The toolchain is **`uv`** (see `.python-version`, `uv.lock`). CI (`.github/workflows/ci.yml`) runs
130
+ exactly these four, in order — run them before considering work done:
131
+
132
+ ```bash
133
+ uv sync --locked # install (dev group included)
134
+ uv run ruff check . # lint
135
+ uv run ruff format --check . # format check (use `uv run ruff format .` to fix)
136
+ uv run pyright # STRICT type check — zero errors is the standing bar
137
+ uv run pytest # full suite (testpaths=tests, -q --strict-markers)
138
+
139
+ uv run pytest tests/fold/test_apply.py # a single file
140
+ uv run pytest tests/fold/test_apply.py -k <name> # a single test
141
+ uv run trueline --help # the CLI surface
142
+ uv build # wheel/sdist (assets in src/trueline/assets/ ship automatically)
143
+ ```
144
+
145
+ `pyright` is configured **strict** and points at the local `.venv` — private cross-module use (a
146
+ leading `_`) is rejected, which is why some helpers are deliberately de-underscored.
147
+
148
+ ## Architecture (the big picture)
149
+
150
+ The seven phases — `propose → clarify → plan → decompose → build → validate → finalize` (+ the
151
+ `approve`/`reject` human gate, plus `init`/`status`/`adr`) — are wired in `cli/__init__.py`. Each phase
152
+ maps to a package under `src/trueline/`:
153
+
154
+ | Package | Role |
155
+ |---|---|
156
+ | `schemas/` | Strict pydantic models for every artifact (config, change, ADR, findings, verdicts) + the normative `heading_slug`. |
157
+ | `fold/` | Spec-delta parser/validator/applier — a **faithful port of OpenSpec's deterministic fold** (parity-tested). This is the *only* mechanical fold; architecture never folds. |
158
+ | `adr/` | ADR parse + **projected state** (`project`) + log invariants + cross-refs. **ADR identity = slug** (merge-safe, no sequential number). |
159
+ | `state/` | **Derived state machine**: `inventory` reads the filesystem, `derive` projects it into a phase. State is *never stored* — it comes from which artifacts exist. |
160
+ | `checks/` + `gates/` | A **single check registry** (`checks/battery.py`) consumed by gates, `validate`, and `status`; a **cumulative gate table** (`gates/table.py`) — the gate of phase N re-runs all prior phases' checks (this is what makes drift-detection "pull"). |
161
+ | `judge/` | The **judge-until-convergence loop** (≤5 rounds) for finalization: monotonic candidate generation, atomic write, escalation. |
162
+ | `invoke/` | Headless invocation — `sdk`/`cli` drivers, per-role tool `policy`, one-shot + multi-turn `interactive`. |
163
+ | `cli/` | Typer commands + the **real** synthesizer/judge/scanner adapters (`cli/roles.py`). |
164
+ | `assets/` | Templates, instructions, hooks, CI, taxonomy — the **phase intelligence**, embedded in the package. |
165
+
166
+ ### Cross-cutting patterns (know these before touching anything)
167
+
168
+ - **Pure core, shell with I/O.** Checks and derivation operate over **preloaded facts**
169
+ (`CheckContext`, `ChangeInventory`) and are pure; only the executor/CLI reads disk. The paired
170
+ functions signal it: `derive_state(inventory)` (pure) vs `derive_state_at(path)` (I/O shell).
171
+ Add logic in the pure layer, wire I/O at the edge.
172
+
173
+ - **State is derived, not stored.** `state/derive.py` infers the phase from artifacts on disk;
174
+ finalization's sub-state (`loop-in-progress`, `awaiting-approval`, `escalated`, `ready-to-write`,
175
+ `returned-from-rejection`) is materialized as files under `evidence/finalize/` so it survives a
176
+ crash. `change.yaml` deliberately does **not** store phase state.
177
+
178
+ - **Two layers, fail-closed vs advisory.** Every check is **layer A** (mechanical, fail-closed) or
179
+ **layer B** (semantic, advisory + human gate). `gates.blocking_severity` governs only layer A;
180
+ layer B is always advisory regardless of severity.
181
+
182
+ - **Roles are injected interfaces.** The judge loop (`judge/loop.py`) takes `Synthesizer`/`Judge`
183
+ Protocols — **test doubles in tests, real adapters in `cli/roles.py`**. Context between roles passes
184
+ through **workspace files, never conversation history** (design principle P6: don't overload context).
185
+ A judge verdict must echo the candidate's `generation`/`round` to be accepted.
186
+
187
+ - **Exit codes are a contract** (`cli/output.py`): `0` ok · `1` blocked by layer A · `2` human
188
+ declined at layer B · `3` framework error. Most commands support `--json`.
189
+
190
+ - **Two living baselines evolve differently.** Spec = discrete requirements → mechanical fold.
191
+ Architecture = a graph of ADRs → **semantic re-synthesis** via the judge loop, never a fold.
192
+
193
+ ## Working style (the user has strong, documented preferences — see M2-HANDOFF §9)
194
+
195
+ - **Design/spec phases are Socratic brainstorm:** one decision at a time — lay out options with
196
+ trade-offs, **recommend one, confirm before writing** it into the doc. Keep a running "decided so
197
+ far". The user refines recommendations often (expected). Communicate in **clear, didactic
198
+ Portuguese**; explain each point self-sufficiently (don't reference decisions by code/number).
199
+ - **Ground in real code before recommending** — read the M1/M2 implementation and how the siblings
200
+ solve the same phase; launch exploration subagents in parallel; verify factual premises.
201
+ - **Simplicity bias (P6):** before proposing new machinery, ask *"does a mechanism we already have
202
+ solve this?"* — phase intelligence arrives as better templates and new checks on the **same
203
+ skeleton**, not new machinery.
204
+ - **Implementation phases invert this:** follow the closed docs, consult only on a genuine gap. Keep
205
+ `pyright` strict + `ruff` clean from the first commit; write tests alongside each step; small commits
206
+ (English, on `main`), and report results faithfully (failed = show the output).
207
+
208
+ ## Do not
209
+
210
+ - **Don't re-review the converged docs** (`DESIGN`/`M1-SPEC`/`M2-SPEC`/…). A real defect becomes a
211
+ pointed, ratified erratum in the doc header — never a general audit sweep.
212
+ - **Don't hand-edit** `tests/fold/parity/fixtures.json` (regenerate via `tests/fold/parity/generate_fixtures.mts`
213
+ against a real OpenSpec checkout) or anything under `evidence/finalize/` (use the operations in
214
+ `judge/workspace.py`).
215
+ - **Don't edit `plugin/`-style generated output**: the assets that ship in the wheel are the sources
216
+ under `src/trueline/assets/` (they ship via hatchling's default inclusion — `force-include` breaks
217
+ the build because the assets live inside the package).
218
+ - **Publishing (GitHub remote, CI secrets, PyPI) is UN-DEFERRED** as of the M4 Phase-D verdict
219
+ (2026-07-11 — M4 = implementation + E2E validated). It's no longer off-limits to propose; the
220
+ operator decides whether/when (don't push it unasked).
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Luis Muller
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -0,0 +1,57 @@
1
+ Metadata-Version: 2.4
2
+ Name: trueline
3
+ Version: 0.1.0.dev0
4
+ Summary: Spec-Driven Development (SDD) framework for Claude Code users.
5
+ Project-URL: Homepage, https://gitlab.com/simple-tools1/trueline
6
+ Project-URL: Repository, https://gitlab.com/simple-tools1/trueline
7
+ Author: Luis Muller
8
+ License-Expression: MIT
9
+ License-File: LICENSE
10
+ License-File: THIRD-PARTY-NOTICES.md
11
+ Classifier: Development Status :: 4 - Beta
12
+ Classifier: Environment :: Console
13
+ Classifier: Intended Audience :: Developers
14
+ Classifier: Programming Language :: Python :: 3
15
+ Classifier: Programming Language :: Python :: 3.12
16
+ Classifier: Topic :: Software Development :: Code Generators
17
+ Requires-Python: >=3.12
18
+ Requires-Dist: claude-agent-sdk>=0.2.98
19
+ Requires-Dist: pydantic>=2.7
20
+ Requires-Dist: pyyaml>=6.0
21
+ Requires-Dist: rich>=13
22
+ Requires-Dist: typer>=0.24
23
+ Description-Content-Type: text/markdown
24
+
25
+ # trueline
26
+
27
+ **Spec-Driven Development (SDD) framework for Claude Code users**:
28
+ specs and architecture as living documents and source of truth, evolution via
29
+ spec deltas and ADRs, finalization with a judge-until-convergence loop and a
30
+ human gate — all driven by an external orchestrator over a headless core.
31
+
32
+ **Status:** Milestone 1 (skeleton) implemented — strict schemas, fold-engine
33
+ with byte-for-byte parity with OpenSpec, ADR log with projected state,
34
+ derived state machine, cumulative gates, judge-until-convergence loop,
35
+ headless invocation (SDK/CLI) and the full CLI surface.
36
+
37
+ ```
38
+ trueline init # .trueline/ skeleton + config.yaml
39
+ trueline propose <id> # phases: propose → plan → decompose → build
40
+ trueline validate [<id>|--ci] # battery of checks (drift) / post-merge net
41
+ trueline finalize <id> # refactor short-circuit or judge loop
42
+ trueline approve|reject <id> # human gate of finalization
43
+ trueline status [<id>] # derived state + next step
44
+ trueline adr list # decision log with display numbering
45
+ ```
46
+
47
+ ## Documents
48
+
49
+ - [docs/DESIGN.md](docs/DESIGN.md) — conceptual design (v5). In conflict with the spec, the design wins.
50
+ - [docs/M1-SPEC.md](docs/M1-SPEC.md) — technical specification of Milestone 1 (r4, FINAL): the source of truth of the implementation.
51
+ - [docs/M1-HANDOFF.md](docs/M1-HANDOFF.md) — implementation state, agenda and working style.
52
+
53
+ ## License
54
+
55
+ MIT — see [LICENSE](LICENSE). The fold-engine parity suite is translated
56
+ from the OpenSpec test suite (MIT) — see
57
+ [THIRD-PARTY-NOTICES.md](THIRD-PARTY-NOTICES.md).
@@ -0,0 +1,33 @@
1
+ # trueline
2
+
3
+ **Spec-Driven Development (SDD) framework for Claude Code users**:
4
+ specs and architecture as living documents and source of truth, evolution via
5
+ spec deltas and ADRs, finalization with a judge-until-convergence loop and a
6
+ human gate — all driven by an external orchestrator over a headless core.
7
+
8
+ **Status:** Milestone 1 (skeleton) implemented — strict schemas, fold-engine
9
+ with byte-for-byte parity with OpenSpec, ADR log with projected state,
10
+ derived state machine, cumulative gates, judge-until-convergence loop,
11
+ headless invocation (SDK/CLI) and the full CLI surface.
12
+
13
+ ```
14
+ trueline init # .trueline/ skeleton + config.yaml
15
+ trueline propose <id> # phases: propose → plan → decompose → build
16
+ trueline validate [<id>|--ci] # battery of checks (drift) / post-merge net
17
+ trueline finalize <id> # refactor short-circuit or judge loop
18
+ trueline approve|reject <id> # human gate of finalization
19
+ trueline status [<id>] # derived state + next step
20
+ trueline adr list # decision log with display numbering
21
+ ```
22
+
23
+ ## Documents
24
+
25
+ - [docs/DESIGN.md](docs/DESIGN.md) — conceptual design (v5). In conflict with the spec, the design wins.
26
+ - [docs/M1-SPEC.md](docs/M1-SPEC.md) — technical specification of Milestone 1 (r4, FINAL): the source of truth of the implementation.
27
+ - [docs/M1-HANDOFF.md](docs/M1-HANDOFF.md) — implementation state, agenda and working style.
28
+
29
+ ## License
30
+
31
+ MIT — see [LICENSE](LICENSE). The fold-engine parity suite is translated
32
+ from the OpenSpec test suite (MIT) — see
33
+ [THIRD-PARTY-NOTICES.md](THIRD-PARTY-NOTICES.md).
@@ -0,0 +1,38 @@
1
+ # Avisos de terceiros
2
+
3
+ ## OpenSpec (MIT)
4
+
5
+ A suíte de testes de paridade do fold-engine deste repositório (em `tests/`,
6
+ identificada nos cabeçalhos dos próprios arquivos) é uma **tradução para
7
+ Python/pytest da suíte de testes do projeto OpenSpec**
8
+ (<https://github.com/Fission-AI/OpenSpec>), usada aqui como especificação
9
+ executável da gramática de deltas de spec e do algoritmo de merge. O código de
10
+ referência original é `src/core/parsers/requirement-blocks.ts` e
11
+ `src/core/specs-apply.ts` daquele projeto.
12
+
13
+ Conforme exigido pela licença MIT do OpenSpec, o aviso de copyright e a
14
+ permissão originais são reproduzidos integralmente abaixo:
15
+
16
+ ```
17
+ MIT License
18
+
19
+ Copyright (c) 2024 OpenSpec Contributors
20
+
21
+ Permission is hereby granted, free of charge, to any person obtaining a copy
22
+ of this software and associated documentation files (the "Software"), to deal
23
+ in the Software without restriction, including without limitation the rights
24
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
25
+ copies of the Software, and to permit persons to whom the Software is
26
+ furnished to do so, subject to the following conditions:
27
+
28
+ The above copyright notice and this permission notice shall be included in all
29
+ copies or substantial portions of the Software.
30
+
31
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
32
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
33
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
34
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
35
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
36
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
37
+ SOFTWARE.
38
+ ```