feat(FM.2): warm observe-only ambient monitor daemon - #699
Open
Maqbool61 wants to merge 1 commit into
Open
Conversation
doberman monitor run/status score non-inline activity through the same decision engine, alert-only, never enforcing. Closes DobermanCore#237
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Closes #237.
doberman monitor run/doberman monitor status— the warm, observe-onlydaemon on top of the FM.1 activity bus. Each tick: polls every
doberman.collectorsentry point, emits onto the bus, drains from thedaemon's own saved cursor (crash-resumable, no replay/loss), and scores each
event through the same
decide()the live gate uses — recording an alert rowvia
record_decision(..., source_context_override="ambient:<collector_id>").Hard rules, each with its own test:
monitor/daemon.pynever statically importsdoberman.authordoberman.proxy.doberman.explain,doberman.render(used by
doberman log/status), anddoberman tuiall detect the"ambient:"source-context shape and prefix explanations with"observed (not enforced): ", replacing "blocked"/"pending auth" languagewith a neutral alert word. Structured output (
--jsonl) keeps the trueverdict for scripts/SIEMs — only human-facing text is softened.
revealed-preference table before and after a real multi-tick daemon run
and asserts byte-for-byte equality, plus an import-boundary test that the
daemon never reaches
doberman.subjective.baseline/drift/martingale/revealed.test (mirroring
test_import_boundaries.py's existing pattern) exercisesthe "Policy core must not depend on the ambient monitor"
import-lintercontract programmatically, not just via CI's
lint-importsstep.(
ReasonCode.ambient_scoring_error) are both covered directly.Also: a heartbeat + single-instance guard (refuses a second
monitor runforthe same repo),
doberman monitor statusfor liveness/cursor/backlog, anddocs/changelog updates.
CI: all 12 required checks pass (lint/boundaries/docs parity, package
smoke tests on ubuntu/windows, secret-scan, and the full test matrix across
3.11/3.12/3.13). Locally I saw two failures unrelated to this change — a
GUI-geometry test sensitive to local font metrics, and an integration test
whose
system_site_packagesvenv fixture can't see a project-venv install —neither reproduces here in CI, confirming they're local-environment-only.