Files
nisse/pyproject.toml
T
dongarandClaude Opus 5.5 ab469b60bb
CI / checks (push) Skipped
CI / checks (pull_request) Successful in 2m29s
CI / e2e (pull_request) Successful in 11m23s
M3.3: the trust dial (the agent merges approved PRs)
A project's trust.merge is operator (the default) or approved (L3, D5,
#65). Set to approved, the harness, never the model, merges a PR in the
PR watch once an approving review from a gitea.operators account is on
its current commit, its checks pass (none at all counts; pending
waits) and it's mergeable; the item then goes on as after any merge.
Each reason to hold off (failed checks, conflicts, a refused merge) is
said once per commit.

Gitea enforces it: protection requires approvals from an operators-only
whitelist and dismisses stale ones. At start, for each approved
project, the agent checks by behaviour that its own unapproved merge is
refused, with a throwaway branch and PR made through the API (never the
workspace); if it isn't refused, the operator merges until a restart.

- gitea: approvals, combined check status, a PR's head commit and
  mergeability, API-made branches and their deletion.
- Test and bring-up repositories get the protection.
- Tests: the decision (unit), the hard wall on a real Gitea
  (test_trust_live), an e2e test where the operator only approves, and
  a walk property, merges_only_approved, checked against a mutant that
  ignores which commit was approved.

Closes #65

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01PPQ14L3LikyefCMFBqEbKE
2026-10-08 13:48:16 +00:00

36 lines
1.0 KiB
TOML

[tool.uv.workspace]
members = ["nisse-core", "nisse-dev", "nisse-ops"]
[dependency-groups]
dev = [
"pytest>=8",
"pytest-xdist>=3",
"ruff>=0.6",
]
[tool.pytest.ini_options]
testpaths = [
"nisse-core/tests",
"nisse-dev/tests",
"nisse-ops/tests",
"tests",
]
# The seed is a test project's own code, pushed to each run's repository.
addopts = "--strict-markers --ignore=tests/integration/seed"
markers = [
"integration: end-to-end tests that exercise installed entry points or external services",
"e2e: the whole agent against real services, run after each milestone (scripts/e2e.sh)",
"smoke: the end-to-end tests every PR runs; the rest on e2e:full and before a release",
"merge(mode): the end-to-end project's trust dial, trust.merge (default operator)",
]
[tool.ruff]
target-version = "py312"
extend-exclude = ["tests/integration/seed"] # a test project's own code
[tool.ruff.lint]
extend-select = ["I"]
[tool.ruff.lint.isort]
known-first-party = ["nisse_core", "nisse_dev", "nisse_ops"]