title: "Proposal Normalizer - Canonical Proposal Assembly Layer" filetype: "documentation" type: "repository-overview" domain: "governance-integration" version: "0.2.0" doi: "TBD" status: "Active" created: "2026-03-16" updated: "2026-05-03"
author: name: "Shawn C. Wright" email: "swright@waveframelabs.org" orcid: "https://orcid.org/0009-0006-6043-9295"
maintainer: name: "Waveframe Labs" url: "https://waveframelabs.org"
license: "Apache-2.0"
copyright: holder: "Waveframe Labs" year: "2026"
ai_assisted: "partial"
dependencies:
anchors:
- "Proposal-Normalizer-v0.2.0"
- "Canonical-Proposal-Assembly-Layer"
Proposal Normalizer
Strict proposal assembly layer for canonical CRI-CORE proposal objects.
The normalizer binds caller-supplied proposal references into one envelope. It validates boundary shape, computes artifact file hashes, and preserves governance truth supplied by upstream systems.
Installation
Install from PyPI:
pip install cricore-proposal-normalizer
Requires Python 3.10+.
Purpose
Real workflows produce:
- artifact files
- actor identity declarations
- mutation requests
- compiled contract references
CRI-CORE evaluates only a single canonical structure:
canonical proposal object
The proposal normalizer bridges this boundary.
artifacts + actor + mutation + contract
-> proposal normalizer
-> canonical proposal object
-> CRI-CORE enforcement
Responsibilities
The normalizer performs strict, deterministic binding:
-
Artifact Binding
Verifies each supplied artifact path exists and records its SHA256 hash.
-
Mutation Binding
Requires exactly the mutation boundary shape used by CRI-CORE:
{ "domain": str, "resource": str, "action": str, }
-
Contract Binding
Requires a caller-supplied contract reference and preserves it without computing, coercing, or inferring contract truth:
{ "id": "...", "version": "...", "hash": "...", }
-
Actor Binding
Requires explicit actor identity, type, and role:
{ "id": str, "type": str, "role": str, }
-
Proposal Assembly
Produces a canonical proposal object with no mutation after construction.
Proposal Shape
{
"proposal_id": str,
"timestamp": str,
"actor": {
"id": str,
"type": str,
"role": str,
},
"contract": {
"id": "...",
"version": "...",
"hash": "...",
},
"requested_mutation": {
"domain": str,
"resource": str,
"action": str,
},
"artifacts": [
{
"path": str,
"sha256": str,
}
],
}
When supplied, run_context is copied into the proposal envelope.
Design Constraints
The normalizer is strict, not forgiving. Missing required contract, mutation, or actor fields raise ValueError.
It does not:
- compute contract hashes
- infer contract identifiers or versions
- infer actor roles
- inject defaults
- accept optional mutation ambiguity
- interpret governance policy
- enforce lifecycle rules
- perform approvals
- evaluate proposal correctness
Those responsibilities belong to CRI-CORE.
Output
The normalizer produces a canonical proposal envelope suitable for evaluation by the CRI-CORE enforcement pipeline.
Metadata
Release files for cricore-proposal-normalizer 0.2.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| cricore_proposal_normalizer-0.2.0.tar.gz | 9.3 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| cricore_proposal_normalizer-0.2.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 19.5 kB
Release files / cricore_proposal_normalizer-0.2.0.tar.gz
| Download URL | cricore_proposal_normalizer-0.2.0.tar.gz |
|---|---|
| Size | 9.3 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
5363ac126dfc3e982e8e3afac75ee23b1009db4dfba5f32a05abc88039d32794
|
|
BLAKE2b-256 checksum How to use checksums |
c28e580c94b83795ddff98e13ea550cb706d17e9cf6d3e89619420538286d847
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.14.0
|
Release files / cricore_proposal_normalizer-0.2.0-py3-none-any.whl
| Download URL | cricore_proposal_normalizer-0.2.0-py3-none-any.whl |
|---|---|
| Size | 10.2 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
b3f64f337bd8e49ea37e8885e0ec64ef4a729d48fe9834b41dfa718278d6812c
|
|
BLAKE2b-256 checksum How to use checksums |
52aea735beb0e23712b2c65ef40e4c91a3071de43e3f973328b3650ba3860d39
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.14.0
|