- propose_project(name, purpose, decisions) in a conversation goes up for a go-ahead (checked: a slug, not an existing project, no trailing question). - On go, the provisioning checklist (D1): a repository with a README, protection on its default branch, the agent as a collaborator, a build VM, a deploy key, and the project entry as YAML with <...> to fill in. - On "done", the agent reads its configuration again and adds the new project live (build_loop_agent(load=...); only additions), then checks what was provided (D4, verified, not assumed): permissions and protection as it sees them, then on a throwaway branch with an empty commit, a branch push must succeed and a push to the default branch and merging its own PR must be refused. The check's PR is closed and its branch deleted. Failures are said per item; nothing starts. - Checked: the tracking issue (the distilled decisions, carrying the new item's ID), and the project's item, agreed and labelled `design`, whose first milestone is ARCHITECTURE.md and the build plan. A conversation waiting on provisioning doesn't close as idle. - The walk replays exactly from its seed (item IDs too), and event IDs stay unique across simulated restarts, as a server's are. - The test config holds output to 8192 tokens, under the test key's per-request cost cap. Tests: new-project unit tests (checklist and its YAML parse as config, done before the entry, what isn't set up, a checked project's record and first PR, an existing name), protection enforced by a hook on the fake forge, the walk proposing projects and saying done, and an e2e new project in a repository the test operator provisions from the agent's checklist. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01PPQ14L3LikyefCMFBqEbKE
57 lines
2.2 KiB
YAML
57 lines
2.2 KiB
YAML
# Agent config for the live integration tests, aimed at test resources: the
|
|
# testing identities, the dedicated test room, and the sandbox repo. Never
|
|
# point it at production.
|
|
#
|
|
# Secrets are ${…} references. CI passes them as environment variables;
|
|
# locally they come from .env at the repository root. A missing one fails
|
|
# the live tests that need it, rather than skipping them, so a broken
|
|
# credential cannot hide as a skip.
|
|
|
|
# Unused by the live tests, which work in pytest's temporary directories;
|
|
# present because every agent config has it.
|
|
state_db: /tmp/nisse-test/state.db
|
|
|
|
projects:
|
|
nisse-dev-testing:
|
|
# Placeholders: every live test that touches a repository makes one of
|
|
# its own (tests/integration/e2e_support.py, fresh_repo), owned by the
|
|
# test operator and deleted afterwards, with its own deploy key; and runs
|
|
# on a throwaway local sshd (the `ssh_host` fixture) or the bring-up build
|
|
# VM, in temporary directories.
|
|
repo: nisse-testing-operator/made-per-run
|
|
workspace: /tmp/nisse-test/work
|
|
build_host:
|
|
address: 127.0.0.1
|
|
key: /tmp/nisse-test/unused-key
|
|
|
|
llm:
|
|
base_url: https://litellm.dongar.net
|
|
token: ${NISSE_LLM_TOKEN}
|
|
# The test key caps each request's worst-case cost ($0.10): input plus
|
|
# this much reserved output. The test agent's replies are short, so half
|
|
# the default leaves room for ~40k input tokens on Haiku.
|
|
max_output_tokens: 8192
|
|
|
|
# The live tests exercise the gated loop and the routes over a real proxy,
|
|
# not local-model competence (measured separately by test_model_capability),
|
|
# so every role uses a model that holds the tool-call contract.
|
|
roles:
|
|
executor: claude-haiku-4-5
|
|
planner: claude-haiku-4-5
|
|
helper: claude-haiku-4-5
|
|
expert: claude-haiku-4-5
|
|
|
|
matrix:
|
|
homeserver: https://matrix.dongar.net
|
|
user_id: "@nisse-dev-testing:dongar.net"
|
|
token: ${NISSE_MATRIX_TOKEN}
|
|
room_id: "!UxpXhTlQsFIeNZwkgv:dongar.net" # the test room, never production
|
|
operators: ["@dongar:dongar.net"]
|
|
|
|
gitea:
|
|
url: https://gitea.dongar.net
|
|
token: ${NISSE_GITEA_TOKEN}
|
|
# nisse-testing-operator plays the operator in the end-to-end tests
|
|
# (NISSE_OPERATOR_TOKEN); an operator here and nowhere else.
|
|
operators: [dongar, nisse-testing-operator]
|