Release
v5.4.0 — Multi-Environment Isolation, Source Protection, Promotion Chain
EnvironmentManager (lib/env-manager.ts): full promotion chain dev → st → sit → qa → preprod → prod with a dead-end sandbox tier. Gate types: auto (dev/st/sit/qa/sandbox), confirm (preprod), approval (prod).
Read the release here or open the original release on GitHub.
What's New
Multi-Environment Isolation
- EnvironmentManager (
lib/env-manager.ts): full promotion chaindev → st → sit → qa → preprod → prodwith a dead-endsandboxtier. Gate types:auto(dev/st/sit/qa/sandbox),confirm(preprod),approval(prod). - Promotes only config files (
trust_levels.json,budget_ceilings.json,validation_rules.json); live state (audit_log.jsonl,active_grants.json,pending_changes/) never promotes. - Auto-backs-up destination environment before every overwrite.
Backup / Rollback
backup(env),restore(env, backupId),listBackups(env),pruneBackups(env, keep).- Stored under
data/<env>/.backups/. Default retention: 10. Auto-pruned after each backup.
LockedBlackboard Env Routing
- New
env?option inLockedBlackboardOptions; falls back toNETWORK_AI_ENVenv var. - All paths (
swarm-blackboard.md,.blackboard.lock,pending_changes/) scoped underdata/<env>/.
Source Protection
SourceProtectionErrorclass exported fromlib/agent-runtime.ts.SandboxPolicy.sourceProtection?: boolean— when enabled,FileAccessor.read/write/listblocks any path outsidedata/<env>/, returning{success: false}(no path leak).
Python NETWORK_AI_ENV Support
- All 5 Python scripts read
NETWORK_AI_ENVat startup and accept--env <name>CLI argument. - Uses
globals()pattern to avoid PyrightreportConstantRedefinitionerrors.
CLI env Command Group
npx network-ai env init --all
npx network-ai env list
npx network-ai env chain
npx network-ai env diff --from dev --to prod
npx network-ai env promote --from dev --to st
npx network-ai env promote --from preprod --to prod --approved-by security-board
npx network-ai env backup create --env prod
npx network-ai env backup restore --env prod --latestStats
- 29 test suites, 2,976 passing assertions (+77 vs 5.3.2)