# Agent Instructions โ jmap-types
## ๐ LOCKED CRATE โ EXPLICIT PERMISSION REQUIRED BEFORE ANY CHANGE
This crate's public API, wire format, module layout, type names, field names,
serde attributes, and design conventions are **locked and stabilized**.
**You may NOT, under any circumstances:**
- Add, rename, or remove any public type, field, or variant
- Change any serde attribute, derive, or wire format
- Change constructor signatures or add/remove constructors
- Add, remove, or upgrade dependencies
- Alter `#[non_exhaustive]` annotations
- Modify test oracles or fixture files
- Refactor or "clean up" any existing code
**To make ANY change to this crate** you must first describe the exact change to
the user and receive explicit written approval for that specific change. "Fixing
a bug" or "improving the code" is not sufficient โ stop and report, then wait.
This project uses **bd** (beads) for issue tracking. Run `bd prime` for full workflow context.
## Before Starting Any Work
1. Read `PLAN.md` โ public API, module layout, source material
2. Run `bd ready` โ check for open issues before creating new ones
3. Grep kith-core for the relevant type before implementing from scratch
## What This Is
Shared JMAP wire types for the jmap-* crate family. Minimal deps (serde, serde_json,
thiserror). No async. Both client and server crates depend on this.
## Crate Family Context
```
jmap-types โ this crate
โโโ jmap-server adds dispatcher, axum, tokio
โโโ jmap-mail-types adds RFC 8621 data types
โโโ jmap-chat-types adds Chat extension data types
โโโ (future extensions)
```
When changing a public type or adding a new one, check that downstream crates
(`jmap-server`, `jmap-mail-types`, `jmap-chat-types`) still compile.
## Source Material
Extract from kith-core โ do not rewrite from scratch.
| `JmapRequest`, `JmapResponse`, `Invocation` | `~/PROJECT/kith/crates/kith-core/src/jmap.rs` |
| `JmapError` | `~/PROJECT/kith/crates/kith-core/src/error.rs` |
| `ResultReference`, `Argument<T>` | `~/PROJECT/kith/crates/kith-core/src/resultref.rs` |
| `Id`, `UTCDate`, `State` | `~/PROJECT/kith/crates/kith-core/src/jmap.rs` |
Do NOT copy kith-specific items: `Role`, `Identity`, `AuthError`, `KithError`.
## Spec Reference
```
~/PROJECT/jmap-chat-spec/references/rfc8620.txt โ normative
```
## Non-Interactive Shell Commands
```bash
cp -f source dest mv -f source dest rm -f file
rm -rf directory cp -rf source dest
```
Use `-o BatchMode=yes` for scp/ssh. Use `-y` for apt-get.
## Build & Test
```bash
cargo fmt --all
cargo clippy -- -D warnings
cargo test
RUSTDOCFLAGS="-D warnings" cargo doc --no-deps
```
Run all four before considering any work done.
## Design Constraints (Settled)
| Async | None โ this crate is sync only |
| Unsafe | Forbidden โ `#[forbid(unsafe_code)]` |
| Dependencies | serde, serde_json, thiserror only |
| Error strings | Must match RFC 8620 ยง7.1 verbatim |
| Wire format | camelCase JSON โ `#[serde(rename_all = "camelCase")]` |
## Subagent Guidance
- Spawn subagents for parallel work on independent modules (`id.rs` vs `wire.rs`)
- Never spawn two subagents editing the same file
- Each subagent reads only what it needs โ grep rather than loading full files
- Escalate after 3 failed attempts at the same error
## Restrictions
- Do not commit or push without explicit user approval
- Do not use TodoWrite or markdown task lists โ use `bd create`
- Do not add dependencies beyond serde, serde_json, thiserror
- Do not add async, tokio, or axum
- Do not add kith-specific types (Role, Identity, etc.)
## Beads Issue Tracker
This project uses **bd (beads)** for issue tracking. Run `bd prime` to see full workflow context and commands.
### Quick Reference
```bash
bd ready # Find available work
bd show <id> # View issue details
bd update <id> --claim # Claim work
bd close <id> # Complete work
```
### Rules
- Use `bd` for ALL task tracking โ do NOT use TodoWrite, TaskCreate, or markdown TODO lists
- Run `bd prime` for detailed command reference and session close protocol
- Use `bd remember` for persistent knowledge โ do NOT use MEMORY.md files
## Session Completion
**When ending a work session**, complete ALL steps below.
**MANDATORY WORKFLOW:**
1. **File issues for remaining work** - Create issues for anything that needs follow-up
2. **Run quality gates** (if code changed) - Tests, linters, builds
3. **Update issue status** - Close finished work, update in-progress items
4. **SYNC BEADS DATA**:
```bash
git pull --rebase
bd dolt push
git status
```
5. **Clean up** - Clear stashes, prune remote branches
6. **Report to user** - State what is staged/unstaged; ask for approval before committing or pushing
7. **Hand off** - Provide context for next session
**CRITICAL RULES:**
- git commit and git push require explicit user approval โ never run them without asking
- Stage changes and report what is ready; wait for the user to say "commit" or "push"