Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
33 commits
Select commit Hold shift + click to select a range
c09fbcc
feat(hooks+seedgo): the clampdown's first train - test-write gate bui…
AIOSAI Sep 2, 2026
9ec22ff
feat(prompts+policy): the ruling now travels and the fleet is told - …
AIOSAI Sep 2, 2026
a8ed0f8
feat(hooks): the ruling reaches every future project and both refusal…
AIOSAI Sep 2, 2026
67caee2
feat(seedgo): v5 lands - pytest_quality_standards, eleven AST rules s…
AIOSAI Sep 2, 2026
a91d378
docs(changelog): v5 pack entry for the clampdown section - eleven AST…
AIOSAI Sep 2, 2026
451139d
feat(seedgo): phase 3 - templates that teach, not stamp (DPLAN-0323, …
AIOSAI Sep 2, 2026
d83aadc
feat(seedgo): phase 4 - the contract suite answers with a refusal (DP…
AIOSAI Sep 2, 2026
384358a
docs(changelog): clampdown section gains the teaching templates and t…
AIOSAI Sep 2, 2026
01a2a79
feat(hooks): THE WIRE - testwrite_gate goes live in .aipass/hooks.jso…
AIOSAI Sep 2, 2026
b22af96
fix(cc): CLAUDE_CODE_DISABLE_AGENT_VIEW=1 in provider_manifest env - …
AIOSAI Sep 2, 2026
0748d1b
fix(ai_mail): delivery learns the declared-roots external tier - the …
AIOSAI Sep 2, 2026
92d0e97
fix(ai_mail): dispatch wake verb runs the same 5-leg admin verificati…
AIOSAI Sep 2, 2026
4c424c4
fix(seedgo): twins container derived from the source tree, not the re…
AIOSAI Sep 2, 2026
13d86b2
ci(audit): pack-count tripwire - a standard can never leave the gate …
AIOSAI Sep 2, 2026
322b4ff
ci(codecov): no coverage percentage targets - project and patch statu…
AIOSAI Sep 2, 2026
5effd51
build(dev): mutmut>=3.7 declared in the dev extras and installed in t…
AIOSAI Sep 2, 2026
f090db7
ci(audit): tripwire counts consulted standards, not scored - its firs…
AIOSAI Sep 2, 2026
a3adde5
feat(seedgo): shadow-cycle - the weekly v5 cadence verb, the first v5…
AIOSAI Sep 2, 2026
4652784
fix(seedgo): the audit artifact and the incremental cache are scoped …
AIOSAI Sep 2, 2026
664e87b
chore(tests): DPLAN-0323 phase 7 deletion walk, slice 1 - 38 tests re…
AIOSAI Sep 2, 2026
d990d98
docs(aipass): test_suite_governance_research.md - round-2 paragraph c…
AIOSAI Sep 2, 2026
55cbff8
test(seedgo): DPLAN-0323 phase 7 slice 2 in phase 4's shape - one dur…
AIOSAI Sep 2, 2026
132b239
chore(tests): DPLAN-0323 phase 7 deletion walk, slice 2 - the 37 dura…
AIOSAI Sep 3, 2026
0c0cc51
test(seedgo): DPLAN-0323 phase 7 slice 3 - the public writer's durabi…
AIOSAI Sep 3, 2026
c138939
chore(tests): DPLAN-0323 phase 7 deletion walk, slice 3 - the last 24…
AIOSAI Sep 3, 2026
994465a
test(seedgo)+fix(ai_mail): DPLAN-0323 phase 7 slice 4 contract (FPLAN…
AIOSAI Sep 3, 2026
e95ec83
chore(tests): DPLAN-0323 phase 7 deletion walk, slice 4 - the json_ha…
AIOSAI Sep 3, 2026
fdab116
docs(changelog): DPLAN-0323 phase 7 slice 4 count corrected 184 -> 18…
AIOSAI Sep 3, 2026
434a8a8
feat(prax): DPLAN-0325 phase 0+1 - the fleet's one json handler servi…
AIOSAI Sep 3, 2026
447f897
fix(tests): the repo-root test guard leaves a one-source shim's log_o…
AIOSAI Sep 3, 2026
aa490ce
feat(spawn): DPLAN-0325 phase 3 - the citizen template mints the one …
AIOSAI Sep 3, 2026
306e737
feat(seedgo): DPLAN-0325 phase 2 part A - seedgo accepts the one shim…
AIOSAI Sep 3, 2026
94ab45e
fix(prax): footprint probe treats _distutils_hack as interpreter nois…
AIOSAI Sep 3, 2026
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
6 changes: 5 additions & 1 deletion .aipass/.gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -8,4 +8,8 @@
!project_CLAUDE.md
!project_AGENTS.md
!project_hooks.json
#Do not add other exceptions here without careful consideration. Developer permissions0ns needed.
!test_write_policy.json
#Do not add other exceptions here without careful consideration. Developer permissions0ns needed.
# test_write_policy.json exception: Patrick's ruling 2026-09-01 (DPLAN-0323) — the test-write
# gate's switch must ship with the repo so a fresh clone carries the ruling and its note,
# not an accident of absence. Flipping it stays a JSON edit; this line only makes it travel.
5 changes: 5 additions & 0 deletions .aipass/hooks.json
Original file line number Diff line number Diff line change
Expand Up @@ -105,6 +105,11 @@
"handler": "aipass.hooks.apps.handlers.security.rm_gate.handle",
"matcher": "Bash"
},
"testwrite_gate": {
"enabled": true,
"handler": "aipass.hooks.apps.handlers.security.testwrite_gate.handle",
"matcher": "Bash|Edit|MultiEdit|Write|NotebookEdit"
},
"registry_gate": {
"enabled": true,
"handler": "aipass.hooks.apps.handlers.security.registry_gate.handle",
Expand Down
7 changes: 6 additions & 1 deletion .aipass/project_hooks.json
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
{
"_comment": "TEMPLATE: base per-project hook config copied into new projects by `aipass init` (DPLAN-0190). Mirrors AIPass's own .aipass/hooks.json. All handlers run from $AIPASS_HOME — projects only flip enabled true/false. Use `drone @hooks enable/disable <hook>` or edit here. NOTE: git_gate is enabled by default — it enforces git via drone to prevent state conflicts. To disable for your project, set git_gate.enabled to false below (this won't break other hooks).",
"_comment": "TEMPLATE: base per-project hook config copied into new projects by `aipass init` (DPLAN-0190). Mirrors AIPass's own .aipass/hooks.json. All handlers run from $AIPASS_HOME — projects only flip enabled true/false. Use `drone @hooks enable/disable <hook>` or edit here. NOTE: git_gate is enabled by default — it enforces git via drone to prevent state conflicts. To disable for your project, set git_gate.enabled to false below (this won't break other hooks). NOTE: testwrite_gate refuses CREATION of new test files by POLICY, not by defect (Patrick's ruling, 2026-09-01, DPLAN-0323) — editing existing tests stays allowed. It reads .aipass/test_write_policy.json, which `aipass init` does not yet stamp, so a fresh project lands on the fail-closed missing-policy path until that file exists. Read it with `drone @hooks testwrite`; the refusal names the file and the cure.",
"hooks_enabled": true,

"UserPromptSubmit": {
Expand Down Expand Up @@ -55,6 +55,11 @@
"enabled": true,
"handler": "aipass.hooks.apps.handlers.security.rm_gate.handle",
"matcher": "Bash"
},
"testwrite_gate": {
"enabled": true,
"handler": "aipass.hooks.apps.handlers.security.testwrite_gate.handle",
"matcher": "Bash|Edit|MultiEdit|Write|NotebookEdit"
}
},

Expand Down
8 changes: 8 additions & 0 deletions .aipass/test_write_policy.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
{
"_comment": "Test-write policy — read by aipass.hooks handlers/security/testwrite_gate.py. Deliberately NOT a key in hooks.json: that file is hash-enrolled in the trust registry, so every edit to it darks every hook until a human re-runs 'aipass trust'. A switch meant to be flipped cannot live in a file whose every edit disables the engine that reads it.",
"version": "1.0.0",
"agent_test_writing": "off",
"allow": [],
"block_test_edits": false,
"note": "Patrick ruled 2026-09-01 (devpulse DPLAN-0323): agents are stripped of self-directed test creation while @seedgo's test_quality v5 pack lands, because the corpus being culled (tests written to satisfy a checker rather than to pin a defect) regrows faster than a standards pack can cull it. OFF blocks CREATION of new test files under any tests/ directory; edits to existing tests stay allowed so a red test can still be fixed. Canary trial = add one branch name to allow[]. Fleet back on = agent_test_writing: on. Read it live with: drone @hooks testwrite"
}
1 change: 1 addition & 0 deletions .aipass/tier1_navmap.md
Original file line number Diff line number Diff line change
Expand Up @@ -115,3 +115,4 @@ Your continuity across sessions. Save proactively — after milestones, decision
- Public repo — write as if it ships, because it does. No secrets in the tree, no hardcoded paths (`pathlib`, never `/home/...`), cross-platform.
- No bare imports — always `from aipass.<agent>.apps...`.
- State lives in `.trinity/` and dashboards, never in prompts. Prompts are signposts; memories record; registries catalog.
- Creating NEW test files requires permission — a hook gate refuses it by policy (`.aipass/test_write_policy.json`, Patrick's ruling). Editing or fixing an existing test is fine. Need a new test? Mail @devpulse with the defect or contract it pins — no test without one. Don't route around the gate; a refusal names the policy and the cure.
3 changes: 2 additions & 1 deletion .claude/provider_manifest.json
Original file line number Diff line number Diff line change
Expand Up @@ -147,7 +147,8 @@
],
"env": {
"AIPASS_HOME": "{{REPO_ROOT}}",
"CLAUDE_CODE_DISABLE_AUTO_MEMORY": "1"
"CLAUDE_CODE_DISABLE_AUTO_MEMORY": "1",
"CLAUDE_CODE_DISABLE_AGENT_VIEW": "1"
},
"permissions": {
"deny": [
Expand Down
41 changes: 35 additions & 6 deletions .github/scripts/seedgo_audit.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,21 @@

THRESHOLD = 100

# Pack-count tripwire (DPLAN-0323 phase 6). A standard must never leave the
# gate silently: retire a checker, or break its import, and the audit would
# quietly average one fewer standard, still print 100, and this job would stay
# green. The number moves ONLY by hand, in the same commit that adds or retires
# a standard. Today: 46 *_check.py in the aipass pack + the diagnostics checker.
#
# Counted = every standard the audit CONSULTED: the ones that scored plus the
# ones that reported not_applicable (measured nothing by design and stay out of
# the average - trinity on a clean checkout, where .trinity/ is machine-local
# and gitignored, so this job never sees 47 scored). A checker that crashes
# scores 0 and is still counted. Only a standard that VANISHES trips this - the
# first board with the tripwire caught exactly the not_applicable case, which
# is why the count reads results, not scores.
EXPECTED_STANDARDS = 47

src = Path("src/aipass")
pack = src / "seedgo/apps/handlers/aipass_standards"

Expand All @@ -27,8 +42,26 @@
for branch in branches:
bypass_rules = load_bypass_rules(branch["path"])
result = audit_branch(branch, bypass_rules, pack_path=pack)
scored = sorted(result.get("scores", {}))
stood_down = sorted(
name for name, r in result.get("results", {}).items() if isinstance(r, dict) and r.get("not_applicable") is True
)
consulted = sorted(set(scored) | set(stood_down))
if len(consulted) != EXPECTED_STANDARDS:
print(
f"\nTRIPWIRE: {branch['name']} consulted {len(consulted)} standards "
f"({len(scored)} scored, {len(stood_down)} not applicable), expected "
f"{EXPECTED_STANDARDS} - a standard left the gate silently "
f"(or one was added without moving EXPECTED_STANDARDS)"
)
print(" scored: " + ", ".join(scored))
print(" not applicable: " + (", ".join(stood_down) or "-"))
sys.exit(1)
avg = result.get("average", 0)
print(f" {branch['name']:>12}: {avg:.0f}%")
detail = f"{len(scored)} scored"
if stood_down:
detail += f", not applicable: {', '.join(stood_down)}"
print(f" {branch['name']:>12}: {avg:.0f}% ({detail})")
if avg < THRESHOLD:
failed.append((branch["name"], avg, result))

Expand All @@ -44,11 +77,7 @@
for std, sc in scores.items():
if sc < 100:
checks = results.get(std, {}).get("checks", [])
msgs = [
c.get("message", "")
for c in checks
if not c.get("passed", True)
]
msgs = [c.get("message", "") for c in checks if not c.get("passed", True)]
detail = " | ".join(m for m in msgs if m)[:400]
print(f" └ {std}: {sc:.0f}% {detail}")
sys.exit(1)
Expand Down
Loading