neuralmind.uk / NeuralMind v4.16.0 — security.profile: cui: the CUI-enclave posture as one setting, enforced and checked as a unit Edit this page on GitHub ↗

NeuralMind v4.16.0 — security.profile: cui: the CUI-enclave posture as one setting, enforced and checked as a unit

Type: Minor release Theme: NIST SP 800-171 / CMMC Level 2 hardening, part 1. One setting switches on every control a CUI enclave needs, refuses what would weaken them, and leaves a record of each refusal

Running NeuralMind on CUI source code took four separate decisions, made by hand and checked by hand:

Nothing stopped someone from starting the graph view on 0.0.0.0 for a demo, or switching seeding on in a shell profile. Nothing told an assessor all four were in force. docs/compliance/NIST.md listed a single hardened profile as the next SP 800-171 item; this release ships it.


What changed

security.profile: cui

Set it in neuralmind-backend.yaml:

security:
  profile: cui
  users:
    alice: builder

It can’t be loosened, and it fails closed

neuralmind doctor checks the profile as a unit

A new Security profile line covers what a project file can’t enforce on its own:

Finding Result
Profile contradicted or misspelled fail
OS FIPS mode off (CMMC SC.L2-3.13.11) fail. Without the profile this is a warning on the storage line
OS FIPS mode can’t be read (macOS) warn
NEURALMIND_LLM_SEED=1 left set warn: the profile refuses it, but it shouldn’t be in the enclave’s environment
Embedding model not on disk (default turbovec backend) warn: the first build would download it
A running daemon listening beyond loopback or without its token warn: it refuses this project
None of the above ok, naming what the profile enforces

Without a profile the line reports ok with “none”. doctor exits 1 on any failure, so the check can gate a provisioning script.

What the agent actually sees

Nothing changes for an agent in a project without the profile.

Under profile: cui:

Per-agent expectations

Agent What changes under profile: cui
Claude Code (hooks + MCP) MCP calls attributed to the OS account and refused without a role; hooks refuse on an unverified disk (fail-open: they inject nothing and exit 0)
Cursor / Cline / Continue (MCP) Same MCP behaviour; keep the server on stdio, since identity: os refuses the HTTP transport
Hermes-Agent plugin Same hook behaviour as Claude Code
Generic MCP client Same as Cursor

Upgrading

Not in this release

The rest of the SP 800-171 work, in order:

See NIST.md §3.

Reproduce

pytest tests/test_security_profile.py -v
pytest tests/test_cli_exit_codes.py -k serve-refused -v

printf 'security:\n  profile: cui\n' > neuralmind-backend.yaml
neuralmind serve . --host 0.0.0.0; echo "exit $?"   # serve refused … exit 1
neuralmind doctor .                                  # Security profile line