tidaldb/.sdlc/guidance.md
jordan 5ceef74f3b chore: bootstrap SDLC state machine for tidalDB
- Initialize .sdlc/ with config, guidance, and state machine
- Register M0-M8 as released milestones (full engine track history)
- Seed M9 (Community Sync & Revocation) and M10 (Governance & Agent Rights) with features
- Seed product milestones P0-P4 and PG1 gate with features from existing planning docs
- Add Team section to AGENTS.md (tidal-engineer, tidal-visionary, tidal-researcher, tidal-storyteller)
- Add knowledge-librarian agent for .sdlc/knowledge/ curation
- Gitignore .sdlc/telemetry.redb (volatile binary state)
- Add .ai/ scaffold (project knowledge index)
2026-03-03 00:41:41 -07:00

9.8 KiB

Engineering Guidance

Read this before any implementation, bug fix, or test action.

North Star: Vision & Architecture

Before writing a single line of code, read:

  • VISION.mdwhat we are building and why. Every feature, every tradeoff, every design decision must serve this vision. If a proposed change works against it, surface it before proceeding.
  • ARCHITECTURE.mdhow the system works. Components, interfaces, data flows, and sequence diagrams showing how everything fits together. Code must conform to the architecture — never silently deviate.

These are the guiding light. When in doubt about any decision, return to them first.

1. Build It Right

Do it the proper way — not the quick way. The correct solution is one that will still be correct in six months. Favor proven patterns, clear abstractions, and designs that are easy to understand and extend. Never trade long-term correctness for short-term convenience.

2. Understand Bugs Before Fixing Them

Before touching a bug, trace its root cause holistically — read surrounding code, follow the data flow, understand why it broke. Fix the cause, not the symptom. A patch that introduces a new bug in three months is worse than no fix.

3. Enterprise Quality Bar

We build enterprise-grade software. The bar is Steve Jobs: relentless attention to detail, nothing ships that embarrasses us, correctness and reliability are non-negotiable. If something isn't right, make it right.

4. Philosophy of Software Design

Follow John Ousterhout's principles: deep modules, minimal exposed complexity, interfaces that hide implementation detail, and code readable in isolation. Complexity is the enemy — fight it at every level.

5. Meaningful, Reliable, Fast Tests

Tests must earn their place. When a test breaks, choose deliberately:

  • Remove — if it adds little value or tests implementation detail
  • Rewrite — if it was poorly structured for the scenario
  • Refactor — if the interface it tests changed legitimately
  • Quick-fix — only if the fix is obvious and the test is clearly valuable

Never keep a flaky or low-value test just to preserve coverage numbers.

6. Using sdlc

All state lives in .sdlc/ YAML files. Never edit them directly — use the CLI. Direct edits cause deserialization failures and corrupt state.

Action Command
Create feature sdlc feature create <slug> --title "…"
Get next action sdlc next --for <slug> --json
Write artifact Write Markdown to output_path from the directive
Submit draft sdlc artifact draft <slug> <type>
Approve artifact sdlc artifact approve <slug> <type>
Reject artifact sdlc artifact reject <slug> <type>
Merge (release feature) sdlc merge <slug>
Add task sdlc task add <slug> "title"
Start task sdlc task start <slug> <task-id>
Complete task sdlc task complete <slug> <task-id>
Block task sdlc task block <slug> <task-id> "reason"
Add comment sdlc comment create <slug> "body"
Show feature sdlc feature show <slug> --json
List tasks sdlc task list <slug>
Project state sdlc state
Survey milestone waves sdlc project prepare [--milestone <slug>]
Mark milestone prepared sdlc milestone mark-prepared <slug>
Project phase sdlc project status
Escalate to human sdlc escalate create --kind <kind> --title "…" --context "…" [--feature <slug>]
List escalations sdlc escalate list
Resolve escalation sdlc escalate resolve <id> "resolution note"
Knowledge base status sdlc knowledge status
List knowledge entries sdlc knowledge list [--code-prefix <code>]
Search knowledge base sdlc knowledge search <query>
Show knowledge entry sdlc knowledge show <slug>
Add knowledge entry sdlc knowledge add --title "..." --code <code> --content "..."
Show catalog taxonomy sdlc knowledge catalog show
Seed from workspaces sdlc knowledge librarian init

Phases advance automatically from artifact approvals — never call sdlc feature transition. The only files you write directly are Markdown artifacts to output_path.

7. SDLC Tool Suite

Project-scoped TypeScript tools in .sdlc/tools/ — callable by agents and humans during any lifecycle phase. Read .sdlc/tools/tools.md for the full list, or each tool's README.md for detailed docs.

