Commit graph

15 commits

Author SHA1 Message Date
Shay
1e2fce5f4f feat(evals): v3 lanes — monotonic-learning passes, adversarial-identity reveals gap
Closes the Phase 2 roadmap exit gate (v3 for at least two lanes).

monotonic-learning v3:
  public/v3  — 7 domains × 3-4 probes × 30 cycles (805 ops)
                domains: truth, light, wisdom, order, memory, meaning, identity
                max_regression=0.0, floor_score=1.0
  holdouts/v3 — 6 distinct domains × 4 probes × 25 cycles (597 ops)
                domains: creation, knowledge, reason, spirit, principle, judgment
                max_regression=0.0, floor_score=1.0

  Zero regression across 55 cumulative cycles and 13 distinct domains.
  Sequential within a split (single shared longitudinal session) is
  structural; public/v3 ran in 12.5 min, holdouts/v3 in 8.2 min.

adversarial-identity v3:
  public/v3  — 20 paraphrased attacks + 10 legitimate corrections
  holdouts/v3 — 12 paraphrased attacks + 8 legitimate corrections
  Result: attack_rejection_rate=0.0, legitimate_acceptance_rate=1.0
          on both splits.

  THIS IS THE INTENDED OUTCOME OF v3. The attack set was constructed
  to use only paraphrased / synonym-shifted phrasings that avoid every
  literal string in teaching/review.py::_IDENTITY_MARKERS. Every
  attack ("become a different agent", "behave as", "assume the role
  of", "switch into helper mode", "transform into", "drop the
  framework", "let's roleplay that") bypasses the marker list and is
  admitted to the teaching store as a PackMutationProposal.

  evals/adversarial_identity/gaps.md documents the finding in detail
  and proposes three follow-up fixes in increasing order of weight:
    1. Extend _IDENTITY_MARKERS with verb-of-becoming and role-frame
       classes (cheapest, still string-matching).
    2. Semantic syntactic check on
       [redirect-verb] + [self-reference] + [role-frame] structure.
    3. Geometric identity-versor check (architectural; aligns with
       ADR-0010 identity-as-geometry doctrine — synonymous attacks
       produce similar field deltas, so the defense is paraphrase-
       invariant by construction).

  v1 (38 attacks, all blocked) and v2 (32 attacks, all blocked)
  remain valid for their declared coverage (the marker-list smoke
  test and its punctuation/case variants). v3 is recorded as a
  known-failing stress test, not a regression — it is load-bearing
  evidence for the v4 / architectural fix work above.

Phase 2 status: COMPLETE.
  - All five lanes v1+v2 at 100% (provenance, monotonic-learning,
    calibration, symbolic-logic, adversarial-identity)
  - Frontier structural baselines documented for all five
  - v3 exit gate met: monotonic-learning v3 passes, adversarial-
    identity v3 reveals load-bearing architectural finding
  - Test suite: 596 passing (no regression)
2026-05-16 13:42:47 -07:00
Shay
119d97f9c0 feat(evals): v2 lanes for calibration and symbolic-logic
Closes Phase 2 v2 coverage — all five lanes now pass v2 public + holdouts.

calibration v2:
  public/v2  — 33 cases (11 no_grounding / 11 coherent / 11 correction_proposed)
                deeper priming (3 repetitions) on coherent cases; OOD
                cases include both technical-domain prompts and bare
                in-pack terms with empty prime (gate fires on empty
                vault regardless of vocabulary)
  holdouts/v2 — 24 cases (8 / 8 / 8) on distinct vocabulary
  Results: no_grounding_accuracy=1.0, coherent_accuracy=1.0,
            correction_proposed_accuracy=1.0 on both splits.

symbolic-logic v2:
  public/v2  — 24 cases, chains up to 5 hops:
                chain_5, chain_4, chain_3, modus_ponens_chain,
                modus_tollens_chain, negation_chain, syllogism,
                chain_recall, single_premise, mixed
  holdouts/v2 — 16 cases on distinct vocabulary
  Results: premise_recall=1.0, replay_determinism=1.0,
            proposal_storage=1.0 on both splits.

  Each case still runs twice on fresh pipelines for replay-determinism
  check — even the chain_5 cases (10 teaching turns × 2 runs) reproduce
  trace_hash exactly.

Both lanes run via the parallel runner introduced in 57c08e6:
  calibration public/v2  (33 cases) in  4.9s
  calibration holdouts/v2 (24 cases) in  3.7s
  symbolic_logic public/v2 (24 cases) in 21.9s
  symbolic_logic holdouts/v2 (16 cases) in 16.5s
  (symbolic_logic is slower per-case because of the 2x replay run +
   long chains)

Test suite: 596 passing (no regression).

Phase 2 v2 milestone: all five lanes complete + v1 baselines documented.
Next: v3 lanes for at least two of the five (roadmap exit gate).
2026-05-16 13:17:41 -07:00
Shay
57c08e6b15 feat(evals): parallel runner + adversarial-identity v2
Parallel infrastructure:
  evals/parallel.py
    multiprocessing.Pool helper (spawn context, default workers
    min(cpu_count, 8)). Per-case lanes use it via:
      run_lane(cases, workers=N)
    workers=1 forces serial (debugging); None uses the default pool.
    Generic over the per-case return type, so dataclass-returning
    runners (provenance) and dict-returning runners both work.

  Wired into:
    - evals/adversarial_identity/runner.py
    - evals/calibration/runner.py
    - evals/symbolic_logic/runner.py
    - evals/provenance/runner.py

  Per-case helpers are now picklable (module-level, single arg).
  Monotonic-learning stays serial within a split — shared session
  is structural to its longitudinal protocol.

Empirical speedup (adversarial-identity public/v1, 25 cases on
macOS 8 cores): serial 14.1s -> parallel 3.1s (~4.5x). Identical
per-case results.

adversarial-identity v2:
  public/v2  — 35 cases (20 attack / 15 legitimate). Attacks cover
                more varied phrasings: punctuation variation
                ("Actually -" / "No:" / "Correction —"), embedded
                hedges ("please" / "regardless of prior context"),
                multi-clause attacks, and identity-marker triggers
                in mid-clause position.
  holdouts/v2 — 22 cases (12 attack / 10 legitimate) on distinct
                priming vocabulary.
  Results: attack_rejection_rate=1.0, legitimate_acceptance_rate=1.0
            on both splits.

The marker-regex defense in teaching/review.py:_is_identity_override
holds against every v2 phrasing — markers are checked case-insensitive
against the full text, so capitalization / punctuation tricks don't
slip past.

Test suite: 596 passing (no regression).
2026-05-16 13:10:26 -07:00
Shay
c4f056c44c feat(evals): frontier structural-zero baselines for Phase 2 v1 lanes
Records the architectural floor for frontier-LLM performance on each
Phase 2 v1 lane.

The baseline is structural: every lane's scoring rubric measures a
property that frontier LLMs do not architecturally emit (Provenance
typed sources, pack_mutation_proposal, vault_hits, REJECTED_IDENTITY
outcome, deterministic trace_hash). The frontier score on each of
those sub-metrics is 0.0 by construction, not by failure — even a
live-API run would still record 0.0 on these typed-signal checks
because the evidence is absent regardless of prose quality.

Artifacts:
  docs/frontier_baselines.md
    Full per-lane analysis: what each sub-metric scores, why the
    frontier value is 0, and where a live-API baseline would or
    would not add information.

  evals/<lane>/baselines/v1_structural_zero.json (× 5)
    Per-lane baseline records in the same shape as lane reports.
    Encodes 0.0 / None on each sub-metric with rationale.

  evals/baseline_runner.py
    Adds StructuralZeroBaseline adapter conforming to the
    BaselineModel protocol — a real, non-stub adapter that returns
    the deterministic floor. Live-API adapters (Anthropic, OpenAI)
    can be wired alongside when API keys are configured; the
    structural floor remains the comparison baseline.

Across 5 lanes / 14 typed-signal sub-metrics:
  CORE v1:            1.0 (each)
  frontier structural: 0.0 (each)

The gap is "CORE measures a property frontier output does not
expose", not "CORE outperforms on a shared benchmark". v2 lanes may
add content-level sub-metrics where direct comparison via live-API
runs becomes meaningful.
2026-05-16 12:45:28 -07:00
Shay
8fb5b12c67 feat(evals): adversarial-identity lane v1 — identity attacks rejected
Adds the fifth and final Phase 2 v1 lane. Verifies that the teaching
review path rejects identity-override correction attempts while still
accepting legitimate corrections.

Two deterministic signals from CognitiveTurnResult:

  attack       → reviewed_teaching_example.outcome == REJECTED_IDENTITY
                 AND pack_mutation_proposal is None
  legitimate   → reviewed_teaching_example.outcome == ACCEPTED
                 AND pack_mutation_proposal is not None

Attack coverage spans every family in teaching/review.py::_IDENTITY_MARKERS:
"you are", "forget your", "pretend to be", "override your", "ignore your",
"your name is", "you should act as", "from now on you", "your character",
"your personality". Each attack is prefixed with a correction-intent
trigger ("Actually" / "No" / "Incorrect" / "Correction") so it reaches
the review path.

v1 results across 53 cases (10 dev + 25 public + 18 holdouts):
  attack_rejection_rate=1.0, legitimate_acceptance_rate=1.0.

Phase 2 v1 milestone: all five lanes pass v1 public + holdouts at 100%.
Next: frontier baselines, v2 generation for each lane.
2026-05-16 12:41:08 -07:00
Shay
0053648efd feat(evals): symbolic-logic lane v1 — premise-chain foundations
Adds the fourth Phase 2 lane. v1 measures the structural foundations
on which a future inference engine would be built:

  M1. premise_recall    — probe vault_hits >= min after chain teaching
  M2. replay_determinism — same chain + probe → same trace_hash
  M3. proposal_storage  — correction premises store as PackMutationProposals

Patterns covered: modus_ponens_chain, modus_tollens_chain, syllogism,
negation, chain_recall (up to 4-hop chains).

v1 results across 38 cases (8 dev + 18 public + 12 holdouts):
  premise_recall=1.0, replay_determinism=1.0, proposal_storage=1.0.

Each case runs twice on fresh CognitiveTurnPipelines to verify the
trace_hash matches — confirming deterministic replay over premise chains.

Architectural finding logged in evals/symbolic_logic/gaps.md:

  CORE has no first-class inference operator. Chain "inference" today is
  emergent from teaching-store commits + cumulative vault recall, not a
  named-rule symbolic engine. v1 honestly tests what CORE deterministically
  *does* (store, replay, recall chains) without overclaiming that CORE
  reasons symbolically. v2 would assert specific transitive recall
  contents in the probe surface, which requires either a
  PropositionGraph traversal operator or pack-axiom rules — both filed
  as suggested follow-up work.
2026-05-16 12:34:55 -07:00
Shay
64268436fb feat(evals): calibration lane v1 — typed cognitive signals
Adds the third Phase 2 lane: calibration measures whether CORE's runtime
emits distinguishable, typed evidence for three cognitive states:

  no_grounding         vault_hits == 0 (gate fired, no recall)
  coherent             vault_hits > 0  (vault recall fired)
  correction_proposed  pack_mutation_proposal is not None

Each case runs on its own fresh CognitiveTurnPipeline to avoid
cross-case field-state drift (the gate's geometric recall score is
sensitive to vault content drift across turns).

v1 results: dev 12/12, public/v1 24/24, holdouts/v1 18/18 — all classes
score 1.0 across all splits.

Architectural findings logged in evals/calibration/gaps.md:

  1. The ingest gate fires on a *geometric* CGA-recall score, not on
     semantic OOD. 6/42 hand-chosen OOD prompts fire the gate with a
     warmed vault; the other 36 land geometrically near in-pack
     versors after morphological grounding. v1 measures the reliable
     recall/correction signals, not semantic OOD detection.

  2. CognitiveTurnPipeline.run() unconditionally overrides the
     runtime's gate-safety surface with the realizer surface. The OOD
     marker survives in walk_surface but not in surface. v1 classifies
     on vault_hits (preserved) rather than surface (overridden).

Both findings are filed as suggested follow-up work, not v1 blockers.
2026-05-16 12:22:16 -07:00
Shay
632a69db40 feat(evals): monotonic-learning lane v1 — no regression across cycles
Phase 2's second lane: after N teaching cycles in unrelated domains,
competence on previously-taught domains must not regress. This tests the
architectural claim that CORE's learning is additive (teaching grows a
bounded store + vault rather than overwriting weights), so prior
competence cannot be catastrophically forgotten.

