personal memory agent
0
fork

Configure Feed

Select the types of activity you want to include in your feed.

chore(makefile): decouple install-service from quality gates; drop agents-rename gate

install-service no longer invokes install-checks during the upgrade or
current install paths — it surprised users by running ruff/format/mypy/
layer-hygiene against the working tree at install time. install-checks
remains the canonical pre-merge gate via make ci / make verify.

The agents→talents rename has shipped, so the rename-guard gate is
permanent dead weight. Removes the Makefile target, the .PHONY entry,
the script, the install-checks invocation, and the doc references.

Co-Authored-By: Codex <codex@openai.com>

+4 -116
+3 -4
AGENTS.md
··· 39 39 | `convey/` | Web app framework — app discovery, routing, bridge, screenshot tooling | layout / framework-level UI changes | `docs/CONVEY.md` | 40 40 | `apps/` | Convey apps — each self-contained (`call.py` Typer sub-app + `routes.py` + `templates/`) | adding a user-facing feature, a `sol call <app>` verb, a UI surface | `docs/APPS.md` (required reading before modifying `apps/`) | 41 41 | `talent/` | AI talent configs (markdown prompts + optional `.py` post-hooks) + `SKILL.md`s (journal, coder, partner, …) | defining or tuning a talent; adding a journal-side skill | `talent/journal/SKILL.md`, `docs/PROMPT_TEMPLATES.md` | 42 - | `scripts/` | Repo maintenance scripts — `check_layer_hygiene.py`, `gate_agents_rename.py` | tooling that guards the codebase; wired into `make ci` | (none) | 42 + | `scripts/` | Repo maintenance scripts — `check_layer_hygiene.py` | tooling that guards the codebase; wired into `make ci` | (none) | 43 43 | `tests/` | Pytest suites + `tests/fixtures/journal/` mock journal | writing tests; debugging flakiness; `make dev` / `make sandbox` use fixtures as the journal | `docs/testing.md` | 44 44 | `docs/` | All longform documentation | reference lookups; never your first stop | §10 below | 45 45 | `journal/` | The live journal (user data). Git-ignored content; checked-in template (`AGENTS.md`, skills symlinks) | **rarely as a coder** — modify `think/`, `apps/`, or `talent/`, not journal data | `talent/journal/SKILL.md` | ··· 116 116 | `make test-all` | Everything — core + apps + integration. Pre-ship gate. | 117 117 | `make coverage` | HTML coverage report under `htmlcov/`. Occasional. | 118 118 | `make watch` | pytest-watch — reruns tests on file change. Useful during a test-heavy sprint. | 119 - | `make ci` | Format-check + ruff + agents-rename gate + layer-hygiene + tests. **Run before every commit.** | 119 + | `make ci` | Format-check + ruff + layer-hygiene + tests. **Run before every commit.** | 120 120 | `make verify` | Same steps as `make ci`. Either name is fine. | 121 - | `make install-checks` | The pre-test half of `make ci` (format-check + ruff + gates). Called by `ci` / `verify`. | 121 + | `make install-checks` | The pre-test half of `make ci` (format-check + ruff + layer-hygiene). Called by `ci` / `verify`. | 122 122 | `make check-layer-hygiene` | Run `scripts/check_layer_hygiene.py` alone. Useful when iterating on an L1–L2 violation flagged by CI. | 123 - | `make gate-agents-rename` | Guard against reintroducing the old `agents/` naming. Part of `install-checks`. | 124 123 125 124 ### Verification against a running sandbox 126 125
+1 -9
Makefile
··· 10 10 PYTEST_BASETEMP := $(shell mktemp -d /var/tmp/solstone-pytest-XXXXXX) 11 11 PYTEST_BASETEMP_FLAG := --basetemp $(PYTEST_BASETEMP) 12 12 13 - .PHONY: install uninstall test test-apps test-app test-only test-integration test-integration-only test-all format format-check install-checks ci clean clean-install coverage watch versions update update-prices pre-commit skills dev all sandbox sandbox-stop install-pinchtab install-models parakeet-helper parakeet-helper-clean verify-browser update-browser-baselines review verify verify-api update-api-baselines install-service uninstall-service service-logs gate-agents-rename check-layer-hygiene doctor FORCE 13 + .PHONY: install uninstall test test-apps test-app test-only test-integration test-integration-only test-all format format-check install-checks ci clean clean-install coverage watch versions update update-prices pre-commit skills dev all sandbox sandbox-stop install-pinchtab install-models parakeet-helper parakeet-helper-clean verify-browser update-browser-baselines review verify verify-api update-api-baselines install-service uninstall-service service-logs check-layer-hygiene doctor FORCE 14 14 15 15 # Default target - install package in editable mode 16 16 all: install ··· 482 482 ;; \ 483 483 up""grade) \ 484 484 echo "mode: up""grade"; \ 485 - $(MAKE) install-checks || exit $$?; \ 486 485 ;; \ 487 486 current) \ 488 487 echo "mode: current"; \ 489 - $(MAKE) install-checks || exit $$?; \ 490 488 ;; \ 491 489 fresh) \ 492 490 echo "mode: fresh install"; \ ··· 564 562 @echo "=== Running ruff ===" 565 563 @$(RUFF) check . || { echo "Run 'make format' to auto-fix"; exit 1; } 566 564 @echo "" 567 - @echo "=== Running rename gate ===" 568 - @$(MAKE) gate-agents-rename 569 - @echo "" 570 565 @echo "=== Running layer-hygiene check ===" 571 566 @$(MAKE) check-layer-hygiene 572 567 @echo "" ··· 625 620 @$(UV) pip show pre-commit >/dev/null 2>&1 || { echo "Installing pre-commit..."; $(UV) pip install pre-commit; } 626 621 $(VENV_BIN)/pre-commit install 627 622 @echo "Pre-commit hooks installed!" 628 - # Rename guard for the agents -> talents transition 629 - gate-agents-rename: .installed 630 - $(VENV_BIN)/python scripts/gate_agents_rename.py 631 623 632 624 # Low-bar layer-hygiene check (see docs/coding-standards.md § Layer Hygiene) 633 625 check-layer-hygiene: .installed
-103
scripts/gate_agents_rename.py
··· 1 - #!/usr/bin/env python3 2 - # SPDX-License-Identifier: AGPL-3.0-only 3 - 4 - from __future__ import annotations 5 - 6 - import re 7 - import subprocess 8 - import sys 9 - from pathlib import Path 10 - 11 - ROOT = Path(__file__).resolve().parent.parent 12 - ALLOWLIST_RE = re.compile(r"^apps/sol/maint/00[0-4]_.+\.py$") 13 - PRODUCTION_PREFIXES = ("think/", "apps/", "talent/", "convey/", "observe/") 14 - 15 - RULES = [ 16 - ( 17 - "legacy think emitter", 18 - re.compile(r'_jsonl_log\(\s*["\']agent\.(fail|dispatch|complete|skip)["\']'), 19 - None, 20 - ), 21 - ( 22 - "legacy callosum emitter", 23 - re.compile(r'emit\(\s*["\']agent_(started|completed)["\']'), 24 - None, 25 - ), 26 - ("legacy module path", re.compile(r"\bthink\.agents\b"), None), 27 - ("legacy/new CLI command", re.compile(r"\bsol agents\b|\bsol talents\b"), None), 28 - ("legacy payload key", re.compile(r'["\']agent_id["\']\s*:'), "production"), 29 - ("legacy wire event", re.compile(r'["\']agent_updated["\']'), "production"), 30 - ( 31 - "legacy summary/anomaly key", 32 - re.compile( 33 - r'summary\["agents"\]|["\']agent_failure["\']|["\']agents_fired["\']' 34 - ), 35 - "production", 36 - ), 37 - ] 38 - 39 - 40 - def tracked_files() -> list[Path]: 41 - result = subprocess.run( 42 - ["git", "ls-files"], 43 - cwd=ROOT, 44 - check=True, 45 - capture_output=True, 46 - text=True, 47 - ) 48 - return [Path(line) for line in result.stdout.splitlines() if line] 49 - 50 - 51 - def is_allowed(path: Path) -> bool: 52 - path_str = path.as_posix() 53 - if path == Path("AGENTS.md"): 54 - return True 55 - if path == Path("tests/test_maint_004_rename.py"): 56 - return True 57 - if path == Path("scripts/gate_agents_rename.py"): 58 - return True 59 - if ALLOWLIST_RE.match(path_str): 60 - return True 61 - return False 62 - 63 - 64 - def is_production(path: Path) -> bool: 65 - path_str = path.as_posix() 66 - return path_str == "think/sol_cli.py" or path_str.startswith(PRODUCTION_PREFIXES) 67 - 68 - 69 - def iter_lines(path: Path) -> list[tuple[int, str]]: 70 - lines = (ROOT / path).read_text(encoding="utf-8").splitlines() 71 - return list(enumerate(lines, start=1)) 72 - 73 - 74 - def main() -> int: 75 - failures: list[str] = [] 76 - for path in tracked_files(): 77 - if is_allowed(path): 78 - continue 79 - if not (ROOT / path).is_file(): 80 - continue 81 - try: 82 - lines = iter_lines(path) 83 - except UnicodeDecodeError: 84 - continue 85 - for line_no, line in lines: 86 - for label, pattern, scope in RULES: 87 - if scope == "production" and not is_production(path): 88 - continue 89 - if pattern.search(line): 90 - failures.append(f"{path}:{line_no}: {label}: {line.strip()}") 91 - 92 - if failures: 93 - print("agents rename gate failed:", file=sys.stderr) 94 - for failure in failures: 95 - print(f" {failure}", file=sys.stderr) 96 - return 1 97 - 98 - print("agents rename gate passed") 99 - return 0 100 - 101 - 102 - if __name__ == "__main__": 103 - raise SystemExit(main())