Skip to content

Releases: sherifican/Agent-FleetOps

v0.1.6

Choose a tag to compare

@sherifican sherifican released this 20 Oct 18:24

This release closes both gaps v0.1.5 listed under "Not in this release" and tightens four guard tests that a deliberately broken runner or scanner could still pass.

What changed

Teeth-prover claims

  • The README, guard/README.md, guard/run_guards.sh, guard/teeth_prover.py, guard/__init__.py and guard/specs/SPEC_teeth_prover.md no longer say the teeth-prover proves "every guard" can fail. They now say what it tests: each of the 10 judging checks in research_properties. The two reporting counts (row_count, word_count) are exempt by design.
  • A caption under the README's architecture diagram says the same. The diagram image itself is unchanged.

Adopt VERIFY counts (guard/doc_count_drift.py)

  • The checker now also reads a TUI count written as "the same N cases" on the **VERIFY — expected output:** lines of adopt/10_tui.md and adopt/90_verify_all.md, so a stale count there turns the documented-counts check red. The same phrase anywhere else is still not treated as a claim.
  • --selftest has a case for a stale count in that phrasing.

Guard tests

  • guard/tests/test_suite_is_bounded.py: a runner that hits its deadline must fail with exactly pytest.fail; reporting the hang as an xfail now fails the test. The hang test probes with its own interpreter, so it no longer skips on a machine whose PATH python3 lacks pytest. The test still exercises the runner's real deadline.
  • guard/tests/test_live_runner_cleanup.py: the same exact-type check, so an xfail or a skip in place of the failure no longer passes.
  • guard/tests/test_ref_gate_rules.py: three filler commits now follow the dropped commit, so a scanner that reads only the tip and parent trees fails the test.

Docs

  • The two sentence fragments that open and close the README introduction are now full sentences, the guard count reads "6128 tests collected in guard/tests/", and two curly apostrophes are now straight.
  • The guard/README.md release-run row says which dependencies the TUI suite needs, and that a dependency failure that prevents collection leaves the TUI count UNMEASURED under --release (exit 2).

Counts

  • Unchanged: 6128 guard tests, 1182 TUI tests, 7310 in the banner. No test was added or removed. On CPython 3.12.13 the guard suite gave 6088 passed and 40 skipped; 31 of the skips are the skill-frontmatter tests, which need PyYAML, and it was not installed for that run.

Not in this release

  • A few lines still use "every guard" or a stale present tense for different claims: the success banner in guard/run_guards.sh, guard/teeth_prover.py:3, guard/specs/SPEC_teeth_prover.md:7, and two skill files.
  • guard/tests/test_live_runner_cleanup.py:343 still accepts an xfail where it expects a failure.
  • Two curly apostrophes remain in adopt/90_verify_all.md and adopt/10_tui.md.
  • The TUI tests still write their scratch directory under /tmp.

CI

The CI run on this commit took 28 min 47 s, of which the guard step took 15 min 32 s (run 39467939238). On CI's Python 3.12 the guard suite gave 6051 passed and 77 skipped, and the TUI suite 1181 passed and 1 skipped.

Upgrading

Nothing to configure.

v0.1.5

Choose a tag to compare

@sherifican sherifican released this 16 Oct 11:05

This release closes the three gaps v0.1.4 listed under "Not in this release", tightens two test boundaries that let defective output pass, and makes the README and adopt docs agree on which Python versions were measured.

What changed

Ref gate self-test (_tools/ref_gate.py --self-test)

  • v0.1.4 buried the AI-attribution trailer one commit behind a branch tip, so a scanner that read each tip and its parent still passed. Three clean commits now follow the plant, and the fixture check requires the trailer commit to sit outside the first three commits of every ref. A scanner limited to the first three commits of each ref now turns the self-test red.
  • The precondition test's case where both detectors are broken keeps two marker commits above the trailer, so the trailer is not the tip again in that case.
  • The gate's own rules and verdict are unchanged.

Ref gate quiet-mode tests

  • In v0.1.4 the multi-rule quiet-mode test checked the failure report by its number of rule headers. It now requires each [FAIL] line to name exactly one rule and compares the full report with the expected lines, as the single-rule test already did, so a report that merges, swaps, drops or reorders lines only when several rules fire no longer passes.

Hang test (guard/tests/test_suite_is_bounded.py)

  • When python3 on PATH cannot import pytest, the runner's own "child pytest unavailable" skip is now reported as a skip instead of failing on a pid count. Only that skip is passed through. A runner that hits its deadline must fail the test; reporting a hung run as a skip now fails it.

