Configuration

Alfred keeps project config, model assignment, and profile overrides separate. Project config stays in .alfred/config.json; user-owned model assignment lives in ~/.alfred/models.json.

Capability preferences

Releases with the composition layer record approved Workspace, Memory, and Agent Harness selection in .alfred/setup/components.json. Preview and discovery leave it untouched. Managed harness files retain their separate .alfred/setup/installation.json receipt, compatible with 1.1.0.

Each capability owns its state and configuration. Workspace uses its own external data directory; a Memory filesystem workspace binding is a separate tenant-access concept. Choosing components does not connect their services or credentials. See Product capabilities.

Initialize project configuration

From your project root:

guided installer
curl -fsSL https://raw.githubusercontent.com/GOI17/main/install.sh | sh

The TUI previews suite config and selected harness artifacts before writing. It only applies files after explicit approval.

Schema

.alfred/config.json
{
  "schema": "alfred.config/v1",
  "tenant": "my-project",
  "profile": "coding",

  "policy": {
    "default": "deny",
    "protected_paths": [".ai/", ".opencode/", "harnesses/"],
    "destructive_commands": ["rm -rf", "git reset --hard"],
    "approval": "human"
  },

  "memory": {
    "hosting": "local",
    "store": "sqlite",
    "path": "~/.alfred/tenants/my-project.sqlite"
  },

  "evals": {
    "baseline": ".ai/evals/baselines/main.json",
    "gates": ".ai/evals/regression-gates.json",
    "auto_compare": true
  },

  "harnesses": {
    "primary": "opencode",
    "targets": ["opencode", "codex", "pi"]
  }
}

Model assignment

You own your model. Alfred does not hardcode a provider or model name in agent specs. Setup does not create or modify ~/.alfred/models.json. Assign primary models and fallback chains separately through runtime configuration; the example below is illustrative, not a setup-generated default.

~/.alfred/models.json
{
  "*": {
    "primary": "ollama/qwen2.5-coder:7b",
    "fallbacks": ["openai/gpt-4.1-mini", "anthropic/claude-sonnet-4"]
  },
  "orchestrator": { "primary": "anthropic/claude-sonnet-4" },
  "developer": { "primary": "anthropic/claude-sonnet-4" },
  "fallbacks": ["ollama/qwen2.5-coder:7b", "openai/gpt-4.1-mini", "anthropic/claude-sonnet-4"]
}
Tip. Profile overlays can specialize work/personal machines, while harness adapters translate user-owned bindings into their native config without changing agent specs.

Context compaction

Alfred triggers local-first context compaction around 35% of detected model context. Local heuristics run first; provider-assisted summaries require approval and emit provider_request_reduced.

Policy

policy.default is always "deny". Every protected path, every destructive command, and every permission change requires a human approval trace event.

Add a path or command to escalate the gate, never to lower it. Alfred will not let a subagent remove protected_paths even if the prompt asks nicely.

Memory hosting

Memory runs only as a local process bound to loopback. The managed hosted service is retired. Use SQLite for a coding tenant or your own Postgres database; database location does not change the local HTTP contract.

The web and both profile names are retained for Postgres-backed local clients. Cloud ChatGPT Actions and AI Studio cannot reach this process.

Environment variables

Sensitive values never live in config.json. Use env vars; Alfred reads them at startup.

env
# Local server (use the key issued by alfred init)
export ALFRED_MEMORY_REQUIRE_AUTH=true
export ALFRED_MEMORY_PORT=3000
export ALFRED_MEMORY_BIND=127.0.0.1

# Local client
export ALFRED_MEMORY_BASE_URL=http://127.0.0.1:3000
export ALFRED_MEMORY_API_KEY=alk_...

Validate the config

validate
node scripts/validate-policies.mjs
node --test packages/core/test/kernel.test.mjs
Next step: Agents & subagents to meet the panel — or Evals & baselines to wire your first regression suite.