8000 feat: v0.11.0 — rename to aloop, first end-to-end live run, gate hardening by adeelahmad · Pull Request #7 · adeelahmad/aloop · GitHub
[go: up one dir, main page]

Skip to content

feat: v0.11.0 — rename to aloop, first end-to-end live run, gate hardening - #7

Merged
adeelahmad merged 23 commits into
masterfrom
claude/project-thread-qerfr9
Oct 17, 2026
Merged

adeelahmad merged 23 commits into
masterfrom
claude/project-thread-qerfr9

Conversation

@adeelahmad
@adeelahmad adeelahmad commented Oct 17, 2026 •
Copy link
Copy Markdown
Owner

Requested by Adeel · project thread

Before: the plugin installs as agentic-agile@agentic-agile-marketplace. Nothing had ever run the whole loop live. On Claude Code plugin installs no role gate actually fired: Claude Code names the workers aloop:red-worker, and the hook matchers only listed red-worker. Workers could also pass or widen their own gate by editing task.env, and a gate that crashed let the action through.

After: it installs as aloop@aloop-marketplace (CLI aloop; the old names still work as aliases). make e2e-live YES=1 turns a one-line intent (a semver parser) into planned, tested code merged into main in a real Claude Code session. Latest run: 11/11 checks, 12 min, $0.79, with a sonnet supervisor and haiku workers. Every role gate fires on the host. The task contract is the supervisor's, and each hole has a test that failed before its fix.

Builds on #6's branch (CLAUDE.md, OVERVIEW, ROADMAP). Each change is its own commit.

Changes, in commit order.

  1. Rename to aloop, with aliases. rename-compat.test.py.
  2. Conformance fixtures (ROADMAP §6.2–6.9): the real gates run on a fixture crate in linked worktrees. Now 35 checks, in make ci and CI.
  3. Schema gates validated whole directories, so valid artifacts were blocked. They now validate per file.
  4. Supervisor could write source on Linux (stat -f crash, fail-open). Found by the live smoke test.
  5. task.env was sourced, so exit 0 passed a failing GREEN. It is now parsed instead.
  6. Gates fail closed (_failclosed.sh).
  7. Role bound to the host: a worker can't relabel itself planner to skip the isolation check.
  8. Task contract moved to the main tree (M0.7). It now lives in .agentic/state/tasks/<TASK_ID>.env, and the dispatch prompt's first line names the task. A live probe showed Claude Code creates the worktree at dispatch, so a contract pre-written into the worktree was impossible there. A worktree copy that disagrees with the contract blocks, and workers can't Write or Edit the contract. The time box no longer gives a worker another task's budget.
  9. Role gates fire for aloop:<role> (critical). Found by e2e run 1, where every verdict was a self-check. hook-matchers.test.py.
  10. Workers must commit; the supervisor merges branches. In run 1 the supervisor copied files out of worktrees into main. Also fixes a selfcheck crash on good work (AGENT_ROLE unbound).
  11. No block loops on the supervisor's own contract slips. Lists now accept commas, and the host's role wins over the contract's. Run 2 had 34 and 33 blocks from these.
  12. Contract copied into Claude Code worktrees, so a worker's selfcheck finds its task.
  13. RED and SCAFFOLD run the matrix's format check. In run 3, GREEN looped 19 times on RED's unformatted tests.

Evidence. make ci is green locally, including shellcheck. Conformance passes 35/35; the budget, supervisor-scope, hook-matcher and fail-closed suites all pass. Results of the live e2e runs:

10000
Run Checks Time Cost Gate blocks Found
1 9/11 19m $1.15 8 (all self-checks) gates never fired; copy-merging; selfcheck crash
2 11/11 13m $0.92 28 contract-slip loops; selfcheck can't find contract
3 11/11 12m $0.79 17 GREEN loops on RED formatting

🤖 Generated with Claude Code

https://claude.ai/code/session_015QxyVf3NgwsgRyYpBgDDTC

…package historical

Adds docs/OVERVIEW.md (what agentic-agile is, from the code as of v0.10.1),
a milestone table at the top of docs/ROADMAP.md, and the CONTRIBUTING.md the
README badge links to. Flags DESIGN/ARCHITECTURE/KICKSTART as historical and
fixes stale role counts and the README CI section.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01YCeq6p3KUdSsfTzQXkCr96
The current `claude plugin validate --strict` rejects unquoted placeholders
(a plugin path with a space would split). Quote every hook command path and
teach validate-suites.py to strip the quotes when matching gate names.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01YCeq6p3KUdSsfTzQXkCr96
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01YCeq6p3KUdSsfTzQXkCr96
…liases