Docs

  • adopt/10_tui.md, adopt/90_verify_all.md and the README now say what tui/AGENTS.md already said about the TUI suite: its 1182 cases were collected and run on Python 3.12 (1181 passed, 1 skipped), CI collects them on 3.11, and runs on 3.11, 3.13 and 3.14 are unmeasured. The adopt VERIFY steps treat only a non-zero exit or a different Python 3.12 count as a blocker.
  • The README introduction calls the 6128 guard tests a collected count and credits the teeth-prover with proving that the research-property guards can fail, which is what it tests.

Counts

  • Unchanged: 6128 guard tests, 1182 TUI tests, 7310 in the banner. On CPython 3.14 the guard suite gave 6120 passed and 8 skipped.

Not in this release

  • Some README and guard/README.md sentences still say "every guard" where the claim holds for a narrower set.
  • The adopt VERIFY lines' TUI counts are not checked by guard/doc_count_drift.py.

CI

The CI run on this commit took 22 min 32 s, of which the guard step took 12 min 23 s (run 38888690473). On CI's Python 3.12 the guard suite gave 6051 passed and 77 skipped, and the TUI suite 1181 passed and 1 skipped.

Upgrading

Nothing to configure.

v0.1.4

Choose a tag to compare

@sherifican sherifican released this 15 Oct 08:37

This release makes the ref gate's self-test show that the history scans read past a branch tip, and fixes the TUI test isolation on CPython builds that omit os.P_PIDFD.

What changed

Ref gate self-test (_tools/ref_gate.py --self-test)

  • v0.1.3 planted every violation on the tip commit of its branch, so it did not show that the history scans read past a tip. The reach probe now plants the AI-attribution trailer and then adds one more commit on top, so the trailer sits one commit behind the tip. A scanner that reads only each ref's tip commit now turns the self-test red.
  • Two new fixture pairs fire two rules at once: a trailer with a stray ref, and a trailer with a compiled object. Each pair's detectors must find exactly those two violations, and the gate must go red.
  • The gate's own rules and verdict are unchanged.

TUI test isolation

  • The isolation helper reaps the child it started through a pidfd. Some CPython builds do not define os.P_PIDFD; on Linux the helper now uses the kernel's value (3) instead. It does not fall back on other platforms, where 3 means something else. A new test file covers this without starting a process.

Counts

  • The READMEs now give 6128 guard tests and 1182 TUI tests, and the banner 7310 tests in total. On CPython 3.14.4 the guard suite gave 6120 passed and 8 skipped; on CPython 3.12.13 the TUI suite gave 1181 passed and 1 skipped. TUI runs on 3.11, 3.13 and 3.14 were not measured for this revision.

Not in this release

  • The adopt docs and tui/AGENTS.md list the unmeasured Python versions differently; they will be aligned in a later release.
  • The reach probe buries the trailer one commit deep, not several, so a scanner that reads each tip and its parent still passes it.
  • One quiet-mode test checks the failure report by its number of rule headers, not by which rules they name.

CI

The CI run on this commit took 36 min 32 s, of which the guard step took 19 min 56 s (run 38702493026).

Upgrading

Nothing to configure.

v0.1.3

Choose a tag to compare

@sherifican sherifican released this 09 Oct 09:18

This release makes the ref gate's self-test prove what its PASSED line says, and tightens the tests around the gate's report.

What changed

Ref gate self-test (_tools/ref_gate.py --self-test)

  • The self-test used to plant the never-publish file and the AI-attribution trailer on an extra branch. That branch is itself a stray ref, so the stray-ref rule alone turned those probes red, and a gate whose verdict ignored the other two rules still printed PASSED and exited 0.
  • Each of the three rules now gets its own fresh repository, checked clean before the violation is planted. The rule's detector must be the only one that fires, and the gate must then go red.
  • A separate probe keeps the old checks that the never-publish and trailer rules see history reachable only from a branch that is not checked out, and that the gate goes red when a stray branch and a never-publish file are both present, and again when the trailer is added so all three rules fire.
  • The gate's own rules and verdict are unchanged.

Guard tests

  • The PASSED and BASELINE lines are compared as whole lines on ASCII and UTF-8 streams, split on line feeds only, so extra words after either sentence fail a test, including words after a carriage return. The UTF-8 failure report has its own test, and each baseline failure is checked on its own.
  • New tests: quiet mode prints nothing on a repository that goes red for any one of the three rules; a fleetops.publishRef that is only a carriage return is refused rather than read as unset; and a single rule's failure report names only that rule.
  • The READMEs now give 6101 guard tests, and the banner 7280 tests in total.

