Skip to content

Revisions

  • Fix nine false or stale claims, verified against the tree A page-by-page audit of all 23 pages against repo master found seven claims that are simply false and two that are stale. Each was re-checked against the tree before being changed rather than taken on trust. False: - /events/recent as the dashboard feed endpoint. No such route: events is index + collection { get :search }, and there is no recent.js.erb. The feed refreshes via GET /events.js; EventsController#recent is unreachable dead code. (Interface.md.) - "Every management index screen is paginated at 25 rows". systems is deliberately unpaged, as are services, words (fixed 20), alerts, events, polling_priorities. - The list of screens pagination replaced: that commit touched twelve controllers, systems was not one of them, and hunks -- which it did touch -- was omitted. windows_targets and active_directory_connections inherited it later. - A Search row as a string "plus its time window". searches carries string, user_id, description, short_description and nothing else; no timeframe column has ever existed, so it is chosen again at run time. - "the systemd units set /var/DAD/offline_storage, mode 0700". No unit sets the variable; the path comes from the default plus WorkingDirectory. And nothing in the app sets 0700 -- EventPartitionBackup uses mkdir_p, so the directory gets the umask default. This one is load-bearing: it told operators a directory of raw log lines was permission-protected when nothing protects it. - db:seed "seeds the two maintenance jobs" -- it seeds four. - JobHandler::HANDLERS as "seven operations" -- eight since poll_windows_events. Stale: - "Below 720px" in three pages; the media query is max-width: 768px. - Statistical-Alerting.md crediting a Math monkey patch; the helpers are Stats.mean/variance/standard_deviation, and the patch was removed. Also documents the new self-logging stack: every service but syslog ships its own stdout/stderr to the collector, the two measured traps that decide whether anything is stored at all (the log driver resolves syslog-address in the daemon's namespace, and the frame format decides the Service), the resulting single-System attribution, and the CI step that asserts Service names rather than merely a row. Checked and left alone: the Viewer rights row. An earlier audit flagged it for omitting preferences, but preferences is Admin-gated in CONTROLLER_RIGHTS, so the row is correct as written. Co-authored-by: openhands <openhands@all-hands.dev>

    @openhands-agent openhands-agent committed Nov 12, 2026
  • Correct the suite counts and the PollingPriority nav claim Development.md said '581 unit/controller runs plus 40 system runs, 1969 assertions in total'. That mis-splits a single number: rake test excludes test/system by design, so its 621 runs are all non-system and the 40 system runs are additional. Scanning every commit in history, the non-system count was never 581 -- it was 542 up to b6aafd7 and 621 after. The page now gives the counts per command, measured on Ruby 3.3.8 / PostgreSQL 17.11: 621 runs and 1969 assertions from rake test, 40 runs and 247 assertions from test:system, 5 scenarios and 18 steps from cucumber, all green. Access-Control.md said PollingPriority hides itself because it has no index route. It does have one (only: [:index, :edit, :update]); it hides itself because the bands are reached from the Windows Targets screens, which link to polling_priorities_path. The same error was in a config/routes.rb comment and an AdImportBatch comment in the repo, both now fixed. This wiki edit was made by an AI agent (OpenHands) on behalf of the user. Co-authored-by: openhands <openhands@all-hands.dev>

    @openhands-agent openhands-agent committed Nov 12, 2026
  • Document importing Windows hosts from Active Directory Adds Active Directory Import, and updates the pages that the feature changes. The new page leads with the part that is not obvious from the requirement: the preview is persisted server-side and apply may only subtract from it, because a WindowsTarget row makes DAD connect out to a named host carrying a domain credential. It also records the three query behaviours that are load-bearing (paging against AD's silent 1000-object cap, unclassifiable operating systems, domain controllers), the two-credential model, and what is and is not covered by CI. Home: the feature is the most recent pass, and the chronology now reads in order -- the Windows-source paragraph no longer claims to be "the most recent". Access Control: new section on why two controllers are Admin-only at the controller level, where reads are gated, unlike windows_targets. Corrects hidden? to a class method. Development: the two remote integrations and the seams they sit behind; suite counts corrected to 581 + 40 runs / 1969 assertions. Interface: the connection screens and the two-page import, including which rows arrive pre-checked and which do not. Installation: DAD_AR_ENCRYPTION_* and WINDOWS_SSL_VERIFY now name the second model that reads them; one variable covers the LDAPS and WinRM trust decision rather than two. Windows Events: cross-links, and the LDAP gap added to "limits worth knowing". What Changed Since 2016: new dated section, and the system-suite assertion count corrected to 247. Every claim here was checked against the code. Two were wrong as first written and corrected: the LDAPS/StartTLS note is on the show page, not the index, and the import result lands on the Windows targets screen. Co-authored-by: openhands <openhands@all-hands.dev>

    @openhands-agent openhands-agent committed Nov 11, 2026
  • Update the wiki for direct WinRM polling of Windows hosts DAD now polls Windows hosts itself with wevtutil over WinRM instead of requiring OpenWEC on the Windows side plus a fourth daemon to forward what it wrote. The OpenWEC path stays documented as the alternative, because a subscription receives events pushed to it and a pull model cannot recover records for a host DAD cannot reach. Windows-Events.md is restructured around the two paths sharing one pipeline rather than around OpenWEC specifically. New material: the priority bands and the adaptive interval (clamp(500/eps, band_min, band_max), EMA-smoothed rate, 25% deadband), per-host disable, the credential model and why the encryption keys must not be rotated, the 60s delta overlap and the duplicate trade, and the failure behaviour that keeps one bad host or channel from costing the others. Also corrected along the way, independent of this feature: - Access-Control.md never documented ACTION_RIGHTS at all, only CONTROLLER_RIGHTS. That is the mechanism that makes reading a target a Viewer action while writing or polling one is Admin, so it is now spelled out with the reason for each override. - Interface.md had no Windows targets section, and its paginated-list count was twelve. - Jobs.md listed seven handlers; there are eight. Added a note that the Job frequency is not the polling interval, since the two numbers being different is easy to misread as a bug. - Development.md test counts were 488/40 runs, 1679 assertions. - Installation.md was missing DAD_AR_ENCRYPTION_KEY, DAD_AR_ENCRYPTION_SALT and WINDOWS_SSL_VERIFY, and had no warning that rotating the credential keys makes stored credentials unreadable -- unlike SECRET_KEY_BASE, which is safe to rotate. - Architecture.md and Home.md described Windows collection as OpenWEC only. - What-Changed-Since-2016.md gets an entry, since the older pages describe a design that no longer holds. Stated as limits rather than glossed over: the WinRM transport is not exercised in CI (no Windows host; the transport sits behind a seam and the parsing/delta/queueing logic is tested against recorded wevtutil XML), and the pull path reads rather than subscribes, so records written while a host is unreachable are only recovered if they are still in the channel next poll. This wiki update was prepared by an AI agent (OpenHands) on behalf of the repository owner. Co-authored-by: openhands <openhands@all-hands.dev>

    @openhands-agent openhands-agent committed Nov 11, 2026
  • Update the wiki for PostgreSQL-only dev/test and the deleted provision.sh SQLite is no longer the development and test engine, and Vagrantfile and provision.sh are gone, so most pages described a setup that no longer exists. - Installation: drop the Vagrant quick-start, make the manual path create a Postgres database per environment and use db:migrate_from_scratch, and move the secret-file guidance off provision.sh onto the systemd units. - Development: replace "Two databases, and why CI has both" with "PostgreSQL everywhere", documenting why db:migrate_from_scratch is required, why maintain_test_schema is now unconditionally false (its old DATABASE_URL condition inverted once Postgres became the default), and what test/support/scratch_database.rb and query_plan.rb are for. Suite counts updated to 436 runs / 1237 assertions / 0 skips. - Search: expand the collation finding to the actual mechanism -- the [term, term + U+10FFFF) range and why no sound upper bound exists under en_US.UTF-8 -- with an explicit "do not reintroduce" note. - Architecture, Retention, Jobs, Access-Control, Home: correct the engine claims and provision.sh references. - What Changed Since 2016: new "Removed: SQLite as the development and test engine" section, including the two guards that look like dead SQLite support but handle an unpartitioned Postgres install. Co-authored-by: openhands <openhands@all-hands.dev>

    @openhands-agent openhands-agent committed Nov 11, 2026
  • Document the 2026-11 integrity/scheduler/pagination pass, with screenshots Brings the wiki in line with the code as of the four fixes that followed the 2026 review pass. Jobs: the handler registry is seven operations, not six - prune_sessions is new and seeded hourly. Failure behaviour rewritten: the loop body now lives in JobScheduler, and a Job with no usable frequency is disarmed (next_run NULL) rather than crashing the process. Documented why: the next_run line sat outside the begin/rescue, so a blank Frequency field crash-looped the scheduler under Restart=always with the row re-selected on every start, and no Job ran at all. Access Control: session_hash unique index (the per-request cookie lookup was a full scan), Session.purge_expired on logon plus the seeded prune_sessions job, and username uniqueness - do_logon uses find_by, so a second account sharing a name could never sign in, silently. Interface: new "Paginated lists" section, 25 rows/page across all twelve management indexes, ?page clamped at both ends, hand-rolled rather than a gem. Two new screenshots (sessions, statistics) at the same 1440x1008 as the rest. What Changed Since 2016: new section on the integrity constraints the application never had, and how the migration repairs existing bad rows without deleting any account. Development: SQLite can create a CHECK but cannot ALTER TABLE ADD CONSTRAINT, so the Postgres job is the only thing that exercises that branch. Home: status note for the follow-up pass. Rails version in Interface corrected to 8.1.4.1. Co-authored-by: openhands <openhands@all-hands.dev>

    @openhands-agent openhands-agent committed Nov 8, 2026
  • Add interface screenshots and correct disk/search documentation Adds an Interface page with screenshots of the running UI (login, dashboard, search results, jobs, users/roles/rights, preferences, alerts, displays, exclusions, stored searches, systems) taken against a seeded demonstration dataset, and threads the relevant ones into the pages they describe. Corrects the record on disk utilization: there is no dashboard disk gauge. The author commented it out in bec738c ("Hiding disk gauge", 2015-02-28); the live surfaces are the disk_utilization job and preferences.archiveFreeSpacePercent. Documents the open search-form bug (RECOMMENDATIONS 2.3): the Rails check_box always submits timesearch_enabled[enabled]=0, and EventsController#search branches on the presence of that key, so every form search takes the absolute date branch with a now->now window and reports 0 events. Co-authored-by: openhands <openhands@all-hands.dev>

    @openhands-agent openhands-agent committed Nov 8, 2026
  • Bring the wiki in line with the current project The wiki last changed in April 2016 and described an alpha that let you type Ruby into the Jobs form and the display editor. Both of those designs are gone, so the pages were not just stale but actively misleading. New pages: Architecture, Installation, Search, Displays (rewritten), Jobs, Retention and Archives, Access Control, Exclusions, Development, and What Changed Since 2016, which maps the 2015 material onto the current code. The eight alerting recipes are kept as a recipe archive with a banner and an API-status table on Example Jobs: the analysis shape still ports, but they call a Job design that no longer exists, and Math.mean/variance/standard_deviation were removed in favour of Stats. Home is now a landing page with a status summary and a task-based index. Co-authored-by: openhands <openhands@all-hands.dev>

    @openhands-agent openhands-agent committed Nov 8, 2026