Plugin, marketplace, skill, CLI, OpenCode plugin file and docs move to aloop.
agentic / agentic init / agentic-init / agentic bind keep working; host installs
remove pre-rename generated files. On-disk layout unchanged (planned for M1).

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_015QxyVf3NgwsgRyYpBgDDTC
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_015QxyVf3NgwsgRyYpBgDDTC
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_015QxyVf3NgwsgRyYpBgDDTC
@adeelahmad adeelahmad self-assigned this Oct 17, 2026
@adeelahmad
adeelahmad marked this pull request as ready for review October 17, 2026 02:19
make conformance runs the real RED/GREEN gates on a fixture crate in linked
worktrees: 16 checks over §6.3-6.9; uncovered items are printed with reasons.
Wired into make ci and CI's rust job.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_015QxyVf3NgwsgRyYpBgDDTC
@adeelahmad adeelahmad changed the title feat: v0.11.0 — rename to aloop (Aladdin's Loop), old names kept as aliases feat: v0.11.0 — rename to aloop + §6 conformance fixtures (M1 slice 1) Oct 17, 2026
Story dirs hold init.md/output.md comms the planning schema does not know, so
every valid tasks.md/validate.md/stories.md write was blocked once a story had
comms. Found by the new §6.2 conformance fixture (now 20 checks).

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_015QxyVf3NgwsgRyYpBgDDTC
@adeelahmad adeelahmad changed the title feat: v0.11.0 — rename to aloop + §6 conformance fixtures (M1 slice 1) feat: v0.11.0 — rename to aloop + §6 conformance fixtures + schema-gate fix Oct 17, 2026
CI has no RUSTUP_HOME, so rustup looked for its toolchain under the fake HOME and
every cargo call failed. Reproduced locally with RUSTUP_HOME unset.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_015QxyVf3NgwsgRyYpBgDDTC
…dd live smoke test

stat -f %m prints a filesystem report on Linux, so the lock-recency arm crashed
under set -u and the hook exited 1 (non-blocking): the supervisor's src/ write
went through. GNU stat first, numeric check. Found by the new live smoke test
(scripts/smoke/live-claude.sh, make smoke-live YES=1), which closes ROADMAP M0.
Adds M0.6 (gates fail closed) to the ROADMAP.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_015QxyVf3NgwsgRyYpBgDDTC
@adeelahmad adeelahmad changed the title feat: v0.11.0 — rename to aloop + §6 conformance fixtures + schema-gate fix feat: v0.11.0 — rename to aloop, §6 conformance fixtures, live smoke test, two gate fixes Oct 17, 2026
task.env sits in the worker's worktree; sourcing it let a worker append
'exit 0' (or GATE_RUN_MATRIX=0 / SKIP_HOOKS=1) and pass a failing GREEN.
Gates and selfcheck now read only the contract keys as data. Four conformance
cases (24 total) failed before the fix. ROADMAP M0.7 tracks moving the
contract out of the worktree.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_015QxyVf3NgwsgRyYpBgDDTC
…M0.6)

Any exit other than 0/2 is a non-blocking hook error on Claude Code, so a gate
bug let the action through. _failclosed.sh maps it to exit 2 with the reason;
loaded by every sub-agent gate and by supervisor-scope inside a sprint.
fail-closed.test.py (5 checks); live smoke 6/6 (/bin/bash.0034).

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_015QxyVf3NgwsgRyYpBgDDTC
@adeelahmad adeelahmad changed the title feat: v0.11.0 — rename to aloop, §6 conformance fixtures, live smoke test, two gate fixes feat: v0.11.0 — rename to aloop, conformance fixtures, live smoke test, gate hardening Oct 17, 2026
A RED worker could set AGENT_ROLE=planner in its task.env and skip the
worktree-isolation check. Gates now read agent_type from the hook payload and
block on a contradiction. 2 new conformance cases (26 total) failed before.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_015QxyVf3NgwsgRyYpBgDDTC
On Claude Code isolation: "worktree" creates the worktree at dispatch, so
the supervisor could never pre-write task.env there (live probe). The
contract now lives in .agentic/state/tasks/<TASK_ID>.env and the dispatch
prompt's first line names the task; gates and the time box find it from
the host transcript. A worktree copy that disagrees blocks, sub-agents may
not Write/Edit the contract, and the time box no longer hands a worker
another task's budget.

