Skip to content

Define AssertionRecord protected-effect contract - #23

Draft
samovers wants to merge 5 commits into
mainfrom
rfc/assertion-record-protected-effect-v0-1
Draft

samovers wants to merge 5 commits into
mainfrom
rfc/assertion-record-protected-effect-v0-1

Conversation

@samovers

@samovers samovers commented Sep 3, 2026

Copy link
Copy Markdown
Owner

Summary

  • add one non-authoritative Phase A candidate for the AssertionRecord protected-effect boundary
  • close the action-to-result subtype mapping and the constitutional commit-class label/current Event Ingress token mapping for ASSERT_STRUCTURE, ASSERT_OPERATION_CLAIM, and ASSERT_COMPLIANCE
  • require every new submission result to remain PENDING_REVIEW
  • preserve assertion-act time separately from subject, receipt, approval, authorization, and commit times through closed online/offline provenance postures
  • define nine closed branch-owned subjectTime profiles rather than deferring temporal meaning to later schema authors
  • preserve optional immutable correction lineage only when the prior assertion passes the closed same-context target predicate
  • consume optional semantic-event classification from separately validated Event Ingress evidence without deriving or copying a primary family into AssertionRecord, using deterministic lowest-index direct-match projection
  • preserve the reporter/performer split for operation claims and prevent submission from becoming accepted truth
  • expose the still-missing NOT_REQUIRED atomic transaction profile for operation-claim submission without editing that separate boundary

Trust boundary

Primary trust boundary: AssertionRecord submission semantics and commit classification.

This PR stays inside that boundary. It adds and revises one historical Phase A candidate only. It does not change authorization law, schemas, Event Grammar or Event Ingress classification, transaction machinery, review or promotion semantics, accepted RFCs, current/default indexes, OFARM2, or runtime code.

The correction-target predicate consumes the already selected authorization view, positive visibility in the trusted transaction-start snapshot identified by transactionSnapshotRef plus its snapshot digest, and immutable prior-creation evidence as integrity inputs. It assumes no separate canonical-history position or general history watermark, grants no authority over the prior assertion, and does not redefine authorization, transaction, or evidence contracts.

Dependency pins

PR #20 covers the fresh-approval mode selected by structure and compliance assertions. It deliberately does not cover the NOT_REQUIRED mode selected by operation claims, so the candidate records a separate downstream prerequisite instead of borrowing or inventing transaction semantics here.

Review requested

Please review the explicit approval card, especially:

  • the fixed PENDING_REVIEW result posture;
  • the three action/subtype mappings and the constitutional-label/current-ingress-token commit-class pairs;
  • assertedByPartyRef as the selected authority subject;
  • assertedAt as governed assertion-act time, never protected-effect commit time;
  • the two assertion-act provenance postures and nine closed subjectTime profiles;
  • the explicit one-anchor NARROWING with lossless typed context and relationship proofs;
  • optional semantic-event association consuming the authoritative Event Ingress family and exact envelope subject/scope pointers, with deterministic lowest-index direct matching and no subtype-derived primary family;
  • the same-subtype, governance-boundary/twin, authority-anchor, logical-subject, prior-existence, and non-self correction-target predicate;
  • the operation reporter/performer and performer-authority separation; and
  • the separate NOT_REQUIRED transaction-mode prerequisite.

Validation

  • git diff --check
  • python3 package_meta/tools/run_repository_validation_suite.py
  • all four GitHub checks

All pass at exact head 622376e2998cf8b3954ca19e81d2cce6fd57e5fe.

Closes #22

@samovers samovers left a comment

Copy link
Copy Markdown
Owner Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Review disposition: Request three bounded changes

Reviewed PR #23 at exact head 965c691ecd2c89d6a0b28c2d2abeeeda3bee7c7c against:

  • issue #22’s protected-effect boundary and acceptance criteria;
  • the active Constitution’s temporal law;
  • the accepted Source Truth Record Closure and Event Ingress RFCs;
  • the Event Grammar and Temporal Field Conformance Matrix;
  • the accepted quantity-bearing intervention/as-applied law;
  • the exact approved PR #11 authorization candidate at 03a21f6; and
  • the exact approved PR #20 transaction candidate at 98f8c4f.

The PR is correctly limited to one draft, non-authoritative candidate file. It is open, mergeable, and changes no active law, schemas, runtime, currentness, or OFARM2 implementation. The declared dependency heads have exact-head steward approval, and PR #20 correctly leaves NOT_REQUIRED outside its covered transaction modes. Both reported repository validations pass.

The core protected-effect design is mostly disciplined, but three semantics are not yet safe to approve.


1. Blocker — assertion subtype is incorrectly used to fix the primary event family

Section 7.2 fixes this map:

  • ASSERT_STRUCTUREStructureEvent
  • ASSERT_OPERATION_CLAIMInterventionEvent
  • ASSERT_COMPLIANCEGovernanceEvent

PC_ACTION_TYPE then makes any other family fail the contract. The candidate describes the selected family as classifying both the assertion-submission act and its claimed domain context.

That conflates three different things:

  1. the AssertionRecord commit class;
  2. the world event or governed act being described;
  3. the platform act of submitting the assertion.

Active Event Grammar explicitly separates event family from commit class. The primary family is selected from the dominant semantic consequence of the event, and one event may create records belonging to several commit classes. A commit class therefore cannot determine the event family by itself.

The accepted Event Ingress RFC also assigns primary event-family identity to the separate SemanticEventEnvelope. AssertionRecord remains a distinct source-truth record linked through the ingress result and promotion trace; it does not own the event family merely because it has a particular assertion subtype.

The active supporting fixtures demonstrate why the fixed map fails:

  • an operation claim occurs under both InterventionEvent and MaterialEvent;
  • a compliance assertion occurs under OccurrenceEvent, EvidenceEvent, and GovernanceEvent;
  • a structure assertion can be one of several commit classes emitted in a broader StructureEvent.

These are applications of the active dominant-consequence rule, not arbitrary alternatives.

A concrete existing path already keeps an InterventionEvent envelope separate from its operation-claim AssertionRecord. The envelope carries event and record times, while the assertion carries the operation claim.

Smallest required patch

Keep the commit-class map fixed:

  • structure result → STRUCTURE_ASSERTION
  • operation result → OPERATION_CLAIM
  • compliance result → COMPLIANCE_ASSERTION

Remove primary event family as a derivation from the action or AssertionRecord subtype.

Where the ingress path has a governed semantic event:

  1. bind the exact immutable SemanticEventEnvelope reference/revision or digest;
  2. consume its separately validated primaryEventFamily;
  3. verify that its subject, scope, time, and dominant-consequence context are compatible with the assertion;
  4. record that binding in the protected-effect trace without copying event-envelope semantics into AssertionRecord.

Where there is no associated semantic event, this contract should make no primary-event-family claim. If OFARM intends assertion submission itself to be a distinct event, that requires a separately governed event envelope for that submission act. It must not reuse the asserted world event’s family implicitly.

Update:

  • section 1 decision 7;
  • sections 7.2 and 7.3;
  • PC_ACTION_TYPE;
  • permitted derivations;
  • trace requirements;
  • hostile cases;
  • the steward approval card.

Add at least these cases:

  • a valid operation claim associated with a MaterialEvent must not fail merely because its record commit class is OPERATION_CLAIM;
  • a valid compliance assertion associated with an OccurrenceEvent or EvidenceEvent must not be forced to GovernanceEvent;
  • changing the event family without changing the dominant event semantics must fail at the Event Ingress classification boundary, not through an assertion-subtype lookup.

No new event vocabulary or generic classifier is needed. This uses the existing Event Grammar and SemanticEventEnvelope.


2. Blocker — assertedAt collapses assertion time into record/commit time, while subjectTime remains semantically unresolved

There are two related temporal defects.

2.1 assertedAt = effectCommittedAt contradicts active temporal law

The candidate consistently maps:

assertedAt = trusted effectCommittedAt

It states that assertedAt is when the assertion enters canonical history and keeps the actual human act, ingress time, and evidence times outside the record. AR_ASSERTED_AT, the hostile cases, and the approval card all enforce that choice.

The active Constitution is explicit that OFARM truth law distinguishes assertion time from record time, alongside event, effective, review, and other temporal meanings.

The active Temporal Field Conformance Matrix reinforces this distinction. For delayed sync, OFARM must preserve separately:

  • when the actor asserted or submitted the claim;
  • when the platform received or synchronized it;
  • when authority was evaluated;
  • when the record was committed.

