From 2e69925329f048b3428c862870530d2bba114d88 Mon Sep 17 00:00:00 2001 From: Ali Bahaloo Date: Mon, 27 Jul 2026 12:59:54 -0700 Subject: [PATCH] =?UTF-8?q?docs:=20add=20Principle=20VI=20=E2=80=94=20Head?= =?UTF-8?q?less=20Shared=20Surface=20(constitution=203.1.0)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Product 4.1.0 extracted the assessment into `caia/assessment.py` and made four modules — `assessment`, `matching`, `psirt`, `inventory` — callable without a terminal. That boundary protects the safety property in Principle IV: it is implemented in this code exactly once, and a second consumer that reimplements it produces a second, divergent answer about the same firewall. Until now the boundary lived in a module docstring and one test. Nothing stopped a later change from adding a print, a prompt, or a `sys.exit` back into the surface and quietly making it terminal-only again — at which point the only way to consume the logic is to reimplement it, which is the outcome the split exists to prevent. Principle VI states the boundary: which modules are in the surface, what they must not do, where terminal behaviour belongs, that the public contract is versioned, and that a failure to *reach* Cisco must surface as an error rather than as undecided verdicts. Its rationale records why that last rule exists — an empty catalogue turns every device into an unmapped model, so a caller handed verdicts instead of an error would publish a report reading as a customer data-quality problem when the cause was a rejected credential. Also: a Consumers bullet in Technology & Data Constraints naming the surface as a released interface (and granting freedom to reorganise everything outside it), and three gates extended — Tests for the headless property, Review for changes inside the surface, Documentation for the README table, Versioning for the public contract. MINOR: a principle added and guidance expanded, nothing removed or redefined. No product behaviour changes; the product version is unaffected. Adds `test_the_process_is_never_exited`, since the new Tests gate names four properties and "does not exit the process" was only implicitly covered — a gate its own code does not satisfy is not a gate. Co-Authored-By: Claude Opus 5 --- .specify/memory/constitution.md | 142 +++++++++++++++++++++----------- tests/test_assessment.py | 25 ++++++ 2 files changed, 118 insertions(+), 49 deletions(-) diff --git a/.specify/memory/constitution.md b/.specify/memory/constitution.md index 8b89c22..bef4782 100644 --- a/.specify/memory/constitution.md +++ b/.specify/memory/constitution.md @@ -1,58 +1,60 @@