- Split monolithic
main()into named phase functions for readability
- Deferred
config.pyimport-time side effects into explicitinitialize()function
- Replaced repetitive
merge_config_changes()if-blocks with data-driven field descriptors
- Extracted forced actions from
executor.pyintoforced_actions.pymodule - Fixed 4 broken tests
- Removed outdated archive docs, debug output files, scratch files, and runtime logs from repo; updated
.gitignore - Trimmed CHANGELOG and CLAUDE.md to reduce token count
- Added
--enable_upgradeto USER-GUIDE-PART3.md under a new "Automatic Upgrade Control" subsection in section 3.6
- Automatic upgrades disabled by default: Since
antnodenow performs its own self-upgrades, WNM's upgrade decision is skipped unless--enable_upgradeis explicitly passed- Add
--enable_upgrade(env:ENABLE_UPGRADE) flag to opt back in to WNM-managed upgrades --force_action upgradeis unaffected and continues to work regardless of this flag- No database schema changes; this is a non-persistent runtime option
- Add
- Log warning when attempting to disable a named node that does not exist
- Always send a stop signal to the process manager when disabling a service, in case there is a flapping service
- DISABLED nodes no longer block node additions: DISABLED nodes with outdated versions were causing
nodes_to_upgrade > 0while no eligible nodes could be found, blocking new node additions indefinitely. Fixedget_machine_metrics()to exclude DISABLED nodes from upgrade counting; addeddisabled_nodesmetric for visibility
- Force action validation extended to stop/start/upgrade/disable: Whitespace-only
--service_nameinput and all-nodes-failed cases now return a clear error instead of silently affecting unintended nodes
- Force remove node validation: Invalid or non-existent
--service_namevalues now returnstatus: "error"instead of removing an unintended node
- Survey transitional state preservation: Regular node surveys no longer overwrite UPGRADING, RESTARTING, or REMOVING states, preventing loss of delay timer tracking
- Version bumped to 0.5.0 to avoid confusion with Autonomi tool versions
- AntctlZenManager upgrade support: fixed
'dict' object has no attribute 'antnode_path'error during upgrade; AntctlZenManager now correctly uses antctl's built-in upgrade command
- Process manager start node race condition: all managers now check the metadata port before attempting to start, preventing sync loss when a node finishes starting after the manager times out
--force_action disable_config: disables persistent boolean settings (e.g.--antctl_debug,--no_upnp) by setting them to False in the database
- Model serialization: completed missing fields in
__repr__and__json__for Machine, Container, and Node classes
--highest_node_id_used: node ID tracking for antctl managers to prevent port conflicts from ID reuse after node removal; automatically initialized during--initand reset during teardown
--rust_backtrace: passesRUST_BACKTRACEenvironment variable to antctl subprocess; accepts1orfull
--antctl_version: pins antnode version for antctl managers; passes--versionto bothantctl addandantctl upgrade
- AntctlZenManager: added
session.refresh(node)after commit to prevent detached instance error when accessing node attributes
- AntctlZenManager: use
session.merge()instead ofsession.add()for detached node instances duringcreate_node()
antctl+zenprocess manager: uses antctl defaults for paths, maintains explicit port control, parses antctl output to track actual paths
- Antctl: extract JSON block from mixed debug/JSON stdout using regex; log stdout/stderr at DEBUG level for all antctl operations
--antctl_debug: adds--debugto all antctl commands; auto-enabled when--loglevel DEBUGis set
--antctl_path: explicit path to antctl binary; required for macOS cron where PATH is not inherited
- Lock file cleanup now guaranteed via
atexitand signal handlers (SIGTERM, SIGINT)
- Node creation: metrics and RPC ports now use configured
metrics_port_startandrpc_port_startinstead of hardcoded constants
- Port start settings now accept full port numbers (e.g. 55000) and normalize to thousands digit automatically
- Running without
--initon a missing database now exits with a helpful error instead of creating an empty broken database
--report_format config: outputs machine-config in lower_snake_case suitable for WNM config files
--initnow exits immediately after initialization; decision engine no longer runs during init
- False reboot detection on first run after
--init;last_stopped_atnow initialized to current system start time
--initnow emitsstatus: "system-initialized"instead of"system-rebooted"; node survey skipped unless--importor--migrate_anmis provided
- Decision engine tests: added missing concurrent operations config keys and metrics fields
--report machine-config --report_format envnow quotes paths with spaces or special characters
--report machine-metrics --report_format env:NODES_BY_VERSIONnow quoted for shell safety
--report machine-metrics --report_format env: output system metrics as shell environment variables
- Moved
test_antctl_integration.pytoscripts/; merged concurrent ops tests intotest_decision_engine.py
--jsonflag as shortcut for--report_format json
- Filled in missing changelog entries for v0.3.0–v0.3.7
--this_survey_delay: non-persistent per-run override for--survey_delay
- Config file path documentation corrected to match actual configargparse defaults
- Immutable settings (
--port_start,--metrics_port_start,--process_manager) only error when value differs from database, allowing them in config files
--report machine-config --report_format env: output configuration as shell environment variables
--action_delay/--this_action_delay/--interval: configurable delay between node operations
- Database migration command now runs before config loading; prevents errors during migration
- Critical Alembic migration bugs: database URL override, legacy database auto-stamping, migration detection
- Migration error handling when Alembic history has multiple heads
--force_action nullop/update_config: lightweight config update that bypasses the decision engine
- Concurrent operations:
--max_concurrent_upgrades,--max_concurrent_starts,--max_concurrent_removals,--max_concurrent_operations
- Alembic migration chain: fixed branched migration tree causing "multiple heads" error
--survey_delay: configurable delay in milliseconds between node surveys
- Database migration documentation updated in USER-GUIDE-PART3.md
- InfluxDB resources report export documentation and cron examples
- Test fixtures updated with missing required model fields (
delay_restart,rpc_port_start,rpc_port,antnode_path)
--show_machine_config,--show_machine_metrics,--show_decisionsflags for opt-in verbose logging--report machine-configand--report machine-metricsreport types
- Machine config, system metrics, and decision features no longer logged by default; require explicit flags or
-v
- Logging system broken by Alembic imports triggering Python's default logging auto-configuration; moved all alembic imports inside functions
- Exit code bug: program was always exiting with code 1
- Antctl node import: regex-based node ID extraction from service names
- Antctl RPC port parsing from
rpc_socket_addrfield
--importflag: explicit opt-in to importing existing nodes during--init
- Node import during init is now opt-in; fresh installs no longer produce import warnings
- Database rebuild from existing systemd/launchd services via
--init --process_manager <type>
- RPC port configuration:
--rpc_port_start,rpc_portfield on Node,--rpc-portpassed to antctl
- AntctlManager:
create_node()passes--pathto prevent binary re-download on every add; addedupgrade_node()using antctl's built-in upgrade
--antnode_path: configurable source binary location (default:~/.local/bin/antnode)
- Node upgrade: stop node before copying binary to avoid "Text file busy" error
- AntctlManager:
create_node()now callsstart_node()after creation so nodes become active immediately
no_upnpsetting no longer reset to False on every run- AntctlManager: network argument passed correctly
--process_managerrestricted to--initonly
- Replaced print statements with proper logging calls throughout application code
--report influx-resources: InfluxDB line protocol output for NTracking integration- Extended node metrics from Prometheus endpoint (13 new fields)
-q/--quietflag;--loglevelnow functional; Alembic migration system
--no_upnp: configurable UPnP control across all process managers
antctl+user/antctl+sudoprocess manager with full antctl CLI integration
- Removed
--teardownflag; use--force_action teardown --confirminstead
ProcessManager.create_node()returnsNodeProcessmetadata instead of bool
- USER-GUIDE-PART3.md: complete configuration reference
- Conservative default thresholds:
mem_less_than70→60%,mem_remove90→75%,hd_less_than70→75%
--dbpathtilde and environment variable expansion
- Test collection failure when database unavailable; platform detection in tests
- LaunchdManager: accepts
modeparameter;start_node()recreates missing plist files
--versionflag;--remove_lockfileflag
- Renamed
LaunchctlManagertoLaunchdManagerthroughout
systemd+sudopath selection; nodemanager_typepreserved from machine config
- Named wallets (
faucet,donate) and weighted wallet distribution for--rewards_address
See git history for earlier changes.