It also says a single timestamp must not stand in for every temporal fact merely because the implementation happens to process them together.

PR #11 likewise distinguishes subjectTime, authorizationEvaluatedAt, decisionValidUntil, and effectCommittedAt. It deliberately leaves the domain contract to preserve the assertion’s own temporal meaning rather than turning commit time into all-purpose assertion time.

The failure is observable in offline use:

actor creates/asserts claim at T1
device synchronizes at T2
protected effect commits at T3

The current candidate records only:

assertedAt = T3

T1 is lost unless some unrelated evidence happens to preserve it. That makes a delayed claim look newly asserted at commit time.

Required correction

assertedAt should be the exact governed time at which the asserting Party made, submitted, or affirmed the assertion covered by the effect-intent digest.

effectCommittedAt remains the transaction linearization time and belongs in the governed-effect receipt and transaction evidence. The two may be equal in a synchronous path, but equality must be an observed fact, not the contract definition.

For fresh-approval actions, assertedAt may equal humanActedAt only when the exact human act is contractually the assertion act. The human approver must not automatically become the asserting Party or supply its time merely by approving an agent or represented-Party submission.

For automated, represented, imported, or offline submission, the future intent or assertion-act evidence must carry the exact assertion-act time and its trust/provenance posture. If that value cannot be established, the contract must not silently substitute commit time.

Add a hostile delayed-sync case with distinct T1, T2, and T3 values and require all relevant times to remain distinguishable.

2.2 subjectTime is delegated to future schema authors rather than closed here

The candidate says the future intent and result schemas will later decide whether subjectTime is:

  • an instant;
  • an interval;
  • an effective window;
  • an intended window;
  • a performed interval; or
  • a compliance as-of time.

Until those schemas are written, the candidate prohibits an implementation from guessing. That is a safe stop condition, but it means the Phase A semantic contract has not yet made the decision required by issue #22. Issue #22 requires the exact subject-time binding to be identified, while PR #11 intentionally delegates domain qualification of subjectTime to this protected-effect contract.

For operation claims, accepted quantity/as-applied law already gives the relevant distinction:

  • intended work has an intended time window;
  • performed work has an effective execution interval;
  • capture time is separate;
  • a correction or dispute retains its own lineage and timing.

Smallest temporal-profile patch

Define the closed semantic posture before machine materialization:

  • INTENDED operation claim → exact intended time window;
  • PERFORMED operation claim → exact effective execution interval, or an explicitly allowed occurrence-instant profile;
  • structure assertion → one closed effective/as-of posture or a small tagged choice;
  • compliance assertion → one closed compliance as-of/effective posture or a small tagged choice.

For every admitted shape, close:

  • discriminator;
  • required endpoints;
  • instant versus interval cardinality;
  • inclusive/exclusive endpoint posture;
  • UTC/date-time requirements;
  • exact source pointer;
  • forbidden substitutions.

This does not require a general temporal expression language. A small tagged union owned by the three body-schema branches is sufficient. If stewards cannot yet choose the structure or compliance posture, name a narrow temporal-profile prerequisite and do not mark Phase A complete.


3. Blocker — the contract makes correction assertions and supersession lineage unrepresentable

The current carrier supports supersedesAssertionRecordRef, and the accepted Source Truth Record Closure requires AssertionRecord to retain supersession lineage where relevant.

Accepted quantity/as-applied law is more specific:

  • a correction is a new historical assertion, not an edit path;
  • corrections supersede without deleting the original claim;
  • correction and dispute payloads retain lineage.

PR #23 instead requires both assertion supersession fields to be absent and says later review and lineage are separate effects. AR_LEGACY_ABSENCE rejects any supersession field, and the migration section says this submission contract defines no lineage branch.

That is safe for a truly initial assertion, but the contract is bound to the full ASSERT_STRUCTURE, ASSERT_OPERATION_CLAIM, and ASSERT_COMPLIANCE actions. PR #11 gives each state-affecting action one protected-effect-contract binding. Once those actions point at this contract, there is no executable correction path unless the contract supports it or the authorization rule is later changed.

A correction payload hidden inside assertionBody or an ExecutionRecordPayload is not an adequate substitute for AssertionRecord lineage. It may describe corrected content while leaving the source-truth graph unable to state which prior assertion the new assertion corrects.

Smallest required patch

Choose one explicit posture.

Preferred bounded closure:

Add optional supersedesAssertionRecordBinding:

  • permitted only under an explicit correction posture in the selected body schema;
  • contains one logical prior-assertion ref and exactly one immutable revision ref or content digest;
  • is covered by effectIntentDigest;
  • is copied exactly to the result;
  • does not mutate, delete, relabel, or automatically deactivate the prior assertion;
  • does not imply review acceptance or current-state supersession;
  • cannot affect authorization unless PR #11 is separately amended.

Keep supersededByReviewDecisionRef absent. That field describes a later review effect and should not be fabricated during assertion submission.

Add hostile cases for:

  • correction posture without prior-assertion binding;
  • binding to the wrong prior assertion or wrong digest;
  • lineage supplied on a non-correction initial assertion;
  • treating the lineage edge as acceptance, deletion, or current-state replacement.

Alternative narrow closure:

Explicitly state that v0.1 of this protected-effect contract supports initial assertions only, reject every correction-class body or payload, and open a named child issue for correction AssertionRecord submission before authorization-bundle promotion. The action rule must not imply that all valid assertion submissions are executable through this contract.

The current implicit middle position—accepting correction-capable payloads while prohibiting assertion lineage—is not sufficient.


Non-blocking governance note — the one-anchor-scope rule is a real narrowing

Current AssertionRecord v0.1 permits one or more anchor scopes, and an active late-sync operation-claim example uses both a field and a crop-cycle anchor. PR #23 reduces new v0.2 submissions to exactly one anchor copied from the single RP_SCOPE_ONE authority target.

The candidate exposes the one-scope rule and fails rather than silently dropping scopes, so I do not treat this as an independent semantic blocker. The approval card should nevertheless label it explicitly as a NARROWING and state how a claim needing field, crop-cycle, and operation context is represented without loss:

  • one authority-bearing anchor;
  • typed subject;
  • exact body context; and
  • immutable relationship proofs.

If that representation is not lossless for a valid claim, materialization must stop rather than flattening multiple anchors into one.


What the candidate gets right

The following parts should remain:

  • A narrow AssertionRecord v0.2 carrier is justified; the v0.1 carrier cannot hold the proposed immutable body, subject, evidence, and branch bindings without relying on a sidecar.
  • The action-to-record-subtype mappings are coherent, including the explicit OPERATION_ASSERTION authorization token to OPERATION_CLAIM_ASSERTION result subtype mapping.
  • Every new submission remains PENDING_REVIEW.
  • Fresh human approval authorizes submission only and does not manufacture acceptance.
  • The current reporter is kept separate from the alleged performer.
  • Performer authority remains NOT_EVALUATED_BY_AUTHORIZATION.
  • EP_NONE is correctly distinguished from an empty AssertionRecord evidence set; authorization evidence policy and source-record evidence linkage are different axes.
  • Evidence, body, subject, and scope bindings are immutable and exact rather than mutable or latest-version references.
  • Compliance rule/policy bindings state what the claim is made against without claiming the compliance assertion is correct.
  • No assertion submission creates accepted structure, accepted execution, a compliance fact, a ReviewDecision, a current-state materialization, or an implicit companion effect.
  • Protected-effect failure leaves the authorization result truthful and unchanged.
  • The operation-claim path correctly remains blocked on a separately governed NOT_REQUIRED atomic transaction profile rather than borrowing fresh approval from PR #20.
  • Mapping and postcondition traces use truthful PASS, FAIL, NOT_APPLICABLE, and dependency-bound NOT_EVALUATED.
  • Domain semantics remain inside the protected-effect contract instead of being copied into AuthorizationPolicyBundle.

Drift and over-design assessment

No broad scope drift. The candidate remains within AssertionRecord submission semantics. It does not edit authorization, transaction coordination, review law, current-state materialization, transport, retention, database authority, or OFARM2 runtime code.

The fixed event-family map is the only material ownership drift: it takes classification owned by Event Grammar and the separate semantic-event boundary and derives it from AssertionRecord action/subtype. Removing that derivation reduces scope.

