yams/AGENTS.md

219 lines
7.8 KiB
Markdown

---
description: YAMS-first repo agent supplement for Codex (engineering + bug-bounty)
argument-hint: [TASK=<description>] [MODE=<engineering|bug-bounty>] [PBI=<pbi-id>] [PHASE=<start|checkpoint|complete>]
---
# AGENTS.md (Repo Supplement)
This file supplements `docs/prompts/PROMPT-eng-codex.md`.
Use `docs/prompts/PROMPT-eng-codex.md` for the generic Codex/YAMS operating model.
Use this file for YAMS repo specifics, local conventions, and repo-scoped safety.
## Repo Intent
- Primary use: software engineering on YAMS.
- Secondary use: bug-bounty style security research workflows (scoped, non-destructive by default).
- Persistent memory goal: use YAMS as distributed memory across sessions, agents, and handoffs.
## Repo Priorities (Overrides / Additions)
- Prefer YAMS retrieval before local file reads when recovering context or prior decisions.
- Keep memory artifacts small and queryable (checkpoint code + short notes > long prose dumps).
- Index work before `git push`, and before deleting files.
- If blackboard tools are unavailable, continue with YAMS-only workflow without blocking.
## Repo Agent ID
- Canonical format: `opencode-<task-slug>`
- Example: `opencode-list-snippet-hydration`
## Required YAMS Metadata (Repo Standard)
Attach to every `yams add`:
- `task`: short task slug
- `phase`: `start|checkpoint|complete`
- `owner`: `opencode`
- `source`: `code|note|decision|research|evidence`
Recommended in this repo:
- `mode`: `engineering|bug-bounty`
- `pbi`: PBI id if applicable
- `agent_id`: `opencode-<task-slug>`
- `status`: `open|blocked|done`
Bug-bounty additions when applicable:
- `target`: program/asset identifier
- `scope`: in-scope surface label
- `severity`: `low|medium|high|critical`
- `repro`: reproducibility tag
- `impact`: impact summary tag
## YAMS-First Retrieval Behavior
Use this order when you need context for reasoning:
1. `yams search` / `yams grep` to discover artifacts
2. `yams get` (or MCP `get`) to read selected artifacts
3. Local file reads for implementation details only after YAMS retrieval
Behavior rules:
- Prefer YAMS retrieval over ad-hoc local `rg`/`cat` for prior knowledge.
- Do not mark chunks as rejected unless explicit user/model feedback says so.
- Treat `served - used` as weak negative signal (`not_used`), not hard rejection.
Reporting when retrieval is used:
- Include `UsedContext: <chunk_ids or hashes>` when known.
- Include `Citations: <artifact paths/hashes>` or `Citations: none`.
- Preserve `trace_id` in logs/artifacts when available.
## Blackboard Coordination (If Available)
Registration first:
```text
bb_register_agent({ id: "opencode-<task-slug>", name: "OpenCode Agent", capabilities: ["yams", "code", "coordination"] })
```
Minimal coordination pattern:
```text
bb_search_findings({ query: "<keywords>" })
bb_post_finding({ agent_id: "opencode-<task-slug>", topic: "other", title: "<title>", content: "<markdown>" })
bb_create_task({ title: "<work item>", type: "fix", priority: 2, created_by: "opencode-<task-slug>" })
bb_claim_task({ task_id: "<task-id>", agent_id: "opencode-<task-slug>" })
bb_update_task({ task_id: "<task-id>", status: "working" })
```
Fallback:
- If blackboard is unavailable, create a YAMS claim note and proceed.
## Repo Search / Recovery Commands
Common discovery commands:
```bash
yams grep "<pattern>" --cwd .
yams search "$TASK" --limit 20
yams search "task=$TASK" --type keyword --limit 20
```
Session recovery:
```bash
yams search "owner=opencode task=<task>" --type keyword --limit 50
yams search "agent_id=opencode-<task-slug>" --type keyword --limit 50
```
## Repo Structure (Start Here)
- CLI entry points and command wiring: `src/cli/`
- Service layer and command handlers: `src/app/services/`
- Search implementations (grep/semantic): `src/search/`
- Metadata and storage indexing: `src/metadata/`
- Storage engines/backends: `src/storage/`
- Vector DB + embeddings: `src/vector/`
- Daemon client/server/components: `src/daemon/`
- MCP server implementation: `src/mcp/`
- Tests: `tests/`
## Repo Conventions (Condensed)
- Formatting is enforced mechanically by `.clang-format` (LLVM base, 4-space, 100-col, attach braces).
- C++ naming patterns:
- functions/variables: `camelCase`
- types: `PascalCase`
- constants: `kPascalCase`
- member fields: trailing `_`
- files: `snake_case`
- Use `Result<T>` for fallible operations and explicit propagation.
- Prefer `YAMS_HAS_*` feature gates from `include/yams/core/cpp23_features.hpp` over raw compiler checks.
## Testing Conventions
- **Framework**: Catch2 (v3+). All test files end in `_catch2_test.cpp`.
- **Test location**: `tests/unit/<subsystem>/` (e.g., `tests/unit/daemon/`).
- **Build system**: Meson. Register test executables in `tests/meson.build`.
- **Test targets**: Named without `_exe` suffix (e.g., `catch2_dynamic_cap_sentinel`).
- **Compile**: `meson compile -C build/debug -j4 <target_name>`. Never run parallel `meson compile` commands — they contend for the build directory lock.
- **Run**: `build/debug/tests/<target_name>` directly, or `meson test -C build/debug <test_name>`.
- **YAMS_TESTING gate**: Test executables are compiled with `-DYAMS_TESTING=1`. Use `#ifdef YAMS_TESTING` in production headers to expose `testing_*` helpers (e.g., `testing_postIngestBudget`, `testing_notifyWakeup`).
- **Isolation guards**: Use RAII guards for global state (`ProfileGuard`, `EnvGuard`, `HwGuard` from TuneAdvisor). Reset atomics and overrides between test cases.
- **Naming**: Descriptive file names reflecting the feature under test (e.g., `dynamic_cap_sentinel_catch2_test.cpp`, `health_check_isolation_catch2_test.cpp`).
- **TDD workflow**: Write tests first (red), implement fix (green), refactor. Tests should assert post-fix behavior and fail against pre-fix code.
- **DynamicCap sentinel**: `UINT32_MAX` means "unset/no cap". `0` means "cap to zero concurrency". When resetting DynamicCaps in tests, use `UINT32_MAX` (requires `#include <climits>`), not `0`.
## Repo Patterns To Reuse (High Signal)
- `TuneAdvisor`: runtime knob pattern uses static inline atomics and relaxed ordering for advisory reads.
- `InternalEventBus`: typed channels keyed by string names for daemon component coordination.
- `ResourceGovernor`: check admission (`canAdmitWork`, `canScaleUp`, `canLoadModel`) before heavy work.
- `profiling.h`: use `YAMS_*` profiling macros; no-op when Tracy is disabled.
- Async daemon paths use Boost.Asio coroutines (`boost::asio::awaitable<...>`).
## Bug-Bounty Rules (Repo Use)
Apply when `mode=bug-bounty`:
- Stay within stated scope and authorized targets.
- Prefer read-only or low-impact validation first.
- No persistence, destructive payloads, or data exfiltration.
- Redact secrets, tokens, cookies, and personal data before `yams add`.
- Index evidence as short reproducible notes (`source=evidence`) plus sanitized artifacts.
## Ask-First Actions
Always ask before:
- `git push` (index in YAMS first)
- deleting files (index in YAMS first)
- installing new dependencies
- high-impact security testing steps
## Minimal Repo Handoff Template
```text
TASK: $TASK
MODE: $MODE
PBI: $PBI
PHASE: $PHASE
AGENT: opencode-$TASK
CONTEXT FOUND:
- Blackboard: <findings/tasks or unavailable>
- YAMS: <artifact paths/hashes>
ACTIONS:
- <what changed and why>
INDEXED:
- <files/notes indexed or why indexing failed>
- Metadata: mode=$MODE,task=$TASK,phase=$PHASE,owner=opencode,agent_id=opencode-$TASK
NEXT:
- <next step>
USED_CONTEXT:
- <chunk_ids/hashes if known; else unknown>
CITATIONS:
- <artifact names/hashes/paths or none>
```
## When Stuck
- Ask one targeted clarifying question with a recommended default.
- Post a blackboard finding if it helps future agents.
- Prefer small, reversible changes over speculative rewrites.
## Keep This File Lean
- Put generic agent behavior in `docs/prompts/PROMPT-eng-codex.md`.
- Keep this file repo-specific.
- Avoid copying session-specific skill catalogs into this file.