Found live on 2026-10-07 (bring-up on nisse-testing-operator/nisse-bringup,
Opus as driver):
- The driver's prose nudge went into the system prompt, so the retry ended
on the model's own reply. Opus 5.5 refuses that ("does not support
assistant message prefill. The conversation must end with a user
message"). The nudge is now a harness fact in the conversation. The
delegation harness's prose path did the same and is fixed likewise.
- A helper's first request ended with its own delegation_started event,
rendered as an assistant message: every delegation would have failed on
Opus. The helper now sees it as the harness handing over its task.
- model_contract checks that every request ends on the user's side, so
scripted tests catch this from now on (each fix is mutation-checked).
- `status` (and `details`) in an item's thread were taken as replies: they
woke the driver and cancelled a bug's countdown. They now answer at once
and change nothing.
- The driver had no way to answer a remark without changing the item, so it
answered in prose. Every run woken by a message (or a review comment) now
offers `reply`, which answers where asked and returns to the very wait
that was interrupted.
Also: scripts/bringup-repo.sh makes the bring-up's test repository
(make_repo/delete_repo, split out of fresh_repo), and made repositories get
the agent's labels (bug, discuss, design).
Tests: test_loop_live_fixes.py (one per finding); the walk sends `status`
into threads (status_changes_nothing) and its scripted driver sometimes
answers remarks with reply.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01PPQ14L3LikyefCMFBqEbKE
43 lines
1.8 KiB
Bash
Executable File
43 lines
1.8 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
# The bring-up's test repository (Development Plan, live runs):
|
|
# nisse-testing-operator/nisse-bringup, made as the end-to-end tests make
|
|
# theirs (tests/integration/e2e_support.py, make_repo), but kept between runs.
|
|
# Seeded with the test package, the bring-up agent's account a collaborator,
|
|
# main protected, and a deploy key of its own at $E2E/ssh/nisse-bringup.key.
|
|
#
|
|
# scripts/bringup-repo.sh create make it
|
|
# scripts/bringup-repo.sh reset delete it and make it again
|
|
# scripts/bringup-repo.sh delete delete it
|
|
#
|
|
# Needs NISSE_OPERATOR_TOKEN (.env here) and the bring-up agent's token
|
|
# (NISSE_GITEA_TOKEN in $E2E/.env), which names the agent's account.
|
|
set -euo pipefail
|
|
cd "$(dirname "$0")/.."
|
|
E2E=${NISSE_E2E:-/root/nisse-e2e}
|
|
case "${1:-}" in create|reset|delete) ;; *) sed -n '2,15p' "$0" | sed 's/^# \{0,1\}//'; exit 2 ;; esac
|
|
set -a; [ -f .env ] && . ./.env; set +a
|
|
exec uv run python - "$1" "$E2E" <<'PY'
|
|
import sys
|
|
from pathlib import Path
|
|
|
|
sys.path.insert(0, "tests/integration")
|
|
from e2e_support import OWNER, delete_repo, make_repo, operator_gitea # noqa: E402
|
|
|
|
from nisse_dev.envfile import load_env_file # noqa: E402
|
|
from nisse_dev.gitea import GiteaClient # noqa: E402
|
|
|
|
action, e2e = sys.argv[1], Path(sys.argv[2])
|
|
url = "https://gitea.dongar.net"
|
|
operator = operator_gitea(url)
|
|
name = "nisse-bringup"
|
|
if action in ("reset", "delete"):
|
|
delete_repo(operator, f"{OWNER}/{name}")
|
|
print(f"deleted {OWNER}/{name}")
|
|
if action in ("create", "reset"):
|
|
agent_env: dict[str, str] = {}
|
|
load_env_file(e2e / ".env", agent_env)
|
|
agent = GiteaClient(url, agent_env["NISSE_GITEA_TOKEN"]).whoami()
|
|
repo = make_repo(operator, name, e2e / "ssh", agent=agent)
|
|
print(f"made {repo.name}: {agent} a collaborator; push key {repo.push_key}")
|
|
PY
|