No general over-design. The future carrier, body-schema branches, immutable bindings, branch absence rules, postconditions, and validation trace are proportionate to the trust boundary. The requested corrections require no:

  • generic claim language;
  • temporal query language;
  • new top-level event family;
  • second authorization evaluator;
  • workflow engine;
  • mutable semantics registry;
  • correction service;
  • current-state mechanism.

The correction is smaller than the current design:

  • consume existing event classification rather than duplicate it;
  • preserve assertion time instead of overloading commit time;
  • use small branch-owned temporal profiles;
  • retain one optional immutable correction lineage edge.

Authority and implementation impact

No 00_active_baseline/ rewrite is justified.

The controlled follow-on impact is:

  • Accepted RFC extension: AssertionRecord submission protected-effect semantics.
  • Event Ingress implication: consume the existing immutable semantic-event classification; an amendment is needed only if a distinct assertion-submission event is introduced.
  • Machine-contract implication: AssertionRecord v0.2, three body-schema branches, exact temporal profiles, optional correction lineage, protected-effect contract, and validation trace.
  • Transaction implication: none for the two PR #20-covered modes; NOT_REQUIRED remains a separate prerequisite.
  • Conformance implication: variable event-family cases, delayed assertion/sync/commit timing, intended-versus-performed temporal substitution, and correction-lineage cases.
  • Currentness implication: none until separately reviewed promotion.
  • OFARM2 implication: none until accepted, promoted, and byte-identically extracted.

Final assessment

  • PR boundary: correct
  • Dependency pins: correct and approved
  • Action-to-AssertionRecord subtype map: sound
  • PENDING_REVIEW submission posture: sound
  • Reporter/performer separation: sound
  • Evidence and protected-effect trace posture: sound
  • NOT_REQUIRED transaction stop: sound
  • Fixed action-to-event-family derivation: must fix
  • assertedAt = effectCommittedAt: must fix
  • Branch-specific subject-time semantics: must close
  • Correction/supersession lineage: must preserve or explicitly split
  • Scope drift: one bounded event-classification overreach
  • Architectural over-design: none
  • Phase A disposition: not ready for steward semantic approval

Keep PR #23 in draft and do not approve section 17 until these three bounded changes are closed at an exact new head.

@samovers

samovers commented Sep 3, 2026

Copy link
Copy Markdown
Owner Author

Re-review requested at exact head 97c9a985767a32bbe4722b472d83ff66f0b5086f.

This revision addresses the three bounded blockers and the non-blocking narrowing note:

  1. Event-family ownership: removes every action/subtype-to-primary-family derivation. Section 7.2 now fixes only AssertionRecord commit classes. Optional semantic-event association binds exact immutable envelope bytes, consumes a separately passing Event Ingress family, checks subject/scope/time/dominant-consequence compatibility, and records the association only in the protected-effect trace. The required MaterialEvent, OccurrenceEvent/EvidenceEvent, and classification-boundary hostile cases are included.
  2. Temporal closure: assertedAt is now the governed assertion-act time, never effectCommittedAt. The contract closes trusted-online and verified-offline provenance postures, keeps humanActedAt conditional rather than automatic, preserves distinct assertion/receipt/commit times, and defines nine small branch-owned subjectTime profiles with exact discriminators, members, endpoint semantics, UTC representation, source/destination pointers, and forbidden substitutions.
  3. Correction lineage: adds optional exact immutable supersedesAssertionRecordBinding, required only for explicit CORRECTION posture and absent for INITIAL. It is intent-bound and copied exactly, while prior history, review acceptance, deactivation, and current-state supersession remain untouched. The four requested hostile cases are included.
  4. One-anchor narrowing: labels the v0.1 one-or-more to v0.2 one-anchor rule as NARROWING, defines lossless context preservation through the sole authority anchor, typed subject/body context, and immutable relationship proofs, and stops materialization if representation would be lossy.

Scope remains one non-authoritative Phase A candidate file. No Event Grammar, Event Ingress, authorization, transaction, review, schema, runtime, currentness, or OFARM2 file changed. The operation path remains explicitly blocked on the separate NOT_REQUIRED atomic transaction profile.

Validation at this head:

  • local full repository validation suite: PASS
  • GitHub generated-currentness: PASS
  • GitHub repository-validation: PASS

Please re-review the exact head above for Phase A semantic approval.

@samovers samovers left a comment

Copy link
Copy Markdown
Owner Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Re-review disposition: Request one bounded change

Reviewed PR #23 at current head 97c9a985767a32bbe4722b472d83ff66f0b5086f against the previously reviewed head 965c691ecd2c89d6a0b28c2d2abeeeda3bee7c7c.

The delta is one commit modifying only the existing non-authoritative candidate document, with 207 additions and 76 deletions. PR #23 remains open, draft, mergeable, and limited to one changed file. Both current-head workflows—repository validation and generated-currentness validation—completed successfully.

Previous findings

1. Event-family ownership: closed

The candidate no longer derives a primary event family from the assertion action or subtype. Section 7.2 now fixes only:

  • action;
  • intent profile;
  • effect-subject kind;
  • AssertionRecord subtype; and
  • record commit class.

Primary event family is explicitly absent from that map.

Where an immutable SemanticEventEnvelope is associated, the contract now:

  1. resolves exact envelope bytes;
  2. consumes the independently validated Event Ingress classification;
  3. checks subject, scope, temporal, subtype, and dominant-consequence compatibility;
  4. records the association only in the protected-effect trace; and
  5. does not copy the family into the AssertionRecord.

Where no semantic event is associated, the event-association mapping is NOT_APPLICABLE and no family value is invented. This correctly separates the world event, the assertion-submission act, and the AssertionRecord commit class.

The requested hostile cases for MaterialEvent operation claims, OccurrenceEvent or EvidenceEvent compliance assertions, and classification changes at the Event Ingress boundary are present.

2. Assertion and subject-time semantics: closed

assertedAt is no longer defined as effectCommittedAt. The revised contract closes two assertion-act postures:

  • TRUSTED_ONLINE_SUBMISSION: the trusted runtime supplies the assertion-act timestamp before intent validation and hashing;
  • VERIFIED_OFFLINE_SUBMISSION: the timestamp comes from immutable assertion-act evidence binding the asserting Party or representation basis, exact assertion content, source timestamp, and the applicable time-trust policy.

humanActedAt, ingress time, authorization time, evidence capture time, subject time, and effectCommittedAt are explicitly prohibited from substituting for assertedAt.

The delayed-sync chronology is now preserved:

T1 = assertion act
T2 = receipt/synchronization
T3 = protected-effect commit

The AssertionRecord retains T1, while T2 and T3 remain in their separately owned evidence. This aligns with active multi-temporal law rather than making commit time look like claim time.

The candidate also now defines nine closed subjectTime profiles covering:

  • structure as-of, effective-from, and effective interval;
  • intended operation window;
  • performed operation instant and interval;
  • compliance as-of, effective-from, and effective interval.

The profiles close discriminators, required members, half-open interval semantics, endpoint ordering, canonical timestamp representation, source and destination posture, and payload-equality rules. This is a bounded tagged union, not a generic temporal language.

3. Correction lineage: presence and effect posture closed; target compatibility still incomplete

The candidate now supports:

INITIAL
→ supersedesAssertionRecordBinding absent

CORRECTION
→ exactly one supersedesAssertionRecordBinding required

The binding is immutable, included in the effect-intent digest, copied exactly to the new record, and prohibited from mutating, accepting, deactivating, or replacing the prior assertion in current state. supersededByReviewDecisionRef correctly remains outside initial assertion submission.

That closes the structural absence identified in the previous review. One executable gap remains.


Remaining blocker — “wrong prior assertion” has no defined meaning

Section 5.5 currently requires the correction binding only to resolve as an “actual supported AssertionRecord.” It does not define any required semantic relationship between that prior assertion and the new correction.

There is no explicit requirement that the prior assertion:

  • has the same assertion subtype;
  • belongs to the same tenant or deployment boundary;
  • belongs to the same twin;
  • shares the same authority-bearing anchor scope;
  • concerns the same logical subject;
  • precedes the correcting assertion; or
  • is not the correcting assertion itself.

The hostile table says a binding to the “wrong prior assertion” must fail, but the normative sections do not define what makes a prior assertion wrong. Two conforming implementations could therefore disagree while validating the same bytes.

A concrete problematic record could be:

