* test(proposals): cover derived CLOSE proposal bridge - Flag-off and emission for member/subset + relational transitive derived facts. - Stable dedupe, skips for non-derived/malformed/unsupported. - No status upgrade, no corpus side-effects. - Runtime flag wiring smoke (consolidate + bridge on → emits after idle_tick). - Re-runs of PR-1 tests + invariants stay green. * feat(proposals): emit review-gated proposals from derived CLOSE facts - New focused emitter generate/determine/derived_close_proposals.py: - collect eligible derived (member/subset + TRANSITIVE) with entailed Derivation + SPECULATIVE. - deterministic sort + stable dedupe key (predicate+args+derivation+structure_key). - write proposal-only artifacts (source=derived_close_fact) to dedicated sink. - best-effort, counts returned, safe skips. - RuntimeConfig: review_derived_close_proposals (default False), documented. - ChatRuntime.idle_tick: after consolidation (when flag on), call emitter best-effort (no did_work, no engine checkpoint). - IdleTickResult: new field derived_close_proposals_emitted (additive, documented). - No change to existing proposal_review contract or comprehension-failure sink. - No serving/determine side-effects. * docs(proposals): document derived CLOSE proposal bridge - docs/runtime_contracts.md: new subsection under idle passes describing eligibility, contract (proposal-only, review-gated, default-off, no corpus/COHERENT/serving change), and cross-ref to the analysis note. - New dated analysis note with why (flywheel bridge after PR-1), architecture/boundaries, artifact schema, dedupe, tests, non-goals, and composition with PR-1/PR-3. - Tiny high-level pointer not added (no suitable learning-loop section in README at this granularity). * fix(proposals): harden derived CLOSE proposal emission
4.7 KiB
PR-2: Derived CLOSE Facts → Review-Gated Proposal Bridge
Date: 2026-06-16
Branch: feat/close-derived-proposal-bridge
Base: a1bdaa2c (origin/main with PR #788 merged)
Governing sequence: PR-1 (substrate — relational transitive CLOSE) → PR-2 (this: proposal bridge) → PR-3 (yardstick measurement)
What PR-2 adds
A deterministic, default-off proposal emitter that surfaces proof-gated derived CLOSE facts as reviewable proposal artifacts.
Eligible derived facts (after consolidation):
derived is Truederivation is not Nonewithverdict == "entailed"epistemic_status == "speculative"relation_predicate∈ {"member", "subset"} ∪ TRANSITIVE_PREDICATES (the four strict-order predicates)
Ineligible (skipped safely, never emitted):
- Direct (non-derived) facts
- Missing or non-entailed derivation
- Non-speculative standing
- Unsupported predicates (e.g. parent_of, sibling_of, left_of)
- Malformed records
Artifacts are written as JSON to teaching/proposals/derived_close_facts/<dedupe_key>.json with explicit fields:
- source: "derived_close_fact"
- predicate, subject, object, relation_arguments
- derivation: {rule, verdict, premise_structure_keys}
- epistemic_status, structure_key, dedupe_key
- status: "proposal_only", requires_review: true, mounted: false
Dedupe is stable across ticks and runs (predicate + args + derivation provenance + structure_key).
Why (the flywheel bridge)
PR-1 (CLOSE relational transitive) lets the lived loop derive and remember more sound conclusions as SESSION/SPECULATIVE facts. Without a proposal path, those facts stay trapped in session memory and never reach the reviewed learning path.
PR-2 completes the "comprehend → realize → determine → CLOSE consolidate → propose" half of the flywheel while preserving the hard boundary: only human-reviewed mutation (via the existing HITL proposal review) can produce durable (COHERENT/ratified) knowledge. Derived CLOSE proposals are proposal-only.
Architecture & boundaries (strictly observed)
- After consolidation, before (or alongside) existing proposal review. Runs in idle_tick only when
config.review_derived_close_proposals(default False). - Read/write separation. The emitter writes artifacts. Review consumption re-uses or parallels the existing read-only
core.proposal_reviewmachinery (no mutation of the review contract in this PR). - No side effects on serving/determine. Emission never alters user-facing surface, determine answers, or any runtime field.
- No learning/ratification. Artifacts stay SPECULATIVE/proposal_only. No pack writes, no corpus mutation, no COHERENT promotion, no mounting.
- Safe failure. Malformed records and I/O errors are counted/skipped; the tick continues. No did_work / engine checkpoint is set by proposal emission (proposals live outside engine_state).
- Determinism. Collection sorts by (predicate, subject, object). Dedupe key is a content hash of the provenance tuple. Repeated identical state → zero new emissions.
Tests & gates
- Flag-off: no emission, no behavior change.
- Emission for member/subset derived and for relational-transitive derived (less_than, before_event, etc.).
- Stable dedupe on second run.
- Skips for direct facts, malformed, unsupported predicates.
- No status upgrade (remain speculative, proposal_only).
- Re-run of PR-1 tests + architectural invariants remain green.
- wrong_total == 0 on touched surfaces.
Documentation
docs/runtime_contracts.md— new subsection under idle passes documenting the bridge, eligibility, and contract.- This note.
- Tiny pointer in root README (if a learning-loop section existed; kept high-level).
Commit shape
- test(proposals): cover derived CLOSE proposal bridge (flag-off, emit for both is-a and relational, dedupe, skips, no mutation).
- feat(proposals): emit review-gated proposals from derived CLOSE facts (emitter + idle_tick wiring behind the flag).
- docs(proposals): document the bridge in contracts + this analysis note.
Non-goals (explicit)
- No PR-3 yardstick / capability index lane.
- No FrameVerdict serving or default wiring.
- No determine() answer=False or semantic broadening.
- No corpus/pack mutation.
- No auto-ratify, no COHERENT, no mounting.
- No broad hygiene or unrelated test fixes.
- No change to existing comprehension-failure proposal review contract (additive only).
PR-2 is the minimal bridge that makes the richer derived facts from PR-1 visible to the review path without violating any red line or the SESSION vs. reviewed learning boundary.
Next (after merge): PR-3 yardstick to measure the autonomous CLOSE climb (answerable-set growth with wrong_total=0).
This note + the contracts update close the documentation obligation for the design/capability change.