Skip to content

dev: reh3376_dev01 -> main#482

Merged
reh3376 merged 433 commits into
mainfrom
reh3376_dev01
Jun 26, 2026
Merged

dev: reh3376_dev01 -> main#482
reh3376 merged 433 commits into
mainfrom
reh3376_dev01

Conversation

@github-actions

Copy link
Copy Markdown
Contributor

Summary

Development branch changes from reh3376_dev01.

Commits

  • Merge branch 'reh3376_dev01' of https://github.com/reh3376/mdemg into reh3376_dev01
  • fix(embed-callsite-001): attribute the 3 metaless embed paths (close alert_embedding_regression)
  • chore: sync reh3376_dev01 with main (post-merge base advance)
  • docs(.env.example): document Lever C balanced + maximal config notes (opt-in)
  • docs(jiminy-actionability-001): verify balanced Lever C config across fresh contexts
  • docs(jiminy-actionability-001): retune Lever C to relevance-balanced (enabled live)
  • docs(jiminy-actionability-001): SIM_FLOOR sweep + >90%-actionable config (enabled live)
  • chore: sync reh3376_dev01 with main (post-merge base advance)
  • docs(jiminy-actionability-001): Lever C live A/B result + docs (Epics 5d+5e)
  • fix(jiminy-actionability-001): Lever C role-filtered cosine query (live-smoke find)
  • feat(jiminy-actionability-001): Lever C — constraint-inclusion mechanism + score audit (Epics 5b+5c)
  • chore(jiminy-actionability-001): commit reusable A/B harness + post.md (Epic 5a loose ends)
  • chore: sync reh3376_dev01 with main (post-merge base advance)
  • feat(grafana-audit-002): fix dead p50 panel + add new-gauge panels (Epics 2-4)
  • docs(grafana-audit-002): Phase 1 re-audit + sprint plan (Epic 0)
  • chore: sync reh3376_dev01 with main (post-merge base advance)
  • fix(dashboard-fixes-001): make backup_list UATS item assertions optional (CI has no backups)
  • test(dashboard-fixes-001): Playwright assertions + fix flaky RSIC-cycle timeout + docs (Epic 4)
  • fix(dashboard-fixes-001): low/polish — config handler, status checks, features config_key, training tables (Epic 3)
  • fix(dashboard-fixes-001): medium tab bugs — plugins label, memory distribution, rsic poll (Epic 2)
  • fix(dashboard-fixes-001): critical tab bugs — backup fields, learning freeze, rsic badge (Epic 1)
  • docs: capture outstanding backlog ledger (jiminy-actionability finish, dashboard-fixes, grafana-audit-002)
  • chore: sync reh3376_dev01 with main (post-merge base advance)
  • docs(hidden-churn-003): close the must-fix residual — 100% survival live (Epic 5)
  • test(hidden-churn-003): Tier 1 unit + Tier 2 incremental idempotency tests (Epic 3)
  • feat(hidden-churn-003): incremental hidden-layer clustering (Epics 1+2)
  • docs(hidden-churn-003): sprint plan — incremental clustering to close the ~25% residual churn (Epic 0)
  • chore: sync reh3376_dev01 with main (post-merge base advance)
  • docs(hidden-churn-002): reframe ~25% residual as an OPEN must-fix defect, not a tracked limitation
  • docs: keep canonical docs current — jiminy-actionability CLAUDE.md note + ROADMAP follow-ups
  • chore: sync reh3376_dev01 with main (post-merge base advance)
  • docs(jiminy-actionability-001): Epic 4 live A/B result + feature doc (Epics 4+6)
  • docs(hidden-churn-002): feature doc + post + CHANGELOG + CLAUDE note (Epic 5)
  • fix(hidden-churn-002): consolidation completion + member-overlap matching + determinism (Epic 4 live)
  • test(hidden-churn-002): Tier 1 unit + Tier 2 idempotency tests (Epic 3)
  • feat(hidden-churn-002): match-in-place hidden patterns + CUIDv2 ids (Epic 2)
  • feat(hidden-churn-002): hidden-pattern identity helpers + config (Epic 1)
  • docs(hidden-churn-002): sprint plan — fix hidden-pattern destroy-recreate churn (Epic 0)
  • feat(jiminy-actionability-001): Lever B directive-mode synthesis (Epic 3)
  • feat(jiminy-actionability-001): baseline + surfaced-composition gauge + Lever A reweighting (Epics 1+2)
  • chore: sync reh3376_dev01 with main (post-merge base advance)
  • fix(hitl-review-001): adjudicate /v1/review/* routes in the consumer inventory
  • docs(hitl-review-001): feature doc + CHANGELOG + post + CLAUDE.md + dashboard-fixes-001 plan (Epic 7)
  • feat(hitl-review-001): review UI tab, SME enrichment, corrective capture, 16 LLM datasets (Epic 6)
  • feat(hitl-review-001): reinforcement sink + guidance live-reinforcement (Epic 5)
  • feat(hitl-review-001): /v1/review/* endpoints (list/next/grade/reverse) (Epic 4)
  • feat(hitl-review-001): active + stratified review sampling (Epic 3)
  • feat(hitl-review-001): normalized anchored rubric + scoring engine (Epic 2)
  • feat(hitl-review-001): dataset registry + review_grades persistence (V0028) (Epic 1)
  • chore: sync reh3376_dev01 with main (post-merge base advance)
  • fix(rsic-llm-alert-guard-001): stop the LLM reflector minting false Jiminy CRITICALs
  • chore: sync reh3376_dev01 with main (post-merge base advance)
  • docs(jiminy-actionability-001): sprint plan — the near-term surfacing lever (queued)
  • docs(jiminy-relevance-001): feature doc + CHANGELOG + post + CLAUDE.md (Epic 6)
  • feat(jiminy-relevance-001): guidance corpus curation surface (Epic 5)
  • feat(jiminy-relevance-001): should-follow follow-rate metric + panel + rule (Epic 4)
  • feat(jiminy-relevance-001): guidance label-quality auto-relabel job (Epic 2)
  • feat(jiminy-relevance-001): persist guidance training evidence (V0027 + writer) (Epic 1)
  • docs(jiminy-relevance-001): diagnostic + coordinated sprint plans (Epic 0)
  • chore: sync reh3376_dev01 with main (post-merge base advance)
  • docs(jiminy-effectiveness-001): EMA trust recovery — post + CHANGELOG + J17 feature doc (Epic 3)
  • feat(jiminy-effectiveness-001): trust as a recoverable EMA, not a monotonic ratchet (Epic 1)
  • docs(jiminy-effectiveness-001): sprint plan — trust as recoverable EMA (Epic 0)
  • chore: sync reh3376_dev01 with main (post-merge base advance)
  • Merge remote-tracking branch 'origin/main' into reh3376_dev01
  • fix(deps): bump golang.org/x/net v0.54.0 -> v0.55.0 (remaining HIGH CVEs)
  • fix(deps): bump golang.org/x/crypto v0.49.0 -> v0.52.0 (CVE-2026-39827/8/9)
  • test(jiminy-signal-001): update NilJiminyCheck test to the new default-healthy semantics
  • docs(jiminy-signal-001): CHANGELOG + post with live Tier 3 results (Epic 4)
  • fix(jiminy-signal-001): two live-smoke bugs — synergy default + the gauge's 2nd publisher (Epic 3)
  • feat(jiminy-signal-001): honest Jiminy health signals (Epic 1-2)
  • docs(jiminy-signal-001): sprint plan — honest Jiminy health signals (Epic 0)
  • chore: sync reh3376_dev01 with main (post-merge base advance)
  • feat(baseline-recompute-001): honest baseline 0.8338->0.8655 via fixed harness (Epic 2-4)
  • docs+fix(baseline-recompute-001): sprint plan (Epic 0) + rl_phase11 port 8101->8102 (Epic 1)
  • chore: sync reh3376_dev01 with main (post-merge base advance)
  • docs(reward-correctness-002): CHANGELOG + post (Epic 5 close)
  • fix(reward-correctness-002): schema/reward-mismatch fixes (Epics 1-3) + live validation
  • docs(reward-correctness-002): sprint plan — schema/reward-mismatch fixes (Epic 0)
  • chore: sync reh3376_dev01 with main (post-merge base advance)
  • docs(dataprune): Neo4j space hygiene record + CHANGELOG
  • fix(space): delete pre-check + list panic on non-MemoryNode / null-space data
  • docs(dataprune-audit-001): Category B+C prune execution record
  • chore: sync reh3376_dev01 with main (post-merge base advance)
  • docs(dataprune-audit-001): record Category A prune execution + CHANGELOG (Epic 2 close)
  • docs(dataprune-audit-001): non-destructive audit of non-conforming data (Epic 0-1)
  • chore: sync reh3376_dev01 with main (post-merge base advance)
  • fix(ape-prompt-budget-001): re-pin ape_reflect ULTS source line after import shift
  • docs(ape-prompt-budget-001): feature doc + CHANGELOG + post + CLAUDE.md (Epic 5)
  • feat(ape-prompt-budget-001): bound ape.reflect prompt to protect output (Epic 1-2)
  • docs(ape-prompt-budget-001): sprint plan + recon (Epic 0)
  • chore: sync reh3376_dev01 with main (post-merge base advance)
  • Merge remote-tracking branch 'origin/reh3376_dev01' into reh3376_dev01
  • docs(reward-correctness-001): CHANGELOG + sprint post (Epic 6 close)
  • feat(reward-correctness-001): per-task inclusion thresholds + live findings (Epic 2-3)
  • feat(reward-correctness-001): length-neutral correctness rewards (Epic 1)
  • docs(reward-correctness-001): sprint plan (Epic 0)
  • Merge remote-tracking branch 'origin/main' into reh3376_dev01
  • chore: sync reh3376_dev01 with main (post-merge base advance)
  • fix(eval-integrity-001): restore ape_reflect system_prompt_source to clean file:line
  • Merge branch 'reh3376_dev01' of https://github.com/reh3376/mdemg into reh3376_dev01
  • docs(eval-integrity-001): feature doc + CHANGELOG + post (Epic 7)
  • feat(eval-integrity-001): leak-audit gate target (Epic 2)
  • fix(eval-integrity-001): wire LLM recorder in ingest process — capture summarize.generate (Epic: capture-gap)
  • feat(eval-integrity-001): hard-fail on zero successful calls (Epic 3)
  • feat(eval-integrity-001): wire gate to leak-free 12-task valid_clean (Epic: gate-set)
  • fix(eval-integrity-001): respect dynamic_prompt — recover enum-templated tasks' production rows (Epic 1)
  • docs(eval-integrity-001): sprint plan + recon (Epic 0)
  • Merge remote-tracking branch 'origin/main' into reh3376_dev01
  • chore: sync reh3376_dev01 with main (post-merge base advance)
  • Merge branch 'reh3376_dev01' of https://github.com/reh3376/mdemg into reh3376_dev01
  • docs(sidecar-loop-001): feature doc + CHANGELOG; archive mislabeled pre-fix data
  • docs(training-audit): root-cause the 3 discarded retrains — corpus filter + eval + DPO all mislabeled
  • fix(sidecar-loop-001): collector logs aligned reranked candidates + guard (Epic 1)
  • docs(sidecar-loop-001): sprint plan + recon (Epic 0) — fix-but-defer
  • chore: sync reh3376_dev01 with main (post-merge base advance)
  • Merge remote-tracking branch 'origin/main' into reh3376_dev01
  • Merge branch 'reh3376_dev01' of https://github.com/reh3376/mdemg into reh3376_dev01
  • docs(negfeed-cooler-001): feature doc + CHANGELOG + post (Epic 6)
  • feat(cooler-001): graduated-incident edges resist decay (Epic 4)
  • feat(cooler-001): unify graduation onto the Context Cooler (Epic 3)
  • feat(negfeed-001): anti-Hebbian producer — Jiminy contradicted bridge + MCP memory_reject (Epic 2)
  • feat(negfeed-001): CoactivateSession off-request + delta emission (Epic 1)
  • docs(negfeed-cooler-001): sprint plan + live-verified recon (Epic 0)
  • Merge remote-tracking branch 'origin/main' into reh3376_dev01
  • chore: sync reh3376_dev01 with main (post-merge base advance)
  • Merge branch 'reh3376_dev01' of https://github.com/reh3376/mdemg into reh3376_dev01
  • docs(readme): coverage-gap additions per 3-lane team review (operator-approved)
  • Merge remote-tracking branch 'origin/main' into reh3376_dev01
  • chore: sync reh3376_dev01 with main (post-merge base advance)
  • docs(context-live-001): UVTS A/B artifacts + feature doc + CHANGELOG + post (Epics 5-6)
  • feat(context-live-001): server-side query-fingerprint derivation default-on (Epic 4)
  • feat(context-live-001): classifier→category dispatch on live traffic (Epic 3)
  • feat(context-live-001): stage-6 fingerprint heal + Phase-B refine wired (Epic 2)
  • feat(context-live-001): version guard + honest consensus denominator (Epic 1)
  • docs(context-live-001): sprint plan + recon findings (Epic 0)
  • Merge remote-tracking branch 'origin/main' into reh3376_dev01
  • chore: sync reh3376_dev01 with main (post-merge base advance)
  • fix(dormant-census-001): re-pin capability_gaps_full spec hash after variant removal
  • docs(dormant-census-001): feature doc + CHANGELOG + sprint post (Epic 5)
  • fix(jiminy): codegen collision-path self-deadlock wedged constraint observes
  • feat(dormant-census-001): prune 4 verified-dead routes + handlers (Epic 3)
  • feat(dormant-census-001): wire SignalLearner.GetStrength into Guide() ordering (Epic 2)
  • feat(dormant-census-001): adjudicated 187-route inventory + merge-blocking CI gate (Epic 1b)
  • feat(dormant-census-001): route↔consumer gate + 187-route inventory skeleton (Epic 1a)
  • docs(dormant-census-001): sprint plan — the standing dormancy guarantee
  • chore: sync reh3376_dev01 with main (post-merge base advance)
  • docs(jiminy-budget-001): CHANGELOG + post (Epic 4)
  • feat(jiminy-budget-001): budget derivation, session attribution, surface/outcome split, token floors (Epics 1-3)
  • docs(jiminy-budget-001): sprint plan
  • chore: sync reh3376_dev01 with main (post-merge base advance)
  • docs(surprise-topk-001): post + CHANGELOG; threshold recalibration + loud error path (Epics 3-4)
  • feat(surprise-topk-001): config-driven surprise multiplier thresholds at both Cypher sites (Epic 2)
  • feat(surprise-topk-001): exact top-K nearest-neighbor embedding novelty (Epic 1)
  • docs(surprise-topk-001): sprint plan — honest novelty + a multiplier that can fire
  • chore: sync reh3376_dev01 with main (post-merge base advance)
  • fix(doc-audit-001a): execute the approved fix batch
  • Merge remote-tracking branch 'origin/main' into reh3376_dev01
  • chore: sync reh3376_dev01 with main (post-merge base advance)
  • Merge branch 'reh3376_dev01' of https://github.com/reh3376/mdemg into reh3376_dev01
  • docs(ft-classify-002): CHANGELOG + post — no-promote accepted, sprint closed (Epic 6)
  • chore: sync reh3376_dev01 with main (post-merge base advance)
  • docs(ft-classify-002): gate results — 2/3 PASS, no-promote recommended
  • docs(doc-audit-001): amended charter per 3-lens review team (operator-approved)
  • docs(ft-classify-002): stage-by-stage run record (6a instrumentation input)
  • fix(ft-classify-002): benchmark config still pointed at decommissioned mlx port 8101
  • feat(ft-classify-002): training config — fresh task-delta LoRA on the production fused model (Epic 2)
  • feat(ft-classify-002): class-stratified distill capture + the real 11.5d root cause (Epic 1)
  • Merge branch 'reh3376_dev01' of https://github.com/reh3376/mdemg into reh3376_dev01
  • chore: sync reh3376_dev01 with main (post-merge base advance)
  • docs(ft-classify-002): sprint plan — distribution-matched consulting.classify distillation
  • fix(tsdb): time-scope V0014's backfill + integrity assertion to its historical window
  • chore: sync reh3376_dev01 with main (post-merge base advance)
  • docs(mcp-revive-001): feature doc + CHANGELOG + CLAUDE.md + post (Epic 5)
  • feat(mcp-revive-001): eventgraph + strict MCP tools, plugin-orphan reaper (Epics 3+4)
  • test(mcp-revive-001): contract suite for the MCP tool surface (Epic 2)
  • feat(mcp-revive-001): space resolution chain across all MCP memory tools (Epic 1)
  • chore: sync reh3376_dev01 with main (post-merge base advance)
  • fix(jiminy-outcome-002): Tier-2 not_applicable + verdict provenance
  • chore: sync reh3376_dev01 with main (post-merge base advance)
  • docs(ft-recursive-000): recursive-retraining loop as-built audit + buildable spec
  • chore: sync reh3376_dev01 with main (post-merge base advance)
  • docs(tsdb-consume-001): record the Epic-5 live-smoke catch in post.md
  • fix(tsdb-consume-001): emergence-cycle gauge writers actually land in hidden/service.go
  • docs(tsdb-consume-001): feature doc + CHANGELOG + CLAUDE.md + post (Epic 8)
  • ci: reclaim runner disk before docker-publish builds
  • fix(tsdb-consume-001): remove the 4 reader-without-writer ft_* dashboard panels (Epic 7)
  • feat(tsdb-consume-001): V0020 writer-or-drop — decided: writer (Epic 6)
  • feat(tsdb-consume-001): guidance_conflicts counter + emergence-cycle duration tripwire (Epic 5)
  • feat(tsdb-consume-001): scorer-drift tripwires over retrieval_audit (Epic 4)
  • feat(tsdb-consume-001): writer flush stats → metrics + flush-failure rule (Epic 3)
  • fix(tsdb-consume-001): honest metrics plane — windowed percentiles, real pool gauges, latency rules over real wall-time (Epic 2)
  • feat(tsdb-consume-001): V0025 retention+compression for unbounded hypertables (Epic 1)
  • chore: sync reh3376_dev01 with main (post-merge base advance)
  • docs(config-deadflag-001): CHANGELOG + post — sprint complete
  • feat(config-deadflag-001): full triage — 28 wired, 29 deleted, 0 allowlisted (Epic 2) + CI guard (Epic 4a)
  • feat(config-deadflag-001): enforce EVENTGRAPH_MAX_PAIRS_PER_EVENT_BATCH (first triage wire)
  • docs(config-deadflag-001): sprint plan (Epic 0)
  • feat(config-deadflag-001): strict getBool + un-swallow LoadYAMLConfig + consumer scanner (Epics 1+3)
  • chore: sync reh3376_dev01 with main (post-merge base advance)
  • docs(doc-truth-002): MoE-as-current residual cleanup (modified per review)
  • chore: sync reh3376_dev01 with main (post-merge base advance)
  • fix(uxts-ci-001): UBENCH CI gate → lint mode; holdout absence tolerated, mismatch still fatal
  • fix(uxts-ci-001): add tiktoken + pyyaml to the neural CI job deps
  • docs(uxts-ci-001): CHANGELOG + CLAUDE.md CI-gate inventory + post — sprint complete (Epics 5-6)
  • feat(uxts-ci-001): drift checker covers all 15 frameworks, matrix refreshed, gate un-zombied (Epic 4)
  • feat(uxts-ci-001): neural pytest+ruff CI job — first run caught two silent failures (Epic 3b)
  • feat(uxts-ci-001): TSDB in CI, un-zombie UOTS, delete UVTS step, ULTS hash gate live (Epics 1-3a)
  • docs(uxts-ci-001): sprint plan (Epic 0)
  • chore: sync reh3376_dev01 with main (post-merge base advance)
  • fix(uats-gap-001): tag breaker reset round-trip llm_required — CI has no openai-embeddings breaker
  • feat(uats-gap-001): 8 contract specs for the revived channels + suite hygiene (Epics 1-6)
  • fix(transfer): nil-guard edge identity assertions — one bad edge panicked the whole server (UATS-caught P0)
  • fix(jiminy): reformulate returns 400 (not 500) for missing context
  • docs(uats-gap-001): sprint plan (Epic 0)
  • chore: sync reh3376_dev01 with main (post-merge base advance)
  • fix(tsdb): initial backup on start — restart-resetting ticker meant zero backups ever
  • fix(rsic-storm-001): commit ExecuteTombstoneStaleForTest wrapper missed from Epic F
  • chore: sync reh3376_dev01 with main (post-merge base advance)
  • docs(rsic-storm-001): feature doc + verification + rollback drill test + CHANGELOG + CLAUDE.md — sprint complete (Epic F)
  • fix(rsic-storm-001): attributable archival + unified tombstone predicate (Epics B+C)
  • fix(rsic-storm-001): atomic trigger admission — reserve-on-allow (Epic A)
  • docs(rsic-storm-001): sprint plan with corrected burst attribution (Epic 0)
  • chore: sync reh3376_dev01 with main (post-merge base advance)
  • docs(backup-restore-verify-001): feature doc + verification + CHANGELOG + CLAUDE.md — sprint complete (Epic 7)
  • fix(transfer): omit empty path/name on import — restores with observations always failed (drill-caught)
  • fix(backup-restore-verify-001): retention was deleting every backup it just made (drill-caught)
  • feat(backup-restore-verify-001): initial backup on start (rule honesty)
  • feat(backup-restore-verify-001): neo4j-backup jobhealth + generalized staleness rules (Epic 5)
  • feat(backup-restore-verify-001): harden the restore path (Epics 1-4)
  • docs(backup-restore-verify-001): sprint plan (Epic 0)
  • chore: sync reh3376_dev01 with main (post-merge base advance)
  • docs(supervisor-002): feature doc + verification + CHANGELOG + CLAUDE.md — sprint complete (Epic 6)
  • fix(supervisor-002): streak-relative global-outage discriminator (drill-caught)
  • fix(jiminy): detach feedback outcome processing from the hook's connection lifetime
  • feat(supervisor-002): aggregate evaluator-degraded alert for global outages
  • fix(supervisor-002): nolint G118 on legacy-fallback loop launches
  • fix(supervisor-002): recency-gate the RSIC llm_error_rate_spike insight (Epic 4)
  • feat(supervisor-002): rule-health meta-alert on evaluator query failures (Epic 3)
  • feat(supervisor-002): register the 12 unsupervised background loops (Epic 2)
  • feat(supervisor-002): sliding-window restart budget + late registration (Epic 1)
  • docs(supervisor-002): sprint plan + background loop inventory (Epic 0)
  • chore: sync reh3376_dev01 with main (post-merge base advance)
  • docs(hidden-churn-001): PR-B verification + CHANGELOG + CLAUDE.md — sprint complete (Epic B5)
  • fix(hidden-churn-001): live-smoke fixes — noise pool was structurally empty, clustering included archived debris, coverage gauge gated on min-obs
  • feat(hidden-churn-001): surface themes_updated + noise_assigned in consolidate API + periodic log (Epic B3)
  • feat(hidden-churn-001): mdemg concepts repair + trace — grounding audit CLI (Epic B2)
  • feat(hidden-churn-001): PR-B coverage retune — config ratio, density assignment, gauge + rule (Epic B1)
  • chore: sync reh3376_dev01 with main (post-merge base advance)
  • docs(hidden-churn-001): PR-A verification + CHANGELOG (Epics A3-A4)
  • chore(hidden-churn-001): remove the dead global-detach helper — the churn mechanism itself
  • feat(hidden-churn-001): stable theme identity — centroid match-or-create replaces the 5-minute churn (Epic A2)
  • fix(hidden-churn-001): automated consolidation no longer skips LLM emergence (Epic A1)
  • docs(hidden-churn-001): sprint plan — stable concept identity, two-PR delivery (Epic 0)
  • chore: sync reh3376_dev01 with main (post-merge base advance)
  • docs(rrf-scale-002): live-calibrated suggest floor + CHANGELOG + close (Epics 5-6)
  • fix(rrf-scale-002): CacheKey covers ALL result-affecting fields + two forcing functions (Epics 3-4)
  • fix(rrf-scale-002): config-driven score thresholds — suggest revival, MCP tiers, guardrail floor (Epic 2)
  • fix(rrf-scale-002): persistent rerank clients — failure alerting re-armed on the hottest LLM path (Epic 1)
  • docs(rrf-scale-002): sprint plan — finish the score-scale contract (Epic 0)
  • chore: sync reh3376_dev01 with main (post-merge base advance)
  • test(rsic-validate-001): integration seeds carry session linkage for the scoped tombstone contract
  • docs(rsic-validate-001): Tier 3 verification + CHANGELOG + close (Epics 5-6)
  • fix(rsic-validate-001): counter-free confidence calibration — RSIC stops polluting its own signal (Epic 4)
  • fix(rsic-validate-001): tombstone_stale scoped to correction-linked nodes; refresh_stale_edges decays for real (Epic 3)
  • fix(rsic-validate-001): honest criteria evaluation — populated keys + fail-closed mutations (Epics 1-2)
  • docs(rsic-validate-001): sprint plan — fail-closed self-improvement (Epic 0)
  • chore: sync reh3376_dev01 with main (post-merge base advance)
  • docs(doc-truth-001): last stale --adapter help string (sweep straggler)
  • docs(doc-truth-001): grep-sweep proof + CHANGELOG + close (Epic 4)
  • docs(doc-truth-001): 00_README STATUS block + AGENT_HANDOFF retired (Epic 3)
  • fix(doc-truth-001): operator-facing text matches the Phase 13.5 reality (Epic 2)
  • docs(doc-truth-001): CLAUDE.md FT section rewritten to post-pivot reality (Epic 1)
  • docs(doc-truth-001): sprint plan — documentation matches reality (Epic 0)
  • chore: sync reh3376_dev01 with main (post-merge base advance)
  • docs(embed-wire-001): live verification + CHANGELOG + CLAUDE.md + close (Epics 3-4)
  • fix(ingest-exec-001): server-triggered ingest resolves the mdemg binary — was hardcoded ./bin/mdemg (Epic 2)
  • fix(embed-wire-001): breaker + recorder reach the real embedder through the wrapper chain (Epic 1)
  • docs(embed-wire-001): sprint plan — embedder wiring + ingest exec resolution (Epic 0)
  • chore: sync reh3376_dev01 with main (post-merge base advance)
  • docs: CLAUDE.md architecture note for MAINT-LIVE-001
  • docs(maint-live-001): first live run verification + feature doc + CHANGELOG + close (Epics 4b-5)
  • fix(prune): orphan sweeps use implicit transactions for batched deletes
  • feat(maint-live-001): context-dependent orphan policy — --exclude-role-types (Epic 4a)
  • feat(maint-live-001): mdemg upgrade refreshes installed LaunchAgents + hooks (darwin) (Epic 3)
  • feat(maint-live-001): maintenance_no_live_run evaluator rule (Epic 2)
  • fix(maint-live-001): scheduled maintenance runs live — plist passes --dry-run=false (Epic 1)
  • docs(maint-live-001): sprint plan — scheduled maintenance actually runs (Epic 0)
  • chore: sync reh3376_dev01 with main (post-merge base advance)
  • docs(hidden-weight-001): Tier 3 verification + corpus restoration + UVTS harness audit + close (Epics 4-5)
  • fix(ingest): config-driven consolidation timeout — was sharing the 300s batch budget
  • feat(hidden-weight-001): null-weight gauge + regression alert rule (Epic 3)
  • feat(hidden-weight-001): mdemg graph backfill-weights — heal 56k NULL abstraction weights (Epic 2)
  • fix(hidden-weight-001): abstraction-edge weights — vector.similarity.cosine replaces point.distance (Epic 1)
  • docs(hidden-weight-001): sprint plan — real weights on the abstraction hierarchy (Epic 0)
  • chore: sync reh3376_dev01 with main (post-merge base advance)
  • fix(ci): track .claude/hooks/pre-write-check.py so hook-parity check passes
  • fix(uats): jiminy_guide_sanitized timeout 30s → 90s — stale vs synthesis latency
  • docs(hooksync-001): Tier 3 verification + feature doc + CHANGELOG + close (Epics 7-8)
  • fix(hooksync-001): PORT-TRUTH — loopback bind defaults + sidecar zombie replaced (Epic 6)
  • feat(hooksync-001): mdemg hooks doctor — one-shot hook-channel triage (Epic 5)
  • feat(hooksync-001): hook-channel absence detection — the channel now self-reports outages (Epic 4)
  • feat(hooksync-001): alert Cleared lifecycle — display once, then delivered (Epic 3)
  • ci(hooksync-001): hook-template parity gate — live hooks must match templates (Epic 2)
  • fix(hooksync-001): reconcile bidirectional hook drift — alert delivery restored to live (Epic 1)
  • docs(hooksync-001): sprint plan — drift-proof + self-monitoring hook channel (Epic 0)
  • chore: sync reh3376_dev01 with main (post-merge base advance)
  • Merge remote-tracking branch 'origin/reh3376_dev01' into reh3376_dev01
  • docs(hookwire-001): Tier 3 verification + CHANGELOG + CLAUDE.md contract pin + close (Epics 4-5)
  • chore: sync reh3376_dev01 with main (post-merge base advance)
  • fix(hookwire-001): pre-compact transcript extraction reads the real line shape (Epic 3)
  • fix(hookwire-001): post-tool-observe reads tool_response — end blind "succeeded" observations (Epic 2)
  • fix(hookwire-001): prompt-context.sh reads .prompt — revive the per-prompt channel (Epic 1)
  • docs(hookwire-001): sprint plan — fix hook stdin contract, reconnect per-prompt channel (Epic 0)
  • docs(roadmap): Q3 2026 vision-derived roadmap from 26-agent codebase deep-dive
  • chore: sync reh3376_dev01 with main (post-merge base advance)
  • ci: auto-sync dev branch with main after each squash-merged PR
  • Merge remote-tracking branch 'origin/main' into reh3376_dev01
  • Merge origin/main into reh3376_dev01 (resolve PR dev: reh3376_dev01 -> main #419 conflicts)
  • docs(eventgraph-004): feature doc + CHANGELOG + UATS pin + close (Epic 3)
  • docs(eventgraph-004): Tier 3 live verification — contradict create/re-match + weaken unchanged (Epic 2)
  • feat(eventgraph-004): wire ApplyNegativeFeedback contradict path → reinforcement_events (Epic 1)
  • docs(eventgraph-004): sprint plan + CoactivateSession post-revival health review (Epic 0)
  • docs(eventgraph-003): Tier 3 verification + feature doc + CHANGELOG + close (Epic 4)
  • fix(conversation): inject learning service so CoactivateSession actually runs
  • feat(eventgraph-003): wire ApplyNegativeFeedback weaken path → reinforcement_events (Epic 3)
  • feat(eventgraph-003): wire ApplySymbolCoactivation into reinforcement_events (Epic 2)
  • feat(eventgraph-003): wire CoactivateSession into reinforcement_events (Epic 1)
  • docs(eventgraph-003): sprint plan — reinforcement coverage for other Hebbian paths
  • chore(submodule): bump homebrew-mdemg to v0.10.1 formula
  • Merge remote-tracking branch 'origin/main' into reh3376_dev01
  • docs: governance system doc + bring cli/api references current
  • release: cut v0.10.1
  • feat(hooks): add pre-write-check.py to the tracked installer
  • feat(hooks): per-conversation SessionID — installed hook copies
  • feat(hooks): per-conversation SessionID across hooks + skill
  • docs(jiminy-governance): commit install-ready skill + install README
  • feat(jiminy-governance): ship the J17 governance skill + register MDEMG MCP
  • docs(jiminy-governance): resolve skill wire-up against the real instance
  • Merge remote-tracking branch 'origin/main' into reh3376_dev01
  • docs(roadmap): add jiminy-governance skill build-out (Workstream C, Action 7)
  • fix(nosilent-001): sync embedded launchd server plist with source (CI)
  • docs(nosilent-001): feature doc + CHANGELOG + CLAUDE.md + close (Epic 4)
  • fix(nosilent-001): distinct services for job rules so neither masks the other
  • feat(nosilent-001): scheduled-job staleness + failure alert rules (Epic 3)
  • feat(nosilent-001): record + alert on scheduled-job outcomes (Epic 2)
  • feat(nosilent-001): V0024 scheduled_job_events + writer (Epic 1)
  • docs(nosilent-001): sprint plan — fail-loud scheduled jobs (Epic 0)
  • fix(metrics,backup): resolve docker binary robustly under minimal launchd PATH
  • docs(eventgraph-002): feature doc + CHANGELOG + CLAUDE.md + close (Epic 7)
  • docs(eventgraph-002): Tier 3 live verification (Epic 6)
  • test(eventgraph-002): UATS contract spec for guidance-outcome federation (Epic 5)
  • feat(eventgraph-002): mdemg eventgraph guidance-outcome-neighborhood CLI (Epic 4)
  • feat(eventgraph-002): guidance-outcome federation handler + route (Epic 3)
  • feat(eventgraph-002): GuidanceOutcomesInNeighborhood federation method (Epic 2)
  • feat(eventgraph-002): V0023 constraint_code index on constraint_outcomes (Epic 1)
  • docs(eventgraph-002): sprint plan — guidance-outcome federation (Epic 0)
  • Merge remote-tracking branch 'origin/main' into reh3376_dev01
  • fix(eventgraph-cli-001): tag UATS spec 'tsdb' so CI skips it without TSDB
  • docs(eventgraph-cli-001): live verification + feature doc + CHANGELOG + close (Epic 3)
  • test(eventgraph-cli-001): UATS contract spec for federation API (Epic 2)
  • fix(eventgraph): neighbor_node_ids serializes as [] not null for empty neighborhood
  • feat(eventgraph-cli-001): mdemg eventgraph reinforcement-neighborhood (Epic 1)
  • docs(eventgraph-cli-001): sprint plan — federation consumer CLI + UATS backfill
  • Merge remote-tracking branch 'origin/main' into reh3376_dev01
  • fix(jiminy): /guide 30s timeout sibling + single-source config defaults (GUIDANCE-SYNTH-001 fix-commit)
  • docs(followup-c): close JSON control-char escaping as NON-ISSUE (no fix)
  • Merge remote-tracking branch 'origin/main' into reh3376_dev01
  • test+docs(guidance-synth-001): Tier 2/3 verification + docs + close (Epic 3)
  • feat(jiminy): config-drive warm-compute timeout (GUIDANCE-SYNTH-001 Epic 2)
  • feat(consulting): parallelize per-node constraint classifier (GUIDANCE-SYNTH-001 Epic 1)
  • docs(guidance-synth-001): sprint plan — fix guidance synthesis timeout (Follow-up B)
  • Merge remote-tracking branch 'origin/main' into reh3376_dev01
  • docs(jiminy-outcome-001): CHANGELOG + CLAUDE.md + post.md (Epic 3)
  • test(jiminy-outcome-001): Tier 2 integration + Tier 3 live verification (Epic 2)
  • feat(jiminy): embedding-similarity constraint-code matching (JIMINY-OUTCOME-001 Epic 1)
  • docs(jiminy-outcome-001): sprint plan — revive Neo4j GUIDANCE_OUTCOME sink
  • Merge remote-tracking branch 'origin/main' into reh3376_dev01
  • test(rrf-scale-001): skip guidance integration tests on empty environment (CI fix)
  • docs(rrf-scale-001): CHANGELOG + CLAUDE.md score-scale contract + post.md (Epic 5)
  • test(rrf-scale-001): Tier 2 integration + Tier 3 live verification (Epic 4)
  • docs(rrf-scale-001): Epic 3 — remaining LOW findings reviewed + decided
  • fix(consulting): RRF-calibrate score gates + confidence sigmoid (RRF-SCALE-001 Epic 2)
  • docs(rrf-scale-001): Epic 1 audit findings — 12 sites cataloged
  • docs(rrf-scale-001): sprint plan — RRF score-scale consumer remediation
  • Merge remote-tracking branch 'origin/main' into reh3376_dev01
  • Merge remote-tracking branch 'origin/main' into reh3376_dev01
  • fix(eventgraph-001): Grafana panel uses TSDB instead of unconfigured Prometheus datasource
  • Merge branch 'main' into reh3376_dev01
  • docs(eventgraph-001): feature doc + CHANGELOG + CLAUDE.md + sprint close (Epic 8)
  • docs(eventgraph-001): Tier 3 live e2e verification transcript (Epic 7)
  • fix(retrieval): set Activation on RRF RetrieveResult (EVENTGRAPH-001 fix-commit)
  • fix(eventgraph-001): restore full GRAFANA-AUDIT-001 audit_results.json
  • feat(observability): Grafana panel + Prometheus counters for reinforcement events (EVENTGRAPH-001 Epic 6)
  • feat(eventgraph): federation query helper + API endpoint (EVENTGRAPH-001 Epic 5)
  • feat(learning): record reinforcement events to TSDB (EVENTGRAPH-001 Epic 4)
  • refactor(learning): expose per-pair telemetry from Hebbian Cypher (EVENTGRAPH-001 Epic 3)
  • feat(tsdb): buffered reinforcement_events writer (EVENTGRAPH-001 Epic 2)
  • feat(tsdb): V0022 reinforcement_events hypertable (EVENTGRAPH-001 Epic 1)
  • docs(eventgraph-001): sprint plan (Pattern Y1 TSDB-federation)
  • docs(model-dist-002): flip adapter section to shipped + sprint close
  • feat(cli): enable mdemg model pull --adapter (MODEL-DIST-002 Epic 5+6)
  • feat(model-dist-002): Epic 4 local — Modelfile.adapter + ollama create
  • feat(model-dist-002): Epic 1-3 — MLX adapter → PEFT → GGUF LoRA + live verify
  • feat(model-dist-002): Epic 0 — sprint plan + workspace prep
  • Merge remote-tracking branch 'origin/main' into reh3376_dev01
  • docs(grafana-audit): Epic 4 + 7 — feature doc + sprint close
  • fix(grafana): Epic 3 — 5 panels recovered (3 FAIL + 2 schema-drift)
  • feat(grafana-audit): Epic 1 + 2 — full audit + findings
  • feat(grafana-audit): Epic 0 — sprint plan + audit harness
  • Merge remote-tracking branch 'origin/main' into reh3376_dev01
  • docs(api): document 19 previously-undocumented endpoints (follow-up Implement Learning Loop - ApplyCoactivation #2)
  • Merge remote-tracking branch 'origin/main' into reh3376_dev01
  • feat(cli): add mdemg model run wrapper (follow-up Edge Weight Decay CLI Command #1 to MODEL-DIST-001)
  • chore(submodule + docs): bump homebrew-mdemg to v0.10.0 + cli-reference Model Distribution section
  • Merge remote-tracking branch 'origin/main' into reh3376_dev01
  • docs(release): promote Unreleased -> v0.10.0
  • merge: resolve quant_manifest.json conflicts (Epic 3 closeout vs squashed main)
  • docs(model-dist-001): sprint close — post.md
  • feat(model-dist-001): Epic 3 closeout — Ollama Library push complete
  • docs(model-dist-001): Epic 8 — Documentation Update (main repo)
  • docs(model-dist-001): Epic 7 — local-model-distribution feature doc
  • feat(model-dist-001): Epic 5 — V0021 model_install_events hypertable + writer
  • feat(model-dist-001): Epic 4 — mdemg model CLI + pluggable Fetcher interface
  • feat(model-dist-001): Epic 3 — 3 Modelfiles + local ollama create (push pending)
  • docs(model-dist-001): Epic 2 — defer adapter to MODEL-DIST-002
  • feat(model-dist-001): Epic 1 — built Q4_K_M + Q8_0 fused GGUFs
  • docs(sprint): MODEL-DIST-001 sprint plan + quant manifest skeleton
  • fix(service): replace decommissioned mlx-server LaunchAgent with llama-server
  • fix(api): /healthz returns build-time version, not stale literal "0.6.0"
  • chore(submodule): bump homebrew-mdemg to v0.9.0 formula + docs
  • Merge remote-tracking branch 'origin/main' into reh3376_dev01
  • docs(release): promote Unreleased -> v0.9.0

Auto-generated PR from reh3376_dev01 push

rhenley1958 and others added 30 commits June 11, 2026 03:06
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…assignment, gauge + rule (Epic B1)

maxThemes was an inline ceil(n/10) equation → HIDDEN_THEME_TARGET_RATIO
(default preserves it). NOISE observations (previously dropped from the
hierarchy forever — the 94% coverage gap's mechanism) now density-assign
to their nearest theme when cosine ≥ HIDDEN_THEME_ASSIGN_SIM_THRESHOLD
(default 0.70; edges only, no new themes; below-floor stays unthemed
honestly). New per-space coverage gauge
mdemg_neo4j_conversation_coverage_ratio (collector Query 5) + evaluator
rule low_conversation_coverage (CONVERSATION_COVERAGE_ALERT_FLOOR 0.2,
6h ForDuration for convergence).

Audit bonus: caught WeightIntegrityRules querying metric_samples with
recorded_at — the column is `time`; the null-weight rule had been
silently erroring every evaluation since it shipped (Debug-only logging
— the SUPERVISOR-002 finding in action). Both rules fixed + a pin test
bans recorded_at against metric_samples.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…it CLI (Epic B2)

repair: tombstones childless layer>=2 abstraction nodes (no inbound
ABSTRACTS_TO|GENERALIZES|GENERALIZES_TO — 10,395 live in mdemg-dev,
churn-era debris). Recoverable (is_archived=true + archived_reason),
batched, dry-run default, --limit for small-batch-first verification.
trace: per-node grounding audit — direct children, transitive per-layer
census, grounded/ungrounded verdict, sample path to L0.

Live data note: GENERALIZES alone over-counts (19,147) — ABSTRACTS_TO
is the hidden layer's actual child edge; pin test guards the predicate.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…nsolidate API + periodic log (Epic B3)

/v1/conversation/consolidate now reports themes_updated and
noise_assigned alongside themes_created. The periodic-consolidation
log condition also gains both — with stable theme identity (PR-A),
created is usually 0 on healthy cycles, which would have silenced the
success log entirely (the silent-success bug class).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
… empty, clustering included archived debris, coverage gauge gated on min-obs

Three defects only the live run surfaced (Tier 3 forcing function):
1. KMeans never emits label -1, so the density-assignment hook received
   an always-empty noise list; the min-samples/max-themes/nil-centroid
   drops now feed their members into the noise pool instead of silently
   excluding them from the hierarchy.
2. fetchClusterableConversationObservations had no is_archived filter —
   it clustered 4,838 observations of which only 183 were live (MAINT-LIVE
   tombstones), building themes on archived debris. Both fetch variants
   now exclude archived. Live effect: 24 debris themes swept to 5 clean
   ones; second cycle themes_updated=5/created=0 (stable identity on
   real data).
3. Coverage gauge gated on CONVERSATION_COVERAGE_MIN_OBS (default 50,
   DH-005 confidence-threshold pattern) — tiny scratch/test spaces
   (2-13 observations) emitted 0.000 and would have alarmed forever
   (born-firing alert hazard). Sentinel -1 skips emission.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…print complete (Epic B5)

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…on (Epic 1)

The restart counter only ever incremented — a once-a-week transient
permanently killed a worker after 3 weeks. Budget is now a sliding
window (restarts older than the window are forgotten); permanent
failure requires >SUPERVISOR_MAX_RESTARTS within
SUPERVISOR_RESTART_WINDOW_MIN. New Go() registers+launches workers
after Start (the API server starts its loops late); nil return without
ctx cancellation now means intentional completion, not a restart.
Start() outlives dead workers so late workers stay supervised.

Config: SUPERVISOR_MAX_RESTARTS (3), SUPERVISOR_RESTART_WINDOW_MIN
(60), SUPERVISOR_BACKOFF_BASE_SEC (5).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…Epic 2)

Every scheduler/loop goroutine now runs under the goroutine supervisor
(panic recovery + sliding-window restart budget) instead of as a bare
go func() whose panic silently killed the subsystem forever:

- api.Server (6): periodic-consolidation, context-cooler,
  space-prune-scheduler, weekly-gap-interviews, scheduled-sync,
  rsic-macro-cron — via injected SetSupervisor(sup.Go) + goSupervised
  helper (bgWg brackets each run; stop channels remain the graceful
  path and return nil = no restart)
- ape (3): rsic-watchdog, rsic-store-flush, signal-learner-flush
- backup schedulers (2): neo4j-backup-scheduler, tsdb-backup-scheduler
  — their NewServer construction-time Start() moved to
  StartSupervisedBackground() (serve.go) so the hook exists first
- serve.go (1): llm-fastfail-burst-flush via sup.Go

All owners keep a nil-hook fallback (legacy bare goroutine), so tests
and non-server callers are unchanged. Buffered TSDB writers are
explicitly out of scope (TSDB-CONSUME-001 owns flush observability).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…res (Epic 3)

A rule whose SQL errors was a silently-disabled alert: failures were
logged at Debug and nothing watched the watcher — bitten twice in one
week (HIDDEN-WEIGHT-001 null-weight rule + the recorded_at column bug,
both found by accident in later sprints). Query failures now log at
Warn, and after ALERT_RULE_FAILURE_THRESHOLD (default 3) consecutive
failures a high-severity meta-alert fires directly via the dispatcher
(not via a rule — the meta-channel must not depend on the failing
mechanism). Service label is rule-health-<rule-id> so concurrent
failing rules don't cooldown-suppress each other; success re-arms.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…ht (Epic 4)

Insight 26 computes the error rate over a 24h window with no recency
requirement, so a 35-min jiminy.synthesize timeout burst at 02:00 UTC
kept re-firing HIGH 'LLM error rate spike' (and escalating to CRITICAL
'Jiminy Pipeline Critical') every RSIC micro-cycle for 12+ hours after
the incident self-resolved (live, 2026-06-11). LLMPerformanceSummary
now carries LastErrorAt (MAX(time) over errored rows); the spike
insight fires only when the most recent error is within
RSIC_LLM_ERROR_RECENCY_MIN (default 60; 0 disables the gate). A zero
LastErrorAt (older data source) keeps legacy behavior — the gate never
widens silently.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…utages

A TSDB-level outage fails every rule at once; per-rule meta-alerts
would storm ~19 alerts duplicating the health prober's signal. At the
failure threshold the evaluator now distinguishes: other rules
succeeding recently → per-rule rule-health alert (broken SQL class);
nothing succeeding within threshold×interval → ONE
alert-evaluator-degraded alert per outage. Success re-arms both.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…ction lifetime

Live-smoke surprise during SUPERVISOR-002 Epic 5 (own fix-commit per
policy): jiminy.evaluate_llm was failing at 94.9% (657 'context
canceled' rows/24h). The post-tool-observe hook POSTs
/v1/jiminy/feedback with curl --max-time 5, but per-item Tier-2
outcome classification routinely outlives the connection — the request
ctx then cancelled every in-flight LLM call and outcomes silently
degraded to the keyword heuristic. Same defect class as
GUIDANCE-SYNTH-001's warm-path budget.

handleJiminyFeedback now uses context.WithoutCancel(r.Context()) with
its own server-side budget JIMINY_FEEDBACK_TIMEOUT_MS (default 60000,
0 = unbounded). The hook keeps its fire-and-forget 5s curl.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…ll-caught)

The Epic 5 TSDB-stop drill caught the freshness-window heuristic
misclassifying outage ONSET: rules were succeeding seconds before the
stop, so lastAnySuccess was fresh when the first rules hit threshold —
2 per-rule alerts leaked before the aggregate fired. The discriminator
is now streak-relative: per-rule only when some other rule succeeded
AFTER this rule's failure streak began; otherwise global, once per
outage. Unit-pinned with the drill scenario
(TestRuleFailureStreak_OutageOnsetIsGlobal).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
….md — sprint complete (Epic 6)

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Epics 1-4 land together — they share the restore-path signatures.

1. Checksum gate (Epic 1): the manifest SHA-256 was written at backup
   time and never read; a corrupted .mdemg restored silently. The gate
   now fails closed before import; legacy manifests without a checksum
   warn and proceed.
2. Snapshot completion polling (Epic 2): the pre-restore safety
   snapshot was raced with time.Sleep(2s) against an async backup
   goroutine. waitForBackupJob now polls the jobs queue until
   completed, failing closed on failure/cancel/vanish/timeout
   (BACKUP_SNAPSHOT_WAIT_TIMEOUT_SEC, default 300).
3. Count validation (Epic 3): manifest NodeCount/EdgeCount are
   whole-database counts and cannot validate file contents (they
   diverge on partial backups) — new additive file_node_count/
   file_edge_count/file_observation_count manifest fields are counted
   from the exported chunks; restore re-counts the file and hard-fails
   on mismatch (truncation class). Importer accounting divergence
   under CONFLICT_SKIP is warn-only, surfaced in a job-result
   validation block.
4. dockerbin routing (Epic 4): the legacy .dump restore shelled out to
   bare "docker" (the launchd-minimal-PATH class NOSILENT-001 fixed
   for TSDB); now routes via dockerbin unless the operator set a
   non-default FullCmd.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
… staleness rules (Epic 5)

The default-ON Neo4j backup scheduler had zero jobhealth coverage —
the inverse of NOSILENT-001 (which wired only tsdb-backup). The
scheduler now waits on each triggered job (its Trigger is queue-async;
a fire-and-forget report would always claim success) and reports
outcome via SetResultHook → jobhealth.Report with
job_name='neo4j-backup' (wired in SetTSDBClient next to the tsdb
hook). The staleness rule is generalized into a jobStalenessRule
factory; Neo4jBackupStalenessRule (neo4j_backup_no_recent_success,
Service scheduled-job-staleness-neo4j, window = partial interval × 2
unless BACKUP_JOB_STALENESS_HOURS overrides) registers when
BACKUP_ENABLED. The existing tsdb rule is pinned unchanged through the
refactor.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
With the neo4j_backup_no_recent_success rule registered, a fresh
install would alarm honestly-but-noisily for up to 24h (the scheduler's
first tick). The scheduler now runs an initial partial backup
BACKUP_INITIAL_DELAY_MIN (default 5) minutes after start, so every
install has a backup — and a quiet staleness rule — within minutes.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…t just made (drill-caught)

The Tier 3 round-trip exposed that the backup system was a no-op for
this database: BACKUP_RETENTION_MAX_STORAGE_GB had a comment/code
default drift (documented 50, code read 2), and with RunAfter=true the
quota pass deleted each 3-4 GB whole-database backup ~80 ms after it
completed (log: 'backup completed' → 'retention cleaned backups
deleted_count=1 freed_bytes=<exactly the new backup>'). Three fixes:

1. Quota retention NEVER deletes the newest backup of each type — a
   quota smaller than one backup degrades to 'over quota, keep it'
   with a loud warning, not 'delete the only backup'. Sparse-file unit
   tests pin both the two-backup and only-backup-oversize shapes.
2. Default quota raised to the documented 50 GB.
3. BACKUP_SNAPSHOT_WAIT_TIMEOUT_SEC default 300 → 3600: the live
   whole-database export runs ~15 min; the 5-min wait made the initial
   scheduled run report failure (jobhealth correctly recorded it —
   the wiring works) while the backup actually completed later.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…tions always failed (drill-caught)

The Tier 3 round-trip's real restore failed with
ConstraintValidationFailed: conversation observations carry path=NULL
in Neo4j (which memorynode_path_unique (space_id, path) ignores), but
the exporter serializes NULL as the proto default "" and the importer
wrote the literal empty string unconditionally — so the second
observation node in any restore collided. Every restore containing 2+
observation nodes had always been broken; this was invisible because
no backup had ever been restore-tested (the sprint's premise,
demonstrated). nodeProps now omits empty path/name (null fidelity);
unit-pinned.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…OG + CLAUDE.md — sprint complete (Epic 7)

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…pic 0)

Triage correction baked in: the 5,397-node burst was the Context
Cooler via the session-start hook's /v1/conversation/graduate (uncapped
backlog sweep of pre-DH-004 graduation-bug victims), NOT RSIC —
mis-attributed because tombstone_stale stamps no metadata and two
archive-reason property names coexist. RSIC's own issues stand:
trigger-race cycle storm (~20-30k/day) and snapshot/executor predicate
drift (rollback restores nothing).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…c A)

EvaluateTrigger checked activeCycles/lastTrigger, but both were written
only by RecordTrigger — which callers invoke AFTER RunCycle completes.
For a cycle's entire multi-second duration every concurrent trigger
passed every gate: ~20-30k micro cycles/day live (4 spawning within
50ms of each tool-use burst), the 300s cooldown effectively
nonexistent, llama-server saturated (the recurring synthesize/
evaluate_llm/intent_translate timeout cascades), and RSIC actions
dispatched at storm frequency.

Admission now reserves the active + cooldown (+dedupe) records under
the same lock that performs the checks; RecordTrigger updates the
reservation with the real cycle ID; CompleteCycle clears the active
slot; a failed cycle still cools down. Unit-pinned: 50 concurrent
triggers admit exactly one; cooldown holds from admission through
completion and failure.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…ate (Epics B+C)

Epic B — every archival is now attributable:
- tombstone_stale stamps archived_at + archive_reason
  ('rsic_tombstone_stale') + archived_cycle_id (bare is_archived made
  the 2026-06-11 burst forensics mis-attribute the Context Cooler's
  5,397-node sweep to RSIC for hours).
- Canonical property name is archive_reason; concepts.go (the one
  archived_reason writer) migrates; historical rows keep the old name
  (readers coalesce; no data migration).
- Context Cooler tombstone step capped per run
  (COOLER_TOMBSTONE_MAX_PER_RUN, default 500; 0=unlimited) with a loud
  cap-reached warning — the incident sweep was a single uncapped run
  over the pre-DH-004 volatile backlog via the session-start hook's
  graduate call.

Epic C — rollback restores the right nodes:
- The executor and the rollback snapshot now share ONE candidate
  predicate (tombstoneStaleCandidates const). RSIC-VALIDATE-001 had
  updated only the executor; the snapshot captured the old unlinked
  set, so rollback restored nodes that were never archived
  (restored_count=0 live). Drift class eliminated, pin-tested.
- Rollback also clears the new attribution fields on restore.

Epics share the tombstone Cypher — combined commit (disclosed).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
rhenley1958 and others added 26 commits June 25, 2026 09:50
The default consolidation hidden step now assigns only ORPHAN L0 nodes (no
GENERALIZES edge) to their nearest existing pattern and clusters the unassigned
remainder into new CUIDv2 patterns. Existing patterns are NEVER destroyed or
re-clustered, so their node_ids (and every reinforcement/abstraction edge
referencing them) survive every cycle (~0% churn), and only the small orphan set
is clustered (no full-52k re-cluster → much lower CPU). Closes the structural
~25% residual churn HIDDEN-CHURN-002 disclosed.

- fetchOrphanBaseNodes (fetchAllBaseNodes refactored to share fetchBaseNodes
  with an orphanOnly NOT-GENERALIZES filter).
- assignOrphansToPatterns: Go-side nearest-pattern (cosine >= threshold) → batch
  GENERALIZES edges (cosine weight, CUIDv2 edge id) + incremental-mean centroid
  update; mirrors assignNoiseToThemes. Returns unassigned remainder.
- IncrementalHiddenNodes + clusterNewBaseNodes (create-only, reclassification
  skipped — it is a churn source). hiddenStep dispatches on
  HIDDEN_INCREMENTAL_ENABLED (default true); HIDDEN_INCREMENTAL_ASSIGN_SIM_THRESHOLD
  (0.80).
- Explicit full re-cluster preserved: consolidate `full_recluster` request field
  → hidden.WithFullRecluster(ctx) override + `mdemg concepts recluster` CLI.

Build + golangci-lint + config-guard clean.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…tests (Epic 3)

Extracted nearestPatternByCentroid + incrementalMean as pure helpers (used by
assignOrphansToPatterns) for unit-testability.

Tier 1 (hidden_identity_test.go): assign-threshold default/override;
nearest-pattern selection (match/below-threshold/empty); incremental-mean math.
Tier 2 integration (TestHiddenIncrementalAssignment): form patterns → ingest
more base nodes → incremental re-consolidate → assert ALL original pattern
node_ids survive (~0% churn) and pattern count never drops (no deletes).

hidden/config unit suites green; go vet -tags=integration clean; lint 0.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…ive (Epic 5)

Incremental clustering shipped: live Tier-3 on mdemg-dev shows 100% identity
survival (4484/4484, vs CHURN-002's 75%), patterns only added (no deletes),
steady-state cycle ~10s vs ~360s full re-cluster.

Flips the CHURN-002 must-fix obligation to REMEDIED across the canonical docs:
feature doc (open-defect section → remedied + CHURN-003 mechanism + live result),
CLAUDE.md (CHURN-002 residual → remedied + new CHURN-003 architecture note),
CHANGELOG (Fixed entry), ROADMAP §5 (→ SHIPPED), + CHURN-003 post.md. CMS task
obligation marked resolved.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…, dashboard-fixes, grafana-audit-002)

Durable near-term execution queue re-derived 2026-06-25: A) jiminy-actionability-001
incomplete epics (Lever C/Epic 5 — trigger fired, + Epic 4 tune, Epic 1 harness,
Epic 6 post.md); B) DASHBOARD-FIXES-001 (10 UI tab bugs, plan ready); C)
GRAFANA-AUDIT-002 (re-run grafana_panel_audit.py — the 17-EMPTY result is stale
after ~10 metric-changing sprints — + add panels for new unpanelled metrics).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
… freeze, rsic badge (Epic 1)

- backup.js: read created_at/size_bytes/spaces (was created/size/space_id → blank
  columns); Restore dropdown now works.
- handlers_backup.go: /v1/backup/list emits a response-time status="completed"
  (a listed manifest is always a completed artifact) so the UI Restore filter +
  Status column work. UATS backup_list.uats.json asserts status + the
  UI-depended fields (created_at/size_bytes/spaces); hash re-pinned (UxTS contract).
- learning.js: source the frozen flag from /v1/learning/stats freeze_state
  (authoritative) — freezeStatus endpoint has no top-level .frozen, so a frozen
  space rendered "active".
- dom.js: 'running' + 'completed' are healthy badge states (RSIC State badge
  rendered red when healthy).

Live-verified: /v1/backup/list carries status='completed' + created_at/size_bytes/
spaces; UATS hash valid; build + lint + vet clean.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…tribution, rsic poll (Epic 2)

- plugins.js: Details button label now toggles inside the handler (render-time
  ternary left it stuck at "Details"); detail is fetched on SHOW only (was
  re-fetching on hide).
- memory.js: surface observation_count (present in /v1/memory/stats, never
  shown); render the memoryDistribution subscription that was fetched every 30s
  and never used — graph phase + edge count + phase alerts (e.g. phase_saturated).
- main.js: immediate pollRsicTab() on switchTab('rsic') so the State/health
  badges aren't "unknown" for up to 10s on mount.

Build OK (embedded UI bundles); live Playwright verification in Epic 4.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
… features config_key, training tables (Epic 3)

- config.js: remove the dead first cb.onchange (immediately overwritten by the
  second, which also updates the label); single handler now.
- status.js: State badge reflects 'degraded' instead of a hardcoded 'running';
  surface the per-subsystem healthz.checks map (hidden before) so a degraded
  status shows WHICH subsystem is down.
- handlers_features.go: populate config_key for the features with a real enable
  flag (embeddings→EMBEDDING_PROVIDER, anomaly_detection→ANOMALY_DETECTION_ENABLED,
  hidden_layer→HIDDEN_LAYER_ENABLED, scraper→SCRAPER_ENABLED). learning/retrieval/
  conversation are always-on core (no enable flag) → config_key honestly stays empty.
- training_data.js: render result.tables explicitly (array/object/scalar) instead
  of raw coercion.

Build + golangci-lint clean.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…le timeout + docs (Epic 4)

- 7 TestDashboardFixes001 Playwright assertions (backup columns + restore
  dropdown, learning freeze badge, rsic green-when-running, plugins label
  toggle, memory observations, no console errors on fixed tabs) — all green live.
- Fix pre-existing TestInteractiveRsic::test_trigger_dry_run_cycle flake (NOT a
  regression from this sprint — RSIC trigger path untouched): the dry-run cycle
  runs the LLM reflector and legitimately takes ~30.5s under load (live-measured,
  returns 200), but the test's expect_response budget was 30000ms — undershot by
  ~0.5s. Bumped to 90000ms + accept the cooldown-409 (correct rate-limit) as a
  skip, not a failure.
- CHANGELOG Fixed entry + sprint post.md.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…nal (CI has no backups)

CI's fresh stack has no backups, so the $.backups[0].{created_at,size_bytes,
spaces,status} assertions I added failed (path not found). Marked them
optional:true — the runner SKIPs an absent optional path (uats_runner.py:714),
so they assert when a backup exists (live/local — verified PASS) and pass on
an empty list (CI). Hash re-pinned; verify-hashes valid.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Re-ran grafana_panel_audit.py vs current live TSDB: 139 PASS / 7 EMPTY / 0 FAIL
/ 18 SKIP (vs audit-001's 130/17/0/18 — improved, no broken queries). Plan +
audit_summary capture the 7 EMPTY triage targets + the new unpanelled gauges
(jiminy_surfaced_*, null_weight_edges, conversation_coverage, etc.).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…pics 2-4)

Phase 2 of the dashboard re-audit. Fixed overview/Request Latency Distribution
(removed the dead _p50 target — recorder emits only _p95/_p99). Added panels for
new operator-valuable gauges that had none: Surfaced Actionable Fraction
(mdemg-jiminy), Null-Weight Abstraction Edges + Conversation Coverage Ratio
(mdemg-neo4j) — all confirmed PASS with live data. Post re-audit: 143 PASS /
6 EMPTY / 0 FAIL (remaining EMPTY documented legit-empty; one disclosed
no-producer gap: llm_interactions.quality has no writer). post.md + audit_summary
+ pre/post audit_results + CHANGELOG + backlog ledger (C → shipped).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…d (Epic 5a loose ends)

Formalize the Epic-4 ad-hoc probe into scripts/jiminy_actionability_ab.py
(--arm/--base-url/--queries-file/--json; surfaced actionable-fraction + type
distribution per arm). Write the missing post.md; feature-doc name reconciled
to the shipped jiminy-actionability.md (not renamed — CLAUDE.md/CHANGELOG ref it).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…ism + score audit (Epics 5b+5c)

Closes the Epic-4 finding that retrieval surfaces no actionable candidates for
most contexts (so Lever A's quota had nothing to promote). fetchActionableCandidates
runs a targeted Neo4j vector query over role_type IN ('constraint','correction')
nodes by embedding similarity (cosine sim ≥ JIMINY_GUIDANCE_CONSTRAINT_SIM_FLOOR,
top JIMINY_GUIDANCE_CONSTRAINT_INCLUDE_TOPK), mirroring matchConstraintCodeByEmbedding.
The returned nodes are ALREADY KNOWN actionable (query filters role_type), so they
are typed correctly — sidestepping the retrieval-path role-classification gap (the
adapter drops role_type → classifyRetrievalItem mis-types everything as learning).
Merged into Guide()'s pool (dedup by node_id) behind JIMINY_GUIDANCE_CONSTRAINT_BIAS_ENABLED
(default false); Lever A's composition then promotes them.

RRF-SCALE-001 audit (leverc_score_audit.md): scale-invariant — the only threshold
gates the vector-index COSINE sim ([0,1], stable), NOT the RRF RetrieveResult.Score;
config-driven, no hardcoded literal; consulting score-floor gates untouched.

Build + lint + config-guard clean; guard unit test (nil driver/topK<=0/empty embedding → nil).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…ve-smoke find)

Epic-5d A/B caught it: the index-scan form (db.index.vector.queryNodes top-50
then filter role_type) returned 0 actionables — constraint/correction nodes are
~0.1% of MemoryNodes, so they almost never rank into the global top-50, and the
merge silently no-op'd (leverc_actionable_merged absent from debug; the apparent
A→B lift was substrate drift). Replaced with vector.similarity.cosine over the
ROLE-FILTERED set directly (only ~hundreds of actionable nodes — cheap), which
guarantees the top-K actionables are found. Same cosine [0,1] scale
(RRF-SCALE-001-safe). Verified live: leverc_actionable_merged=5; controlled A/B
actionable fraction 11.1%→47.7% (clears the ≤60%-abstraction milestone).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
… 5d+5e)

Controlled live A/B: surfaced actionable fraction 11.1%→47.7% (4.3x) with Lever C
on — clears the ≤60%-abstraction milestone Lever A couldn't move; surfaced
constraints query-relevant. ab_results.md + feature doc + CLAUDE.md note +
CHANGELOG + backlog (A → complete). All levers default-off; operator
recommendation: enable Lever C + Lever B.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…fig (enabled live)

Operator goal >90% actionable: achieved + enabled on the live stack. Sweep shows
SIM_FLOOR 0.30-0.60 all hit 100% actionable (Lever C topk=15 + Lever A cap=0.1
quota=0.9); 0.70 drops to 66% (cliff). Chose SIM_FLOOR=0.60 — highest floor still
filling 10 slots, best relevance. Honest tradeoff documented: 100% actionable
fully suppresses abstraction context, and to fill 10 slots some constraints are
moderately (not highly) relevant — this substrate lacks ≥9 cosine≥0.7 constraints
per arbitrary context. Live-confirmed 10/10 actionable incl. an unseen query.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
EOF
…(enabled live)

Operator chose relevance-balance over maximal >90%. Live config: SIM_FLOOR=0.70
(highly-relevant constraints only) + MIN_ACTIONABLE_FRACTION=0.3 (guarantee they
surface) + ACTIONABLE_WEIGHT=1.5, NO abstraction cap (context preserved).
Live-measured: 25% actionable (9 constraint/36) + 75% relevant context; every
surfaced item on-topic (TSDB-migration context → TimescaleDB/schema constraints +
003_metric_types/tsdb_schema_meta patterns/learnings). The >90% config retained as
reference (padded + suppressed context).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
… fresh contexts

6 additional contexts (deploy/RRF/LLM-timeout/observability/maintenance/embeddings):
composition relevance-driven (0-50%/query duty-cycle, 14% overall), 0% where no
>=0.70 constraint exists (no padding), surfaced items on-topic. Config generalizes.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…(opt-in)

Recommended relevance-balanced settings (enabled live; verified across contexts)
+ the maximal >90%-actionable alternative, both commented/opt-in. Lever C ships
default-off in code; .env.example carries the operator guidance. Full A/B +
tradeoff: docs/development/jiminy-actionability-001/leverc_sim_floor_sweep.md.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…alert_embedding_regression)

The RSIC zero-tolerance check #28 (self_reflect.go:526) fired CRITICAL
alert_embedding_regression every cycle. Root cause: the embedding recorder
reads call_site from a context-attached EmbeddingMeta, and 3 recorder-wired
embed paths attached none -> empty call_site (~4k/day in mdemg-dev; onset
2026-06-23 with the Lever C / jiminy-actionability Guide() volume).

Full audit of every .Embed/.EmbedBatch in internal/ found exactly 3 metaless
sites; all fixed:
- jiminy/service.go deduplicateItems: context.Background() -> threaded ctx +
  EmbeddingMeta{CallSite:"jiminy.dedup", SpaceID} (the dominant producer;
  re-embeds every guidance item per Guide()).
- api/context_fingerprint.go derive + getOrBuild: attributed via
  deriveQueryFingerprint -> EmbeddingMeta{CallSite:"context_fingerprint"}.

CLI one-shots wire no embedding recorder (exempt). The zero-tolerance check is
left intact -- a valid guard that caught a real gap.

Tier-3 live: rebuilt binary, restarted server, 4 Guide() + 2 ?context=auto
retrieves -> 325 new rows, 0 empty call_sites; context_fingerprint (242) +
jiminy.dedup (18) attributed. Data hygiene: pre-fix empties in the 24h window
relabeled to sentinel legacy-unattributed (4,168 rows, reversible UPDATE) ->
window 0; older compressed-chunk empties age out via 90d retention.

New: TestDeduplicateItems_AttributesCallSite (capturing embedder). jiminy/api
suites green; lint 0. Feature doc: docs/features/embedding-attribution.md.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@github-actions github-actions Bot requested a review from reh3376 as a code owner June 26, 2026 02:32
@reh3376 reh3376 self-assigned this Jun 26, 2026
@reh3376 reh3376 merged commit b7e81f9 into main Jun 26, 2026
7 checks passed
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