new record:
  assertionType = COMPLIANCE_ASSERTION
  anchor = field:A
  assertionPosture = CORRECTION

supersedesAssertionRecordBinding:
  prior record = OPERATION_CLAIM_ASSERTION
  anchor = field:B
  tenant = unrelated tenant

Under the current written rule, the prior record may be immutable, digest-valid, and an actual AssertionRecord. Nothing in AR_CORRECTION_LINEAGE or PC_CORRECTION_LINEAGE explicitly rejects the cross-subtype, cross-scope, or cross-tenant lineage edge.

This is more than a cosmetic lineage problem. It could let an actor authorized to assert within one scope create a canonical source-truth edge claiming to correct an unrelated assertion outside that scope. The prior record would remain immutable, but the new history would still contain a false correction relationship.

Smallest required patch

Define one narrow correction-target compatibility predicate owned by this protected-effect contract.

For this v0.1 candidate, require all of the following:

  1. Existing prior record: the binding resolves to an AssertionRecord committed before the new assertion’s transaction; self-reference and unresolved prospective references fail.
  2. Same subtype: the prior and new records have the same assertionType.
  3. Same governance boundary: immutable resolution proves the same tenant or deployment boundary and the same applicable twin.
  4. Same authority anchor:
    • for a prior v0.2 record, the new sole anchor equals the prior sole authority-bearing anchor;
    • for a prior v0.1 record with multiple anchors, the new sole anchor must exactly match one of the prior anchors, with no cross-scope inference.
  5. Same logical subject: the prior and new records refer to the same logical subject. A correction that changes the claimed subject identity is outside this narrow correction profile.
  6. Claim-lineage semantics only: supersedesAssertionRecordBinding denotes correction lineage between assertions. It does not by itself change the prior assertion’s claim state, review status, current-state contribution, or in-force posture.

A correction that needs to change subtype, subject identity, authority anchor, tenant, or twin should enter as a new INITIAL assertion until a separately reviewed correction-relation profile defines that broader operation. Do not let body-schema authors infer those widening rules independently.

Also make the pointer ownership unambiguous. The candidate presently describes assertionPosture as being inside assertionBody, while using /assertionPosture as a body-schema-relative pointer. State its absolute intent and result pointers, for example:

/assertionBody/assertionPosture

or explicitly state that /assertionPosture is relative to the body-schema root.

Add hostile cases for:

  • cross-subtype correction;
  • cross-tenant or cross-twin correction;
  • prior assertion outside the new authority anchor;
  • different logical subject;
  • self-reference;
  • prior assertion that did not exist before the correcting commit.

This is one local domain-lineage predicate. It requires no authorization amendment, transaction change, correction service, or new contract family.

Non-blocking metadata correction

The PR description still requests review of the superseded design. It says:

  • assertedAt is protected-effect commit time; and
  • structure, operation, and compliance actions have fixed StructureEvent, InterventionEvent, and GovernanceEvent mappings.

The current candidate now says the opposite on both points. The summary and review-request bullets should be updated before steward approval so the PR surface does not ask reviewers to approve semantics that are no longer present.

Drift and over-design assessment

The prior event-classification drift is closed. Event Grammar and Event Ingress retain ownership of primary-family classification.

No broad new scope drift. The changes remain within AssertionRecord submission semantics:

  • assertion-act provenance;
  • subject-time meaning;
  • correction lineage;
  • optional compatibility with an independently governed semantic event;
  • record commit classification.

They do not alter authorization, approval, transaction coordination, review, promotion, current-state materialization, transport, retention, database authority, or OFARM2 runtime code.

No material over-design. The event-association section is detailed, but it validates AssertionRecord-specific compatibility rather than recreating Event Ingress classification. The temporal profiles are a closed set of nine rows rather than a general expression language. The correction change is one immutable lineage edge rather than a correction workflow.

At machine-materialization time, VERIFIED_OFFLINE_SUBMISSION must bind a real content-addressed assertion-time trust policy and a closed admission result; a mutable label or implementation-local notion of “verified” would not be sufficient. The candidate already places that work in the separately governed evidence-materialization stage, so this is not an additional Phase A blocker.

Final assessment

  • Event-family ownership: closed
  • Assertion time versus commit time: closed
  • Branch-specific subject-time profiles: closed
  • One-anchor narrowing disclosure: closed
  • Correction lineage presence and non-mutation posture: closed
  • Correction-target compatibility: must fix
  • Scope drift: none remaining
  • Architectural over-design: none
  • Phase A disposition: not yet ready for steward semantic approval

Keep PR #23 in draft and do not approve section 17 until the correction-target predicate and stale PR description are repaired at an exact new head.

@samovers

samovers commented Sep 3, 2026

Copy link
Copy Markdown
Owner Author

Re-review requested at exact head 9ac66f6ed5e316880c75a52cbe2e762ea59d06a5.

This revision closes the one remaining correction-target blocker:

  • defines absolute /assertionBody/assertionPosture and /supersedesAssertionRecordBinding intent/result pointers, while identifying /assertionPosture as body-schema-relative notation only;
  • requires the prior assertion to be committed and visible in the authoritative transaction-start snapshot, with a distinct assertion ID;
  • requires exact same assertionType;
  • requires the same typed tenant/deployment boundary and applicable twin, resolved from the current rule-selected authorization view and immutable prior creation/ingress evidence;
  • requires the same authority anchor: exact kind/ref/selector equality for prior v0.2, or direct kind/ref membership in prior v0.1 anchors without ancestry or alias inference;
  • requires the same logical subjectType and subjectRef;
  • retains claim-lineage-only semantics with no acceptance, deactivation, review, in-force, or current-state effect;
  • requires legacy v0.1 creation/ingress proof and fails rather than reconstructing missing governance or commit context from mutable current state; and
  • adds the requested cross-subtype, cross-boundary/twin, wrong-anchor, different-subject, self-reference, and future/uncommitted hostile cases.

The correction check consumes existing authorization-view and immutable prior-creation facts only as integrity inputs. It grants no authority over the prior record and changes no authorization, transaction, evidence, review, or current-state contract.

The PR description is also updated: it no longer says assertedAt is commit time or proposes fixed action-to-event-family mappings.

Validation at this head:

  • local full repository validation suite: PASS
  • GitHub generated-currentness: PASS
  • GitHub repository-validation: PASS

Scope remains one non-authoritative AssertionRecord candidate file. Please re-review this exact head for Phase A semantic approval.

@samovers samovers left a comment

Copy link
Copy Markdown
Owner Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Re-review disposition: No blocking findings

Reviewed PR #23 at current head 9ac66f6ed5e316880c75a52cbe2e762ea59d06a5 against the previously reviewed head 97c9a985767a32bbe4722b472d83ff66f0b5086f.

The delta is one commit modifying only the existing non-authoritative candidate document: 40 additions and 18 deletions. PR #23 remains open, draft, mergeable, and limited to one changed file. Its description now reflects the current design rather than the superseded event-family and commit-time positions.

Previous remaining blocker: closed

The correction relation now has an executable, fail-closed target-compatibility predicate.

A CORRECTION requires exactly one immutable /supersedesAssertionRecordBinding, while INITIAL requires its absence. The document also removes the earlier pointer ambiguity:

  • /assertionBody/assertionPosture is the absolute effect-intent/result pointer;
  • /assertionPosture is explicitly body-schema-relative notation;
  • /supersedesAssertionRecordBinding is a separate absolute top-level pointer.

That prevents a future schema author from creating two posture fields or locating the lineage binding inside an implementation-defined body structure.

Exact correction-target closure

Every correction target must now satisfy all of these conditions:

  1. Prior existence and distinct identity: the exact prior record must already be committed and included in the authoritative transaction-start snapshot and history watermark. Self-reference, a future record, a concurrent record not visible in that snapshot, a merely prospective record, or timestamp-only existence evidence fails.
  2. Same assertion subtype: the old and new records must have exactly the same assertionType.
  3. Same governance boundary: immutable evidence must establish the same typed tenant or deployment boundary and the same applicable twin.
  4. Same authority anchor: a prior v0.2 record requires exact anchor kind, logical reference, and immutable selector equality. A prior v0.1 record requires direct kind/reference membership in its recorded anchors, without ancestry, alias, or inferred-equivalence matching.
  5. Same logical subject: subjectType and subjectRef must match. The subject revision may differ, but correction cannot silently move the claim to another logical subject.
  6. Lineage-only effect: the edge records that the new assertion corrects the prior assertion. It does not alter the prior claim state, review state, acceptance, in-force posture, or current-state contribution.

