Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
25 changes: 25 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,31 @@ All notable changes to the ACE plugin will be documented in this file.
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
and the plugin follows [semantic versioning](https://semver.org/spec/v2.0.0.html).

## 0.13.329 — 2026-05-22

**Retire `idea.md` / `--idea` operator-seed pathway.**

The 2026-05-05 refactor reduced `idea.md` to an optional `--idea FILE|-` seed alongside the `inputs/` evidence pack. The dual-path persisted but was rarely used in practice and added cognitive load: the eval rubric carried a clean-source dual-branch keyed off "idea.md contains reviewer comments," the orchestrator had a special `--idea`-was-passed scripted-seed flow at run start, `idea-to-pdd` scanned the `idea.md` body for Drive URLs in its permission pre-flight, and the artifact manifest carried two `idea.md` entries (run-root + legacy `1-design/idea.md` back-compat) with their corresponding RUN_LEVEL_EXEMPT carve-outs.

Operators now put any free-text seed directly into `inputs/` as a regular source file alongside everything else. One canonical input pathway, one synthesis surface.

Removed:
- `--idea FILE|-` argument from `/ace:run`
- The scripted-seed branch in `agents/ace-orchestrator.md § Starting a New Opportunity`
- The "If `--idea FILE|-` was passed" sub-step at run-folder bootstrap
- The `idea.md=<present|absent>` field from the orchestrator's start-of-run log line
- The optional `idea.md` table row in `skills/idea-to-pdd/SKILL.md § Inputs`
- The `idea.md`-URL extraction in `idea-to-pdd`'s pre-flight permission scan
- The "or no idea.md" arm of the missing-source-material error
- Both `idea.md` and `1-design/idea.md` (legacy back-compat) entries from `lib/artifact-manifest.ts`
- The `runs/<run-id>/idea.md` row in `agents/orchestrator-reference.md § Per-run`
- The two legacy `1-design/idea.md` fixture files under `test/fixtures/CRISPR-Test-00{1,2}/`

Preserved:
- The `clean_source` detection mechanism in `idea-to-pdd-eval` (still useful — keys off reviewer-comment presence across the source pack, not specifically `idea.md`). Dual-branch dimension scoring unchanged; language updated.
- Historical changelog entries in `skills/idea-to-pdd/SKILL.md` and `skills/idea-to-pdd-eval/SKILL.md` (audit trail of evolution from single-`idea.md` → multi-doc evidence pack → no-`idea.md`).
- `scripts/migrate-drive-layout.ts` `idea.md → 1-design/idea.md` mapping (back-compat tool for migrating legacy pre-2026-05-05 runs).

## 0.13.299 — 2026-05-21

**`/ace:doctor` catches Nova MCP stuck-in-needs-auth-cache state.**
Expand Down
34 changes: 9 additions & 25 deletions agents/ace-orchestrator.md
Original file line number Diff line number Diff line change
Expand Up @@ -266,7 +266,6 @@ message.** Issue together:

- `drive_create_folder` for `<opp>/runs/<run-id>/`
- `drive_create_file` for `runs/<run-id>/run_state.yaml` (initial — phases all pending)
- `drive_create_file` for `runs/<run-id>/idea.md` (only if `--idea FILE|-` was passed)
- `drive_create_file` for `runs/<run-id>/inputs-manifest.yaml` (frozen file_id list from Step 3)

**Step 6 — Dispatch Phase 1.** Single `Agent(idea-to-design)` call with
Expand Down Expand Up @@ -544,7 +543,6 @@ ACE/ (= ACE_DRIVE_ROOT_FOLDER_ID)
│ │ └── <run-id>/ (e.g. "20260502-1830")
│ │ ├── run_state.yaml
│ │ ├── inputs-manifest.yaml (frozen file_id list captured at run start)
│ │ ├── idea.md (optional — only present when --idea FILE|- was passed)
│ │ └── 1-design/
│ │ ├── idea-to-pdd.md (the formal PDD — Phase 1 output)
│ │ └── ... (other Phase 1 outputs)
Expand Down Expand Up @@ -594,14 +592,7 @@ in `inputs/` (the manifest), not to pick one canonical PDD file.
(next to `opp.yaml`) without knowing about the `inputs/` requirement.
See jjackson/ace#299.

**(b) `--idea FILE|-` was passed**: scripted-seed flow. If `<opp>`
was also provided, use it; otherwise auto-generate a fresh slug
`smoke-<YYYYMMDD-HHMM>` (today's behavior). Write the idea body
directly into `runs/<run-id>/idea.md` at step 5 — this path
bypasses `inputs/` entirely (scripted runs are non-interactive by
design). No `inputs/pdd.md` write.

**(c) Zero-arg discovery** (default when neither (a) nor (b)):
**(b) Zero-arg discovery** (default when (a) does not apply):

1. Read `ACE_DRIVE_ROOT_FOLDER_ID`. If unset/empty, error:
`ACE_DRIVE_ROOT_FOLDER_ID is not set in your .env (expected at
Expand Down Expand Up @@ -652,7 +643,7 @@ in `inputs/` (the manifest), not to pick one canonical PDD file.
folder ID; this is the **run folder ID** that gets passed to every
downstream skill in place of the previous "opp folder ID".

5. **Capture the inputs manifest and (optionally) seed `idea.md`.**
5. **Capture the inputs manifest.**

The PDD is the formal output of Phase 1, not an input. The
orchestrator's job here is to record what was in `inputs/` at
Expand Down Expand Up @@ -707,21 +698,18 @@ in `inputs/` (the manifest), not to pick one canonical PDD file.
they run (see § Per-Phase Folder Lifecycle). The orchestrator does
NOT pre-create `1-design/` here.

**If `--idea FILE|-` was passed**, the command has loaded the body.
Write it verbatim to `runs/<runId>/idea.md` via `drive_create_file`
— this is the operator's free-text seed and stands alongside the
manifest as supplementary intent. `idea-to-pdd` reads both.

**Otherwise**, do NOT seed an `idea.md`. The manifest alone is
sufficient — `idea-to-pdd` reads each file in the manifest as the
evidence pack and synthesizes the PDD from there.
The manifest is the sole seed for Phase 1 — `idea-to-pdd` reads
each file in the manifest as the evidence pack and synthesizes
the PDD from there.

The previous single-file `pdd.md` discovery (`pdd.md` exact,
`*pdd*` glob, lone-doc fallback, multi-doc error) is removed
entirely. There is no longer a copy of any input file into the run
folder — `inputs/` is the canonical read-only seed pack and
`idea-to-pdd` reads its files directly via the manifest's
`file_id`s.
`file_id`s. (The pre-2026-05-22 `--idea FILE|-` operator-seed
flag was also retired — operators put any free-text seed directly
into `inputs/` as a regular source file.)

6. **Initialize `run_state.yaml`** at `<opp>/runs/<runId>/run_state.yaml` with:
- `mode`, `created` (ISO timestamp), all steps as `pending`
Expand Down Expand Up @@ -781,7 +769,6 @@ in `inputs/` (the manifest), not to pick one canonical PDD file.
inputs_folder=<opp>/inputs (read-only, <N> files in manifest)
run_folder=<opp>/runs/<runId>
manifest=<opp>/runs/<runId>/inputs-manifest.yaml
idea.md=<present|absent> # present only when --idea FILE|- was passed
```

9. **Begin Phase 1.**
Expand Down Expand Up @@ -809,9 +796,6 @@ picker.
> already exists), and re-run `/ace:run <opp>`. Top-level drops
> directly under `ACE/<opp>/` are also fine — the orchestrator
> auto-migrates them into `inputs/` on next run.
>
> Or pass `--idea FILE|-` to seed a free-text idea directly without
> using `inputs/`.

The legacy `PDD/` flat folder is kept readable by ace-web for back-compat
viewing of legacy opps, but is no longer consulted for new runs.
Expand All @@ -824,7 +808,7 @@ When invoked with an opportunity, execute these phases in order:

**Dispatch:** `Agent(idea-to-design)`.

**Inputs (inline at handoff):** the inputs manifest, any `idea.md`, `run_state.yaml`. See § Pre-flight & per-phase conventions → "Pass artifacts inline at phase handoff" for the prompt template.
**Inputs (inline at handoff):** the inputs manifest, `run_state.yaml`. See § Pre-flight & per-phase conventions → "Pass artifacts inline at phase handoff" for the prompt template.

**Atoms / skills used (orchestrator-visible only):** `Agent(idea-to-design)`.

Expand Down
13 changes: 5 additions & 8 deletions agents/idea-to-design.md
Original file line number Diff line number Diff line change
Expand Up @@ -37,9 +37,9 @@ this subagent's steps have these read-redundancy rules:
the PDD MAY be rewritten by Step 1.4's QA retry loop — if QA
dispatched the producer with an `auto_fix_hint`, re-read the PDD
after that loop terminates.
- **Batch the Step 1 input reads.** `inputs-manifest.yaml`, each
manifest entry, and optional `idea.md` are independent — issue them
as ONE parallel `drive_read_file` block, not sequentially.
- **Batch the Step 1 input reads.** `inputs-manifest.yaml` and each
manifest entry are independent — issue them as ONE parallel
`drive_read_file` block, not sequentially.
- **Skill-level reads are governed by each `SKILL.md`.** This subagent
controls only the reads it issues directly between steps; reads
inside the producer/QA/eval skills are out of scope here.
Expand All @@ -52,8 +52,6 @@ Invoke the `idea-to-pdd` skill.
- `ACE/<opp-name>/runs/<run-id>/inputs-manifest.yaml`
(frozen pointer-set captured by the orchestrator from `<opp>/inputs/`)
- Each file referenced in the manifest (read inline)
- Optional: `ACE/<opp-name>/runs/<run-id>/idea.md` if `--idea FILE|-`
was passed (operator free-text seed; stands alongside the manifest)
- Output: `ACE/<opp-name>/runs/<run-id>/1-design/idea-to-pdd.md`
(the formal PDD — Phase 1's primary artifact)
- **Gate (review mode):** Present the PDD for approval before continuing
Expand All @@ -72,9 +70,8 @@ Invoke the `idea-to-pdd-qa` skill — runs 6 static structural checks against th
### Step 1.5: Idea-to-PDD eval (independent quality re-grade)
Unless `--no-evals` was passed AND QA verdict is `pass`, invoke the `idea-to-pdd-eval` skill.
- Inputs: the same source material `idea-to-pdd` consumed
(`inputs-manifest.yaml` + each manifest entry, plus run-root
`idea.md` if present) + the produced PDD at
`ACE/<opp-name>/runs/<run-id>/1-design/idea-to-pdd.md`
(`inputs-manifest.yaml` + each manifest entry) + the produced PDD
at `ACE/<opp-name>/runs/<run-id>/1-design/idea-to-pdd.md`
**(all in subagent context from Step 1 / Step 1.4 — do NOT re-read)**
- Output: `ACE/<opp-name>/runs/<run-id>/1-design/idea-to-pdd-eval_verdict.yaml` (machine-readable
verdict in the shared shape — see `skills/README.md § QA vs Eval`)
Expand Down
1 change: 0 additions & 1 deletion agents/orchestrator-reference.md
Original file line number Diff line number Diff line change
Expand Up @@ -374,7 +374,6 @@ forking:**
| `runs/<run-id>/run_state.yaml` | Lifecycle state — phase/step pointer, mode, `last_actor`, timestamps. New file at each new run-id. |
| `runs/<run-id>/README.md` | Per-run index regenerated after each phase via `generateRunReadme(...)`. |
| `runs/<run-id>/inputs-manifest.yaml` | Frozen pointer-set captured at run start (`inputs/` file_ids). Snapshots that run's view of the source pack. |
| `runs/<run-id>/idea.md` | Optional `--idea` seed, only when `/ace:run --idea FILE\|-` was used. |
| `runs/<run-id>/<N>-<phase>/<producer>.md` | Producer artifacts (PDDs, app summaries, training docs, screenshots, etc.). |
| `runs/<run-id>/<N>-<phase>/<producer>_verdict[-<mode>].yaml` | Producer self-evaluation (when the producing skill self-evaluates). |
| `runs/<run-id>/<N>-<phase>/<producer>-eval_verdict[-<mode>].yaml` | Eval-side judgment from the matching `*-eval` skill. |
Expand Down
34 changes: 9 additions & 25 deletions commands/run.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
---
description: Run the full CRISPR-Connect lifecycle for an opportunity
argument-hint: [<opp>[/<run-id>]] [--mode default|review|auto] [--idea FILE|-] [--ace-web-url URL] [--dry-run] [--sandbox] [--no-evals]
argument-hint: [<opp>[/<run-id>]] [--mode default|review|auto] [--ace-web-url URL] [--dry-run] [--sandbox] [--no-evals]
allowed-tools: [Read, Write, Edit, Bash, Glob, Grep, Agent, AskUserQuestion]
---

Expand Down Expand Up @@ -34,12 +34,6 @@ Run the full CRISPR-Connect lifecycle for a Connect opportunity.
approval. Use for high-touch operations or training.
- `auto` — never pause for any gate. For unattended batch runs
(e.g. eval calibration). `[BLOCKER]` concerns still escalate.
- `--idea FILE|-` — pre-seed a free-text `idea.md` from a file path, or `-`
for stdin. Operator-supplied seed; stands alongside the inputs/
evidence-pack manifest as supplementary intent. Content is uploaded
verbatim to `ACE/<opp>/runs/<run-id>/idea.md` via `drive_create_file`.
Most runs do not need this flag — the inputs/ evidence pack alone is
sufficient seed material for `idea-to-pdd`.
- `--ace-web-url URL` — after the orchestrator completes, invoke the
`upload-transcript` skill to POST the run's stream-json transcript to
`<URL>/api/ingest/upload`. **Smart default:** if this flag is omitted
Expand Down Expand Up @@ -89,21 +83,18 @@ seed material for the PDD; there is no required filename.

Resolution:

1. If `--idea FILE|-` was passed, scripted-seed flow: write the idea
body to `runs/<run-id>/idea.md` directly (operator free-text seed).
Manifest capture still runs from `inputs/` if it exists.
2. Else read `ACE_DRIVE_ROOT_FOLDER_ID`. Stop with an actionable error
1. Read `ACE_DRIVE_ROOT_FOLDER_ID`. Stop with an actionable error
if unset.
3. List `ACE/`. Find subfolders containing an `inputs/` subfolder.
4. Pick the candidate with the newest `inputs/` mtime; folder name = `<opp>`.
5. If no candidate exists, stop with the new-layout setup message.
6. Generate `runId` = `YYYYMMDD-HHMM` (collision-suffixed).
7. `mkdir <opp>/runs/<runId>/`; capture
2. List `ACE/`. Find subfolders containing an `inputs/` subfolder.
3. Pick the candidate with the newest `inputs/` mtime; folder name = `<opp>`.
4. If no candidate exists, stop with the new-layout setup message.
5. Generate `runId` = `YYYYMMDD-HHMM` (collision-suffixed).
6. `mkdir <opp>/runs/<runId>/`; capture
`runs/<runId>/inputs-manifest.yaml` (frozen pointer-set of every
direct child file under `inputs/`). No input file is copied — the
PDD is synthesized at Phase 1 from the manifest.
8. Init `run_state.yaml`; update `opp.yaml.last_run_id`.
9. Begin Phase 1.
7. Init `run_state.yaml`; update `opp.yaml.last_run_id`.
8. Begin Phase 1.

See `agents/ace-orchestrator.md` for full detail.

Expand All @@ -124,12 +115,6 @@ See `agents/ace-orchestrator.md` for full detail.
tell the operator "defaulting --ace-web-url to labs".
- Otherwise, leave unset (skip the post-run upload hook).

1b. If `--idea` was provided, read its body:
- If the value is `-`, read stdin until EOF.
- Otherwise treat the value as a file path; read its bytes as UTF-8.
Pass the body through to the orchestrator alongside the slug so the
"Starting a New Opportunity" flow can skip its PDD-picker.

2. **Execute the orchestration procedure inline at top-level.** Read
`agents/ace-orchestrator.md` and follow it as a procedure document
from this (top-level) Claude Code session. Do **not** dispatch
Expand All @@ -143,7 +128,6 @@ See `agents/ace-orchestrator.md` for full detail.
Inputs to thread through:
- Slug
- Execution mode
- Idea body (if `--idea` was provided)
- Dry-run flag (if set)
- Sandbox flag (if set)
- Any existing state from GDrive (if resuming)
Expand Down
8 changes: 4 additions & 4 deletions commands/step.md
Original file line number Diff line number Diff line change
Expand Up @@ -92,8 +92,8 @@ Implementation steps the agent (or a thin Bash wrapper) must perform:
`inputs/`, `eval-calibration/known-issues.md`) resolve to
`ACE/<opp>/<path>`. Run-scoped entries (anything under
`1-design/`, `2-scenarios/`, … `8-execution/`, plus
`run_state.yaml`, `inputs-manifest.yaml`, `idea.md`,
`decisions.yaml`) resolve to `ACE/<opp>/runs/<runId>/<path>`.
`run_state.yaml`, `inputs-manifest.yaml`, `decisions.yaml`)
resolve to `ACE/<opp>/runs/<runId>/<path>`.
- Use `drive_list_folder` (or the live Drive listing) to check that
the resolved path exists.
3. If any required artifact is missing, print an error of the form:
Expand Down Expand Up @@ -137,8 +137,8 @@ skills in dependency order) still enforces the contract.
```text
/ace:step idea-to-pdd my-opp
→ Bare opp. Resolves runId from opp.yaml.last_run_id.
Reads ACE/my-opp/runs/<last_run_id>/inputs/idea.md (required,
producedBy: external). OK → invoke skill.
Required: inputs-manifest.yaml at the run root (produced by
ace-orchestrator at run start). OK → invoke skill.

/ace:step app-screenshot-capture malaria-itn-app/20260517-1829
→ Pinned run-id. Targets ACE/malaria-itn-app/runs/20260517-1829/
Expand Down
16 changes: 0 additions & 16 deletions lib/artifact-manifest.ts
Original file line number Diff line number Diff line change
Expand Up @@ -144,22 +144,6 @@ export const ARTIFACT_MANIFEST: readonly ArtifactEntry[] = [
required: false,
description: 'Frozen pointer-set captured at run start: every direct child file under inputs/ as {file_id, name, mime_type}. idea-to-pdd reads each entry to synthesize the PDD. Lives at the run-folder root alongside run_state.yaml — both are run-level metadata, scoped beyond any single phase. Pointing at file_ids (not paths) means a human re-arranging inputs/ mid-run does not shift the source pack out from under Phase 1. NOT YET required: existing fixtures predate the 2026-05-05 evidence-pack refactor; flip to required=true once the next round of fixture updates lands.',
},
{
path: 'idea.md',
producedBy: 'external',
consumedBy: ['idea-to-pdd'],
phase: 'design',
required: false,
description: 'Optional operator-supplied free-text seed at the run-folder root. Only present when /ace:run was invoked with --idea FILE|-. Read by idea-to-pdd alongside the inputs-manifest. Most runs do not have this file — the inputs/ evidence pack is sufficient.',
},
{
path: '1-design/idea.md',
producedBy: 'external',
consumedBy: ['idea-to-pdd'],
phase: 'design',
required: false,
description: 'Legacy path — pre-2026-05-05 the orchestrator copied inputs/pdd.md into 1-design/idea.md as the seed for idea-to-pdd. New runs do not write this file (the manifest at 1-design/inputs-manifest.yaml replaces it; --idea seeds the run-root idea.md). Kept in the manifest so older fixtures and resumed legacy runs validate cleanly.',
},
{
path: '1-design/idea-to-pdd.md',
producedBy: 'idea-to-pdd',
Expand Down
4 changes: 2 additions & 2 deletions mcp/google-drive-server.ts
Original file line number Diff line number Diff line change
Expand Up @@ -143,8 +143,8 @@ function error(msg: string) {
*
* Inflight-dedupe + 30s TTL cache (added 2026-05-10, perf lens). When N
* parallel writes target the same parent — common for run-folder bootstrap
* (run_state.yaml + idea.md + inputs-manifest.yaml + gate-brief.md often go
* into the same `runs/<run-id>/` parent in one batched message) — the first
* (run_state.yaml + inputs-manifest.yaml often go into the same
* `runs/<run-id>/` parent in one batched message) — the first
* caller's probe populates the inflight slot; concurrent callers await the
* same promise instead of firing N redundant `files.get` round-trips. After
* the probe resolves, an `ok: true` result is cached for 30s so a follow-up
Expand Down
4 changes: 2 additions & 2 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Loading
Loading