Not in this release

  • The report writer is unchanged for unusual output streams.
  • The time the hermetic test step takes has not been looked into.
  • The self-test plants every violation on the tip commit of its branch, so it does not show that the history scans read past a branch tip.

CI

The CI run on this commit took 35 min 11 s, of which the guard step took 19 min 2 s (run 37906558210).

Upgrading

Nothing to configure.

v0.1.2

Choose a tag to compare

@sherifican sherifican released this 07 Oct 18:01

This release hardens the ref gate, the check that runs before a push and in CI, and adds three diagrams and a note on keeping output on a second drive.

What changed

Ref gate (_tools/ref_gate.py)

  • Release tags pass when their annotation chain ends on published history (the publishing ref's commit or an ancestor). A tag on unpublished history, on a tree or a blob, an extra branch, or a refs/original leftover still fails.
  • Every git call runs with --no-replace-objects, so a local replace ref cannot make an orphan look published. A pull-request checkout falls back to refs/remotes/origin/<branch>. A shallow clone, a git failure during a rule, or a publishing ref that does not point at a commit makes the gate refuse with exit 2 instead of reporting a clean scan.
  • The publishing ref is looked up by its exact name. fleetops.publishRef is read as bytes: only git's final line feed and outer ASCII spaces and tabs are removed, so a value ending in a CR, U+0085, U+2028 or U+2029 is refused rather than read as refs/heads/main.
  • Every name of every reachable tree entry is judged, in bounded batches, so a never-publish file that shares its bytes with another file is still found.
  • Co-author trailers are matched as whole words against a fixed list of model, vendor and assistant names, including versioned spellings such as Qwen3-Coder and Gemma4. A following or preceding combining mark continues the word, except the default-ignorable marks, which do not hide a name. A person whose name is also a model's name is refused, and the report prints the whole line. Tag annotations are checked like commit messages.
  • Git output is split on line feeds only and decoded with surrogate escapes, and every report line is escaped for the stream's encoding, so a name or message that is not UTF-8, or an ASCII-only stdout, no longer stops the gate with a traceback.
  • The module docstring states what the trailer rule does not catch: a model the list does not name, a name split by an invisible character, and a trailer that begins after a Unicode line separator.

Guard tests

  • The live runner tests start the runner with stdin from /dev/null, keep output already read when a final read times out, and count a process whose stat file cannot be read as still alive.

Documentation

  • Three diagrams under docs/diagrams/: roles and channels, where each kind of memory lives, and how work moves through review and handoff.
  • The storage section explains how to keep test temporaries, agent working directories, receipts and logs on a second drive, and to match size and sha256 before deleting an original.
  • The READMEs now give 6093 guard tests, and the banner 7272 tests in total.

CI

The CI run on this commit took 31 min 8 s, of which the guard step took 16 min 20 s (run 37659425695).

Upgrading

Nothing to configure. If you set fleetops.publishRef, the value must be a full ref name such as refs/heads/main; a value with trailing characters other than spaces and tabs is now refused.

v0.1.1

Choose a tag to compare

@sherifican sherifican released this 07 Oct 01:07

This is the first tagged release. It bounds the guard suite so CI finishes inside its deadline.

What changed

  • Planted-failure witnesses replace all three check lists with recording sentinels, keeping the names and order. Each witness still enters the real main() once and asserts that main() called every slot once, in order.
  • In run_guards.sh, when GUARD_RUNNER_NESTED=1, the nested pytest step runs only guard/tests/test_runner_nested_seam.py and prints one line saying so. Without the variable it runs the full tree as before.
  • Live runner calls in test_run_guards_runner.py have deadlines (300 s; 120 s for the stubbed runner), run in their own process group, and send SIGKILL to that group when each call ends.
  • Workflow deadlines: 100 minutes for the test job, 45 minutes each for the hermetic and guard steps, and 10 minutes each for the python-floor and ref-gate jobs.
  • Added test_suite_is_bounded.py and test_live_runner_cleanup.py as new guard gates.
  • Updated the banner and documentation to 5873 guard tests and 7052 total tests.

CI

The guard suite now has deadlines, and the CI run on this commit took 34 min 43 s, of which the guard step took 18 min 29 s (run 37552316733).

Upgrading

This release changes only the guard tests, guard/run_guards.sh, the CI workflow and the documentation; it adds no setting to configure.