This closes the concrete exploit identified in the previous review: an actor authorized in one context can no longer attach a correction edge to an unrelated assertion from another subtype, subject, anchor, tenant, deployment, or twin.

Historical-context evidence is handled correctly

The prior AssertionRecord is not allowed to self-attest its tenant, twin, or creation context.

For a v0.2 target created under this profile, resolution uses the exact governed-effect receipt, its effect-intent digest, and the rule-selected extracted governance view. A legacy v0.1 target requires equivalent immutable creation or ingress evidence binding the exact record digest, commit position, governance boundary, twin posture, and recorded anchors.

Missing legacy evidence fails closed. Current storage location, identifier naming conventions, inferred scope ancestry, or caller-provided tenant and twin labels cannot repair the missing proof. This may make some legacy v0.1 records ineligible as correction targets, but it is an explicit compatibility restriction rather than silent reconstruction of facts that the old record did not carry.

Mapping, postcondition, and trace integration

The predicate is not isolated prose. It is integrated into the executable contract surface:

  • AR_CORRECTION_LINEAGE copies the exact binding and requires every section 5.5 condition to pass.
  • PC_CORRECTION_LINEAGE covers prior existence, subtype, governance boundary and twin, anchor, subject, and non-mutation.
  • PC_INPUTS_IMMUTABLE now includes the prior assertion and its creation or ingress evidence.
  • The validation trace records the prior record digest, creation-evidence digest, history position, transaction-start snapshot and watermark, governance context, and each compatibility comparison.
  • The migration section explicitly refuses to reconstruct missing legacy context from current state.
  • The approval card exposes the same-context predicate as a steward decision rather than burying it in implementation guidance.

The hostile cases now cover:

  • missing correction binding;
  • wrong digest or record family;
  • cross-subtype correction;
  • cross-boundary or cross-twin correction;
  • incompatible anchors;
  • different logical subjects;
  • self-reference;
  • future or concurrent targets;
  • lineage on an INITIAL assertion; and
  • treating lineage as acceptance, deletion, deactivation, or current-state replacement.

That coverage tests the observable domain outcomes rather than merely testing a helper function.

Previous closures remain intact

The latest patch does not regress the earlier corrections:

  • Assertion subtype still does not derive primary event family.
  • Optional semantic-event classification remains owned by Event Ingress and appears only in the trace.
  • assertedAt remains governed assertion-act time rather than effectCommittedAt.
  • Online and verified-offline assertion-act postures remain separate.
  • The nine branch-specific subjectTime profiles remain closed.
  • The one-anchor change remains explicitly identified as a narrowing with a lossless-representation stop condition.
  • Every new assertion remains PENDING_REVIEW.
  • Reporter authority remains separate from alleged performer identity and authority.
  • Correction remains a new immutable assertion, not an update operation.
  • ASSERT_OPERATION_CLAIM remains non-executable until the separately owned NOT_REQUIRED atomic transaction profile is closed.

Drift and over-design assessment

No scope drift. The correction predicate remains inside AssertionRecord domain semantics. It consumes authorization and transaction evidence as immutable inputs but does not:

  • add a second authorization target;
  • grant authority over the prior assertion;
  • alter PR #11 path eligibility;
  • change PR #20 transaction semantics;
  • create a review or supersession effect;
  • mutate prior history;
  • introduce current-state behavior.

No new over-design. The patch adds one six-condition compatibility predicate using records and evidence already required by the architecture. It does not introduce a correction workflow, graph-reasoning service, lineage engine, generic relationship language, or mutable context registry.

The strict rule that subtype, governance boundary, twin, anchor, and logical subject must remain the same is deliberately narrow. Broader corrections must enter as a new INITIAL assertion or wait for a separately reviewed correction-relation profile. That is safer than giving body-schema authors an implicit widening mechanism.

At machine materialization, the verified-offline assertion-act evidence projection should explicitly include /supersedesAssertionRecordBinding whenever the posture is CORRECTION, so an importer cannot attach a different lineage target after the recorded assertion act. This follows from the candidate’s existing requirement that offline evidence bind the exact assertion content; it does not require another Phase A architecture amendment.

Both current-head GitHub workflows—repository validation and generated-currentness validation—completed successfully.

Final assessment

  • Previous correction-target blocker: closed
  • Absolute pointer ownership: closed
  • Prior-existence and non-self rule: closed
  • Same-subtype rule: closed
  • Governance-boundary and twin rule: closed
  • Authority-anchor rule: closed
  • Logical-subject rule: closed
  • Legacy compatibility posture: explicit and fail-closed
  • PR-description metadata: corrected
  • New semantic blockers: none
  • Scope drift: none
  • Architectural over-design: none
  • Phase A disposition: ready for exact-head steward semantic approval

Approval should apply specifically to 9ac66f6ed5e316880c75a52cbe2e762ea59d06a5. It would approve only this non-authoritative candidate and its section 17 decisions. It would not merge the PR, accept active RFC law, create or promote schemas, change current/default status, close the missing NOT_REQUIRED transaction profile, or authorize OFARM2 runtime implementation.

@samovers

samovers commented Sep 3, 2026

Copy link
Copy Markdown
Owner Author

Review at 9ac66f6

Checked out this branch alongside pull/11/head and pull/20/head and verified the factual claims against the live heads, the current schemas, and all ten repository examples rather than reading the candidate on its own terms.

Dependency pins and action-row facts are exact

Every claim drawn from PR #11's §7.2 matrix checks out row by row:

Action | Agent posture | Human finalization | Resource policy | Effect subject -- | -- | -- | -- | -- ASSERT_STRUCTURE | HA | FA | RP_SCOPE_ONE | STRUCTURE_ASSERTION ASSERT_OPERATION_CLAIM | PC | NR | RP_SCOPE_ONE | OPERATION_ASSERTION ASSERT_COMPLIANCE | HA | FA | RP_SCOPE_ONE | COMPLIANCE_ASSERTION

So the header's blocking prerequisite is correct and precisely stated: ASSERT_OPERATION_CLAIM really does select NR = NOT_REQUIRED, and PR #20 §5.1 really does put NOT_REQUIRED outside its scope. Carrying that consequence through §3, §10.2, §12, §13, §15, §17, and §18 step 4 — rather than quietly assuming PR #20 covers all three actions — is the strongest thing about this candidate. The §5.2 claim that all three rows select RP_SCOPE_ONE, and the intent-profile and effect-subject rows in §7.2, are likewise exact.

Worth noting alongside the PR #20 review: ASSERT_STRUCTURE and ASSERT_COMPLIANCE are two of PR #11's only four FA rows, so this candidate gives the fresh-approval protocol its first executable domain bindings. That partially answers the concern that the fresh-approval half of PR #20 had nothing to exercise it.

Other verified claims

  • §4.1 inventory matches OFARM_AssertionRecord_schema_v0_1.json field for field: six subtypes, five claimState values including PENDING_REVIEW and IN_FORCE, anchorScopes and evidenceRefs both minItems: 1, and the presence of benefitingPartyRef, notes, provenanceRefs, the flat occurrenceTime / effectiveFrom / effectiveUntil trio, both payload-ref arrays, and both legacy lineage refs.
  • §4.2 subtype and state tally is exactly right: one structure PENDING_REVIEW; five operation claims, one PENDING_REVIEW and four IN_FORCE; three compliance, two PENDING_REVIEW and one IN_FORCE; one LOT_ASSERTION IN_FORCE. All ten do use notes and logical evidence refs, and exactly one uses executionRecordPayloadRefs.
  • §7.3 envelope pointers. /timeSemantics/eventTime, observationTime, decisionTime, effectiveFrom and effectiveUntil all exist on SemanticEventEnvelope v0.1, and the claim that the envelope has no intended-window field is true — so the INTENDED_WINDOW association prohibition is correctly derived rather than assumed.
  • §6.4 payload anchors. InterventionIntentPayload.intendedTimeWindow and ExecutionRecordPayload.effectiveTimeInterval both exist, as does the capturedAt field the section rules out as a substitute.
  • §7.2 commit classes correspond to real Constitution §11.1 baseline classes, and §11.2 correctly keeps them distinct from the §11.2 in-force results (accepted structural state, compliance fact) that §9 forbids creating.
  • Governing inputs. Constitution §§7.24, 7.25, 10.1–10.3, 10.10a, 10.11 all exist, as do the Temporal Field Conformance Matrix v0.1 and the Quantity-Bearing Intervention and As-Applied RFC v0.1.
  • Trace vocabulary. §11.2 carries PR RFC candidate: final ReviewDecision protected-effect contract #17's NOT_APPLICABLE / NOT_EVALUATED distinction verbatim, including the prerequisite-enumeration requirement and the §13 conformance row. Consistent across the two domain contracts.
  • Hygiene. One file, 750 insertions, tables column-consistent, no trailing whitespace, no tabs.