Tests first: 4 conformance cases (30 total), 2 budget and 2
supervisor-scope checks failed before the change.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_015QxyVf3NgwsgRyYpBgDDTC
Claude Code names a plugin's sub-agents <plugin>:<agent>, and a plain-name
hook matcher is an exact list, so no SubagentStop/SubagentStart role gate
ever matched a plugin install: only workers' voluntary self-checks ran.
Found by the first live end-to-end run and confirmed with a probe plugin.
Matchers now name both forms. Adds the e2e live run (make e2e-live).

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_015QxyVf3NgwsgRyYpBgDDTC
Both found by the first live e2e run: workers left work uncommitted, so
the supervisor copied files into main past the gate's diff; and
'selfcheck <role>' crashed with AGENT_ROLE unbound on good work. Gates
now block uncommitted work (an untracked Cargo.lock aside), workers are
told to commit, the playbook says to merge the branch, and selfcheck
exports the role. 2 conformance cases (32 total) failed before.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_015QxyVf3NgwsgRyYpBgDDTC
Live e2e run 2: a comma-separated SCOPE_GLOBS blocked GREEN 34 times and a
mistyped AGENT_ROLE in the main-tree contract looped the final gate; the
worker cannot edit the contract, so it retried until it gave up. Lists
accept commas, and the host's role wins over the contract's with a WARN
(a contradicting worktree copy still blocks). 1 conformance case (33
total) failed before.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_015QxyVf3NgwsgRyYpBgDDTC
e2e run 2: every worker's first selfcheck failed with STORY_DIR unset,
because the worktree Claude Code makes at dispatch has no task.env and
selfcheck has no host payload. The time box's tool-call hook now copies
the supervisor's contract (picked by the dispatch prompt's TASK_ID) into
the worktree, refreshing it when the contract is rewritten. 1 budget
check failed before.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_015QxyVf3NgwsgRyYpBgDDTC
e2e run 3: RED's test file failed cargo fmt --check, GREEN may not touch
tests, so GREEN's gate blocked 19 times until the supervisor stepped in.
The role that writes a file now has to leave it formatted. 1 conformance
case (35 total) failed before. ROADMAP records runs 2 and 3.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_015QxyVf3NgwsgRyYpBgDDTC
@adeelahmad adeelahmad changed the title feat: v0.11.0 — rename to aloop, conformance fixtures, live smoke test, gate hardening feat: v0.11.0 — rename to aloop, first end-to-end live run, gate hardening Oct 17, 2026
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_015QxyVf3NgwsgRyYpBgDDTC
gate-supervisor-scope now also runs on Bash: a dispatched agent's command
that names .agentic/state/ or .agentic/task.env together with a write
(redirect, tee, sed -i, cp, mv, rm, ...) is blocked; reads are allowed.
Closes the last open M0.7 item. 2 supervisor-scope checks failed before.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_015QxyVf3NgwsgRyYpBgDDTC
e2e run 5: workers cd'd to the main tree to read their story, the
SubagentStop hook ran there and 27 scaffolder stops were blocked as
'isolation dropped'. Gates now check .claude/worktrees/agent-<agent_id>
first. The Bash contract guard is per simple command (it had blocked a
read-only probe), and RED's out-of-scope message says how to undo.
1 conformance case (36 total) and 2 supervisor-scope checks failed before.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_015QxyVf3NgwsgRyYpBgDDTC
Every e2e run had 19-30 sub-agent commands reading the plugin's bin/,
schemas/ and pipeline/ (the planner alone 18 in run 5) to work out
formats that selfcheck already reports. Each agent prompt now says so,
and e2e-live prints the count so the effect is measured.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_015QxyVf3NgwsgRyYpBgDDTC
@adeelahmad
adeelahmad merged commit dea5ded into master Oct 17, 2026
4 checks passed
adeelahmad pushed a commit that referenced this pull request Oct 17, 2026
…map branch

Conflicts resolved by keeping both sides: aloop names and aloop:<role>
matchers from #7, with this branch's budget-stop matcher for every role,
no post-kill narration, the resume check and the boundary rule. The init
settings (TOKEN_METER, sprint envelope) move to aloop-init.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014j4wLin3oJTtnvjE9Lq2VV
adeelahmad pushed a commit that referenced this pull request Oct 17, 2026
adeelahmad pushed a commit that referenced this pull request Oct 17, 2026
… diff

Since #7, workers must commit before their gate runs. With no BASE_REF,
changed_paths only listed uncommitted changes, so a committed
out-of-scope file passed GREEN's (and RED's tests-only) scope check.
It now also takes the branch's commits since it left the main tree's
HEAD. targets-scope.test.py failed before.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014j4wLin3oJTtnvjE9Lq2VV
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

0