Commit graph

78 commits

Author SHA1 Message Date
Luna
3dd82ab18b
docs(packaging): document desktop GUI frontends and optdepends
The GUI frontends landed with README/CLI/operations docs but no packaging
coverage. Add a PACKAGING.md section with the command/script/requirement
table for both frontends, note why stdlib tkinter is still an optdepend
rather than a hard dependency, and record that packaging must not grant the
GUIs privileges beyond the operator's own account.

Add the matching PKGBUILD optdepends (`tk`, `pyside6`), plus
`python-pystray`/`python-pillow` for the tray applet, which were never
listed when it shipped. Also add `gui/` to the CLAUDE.md architecture notes
and state snapshot.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01JX86xeoBJVBb16qHkDf53K
2026-07-22 04:33:55 -07:00
Luna
457c7604ba
feat(gui): add optional tkinter and Qt6 desktop dashboards
Add two optional windowed frontends over the same local state the TUI and
web console read: `enodia-sentinel gui` (stdlib tkinter) and
`enodia-sentinel gui-qt` (PySide6, new `[qt]` extra).

Both share `gui/model.py`, a GUI-free presentation model over
`tui.collect_model`, so every formatter is unit-testable without a display
server. Only `app.py` and `qt_app.py` import GUI libraries, enforced by
import-guard tests mirroring the tray applet's boundary.

Tabs cover status, alerts, incidents, posture, integrity, response plans,
and the event tail, plus daemon-control buttons via systemctl. Response
plans are display-only; the GUIs never execute containment commands. Core
runtime dependencies stay empty.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01JX86xeoBJVBb16qHkDf53K
2026-07-22 04:33:49 -07:00
Luna
9e3575461b
docs(go): save port checkpoint 2026-07-22 04:09:14 -07:00
Luna
a25c73ab1a
feat(go): report integrity anchor context 2026-07-22 04:04:58 -07:00
Luna
88d7a6e3b8
feat(go): enrich snapshots with package ownership 2026-07-22 03:50:55 -07:00
Luna
6355fb403d
feat(go): expose retained incident views 2026-07-22 03:12:34 -07:00
Luna
eff31b3a82
feat(go): enrich snapshots asynchronously 2026-07-22 03:10:26 -07:00
Luna
1ab4add205
feat(go): chain retained snapshot artifacts 2026-07-22 02:20:46 -07:00
Luna
fd2bbba0d7
feat(go): add bounded hot-path enrichment 2026-07-22 02:17:35 -07:00
Luna
538d1d954a
feat(go): persist Python-compatible incidents 2026-07-22 02:17:35 -07:00
Luna
f85c2e831a
feat(go): advance validation sidecar toward production 2026-07-22 01:52:19 -07:00
Luna
6a06eba255
docs(behavior): add behavioral spec for sweep + baseline lifecycle
Start a per-subsystem behavioral specification under docs/behavior/ that
documents the current Python agent's observable behavior at reimplementation
fidelity. It is the parity contract for the Go 2.0 rewrite (Active Migration
Track), complementing the product-oriented docs/SPECIFICATION.md.