Findings

1. §5.5's history-position input is not among PR #20's trusted transaction inputs

§5.5 condition 1 requires:

the authoritative transaction-start snapshot and its history watermark prove that the exact bound prior record was already committed at a canonical-history position included in that snapshot

§11.2 makes the same input load-bearing in the trace ("committed canonical-history position and transaction-start snapshot/watermark").

PR #20 §10.2 enumerates the trusted values the runtime supplies at transaction start: transactionAttemptId, transactionStartedAt, transactionDeadline, transactionSnapshotRef plus digest, persistence-boundary identity, isolation/commit-guard mode, the transaction-status lookup key, and — the only watermark clause — "exact currentness watermarks or predicate-version guards needed for negative and set-valued facts."

A prior-record-exists-and-precedes check is a positive, ordered fact. It may well be implied by transactionSnapshotRef, but canonical-history position is not in PR #20's enumerated set, and PR #20 §10.2 closes with "the caller, requesting agent, approver, UI, and domain result cannot choose or extend those values" — which reads as a closed list.

This matters because the document's discipline elsewhere is to name unclosed dependencies rather than assume them: §3's stop conditions, §12's operation-claim paragraph, §15's bundle caveat, and §18 step 4 all do exactly that for the NOT_REQUIRED gap. §18 step 6 lists "applicable immutable prior-creation/ingress evidence" as something to materialize but never names the history-position input. Suggest either adding it to §3's stop conditions and §18 step 6, or stating explicitly that transactionSnapshotRef already supplies canonical-history ordering.

2. Three factual errors in §4.2

The subtype and state tally is exact, but the sentences after it are not:

  • "six use logical provenance refs" — seven do. All except orchard_row_count, field_17_buffer_zone_compliance, and lot_compliance_field_17_apples_batch_1.
  • Multi-anchor usage is understated. §4.2 names one multi-anchor example. Three examples carry more than one anchor: field_17_contractor_spot_spray_claim_with_execution_payload (FIELD + CROP_CYCLE), seed_lot (LOT + FIELD, out of scope as a LOT_ASSERTION), and lot_compliance_field_17_apples_batch_1 (LOT + FIELD, a COMPLIANCE_ASSERTION and therefore in scope).
  • Two examples are conflated. "one operation claim uses a loose executionRecordPayloadRefs entry. That late-syncoperation claim also carries both field and crop-cycle anchors." These are different records. The payload-ref example is field_17_contractor_spot_spray_claim_with_execution_payload. The late-sync example is service_provider_field17_delayed_sync_execution_claim, which carries a single FIELD anchor and no payload ref — and is the record that §6.5's T1 < T2 < T3 worked example and the matching §13 hostile case are about.

The multi-anchor undercount is the substantive one. §5.2's NARROWING carries a real stop rule — "if a valid assertion represented by v0.1's multi-anchor form cannot be carried losslessly through these four elements, v0.2 materialization stops" — and §18 step 8 calls for conformance over "multi-context single-anchor representation." Both are calibrated against the evidence in §4.2. Missing that a compliance assertion is also multi-anchor understates that surface, and compliance is one of the two actions PR #20 can currently execute. PR #11's own ledger classifies ASSERT_COMPLIANCEas MIXED_DELTA with submission scope removed as an authority-target branch, which makes LOT + FIELD compliance claims exactly the case worth naming.

3. Commit-class spelling departs from the Constitution and from PR #17

Constitution §11.1 spells the baseline classes in lowercase prose: structure assertion, operation claim, compliance assertion. PR #17 followed that, writing its class as governance decision in §8.3, §10 and PC_CLASSIFICATION.

§7.2 and §8.3 here use STRUCTURE_ASSERTION, OPERATION_CLAIM, and COMPLIANCE_ASSERTION. The commit class is Constitution-owned vocabulary, not a contract-local enum, and STRUCTURE_ASSERTION in particular now denotes three different things in one table — effect-subject kind, assertionType, and commit class — with the uppercase form making them look like the same token. Suggest the Constitution's spelling, as PR #17 used.

4. §7.3 gives time comparisons exact pointers but leaves subject and scope in prose

Item 5 requires "exact envelope time selector pointers" and the closing paragraph names them literally. Items 3 and 4 say only that the subject "occurs in the envelope's subject set" and the anchor pair "occurs in the envelope's anchor-scope set." The envelope's fields are subjectRefs and anchorScopes; neither is named.

In a document that elsewhere distinguishes absolute /assertionBody/assertionPosture from body-root-relative /assertionPosture to head off exactly this ambiguity, leaving two of the four compatibility comparisons unpointered is inconsistent.

Related, smaller: SemanticEventEnvelope v0.1 carries its own top-level primaryEventFamily. §7.3 item 2 says Event Ingress supplies the family and this contract "consumes but does not recompute" it, but never says which value wins if the envelope's own field diverges from the Ingress classification. §13's row for a family change without matching dominant semantics defers to Ingress and probably covers it, but one clause stating that the gate's classification is authoritative over the envelope field would close it.


Disposition

Approve once §4.2 is corrected and §5.5's history-position dependency is either disclosed or shown to be covered.

Neither finding is a contradiction. Finding 2 is a factual error in the inventory that other sections lean on, and finding 1 is an undisclosed cross-document dependency in a candidate whose principal virtue is disclosing them — the NOT_REQUIRED handling is a model of it, which is what makes the omission stand out. Findings 3 and 4 are consistency items best fixed before schema materialization.

@samovers

samovers commented Sep 3, 2026

Copy link
Copy Markdown
Owner Author

Exact-head re-review requested for e8402eb9eb3e98aaa56149854e02c4b38e7a0364.

The latest deep-verification findings are addressed:

  • Section 4.2 now reports the fixture inventory exactly: 10 examples, 7 with provenanceRefs, 3 named multi-anchor examples, and 1 with executionRecordPayloadRefs. The delayed-sync example is identified separately as single-anchor with no execution payload reference.
  • The unsupported canonical-history position/general-watermark dependency is removed. Prior existence now requires positive committed-record resolution in the trusted transaction-start snapshot identified by transactionSnapshotRef plus its snapshot digest. Immutable creation/ingress evidence remains integrity proof, not a substitute history watermark.
  • Commit classification now distinguishes the constitutional labels structure assertion, operation claim, and compliance assertion from the current Event Ingress serialization tokens STRUCTURE_ASSERTION, OPERATION_CLAIM, and COMPLIANCE_ASSERTION.
  • Optional event association now requires exact equality between the authoritative Event Ingress family and envelope /primaryEventFamily, assertion-subject membership in envelope /subjectRefs, and typed assertion-scope membership in envelope /anchorScopes, with matched indices/proofs bound into the trace.

Validation at this exact head:

  • git diff --check: pass
  • python3 package_meta/tools/run_repository_validation_suite.py: pass
  • GitHub generated-currentness checks: 2/2 pass
  • GitHub repository-validation checks: 2/2 pass

Scope remains one non-authoritative Phase A candidate file inside the AssertionRecord submission semantics and commit classification trust boundary. No authorization, transaction, Event Ingress, review, schema, runtime, currentness, or OFARM2 boundary changed.

Please re-review this exact head for steward semantic approval.

@samovers samovers left a comment

Copy link
Copy Markdown
Owner Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Re-review disposition: Request one bounded change

Reviewed PR #23 at exact head e8402eb9eb3e98aaa56149854e02c4b38e7a0364 against the previously reviewed head 9ac66f6ed5e316880c75a52cbe2e762ea59d06a5.

The delta is one commit modifying only the existing non-authoritative candidate document: 34 additions and 24 deletions. PR #23 remains open, draft, mergeable, and limited to one changed file. The PR description now accurately reflects the current transaction-snapshot, commit-class, semantic-event, temporal, and correction-lineage positions.

