Skip to content

docs(specs): AID-EMIT-1 1.2.0-draft: aid.* replaces cpex.*, cmf.* kept, full RFC 8785 - #603

Merged
Levaj2000 merged 1 commit into
mainfrom
spec/aid-emit-1-aid-namespace
Oct 12, 2026
Merged

Levaj2000 merged 1 commit into
mainfrom
spec/aid-emit-1-aid-namespace

Conversation

@Levaj2000

Copy link
Copy Markdown
Owner

Spec and validator revision requested by the praxis maintainers on praxis-proxy/policy#171: the OCSF audit sink's unmapped keys should not carry the name of an engine it is not. Sequence agreed with terylt: this document first, then the validator, then the rename in praxis, then the praxis pin moves to this commit on main.

Spec (docs/specs/aid-emit-1.md)

  • Section 1.1 defines two prefixes. aid.* is the format's own: aid.stream, aid.decision, aid.span, aid.taint.input_labels, aid.content. cmf.* stays for the Common Message Format gap fields and the join key, since CMF is a message format shared across hosts, not a product. It explains why a draft renames pinned strings: the reference emitter's home is now the in-tree praxis port, and praxis 0.5.0 is the first release to ship these records, so no consumer has keyed on cpex.*. cpex.* is retired: emitters must not produce it, verifiers may read it as the aid member of the same name.
  • Section 1.2 becomes the member table with the host-prefix rules, replacing the two-vocabulary design. aid.<host>.* remains for hosts that do not speak CMF (the LiteLLM adapter), and the join key is cmf.request.request_id on CMF hosts and aid.request_id elsewhere.
  • Section 4 widens the value space to the whole of RFC 8785: keys sort by UTF-16 code units, floats take the ES6 form, integers keep their exact digits and a verifier must parse them exactly (the stream epoch exceeds 2^53). The ASCII-keys-and-integers constraint is withdrawn; the praxis canonicalizer now implements the full RFC.
  • Sections 7, 8, 9 use the aid names. Section 12 lists all three vectors (the provenance vector was missing from the list) and says where the aid vectors live. Section 13 records why the 1.x line is kept for a wire-name change.

Validator (scripts/aid_emit1_validator.py)

  • Canonicalizes with a full RFC 8785 implementation: UTF-16 key order, ES6 number form with shortest round-trip digits and ties to even, exact integers. A non-finite number is E-JCS-NUMBER. E-JCS-SPACE is gone with the constraint it enforced.
  • Reads aid.stream first and warns W-VOCAB-RETIRED when stamps sit under the retired cpex.stream.

Verified

  • The three vectors under integrations/cpex-ocsf-audit/ still pass through the new canonicalizer, including both DSSE signatures in the dispatch vector against the demo public key: 0 errors.
  • The regenerated praxis decision and provenance vectors with the aid names: 0 errors.
  • All 16 RFC 8785 Appendix B number vectors, the section 3.2.3 key-ordering example, and the float-schema and 1e21 cases from the praxis review.
  • ruff check and ruff format --check clean; added text is plain ASCII.

Not in this PR

  • The crate copy under integrations/cpex-ocsf-audit/ and its praxis-port/ patches still carry the cpex names and the pre-1.2.0 vectors. Section 12 says so; syncing that copy from the praxis tree is a separate change.
  • docs/specs/aid-emit-py.md and litellm-aid-emit.md still describe cpex as a selectable vocabulary; they are design drafts and can follow.

🤖 Generated with Claude Code

https://claude.ai/code/session_012BUhZ4ZG5jedf9ku6KuxNp


Generated by Claude Code

…t, full RFC 8785

The praxis maintainers asked that the OCSF audit sink's unmapped keys not
carry the name of an engine it is not (praxis-proxy/policy #171). The
reference emitter's home is now the in-tree praxis port, and the first
release that ships these records to a consumer is its 0.5.0, so the rename
happens before any consumer keys on the old names.

- Section 1.1 defines two prefixes: aid.* for the facts this format owns
  (stream, decision, span, taint.input_labels, content) and cmf.* for the
  Common Message Format gap fields and join key, which CMF hosts share.
  cpex.* is retired: emitters must not produce it, verifiers may read it
  as the aid member of the same name.
- Section 1.2 is the member table with the host-prefix rules, replacing
  the two-vocabulary design; aid.<host>.* stays for hosts without CMF.
- Section 4 widens the value space to the whole of RFC 8785: UTF-16 key
  order, ES6 floats, exact integers (the epoch exceeds 2^53), with the
  pre-1.2.0 ASCII-and-integers constraint withdrawn.
- Sections 7, 8, 9 use the aid names; section 12 lists all three vectors
  and says where the aid vectors live; section 13 records why the 1.x
  line is kept for a wire-name change.
- scripts/aid_emit1_validator.py canonicalizes with a full RFC 8785
  implementation, reads aid.stream first and warns W-VOCAB-RETIRED on the
  retired name. The existing cpex vectors still validate, the signed
  dispatch vector included, and the Appendix B number vectors pass.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_012BUhZ4ZG5jedf9ku6KuxNp
@Levaj2000
Levaj2000 marked this pull request as ready for review October 12, 2026 22:42
@Levaj2000
Levaj2000 merged commit abc7bd8 into main Oct 12, 2026
9 checks passed
@Levaj2000
Levaj2000 deleted the spec/aid-emit-1-aid-namespace branch October 12, 2026 22:42
Levaj2000 added a commit that referenced this pull request Oct 13, 2026
…T-1 1.2.0 (#604)

The #600 drafts were written against the two-vocabulary proposal
(aid.* for AI Identity emitters, cpex.* for the CPEX family) that #603
replaced: 1.2.0 retires cpex.* for every emitter and widens the section
4 value space to the whole of RFC 8785.

aid-emit-py.md: implements 1.2.0-draft; section 4.1 is now the section
1.2 member table with no vocabulary option (LiteLLM, a non-CMF host,
writes aid.request_id and aid.litellm.*); the value-space check rejects
only what JSON cannot carry; the in-tree canonicalizer is a full RFC
8785, ported from the validator, since sorted json.dumps no longer
matches and the rfc8785 package rejects the stream epoch; the T1 note
says the dispatch vector is unchanged by the rename; finding 2 is
settled the other way by 1.2.0.

litellm-aid-emit.md: field names per 1.2.0 section 1.2; the decision
bullet records that 1.2.0 settled it.

Docs only.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant