Skip to content

core: Veridicality module — Provenance + Claim<'T> + validate predicates (5th graduation)#309

Merged
AceHack merged 1 commit intomainfrom
feat/veridicality-provenance-claim-types-graduation-5
Apr 24, 2026
Merged

core: Veridicality module — Provenance + Claim<'T> + validate predicates (5th graduation)#309
AceHack merged 1 commit intomainfrom
feat/veridicality-provenance-claim-types-graduation-5

Conversation

@AceHack
Copy link
Copy Markdown
Member

@AceHack AceHack commented Apr 24, 2026

Summary

Fifth Amara-graduation — foundation for the bullshit-detector / veridicality-scoring module. Ships input types + minimum-validity gate from Amara's 10th ferry (PR #294 docs/aurora/*-deep-research-report-10th-ferry.md).

Surface

  • Veridicality.Provenance record (7 fields matching Amara's spec verbatim)
  • Veridicality.Claim<'T> record polymorphic over payload
  • Veridicality.validateProvenance : Provenance -> bool
  • Veridicality.validateClaim : Claim<'T> -> bool

Attribution (two-layer, per Otto-112 memory)

  • Aaron = concept origin (bullshit-detector / provenance-aware-scoring framing in bootstrap conversation BEFORE Amara ferries formalized it; Aaron Otto-112: "bullshit, it was in our conversation history too, not just her ferry")
  • Amara = formalization (7th-10th ferries)
  • Otto = implementation

Module name is Veridicality not BullshitDetector per Otto-112 naming rule — formal term for the scorable (how true-to-reality a claim looks); "bullshit = 1 - veridicality" stays informal.

Retraction-native compatibility

validateClaim does NOT inspect Weight — a retraction-claim (Weight=-1) is valid if provenance is valid. Retraction semantics live at the ledger level, not claim-validity. Matches Zeta's ZSet signed-weight discipline (Otto-73).

Test plan

  • 10 tests passing
  • Build 0 Warning / 0 Error
  • Covers all required-field failures + BuilderId=None (not a hard gate)
  • Polymorphic test (payload type doesn't affect validation)
  • Negative-Weight test (retraction-native semantics)

SPOF (per Otto-106)

Pure data types + pure validation function; no external deps; no SPOF introduced. Downstream scorers combining across many claims use RobustStats.robustAggregate (PR #295) for outlier resistance.

Next graduation queue

  • antiConsensusGate — smallest follow-up, uses Provenance
  • SemanticCanonicalization / CanonicalClaimKey (8th ferry)
  • scoreVeridicality — the composite function (9th B(c) or 10th BS(c) choice needs ADR)

🤖 Generated with Claude Code

Copilot AI review requested due to automatic review settings April 24, 2026 06:36
@AceHack AceHack enabled auto-merge (squash) April 24, 2026 06:36
…e/Claim — 5th graduation

Ships the foundation for the bullshit-detector / veridicality-
scoring module — the `Provenance` and `Claim<'T>` input types
plus the minimum-provenance-validity predicate from Amara's 10th
ferry (PR #294 `docs/aurora/2026-04-23-amara-aurora-deep-research-
report-10th-ferry.md`).

Fifth graduation under the Otto-105 cadence.

Naming (per Otto-112 memory feedback_veridicality_naming_for_
bullshit_detector_graduation_aaron_concept_origin_amara_
formalization_2026_04_24):
- Module: `Veridicality` (NOT `BullshitDetector` — informal
  "bullshit" stays in comments/commit-message etymology,
  programmatic surface uses the formal term)
- `Veridicality` = how true-to-reality a claim looks; the
  scorable. Bullshit = 1 - veridicality (informal).

Attribution (two-layer per Otto-104/111/112 pattern):
- Aaron = concept origin (bullshit-detector / provenance-aware-
  scoring framing present in bootstrap conversation at
  `docs/amara-full-conversation/**` before Amara's ferries
  formalized it; Aaron Otto-112: "bullshit, it was in our
  conversation history too, not just her ferry")
- Amara = formalization (7th ferry veridicality formula
  V(c) = σ(β₀ + β₁(1-P) + ...), 8th ferry semantic-canonicalization
  "rainbow table" + quantum-illumination grounding, 9th/10th
  ferries 7-feature BS(c) composite + oracle-rule specification)
- Otto = implementation (this and subsequent graduations)

Surface:
- Veridicality.Provenance record — 7 fields (SourceId,
  RootAuthority, ArtifactHash, BuilderId option, TimestampUtc,
  EvidenceClass, SignatureOk) matching Amara's 10th-ferry spec
  verbatim
- Veridicality.Claim<'T> record — 4 fields (Id, Payload 'T,
  Weight int64, Prov) polymorphic over payload type
- Veridicality.validateProvenance : Provenance -> bool —
  minimum-validity gate (non-empty SourceId/RootAuthority/
  ArtifactHash + SignatureOk=true); matches Amara's snippet
- Veridicality.validateClaim : Claim<'T> -> bool —
  convenience alias, wraps validateProvenance on claim's Prov

Negative-Weight semantics (per Z-set retraction-native algebra):
validateClaim does NOT inspect Weight; a retraction-claim
(Weight = -1) is valid if its provenance is valid. Retraction
semantics live at the ledger level, not the claim-validity
level. Matches Zeta's existing ZSet signed-weight discipline
(Otto-73 retraction-native-by-design).

What this DOESN'T ship:
- Veridicality scorer (Amara's V(c) / BS(c)) — next graduation
- antiConsensusGate (needs Provenance; small follow-up)
- SemanticCanonicalization (rainbow-table canonical-claim-key)
- OracleVector (aggregated scoring vector)

Tests (10, all passing):
- validateProvenance: accepts fully-populated, rejects on each
  required-field violation, accepts BuilderId=None (not a hard gate)
- validateClaim: wraps prov validation, polymorphic over Payload,
  rejects bad-prov claims
- Claim supports negative Weight (retraction semantics)

Build: 0 Warning / 0 Error. `dotnet test --filter
FullyQualifiedName~Veridicality` reports 10/10 passed.

SPOF consideration (per Otto-106): pure data types + pure
validation function; no external deps; no SPOF introduced.
Downstream scorers that combine provenance across many claims
should use RobustStats.robustAggregate (PR #295) for outlier-
resistant combination, not arithmetic mean.

Composes with:
- src/Core/RobustStats.fs (PR #295) — 1st graduation
- src/Core/TemporalCoordinationDetection.fs (PR #297 + #298 +
  pending #306) — parallel module for the firefly-network arc

Next graduation queue:
- antiConsensusGate (10th ferry; uses Provenance)
- SemanticCanonicalization / CanonicalClaimKey (8th ferry)
- scoreVeridicality (Amara's V(c) or BS(c) composite — ADR needed)

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
@AceHack AceHack force-pushed the feat/veridicality-provenance-claim-types-graduation-5 branch from e6fe56f to cd2db11 Compare April 24, 2026 06:37
@AceHack AceHack merged commit 992c91f into main Apr 24, 2026
11 checks passed
@AceHack AceHack deleted the feat/veridicality-provenance-claim-types-graduation-5 branch April 24, 2026 06:39
Copy link
Copy Markdown

Copilot AI left a comment

Choose a reason for hiding this comment

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

Pull request overview

Adds the initial Core “Veridicality” surface area (provenance + generic claims) plus simple validity predicates, with accompanying unit tests.

Changes:

  • Introduces Zeta.Core.Veridicality with Provenance, Claim<'T>, validateProvenance, and validateClaim.
  • Registers the new Core module in src/Core/Core.fsproj.
  • Adds and registers xUnit tests for provenance/claim validation behavior.

Reviewed changes

Copilot reviewed 4 out of 4 changed files in this pull request and generated 4 comments.

File Description
src/Core/Veridicality.fs New module defining provenance/claim records and validation predicates.
src/Core/Core.fsproj Adds Veridicality.fs to compilation order.
tests/Tests.FSharp/Algebra/Veridicality.Tests.fs New unit tests covering provenance/claim validation cases.
tests/Tests.FSharp/Tests.FSharp.fsproj Registers the new Veridicality test file.

Comment thread src/Core/Veridicality.fs
Comment on lines +111 to +115
let validateProvenance (p: Provenance) : bool =
p.SourceId <> ""
&& p.RootAuthority <> ""
&& p.ArtifactHash <> ""
&& p.SignatureOk
Copy link

Copilot AI Apr 24, 2026

Choose a reason for hiding this comment

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

validateProvenance treats null strings as valid because null <> "" evaluates to true in F#. That means SourceId = null / RootAuthority = null / ArtifactHash = null would incorrectly pass the minimum-validity gate. Consider using String.IsNullOrWhiteSpace (or at least String.IsNullOrEmpty) for these fields so both null and whitespace-only values are rejected.

Copilot uses AI. Check for mistakes.
Comment thread src/Core/Veridicality.fs
Comment on lines +54 to +56
/// (`docs/aurora/2026-04-23-amara-aurora-deep-research-
/// report-10th-ferry.md` §ADR-style spec for oracle rules and
/// implementation).
Copy link

Copilot AI Apr 24, 2026

Choose a reason for hiding this comment

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

The doc comment cites docs/aurora/2026-04-23-amara-aurora-deep-research-report-10th-ferry.md, but that file doesn't exist under docs/aurora/ in this repo. Please update the reference to an existing absorb doc (or add the missing document) so readers can actually follow the provenance/spec link.

Suggested change
/// (`docs/aurora/2026-04-23-amara-aurora-deep-research-
/// report-10th-ferry.md` §ADR-style spec for oracle rules and
/// implementation).
/// in the ADR-style oracle-rules and implementation spec for
/// the 10th ferry.

Copilot uses AI. Check for mistakes.
Comment thread src/Core/Veridicality.fs
Comment on lines +27 to +36
/// scoring framing is Aaron's design, present in the bootstrap
/// conversation (`docs/amara-full-conversation/**`) before
/// Amara's ferries formalized it. Aaron 2026-04-24 Otto-112:
/// *"bullshit, it was in our conversation history too, not
/// just her ferry."*
/// * **Formalization** — Amara (7th/8th/9th/10th ferries):
/// veridicality formula, semantic-canonicalization "rainbow
/// table", oracle-rule specification, 7-feature composite.
/// * **Implementation** — Otto, under the Otto-105 graduation
/// cadence. Fifth graduation.
Copy link

Copilot AI Apr 24, 2026

Choose a reason for hiding this comment

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

This attribution block uses personal names in a code doc comment. Repo convention is to avoid name attribution in code/docs/skills (see docs/AGENT-BEST-PRACTICES.md:284-290) and use role-based references instead ("human maintainer", "architect", etc.), keeping personal-name history in the designated history/memory locations. Please rewrite this section to comply with that convention.

Suggested change
/// scoring framing is Aaron's design, present in the bootstrap
/// conversation (`docs/amara-full-conversation/**`) before
/// Amara's ferries formalized it. Aaron 2026-04-24 Otto-112:
/// *"bullshit, it was in our conversation history too, not
/// just her ferry."*
/// * **Formalization** — Amara (7th/8th/9th/10th ferries):
/// veridicality formula, semantic-canonicalization "rainbow
/// table", oracle-rule specification, 7-feature composite.
/// * **Implementation** — Otto, under the Otto-105 graduation
/// cadence. Fifth graduation.
/// scoring framing is present in the bootstrap conversation
/// (`docs/amara-full-conversation/**`) before the subsequent
/// formalization ferries. The core idea predates the later
/// ferry-specific formulations.
/// * **Formalization** — subsequent ferries (7th/8th/9th/10th):
/// veridicality formula, semantic-canonicalization "rainbow
/// table", oracle-rule specification, 7-feature composite.
/// * **Implementation** — current implementation under the
/// graduation cadence. Fifth graduation.

Copilot uses AI. Check for mistakes.
Comment thread src/Core/Veridicality.fs
Comment on lines +95 to +102
/// Matches Amara's 10th-ferry snippet:
///
/// ```
/// let validateProvenance c =
/// c.Prov.SourceId <> ""
/// && c.Prov.RootAuthority <> ""
/// && c.Prov.ArtifactHash <> ""
/// && c.Prov.SignatureOk
Copy link

Copilot AI Apr 24, 2026

Choose a reason for hiding this comment

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

The snippet shown as "Matches Amara's 10th-ferry snippet" uses c.Prov.*, but validateProvenance here accepts a Provenance and accesses p.*. As written, the snippet no longer matches the function signature and can mislead readers; either update the snippet to match Provenance or move it under validateClaim (which actually takes a claim).

Suggested change
/// Matches Amara's 10th-ferry snippet:
///
/// ```
/// let validateProvenance c =
/// c.Prov.SourceId <> ""
/// && c.Prov.RootAuthority <> ""
/// && c.Prov.ArtifactHash <> ""
/// && c.Prov.SignatureOk
/// Matches Amara's 10th-ferry snippet after projecting to
/// bare provenance:
///
/// ```
/// let validateProvenance p =
/// p.SourceId <> ""
/// && p.RootAuthority <> ""
/// && p.ArtifactHash <> ""
/// && p.SignatureOk

Copilot uses AI. Check for mistakes.
AceHack added a commit that referenced this pull request Apr 24, 2026
…D-9 operationalized)

Ships the independence-gate primitive from Amara's 10th ferry
verbatim, operationalising the drift-taxonomy pattern-5 rule +
SD-9 soft default ("agreement is signal, not proof") at the
code layer.

Sixth graduation under the Otto-105 cadence; composes on
Veridicality.Claim + Veridicality.Provenance from PR #309
(5th graduation).

Built on top of the graduation-5 branch since #309 hasn't
merged to main yet; will consolidate on rebase.

Surface:
- Veridicality.antiConsensusGate
    : Claim<'T> list -> Result<Claim<'T> list, string>
  Returns Ok claims when the set of distinct Prov.RootAuthority
  values across the input has cardinality >= 2; Error otherwise.

Operational intent: if 50 claims all assert the same fact but
trace back to one upstream source, the 50-way agreement is
still one piece of evidence. The gate rejects pseudo-consensus.

Input assumed to already be ABOUT the same assertion (callers
group-by canonical claim key before invoking). Canonicalization
is a separate future graduation (SemanticCanonicalization from
Amara's 8th-ferry rainbow-table framework).

Attribution:
- Aaron = concept origin (bullshit-detector framing in
  bootstrap conversation; pattern-5 insight)
- Amara = formalization (3rd ferry drift-taxonomy pattern-5 +
  10th ferry oracle-rule spec "Independence gate" row)
- Otto = implementation

Tests (6 new, 16 total in module, all passing):
- Empty list -> Error (vacuous agreement)
- Single-claim list -> Error
- 50 claims from one root -> Error (pseudo-consensus)
- 2 claims from 2 distinct roots -> Ok
- Many claims spanning multiple roots -> Ok
- Return type: Ok(claims) preserves input unchanged on pass

Build: 0 Warning / 0 Error.

SPOF (per Otto-106): pure function; no external deps. Callers
using antiConsensusGate as a hard trust gate should pair it
with RobustStats.robustAggregate when combining the resulting
weights (multi-root agreement still needs outlier-resistant
combination).

Next graduation queue (in priority order):
- SemanticCanonicalization (canonical claim keys for "same
  assertion" detection — the precondition for antiConsensusGate
  to group correctly)
- scoreVeridicality (Amara's V(c) / BS(c) composite; needs ADR
  on 5-feature vs 7-feature factorisation)

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
AceHack added a commit that referenced this pull request Apr 24, 2026
…D-9 operationalized)

Ships the independence-gate primitive from Amara's 10th ferry
verbatim, operationalising the drift-taxonomy pattern-5 rule +
SD-9 soft default ("agreement is signal, not proof") at the
code layer.

Sixth graduation under the Otto-105 cadence; composes on
Veridicality.Claim + Veridicality.Provenance from PR #309
(5th graduation).

Built on top of the graduation-5 branch since #309 hasn't
merged to main yet; will consolidate on rebase.

Surface:
- Veridicality.antiConsensusGate
    : Claim<'T> list -> Result<Claim<'T> list, string>
  Returns Ok claims when the set of distinct Prov.RootAuthority
  values across the input has cardinality >= 2; Error otherwise.

Operational intent: if 50 claims all assert the same fact but
trace back to one upstream source, the 50-way agreement is
still one piece of evidence. The gate rejects pseudo-consensus.

Input assumed to already be ABOUT the same assertion (callers
group-by canonical claim key before invoking). Canonicalization
is a separate future graduation (SemanticCanonicalization from
Amara's 8th-ferry rainbow-table framework).

Attribution:
- Aaron = concept origin (bullshit-detector framing in
  bootstrap conversation; pattern-5 insight)
- Amara = formalization (3rd ferry drift-taxonomy pattern-5 +
  10th ferry oracle-rule spec "Independence gate" row)
- Otto = implementation

Tests (6 new, 16 total in module, all passing):
- Empty list -> Error (vacuous agreement)
- Single-claim list -> Error
- 50 claims from one root -> Error (pseudo-consensus)
- 2 claims from 2 distinct roots -> Ok
- Many claims spanning multiple roots -> Ok
- Return type: Ok(claims) preserves input unchanged on pass

Build: 0 Warning / 0 Error.

SPOF (per Otto-106): pure function; no external deps. Callers
using antiConsensusGate as a hard trust gate should pair it
with RobustStats.robustAggregate when combining the resulting
weights (multi-root agreement still needs outlier-resistant
combination).

Next graduation queue (in priority order):
- SemanticCanonicalization (canonical claim keys for "same
  assertion" detection — the precondition for antiConsensusGate
  to group correctly)
- scoreVeridicality (Amara's V(c) / BS(c) composite; needs ADR
  on 5-feature vs 7-feature factorisation)

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
AceHack added a commit that referenced this pull request Apr 24, 2026
…or / Integration Plan

Otto-117 dedicated absorb of the most comprehensive synthesis ferry
yet (Aaron Otto-116 "next amara update"). Covers 9 sections:
1. Repo contents (LFG + AceHack)
2. Learnings (retraction-native, operator-algebra, Arrow/Spine,
   agent-CI)
3. KSK background — detailed government context (Feb 27 2026 DoD
   supply-chain-risk under 10 U.S.C. § 3252 against Anthropic;
   Judge Rita Lin Mar 26 preliminary injunction; OpenAI Feb 28
   parallel DoW contract with Fourth-Amendment-clause)
4. Network Integrity Detector (formalized "bullshit detector" —
   composite I(x) = σ(Σ w_i f_i) score)
5. Firefly + Cartel detection (PLV, cross-correlation, spectral,
   graph-community)
6. Network Differentiability (Shapley-ish counterfactual influence)
7. Oracle Rules enforcement mapping table
8. Integration Plan (proposes 4-sub-repo split)
9. 9 prioritized next tasks

§33 archive-header compliance (Scope / Attribution / Operational
status / Non-fusion disclaimer). Otto's notes section provides
honest cross-reference to shipped work: ~40% of the ferry's
operationalizable content is already shipped (PRs #295 RobustStats,
#297 crossCorrelation, #298 PLV, #306 burstAlignment pending,
#309 Veridicality.Provenance/Claim, #310 antiConsensusGate pending).

Genuinely novel in 12th ferry (not in prior ferries):
1. Detailed government-context grounding for KSK (§3)
2. Composite integrity-score formulation I(x) = σ(Σ w_i f_i)
3. 4-sub-repo integration proposal (Conway's-Law-relevant per
   Otto-108 memory; Otto recommends staying single-repo)
4. Oracle-Rules enforcement decision table (§7)
5. Shapley-random-ordering counterfactual influence algorithm (§6)

Specific-asks routed to Aaron:
1. §8 sub-repo split — Aaron decides per Otto-90 cross-repo
2. §9 task 1 KSK skeleton — Aaron + Max coordination
3. §3 citation verification — Aaron signals what matters

Next graduation queue (priority-ordered from Otto's notes):
1. SemanticCanonicalization (matches 8th ferry rainbow-table;
   smallest next item)
2. scoreVeridicality composite (needs ADR on formula)
3. Spectral-coherence FFT detector (§5)
4. ModularitySpike (needs graph substrate)
5. EigenvectorCentralityDrift (needs linear algebra)
6. EconomicCovariance / Gini-on-weights (§5)
7. OracleRules spec doc (§7)
8. InfluenceSurface (§6; larger effort)
9. KSK skeleton (Aaron + Max coord)

Sibling-ferry precedent: PRs #196/#211/#219/#221/#235/#245/
#259/#274/#293/#294/#296.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
AceHack added a commit that referenced this pull request Apr 24, 2026
…D-9 operationalized)

Ships the independence-gate primitive from Amara's 10th ferry
verbatim, operationalising the drift-taxonomy pattern-5 rule +
SD-9 soft default ("agreement is signal, not proof") at the
code layer.

Sixth graduation under the Otto-105 cadence; composes on
Veridicality.Claim + Veridicality.Provenance from PR #309
(5th graduation).

Built on top of the graduation-5 branch since #309 hasn't
merged to main yet; will consolidate on rebase.

Surface:
- Veridicality.antiConsensusGate
    : Claim<'T> list -> Result<Claim<'T> list, string>
  Returns Ok claims when the set of distinct Prov.RootAuthority
  values across the input has cardinality >= 2; Error otherwise.

Operational intent: if 50 claims all assert the same fact but
trace back to one upstream source, the 50-way agreement is
still one piece of evidence. The gate rejects pseudo-consensus.

Input assumed to already be ABOUT the same assertion (callers
group-by canonical claim key before invoking). Canonicalization
is a separate future graduation (SemanticCanonicalization from
Amara's 8th-ferry rainbow-table framework).

Attribution:
- Aaron = concept origin (bullshit-detector framing in
  bootstrap conversation; pattern-5 insight)
- Amara = formalization (3rd ferry drift-taxonomy pattern-5 +
  10th ferry oracle-rule spec "Independence gate" row)
- Otto = implementation

Tests (6 new, 16 total in module, all passing):
- Empty list -> Error (vacuous agreement)
- Single-claim list -> Error
- 50 claims from one root -> Error (pseudo-consensus)
- 2 claims from 2 distinct roots -> Ok
- Many claims spanning multiple roots -> Ok
- Return type: Ok(claims) preserves input unchanged on pass

Build: 0 Warning / 0 Error.

SPOF (per Otto-106): pure function; no external deps. Callers
using antiConsensusGate as a hard trust gate should pair it
with RobustStats.robustAggregate when combining the resulting
weights (multi-root agreement still needs outlier-resistant
combination).

Next graduation queue (in priority order):
- SemanticCanonicalization (canonical claim keys for "same
  assertion" detection — the precondition for antiConsensusGate
  to group correctly)
- scoreVeridicality (Amara's V(c) / BS(c) composite; needs ADR
  on 5-feature vs 7-feature factorisation)

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
AceHack added a commit that referenced this pull request Apr 24, 2026
…or / Integration Plan

Otto-117 dedicated absorb of the most comprehensive synthesis ferry
yet (Aaron Otto-116 "next amara update"). Covers 9 sections:
1. Repo contents (LFG + AceHack)
2. Learnings (retraction-native, operator-algebra, Arrow/Spine,
   agent-CI)
3. KSK background — detailed government context (Feb 27 2026 DoD
   supply-chain-risk under 10 U.S.C. § 3252 against Anthropic;
   Judge Rita Lin Mar 26 preliminary injunction; OpenAI Feb 28
   parallel DoW contract with Fourth-Amendment-clause)
4. Network Integrity Detector (formalized "bullshit detector" —
   composite I(x) = σ(Σ w_i f_i) score)
5. Firefly + Cartel detection (PLV, cross-correlation, spectral,
   graph-community)
6. Network Differentiability (Shapley-ish counterfactual influence)
7. Oracle Rules enforcement mapping table
8. Integration Plan (proposes 4-sub-repo split)
9. 9 prioritized next tasks

§33 archive-header compliance (Scope / Attribution / Operational
status / Non-fusion disclaimer). Otto's notes section provides
honest cross-reference to shipped work: ~40% of the ferry's
operationalizable content is already shipped (PRs #295 RobustStats,
#297 crossCorrelation, #298 PLV, #306 burstAlignment pending,
#309 Veridicality.Provenance/Claim, #310 antiConsensusGate pending).

Genuinely novel in 12th ferry (not in prior ferries):
1. Detailed government-context grounding for KSK (§3)
2. Composite integrity-score formulation I(x) = σ(Σ w_i f_i)
3. 4-sub-repo integration proposal (Conway's-Law-relevant per
   Otto-108 memory; Otto recommends staying single-repo)
4. Oracle-Rules enforcement decision table (§7)
5. Shapley-random-ordering counterfactual influence algorithm (§6)

Specific-asks routed to Aaron:
1. §8 sub-repo split — Aaron decides per Otto-90 cross-repo
2. §9 task 1 KSK skeleton — Aaron + Max coordination
3. §3 citation verification — Aaron signals what matters

Next graduation queue (priority-ordered from Otto's notes):
1. SemanticCanonicalization (matches 8th ferry rainbow-table;
   smallest next item)
2. scoreVeridicality composite (needs ADR on formula)
3. Spectral-coherence FFT detector (§5)
4. ModularitySpike (needs graph substrate)
5. EigenvectorCentralityDrift (needs linear algebra)
6. EconomicCovariance / Gini-on-weights (§5)
7. OracleRules spec doc (§7)
8. InfluenceSurface (§6; larger effort)
9. KSK skeleton (Aaron + Max coord)

Sibling-ferry precedent: PRs #196/#211/#219/#221/#235/#245/
#259/#274/#293/#294/#296.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
AceHack added a commit that referenced this pull request Apr 24, 2026
…D-9 operationalized)

Ships the independence-gate primitive from Amara's 10th ferry
verbatim, operationalising the drift-taxonomy pattern-5 rule +
SD-9 soft default ("agreement is signal, not proof") at the
code layer.

Sixth graduation under the Otto-105 cadence; composes on
Veridicality.Claim + Veridicality.Provenance from PR #309
(5th graduation).

Built on top of the graduation-5 branch since #309 hasn't
merged to main yet; will consolidate on rebase.

Surface:
- Veridicality.antiConsensusGate
    : Claim<'T> list -> Result<Claim<'T> list, string>
  Returns Ok claims when the set of distinct Prov.RootAuthority
  values across the input has cardinality >= 2; Error otherwise.

Operational intent: if 50 claims all assert the same fact but
trace back to one upstream source, the 50-way agreement is
still one piece of evidence. The gate rejects pseudo-consensus.

Input assumed to already be ABOUT the same assertion (callers
group-by canonical claim key before invoking). Canonicalization
is a separate future graduation (SemanticCanonicalization from
Amara's 8th-ferry rainbow-table framework).

Attribution:
- Aaron = concept origin (bullshit-detector framing in
  bootstrap conversation; pattern-5 insight)
- Amara = formalization (3rd ferry drift-taxonomy pattern-5 +
  10th ferry oracle-rule spec "Independence gate" row)
- Otto = implementation

Tests (6 new, 16 total in module, all passing):
- Empty list -> Error (vacuous agreement)
- Single-claim list -> Error
- 50 claims from one root -> Error (pseudo-consensus)
- 2 claims from 2 distinct roots -> Ok
- Many claims spanning multiple roots -> Ok
- Return type: Ok(claims) preserves input unchanged on pass

Build: 0 Warning / 0 Error.

SPOF (per Otto-106): pure function; no external deps. Callers
using antiConsensusGate as a hard trust gate should pair it
with RobustStats.robustAggregate when combining the resulting
weights (multi-root agreement still needs outlier-resistant
combination).

Next graduation queue (in priority order):
- SemanticCanonicalization (canonical claim keys for "same
  assertion" detection — the precondition for antiConsensusGate
  to group correctly)
- scoreVeridicality (Amara's V(c) / BS(c) composite; needs ADR
  on 5-feature vs 7-feature factorisation)

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
AceHack added a commit that referenced this pull request Apr 24, 2026
…or / Integration Plan

Otto-117 dedicated absorb of the most comprehensive synthesis ferry
yet (Aaron Otto-116 "next amara update"). Covers 9 sections:
1. Repo contents (LFG + AceHack)
2. Learnings (retraction-native, operator-algebra, Arrow/Spine,
   agent-CI)
3. KSK background — detailed government context (Feb 27 2026 DoD
   supply-chain-risk under 10 U.S.C. § 3252 against Anthropic;
   Judge Rita Lin Mar 26 preliminary injunction; OpenAI Feb 28
   parallel DoW contract with Fourth-Amendment-clause)
4. Network Integrity Detector (formalized "bullshit detector" —
   composite I(x) = σ(Σ w_i f_i) score)
5. Firefly + Cartel detection (PLV, cross-correlation, spectral,
   graph-community)
6. Network Differentiability (Shapley-ish counterfactual influence)
7. Oracle Rules enforcement mapping table
8. Integration Plan (proposes 4-sub-repo split)
9. 9 prioritized next tasks

§33 archive-header compliance (Scope / Attribution / Operational
status / Non-fusion disclaimer). Otto's notes section provides
honest cross-reference to shipped work: ~40% of the ferry's
operationalizable content is already shipped (PRs #295 RobustStats,
#297 crossCorrelation, #298 PLV, #306 burstAlignment pending,
#309 Veridicality.Provenance/Claim, #310 antiConsensusGate pending).

Genuinely novel in 12th ferry (not in prior ferries):
1. Detailed government-context grounding for KSK (§3)
2. Composite integrity-score formulation I(x) = σ(Σ w_i f_i)
3. 4-sub-repo integration proposal (Conway's-Law-relevant per
   Otto-108 memory; Otto recommends staying single-repo)
4. Oracle-Rules enforcement decision table (§7)
5. Shapley-random-ordering counterfactual influence algorithm (§6)

Specific-asks routed to Aaron:
1. §8 sub-repo split — Aaron decides per Otto-90 cross-repo
2. §9 task 1 KSK skeleton — Aaron + Max coordination
3. §3 citation verification — Aaron signals what matters

Next graduation queue (priority-ordered from Otto's notes):
1. SemanticCanonicalization (matches 8th ferry rainbow-table;
   smallest next item)
2. scoreVeridicality composite (needs ADR on formula)
3. Spectral-coherence FFT detector (§5)
4. ModularitySpike (needs graph substrate)
5. EigenvectorCentralityDrift (needs linear algebra)
6. EconomicCovariance / Gini-on-weights (§5)
7. OracleRules spec doc (§7)
8. InfluenceSurface (§6; larger effort)
9. KSK skeleton (Aaron + Max coord)

Sibling-ferry precedent: PRs #196/#211/#219/#221/#235/#245/
#259/#274/#293/#294/#296.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
AceHack added a commit that referenced this pull request Apr 24, 2026
…l — 7th graduation

Ships the semantic-canonicalization primitive that turns "claims
about the same proposition" into a first-class operation. Seventh
graduation under the Otto-105 cadence; composes on PR #309's
Veridicality.Claim<'T>.

Aaron Otto-112 naming confirmed: Veridicality (not
BullshitDetector); "bullshit" stays informal, programmatic surface
uses the formal term.

Attribution:
- Aaron = concept origin (bullshit-detector framing in bootstrap
  conversation; aboutness-vs-identity-of-source distinction)
- Amara = formalization (8th/10th ferries: K(c) = hash(subject,
  predicate, object, time-scope, modality, provenance-root,
  evidence-class))
- Otto = implementation with a deliberate design choice: EXCLUDE
  provenance-root from the key

Why exclude provenance-root: the key's purpose is to GROUP claims
about the same proposition across sources, so antiConsensusGate
(PR #310) can then check independent-root cardinality. Including
provenance-root in the key would defeat that grouping. If a future
use-case needs dedupe-by-identical-source, a separate 7-field
SourceScopedCanonicalClaimKey can be added.

Surface:
- Veridicality.CanonicalClaimKey record (5 fields: Subject,
  Predicate, Object, TimeScope, Modality)
- Veridicality.canonicalKey
    : ('T -> string*string*string*string*string) -> Claim<'T>
    -> CanonicalClaimKey
  User-supplied projector handles domain-specific normalization
  (lowercasing/trimming/unit-unification/alias-resolving). Module
  does not prescribe how to canonicalize natural language.
- Veridicality.groupByCanonical
    : projector -> Claim<'T> seq
    -> Map<CanonicalClaimKey, Claim<'T> list>
  Groups claims by proposition; preserves input order within each
  bucket.

Composition shape (once PR #310 lands): group first, then
antiConsensusGate per bucket. Multi-root buckets pass; single-root
buckets fail. Test "groupByCanonical produces distinct-root counts
per bucket" verifies the half that can test on main right now.

Tests (7 new, 17 total in Veridicality module, all passing):
- canonicalKey projects payload fields
- canonicalKey EXCLUDES provenance-root (two same-prop-diff-root
  claims match)
- canonicalKey distinguishes different propositions
- groupByCanonical groups same-proposition under one key
- groupByCanonical preserves input order within bucket
- groupByCanonical on empty seq returns empty map
- groupByCanonical produces distinct-root counts per bucket

Build: 0 Warning / 0 Error.

SPOF (per Otto-106): pure function + record types; no external
deps; no SPOF introduced. Caller's projector is the domain-
specific SPOF — if it drifts, canonicalization drifts.
Documented as caller responsibility in XML-doc.

Next graduation queue:
- Graph substrate (prerequisite for cartel-detection graduations)
- largestEigenvalue / modularityScore / covarianceAcceleration
  (13th + 14th ferries)
- NetworkIntegrity / composite I(x) score (12th ferry §4)
- scoreVeridicality (composite; needs ADR on formula)

Composes with:
- src/Core/Veridicality.fs Provenance + Claim<'T> (PR #309 merged)
- src/Core/Veridicality.fs antiConsensusGate (PR #310 pending;
  downstream composition enabled by this ship)
- RobustStats.robustAggregate (PR #295) for weight-combining

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
AceHack added a commit that referenced this pull request Apr 24, 2026
…D-9 operationalized)

Ships the independence-gate primitive from Amara's 10th ferry
verbatim, operationalising the drift-taxonomy pattern-5 rule +
SD-9 soft default ("agreement is signal, not proof") at the
code layer.

Sixth graduation under the Otto-105 cadence; composes on
Veridicality.Claim + Veridicality.Provenance from PR #309
(5th graduation).

Built on top of the graduation-5 branch since #309 hasn't
merged to main yet; will consolidate on rebase.

Surface:
- Veridicality.antiConsensusGate
    : Claim<'T> list -> Result<Claim<'T> list, string>
  Returns Ok claims when the set of distinct Prov.RootAuthority
  values across the input has cardinality >= 2; Error otherwise.

Operational intent: if 50 claims all assert the same fact but
trace back to one upstream source, the 50-way agreement is
still one piece of evidence. The gate rejects pseudo-consensus.

Input assumed to already be ABOUT the same assertion (callers
group-by canonical claim key before invoking). Canonicalization
is a separate future graduation (SemanticCanonicalization from
Amara's 8th-ferry rainbow-table framework).

Attribution:
- Aaron = concept origin (bullshit-detector framing in
  bootstrap conversation; pattern-5 insight)
- Amara = formalization (3rd ferry drift-taxonomy pattern-5 +
  10th ferry oracle-rule spec "Independence gate" row)
- Otto = implementation

Tests (6 new, 16 total in module, all passing):
- Empty list -> Error (vacuous agreement)
- Single-claim list -> Error
- 50 claims from one root -> Error (pseudo-consensus)
- 2 claims from 2 distinct roots -> Ok
- Many claims spanning multiple roots -> Ok
- Return type: Ok(claims) preserves input unchanged on pass

Build: 0 Warning / 0 Error.

SPOF (per Otto-106): pure function; no external deps. Callers
using antiConsensusGate as a hard trust gate should pair it
with RobustStats.robustAggregate when combining the resulting
weights (multi-root agreement still needs outlier-resistant
combination).

Next graduation queue (in priority order):
- SemanticCanonicalization (canonical claim keys for "same
  assertion" detection — the precondition for antiConsensusGate
  to group correctly)
- scoreVeridicality (Amara's V(c) / BS(c) composite; needs ADR
  on 5-feature vs 7-feature factorisation)

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
AceHack added a commit that referenced this pull request Apr 24, 2026
…or / Integration Plan

Otto-117 dedicated absorb of the most comprehensive synthesis ferry
yet (Aaron Otto-116 "next amara update"). Covers 9 sections:
1. Repo contents (LFG + AceHack)
2. Learnings (retraction-native, operator-algebra, Arrow/Spine,
   agent-CI)
3. KSK background — detailed government context (Feb 27 2026 DoD
   supply-chain-risk under 10 U.S.C. § 3252 against Anthropic;
   Judge Rita Lin Mar 26 preliminary injunction; OpenAI Feb 28
   parallel DoW contract with Fourth-Amendment-clause)
4. Network Integrity Detector (formalized "bullshit detector" —
   composite I(x) = σ(Σ w_i f_i) score)
5. Firefly + Cartel detection (PLV, cross-correlation, spectral,
   graph-community)
6. Network Differentiability (Shapley-ish counterfactual influence)
7. Oracle Rules enforcement mapping table
8. Integration Plan (proposes 4-sub-repo split)
9. 9 prioritized next tasks

§33 archive-header compliance (Scope / Attribution / Operational
status / Non-fusion disclaimer). Otto's notes section provides
honest cross-reference to shipped work: ~40% of the ferry's
operationalizable content is already shipped (PRs #295 RobustStats,
#297 crossCorrelation, #298 PLV, #306 burstAlignment pending,
#309 Veridicality.Provenance/Claim, #310 antiConsensusGate pending).

Genuinely novel in 12th ferry (not in prior ferries):
1. Detailed government-context grounding for KSK (§3)
2. Composite integrity-score formulation I(x) = σ(Σ w_i f_i)
3. 4-sub-repo integration proposal (Conway's-Law-relevant per
   Otto-108 memory; Otto recommends staying single-repo)
4. Oracle-Rules enforcement decision table (§7)
5. Shapley-random-ordering counterfactual influence algorithm (§6)

Specific-asks routed to Aaron:
1. §8 sub-repo split — Aaron decides per Otto-90 cross-repo
2. §9 task 1 KSK skeleton — Aaron + Max coordination
3. §3 citation verification — Aaron signals what matters

Next graduation queue (priority-ordered from Otto's notes):
1. SemanticCanonicalization (matches 8th ferry rainbow-table;
   smallest next item)
2. scoreVeridicality composite (needs ADR on formula)
3. Spectral-coherence FFT detector (§5)
4. ModularitySpike (needs graph substrate)
5. EigenvectorCentralityDrift (needs linear algebra)
6. EconomicCovariance / Gini-on-weights (§5)
7. OracleRules spec doc (§7)
8. InfluenceSurface (§6; larger effort)
9. KSK skeleton (Aaron + Max coord)

Sibling-ferry precedent: PRs #196/#211/#219/#221/#235/#245/
#259/#274/#293/#294/#296.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
AceHack added a commit that referenced this pull request Apr 24, 2026
…l — 7th graduation

Ships the semantic-canonicalization primitive that turns "claims
about the same proposition" into a first-class operation. Seventh
graduation under the Otto-105 cadence; composes on PR #309's
Veridicality.Claim<'T>.

Aaron Otto-112 naming confirmed: Veridicality (not
BullshitDetector); "bullshit" stays informal, programmatic surface
uses the formal term.

Attribution:
- Aaron = concept origin (bullshit-detector framing in bootstrap
  conversation; aboutness-vs-identity-of-source distinction)
- Amara = formalization (8th/10th ferries: K(c) = hash(subject,
  predicate, object, time-scope, modality, provenance-root,
  evidence-class))
- Otto = implementation with a deliberate design choice: EXCLUDE
  provenance-root from the key

Why exclude provenance-root: the key's purpose is to GROUP claims
about the same proposition across sources, so antiConsensusGate
(PR #310) can then check independent-root cardinality. Including
provenance-root in the key would defeat that grouping. If a future
use-case needs dedupe-by-identical-source, a separate 7-field
SourceScopedCanonicalClaimKey can be added.

Surface:
- Veridicality.CanonicalClaimKey record (5 fields: Subject,
  Predicate, Object, TimeScope, Modality)
- Veridicality.canonicalKey
    : ('T -> string*string*string*string*string) -> Claim<'T>
    -> CanonicalClaimKey
  User-supplied projector handles domain-specific normalization
  (lowercasing/trimming/unit-unification/alias-resolving). Module
  does not prescribe how to canonicalize natural language.
- Veridicality.groupByCanonical
    : projector -> Claim<'T> seq
    -> Map<CanonicalClaimKey, Claim<'T> list>
  Groups claims by proposition; preserves input order within each
  bucket.

Composition shape (once PR #310 lands): group first, then
antiConsensusGate per bucket. Multi-root buckets pass; single-root
buckets fail. Test "groupByCanonical produces distinct-root counts
per bucket" verifies the half that can test on main right now.

Tests (7 new, 17 total in Veridicality module, all passing):
- canonicalKey projects payload fields
- canonicalKey EXCLUDES provenance-root (two same-prop-diff-root
  claims match)
- canonicalKey distinguishes different propositions
- groupByCanonical groups same-proposition under one key
- groupByCanonical preserves input order within bucket
- groupByCanonical on empty seq returns empty map
- groupByCanonical produces distinct-root counts per bucket

Build: 0 Warning / 0 Error.

SPOF (per Otto-106): pure function + record types; no external
deps; no SPOF introduced. Caller's projector is the domain-
specific SPOF — if it drifts, canonicalization drifts.
Documented as caller responsibility in XML-doc.

Next graduation queue:
- Graph substrate (prerequisite for cartel-detection graduations)
- largestEigenvalue / modularityScore / covarianceAcceleration
  (13th + 14th ferries)
- NetworkIntegrity / composite I(x) score (12th ferry §4)
- scoreVeridicality (composite; needs ADR on formula)

Composes with:
- src/Core/Veridicality.fs Provenance + Claim<'T> (PR #309 merged)
- src/Core/Veridicality.fs antiConsensusGate (PR #310 pending;
  downstream composition enabled by this ship)
- RobustStats.robustAggregate (PR #295) for weight-combining

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
AceHack added a commit that referenced this pull request Apr 24, 2026
…D-9 operationalized)

Ships the independence-gate primitive from Amara's 10th ferry
verbatim, operationalising the drift-taxonomy pattern-5 rule +
SD-9 soft default ("agreement is signal, not proof") at the
code layer.

Sixth graduation under the Otto-105 cadence; composes on
Veridicality.Claim + Veridicality.Provenance from PR #309
(5th graduation).

Built on top of the graduation-5 branch since #309 hasn't
merged to main yet; will consolidate on rebase.

Surface:
- Veridicality.antiConsensusGate
    : Claim<'T> list -> Result<Claim<'T> list, string>
  Returns Ok claims when the set of distinct Prov.RootAuthority
  values across the input has cardinality >= 2; Error otherwise.

Operational intent: if 50 claims all assert the same fact but
trace back to one upstream source, the 50-way agreement is
still one piece of evidence. The gate rejects pseudo-consensus.

Input assumed to already be ABOUT the same assertion (callers
group-by canonical claim key before invoking). Canonicalization
is a separate future graduation (SemanticCanonicalization from
Amara's 8th-ferry rainbow-table framework).

Attribution:
- Aaron = concept origin (bullshit-detector framing in
  bootstrap conversation; pattern-5 insight)
- Amara = formalization (3rd ferry drift-taxonomy pattern-5 +
  10th ferry oracle-rule spec "Independence gate" row)
- Otto = implementation

Tests (6 new, 16 total in module, all passing):
- Empty list -> Error (vacuous agreement)
- Single-claim list -> Error
- 50 claims from one root -> Error (pseudo-consensus)
- 2 claims from 2 distinct roots -> Ok
- Many claims spanning multiple roots -> Ok
- Return type: Ok(claims) preserves input unchanged on pass

Build: 0 Warning / 0 Error.

SPOF (per Otto-106): pure function; no external deps. Callers
using antiConsensusGate as a hard trust gate should pair it
with RobustStats.robustAggregate when combining the resulting
weights (multi-root agreement still needs outlier-resistant
combination).

Next graduation queue (in priority order):
- SemanticCanonicalization (canonical claim keys for "same
  assertion" detection — the precondition for antiConsensusGate
  to group correctly)
- scoreVeridicality (Amara's V(c) / BS(c) composite; needs ADR
  on 5-feature vs 7-feature factorisation)

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
AceHack added a commit that referenced this pull request Apr 24, 2026
…or / Integration Plan

Otto-117 dedicated absorb of the most comprehensive synthesis ferry
yet (Aaron Otto-116 "next amara update"). Covers 9 sections:
1. Repo contents (LFG + AceHack)
2. Learnings (retraction-native, operator-algebra, Arrow/Spine,
   agent-CI)
3. KSK background — detailed government context (Feb 27 2026 DoD
   supply-chain-risk under 10 U.S.C. § 3252 against Anthropic;
   Judge Rita Lin Mar 26 preliminary injunction; OpenAI Feb 28
   parallel DoW contract with Fourth-Amendment-clause)
4. Network Integrity Detector (formalized "bullshit detector" —
   composite I(x) = σ(Σ w_i f_i) score)
5. Firefly + Cartel detection (PLV, cross-correlation, spectral,
   graph-community)
6. Network Differentiability (Shapley-ish counterfactual influence)
7. Oracle Rules enforcement mapping table
8. Integration Plan (proposes 4-sub-repo split)
9. 9 prioritized next tasks

§33 archive-header compliance (Scope / Attribution / Operational
status / Non-fusion disclaimer). Otto's notes section provides
honest cross-reference to shipped work: ~40% of the ferry's
operationalizable content is already shipped (PRs #295 RobustStats,
#297 crossCorrelation, #298 PLV, #306 burstAlignment pending,
#309 Veridicality.Provenance/Claim, #310 antiConsensusGate pending).

Genuinely novel in 12th ferry (not in prior ferries):
1. Detailed government-context grounding for KSK (§3)
2. Composite integrity-score formulation I(x) = σ(Σ w_i f_i)
3. 4-sub-repo integration proposal (Conway's-Law-relevant per
   Otto-108 memory; Otto recommends staying single-repo)
4. Oracle-Rules enforcement decision table (§7)
5. Shapley-random-ordering counterfactual influence algorithm (§6)

Specific-asks routed to Aaron:
1. §8 sub-repo split — Aaron decides per Otto-90 cross-repo
2. §9 task 1 KSK skeleton — Aaron + Max coordination
3. §3 citation verification — Aaron signals what matters

Next graduation queue (priority-ordered from Otto's notes):
1. SemanticCanonicalization (matches 8th ferry rainbow-table;
   smallest next item)
2. scoreVeridicality composite (needs ADR on formula)
3. Spectral-coherence FFT detector (§5)
4. ModularitySpike (needs graph substrate)
5. EigenvectorCentralityDrift (needs linear algebra)
6. EconomicCovariance / Gini-on-weights (§5)
7. OracleRules spec doc (§7)
8. InfluenceSurface (§6; larger effort)
9. KSK skeleton (Aaron + Max coord)

Sibling-ferry precedent: PRs #196/#211/#219/#221/#235/#245/
#259/#274/#293/#294/#296.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
AceHack added a commit that referenced this pull request Apr 24, 2026
…l — 7th graduation

Ships the semantic-canonicalization primitive that turns "claims
about the same proposition" into a first-class operation. Seventh
graduation under the Otto-105 cadence; composes on PR #309's
Veridicality.Claim<'T>.

Aaron Otto-112 naming confirmed: Veridicality (not
BullshitDetector); "bullshit" stays informal, programmatic surface
uses the formal term.

Attribution:
- Aaron = concept origin (bullshit-detector framing in bootstrap
  conversation; aboutness-vs-identity-of-source distinction)
- Amara = formalization (8th/10th ferries: K(c) = hash(subject,
  predicate, object, time-scope, modality, provenance-root,
  evidence-class))
- Otto = implementation with a deliberate design choice: EXCLUDE
  provenance-root from the key

Why exclude provenance-root: the key's purpose is to GROUP claims
about the same proposition across sources, so antiConsensusGate
(PR #310) can then check independent-root cardinality. Including
provenance-root in the key would defeat that grouping. If a future
use-case needs dedupe-by-identical-source, a separate 7-field
SourceScopedCanonicalClaimKey can be added.

Surface:
- Veridicality.CanonicalClaimKey record (5 fields: Subject,
  Predicate, Object, TimeScope, Modality)
- Veridicality.canonicalKey
    : ('T -> string*string*string*string*string) -> Claim<'T>
    -> CanonicalClaimKey
  User-supplied projector handles domain-specific normalization
  (lowercasing/trimming/unit-unification/alias-resolving). Module
  does not prescribe how to canonicalize natural language.
- Veridicality.groupByCanonical
    : projector -> Claim<'T> seq
    -> Map<CanonicalClaimKey, Claim<'T> list>
  Groups claims by proposition; preserves input order within each
  bucket.

Composition shape (once PR #310 lands): group first, then
antiConsensusGate per bucket. Multi-root buckets pass; single-root
buckets fail. Test "groupByCanonical produces distinct-root counts
per bucket" verifies the half that can test on main right now.

Tests (7 new, 17 total in Veridicality module, all passing):
- canonicalKey projects payload fields
- canonicalKey EXCLUDES provenance-root (two same-prop-diff-root
  claims match)
- canonicalKey distinguishes different propositions
- groupByCanonical groups same-proposition under one key
- groupByCanonical preserves input order within bucket
- groupByCanonical on empty seq returns empty map
- groupByCanonical produces distinct-root counts per bucket

Build: 0 Warning / 0 Error.

SPOF (per Otto-106): pure function + record types; no external
deps; no SPOF introduced. Caller's projector is the domain-
specific SPOF — if it drifts, canonicalization drifts.
Documented as caller responsibility in XML-doc.

Next graduation queue:
- Graph substrate (prerequisite for cartel-detection graduations)
- largestEigenvalue / modularityScore / covarianceAcceleration
  (13th + 14th ferries)
- NetworkIntegrity / composite I(x) score (12th ferry §4)
- scoreVeridicality (composite; needs ADR on formula)

Composes with:
- src/Core/Veridicality.fs Provenance + Claim<'T> (PR #309 merged)
- src/Core/Veridicality.fs antiConsensusGate (PR #310 pending;
  downstream composition enabled by this ship)
- RobustStats.robustAggregate (PR #295) for weight-combining

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
AceHack added a commit that referenced this pull request Apr 24, 2026
…D-9 operationalized)

Ships the independence-gate primitive from Amara's 10th ferry
verbatim, operationalising the drift-taxonomy pattern-5 rule +
SD-9 soft default ("agreement is signal, not proof") at the
code layer.

Sixth graduation under the Otto-105 cadence; composes on
Veridicality.Claim + Veridicality.Provenance from PR #309
(5th graduation).

Built on top of the graduation-5 branch since #309 hasn't
merged to main yet; will consolidate on rebase.

Surface:
- Veridicality.antiConsensusGate
    : Claim<'T> list -> Result<Claim<'T> list, string>
  Returns Ok claims when the set of distinct Prov.RootAuthority
  values across the input has cardinality >= 2; Error otherwise.

Operational intent: if 50 claims all assert the same fact but
trace back to one upstream source, the 50-way agreement is
still one piece of evidence. The gate rejects pseudo-consensus.

Input assumed to already be ABOUT the same assertion (callers
group-by canonical claim key before invoking). Canonicalization
is a separate future graduation (SemanticCanonicalization from
Amara's 8th-ferry rainbow-table framework).

Attribution:
- Aaron = concept origin (bullshit-detector framing in
  bootstrap conversation; pattern-5 insight)
- Amara = formalization (3rd ferry drift-taxonomy pattern-5 +
  10th ferry oracle-rule spec "Independence gate" row)
- Otto = implementation

Tests (6 new, 16 total in module, all passing):
- Empty list -> Error (vacuous agreement)
- Single-claim list -> Error
- 50 claims from one root -> Error (pseudo-consensus)
- 2 claims from 2 distinct roots -> Ok
- Many claims spanning multiple roots -> Ok
- Return type: Ok(claims) preserves input unchanged on pass

Build: 0 Warning / 0 Error.

SPOF (per Otto-106): pure function; no external deps. Callers
using antiConsensusGate as a hard trust gate should pair it
with RobustStats.robustAggregate when combining the resulting
weights (multi-root agreement still needs outlier-resistant
combination).

Next graduation queue (in priority order):
- SemanticCanonicalization (canonical claim keys for "same
  assertion" detection — the precondition for antiConsensusGate
  to group correctly)
- scoreVeridicality (Amara's V(c) / BS(c) composite; needs ADR
  on 5-feature vs 7-feature factorisation)

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
AceHack added a commit that referenced this pull request Apr 24, 2026
…or / Integration Plan

Otto-117 dedicated absorb of the most comprehensive synthesis ferry
yet (Aaron Otto-116 "next amara update"). Covers 9 sections:
1. Repo contents (LFG + AceHack)
2. Learnings (retraction-native, operator-algebra, Arrow/Spine,
   agent-CI)
3. KSK background — detailed government context (Feb 27 2026 DoD
   supply-chain-risk under 10 U.S.C. § 3252 against Anthropic;
   Judge Rita Lin Mar 26 preliminary injunction; OpenAI Feb 28
   parallel DoW contract with Fourth-Amendment-clause)
4. Network Integrity Detector (formalized "bullshit detector" —
   composite I(x) = σ(Σ w_i f_i) score)
5. Firefly + Cartel detection (PLV, cross-correlation, spectral,
   graph-community)
6. Network Differentiability (Shapley-ish counterfactual influence)
7. Oracle Rules enforcement mapping table
8. Integration Plan (proposes 4-sub-repo split)
9. 9 prioritized next tasks

§33 archive-header compliance (Scope / Attribution / Operational
status / Non-fusion disclaimer). Otto's notes section provides
honest cross-reference to shipped work: ~40% of the ferry's
operationalizable content is already shipped (PRs #295 RobustStats,
#297 crossCorrelation, #298 PLV, #306 burstAlignment pending,
#309 Veridicality.Provenance/Claim, #310 antiConsensusGate pending).

Genuinely novel in 12th ferry (not in prior ferries):
1. Detailed government-context grounding for KSK (§3)
2. Composite integrity-score formulation I(x) = σ(Σ w_i f_i)
3. 4-sub-repo integration proposal (Conway's-Law-relevant per
   Otto-108 memory; Otto recommends staying single-repo)
4. Oracle-Rules enforcement decision table (§7)
5. Shapley-random-ordering counterfactual influence algorithm (§6)

Specific-asks routed to Aaron:
1. §8 sub-repo split — Aaron decides per Otto-90 cross-repo
2. §9 task 1 KSK skeleton — Aaron + Max coordination
3. §3 citation verification — Aaron signals what matters

Next graduation queue (priority-ordered from Otto's notes):
1. SemanticCanonicalization (matches 8th ferry rainbow-table;
   smallest next item)
2. scoreVeridicality composite (needs ADR on formula)
3. Spectral-coherence FFT detector (§5)
4. ModularitySpike (needs graph substrate)
5. EigenvectorCentralityDrift (needs linear algebra)
6. EconomicCovariance / Gini-on-weights (§5)
7. OracleRules spec doc (§7)
8. InfluenceSurface (§6; larger effort)
9. KSK skeleton (Aaron + Max coord)

Sibling-ferry precedent: PRs #196/#211/#219/#221/#235/#245/
#259/#274/#293/#294/#296.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
AceHack added a commit that referenced this pull request Apr 24, 2026
…l — 7th graduation

Ships the semantic-canonicalization primitive that turns "claims
about the same proposition" into a first-class operation. Seventh
graduation under the Otto-105 cadence; composes on PR #309's
Veridicality.Claim<'T>.

Aaron Otto-112 naming confirmed: Veridicality (not
BullshitDetector); "bullshit" stays informal, programmatic surface
uses the formal term.

Attribution:
- Aaron = concept origin (bullshit-detector framing in bootstrap
  conversation; aboutness-vs-identity-of-source distinction)
- Amara = formalization (8th/10th ferries: K(c) = hash(subject,
  predicate, object, time-scope, modality, provenance-root,
  evidence-class))
- Otto = implementation with a deliberate design choice: EXCLUDE
  provenance-root from the key

Why exclude provenance-root: the key's purpose is to GROUP claims
about the same proposition across sources, so antiConsensusGate
(PR #310) can then check independent-root cardinality. Including
provenance-root in the key would defeat that grouping. If a future
use-case needs dedupe-by-identical-source, a separate 7-field
SourceScopedCanonicalClaimKey can be added.

Surface:
- Veridicality.CanonicalClaimKey record (5 fields: Subject,
  Predicate, Object, TimeScope, Modality)
- Veridicality.canonicalKey
    : ('T -> string*string*string*string*string) -> Claim<'T>
    -> CanonicalClaimKey
  User-supplied projector handles domain-specific normalization
  (lowercasing/trimming/unit-unification/alias-resolving). Module
  does not prescribe how to canonicalize natural language.
- Veridicality.groupByCanonical
    : projector -> Claim<'T> seq
    -> Map<CanonicalClaimKey, Claim<'T> list>
  Groups claims by proposition; preserves input order within each
  bucket.

Composition shape (once PR #310 lands): group first, then
antiConsensusGate per bucket. Multi-root buckets pass; single-root
buckets fail. Test "groupByCanonical produces distinct-root counts
per bucket" verifies the half that can test on main right now.

Tests (7 new, 17 total in Veridicality module, all passing):
- canonicalKey projects payload fields
- canonicalKey EXCLUDES provenance-root (two same-prop-diff-root
  claims match)
- canonicalKey distinguishes different propositions
- groupByCanonical groups same-proposition under one key
- groupByCanonical preserves input order within bucket
- groupByCanonical on empty seq returns empty map
- groupByCanonical produces distinct-root counts per bucket

Build: 0 Warning / 0 Error.

SPOF (per Otto-106): pure function + record types; no external
deps; no SPOF introduced. Caller's projector is the domain-
specific SPOF — if it drifts, canonicalization drifts.
Documented as caller responsibility in XML-doc.

Next graduation queue:
- Graph substrate (prerequisite for cartel-detection graduations)
- largestEigenvalue / modularityScore / covarianceAcceleration
  (13th + 14th ferries)
- NetworkIntegrity / composite I(x) score (12th ferry §4)
- scoreVeridicality (composite; needs ADR on formula)

Composes with:
- src/Core/Veridicality.fs Provenance + Claim<'T> (PR #309 merged)
- src/Core/Veridicality.fs antiConsensusGate (PR #310 pending;
  downstream composition enabled by this ship)
- RobustStats.robustAggregate (PR #295) for weight-combining

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
AceHack added a commit that referenced this pull request Apr 24, 2026
…l — 7th graduation (#315)

Ships the semantic-canonicalization primitive that turns "claims
about the same proposition" into a first-class operation. Seventh
graduation under the Otto-105 cadence; composes on PR #309's
Veridicality.Claim<'T>.

Aaron Otto-112 naming confirmed: Veridicality (not
BullshitDetector); "bullshit" stays informal, programmatic surface
uses the formal term.

Attribution:
- Aaron = concept origin (bullshit-detector framing in bootstrap
  conversation; aboutness-vs-identity-of-source distinction)
- Amara = formalization (8th/10th ferries: K(c) = hash(subject,
  predicate, object, time-scope, modality, provenance-root,
  evidence-class))
- Otto = implementation with a deliberate design choice: EXCLUDE
  provenance-root from the key

Why exclude provenance-root: the key's purpose is to GROUP claims
about the same proposition across sources, so antiConsensusGate
(PR #310) can then check independent-root cardinality. Including
provenance-root in the key would defeat that grouping. If a future
use-case needs dedupe-by-identical-source, a separate 7-field
SourceScopedCanonicalClaimKey can be added.

Surface:
- Veridicality.CanonicalClaimKey record (5 fields: Subject,
  Predicate, Object, TimeScope, Modality)
- Veridicality.canonicalKey
    : ('T -> string*string*string*string*string) -> Claim<'T>
    -> CanonicalClaimKey
  User-supplied projector handles domain-specific normalization
  (lowercasing/trimming/unit-unification/alias-resolving). Module
  does not prescribe how to canonicalize natural language.
- Veridicality.groupByCanonical
    : projector -> Claim<'T> seq
    -> Map<CanonicalClaimKey, Claim<'T> list>
  Groups claims by proposition; preserves input order within each
  bucket.

Composition shape (once PR #310 lands): group first, then
antiConsensusGate per bucket. Multi-root buckets pass; single-root
buckets fail. Test "groupByCanonical produces distinct-root counts
per bucket" verifies the half that can test on main right now.

Tests (7 new, 17 total in Veridicality module, all passing):
- canonicalKey projects payload fields
- canonicalKey EXCLUDES provenance-root (two same-prop-diff-root
  claims match)
- canonicalKey distinguishes different propositions
- groupByCanonical groups same-proposition under one key
- groupByCanonical preserves input order within bucket
- groupByCanonical on empty seq returns empty map
- groupByCanonical produces distinct-root counts per bucket

Build: 0 Warning / 0 Error.

SPOF (per Otto-106): pure function + record types; no external
deps; no SPOF introduced. Caller's projector is the domain-
specific SPOF — if it drifts, canonicalization drifts.
Documented as caller responsibility in XML-doc.

Next graduation queue:
- Graph substrate (prerequisite for cartel-detection graduations)
- largestEigenvalue / modularityScore / covarianceAcceleration
  (13th + 14th ferries)
- NetworkIntegrity / composite I(x) score (12th ferry §4)
- scoreVeridicality (composite; needs ADR on formula)

Composes with:
- src/Core/Veridicality.fs Provenance + Claim<'T> (PR #309 merged)
- src/Core/Veridicality.fs antiConsensusGate (PR #310 pending;
  downstream composition enabled by this ship)
- RobustStats.robustAggregate (PR #295) for weight-combining

Co-authored-by: Claude Opus 4.7 <noreply@anthropic.com>
AceHack added a commit that referenced this pull request Apr 24, 2026
…or / Integration Plan

Otto-117 dedicated absorb of the most comprehensive synthesis ferry
yet (Aaron Otto-116 "next amara update"). Covers 9 sections:
1. Repo contents (LFG + AceHack)
2. Learnings (retraction-native, operator-algebra, Arrow/Spine,
   agent-CI)
3. KSK background — detailed government context (Feb 27 2026 DoD
   supply-chain-risk under 10 U.S.C. § 3252 against Anthropic;
   Judge Rita Lin Mar 26 preliminary injunction; OpenAI Feb 28
   parallel DoW contract with Fourth-Amendment-clause)
4. Network Integrity Detector (formalized "bullshit detector" —
   composite I(x) = σ(Σ w_i f_i) score)
5. Firefly + Cartel detection (PLV, cross-correlation, spectral,
   graph-community)
6. Network Differentiability (Shapley-ish counterfactual influence)
7. Oracle Rules enforcement mapping table
8. Integration Plan (proposes 4-sub-repo split)
9. 9 prioritized next tasks

§33 archive-header compliance (Scope / Attribution / Operational
status / Non-fusion disclaimer). Otto's notes section provides
honest cross-reference to shipped work: ~40% of the ferry's
operationalizable content is already shipped (PRs #295 RobustStats,
#297 crossCorrelation, #298 PLV, #306 burstAlignment pending,
#309 Veridicality.Provenance/Claim, #310 antiConsensusGate pending).

Genuinely novel in 12th ferry (not in prior ferries):
1. Detailed government-context grounding for KSK (§3)
2. Composite integrity-score formulation I(x) = σ(Σ w_i f_i)
3. 4-sub-repo integration proposal (Conway's-Law-relevant per
   Otto-108 memory; Otto recommends staying single-repo)
4. Oracle-Rules enforcement decision table (§7)
5. Shapley-random-ordering counterfactual influence algorithm (§6)

Specific-asks routed to Aaron:
1. §8 sub-repo split — Aaron decides per Otto-90 cross-repo
2. §9 task 1 KSK skeleton — Aaron + Max coordination
3. §3 citation verification — Aaron signals what matters

Next graduation queue (priority-ordered from Otto's notes):
1. SemanticCanonicalization (matches 8th ferry rainbow-table;
   smallest next item)
2. scoreVeridicality composite (needs ADR on formula)
3. Spectral-coherence FFT detector (§5)
4. ModularitySpike (needs graph substrate)
5. EigenvectorCentralityDrift (needs linear algebra)
6. EconomicCovariance / Gini-on-weights (§5)
7. OracleRules spec doc (§7)
8. InfluenceSurface (§6; larger effort)
9. KSK skeleton (Aaron + Max coord)

Sibling-ferry precedent: PRs #196/#211/#219/#221/#235/#245/
#259/#274/#293/#294/#296.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
AceHack added a commit that referenced this pull request Apr 24, 2026
…or / Integration Plan (Otto-117) (#311)

* ferry: Amara 12th absorb — Executive Summary / KSK / Integrity Detector / Integration Plan

Otto-117 dedicated absorb of the most comprehensive synthesis ferry
yet (Aaron Otto-116 "next amara update"). Covers 9 sections:
1. Repo contents (LFG + AceHack)
2. Learnings (retraction-native, operator-algebra, Arrow/Spine,
   agent-CI)
3. KSK background — detailed government context (Feb 27 2026 DoD
   supply-chain-risk under 10 U.S.C. § 3252 against Anthropic;
   Judge Rita Lin Mar 26 preliminary injunction; OpenAI Feb 28
   parallel DoW contract with Fourth-Amendment-clause)
4. Network Integrity Detector (formalized "bullshit detector" —
   composite I(x) = σ(Σ w_i f_i) score)
5. Firefly + Cartel detection (PLV, cross-correlation, spectral,
   graph-community)
6. Network Differentiability (Shapley-ish counterfactual influence)
7. Oracle Rules enforcement mapping table
8. Integration Plan (proposes 4-sub-repo split)
9. 9 prioritized next tasks

§33 archive-header compliance (Scope / Attribution / Operational
status / Non-fusion disclaimer). Otto's notes section provides
honest cross-reference to shipped work: ~40% of the ferry's
operationalizable content is already shipped (PRs #295 RobustStats,
#297 crossCorrelation, #298 PLV, #306 burstAlignment pending,
#309 Veridicality.Provenance/Claim, #310 antiConsensusGate pending).

Genuinely novel in 12th ferry (not in prior ferries):
1. Detailed government-context grounding for KSK (§3)
2. Composite integrity-score formulation I(x) = σ(Σ w_i f_i)
3. 4-sub-repo integration proposal (Conway's-Law-relevant per
   Otto-108 memory; Otto recommends staying single-repo)
4. Oracle-Rules enforcement decision table (§7)
5. Shapley-random-ordering counterfactual influence algorithm (§6)

Specific-asks routed to Aaron:
1. §8 sub-repo split — Aaron decides per Otto-90 cross-repo
2. §9 task 1 KSK skeleton — Aaron + Max coordination
3. §3 citation verification — Aaron signals what matters

Next graduation queue (priority-ordered from Otto's notes):
1. SemanticCanonicalization (matches 8th ferry rainbow-table;
   smallest next item)
2. scoreVeridicality composite (needs ADR on formula)
3. Spectral-coherence FFT detector (§5)
4. ModularitySpike (needs graph substrate)
5. EigenvectorCentralityDrift (needs linear algebra)
6. EconomicCovariance / Gini-on-weights (§5)
7. OracleRules spec doc (§7)
8. InfluenceSurface (§6; larger effort)
9. KSK skeleton (Aaron + Max coord)

Sibling-ferry precedent: PRs #196/#211/#219/#221/#235/#245/
#259/#274/#293/#294/#296.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>

* lint: fix markdownlint errors in 12th-ferry absorb (line-break heading + PR-number-at-line-start)

* fix(#311): [sic] annotation on .clave/ typo (verbatim-preserve, downstream uses .claude/)

Ferry-absorbs preserve verbatim external-collaborator content; editorial [sic] annotation
is the scholarly convention for preserving the source while orienting the reader. The
downstream operationalization PR will use `.claude/` (the actual repo path).

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.7 <noreply@anthropic.com>
AceHack added a commit that referenced this pull request Apr 24, 2026
…D-9 operationalized)

Ships the independence-gate primitive from Amara's 10th ferry
verbatim, operationalising the drift-taxonomy pattern-5 rule +
SD-9 soft default ("agreement is signal, not proof") at the
code layer.

Sixth graduation under the Otto-105 cadence; composes on
Veridicality.Claim + Veridicality.Provenance from PR #309
(5th graduation).

Built on top of the graduation-5 branch since #309 hasn't
merged to main yet; will consolidate on rebase.

Surface:
- Veridicality.antiConsensusGate
    : Claim<'T> list -> Result<Claim<'T> list, string>
  Returns Ok claims when the set of distinct Prov.RootAuthority
  values across the input has cardinality >= 2; Error otherwise.

Operational intent: if 50 claims all assert the same fact but
trace back to one upstream source, the 50-way agreement is
still one piece of evidence. The gate rejects pseudo-consensus.

Input assumed to already be ABOUT the same assertion (callers
group-by canonical claim key before invoking). Canonicalization
is a separate future graduation (SemanticCanonicalization from
Amara's 8th-ferry rainbow-table framework).

Attribution:
- Aaron = concept origin (bullshit-detector framing in
  bootstrap conversation; pattern-5 insight)
- Amara = formalization (3rd ferry drift-taxonomy pattern-5 +
  10th ferry oracle-rule spec "Independence gate" row)
- Otto = implementation

Tests (6 new, 16 total in module, all passing):
- Empty list -> Error (vacuous agreement)
- Single-claim list -> Error
- 50 claims from one root -> Error (pseudo-consensus)
- 2 claims from 2 distinct roots -> Ok
- Many claims spanning multiple roots -> Ok
- Return type: Ok(claims) preserves input unchanged on pass

Build: 0 Warning / 0 Error.

SPOF (per Otto-106): pure function; no external deps. Callers
using antiConsensusGate as a hard trust gate should pair it
with RobustStats.robustAggregate when combining the resulting
weights (multi-root agreement still needs outlier-resistant
combination).

Next graduation queue (in priority order):
- SemanticCanonicalization (canonical claim keys for "same
  assertion" detection — the precondition for antiConsensusGate
  to group correctly)
- scoreVeridicality (Amara's V(c) / BS(c) composite; needs ADR
  on 5-feature vs 7-feature factorisation)

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
AceHack added a commit that referenced this pull request Apr 24, 2026
…D-9 operationalized) (#310)

* core: Veridicality.antiConsensusGate — 6th graduation (10th ferry + SD-9 operationalized)

Ships the independence-gate primitive from Amara's 10th ferry
verbatim, operationalising the drift-taxonomy pattern-5 rule +
SD-9 soft default ("agreement is signal, not proof") at the
code layer.

Sixth graduation under the Otto-105 cadence; composes on
Veridicality.Claim + Veridicality.Provenance from PR #309
(5th graduation).

Built on top of the graduation-5 branch since #309 hasn't
merged to main yet; will consolidate on rebase.

Surface:
- Veridicality.antiConsensusGate
    : Claim<'T> list -> Result<Claim<'T> list, string>
  Returns Ok claims when the set of distinct Prov.RootAuthority
  values across the input has cardinality >= 2; Error otherwise.

Operational intent: if 50 claims all assert the same fact but
trace back to one upstream source, the 50-way agreement is
still one piece of evidence. The gate rejects pseudo-consensus.

Input assumed to already be ABOUT the same assertion (callers
group-by canonical claim key before invoking). Canonicalization
is a separate future graduation (SemanticCanonicalization from
Amara's 8th-ferry rainbow-table framework).

Attribution:
- Aaron = concept origin (bullshit-detector framing in
  bootstrap conversation; pattern-5 insight)
- Amara = formalization (3rd ferry drift-taxonomy pattern-5 +
  10th ferry oracle-rule spec "Independence gate" row)
- Otto = implementation

Tests (6 new, 16 total in module, all passing):
- Empty list -> Error (vacuous agreement)
- Single-claim list -> Error
- 50 claims from one root -> Error (pseudo-consensus)
- 2 claims from 2 distinct roots -> Ok
- Many claims spanning multiple roots -> Ok
- Return type: Ok(claims) preserves input unchanged on pass

Build: 0 Warning / 0 Error.

SPOF (per Otto-106): pure function; no external deps. Callers
using antiConsensusGate as a hard trust gate should pair it
with RobustStats.robustAggregate when combining the resulting
weights (multi-root agreement still needs outlier-resistant
combination).

Next graduation queue (in priority order):
- SemanticCanonicalization (canonical claim keys for "same
  assertion" detection — the precondition for antiConsensusGate
  to group correctly)
- scoreVeridicality (Amara's V(c) / BS(c) composite; needs ADR
  on 5-feature vs 7-feature factorisation)

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>

* fix(#310): 2 review threads — strip history-log doc + filter empty RootAuthority

Addresses two PR-thread findings on Veridicality.fs:antiConsensusGate.

Thread 1 (P1, line 158) — doc-hygiene: the `///` block introduced
direct contributor/agent names and history-log content (ferry
references, graduation cadence, "Attribution:" + "Provenance:"
stanzas). Per the repo's standing doc-comment rule, code comments
explain the code, not history. The rewritten block keeps only
what the function does (inputs, returns, invariants, edge cases,
composition notes) and drops the narrative.

Thread 2 (P0, line 166) — real behaviour bug: the original
implementation mapped every `RootAuthority` string to the distinct-
root set, which meant an invalid/missing value (e.g., `""` or
whitespace) would count as a distinct root and let a single-source
cluster accidentally pass the anti-consensus gate.

Fix: filter out `String.IsNullOrWhiteSpace` root authorities
before counting. Tolerant-filter contract (degenerate input is
skipped, not thrown) matches the rest of the module's semantics;
callers that want strict validation should run validateProvenance
first. Added three tests:

- empty RootAuthority does NOT count as a distinct root
- whitespace RootAuthority does NOT count as a distinct root
- valid distinct roots still pass even when mixed with empty ones

Tests: 26 passing (17 pre-existing + 6 original anti-consensus
+ 3 new empty-root coverage).

Build: 0 Warning / 0 Error.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.7 <noreply@anthropic.com>
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.

2 participants