forked from Rockachopa/Timmy-time-dashboard
Merge pull request 'policy: QA philosophy + dogfooding mandate' (#117) from policy/qa-dogfooding-philosophy into main
This commit is contained in:
40
AGENTS.md
40
AGENTS.md
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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])
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user