From 06407a6a2ece6a2a6188018c0d331526c56d5860 Mon Sep 17 00:00:00 2001 From: Steve Brown Date: Tue, 20 Oct 2026 10:16:51 -0400 Subject: [PATCH] docs: add Rikuy to the canonical stack contract --- README.md | 1 + docs/stack-table.md | 5 +++-- docs/stack/README-STANDARD.md | 6 +++--- docs/stack/README-TEMPLATE.md | 1 + scripts/check-stack-table.py | 4 ++-- scripts/test-stack-table.py | 9 +++++---- 6 files changed, 15 insertions(+), 11 deletions(-) diff --git a/README.md b/README.md index ede8c1a..0716433 100644 --- a/README.md +++ b/README.md @@ -230,6 +230,7 @@ when. | [desire-path](https://github.com/scbrown/desire-path) | turns agent mistakes into feature requests; works on its own without Quipu | | [seeds](https://github.com/scbrown/seeds) | a work item tracker backed by the Quipu knowledge base | | [shantytown](https://github.com/scbrown/shantytown) | runs crews of AI agents on work items, triggered by hand, on a schedule or by events; can share work and memory through Quipu | +| [rikuy](https://github.com/scbrown/rikuy) | live brief: status, graphs, watches and signed decisions over Quipu | | [shuttle](https://github.com/scbrown/shuttle) | runs signed agent workflows and keeps their records in Quipu | diff --git a/docs/stack-table.md b/docs/stack-table.md index 684cf34..373f99a 100644 --- a/docs/stack-table.md +++ b/docs/stack-table.md @@ -1,6 +1,6 @@ # Canonical stack table -This is the source for the marked stack overview in the eight tool READMEs. +This is the source for the marked stack overview in the nine tool READMEs. @@ -20,11 +20,12 @@ when. | [desire-path](https://github.com/scbrown/desire-path) | turns agent mistakes into feature requests; works on its own without Quipu | | [seeds](https://github.com/scbrown/seeds) | a work item tracker backed by the Quipu knowledge base | | [shantytown](https://github.com/scbrown/shantytown) | runs crews of AI agents on work items, triggered by hand, on a schedule or by events; can share work and memory through Quipu | +| [rikuy](https://github.com/scbrown/rikuy) | live brief: status, graphs, watches and signed decisions over Quipu | | [shuttle](https://github.com/scbrown/shuttle) | runs signed agent workflows and keeps their records in Quipu | Run `python3 scripts/check-stack-table.py` to check this repository, or add -`--remote` to compare all eight published READMEs. Update the marked blocks +`--remote` to compare all nine published READMEs. Update the marked blocks together when changing this table. diff --git a/docs/stack/README-STANDARD.md b/docs/stack/README-STANDARD.md index c1f559e..7235bfc 100644 --- a/docs/stack/README-STANDARD.md +++ b/docs/stack/README-STANDARD.md @@ -94,14 +94,14 @@ each book, and diverging from it is a review finding. ## 3. The shared stack block (identical everywhere) The canonical table is [docs/stack-table.md](../stack-table.md). Copy its complete -marked block verbatim into the eight stack READMEs: Caboodle, Quipu, Camayoc, -Bobbin, Yupana, Desire Path, Seeds and Shantytown. Keep the Shuttle row. Do not add a +marked block verbatim into the nine stack READMEs: Caboodle, Quipu, Camayoc, +Bobbin, Yupana, Desire Path, Seeds, Shantytown and Rikuy. Keep the Shuttle row. Do not add a repository-specific self marker; every copy must remain byte-identical. The [README template](README-TEMPLATE.md) carries the same marked block. Run `python3 scripts/check-stack-table.py README.md docs/stack/README-TEMPLATE.md` from the repository root to verify both local copies, and add `--remote` to -check the eight published READMEs. Update the canonical source and copies +check the nine published READMEs. Update the canonical source and copies together when changing outcome-first row wording. ## 4. Rules every README is held to diff --git a/docs/stack/README-TEMPLATE.md b/docs/stack/README-TEMPLATE.md index 011e438..4495c2e 100644 --- a/docs/stack/README-TEMPLATE.md +++ b/docs/stack/README-TEMPLATE.md @@ -134,6 +134,7 @@ when. | [desire-path](https://github.com/scbrown/desire-path) | turns agent mistakes into feature requests; works on its own without Quipu | | [seeds](https://github.com/scbrown/seeds) | a work item tracker backed by the Quipu knowledge base | | [shantytown](https://github.com/scbrown/shantytown) | runs crews of AI agents on work items, triggered by hand, on a schedule or by events; can share work and memory through Quipu | +| [rikuy](https://github.com/scbrown/rikuy) | live brief: status, graphs, watches and signed decisions over Quipu | | [shuttle](https://github.com/scbrown/shuttle) | runs signed agent workflows and keeps their records in Quipu | diff --git a/scripts/check-stack-table.py b/scripts/check-stack-table.py index 7213ff8..4559e23 100644 --- a/scripts/check-stack-table.py +++ b/scripts/check-stack-table.py @@ -10,7 +10,7 @@ from urllib.request import Request, urlopen ROOT = Path(__file__).resolve().parents[1] -REPOS = ("quipu", "bobbin", "camayoc", "yupana", "desire-path", "seeds", "caboodle", "shantytown") +REPOS = ("quipu", "bobbin", "camayoc", "yupana", "desire-path", "seeds", "caboodle", "shantytown", "rikuy") START = b"" END = b"" MAX_BYTES = 256 * 1024 @@ -56,7 +56,7 @@ def main() -> int: parser = argparse.ArgumentParser(description=__doc__) parser.add_argument("readmes", nargs="*", type=Path, help="local README copies") parser.add_argument("--canonical", type=Path, default=ROOT / "docs/stack-table.md") - parser.add_argument("--remote", action="store_true", help="also audit all eight public main branches") + parser.add_argument("--remote", action="store_true", help="also audit all nine public main branches") args = parser.parse_args() try: canonical = marked_table(args.canonical.read_bytes(), str(args.canonical)) diff --git a/scripts/test-stack-table.py b/scripts/test-stack-table.py index 0a15693..98c91fa 100644 --- a/scripts/test-stack-table.py +++ b/scripts/test-stack-table.py @@ -66,14 +66,14 @@ def test_remote_error_is_not_a_clean_zero(self): redirect_stdout(io.StringIO()), redirect_stderr(io.StringIO()): self.assertEqual(CHECK.main(), 1) - def test_shantytown_is_audited_and_its_missing_block_fails(self): + def test_new_rikuy_and_shantytown_missing_blocks_fail(self): canonical = CANONICAL.read_bytes() - for missing, expected in ((False, 0), (True, 1)): + for missing, expected in ((None, 0), ("shantytown", 1), ("rikuy", 1)): seen = [] def read(repo): seen.append(repo) - return b"A README without a stack block.\n" if missing and repo == "shantytown" else canonical + return b"A README without a stack block.\n" if repo == missing else canonical with self.subTest(missing=missing), \ patch.object(CHECK, "remote_readme", side_effect=read), \ @@ -81,7 +81,8 @@ def read(repo): redirect_stdout(io.StringIO()), redirect_stderr(io.StringIO()): self.assertEqual(CHECK.main(), expected) self.assertEqual(seen.count("shantytown"), 1) - self.assertEqual(len(seen), 8) + self.assertEqual(seen.count("rikuy"), 1) + self.assertEqual(len(seen), 9) def test_remote_response_has_a_size_limit(self): response = MagicMock()