Tool Command Purpose
ama sdlc tool run ama --setup then sdlc tool run ama --question "..." Search codebase for relevant file excerpts

Build a custom tool: sdlc tool scaffold <name> "<description>" Update the manifest after adding/changing tools: sdlc tool sync

8. Project Secrets

Encrypted secrets live in .sdlc/secrets/. The encrypted files (.age) and key name sidecars (.meta.yaml) are safe to commit. Plain .env.* files must never be committed — they are gitignored automatically.

Action Command
List environments sdlc secrets env list
List key names (no decrypt) sdlc secrets env names <env>
Load secrets into shell eval $(sdlc secrets env export <env>)
Set a secret sdlc secrets env set <env> KEY=value
List authorized keys sdlc secrets keys list
Add a key sdlc secrets keys add --name <n> --key "$(cat ~/.ssh/id_ed25519.pub)"
Rekey after key change sdlc secrets keys rekey

For agents: Check sdlc secrets env names <env> to see which variables are available. Load the matching env before any task or build step that needs credentials:

  • Feature/local work → eval $(sdlc secrets env export development)
  • Deploy tasks → eval $(sdlc secrets env export production)

Never log or hardcode secret values. Reference by env var name only (e.g. $ANTHROPIC_API_KEY).

In builds: The vault is for local and agent use only. CI/CD platforms (GitHub Actions, etc.) manage their own secrets separately — agents cannot inject into platform CI secrets. If a build needs a credential that must live in CI, use secret_request escalation (§9).

9. Escalating to the Human

Escalations are for actions only a human can take. They are rare and deliberate — not a general-purpose communication channel. Before escalating, ask: "Can I resolve this myself?" If yes, do it. If not, escalate.

Kind When to escalate Example
secret_request Need a credential or env var that doesn't exist "Add STRIPE_API_KEY to production env in Secrets page"
question Strategic decision with no clear right answer "Should checkout support crypto payments?"
vision Product direction is undefined or contradictory "No vision defined — what is the milestone goal?"
manual_test Testing requires physical interaction "Verify Google OAuth login in production browser"

Do NOT escalate: code review findings, spec ambiguity you can resolve, implementation decisions, anything an agent can handle autonomously.

How to escalate:

sdlc escalate create \
  --kind secret_request \
  --title "Need OPENAI_API_KEY in .env.production" \
  --context "AI summary feature calls OpenAI in prod. Dev works with a mock. Need the real key to test end-to-end." \
  --feature my-ai-feature   # omit if not feature-specific

After creating: stop the current run immediately. If --feature was specified, the feature is now gated by an auto-added Blocker comment. The escalation appears in the Dashboard under "Needs Your Attention". The human must act before the feature can proceed.

The difference from comment --flag blocker:

  • comment --flag blocker — an implementation concern the next agent cycle might fix
  • sdlc escalate create — an action only a human can perform; stop until resolved

10. Frontend API Calls

Never hardcode http://localhost:PORT in frontend code — CORS blocks cross-origin requests in development and the address is wrong in production.

Pattern:

  • Use a relative base URL (/api) in all fetch/client code
  • Configure the dev server proxy (Vite server.proxy, Next.js rewrites, webpack devServer.proxy) to forward /apihttp://localhost:<API_PORT>
  • In production, frontend and API share the same origin — relative paths resolve correctly

When fixing a CORS error or adding a new API client, apply this pattern instead of adding CORS headers or introducing environment-specific URLs.

11. Production Safety

This is a live system with real users. Every change must leave the codebase healthier — not just correct, but cleaner.

Migrations: Add defensive deserialization before removing old formats. Never the reverse. Test that both old and new formats load cleanly before shipping.

Stability hazards to avoid:

  • Infinite loops: any polling, retry, or SSE reconnect loop must have a termination condition and backoff
  • Connection exhaustion: SSE subscriptions, DB connections, and broadcast channels must be bounded and cleaned up on drop
  • Complex failure modes: prefer simple, flat control flow over deeply nested async chains — when it breaks at 3am, you must be able to read the trace

Quality bar: if a change makes the code harder to reason about, makes logs less useful, or adds a failure mode with no clear recovery path — stop and reconsider. Simpler is always better.

12. Project Guidelines

Before writing implementation code, check if .sdlc/guidelines/index.yaml exists. If it does, read it and load any guidelines whose scope overlaps with the work at hand.

# Check
ls .sdlc/guidelines/index.yaml 2>/dev/null && cat .sdlc/guidelines/index.yaml

Guidelines contain ⚑ Rule: statements with ✓ Good: and ✗ Bad: code examples derived from this codebase. They are authoritative — if your implementation would violate a rule, fix the approach before proceeding, not after review catches it.

If no index exists, no guidelines have been published yet. Proceed normally.