Version: 1.2 (launch release baseline, draft for human review)
Status: Constitutional target with a verified current-state register
Verified baseline: RI-SE/curbpack@99870c57fde2d3d4eb2b5a6e60455eafb39a2007
Verification date: 2026-09-04
Later status: 2026-09-05 launch audit records subsequent repairs and remaining gates. The measurements and open-path table below remain the pinned historical baseline.
Implementation: Go 1.23; no go.mod require block
Canonical repository: RI-SE/curbpack
Curbpack prepares structural evidence for human review. It is not a conformity assessment, certification, CE-marking decision, notified-body opinion, or legal conclusion under Regulation (EU) 2024/2847.
This document supersedes SDD v1.0 and the proposed v1.1 text. It preserves their load-bearing decisions, records superseded decisions explicitly, and separates shipped behavior from target architecture. It is a release baseline, not a claim that the design will never change.
Four statement classes appear here.
| Marker | Meaning | Required evidence |
|---|---|---|
| MUST / MUST NOT | Constitutional behavior | A mapped evaluation or named human governance control |
| Decided | Architecture selected for the next implementation slice | An ADR or SDD revision to change it |
| Current | Verified behavior at the pinned baseline | Command output, code, test, manifest, or repository history |
| Target | Approved direction not yet shipped | An implementation work package and acceptance evaluation |
Rules for this document:
- A MUST without a mapped invariant or governance control is an SDD defect.
- A test describing intended behavior is not proof that runtime behavior holds.
- A control called enforced must be technically enforced. Otherwise it is policy.
- Current and Target must not be combined into one architecture diagram or status.
- Green automation is evidence for human review, never authorization to merge, release, attest, approve, bypass, or claim compliance.
Original-source policy:
- Product behavior links to implementation, tests, help, or manifests.
- Legal claims link to official legislation.
- Format claims link to the standards owner or canonical schema.
- External-tool claims link to the tool owner's documentation.
- Business hypotheses and target-customer material do not belong in this SDD.
- Search-result links and unattributed summaries are not sources.
Curbpack evaluates a source repository against versioned local rule packs and produces portable evidence that another person can inspect offline.
| Actor | Job |
|---|---|
| Publisher | Express requirements as a versioned pack and distribute it |
| Producer | Evaluate a repository locally and return evidence |
| Reviewer | Triage the received evidence without trusting the producer's claims |
| Agent | Operate declared commands and propose changes; never decide or authorize |
The exchange model is deliberately file-based:
publisher supplies pack and independent trust policy
-> producer evaluates a repository locally
-> producer returns evaluation, receipt, and evidence
-> reviewer independently checks integrity, authenticity, and content
- MUST-01 — Curbpack MUST NOT state or imply conformity, certification, CE marking, notified-body approval, legal market access, or product safety.
- MUST-02 — Buyer-facing and reviewer-facing artifacts MUST carry the
statement
Prepares evidence for human review — not a conformity assessment. - MUST-03 — A reference reported as found means only that a typed string resolved to the stated local target. It does not establish claim truth.
- MUST-04 — A score, count, signature, or status MUST retain its scope and MUST NOT be promoted into a broader product or regulatory verdict.
Decided. Restraint is a product requirement. A reviewer must be able to see what was evaluated, what was not evaluated, and which conclusions remain human.
- MUST-10 — A verifier MUST recompute the value it checks.
- MUST-11 — A trust anchor MUST be supplied independently from the artifact. An embedded key or signer entry proves self-consistency only.
- MUST-12 — Digest comparison MUST use the full digest or a fixed, versioned truncation length. The claimed value cannot choose comparison length.
- MUST-13 — A signed value MUST be re-derived from the fields it claims to bind before signature success is reported.
- MUST-14 — Integrity, signer authenticity, policy applicability, freshness, evaluation outcome, and human disposition MUST remain separate dimensions.
- MUST-20 — A run that writes files MUST NOT report a better result than a read-only evaluation over the resulting unchanged tree.
- MUST-21 — A rule that examined zero required targets MUST NOT pass.
- MUST-22 — Failed reads, writes, parses, subprocesses, or incomplete walks MUST NOT be omitted or reported as success.
- MUST-23 — A skipped rule MUST appear in every output channel and MUST make
the aggregate outcome
incomplete. - MUST-24 — A required artifact that is present but unreadable MUST be a contradiction or operational error, never a confirmation.
- MUST-25 — External evidence and source metadata MUST NOT change a gate result.
- MUST-30 — Identical explicit evaluation inputs MUST produce byte-identical canonical evaluation bytes and identical digests.
- MUST-31 — The evaluation input includes repository snapshot, pack bytes,
trust policy, evaluator version, and explicit
as_of; it excludes implicit wall clock, user, home directory, hostname, locale, and filesystem order. - MUST-32 — Ordering that feeds a digest MUST be total over every covered field.
- MUST-33 — Digest encodings MUST be injective through length-prefixing or an equivalent versioned canonical encoding.
- MUST-34 — Caches are derived and non-authoritative. Exports MUST consume the
exact evaluation they identify, not an unverified
latestfile. - MUST-35 — Cache and artifact writes MUST be atomic and safe under concurrent processes. Interrupted writes cannot replace the last complete record.
- MUST-40 — Repositories, review packs, configuration, remediation caches, imported packs, source registers, and external evidence are untrusted input.
- MUST-41 — Untrusted content MUST NOT become a subprocess option or command.
- MUST-42 — Reads and writes MUST remain under their declared root after resolving the complete path, including intermediate symlinks.
- MUST-43 — Untrusted strings MUST be normalized, length-bounded, and escaped once at ingest; downstream renderers receive typed safe values.
- MUST-44 — Per-file bytes, total bytes, file count, subprocess time, and captured output MUST have explicit limits before allocation or execution.
- MUST-45 — Repository-local Git configuration that can execute commands MUST be neutralized for evaluator subprocesses.
- MUST-46 — Cancellation MUST terminate subprocesses and remove incomplete temporary output without deleting the previous complete artifact.
- MUST-47 — Default records MUST NOT disclose absolute home paths, usernames, environment secrets, credentials, or repository content not required by schema.
- MUST-48 — Network capability is declared per command. Evaluation and review MUST NOT perform network access.
- MUST-50 — Human caveats, warnings, skips, and qualifications MUST appear in machine output for the same evaluation.
- MUST-51 — Terminal, JSON, cache, export, and exit status MUST derive from one canonical evaluation.
- MUST-52 — Machine outcome is one of
pass,findings,incomplete, orerror; a consumer MUST NOT infer it from prose or a score. - MUST-53 — Existing process exit compatibility remains
0pass,1findings or operational failure, and2usage or environment. Machine output distinguishes categories until a major version may separate exit codes.
- MUST-60 — Every command printed in an agent-facing or operator-facing file MUST execute as printed.
- MUST-61 — Every command has a declared effect class, audience, machine-output support, and deprecation state in one registry.
- MUST-62 — Breaking schema or CLI changes require a major version, golden migration fixtures, and a CHANGELOG entry.
- MUST-63 — Unknown additive fields are ignored safely and preserved by any component that round-trips their containing document.
- MUST-70 —
--i-am-humanandCURBPACK_ALLOW_CONFIRM=1are policy acknowledgements, not technical proof of humanity. - MUST-71 — Agents MUST NOT merge, release, attest, approve, enable auto-merge, use an administrator bypass, or treat green output as authorization.
- MUST-72 — Human-authority acts are
trust-import,review-sign,Last tabletop:,confirm-*,attest, andpin-bump. - MUST-73 — Genuine authority rests on a credential or repository decision the agent does not control, not on a command-line flag.
- MUST-74 —
/rollbackand rollback guidance are instructional. An agent does not mutate, revert, or deploy automatically from that instruction alone.
- MUST-80 — The evaluator uses the Go standard library and has no third-party Go runtime dependency. Optional OpenSSH operations are a separately reported adapter.
- MUST-81 —
scan,check, evidence production, andreviewwork without a server, database, account, or network. - MUST-82 — Every format crossing a repository or organization boundary has a versioned schema and at least one golden example.
- MUST-83 — Release binaries have reproducible build inputs, checksums, least- privilege workflows, and immutable release references.
- MUST-84 — A platform is called supported only when its release artifact and representative workflow are exercised. Windows remains supporting until promoted.
- MUST-90 — The canonical public repository and history are not replaced or rewritten to improve presentation.
- MUST-91 — Current official releases remain under their published Apache-2.0 license. Future licensing commitments require documented RI-SE authority and legal review.
- MUST-92 — Local evaluation and offline review MUST NOT depend on payment, account status, entitlement, or hosted-service availability.
- MUST-93 — Optional commercial services MUST NOT change findings, evidence semantics, verification, or access to previously exported artifacts.
- MUST-94 — Earlier public strategy documents remain in history and are identified as experiments when consolidated, not silently recast as commitments.
- MUST-95 — Public vulnerability status is honest. Exploitable detail may use coordinated disclosure under SECURITY.md until remediation.
- MUST-96 — Pricing, target accounts, conversion assumptions, payment-provider choice, and private adoption metrics remain outside the product SDD.
At the verified baseline, pack composition and evaluation produce
ir.GateFailurePayload; terminal, cache, Action, exports, release artifacts,
and review use related but separate structures. The current implementation is
documented by internal/validate,
internal/ir, internal/exportx,
internal/release, and internal/review.
Current limitations:
- The payload mixes deterministic findings with wall-clock and agent metadata;
--diffskips now setoutcome=incompleteandskipped_rulesin the same IR (FG-05). - Cache writes use direct
os.WriteFilecalls andlatest_*names. - Findings and trust states are re-declared across components.
- Digest comparison uses a fixed 12-hex prefix floor (MUST-12 / FG-04 closed); shorter claimed values cannot confirm.
review --verify-chainrecomputes parent and childrecord_digestvalues and requireschild.parent_record_digestto equal the recomputed parent digest (FG-07 closed).- Attestation can fall back to keys from the current SSH agent.
- The OpenSSH verifier invocation omits the required signer identity and is covered by a fake binary rather than a real-signature integration test.
- No crossing format has a schema under a canonical
schema/directory.
explicit inputs
repository snapshot + pack bytes + trust policy + evaluator version + as_of
|
v
deterministic evaluation
|
+------------+-------------+
| |
canonical evaluation operational run receipt
findings/skips/outcome duration/platform/tool
| |
+------------+-------------+
v
terminal / JSON / SARIF / HTML
Five concerns remain separate:
- Evaluation is deterministic and side-effect free except for returning data.
- Run receipt records operational metadata and hashes the evaluation it observed.
- Rendering consumes the canonical evaluation; it does not re-decide outcomes.
- Workspace effects declare and contain cache, scaffold, export, and external effects.
- Trust assessment reports integrity, authenticity, applicability, freshness, evaluation outcome, and human disposition independently.
The target verifier is a pure function over independently supplied values:
artifact bytes + claimed contract + trusted policy -> typed trust assessment
It does not write, call Git, read environment variables, fetch a URL, or discover its trust anchor inside the artifact being checked. A self-contained bundle can prove internal consistency; it cannot prove that its embedded signer is trusted.
Each canonical evaluation is stored by its full digest. A latest pointer may
exist for operator convenience, but it is written atomically and is never an
evidence source. Exports name and verify the evaluation digest they consume.
The existing pack model remains: identity, name, version, composition,
jurisdiction, validity, citations, provenance, and rules. A rule carries stable
identity, severity, check kind, description, remediation, expected state,
citations, and check-specific fields. Current definitions live in
internal/packs/packs.go.
Pack-authored assurance_class is legacy input, not proof. Target artifacts
report typed coverage and unevaluated scope. A scalar score cannot substitute
for findings, skips, or coverage.
Validity is evaluated against explicit as_of, never implicit wall clock in a
canonical evaluation. Source retrieval time belongs to source metadata or a run
receipt and is supplied as data.
| Contract | Purpose | Deterministic |
|---|---|---|
curbpack-evaluation:1 |
Subject, pack coordinates, outcome, findings, skips, caveats, digest | Yes |
curbpack-run-receipt:1 |
Evaluation digest, duration, platform, tool version, artifact hashes, as_of |
No; hashes deterministic evaluation |
curbpack-source-register:1 |
Generic original-source provenance | Yes for supplied entries |
curbpack-external-evidence:1 |
Arbitrary external artifact metadata without importing its verdict | Yes for supplied entries |
Outcome is pass | findings | incomplete | error.
EffectClass is read_only | cache_write | workspace_write | external_effect | human_authority.
TrustAssessment contains separate integrity, authenticity, freshness,
applicability, evaluation, and disposition values.
The generic source entry contains id, class, title, publisher, locator,
version, digest, and scope. Source classes are generic. The core schema has
no customer, payment, target-industry, or vendor-specific field.
External evidence enters through files. Safe initial interchange candidates are SARIF 2.1.0, SPDX, CycloneDX, and ReqIF. Scanner output and QMS exports remain outside the evaluator unless a versioned adapter is justified by a named consumer and fixture. Imported tool verdicts remain attributed external claims; Curbpack does not promote them into its own outcome.
CTAM and any future consumer use the same public files. Curbpack does not import their libraries, require their credentials, or depend on their availability.
Current. Eight kinds are registered in
internal/validate/checks.go:
annex_file, file_present, anti_placeholder, npm_dep_ban,
manifest_dep_ban, text_forbid, fresh, and owned.
Decided. import_reach was removed because it ignored its declared target,
passed missing or unparsable input, and had no embedded-pack consumer. The
eight kinds form the closed evaluator algebra. references belongs
to offline review; human-approved trace edges belong to an external crossing
format. Neither becomes a tenth evaluator kind without an ADR proving that
composition and external evidence are insufficient.
Every check descriptor will own validation, evaluation, scaffolding, diff behavior, form hints, effect information, and documentation. Generated tests keep the registry and documentation aligned.
Current. The command registry contains 20 top-level commands in
internal/cli/registry.go.
Target primary workflow: scan, init, check, fix, share, review.
Specialist commands remain available under advanced help until evidence supports
consolidation. The registry becomes the source for effect class, audience,
machine-output support, aliases, and deprecation metadata.
check --heal compatibility:
- v0.6 keeps it as a deprecated path implemented as explicit stub remediation followed by a fresh full check.
- New documentation uses
fix --stubs --preview, human confirmation, thencheck. - v0.7 removes
--healonly after Action, hook, Cursor, Codex, and Claude migration evaluations pass. - The implementation is shared; compatibility does not create a second healing path.
OpenSSH signatures remain an optional adapter around the standard-library
evaluator. Current code is in internal/attest.
The target contract is stricter than current behavior:
- The verifier receives
allowed_signersindependently from the artifact. - It does not fall back to arbitrary keys in the reviewer's SSH agent.
- Missing OpenSSH yields
authenticity: not_checked, never verified. - Invalid, unknown-signer, expired, and policy-inapplicable remain distinct.
- An expired signature may support a separate continuity disposition but cannot become verified through an override.
- Source, derivation, review, and release use distinct namespaces.
- The signed evaluation digest is re-derived before signature verification.
DSSE or Sigstore requires a later ADR with a relying-party requirement, offline-operability evaluation, dependency analysis, and migration fixture. It is not a v0.x prerequisite.
| Level | Question |
|---|---|
| Unit | Does one function satisfy its contract? |
| Functional | Does one command produce the required observable behavior? |
| Integration | Does the behavior hold against real filesystems, Git, tools, and hostile input? |
| Acceptance | Does the publisher-producer-reviewer journey produce usable evidence? |
Fuzzing, mutation, race detection, repeated execution, and model comparison are techniques applied at a level, not additional levels. An LLM may propose or annotate an evaluation; it does not determine pass or fail.
testdata/assurance/catalog.json is the target catalogue for constitutional
invariants, escaped defects, crossing integrations, and operator journeys.
Ordinary Go tests remain auto-discovered and uncatalogued.
Each entry has id, level, basis, observable, executor,
fixture_or_pin, criticality, status, and known_limitation.
Prefixes are INV-* constitutional invariant, REG-* escaped defect,
INT-* crossing integration, and ACC-* operator journey.
Constitutional traceability is explicit. A requirement may map to more than one invariant when its observable crosses boundaries.
| Invariant | Constitutional requirements |
|---|---|
INV-01 Claim boundary |
MUST-01 through MUST-04 |
INV-02 Independent verification |
MUST-10 through MUST-14 |
INV-03 Write/read result equivalence |
MUST-20 |
INV-04 Deterministic canonical evaluation |
MUST-30 through MUST-33 |
INV-05 Path, subprocess, and input containment |
MUST-40 through MUST-42, MUST-45, MUST-48 |
INV-06 Resource bounds and privacy |
MUST-43, MUST-44, MUST-46, MUST-47 |
INV-07 Complete and channel-consistent outcomes |
MUST-21 through MUST-25, MUST-50 through MUST-53 |
INV-08 Atomic, non-authoritative cache |
MUST-34, MUST-35 |
INV-09 Command truth and effect declaration |
MUST-60 through MUST-63 |
INV-10 Human authority |
MUST-70 through MUST-74 |
INV-11 Versioned crossing schemas |
MUST-62, MUST-63, MUST-82 |
INV-12 Portability and release integrity |
MUST-80, MUST-81, MUST-83, MUST-84 |
INV-13 Public trust and sustainability |
MUST-90 through MUST-96 |
- Constitutional and escaped-defect changes begin with a failing evaluation committed before the implementation commit.
- Routine refactors do not require artificial failing commits.
- Positive, negative, and adversarial cases cover every gate.
- Write paths prove preview, containment, idempotence, interruption recovery, and equivalence with a subsequent read-only evaluation.
- Deterministic behavior uses exact exit status, typed JSON, bytes, and digests, not prose substrings.
- Expected results are independently authored or frozen; the implementation cannot generate its own oracle.
- Pull requests include an operator-readable before/after acceptance transcript.
| Metric | Release target | Baseline status |
|---|---|---|
false_green_paths_open |
0 | 0 open |
reference_green_pass_rate |
100% | Unmeasured; private positive fixture pending |
required_mutation_detection_rate |
100% | Public gauntlet 10/10; full corpus pending |
incomplete_reported_as_pass |
0 | Passing: --diff skip records incomplete + skipped_rules in cache |
channel_parity_failures |
0 | Passing: FG-01–FG-07 closed |
time_to_first_valid_evidence |
<= 60 s | Passing: 6 s local baseline |
No global statement-coverage threshold is a release gate. Coverage guides test selection; risk-to-evaluation traceability controls release.
The private reference product repository is the positive fixture. Tests operate on disposable copies. Each mutation removes or corrupts one expected property and must produce the specified failure. Private holdouts reduce overfitting to the public corpus.
Required metamorphic cases: repository relocation, environment variation,
ordering, repeated execution, heal-then-check equivalence, tampered artifacts,
stale cache, concurrent writers, interruption, and changed as_of.
Measurements below were executed at the pinned baseline. Coverage used
go test ./... -coverprofile; counts used repository searches.
| Measure | Result |
|---|---|
| Go test / fuzz declarations | 434: 431 tests, 3 fuzz targets |
| Go test files | 100 |
t.Run subtests |
23 |
| Statement coverage | 57.2% |
| Registered top-level commands | 20 |
| Registered check kinds | 8 |
| Embedded packs | 3 |
| Required CI contexts | 5 in required-checks.json |
| Third-party Go requirements | 0 in go.mod |
| Canonical schema files | 0 |
go test ./... |
Failing when run uncached; heal-equivalence JSON includes wall-clock time |
go test -race ./... |
Passing at the pinned baseline; rerun after the timing fix |
go build ./..., go vet ./... |
Passing |
| Claim safety | Passing |
| Red-team pilot | 15 passed, 0 failed |
| Gauntlet | 10 matched, 0 failed |
| Time to green | 6 seconds under 60-second gate |
| Current install release | v0.5.5 in install-manifest.json |
| Documented Action pin | Current fixed release in action.yml; deliberate human pin-bump gate |
Invariant status:
| INV | Subject | Status at baseline |
|---|---|---|
| INV-01 | Claim boundary | Passing automated claim-safety; human regulatory review pending |
| INV-02 | Independent verification | Failing |
| INV-03 | Write/read result equivalence | Heal outcome parity passes; exact JSON parity is timing-dependent |
| INV-04 | Deterministic canonical evaluation | Failing; evaluation and receipt not separated |
| INV-05 | Path, subprocess, and untrusted-input containment | Partial; path jail passes; evaluator Git config neutralized and option-shaped refs fail closed |
| INV-06 | Resource bounds and privacy | Partial; review caps exist, evaluator-wide budgets do not |
| INV-07 | Channel and outcome parity | Partial; FG false-greens closed; broader receipt/parity work remains in later WPs |
| INV-08 | Atomic, non-authoritative cache | Failing |
| INV-09 | Command truth and effect declaration | Failing |
| INV-10 | Human authority described accurately | Failing; acknowledgement is labelled as a gate |
| INV-11 | Versioned crossing schemas | Failing |
| INV-12 | Release and platform integrity | Partial; Windows supporting, module identity migration open |
| INV-13 | Public trust and sustainability | Target pending authorized human review |
The v1.1 reproduction established seven paths. The heal-consistency repair in
99870c5
closed the original outcome-parity defect. Current-baseline execution then
identified a separate chain-verification path. FG-01 through FG-07 are closed;
false_green_paths_open is 0.
Closed:
| ID | Prior path | Evidence |
|---|---|---|
| FG-03 | import_reach ignored the declared path and passed missing or unparsable src/payment.go; kind removed from registry and pack validate (eight kinds remain) |
checks.go, validate.go, packs.go, import_reach_removed_test.go |
| FG-02 | Repository-derived JSON was embedded raw in a script element and could alter offline bundle presentation; embed now uses JSON Unicode escapes for &, <, and > (MUST-43) |
bundle.go, script_embed_test.go |
| FG-05 | --diff could skip rules while machine cache recorded a complete-looking score without skip state; cache and JSON now carry outcome=incomplete and skipped_rules (MUST-23, MUST-52) |
validate.go, gatefailure.go, diff_skip_cache_test.go |
| FG-01 | A forged one-pager that copied the current fingerprint marker could suppress rewrite and present the marker as confirmed; rewrite now compares content fingerprints, and marker presence is unconfirmed/producer | release.go, review.go, fingerprint_forge_test.go |
| FG-04 | A one-character claimed digest could confirm because comparison length derived from the claim; fixed 12-hex floor (MUST-12) | review.go, digest_prefix_test.go, release.go |
| FG-06 | A present but unreadable required gate JSON layer was first confirmed and its parse/digest findings could disappear; structure now requires a successful open, and loadPayload keeps a contradicted parse finding | review.go, unreadable_gate_json_test.go |
| FG-07 | review --verify-chain accepted fabricated reports when the child copied a parent-supplied digest string without recomputation |
review.go, review_verify_chain_test.go |
| REG-HEAL-01 | check --heal returned 100/0/exit-0 while immediate check returned 60/2/exit-1; score, findings, and exit parity are repaired, but byte parity remains open under INV-04 |
check_json_heal_test.go, PR #40 |
Open escaped defects (not counted in false_green_paths_open):
| ID | Path | Evidence |
|---|---|---|
| REG-SKIP-01 | MUST-23: a skipped rule identifier is not present in every output channel. On EV-005, HOUSE-SECRET-PATHS appears in latest_evaluation.json (skipped_rule_ids) and in human-readable terminal output (skipped (diff)). It does not appear in check --json stdout, latest_result.json, or latest_action_report.md. |
EV-005 |
Additional open violations are tracked separately from the false-green count:
- Evaluator Git subprocesses neutralize repository-local executable configuration
(
-coverrides + stripped dangerousGIT_*env) and reject option-shaped refs (MUST-41, MUST-45); seegitutil.goandgit_harden_test.go. - The documented
curbpack ask <path> --proposeorder fails because Go flag parsing stops at the positional argument. - Direct cache writes are non-atomic and cache-write failure is warning-only.
- Current records include implicit time and environment-derived identity.
go test ./... -count=1fails because the heal-equivalence test compares JSON records whose wall-clock timestamps can cross a one-second boundary.- The real
ssh-keygen -Y verifyinvocation fails because it omits-Iand does not provide the signed message on standard input; current tests stub the binary. - Confirm policy agent-contract wording aligns with MUST-70:
--i-am-humanorCURBPACK_ALLOW_CONFIRM=1required; TTY alone is not enough (whitepaper + agent docs;TestConfirmPolicyWording_NoTTYAloneAuth). - Public surfaces still say that the gate is deterministic and "cannot be argued with," describe green as expensive to fake, and contain a stale static countdown. These claims are contradicted or unsupported by the current verified baseline (follow-on wording; not MUST-70).
- The Go module path remains
github.com/afelin/curbpackwhile the public source of truth isRI-SE/curbpack; migration requires a major-version plan.
Early public documents combined product contracts, discovery experiments,
adoption operations, and commercial hypotheses. The public history is retained.
Notable originating commits include
2cae2cc,
86f1dc8,
4ee93d0,
8c2ed48,
and ae34408.
Consolidating those files means:
- current product contracts move into this SDD and stable contract documents;
- historical experiments remain discoverable through commits and CHANGELOG;
- obsolete operating templates may leave the current documentation tree through an explicit, reviewable commit;
- no deletion is represented as erasure of the historical record;
- any discovery of credentials, personal data, contractual material, or legally restricted information starts a separate incident process.
Current releases are Apache-2.0 and independently usable. Optional future paid services may include maintained packs, private distribution, supplier-program coordination, onboarding, training, and support.
Payment controls hosted convenience only. It cannot unlock correctness, alter a finding, suppress evidence, establish trust, or revoke access to previously exported files. Producers can run the evaluator and answer a publisher without being charged per scan, finding, repository, or response.
Detailed pricing, target accounts, sales operations, provider choices, and adoption economics live in private operator governance. A hosted service starts only after its private adoption gate is met and a human owner authorizes it.
GitHub is the current source, build, release, and static distribution plane. Cloudflare may later host a replaceable edge for pack distribution, invitations, receipt intake, or payment webhooks. Oracle remains out until measured workload requires back-office storage or compute. Neither becomes an evaluator or offline verification dependency.
The README, site, CLI, agent skill, Action, and generated artifacts share one vocabulary and one claim boundary. Public surfaces lead with the read-only first step and distinguish local gate outcome from human review.
For a no-code operator:
- the primary path contains no more than the six commands in §5.2;
- every write shows its target and preview before confirmation;
- every failure gives one next action and non-destructive rollback guidance;
- cockpit comments show state, evidence, next action, and rollback without requiring log inspection;
- agents stage named paths and stop at human-authority boundaries;
- advanced commands do not crowd the first-use help surface.
Dates in cached public metadata are literal dates, never countdown values. Generated text and containers must remain readable on supported desktop and mobile surfaces.
Do not build these into the public evaluator:
- a server, database, account requirement, or hosted policy brain;
- a model that decides pass, fail, trust, or compliance;
- telemetry, beacons, automatic source upload, or phone-home behavior;
- a registry, marketplace, or supplier portal before the private adoption gate;
- payment, entitlement, or license checks in evaluation or verification;
- bespoke PKI, certificate-chain, or revocation infrastructure;
- embedded PDF, office-document, or broad XML parsers;
- a persistent graph database or query language;
- a tenth evaluator check kind without the §5.1 ADR;
- autonomous merge, release, attestation, approval, deployment, or rollback;
- a second assurance catalogue or a global coverage-percentage gate.
Capability that does not name a consumer, invariant, and deletion condition does not enter the implementation roadmap.
Each package is a separate reversible pull request unless a human approves a smaller merge grouping. A later package does not start before its entry gate.
| WP | Work | Entry gate | Exit evaluation | Rollback |
|---|---|---|---|---|
| W0 | Adopt SDD v1.2 | Current baseline reproduced | One-file review; all statuses sourced | Revert SDD commit |
| W1 | Correct contradicted public claims; close FG-01 through FG-07; remove import_reach; neutralize executable Git configuration and validate option-like Git inputs |
W0 human-merged | false_green_paths_open=0; hostile Git configuration cannot execute; option-shaped refs fail closed; regressions red before fix |
Revert each independent fix |
| W2 | Canonical evaluation, typed outcome, receipt split, atomic content-addressed cache | W1 complete | Repeated bytes/digests equal; interruption and concurrency tests | Preserve legacy readers behind adapter |
| W3 | Command metadata and explicit remediation; correct ask syntax and human-acknowledgement wording; deprecate --heal |
W2 stable | Generated command-truth tests and Agent/Action/hook/no-code migration matrix | Restore compatibility alias only |
| W4 | Independent OpenSSH trust policy and typed trust assessment | W2 stable | Real-binary sign/verify tests; no embedded or agent-fallback trust; missing or unusable OpenSSH reports not_checked |
Disable optional authenticity adapter |
| W5 | Four versioned schemas and generic external evidence | W2 model frozen | Golden round trips and unknown-field compatibility | Keep schemas supporting until promoted |
| W6 | Release identity, immutable references, Windows promotion evidence, module-path plan | W1-W5 required slices green | Install/action/release matrix and checksums | Retain prior release and pins |
| W7 | Consolidate historical public documents after W1 has corrected current product claims | W1 complete; RI-SE wording review | Links, claim safety, history references, current pins | Revert documentation commit |
| W8 | Optional hosted coordination and payment | Private adoption gate and human budget owner | Core works during hosted outage and after entitlement expiry | Disable hosted service; files remain usable |
W0 is the only product-repository change authorized by this document's adoption pull request. W1 and later require their own reservations, evaluations, and review.
| Change | Required control |
|---|---|
| Behavioral change | Reproduction, mapped evaluation, acceptance transcript |
| Constitutional or escaped-defect change | Failing evaluation commit before fix commit |
| New evaluator kind | ADR proving existing composition and external evidence insufficient |
| Trust, digest, attestation, or crypto | Outside human review before merge |
| Crossing format | Versioned schema, golden example, compatibility test |
| New required CI context | Three clean supporting runs, then human ruleset change |
| Public licensing or durability commitment | Documented RI-SE authority and legal review |
| Hosted or payment capability | Private adoption gate and explicit human authorization |
Required release evidence includes git diff --check, go test ./...,
go test -race ./..., go vet ./..., go build ./..., required-context
validation, claim safety, red-team, gauntlet, and the 60-second time-to-green
gate. Windows evidence is supporting until promoted under this table.
An agent that encounters the same blocking evaluation three times stops and revises the plan. It does not weaken the evaluation, retry indefinitely, or declare the condition accepted.
Concurrent writers use registered independent clones, one agent-prefixed story branch each, WIP of one, non-overlapping path reservations, advisory preflight, and named-path staging. Unknown work is preserved; no agent force-removes or discards another checkout.
SDD v1.2 is accepted only when a human reviewer can determine:
- what Curbpack evaluates and refuses to claim;
- what is shipped, failing, unverified, and targeted;
- which trust dimension supports each displayed status;
- which evidence can be reproduced without Curbpack infrastructure;
- which capabilities may become paid and which remain independently usable;
- why earlier strategy material changed and where its history remains;
- which evaluation and human control maps to every MUST;
- how each work package is proven and reverted.
Approval of this SDD authorizes review of W0 only. It does not merge W0, authorize W1, qualify v0.6.0, approve public organizational commitments, or start a hosted service.
| Version | Change |
|---|---|
| 1.2 | Launch release baseline: reconciles v1.0 product design, v1.1 assurance requirements, current implementation, balanced evaluations, explicit effects and outcomes, independent trust, public-history transparency, and sustainable commercial boundaries. |
| 1.1 | Proposed constitutional invariants and reproduced false-green register; not adopted as the repository SDD. |
| 1.0 | Initial target architecture, pack/check design, trust sketches, command model, and build waves. |
A future revision must update verified status, supersede a decision with reasons, or change a constitutional requirement. Editorial churn alone does not earn a new SDD version.