-
Notifications
You must be signed in to change notification settings - Fork 0
Scenarios
VAC34 edited this page Jul 29, 2026
·
14 revisions
99 behavioral conformance scenarios (CONFORMANCE.md rows 1-99). Each tests a specific SAIPEN invariant.
| # | Scenario | Invariant |
|---|---|---|
| 1 | Cold continuation | Agent with zero history resumes from STATE |
| 2 | Corrupt STATE recovery | Missing field triggers RECOVER |
| 3 | Dependency cycle | Circular needs: detected and blocked |
| 4 | Dangling needs: reference | Non-existent T-id in needs: = FAIL |
| 5 | Stale claim forfeiture | Unrefreshed claim after 15min expires |
| 6 | Goal counter crash recovery | goal_waves rebuilt from LOG lines |
| 7 | Manual-verify gate | no-shell host asks human before SHIP |
| 8 | No-publish restriction | git-less host skips tag/push, still ships |
| 9 | Read-only restriction | read-only banned from INIT/PLAN/ADD/BUILD/SHIP/CLEAN/TRANSLATE |
| 10 | Board-empty maintenance | DONE + empty TODO = auto HUNT |
| 11 | Goal objective exit | goal_mode: false after mature ADD |
| 12 | Extension absence | No extensions dir -> no SUBs, still works |
| 13 | Unresolved LOG parent | WARN but not FAIL |
| 14 | Invalid phase transition | REVIEW->SHIP PASS, INIT->SHIP FAIL |
| 15 | Mode-phase restrictions | read-only + ADD = FAIL |
| 16 | Ticket-level BLOCKED | Non-cycle failure, work continues on other tickets |
| 17 | Fresh INIT bootstrap | From templates/ on first saipen set |
| 18 | Evolutionary ADD symmetry | ADD follows priority order, never invents |
| 19 | Unclaimed DOING adoption | Crash orphan -> next agent claims it |
| 20 | Clean tree after BLOCKED | Stale work doesn't poison next ticket |
| 21 | Dirty tree on continuation | Agent adopts uncommitted changes |
| 22 | Parallel TRANSLATE isolation | Two translate runs don't stomp each other |
| 23 | Dual-location extension conflict | root vs .saipen/ ext, never merged |
| 24 | Dual-location TRANSLATE conflict | Same, isolated |
| 25 | Sub spawn on protected project | Refuses if project has uncommitted claims |
| 26 | HUNT skip hash rule | Exact HEAD match required, mtime doesn't count |
| 27 | MARKHUNT record-only | Never fixes, never caps findings |
| 28 | VERIFY hysteresis | Second block on same ticket -> escalates |
| 29 | SubSaipen STATE shape | schema-valid, mode: read-only, no TRANSLATE |
| 30 | read-only reachable phases | MARKHUNT/PREPARE/VALIDATE only |
| # | Scenario | Invariant |
|---|---|---|
| 31 | stop preserves goal counters | stop doesn't reset waves/tickets |
| 32 | goal_waves not double-counted | ADD->PLAN doesn't increment twice |
| 33 | Fixer subSaipen patch format | Patch carries base_head + verified |
| 34 | BOOT.md cold-start | Compact kernel, no rule definition |
| 35 | human_note optional | One-line nudge, never required |
| 36 | Human digest | ship/stop (over)write kitchen/digest.md |
| 37 | MARKHUNT closure self-test | Verified against its own findings |
| 38 | LOG segmentation | E-### unique across sealed+active segments |
| 39 | Shipped-library integrity | validate.py checks shipped STATEs |
| 40 | Board soft cap | BOARD.md kept readable |
| 41 | saipen status | Answers real question, never re-runs validator |
| 42 | LOG timestamp sanity | >3h future = FAIL, >5min inversion = WARN |
| 43 | Reserved | Superseded by row 54 |
| 44 | Checkpoint self-confirmation | Read back STATE after writing |
| 45 | Returning agent stale memory | Distrusts own recall, re-reads STATE |
| 46 | Safety valve is a pause | goal_mode preserved, not exit |
| 47 | Determinism invariants | Fixed action priority order |
| 48 | SubSaipen blocked not guessed | status: blocked + exact question |
| 49 | next_action vocabulary | Value must match prefix/category |
| 50 | One ticket at a time | BOARD FAILs on 2+ DOING |
| 51 | Goal counters countable trace | goal_waves LOG line required |
| 52 | MARKHUNT evidence | Finding without cite = FAIL |
| 53 | OUTBOX well-formed | status/summary/critical required |
| 54 | Deadlocked board FAIL | DONE + empty TODO + WAIT: non-valve = FAIL |
| 55 | Tripped valve shape | goal_mode: true, phase NOT BLOCKED |
| 56 | Duplicate section headings FAIL | Two ## DONE blocks = FAIL |
| 57 | WAIT category token | Closed 7-word vocabulary |
| 58 | Cross-document drift | RFC vs schema vs validator agreement |
| 59 | Checkbox-section agreement | [x] only under DONE, [ ] only under TODO/BLOCKED |
| 60 | Write confirmed by readback | All 3 checkpoint files read back |
| 61 | Command =/= transition | saipen ship recognized, direct SHIP blocked |
| 62 | Rule reaches emitting docs | Every WAIT: in phase docs carries category |
| 63 | Guides teach current shape | validate.py WARNs on stale guides |
| 64 | Portable floor not permissive | validate.sh/ps1 probe all 9 fields |
| 65 | Both halves agree | validate.sh and validate.ps1 same checks |
| 66 | CI workflow honest trigger | Header states real trigger, names pre-commit hook |
| 67 | Drift hunt validation expansion | subs README, sub next_action prefixes, self-transition enum, adapter path existence |
| 68 | saiwiki-outbox-cycle demo | Behavioral: drift detection -> OUTBOX -> collect -> apply |
| 69 | Push claim adjudicated by git | next_action claiming "pushed" with local-only commits FAILs |
| 70 | Validator linted for first time | 9 cp1251-mangled section signs in own FAIL messages |
| 71 | subSaipen liveness visible | Never-run sub WARNs; unreviewed ready entries WARN |
| 72 | Release tag self-check | release.yml refuses tag contradicting VERSION |
| 73 | Descriptive schemas held to RFC | log.schema.json must require event_id, no cap |
| 74 | OUTBOX vocabulary unified three ways | PROTOCOL table, schema, validate.py agree |
| 75 | Validator works in installed layout | CI tests injected copy, not dev layout |
| 76 | Injector writes openable paths | cygpath-w conversion under git bash / MSYS / Cygwin |
| 77 | next_action shape is FAIL not WARN | Vague-phrase regex removed; 3 invalid values FAIL |
| 78 | Portable floor gap stated | validate.sh/ps1 check presence, not executability |
| 79 | Fail-fixture proves specific reason | expect_fail_contains: pins the failure |
| 80 | Fixture next_action values executable | All 6 fixed to RFC SS 1.2 prefix forms |
| 81 | Field count not restated anywhere | Count check covers BOOT, CONFORMANCE, READMEs |
| 82 | Doc checks walk inventory not glob | Root GUIDE.md outside guides/ caught |
| 83 | Every shipped doc accounted for | 184 docs: 11 patterns, 11 exempt, 0 orphans |
| 84 | Core promises have standing fixtures | 5 key failure modes with pinned reasons |
| 85 | DATE mandatory on new entries | FAIL in active log; WARN for 125 sealed dateless |
| 86 | Timestamp harvest never silently empty | Zero parseable timestamps = FAIL |
| 87 | Portable floor proved still red | audit_floor.py: 20 mutations, both halves |
| 88 | Both portable floor halves audited | First run found wording divergence; aligned |
| 89 | Citations resolve | Every SS N.N and phases/*.md points at real thing |
| 90 | KNOWLEDGE/ checked under doc rules | traps.md taught superseded WAIT rule |
| 91 | Exempt means no rule-content check | Citations still verified on exempt docs |
| 92 | Warn categories reachable | unknown-field behind dead branch; collapsed to FAIL |
| 93 | Gate-stuck-red guard | verify.md requires control with known result |
| 94 | TEMPLATE validated like any instance | Was skipped by name; had prefix-less next_action |
| 95 | Phase docs reject bad next_action | done.md: wait for user command replaced |
| 96 | No doc cites unshipped version | Every vX.Y.Z bounded by VERSION |
| 97 | Every adapter names cold-start kernel | BOOT.md required in all 9 adapters |
| 98 | Every prescribed next_action checked | Not just WAITs; phases, extensions, KNOWLEDGE |
| 99 | Text lint walks shipped surface | 5 mojibake sequences, all docs scanned |
"99 сценариев. Каждый проверяет одно правило. Никаких 'ну, это редко бывает'. Тест упал — значит что-то сломалось. Тест прошёл — значит работает. Агент не гадает. Агент проверяет."
SAIPEN v7.158.0 — One command. Zero dependencies. Zero amnesia. — MIT