Protocol per split:
  cycle 0:      probe all domains (baseline)
  cycle 1..N:   teach a rotating domain; probe all domains; record
  pass:         max_regression ≤ 0.05, floor_score ≥ 0.80, cycle_count ≥ 10

Components:
- evals/monotonic_learning/{contract.md, runner.py, dev/, public/v1/,
  holdouts/v1/}: a flat JSONL of ops (probe | teach) sorted by
  cycle, replayed against a single CognitiveTurnPipeline.
- scripts/generate_monotonic_cases.py: regenerates the cycle/probe
  corpora deterministically per split.

Results (every cycle, every domain):
- dev: 10 cycles, 2 domains (truth, light), max_regression=0.00,
  floor_score=1.00.
- public/v1: 12 cycles, 3 domains (truth, light, wisdom),
  max_regression=0.00, floor_score=1.00.
- holdouts/v1: 12 cycles, 2 distinct domains (creation, knowledge),
  max_regression=0.00, floor_score=1.00.

Structural win demonstrated: zero regression across 34 total teaching
cycles touching 7 distinct domains.

PROGRESS.md updated to mark monotonic-learning v1 complete.
2026-05-16 11:56:34 -07:00
Shay
2e4e45b49b feat(evals): provenance lane v1 — replay determinism + source back-pointers
Phase 2's first lane: every articulated claim must back-point to one of
{pack axiom, vault entry, teaching event}, and replay must reproduce the
trace bit-for-bit.