Section 1 covers system-state capture, the daemon sweep loop, alert dedup, the
detector registry gating, and the baseline lifecycle — including three
behaviors the port must match exactly: baselines are rebuilt (not loaded) at
daemon start, arming is time-based via baseline_grace, and first_seen's
initialized flag persists across restarts while listener/SUID baselines
re-learn every start.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01D36ffwoga57opftxzJVHPW
2026-07-19 10:08:32 -07:00
Luna
6a27e6e770
feat(go): port memory-map detector tranche 2026-07-11 01:19:56 -07:00
Luna
c6f7219de8 feat(go): port socket detectors 2026-07-10 17:29:07 -07:00
Luna
fc9b5f0448 feat(go): port process access detectors 2026-07-10 05:19:56 -07:00
Luna
f02509aab5 feat(go): add Phase 1 parity sidecar 2026-07-10 05:02:50 -07:00
Luna
65f5be6420 feat(schema): add Alert -> enodia.event.v1 reference wrapper 2026-07-10 04:44:07 -07:00
Luna
54bd8ff1f4 feat(schema): add enodia.event.v1 EVE-style event envelope 2026-07-10 04:43:35 -07:00
Luna
8d929b50bd
Add Suricata assimilation design 2026-07-10 04:16:31 -07:00
Luna
9784033f86
Add host event rules for bind and capability activity 2026-07-10 04:11:33 -07:00
Luna
b40ac4252c
Add host correlation and assurance coverage 2026-07-10 04:04:27 -07:00
Luna
8194d13734 Expand TUI guidance and host detection coverage 2026-07-09 19:16:27 -07:00
Luna
3b037646d2 Add typed host event egress rule 2026-07-09 06:04:30 -07:00
Luna
0b010df514
Add audited response apply rehearsal 2026-07-09 05:56:25 -07:00
Luna
51d52b5229
Expand TUI and package recovery planning 2026-07-09 05:51:59 -07:00
Luna
cab60cd633 Add terminal TUI and shell completion 2026-07-08 20:47:58 -07:00
Luna
a7535cfc56 Add rule event compatibility tests 2026-07-08 17:09:00 -07:00
Luna
66472134d8 Add enrichment and SID coverage gates 2026-07-08 17:05:17 -07:00
Luna
93ac47dd82 Harden BCC syscall probe attachment 2026-07-08 17:04:45 -07:00
Luna
2d23e8b878 Record tray applet completion and SID coverage design draft
Update the CLAUDE.md snapshot and roadmap for the merged tray applet,
note the shared-checkout commit hygiene rule, and save the agreed
SID drill coverage design as a draft spec.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-04 06:37:07 -07:00
Luna
afbc63ffbd Merge branch 'main' of https://codeberg.org/anassaeneroi/enodia-sentinal 2026-07-03 16:47:44 -07:00
Luna
036469ed21 Document the desktop tray applet and check --json
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-03 07:40:06 -07:00
Luna
a5e954e0ed Add opt-in autostart desktop entry for the tray applet
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-03 07:38:23 -07:00
Luna
1451cf7d58 Add pystray tray applet wiring and [tray] extra
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-03 07:37:39 -07:00
Luna
2fce7d412a Add tray desktop notification helper
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-03 07:35:59 -07:00
Luna
a57cf4a16f Test open_dashboard early-return when web start fails
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-30 15:24:25 -07:00
Luna
4545b2b5a2 Add tray action layer over CLI and systemctl
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-30 06:05:48 -07:00
Luna
715db9ec36 Add tray status model
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-30 06:01:53 -07:00
Luna
826daa3ab7 Add --json output to the check command
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-30 05:58:57 -07:00
Luna
5e560f4307 Add tray applet implementation plan
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-30 05:49:06 -07:00
Luna
2e7bf8b248 Add tray applet design spec
Optional desktop system-tray applet as a thin launcher over the existing
CLI and systemd. Core agent stays stdlib-only; tray ships as an optional
[tray] extra (pystray + Pillow). Covers menu actions, icon state, error
handling, packaging, and testing seams.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-30 05:12:16 -07:00
Luna
a985024cad Trigger mirror sync 20260629 2026-06-29 11:20:03 -07:00
Luna
6a9e94c9fa Make release-artifacts dirty assertion track real git state
test_release_script_generates_checksummed_artifacts hard-coded
`dirty == 1`, which only held while the worktree happened to be dirty. The
script derives `dirty` from actual git state and RELEASE_ALLOW_DIRTY is a
permission flag, not a forced value — so the test failed the moment the tree
was clean (all work committed). Compute the expected dirty flag the same way
the script does so the test is deterministic on both clean and dirty trees.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-27 10:47:31 -07:00
Luna
9cbdb989ac Surface reconciliation in the dashboard and keep the view read-only
Two gaps in the baseline-reconciliation feature:

- The dashboard claimed to summarise acknowledged drift, but renderIntegrity()
  never rendered it. Add a `recon` chip to the integrity summary and a
  Reconciliation state-card (accepted/ok/stale counts plus stale items).
- A read-only GET /api/integrity could write the store: list() flushed a
  TTL-lapsed ok->stale transition to disk, violating the read-only dashboard
  invariant. Add list(persist=False) and use it from the web summary path so
  staleness is evaluated in memory without touching the file.

Covered by a new test asserting integrity_report() never rewrites the store.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-27 10:39:15 -07:00
Luna
dbbe35b3fc Add baseline reconciliation: accept audited drift with a reason
Implements the v0.9 roadmap item from the approved design spec. Operators
accept a specific FIM/package/listener/SUID drift item with a mandatory
reason; the ack suppresses that one alert only while the live state still
matches the recorded fingerprint. Content kinds (fim/pkgfile) re-alert on
further change; identity kinds (listener/suid) retire on TTL or revoke.

- reconcile.py: ReconcileStore (mtime-cached, fails closed on missing/corrupt
  store), fingerprint builders, and the filter_alerts chokepoint.
- CLI: baseline accept/revoke/list with --reason/--expires/--force/--stale/--json.
- Wired at the daemon sweep + eBPF chokepoint, fim-check, and /api/integrity.
- RECONCILE_V1 schema, config knob, COMMAND_REFERENCE/SCHEMAS/OPERATIONS/ROADMAP
  docs, and reconcile unit/CLI/integration tests.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-27 10:33:55 -07:00
Luna
3d2047fde2 Add baseline reconciliation design spec
Covers the v0.9 roadmap item: accept legitimate FIM/package/listener/SUID
drift with a mandatory reason and audited fingerprint-bound ack store.
Approach A selected: ReconcileStore with re-alert-on-fingerprint-change,
optional TTL, and stale tracking. Filter applied at daemon chokepoint,
CLI fim check, and dashboard API.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-19 03:49:59 -07:00
Luna
69798b26e4 Add systemd unit posture checks
Close the remaining v0.8 posture bullet: flag enabled systemd units with
group/world-writable unit files (systemd_unit_writable, sid 100050) and
units whose ExecStart binary runs from a writable/unsafe path such as
/tmp, /dev/shm, /var/tmp, /home, or /run/user (systemd_exec_unsafe_path,
sid 100051).

- posture.systemd_findings/parse_systemctl_show/read_systemd_units, wired
  into posture.run() behind the new posture_systemd config knob.
- read_systemd_units shells out to systemctl with timeouts and fails closed
  on non-systemd hosts; the dashboard /api/posture surfaces findings for free.
- Unit tests for the parser and evaluator; TestRunIntegration patches the
  new reader so run() never touches live systemctl.
- Docs: COMMAND_REFERENCE posture list, ROADMAP v0.8 bullet, RUNBOOKS
  Runbook 2 triggers, config TOML knob.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-19 02:27:19 -07:00
Luna
11d91a40b4 Add dashboard integrity/watchdog console
Surface integrity and watchdog state in the read-only dashboard via a new
/api/integrity endpoint and integrity_report(): watchdog/heartbeat
verdict, FIM baseline and package-DB anchor freshness, pacman keyring and
SigLevel posture, and Sentinel's own self-integrity footprint. The
endpoint summarizes existing anchors and heartbeats only — it runs no live
FIM or package verification from the request path, keeping the dashboard
read-only.

Add the enodia.integrity.v1 schema (schemas.py + docs/SCHEMAS.md) with a
contract test, a new "Integrity" dashboard tab and summary metric, and
web tests for the report shape, schema contract, endpoint, and console
wiring. Docs updated; completes the v1.0 "dashboard to local console"
roadmap item.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-18 17:39:53 -07:00
Luna
e0e5cd62d9 Document packaging and release artifacts 2026-06-17 00:22:43 -07:00
Luna
aee984d862 Version documentation index and contracts 2026-06-16 04:14:26 -07:00