8.7 KiB
AMDUAT-FPS/1 — Functional Primitive Surface
Status: Draft | Owner: Architecture | SoT: Yes | Linked Phase: PH02 Aaru Version: 0.4.4 | Last Updated: 2025-11-30 Tags: [fps, primitives, kheper]
identity_authority: amduat.programme lineage_id: L-PENDING-FPS1 doc_code: AMDUAT-FPS/1 code_status: tentative doc_code_aliases: []
location: /amduat/tier1/fps.md surface: developer internal_revision: 5 provenance_mode: full
Scope
FPS/1 defines the deterministic primitive layer that upgrades the Kheper CAS from
storage-only semantics to byte-level transformations. The surface governs
reproducible implementations of put, get, slice, concatenate, reverse,
and splice across C and Python libraries, backed by COR/1 artifacts and
single-CID outputs. Deliverables include the normative primitive definitions,
validation matrices, and the descriptor model that treats primitive compositions
as addressable data.
Library Deliverables
- Canonical C implementation exported under
/amduat/src/c/within the Kheper reference tree and stored as COR/1 objects. - Canonical Python implementation exported under
/amduat/src/python/with parity harness alignment. - Deterministic test vectors recorded in
/amduat/tier1/testvectors/ph02-baseline.md. - Traceability coverage maintained in
/amduat/tier1/ph02-traceability.mdlinking Tier-0/Tier-1 requirements, ADR-015, and evidence.
Governance Hooks
- FPS/1 evolutions require additive ADRs; breaking semantics mandate a future FPS/2 designation.
- Implementations SHALL emit ADR-006 symbolic errors when primitives reject invalid inputs.
- Phase Pack updates in
/amduat/phases/ph02/phase-pack.mdcapture hygiene and evidence deltas for this surface.
Primitive Requirements
Each requirement is normative, uniquely identified, and captured in the trace matrix
(/amduat/tier1/ph02-traceability.md). Verification references use manifest
anchors (see §Deterministic Fixture Strategy) and language-specific harnesses.
| ID | Statement | Primary Verification | Notes |
|---|---|---|---|
| REQ-FPS-001 — PUT Determinism | Given canonical payload P and target CID C, put(P, C) SHALL persist byte-identical artifacts in the C and Python reference libraries, emitting C as the sole identifier with no auxiliary state. |
Harness replay of manifest://ph02/fps-baseline.jsonl#PUT-001 using both language adapters, cross-checking CID stability. |
Negative coverage uses PUT-ERR-MISMATCH to prove CID drift is rejected. |
| REQ-FPS-002 — GET Fidelity | get(C) SHALL return canonical payload P without mutation and SHALL surface ADR-006 ERR_NOT_FOUND when C is absent. |
Fixture pair GET-001 (positive) and GET-ERR-NOT-FOUND (negative) verifying payload integrity and error symbol parity. |
Reuses storage evidence from PH01 to confirm no regression to CAS semantics. |
| REQ-FPS-003 — SLICE Bounds | slice(C, start, length) SHALL emit subsequence P[start:start+length) and SHALL raise ADR-006 ERR_RANGE for out-of-bounds arguments. |
Manifests SLICE-001 and SLICE-ERR-BOUNDS executed with deterministic byte fixtures and boundary fuzz set. |
Start/length expressed as integers in manifest inputs for portability across FFI layers. |
| REQ-FPS-004 — CONCAT Closure | concatenate(C_a, C_b) SHALL deterministically construct payload P_ab whose CID is reproducible across implementations and SHALL persist provenance pair (C_a, C_b) inside manifest metadata. |
Vector CONCAT-001 plus provenance hash assertions stored alongside manifest verification proofs. |
CID determinism confirmed by storing computed values under expected.cid and diffing harness logs. |
| REQ-FPS-005 — REVERSE Involution | reverse(C) SHALL produce payload P_rev such that reverse(reverse(C)) returns the original payload; error semantics mirror REQ-FPS-002. |
Sequence REVERSE-001 followed by replay entry REVERSE-INVOLUTION to confirm involution property and rejection parity. |
Harness MUST compare digests before/after double reversal. |
| REQ-FPS-006 — SPLICE Integrity | splice(C, start, length, insert) SHALL excise the specified range and insert payload insert, yielding deterministic CIDs and ADR-006 ERR_RANGE for invalid spans. |
Fixtures SPLICE-001 and SPLICE-ERR-RANGE verifying deterministic outputs and boundary enforcement. |
Insert payloads reference canonical fixture cid:fps-insert-a for reproducibility. |
Rejection Matrix (ADR-006 Alignment)
Baseline error semantics remain governed by ADR-015 (/amduat/arc/adrs/adr-015.md) and reuse the symbolic catalogue ratified during the PH02 charter freeze.
| Error Code | Trigger | Guaranteed Behavior |
|---|---|---|
ERR_OVERFLOW |
Computed offsets or concatenated payload lengths exceed manifest-declared bounds, indicating arithmetic overflow risk. | Reject operation without mutating storage; emit ADR-006 symbol and record provenance in harness logs. |
ERR_INSERT_MISMATCH |
splice insert payload CID/digest disagrees with manifest expectation or language harness payload length. |
Abort splice, preserve original payload, and return ADR-006 error while logging mismatch context. |
ERR_PAYLOAD_EMPTY |
Primitives receive zero-length payloads where manifest requires canonical bytes (e.g., put, concatenate). |
Deny operation, return ADR-006 error, and require harness to surface empty-payload rejection evidence. |
ERR_EXEC_TIMEOUT |
Executor exceeded deterministic time envelope (Maat’s Balance breach). | Abort primitive execution, emit ADR-006 error, and log timing evidence under /logs/ph03/evidence/. |
Verified under PH02.5 Bridge Hygiene pass (2025-11-02). No semantic changes.
Deterministic Fixture Strategy
Fixture manifests SHALL be defined once and consumed by both language harnesses.
- Format: JSON Lines (
.jsonl) entries containingid,primitive,inputs,expected, optionalerror, and optionalnotesfor provenance commentary. Inputs capture CIDs, literal payload ranges, and primitive arguments. - Shared payload handles:
cid:fps-baselinereferences the canonical byte fixture; derivative payloads (e.g.,cid:fps-concat-ab,cid:fps-insert-a) record parent CID lineage to preserve traceability. - Language hooks: Harness adapters attach metadata without mutating the core manifest. C harness annotations live in sibling YAML files; Python adapters ingest JSONL directly.
- Negative vectors: Each primitive includes at least one
errorentry mirroring ADR-006 error codes (ERR_NOT_FOUND,ERR_RANGE, etc.) to demonstrate rejection parity. - Integrity guards: Manifest commits SHALL capture SHA-256 hashes in the traceability register and Phase Pack to detect drift across harness executions.
{"id": "SLICE-001", "primitive": "slice", "inputs": {"cid": "cid:fps-baseline", "start": 4, "length": 8}, "expected": {"cid": "cid:fps-slice-4-8", "digest": "sha256:..."}}
{"id": "SLICE-ERR-BOUNDS", "primitive": "slice", "inputs": {"cid": "cid:fps-baseline", "start": 4096, "length": 32}, "error": {"code": "ERR_RANGE"}, "notes": "Verifies ADR-006 range guard"}
PH03 Rejection Matrix
New ADR-016/017 validation surfaces introduce additional symbolic errors consumed by FPS/1 harnesses when verifying composite descriptors:
| Error Code | Trigger | Linked Surface |
|---|---|---|
ERR_PCB_ARITY_MISMATCH |
FCS/1 descriptor arity disagrees with PCB1 slot manifest count during harness validation. |
FCS/1 Descriptor Checks |
ERR_FCS_CYCLE_DETECTED |
Composition graph traversal detects a cycle or self-reference between nested FCS/1 descriptors. | FCS/1 Graph Validator |
Harness evidence MUST demonstrate deterministic rejection for these errors alongside existing ADR-006 matrices.
Document History
- 0.1.0 (2025-10-27): Initial skeleton establishing FPS/1 scope, library deliverables, and governance hooks under PH02 Aaru.
- 0.2.0 (2025-10-31): Added REQ-FPS-001..006 and fixture governance.
- 0.3.0 (2025-11-01): Refined verification matrix and fixture governance.
- 0.4.0 (2025-11-01): Added ADR-006 rejection matrix covering ERR_OVERFLOW, ERR_INSERT_MISMATCH, and ERR_PAYLOAD_EMPTY.
- 0.4.1 (2025-11-02): Cross-linked ADR-015 for rejection governance and recorded PH02.5 bridge hygiene verification note (no semantic deltas).
- 0.4.2 (2025-11-15): Documented PH03 rejection matrix for ERR_PCB_ARITY_MISMATCH and ERR_FCS_CYCLE_DETECTED.
- 0.4.3 (2025-11-19): Added ERR_EXEC_TIMEOUT to rejection matrix to enforce deterministic timing evidence.
- 0.4.4 (2025-11-30): Added DOCID header (pending lineage), keeping FPS/1 scope unchanged.