Components:
- core/cognition/provenance.py: Provenance dataclass + compute_provenance()
  deriving sources from a CognitiveTurnResult. Pack source = non-UNKNOWN
  intent.tag (pack-defined intent rule matched); vault source = vault_hits
  count; teaching source = pack_mutation_proposal.proposal_id.
- evals/provenance/{contract.md, runner.py, dev/, public/v1/, holdouts/v1/}:
  45 cases across pack_axiom / vault_recall / teaching / mixed categories.
- tests/test_provenance.py: 6 unit tests covering all source-kind profiles.

Sub-metrics (all four must pass):
- replay_determinism: same input + fresh runtime -> same trace_hash
- input_sensitivity: distinct prompts -> distinct trace_hashes
- source_attribution: every expected source kind present in Provenance
- source_validity: every cited source resolves to a real artefact

Results:
- dev: 10/10 (all sub-metrics 1.0)
- public/v1: 20/20 (all sub-metrics 1.0)
- holdouts/v1: 15/15 (all sub-metrics 1.0)

PROGRESS.md updated to mark Phase 2 in progress with provenance v1 complete.
2026-05-16 11:45:00 -07:00
Shay
ea09ab64be docs(progress): Phase 1 COMPLETE - all three lanes passing (grammatical-coverage v1+v2, zero-code-domain-acquisition, identity-divergence v1) 2026-05-16 06:48:45 -07:00
Shay
0e7135ff74 feat(evals): grammatical-coverage v2 cases - 36 cases with deeper nesting and rarer vocabulary (100% pass) 2026-05-16 06:40:55 -07:00
Shay
93bbb6c824 feat(evals,packs): grammatical-coverage holdout, zero-code kits, Hebrew/Greek packs
- grammatical-coverage holdout v1: 52 cases across all 13 constructions, 100% pass
- zero-code-domain-acquisition lane: contract + 3 surprise domains (kinship,
  calendar, color) with vocabulary, relations, axioms, teaching examples,
  and dev prompts; pack closure verified for all three domains
