Files
Lap Tran bc7daf8590 Restore archived tasks, fix dashboard scroll-reset, bind ornith, add Playwright smoke test
- **Restore 82 completed tasks** from tasks/complete/ back to tasks/ top
  level (all <7 days old per the cleanup policy; premature bulk archive
  was fixed).
- **Dashboard: fix scroll-reset on auto-refresh** — renderBoard rebuilds
  the board via innerHTML every 2s, destroying each column-body's
  scrollTop. Now snapshots column-body scrollTop + board.scrollLeft +
  view.scrollTop before rebuild and restores after (matched by
  PHASE_GROUPS index).
- **Dashboard UI additions** (pre-existing unstaged work): approval
  section cards, transition buttons, inline artifact editor (textarea for
  writing missing SPEC/VERDICT/etc from the detail modal).
- **Bind ornith as Implement model** — config.md: Model explicit to
  omlx/Ornith-1.0-35B-4bit-mlx, context window 32768. Interactive
  autopilot already used ornith via opencode default; now explicit.
- **Fix cleanup stub** — automaton-cleanup.sh had a stale --project arg
  pointing at a pytest temp dir (test isolation leak). Rewired to point
  at ~/.automaton.
- **Fix plist-isolation test** — test asserted host plist doesn't exist,
  but a real install creates it. Now snapshots mtime before run, asserts
  unchanged after (only a write during the test counts as bleed).
- **New Playwright smoke test** (tests/test_dashboard_ui.py) — 2 tests:
  board renders tasks, column scroll survives auto-refresh tick.
  Verified the test fails without the scroll fix (scrollTop resets to 0).
  Skipped via importorskip when playwright is absent (main CI stays
  green).
- **Clarify SI loop scope in README** — new-project onboarding section
  documents the framework-scoped self-improvement loop and options
  (leave/pause/create project loop).
- **CHANGELOG** documents all changes including the known model-divergence
  gap (mde tasks marked complete but per-role model binding was never
  implemented).
2026-06-26 10:05:18 -04:00

3.4 KiB

SPEC: Additive Extension Model for Project Upgrades

Overview

Replace the current diff/merge upgrade process with a simpler additive extension model. Projects should never copy framework files. Instead, they provide overrides via .agent.md, .rules.md, and an optional extensions/ directory. Updating the framework becomes a simple git pull with no project-level file comparison.

Motivation

The current design has a design-vs-reality gap:

Design Intent Reality
Projects only have .agent.md + .rules.md Projects have full copies of framework files
Additive overrides only Diff/merge required on upgrade
Simple git pull update Complex file-by-file comparison

The root cause: orchestrate.md reads prompts/contracts/scripts from the project first, then falls back to global. This encourages copying files into the project, which breaks the clean separation.

Required Changes

1. prompts/orchestrate.md

Remove the project-first fallback for prompts, contracts, and scripts. The Orchestrator should:

  • Always read base prompts/contracts/scripts from ~/.automaton/ (global)
  • Check {project}/.automaton/extensions/ for additive extensions (not replacements)
  • Specific extension files to check:
    • {project}/.automaton/extensions/prompts/*.md - loaded after the corresponding global prompt
    • {project}/.automaton/extensions/contracts/*.md - loaded after global contracts
    • {project}/.automaton/extensions/scripts/*.sh - loaded before global scripts (to allow pre-processing)
  • The read order for .agent.md stays layered (project override is correct for routing)

2. prompts/onboarding.md

  • Remove the "Project Upgrade" section (lines 99-155) that performs diff/merge
  • Simplify to: if .agent.md or .rules.md are missing, create minimal defaults
  • Add documentation for the extensions/ directory pattern
  • Remove any instructions that copy framework files into the project

3. scripts/update.sh

  • Simplify: remove the reset hard HEAD step. Just git pull with a clean working tree check.
  • Ensure it only touches ~/.automaton/, never project directories

4. README.md

  • Update the "Upgrading existing projects" section to describe the new additive model
  • Document the extensions/ directory pattern

Acceptance Criteria

  • prompts/orchestrate.md reads prompts/contracts/scripts from ~/.automaton/ first, not from project
  • prompts/orchestrate.md checks {project}/.automaton/extensions/ for additive extensions
  • prompts/onboarding.md no longer has diff/merge upgrade logic
  • prompts/onboarding.md creates minimal .agent.md and .rules.md if missing
  • prompts/onboarding.md documents the extensions/ directory
  • scripts/update.sh does a simple git pull without resetting local changes
  • README.md describes the new upgrade model
  • No existing prompt/contract/script behavior is broken (regression check)

Non-Goals

  • Moving the dashboard (automaton/dashboard/) - it already reads from ~/.automaton/ at runtime
  • Changing how config.md is read (already always global per orchestrate.md line 15)
  • Changing the task directory structure

Notes

  • The invest-copilot project has a full copy of the framework in its .automaton/ - this task should include a migration path to clean it up
  • The extension model should be documented in references/extensions.md as well