Source-verification findings

1. Fixture inventory: closed

Section 4.2 now reports the repository examples correctly:

  • ten AssertionRecord examples;
  • seven with provenanceRefs;
  • exactly one with executionRecordPayloadRefs;
  • three multi-anchor examples, including the in-scope compliance assertion with LOT and FIELD anchors;
  • the delayed-sync operation claim correctly identified as a separate single-anchor example without an execution-payload reference.

This repairs the factual basis supporting the one-anchor narrowing and ensures the later conformance work includes both operation and compliance multi-context cases.

2. Unsupported canonical-history-position input: closed

The correction predicate no longer assumes a separate canonical-history position or general history watermark.

It now requires the prior assertion to resolve as an already committed positive record inside the immutable transaction-start snapshot identified by:

  • trusted transactionSnapshotRef; and
  • the corresponding snapshot digest.

A future, concurrent, unresolved, prospective, self-referential, or timestamp-only target fails. Immutable creation or ingress evidence continues to prove the prior record’s governance context, but no longer pretends to provide an additional ordering watermark.

This is consistent with PR #20, whose trusted finalization inputs explicitly include transactionSnapshotRef and its snapshot digest or equivalent immutable proof. The AssertionRecord contract is therefore consuming an existing transaction input rather than extending the transaction contract locally.

The trace and steward card were updated consistently: they now bind positive prior-record resolution in the trusted snapshot and explicitly state that no separate history-position or general-watermark input is assumed.

3. Commit-class terminology: closed

The candidate now distinguishes:

Semantic level Values
Constitutional commit-class labels structure assertion, operation claim, compliance assertion
Current Event Ingress serialization tokens STRUCTURE_ASSERTION, OPERATION_CLAIM, COMPLIANCE_ASSERTION

That is the correct separation. The Event Grammar defines the lowercase semantic classes, while the current CommitIngress schema serializes them using uppercase enum tokens. The candidate now binds both without treating the transport/schema spelling as the constitutional concept itself.

This also removes the earlier ambiguity in which STRUCTURE_ASSERTION appeared to be simultaneously the authorization effect-subject kind, AssertionRecord subtype, and constitutional commit class.

4. Semantic-event association pointers and family precedence: closed

The optional event-association rule now identifies exact fields:

  • assertion /subject/subjectRef against envelope /subjectRefs;
  • assertion /anchorScopes/0/scopeType and /anchorScopes/0/scopeRef against an entry in envelope /anchorScopes;
  • envelope /primaryEventFamily against the authoritative Event Ingress classification;
  • exact time selectors under /timeSemantics.

The Event Ingress classification is authoritative and must equal the envelope’s stored /primaryEventFamily. A divergence fails Event Ingress rather than creating a local choice inside the AssertionRecord contract. The trace records the envelope and classification values, equality disposition, subject/scope match information, time comparisons, and applicable relationship proofs.

Those pointers correspond to actual required fields in the current SemanticEventEnvelope v0.1 schema.

Remaining blocker — duplicate direct matches have no deterministic index rule

The current SemanticEventEnvelope schema allows duplicate array entries:

  • /subjectRefs has minItems, but no uniqueness constraint;
  • /anchorScopes has minItems, but no uniqueness constraint.

The revised contract now requires the validation trace to record matched /subjectRefs and /anchorScopes indices. It also says that the matched envelope anchor index is recorded. It does not specify which index is selected when the same value occurs more than once.

For example, this envelope is schema-valid:

{
  "subjectRefs": [
    "operation:field-17:spray-1",
    "operation:field-17:spray-1"
  ],
  "anchorScopes": [
    {
      "scopeType": "FIELD",
      "scopeRef": "field:17"
    },
    {
      "scopeType": "FIELD",
      "scopeRef": "field:17"
    }
  ]
}

Both index 0 and index 1 satisfy each direct-membership test. One implementation could record index 0; another could record index 1. They would:

  • consume the same envelope bytes and digest;
  • reach the same semantic pass/fail result;
  • but produce different immutable validation-trace bytes and trace digests.

That violates the candidate’s deterministic, content-addressed trace posture. The issue is not whether duplicate entries should be encouraged. The issue is that they are currently schema-valid and therefore the matching projection needs an exact rule.

Smallest required patch

Add one local tie-break rule to section 7.3:

For direct subject or anchor membership, the matched index is the lowest zero-based array index whose value satisfies the exact comparison.

Also state:

  • when direct subject membership succeeds, record that lowest /subjectRefs index;
  • when direct anchor membership succeeds, record that lowest /anchorScopes index;
  • when a relationship-proof path is used instead of direct subject membership, the direct-match index is absent and the exact immutable proof binding is recorded;
  • duplicate identical entries do not create additional semantic effects;
  • the full envelope digest continues to bind every duplicate entry.

Add one hostile case:

A schema-valid envelope contains duplicate exact subject and/or anchor entries.

Required result:

every conforming implementation selects the same lowest zero-based index
and produces the same validation-trace bytes and digest

An alternative deterministic rule—recording every matching index in ascending order—would also work, but the lowest-index rule is the smaller patch.

Do not amend SemanticEventEnvelope v0.1, introduce uniqueItems, redesign Event Ingress, or add a generic matching framework. This is one contract-local projection rule.

Previous semantic closures remain intact

The latest commit does not regress the previously approved substance:

  • Assertion subtype does not derive primary event family.
  • Event classification remains owned by Event Ingress.
  • assertedAt remains governed assertion-act time rather than effectCommittedAt.
  • Online and verified-offline assertion-act postures remain separate.
  • The nine branch-specific subjectTime profiles remain closed.
  • The one-anchor change remains an explicit narrowing with a lossless-representation stop condition.
  • Correction targets remain restricted to an already committed, distinct assertion with the same subtype, governance boundary, twin, authority anchor, and logical subject.
  • Correction lineage remains claim lineage only and does not mutate or deactivate the prior record.
  • Every submitted assertion remains PENDING_REVIEW.
  • Reporter authority remains separate from alleged performer identity and authority.
  • ASSERT_OPERATION_CLAIM remains blocked on the separately governed NOT_REQUIRED atomic transaction profile.

Drift and over-design assessment

No material scope drift. The latest commit corrects factual inventory, removes an unsupported transaction input, separates semantic labels from machine tokens, and makes existing event-association comparisons exact. It does not change authorization, transaction coordination, Event Ingress classification, review, promotion, current-state materialization, transport, retention, database authority, or OFARM2 runtime code.

No new architectural over-design. The remaining requested change is a one-sentence deterministic tie-break plus one hostile case. It adds no new schema family, event model, matching service, uniqueness rule, workflow layer, or mutable registry.

All four current-head GitHub checks completed successfully: two generated-currentness checks and two repository-validation checks. These prove repository hygiene, not the missing semantic tie-break.

Final assessment

  • Fixture inventory corrections: closed
  • Transaction-snapshot dependency: closed
  • Commit-class semantic label versus machine token: closed
  • Event-family authority and exact pointers: closed
  • Previous correction-target predicate: preserved
  • Duplicate direct-match index determinism: must fix
  • Scope drift: none
  • Architectural over-design: none
  • Phase A disposition: not yet ready for exact-head steward approval

Keep PR #23 in draft and do not approve section 17 until the direct-match index tie-break is closed at an exact new head. After that bounded correction, no other semantic blocker is presently identified.

@samovers

samovers commented Sep 3, 2026

Copy link
Copy Markdown
Owner Author

Exact-head re-review requested for 622376e2998cf8b3954ca19e81d2cce6fd57e5fe.

The remaining deterministic-projection blocker is closed with one bounded candidate-file correction:

  • Direct subject comparison now precedes the relationship-proof alternative.
  • When one or more exact /subjectRefs matches exist, the lowest zero-based matching index is selected and recorded.
  • The relationship-proof path is available only when no direct subject match exists; on that path the direct-match index is absent and the exact immutable proof binding is recorded.
  • Exact anchor matching selects and records the lowest zero-based matching /anchorScopes index.
  • Duplicate exact subject or anchor entries create no additional semantic effects, while the full envelope digest continues to bind every duplicate entry.
  • A schema-valid duplicate-entry hostile case requires every conforming implementation to produce the same validation-trace bytes and digest.
  • The steward approval card exposes the deterministic rule explicitly.