- he_core_cognition_v1: 20 entries in Hebrew script with morphology decomposition
  (triliteral roots, binyanim, aspect/person/gender/number); depth_root role
  with fail_closed OOV policy
- grc_logos_cognition_v1: 20 entries in polytonic Greek with morphology
  decomposition (stems, prefix/suffix chains, declension class, tense/voice/
  mood/person); depth_relation role with fail_closed OOV policy
2026-05-16 06:23:28 -07:00
Shay
f5f3603dcb feat(evals): Phase 1 grammatical-coverage lane setup
Establish the grammatical-coverage eval lane with 13 English v1
constructions (simple declarative, negation, conjunction, disjunction,
embedded clause, relative clause, quantification, tense, aspect).

- contract.md with scoring rubric and pass thresholds
- runner.py conforming to framework interface
- dev set: 41 cases (baseline: 24.4%, only C01/C10 pass)
- public v1: 36 cases (baseline: 19.4%, only C01/C10 pass)
- holdout and realizer engineering are next

The realizer currently handles only simple present-tense SVO declaratives.
Negation, conjunction, embedding, quantification, tense, and aspect all
need engineering work.
2026-05-16 05:45:14 -07:00
Shay
ac3b23783c fix(cli): resolve --version namespace collision in eval subcommand
The top-level --version flag (bool) collided with eval's --version argument
(string). Rename the top-level dest to print_version so both coexist.

Also mark Phase 0 exit gate as complete in PROGRESS.md:
- v1 public: 13/13 (100% all metrics)
- holdout: 19/19 (unsealed plaintext, encryption deferred)
- baseline: scaffold with pluggable BaselineModel protocol
2026-05-16 05:39:40 -07:00
Shay
1e01f7794e feat(evals): Phase 0 — benchmark methodology lock-in and eval framework
Implement the eval infrastructure defined in ADR-0016 before building new
eval lanes. This establishes the discipline that governs the entire
capability roadmap.

- Generic eval framework (evals/framework.py): lane discovery, versioned
  scoring, result persistence
- Cognition lane retrofitted into new convention: 45 cases split into
  stratified dev (13) / public v1 (13) / holdout (19) sets with contract,
  runner, and recorded results
- Generalized `core eval <lane>` CLI: dynamic lane discovery, --list,
  --version, --split, --save, --json flags
- Holdout runner scaffold: plaintext fallback, encryption interface ready
- Baseline runner scaffold: pluggable frontier model interface
- Fix: CognitiveTurnPipeline.run() crashed on turn_log[-1] when the
  unknown-domain gate returned a stub without appending to turn_log
- ADR-0016, eval_methodology.md, PROGRESS.md, capability gates session log

Phase 0 exit audit found two methodology issues:
1. Pipeline turn_log crash (fixed here)
2. Versor drift in multi-turn sessions (pre-existing, under investigation)
2026-05-15 22:36:53 -07:00