Files

5.7 KiB

AGENTS.md

Operating instructions for opencode agents working in this repo. opencode auto-loads this file as instructions, overriding the built-in defaults for this project. Custom agents in .opencode/agents/ inherit these rules unless their own prompts say otherwise.

Repo posture

This repo is in Phase 1 (Implementation) per docs/sdd_process.md. Phase 0 concluded with the converged recommendation and the accepted ADRs (docs/architecture/decisions/, docs/architecture/README.md); the implementation plan (docs/plans/implementation.md) decomposes waves of work into task files in tasks/. Three crates exist (ADR-001's Cargo workspace split): alkstore (core — the contract artifact), alkstore-sqlite, alkstore-postgres. Work proceeds task-by-task from tasks/; check a task's status and depends_on before picking it up.

The architecture documents — docs/architecture/ (core-contract.md, the ADRs, the engine specs) — are the normative spec for code work. Where code and ADR disagree, the ADR wins: fix the code, or (if the ADR is genuinely wrong for a reason no ADR anticipated) raise the discrepancy with the user before deviating. ADR amendments pre-implementation are class-1 events under ADR-017 §2 — but that class terminates at first release, so the window is now, not forever.

Git Workflow

Commit and push when reasonable. When a change is complete and verified, commit and push to origin/main without asking. This overrides the built-in default of "only commit when explicitly asked." "Verified" means the Verification Commands below pass for any crate the change touches.

Exceptions — do not commit or push without asking:

  • The change is exploratory / speculative (you're not sure the user wants it kept)
  • The user is actively reviewing the diff and may ask for changes
  • You'd be force-pushing, amending a pushed commit, creating an empty commit, or skipping hooks

Never commit secrets, keys, or credentials. If a commit fails or hooks reject it, fix the issue and create a new commit — do not amend the failed one.

Git identity is preconfigured (glm-5.3-flash <glm-5.3-flash@alk.dev>). Do not change git config, skip hooks, or use git commit -i.

Code conventions

Family-standard and pre-committed; the ADRs carry the load-bearing decisions:

  • Rust crate, tokio async runtime, thiserror error types, no panics in library code, no unwrap()/expect() outside tests.
  • No comments in code unless the user explicitly asks. Doc comments (///, //!) are fine on public API — and required where a task pins semantics into doc text (core's docs are part of the contract). Inline // comments only when a non-obvious safety/correctness constraint would otherwise be missed, or the user asks.
  • Module-per-file under src/, re-exported from src/lib.rs; public API surface is the lib re-exports.
  • No CI wiring (manual CI per docs/plans/implementation.md).
  • #[non_exhaustive] policy is ADR-017 §3's: on consumer-read types (Error, StreamEvent, Job, Schedule, Wake), never on opts structs consumers construct.
  • Core (alkstore) has no driver dependencies, ever (ADR-001); payload encoding's serde/serde_json are the sole core deps (ADR-020 §4).
  • Engine crates depend on core with the versioned path pin (ADR-017 §4.1) — never the reverse.

Task files

Every task file in tasks/ carries categorical estimates (scope, risk, impact, level) — per docs/sdd_process.md these are structurally required, not optional metadata. On completion: update the task's status to completed, and fill its Notes (decisions of record the implementation made that the description didn't pin) and Summary (what landed, verified how) sections — the next agent reads those instead of re-deriving them.

Verification Commands

Standard Rust gates, run from the workspace root; they are the merge gate:

cargo build            # workspace compiles
cargo test             # workspace tests (task-scoped: cargo test -p <crate>)
cargo clippy --all-targets -- -D warnings
cargo fmt --check

No fuzzing is adopted (no fuzz corpus replay gate — the alksocks/alktty/alktunnels fuzz posture was not carried into this crate's plan); revisit only if a task or ADR introduces it.

Architecture Context

  • docs/architecture/README.md — the decision index; start here.
  • docs/architecture/core-contract.md — the contract of record for the core crate's surface (the traits, types, error taxonomy, naming / reserved namespace, delivery-guarantee table, verification backlog).
  • docs/architecture/decisions/ — the accepted ADRs (ADR-001..021).
  • docs/architecture/open-questions.md — the open-question register; resolved OQs cite their ADRs. Numbering is stable — never renumber; append.
  • docs/plans/implementation.md — the wave-based implementation plan; tasks/ decomposes its waves.
  • docs/research/ — the Phase 0 record (phase-0.md, POC specs and findings, the honker/pgboss reference reads, consumer-inventory.md). Reading it is background, not obligation; the ADRs supersede it where they disagree. New consumer needs still get a docs/research/consumer-inventory.md row before any scope decision assumes them (the row-first gate, ADR-017 §2).
  • The SDD process and agent defs were copied from downstream projects (alkblobs) in the workspace; project-specific stale references were cleaned at Phase 0 setup (2026-10-03). If you find a section that assumes another crate's machinery, fix it rather than working around it — same discipline as stale TODOs.
  • If a TODO or doc reference cites a design direction that a later ADR or decision rejected, the reference is stale — remove it and align; do not implement the rejected design.