core/generate
Shay dccce6a7b9 fix(generate): a proposition graph must be able to represent denial (ADR-0265)
CORE served the affirmative of propositions the user denied. Measured live on
main @ 536d6e55 with realizer_grounded_authority=True:

    "evidence does not support truth" -> 'Evidence is verified: what supports truth.'
    "evidence supports truth"         -> 'Evidence is verified: what supports truth.'

Byte-identical.

Phase 4 (#136) pinned "render_semantic has no negated parameter" as a defect.
Sizing the exposure before acting on it -- the step §7 requires -- showed the
pin was correct and INCOMPLETE. The defect is two drops in series, and the
first is in the graph:

  intent.negated      parsed from the user's words, always has been
  GraphNode           NO FIELD FOR IT  <-- first drop
  ground_graph        rebuilds nodes field-by-field; nothing to carry
  depth enrichment    rebuilds nodes field-by-field; nothing to carry
  plan_articulation   cannot carry what the node does not hold
  realize_semantic    never read step.negated
  render_semantic     no parameter for it                <-- second drop

Five separate constructors, each silently defaulting to the affirmative.

Why every gate was green
------------------------
On the default config the ungrounded realizer emits "...", _is_useful_surface
rejects it, and the runtime echo wins the resolver -- and the echo contains the
user's own "does not". The truth path was correct BY ACCIDENT. ADR-0088 Phase B
grounds the graph first, which is exactly when the realizer's surface becomes
useful enough to win. So the defect sat behind a shipped flag, invisible to
every property-of-one-surface test, because nothing compared a denial to its
assertion.

Delivered
---------
- GraphNode.negated, threaded intent -> graph -> ground -> enrich -> step ->
  surface. Serialized ONLY when True, so every pre-existing as_dict and every
  trace_hash folded from one stays byte-identical -- which is why no lane pin
  moves.
- Clause grammar delegated to its one owner. Four of the eight intent
  "templates" were never frames; they were plain clauses. They now call
  render_step. Writing a second negation implementation in semantic_templates
  was the tempting fix and is rejected: Phase 2A spent a unit giving every
  linguistic fact one owner, and that design rebuilds the disease one level up.
- Frames that keep a finite verb (VERIFICATION, PROCEDURE, COMPARISON) get an
  explicit negated form. RECALL is a speech act with no proposition to deny, so
  it falls back to the clause path rather than drop the denial (ADR-0261 §5.1).

Measured
--------
    delegation on affirmatives          192/192 byte-identical
    serving realizer, all corpora       85/347 -> 109/347   (+24 = the denials)
    feature-bearing bucket              49/214 -> 73/214
    CONTROL (nothing droppable)         33/33  -> 33/33     unchanged
    multi-node (clause joining)         3/100  -> 3/100     unchanged, out of scope
    lane pins                           11/11 byte-identical, none edited

The control staying 33/33 and multi-node staying 3/100 is the evidence that
this moved the denials and nothing else.

The exhaustive control earned its keep immediately
--------------------------------------------------
It found FIVE more intents serving a denial as its own assertion --
TRANSITIVE_QUERY, FRAME_TRANSFER, NARRATIVE, EXAMPLE, DEDUCTION -- because an
intent with no frame fell back to the UNKNOWN *template* (which cannot say
"not") rather than the UNKNOWN *clause* (which can). The default is now the
capable path, so the next intent added inherits correctness. Found by the
control, not by inspection.

Mutation -- every link reverted individually
--------------------------------------------
    baseline                                        19 pass
    graph_from_intent drops intent.negated           8 FAIL
    plan_articulation drops node.negated             6 FAIL
    ground_graph drops it on rebuild                 2 FAIL
    realize_semantic stops passing step.negated      6 FAIL
    unframed intents fall back to the template       1 FAIL
    pipeline depth-enrichment drops it               1 FAIL

The last row was GREEN on the first run -- my fix there was unguarded. That is
what added the structural invariant: every GraphNode(...) built on the serving
path must NAME `negated` or be recorded in an allowlist with a reason. The
defect was five constructors; a per-site test must be written per site, and a
site added without one is invisible. Only recognition/connector.py is exempt
(an EpistemicNode has no polarity to carry).

Four Phase 4 pins are revised, not relaxed -- #136's M2 mutation ("render_semantic
GAINS a negated parameter -> FAIL") has now happened for real, and forced the
deliberate revision it was built to force.

Registered in `smoke` in the same PR that creates it, per the #136 finding that
an unregistered pin runs nowhere.

Still unexpressed, deliberately: quantifier, tense, aspect. NO PRODUCER sets
them anywhere on the serving path, so threading them would be machinery with no
caller. render_step already handles all three the moment a producer exists.

[Verification]: in-worktree on CPython 3.12.13 with `uv sync --locked` --
smoke 641 (was 621), deductive 503, lane pins 11/11 with no pin edited.
2026-07-27 13:08:17 -07:00
..
answer_choices feat(answer-choices): multiple-choice verifier with contradiction flag (R2 C4) 2026-06-07 07:26:00 -07:00
binding_graph Lane 4: Registry Consolidation (language_packs to packs) 2026-07-04 15:11:28 -07:00
combined_rate_comprehension docs(cmb): lookback review + fix single-agent-attribution hygiene hazard (H3) 2026-06-08 13:27:17 -07:00
composition feat(determine): add transitive strict-order relational inference (#781) 2026-06-15 14:20:30 -07:00
comprehension Lane 4: Registry Consolidation (language_packs to packs) 2026-07-04 15:11:28 -07:00
constraint_comprehension docs(comprehension): whole-system organ capability ledger + fix ADR-0211 number collision 2026-06-08 06:15:51 -07:00
contemplation feat: 3lang depth PropGraph unification - phase refinements, wiring, tests + session pickup cleanups/governance 2026-07-08 07:07:11 -07:00
cue_precision
derivation feat: retire fraction_decrease prose regex — bind dilation from frame scale 2026-07-08 20:09:49 -07:00
determine feat(provenance,teaching): close the lateral gaps the assessment actually found 2026-07-25 04:51:15 +00:00
frame_verdict feat(frame-verdict): closed-world FrameVerdict substrate — PR-1..4 + hardening (ADR-0222 B4) (#787) 2026-06-16 06:23:03 -07:00
linguistic_pipeline feat(cognition): fail-closed linguistic governance + trilingual constraint pipeline 2026-07-20 16:16:56 -07:00
meaning_graph fix(generate): CORE writes plural nouns in categorical clauses (Phase 2B) 2026-07-26 18:42:42 -07:00
observed_he_morph_v0 feat(logos): bulk live morph authority on turn + teaching seams 2026-07-20 16:35:04 -07:00
proof_chain fix(generate): CORE writes plural nouns in categorical clauses (Phase 2B) 2026-07-26 18:42:42 -07:00
rate_comprehension feat(rate): exact time-unit conversion for single-rate (R3.2b-e) 2026-06-08 05:43:51 -07:00
realize
structure_mapping fix(trackb): pure-S1 extract refuse multi-clause overmatch (0361 wrong=0) 2026-07-19 20:04:27 -07:00
__init__.py
admissibility.py
articulation.py
articulation_legality.py
attention.py
bridge_trace.py chore: Refactor CLI and Governance Anchors (#926) 2026-07-03 12:34:56 -07:00
candidate_operator.py style(kernel): place quantity-entity builder before exports 2026-06-23 05:43:17 -07:00
compute_budget.py feat(kernel): implement diagnostic-only ComputeBudgetDecision 2026-06-22 13:13:49 -07:00
construction_affordances.py chore(kernel): tighten construction_affordances catalog invariants (#930) 2026-07-06 08:38:23 -07:00
contract_residuals.py feat(kernel): add ContractResidual projection 2026-06-22 08:06:32 -07:00
dialogue.py
discourse_planner.py refactor(generate): one owner per linguistic fact (Phase 2A) 2026-07-26 17:45:27 -07:00
epistemic_basis.py feat(frame-verdict): closed-world FrameVerdict substrate — PR-1..4 + hardening (ADR-0222 B4) (#787) 2026-06-16 06:23:03 -07:00
exhaustion.py
field_incidence_reader.py work done towards furthering comprehension, contemplation, learning, and also began working on fixing some failing tests 2026-06-16 12:27:59 -07:00
foundational_families.py fix(kernel): align unary-delta implementation with conformance decision 2026-06-21 20:19:53 -07:00
geometric_search_run.py feat(kernel): implement inert GeometricSearchRun trace shell 2026-06-22 14:09:52 -07:00
graph_constraint.py
graph_planner.py fix(generate): a proposition graph must be able to represent denial (ADR-0265) 2026-07-27 13:08:17 -07:00
grounding_accessors.py
intent.py feat(deduction-serve): Phase 1 — deduction turn spine (flag-gated, propositional Band v1) 2026-07-23 12:14:28 -07:00
intent_bridge.py fix(generate): a proposition graph must be able to represent denial (ADR-0265) 2026-07-27 13:08:17 -07:00
intent_ratifier.py fix(cognition): pre-stage land repairs after L2/PASSTHROUGH excision 2026-07-20 13:34:59 -07:00
kernel_facts.py Lane 4: Registry Consolidation (language_packs to packs) 2026-07-04 15:11:28 -07:00
lexicon.py fix(generate): inflect the head verb on every branch, not just the plural two 2026-07-27 11:17:38 -07:00
logic_canonical.py
logic_equivalence.py
math_candidate_graph.py fix: fold Gemini CGA/fraction_decrease compatibility into deck PR 2026-07-08 20:00:51 -07:00
math_candidate_parser.py feat(reader-arc): #78 positive-polarity allowlist substrate (seed + comparison) — foundations, band-solve=0 2026-07-18 21:18:02 -07:00
math_completeness.py Lane 4: Registry Consolidation (language_packs to packs) 2026-07-04 15:11:28 -07:00
math_parser.py Lane 4: Registry Consolidation (language_packs to packs) 2026-07-04 15:11:28 -07:00
math_problem_graph.py feat(derivation): Gate A2b case 0002 fractional rest composition (#810) 2026-06-17 19:08:24 -07:00
math_realizer.py feat(derivation): Gate A2b case 0002 fractional rest composition (#810) 2026-06-17 19:08:24 -07:00
math_roundtrip.py feat(reader-arc): #78 positive-polarity allowlist substrate (seed + comparison) — foundations, band-solve=0 2026-07-18 21:18:02 -07:00
math_solver.py Lane 4: Registry Consolidation (language_packs to packs) 2026-07-04 15:11:28 -07:00
math_symbolic_equivalence.py
math_symbolic_normalizer.py
math_verifier.py feat(derivation): Gate A2b case 0002 fractional rest composition (#810) 2026-06-17 19:08:24 -07:00
morphology.py fix(generate): inflect the head verb on every branch, not just the plural two 2026-07-27 11:17:38 -07:00
ood_surface_generator.py
operators.py
perturbation_suite.py
problem_frame.py Lane 4: Registry Consolidation (language_packs to packs) 2026-07-04 15:11:28 -07:00
problem_frame_bound_relations.py refactor(kernel): split ProblemFrame builder phases (#919) 2026-06-25 16:16:04 -07:00
problem_frame_builder.py Lane 4: Registry Consolidation (language_packs to packs) 2026-07-04 15:11:28 -07:00
problem_frame_contracts.py fix(a2k): share fraction-decrease scale domain on geometric admission 2026-07-20 04:40:35 +00:00
problem_frame_extractors.py Lane 4: Registry Consolidation (language_packs to packs) 2026-07-04 15:11:28 -07:00
problem_frame_mentions.py refactor(kernel): split ProblemFrame builder phases (#919) 2026-06-25 16:16:04 -07:00
problem_frame_proposals.py refactor(kernel): split ProblemFrame builder phases (#919) 2026-06-25 16:16:04 -07:00
process_frames.py feat: implement kernel substrate tranche 1 base-layer foundations (#829) 2026-06-18 18:46:20 -07:00
proposition.py
quantitative_comprehension.py feat(comprehension): inverse reader frame — base of a more/fewer-than (PR-7b / R2 C0) 2026-06-07 07:06:26 -07:00
quantitative_expr.py
realizer.py fix(generate): a proposition graph must be able to represent denial (ADR-0265) 2026-07-27 13:08:17 -07:00
realizer_guard.py refactor(generate): one owner per linguistic fact (Phase 2A) 2026-07-26 17:45:27 -07:00
recognizer_anchor_inject.py feat(derivation): Gate A2a unit partition injection (#809) 2026-06-17 18:14:24 -07:00
recognizer_match.py fix(reader-arc): compound extractor refuses no-digit compare clauses (wrong=0 hazard) 2026-07-18 21:44:34 -07:00
recognizer_registry.py
relational_field_reader.py
relational_operator_ablation.py feat(generate): deterministic relational operator ablation runners 2026-07-19 21:00:15 -07:00
relational_symbolic_reader.py
replay_adapter.py feat(kernel): add quantity-entity replay target shell 2026-06-23 06:13:28 -07:00
result.py
rotor_admissibility.py
run_attempt_binding.py feat(kernel): implement run-attempt binding shell 2026-06-22 23:12:16 -07:00
salience.py
sealed_practice_trace.py fix(kernel): fail-closed bound trace structural validation 2026-06-23 00:11:14 -07:00
search_gate.py feat(kernel): implement diagnostic-only SearchGateDecision 2026-06-22 11:36:05 -07:00
semantic_templates.py fix(generate): a proposition graph must be able to represent denial (ADR-0265) 2026-07-27 13:08:17 -07:00
stream.py fix(tests): clear pre-existing full-suite reds (INV-21 pins + rotor_power) 2026-07-15 15:39:09 -07:00
surface.py
templates.py fix(generate): inflect the head verb on every branch, not just the plural two 2026-07-27 11:17:38 -07:00