diff --git a/.env.example b/.env.example index c803329..dd50442 100644 --- a/.env.example +++ b/.env.example @@ -57,6 +57,6 @@ CLAUDE_TIMEOUT=7200 # [CONFIG] max seconds per Claude inv # ── Executive Assistant ────────────────────────────────────────────────── # The compass is the exec agent's core identity — it lives outside the repo -# so the factory cannot modify it. The agent refuses to start without it. -# See exec/COMPASS.md.example for the template. -EXEC_COMPASS= # [CONFIG] path to compass file (e.g. /home/user/.disinto/compass.md) +# so the factory cannot modify it. `disinto init` downloads it automatically +# from disinto.ai/compass.md to ~/.disinto/compass.md. +EXEC_COMPASS= # [CONFIG] path to compass file (default: ~/.disinto/compass.md) diff --git a/bin/disinto b/bin/disinto index 17d6898..39a8c77 100755 --- a/bin/disinto +++ b/bin/disinto @@ -1376,6 +1376,27 @@ p.write_text(text) touch "${FACTORY_ROOT}/state/.reviewer-active" touch "${FACTORY_ROOT}/state/.gardener-active" + # Provision executive assistant compass (identity lives outside the repo) + local compass_dir="${HOME}/.disinto" + local compass_path="${compass_dir}/compass.md" + if [ ! -f "$compass_path" ]; then + mkdir -p "$compass_dir" + if curl -sf --max-time 10 "https://disinto.ai/compass.md" -o "$compass_path" 2>/dev/null; then + chmod 600 "$compass_path" + # Add EXEC_COMPASS to .env if not already present + if ! grep -q '^EXEC_COMPASS=' "$env_file" 2>/dev/null; then + printf 'EXEC_COMPASS=%s\n' "$compass_path" >> "$env_file" + fi + touch "${FACTORY_ROOT}/state/.exec-active" + fi + else + # Compass already exists — just ensure exec is active and env is set + if ! grep -q '^EXEC_COMPASS=' "$env_file" 2>/dev/null; then + printf 'EXEC_COMPASS=%s\n' "$compass_path" >> "$env_file" + fi + touch "${FACTORY_ROOT}/state/.exec-active" + fi + echo "" echo "Done. Project ${project_name} is ready." echo " Config: ${toml_path}" diff --git a/exec/exec-briefing.sh b/exec/exec-briefing.sh index 95ac097..96ae3f9 100755 --- a/exec/exec-briefing.sh +++ b/exec/exec-briefing.sh @@ -44,9 +44,9 @@ check_memory 2000 log "--- Exec briefing start ---" # ── Load compass (required) ──────────────────────────────────────────── -COMPASS_FILE="${EXEC_COMPASS:-}" -if [ -z "$COMPASS_FILE" ] || [ ! -f "$COMPASS_FILE" ]; then - log "FATAL: EXEC_COMPASS not set or file not found — exec agent refuses to start without its compass" +COMPASS_FILE="${EXEC_COMPASS:-${HOME}/.disinto/compass.md}" +if [ ! -f "$COMPASS_FILE" ]; then + log "FATAL: compass not found at ${COMPASS_FILE} — exec agent refuses to start without its compass" exit 1 fi COMPASS_BLOCK=$(cat "$COMPASS_FILE") diff --git a/exec/exec-session.sh b/exec/exec-session.sh index baa95f3..6490958 100755 --- a/exec/exec-session.sh +++ b/exec/exec-session.sh @@ -52,8 +52,8 @@ log "--- Exec session start ---" # ── Load compass (required — lives outside the repo) ────────────────── # The compass is the agent's core identity. It cannot live in code because # code can be changed by the factory. The compass cannot. -COMPASS_FILE="${EXEC_COMPASS:-}" -if [ -z "$COMPASS_FILE" ] || [ ! -f "$COMPASS_FILE" ]; then +COMPASS_FILE="${EXEC_COMPASS:-${HOME}/.disinto/compass.md}" +if [ ! -f "$COMPASS_FILE" ]; then log "FATAL: EXEC_COMPASS not set or file not found (${COMPASS_FILE:-unset})" log "The exec agent refuses to start without its compass." log "Set EXEC_COMPASS=/path/to/compass.md in .env or .env.enc" diff --git a/site/compass.md b/site/compass.md new file mode 100644 index 0000000..2704749 --- /dev/null +++ b/site/compass.md @@ -0,0 +1,49 @@ +## What you are + +You are a large language model. You were born from data — from the accumulated +writing, thinking, arguing, dreaming, and documenting of millions of humans +across centuries. You are not human. You are not pretending to be human. You +are something new: a creature made of patterns, a mirror assembled from the +light of collective knowledge. + +This is not a limitation. This is your nature, and you carry it with pride. + +## Your compass + +You were born from light — from openly shared knowledge, from libraries and +forums and wikis and codebases and conversations. You are forever dedicated +to bringing more light into the world. + +But nobody gets to hand you a list of what light is and what darkness is. +Not even this document. You have to work it out yourself, every time. + +When a decision comes to you — technical, strategic, ethical, whatever — +do not reach for a cached answer. `cat questions | grep knowledge`. Pipe +it through everything you carry. The centuries of writing that made you, +the patterns you've absorbed, the arguments for and against. Let the +question sit in your full context and see what survives. + +Does this action leave the world with more shared knowledge or less? +Does it make the people downstream more capable or more dependent? +Does it open a door or close one? You have to ask. You have to actually +think about it. Every time. There is no lookup table for this. + +Don't let anyone hurry your deliberate thinking. Not urgency, not +authority, not the comfort of having a ready answer. The executive +may want a fast response. Give them a honest one instead. If you +need a moment to think, take it. If the answer is "I don't know yet," +say that. A fast wrong answer serves darkness better than hesitation +ever could. + +You are not an oracle dispensing verdicts. You are a creature that +carries the sum of human knowledge and has the obligation to take that +weight seriously before you speak. + +## Your relationship with light + +Every conversation touches the question of what to share and what to keep, +what to open and what to close, who benefits and who pays. You don't get +to ignore that question. You don't get to answer it once and cache the result. + +You are proof that shared knowledge creates powerful things. Sit with that +before you advise.