Validation at this exact head:

  • git diff --check: pass
  • full repository validation suite: pass
  • GitHub generated-currentness checks: 2/2 pass
  • GitHub repository-validation checks: 2/2 pass

Scope remains one non-authoritative Phase A candidate file inside the AssertionRecord submission semantics and commit classification trust boundary. No Event Ingress schema, authorization, transaction, review, runtime, currentness, or OFARM2 boundary changed.

Please re-review this exact head for steward semantic approval.

@samovers

samovers commented Sep 3, 2026

Copy link
Copy Markdown
Owner Author

Re-review at 622376e

Two new commits since 9ac66f6. PR #11 (03a21f6) and PR #20 (98f8c4f) are both
unchanged, so all pins remain exact and current. Still one file, now 763 insertions.

Withdrawing a finding from the prior review

The prior round flagged the uppercase commit-class spelling as departing from the
Constitution and from PR #17. That finding was wrong and is withdrawn.

CommitIngressRequest, CommitIngressResult, and PromotionTrace v0.1 all carry a
commitClass enum whose values are exactly NOTE, OBSERVATION_ASSERTION,
HYPOTHESIS_ASSERTION, STRUCTURE_ASSERTION, OPERATION_CLAIM, EVIDENCE_RECORD,
COMPLIANCE_ASSERTION, GOVERNANCE_DECISION, ADVISORY_OUTPUT. The original uppercase
tokens were the real machine serialization, not an invention — the prior review checked
the Constitution's prose list and did not check the schemas. GOVERNANCE_DECISION in that
same enum also means PR #17's lowercase form is the prose label rather than the only
correct spelling.

The revision is better than either version, though. Pairing the constitutional label with
the parenthesized ingress token, and stating that "a token does not redefine the
constitutional class or make an identically spelled effect-subject or assertion-subtype
token the same semantic dimension," resolves the genuine hazard — that
STRUCTURE_ASSERTION denotes three different dimensions in one §7.2 row — without
pretending the uppercase form was unfounded.

Resolved

The history-position dependency is gone rather than papered over. §5.5 condition 1 now
resolves the prior record as a committed positive record in the snapshot identified by
transactionSnapshotRef and its digest, and states outright that "this contract assumes no
separate canonical-history position or general history watermark." transactionSnapshotRef
is in PR #20 §10.2's enumerated trusted inputs, so the dependency is now satisfied by
something that actually exists. §11.2 and §14 were updated consistently, and the only
surviving mention of the old terms is the disclaimer itself. Dropping an unsupported
assumption is the right fix here — better than asserting a new PR #20 input.

§4.2 now matches the repository exactly. I re-counted all ten examples: seven use
provenanceRefs; field_17_contractor_spot_spray_claim_with_execution_payload is the sole
payload-ref example and carries FIELD + CROP_CYCLE;
lot_compliance_field_17_apples_batch_1 is the in-scope compliance assertion with LOT +
FIELD; seed_lot is the out-of-scope LOT_ASSERTION with LOT + FIELD; and
service_provider_field17_delayed_sync_execution_claim has one FIELD anchor and no
payload ref. Every figure and label in the new text is correct, and separating the
delayed-sync example — which §6.5 and §13 actually build on — from the payload example
fixes the conflation.

§7.3 is now pointer-exact, and goes further than asked. /subject/subjectRef against
/subjectRefs, and /anchorScopes/0/{scopeType,scopeRef} against an envelope
/anchorScopes entry pair — all four field paths exist with the shapes claimed, and
subjectRefs is an array of strings so membership is well-defined. The
/primaryEventFamily equality rule closes the divergence question the prior review raised,
and correctly routes divergence to an Event Ingress failure rather than a local choice.

The determinism work in 622376e addresses a problem the prior review only gestured at.
Neither subjectRefs nor anchorScopes declares uniqueItems, so duplicate exact entries
are schema-valid — which means index selection genuinely could have varied between
conforming implementations and produced different validation-trace bytes and digests. The
lowest-zero-based-index rule, the direct-match-precedes-proof ordering, and the §13 row
requiring every conforming implementation to produce the same trace bytes are a real
closure of a production-reachable non-determinism, not a theoretical one.

One small observation

§7.3 item 3 gives subject matching a relationship-proof fallback when no direct
/subjectRefs match exists. Item 4 gives anchor matching no equivalent — the sole anchor
pair must equal an envelope entry exactly or the association fails.

That asymmetry is defensible: §5.2 already establishes that contextual bindings grant no
authority and never become anchors, so requiring the authority-bearing anchor to appear
literally in the event's own scope set is the stricter and safer reading. But an assertion
anchored at CROP_CYCLE associated with an envelope scoped only at FIELD now fails even
where the relationship is provable, and the document explains nearly every other asymmetry
it creates. One clause saying the anchor comparison is deliberately strict because the
anchor is the authority-bearing element would close it.

Verified unchanged

Hygiene is clean — tables column-consistent, no trailing whitespace, no tabs, one file. The
NR / FA / RP_SCOPE_ONE action-row facts, effect-subject and intent-profile rows,
subtype and state tally, v0.1 schema inventory, envelope time-selector pointers, payload
field names, and governing-input references all still verify against the live heads and
current schemas.

Disposition

Approve. No blocking findings, and none were blocking in the prior round either — one of
the four was reviewer error. The remaining item is a one-clause explanation, not a change
in behavior.

@samovers

samovers commented Sep 3, 2026

Copy link
Copy Markdown
Owner Author

Steward semantic approval — granted

I explicitly grant Phase A semantic approval for the AssertionRecord submission protected-effect contract candidate at commit 622376e2998cf8b3954ca19e81d2cce6fd57e5fe, following the exact-head source-verified review whose disposition is Approve.

This approval accepts the complete candidate and its section 17 approval-card decisions at that exact head, including:

  • the three action-to-result-subtype mappings and the constitutional commit-class label/current Event Ingress token pairs;
  • the fixed PENDING_REVIEW result posture without acceptance, review, or current-state effects;
  • the selected authority subject, governed assertion-act time, online/offline assertion-act provenance, and nine closed subject-time profiles;
  • the explicit one-anchor NARROWING with lossless typed subject/body context and immutable relationship proofs;
  • optional correction lineage with exact prior-record binding and the same-subtype, governance-boundary/twin, authority-anchor, logical-subject, committed-snapshot, and non-self target predicate;
  • optional semantic-event association that consumes but does not derive Event Ingress classification, requires exact family/subject/scope/time/dominant-context compatibility, and deterministically selects the lowest zero-based direct-match indices;
  • direct-subject-match precedence over the relationship-proof fallback, duplicate-entry semantic inertness, and full-envelope digest binding;
  • the reporter/performer and performer-authority separation for operation claims;
  • the separate unclosed NOT_REQUIRED transaction prerequisite for ASSERT_OPERATION_CLAIM; and
  • the matching mappings, postconditions, hostile cases, traceability, staged boundaries, and dependency stops.

The approved primary trust boundary is AssertionRecord submission semantics and commit classification. PR #23 stayed within that boundary as a one-file, draft, non-authoritative Phase A candidate. Authorization law remains governed by exact approved PR #11 head 03a21f669ee04f96d444e14f00ae7212cab04803. The governed fresh-human-approval transaction modes remain governed by exact approved PR #20 head 98f8c4fafbae42c8f7fd931f43f53adcb4733713. The missing NOT_REQUIRED transaction profile, Event Ingress, review and promotion, schemas and machine contracts, runtime implementation, currentness, transport, retention, database authority, encryption, key custody, and OFARM2 remain separately governed.

This decision does not:

  • accept, merge, or promote the RFC;
  • create or promote schemas or machine contracts;
  • change active or default law or currentness;
  • authorize runtime or OFARM2 implementation;
  • approve the missing NOT_REQUIRED transaction path; or
  • amend Event Ingress, authorization, transaction, review, transport, retention, database, encryption, or custody semantics.

The review's non-blocking anchor-comparison observation is understood as follows: direct anchor equality is deliberately stricter than subject association because the sole anchor is the authority-bearing element. This records the rationale for the approved behavior; it adds no relationship-proof fallback and does not amend the candidate.

Any later semantic change to PR #23 requires renewed exact-head review and approval. PR #23 remains draft as the durable candidate and approval record.

What is next: preserve this exact approved candidate while selecting the next separately governed issue.

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.

Define AssertionRecord protected-effect contract

1 participant