Merge pull request 'policy: QA philosophy + dogfooding mandate' (#117) from policy/qa-dogfooding-philosophy into main

This commit is contained in:
2026-03-14 21:33:08 -04:00
5 changed files with 45 additions and 3 deletions

View File

@@ -69,6 +69,46 @@ The Hermes loop orchestrator must:
---
## QA Philosophy — File Issues, Don't Stay Quiet
Every agent is a quality engineer. When you see something wrong, broken,
slow, or missing — **file a Gitea issue**. Don't fix it silently. Don't
ignore it. Don't wait for someone to notice.
**Escalate bugs:**
- Test failures → file with traceback, tag `[bug]`
- Flaky tests → file with reproduction details
- Runtime errors → file with steps to reproduce
- Broken behavior on main → file IMMEDIATELY
**Propose improvements — don't be shy:**
- Slow function? File `[optimization]`
- Missing capability? File `[feature]`
- Dead code / tech debt? File `[refactor]`
- Idea to make Timmy smarter? File `[timmy-capability]`
- Gap between SOUL.md and reality? File `[soul-gap]`
Bad ideas get closed. Good ideas get built. File them all.
When the issue queue runs low, that's a signal to **look harder**, not relax.
## Dogfooding — Timmy Is Our Product, Use Him
Timmy is not just the thing we're building. He's our teammate and our
test subject. Every feature we give him should be **used by the agents
building him**.
- When Timmy gets a new tool, start using it immediately.
- When Timmy gets a new capability, integrate it into the workflow.
- When Timmy fails at something, file a `[timmy-capability]` issue.
- His failures are our roadmap.
The goal: Timmy should be so woven into the development process that
removing him would hurt. Triage, review, architecture discussion,
self-testing, reflection — use every tool he has.
---
## Agent Roster
### Build Tier

View File

@@ -252,7 +252,7 @@ class Settings(BaseSettings):
# ── MCP Servers ────────────────────────────────────────────────────
# External tool servers connected via Model Context Protocol (stdio).
mcp_gitea_command: str = "gitea-mcp -t stdio"
mcp_gitea_command: str = "gitea-mcp-server -t stdio"
mcp_filesystem_command: str = "npx -y @modelcontextprotocol/server-filesystem"
mcp_timeout: int = 15

View File

@@ -40,7 +40,7 @@ def _parse_command(command_str: str) -> tuple[str, list[str]]:
"""Split a command string into (executable, args).
Handles ``~/`` expansion and resolves via PATH if needed.
E.g. ``"gitea-mcp -t stdio"`` → ``("/Users/x/go/bin/gitea-mcp", ["-t", "stdio"])``
E.g. ``"gitea-mcp-server -t stdio"`` → ``("/opt/homebrew/bin/gitea-mcp-server", ["-t", "stdio"])``
"""
parts = command_str.split()
executable = os.path.expanduser(parts[0])

View File

@@ -282,7 +282,7 @@ def test_repl_skips_empty_input():
patch("timmy.session.chat") as mock_chat,
):
mock_chat.return_value = "Response"
result = runner.invoke(app, ["repl"])
runner.invoke(app, ["repl"])
# chat should only be called once (for "hello"), empty lines are skipped, exit breaks
assert mock_chat.call_count == 1

View File

@@ -3,6 +3,7 @@
from unittest.mock import MagicMock, patch
import httpx
import pytest
def test_get_system_info_returns_dict():
@@ -163,6 +164,7 @@ class TestGetOllamaModelExactMatch:
class TestRunSelfTests:
"""Tests for run_self_tests() — Timmy's self-verification tool."""
@pytest.mark.slow
def test_returns_dict_with_expected_keys(self):
"""run_self_tests should return structured test results."""
from timmy.tools_intro import run_self_tests