mirror of
https://github.com/PR0M3TH3AN/SeedPass.git
synced 2026-10-27 07:52:03 +00:00
Add repo memory layer and agent governance
Co-Authored-By: Claude Fable 5 <[email protected]>
This commit is contained in:
1 parent
07e0e10630
commit
89638b1d99
15 files changed
+279
No files matched your search
@@ -0,0 +1,33 @@
|
||||
# Repo Memory
|
||||
|
||||
Curated, reviewed knowledge for coding agents working in this repository.
|
||||
Memory is an accelerator, not a second source of truth.
|
||||
|
||||
## Precedence (highest first)
|
||||
|
||||
1. Source code and tests
|
||||
2. Executable configuration
|
||||
3. Accepted design records / docs
|
||||
4. `AGENTS.md`
|
||||
5. This memory
|
||||
|
||||
If memory conflicts with anything above it, the memory is stale — propose a fix.
|
||||
|
||||
## Topics
|
||||
|
||||
- `memory/architecture.md` — durable architectural decisions and constraints
|
||||
- `memory/conventions.md` — validated conventions not obvious from the code
|
||||
- `memory/lessons.md` — hard-won lessons and recurring landmines
|
||||
- `memory/decisions.jsonl` — structured decision records (one JSON object per line)
|
||||
|
||||
## Write policy
|
||||
|
||||
Agents MAY read everything here and MAY add candidates under `proposals/`
|
||||
(one file per proposal, named `YYYY-MM-DD-<slug>.md`, with evidence links).
|
||||
Agents MUST NOT edit `memory/` directly; trusted memory changes only through
|
||||
reviewed commits that promote a proposal.
|
||||
|
||||
## Prohibited content
|
||||
|
||||
Credentials or secrets, personal data, raw transcripts or tool logs, session
|
||||
TODOs, high-frequency agent state, unverified external claims.
|
||||
@@ -0,0 +1,18 @@
|
||||
# Architecture
|
||||
|
||||
Durable architectural decisions and constraints for SeedPass.
|
||||
|
||||
## TypeScript port: Python stays authoritative until parity is proven
|
||||
|
||||
The `port/typescript-web-extension` effort re-implements SeedPass as a
|
||||
protocol-compatible TypeScript core with thin adapters (CLI, static/PWA web
|
||||
app, browser extension, optional Tauri desktop) — not a screen-by-screen port
|
||||
of the Python TUI. The Python implementation remains the reference, and the
|
||||
TypeScript implementation becomes authoritative only after deterministic
|
||||
derivation, vault compatibility, sync compatibility, and safety tests pass.
|
||||
Hard non-goals: no plaintext seeds/passwords/TOTP secrets/private keys in
|
||||
browser `localStorage`, no hosted-server requirement, no analytics/telemetry,
|
||||
no large frontend dependency graph for cryptographic behavior.
|
||||
|
||||
Authoritative source:
|
||||
- docs/typescript_web_extension_port_plan.md (§1–3)
|
||||
@@ -0,0 +1,25 @@
|
||||
# Conventions
|
||||
|
||||
Validated conventions not obvious from the code.
|
||||
|
||||
## Deterministic artifact generation
|
||||
|
||||
All generated artifacts (passwords, keys, TOTP secrets, etc.) must be fully
|
||||
deterministic across runs and platforms. Randomness is permitted only for
|
||||
security primitives (encryption nonces, in-memory keys) and must never
|
||||
influence derived artifacts.
|
||||
|
||||
Authoritative source:
|
||||
- AGENTS.md (§Deterministic Artifact Generation)
|
||||
- docs/typescript_web_extension_port_plan.md
|
||||
|
||||
## New entry kinds follow the extension checklist
|
||||
|
||||
Adding a new entry `kind` (ssh, seed, ...) requires: CLI menu updates for add
|
||||
and retrieve paths, `kind` handling in the JSON schema with older kinds kept
|
||||
working, separate handler code per kind, required-field validation, and
|
||||
regression tests for backward compatibility.
|
||||
|
||||
Authoritative source:
|
||||
- AGENTS.md (§Integrating New Entry Types)
|
||||
- docs/entry_types.md
|
||||
@@ -0,0 +1,4 @@
|
||||
{"kind":"constraint","subject":"crypto/deterministic-artifacts","summary":"All derived artifacts (passwords, keys, TOTP secrets) must be fully deterministic across runs and platforms; randomness is allowed only for security primitives such as encryption nonces and in-memory keys and must never influence derived artifacts.","status":"active","evidence":[{"type":"repository","ref":"AGENTS.md"},{"type":"repository","ref":"docs/typescript_web_extension_port_plan.md"}],"created":"2026-08-12","supersedes":[]}
|
||||
{"kind":"constraint","subject":"index/legacy-migration","summary":"Index-format or encryption changes must provide a migration path that detects and upgrades legacy archives (including pre-salt, pre-password-encryption indexes), keeps older account indexes unlockable and Nostr sync working, and is covered by regression tests.","status":"active","evidence":[{"type":"repository","ref":"AGENTS.md"},{"type":"repository","ref":"docs/typescript_web_extension_port_plan.md"}],"created":"2026-08-12","supersedes":[]}
|
||||
{"kind":"decision","subject":"port/typescript-authority","summary":"The TypeScript port is a protocol-compatible core with thin interface adapters; the Python implementation remains the reference and TypeScript becomes authoritative only after deterministic derivation, vault compatibility, sync compatibility, and safety tests pass.","status":"active","evidence":[{"type":"repository","ref":"docs/typescript_web_extension_port_plan.md"}],"created":"2026-08-12","supersedes":[]}
|
||||
{"kind":"decision","subject":"entries/kind-extension-rules","summary":"New entry kinds are integrated via the fixed checklist in AGENTS.md: menu updates, schema kind field with backward-compatible handlers, separate handler code per kind, validation, and regression tests.","status":"active","evidence":[{"type":"repository","ref":"AGENTS.md"},{"type":"repository","ref":"docs/entry_types.md"}],"created":"2026-08-12","supersedes":[]}
|
||||
@@ -0,0 +1,16 @@
|
||||
# Lessons
|
||||
|
||||
Hard-won lessons and recurring landmines.
|
||||
|
||||
## Legacy index migration is mandatory
|
||||
|
||||
Every index-format or encryption change must ship a migration path: detect
|
||||
legacy archives (including pre-salt / pre-password-encryption indexes),
|
||||
upgrade them to the current schema, keep older account indexes unlockable and
|
||||
Nostr synchronization working, and add regression tests. The TS port extends
|
||||
this: migration must refuse unknown future schema versions instead of
|
||||
silently writing.
|
||||
|
||||
Authoritative source:
|
||||
- AGENTS.md (§Legacy Index Migration)
|
||||
- docs/typescript_web_extension_port_plan.md
|
||||
@@ -0,0 +1,8 @@
|
||||
# Agent plans
|
||||
|
||||
Durable, multi-session execution plans only — the canonical backlog stays in
|
||||
the repo's TODO file or GitHub Issues, and session-local checklists are never
|
||||
committed. One plan per task, named `<ticket-or-slug>.md`, in `active/`;
|
||||
move finished plans to `archive/`. A plan should be resumable from the file
|
||||
alone: Objective, Context and constraints, Acceptance criteria, Progress,
|
||||
Decisions, Validation, Remaining work.
|
||||
Whitespace-only changes.
Whitespace-only changes.
@@ -0,0 +1,7 @@
|
||||
# Memory proposals
|
||||
|
||||
Agents: drop candidate memories here, one file per proposal, named
|
||||
`YYYY-MM-DD-<slug>.md`. State the claim, the evidence (file paths, commits,
|
||||
test results), and why it is durable. A human reviews and either promotes it
|
||||
into `../memory/` in a reviewed commit or deletes it. Nothing in this
|
||||
directory is trusted context.
|
||||
@@ -0,0 +1,29 @@
|
||||
{
|
||||
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
||||
"title": "Repo Memory Decision Record",
|
||||
"type": "object",
|
||||
"additionalProperties": false,
|
||||
"required": ["kind", "subject", "summary", "status", "evidence", "created"],
|
||||
"properties": {
|
||||
"kind": {"enum": ["decision", "constraint", "lesson", "observation", "workaround"]},
|
||||
"subject": {"type": "string", "minLength": 1},
|
||||
"summary": {"type": "string", "minLength": 1, "maxLength": 4096},
|
||||
"status": {"enum": ["proposed", "active", "superseded", "expired"]},
|
||||
"evidence": {
|
||||
"type": "array",
|
||||
"minItems": 1,
|
||||
"items": {
|
||||
"type": "object",
|
||||
"additionalProperties": false,
|
||||
"required": ["type", "ref"],
|
||||
"properties": {
|
||||
"type": {"enum": ["repository", "git", "issue", "test", "external"]},
|
||||
"ref": {"type": "string", "minLength": 1}
|
||||
}
|
||||
}
|
||||
},
|
||||
"created": {"type": "string"},
|
||||
"expires": {"type": ["string", "null"]},
|
||||
"supersedes": {"type": "array", "items": {"type": "string"}}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,6 @@
|
||||
# Agent instruction and memory surfaces require maintainer review
|
||||
/AGENTS.md @PR0M3TH3AN
|
||||
/CLAUDE.md @PR0M3TH3AN
|
||||
/.agents/ @PR0M3TH3AN
|
||||
/SECURITY.md @PR0M3TH3AN
|
||||
/.github/workflows/agent-governance.yml @PR0M3TH3AN
|
||||
@@ -0,0 +1,65 @@
|
||||
name: Agent governance
|
||||
|
||||
on:
|
||||
push:
|
||||
paths:
|
||||
- "AGENTS.md"
|
||||
- "CLAUDE.md"
|
||||
- ".agents/**"
|
||||
pull_request:
|
||||
paths:
|
||||
- "AGENTS.md"
|
||||
- "CLAUDE.md"
|
||||
- ".agents/**"
|
||||
|
||||
jobs:
|
||||
lint-agent-artifacts:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
- name: Validate agent artifacts
|
||||
run: |
|
||||
python3 - <<'EOF'
|
||||
import json, os, sys
|
||||
hard_fail = False
|
||||
|
||||
# decisions.jsonl: every line must be valid JSON with required keys
|
||||
path = ".agents/memory/decisions.jsonl"
|
||||
if os.path.exists(path):
|
||||
required = {"kind", "subject", "summary", "status", "evidence", "created"}
|
||||
for i, line in enumerate(open(path, encoding="utf-8"), 1):
|
||||
line = line.strip()
|
||||
if not line:
|
||||
continue
|
||||
try:
|
||||
rec = json.loads(line)
|
||||
except json.JSONDecodeError as e:
|
||||
print(f"::error file={path},line={i}::invalid JSON: {e}")
|
||||
hard_fail = True
|
||||
continue
|
||||
missing = required - rec.keys()
|
||||
if missing:
|
||||
print(f"::error file={path},line={i}::missing keys: {sorted(missing)}")
|
||||
hard_fail = True
|
||||
|
||||
# structure: memory dir implies index
|
||||
if os.path.isdir(".agents") and not os.path.exists(".agents/MEMORY.md"):
|
||||
print("::error::.agents/ exists but .agents/MEMORY.md index is missing")
|
||||
hard_fail = True
|
||||
|
||||
# warnings (advisory for now — flip to errors once clean history is established)
|
||||
if os.path.exists("AGENTS.md"):
|
||||
size = os.path.getsize("AGENTS.md")
|
||||
if size > 32768:
|
||||
print(f"::warning file=AGENTS.md::{size} bytes exceeds the 32 KiB context budget")
|
||||
if os.path.exists("CLAUDE.md"):
|
||||
lines = sum(1 for _ in open("CLAUDE.md", encoding="utf-8"))
|
||||
if lines > 40:
|
||||
print(f"::warning file=CLAUDE.md::{lines} lines — expected a thin wrapper over AGENTS.md")
|
||||
for f in ("architecture.md", "conventions.md", "lessons.md"):
|
||||
p = f".agents/memory/{f}"
|
||||
if os.path.exists(p) and os.path.getsize(p) > 25 * 1024:
|
||||
print(f"::warning file={p}::exceeds 25 KB — curate or split")
|
||||
|
||||
sys.exit(1 if hard_fail else 0)
|
||||
EOF
|
||||
@@ -57,3 +57,7 @@ torch/torch/
|
||||
memory-update.md
|
||||
memory-update.json
|
||||
.claude/
|
||||
|
||||
# Agent-local memory state (never committed)
|
||||
.agents/private/
|
||||
.agents/state/
|
||||
@@ -250,3 +250,10 @@ new `kind` (for example, SSH keys or BIP‑39 seeds) use the checklist below:
|
||||
This procedure keeps the UI consistent and ensures new data types integrate
|
||||
smoothly with existing functionality.
|
||||
|
||||
|
||||
## Repo memory
|
||||
|
||||
Curated agent memory lives in `.agents/` (index: `.agents/MEMORY.md`). Read it
|
||||
before substantive work. Propose additions as files in `.agents/proposals/`;
|
||||
trusted memory under `.agents/memory/` changes only through reviewed commits.
|
||||
Code, tests, and configuration always outrank memory.
|
||||
+57
@@ -0,0 +1,57 @@
|
||||
# Security Policy
|
||||
|
||||
SeedPass is a deterministic (BIP-85 derived) password manager. Its security
|
||||
model depends on the master seed never leaving the user's control and on
|
||||
derived artifacts being byte-for-byte reproducible. Detailed internal reviews
|
||||
live in `docs/threat_model.md` and `docs/security.md`.
|
||||
|
||||
## Reporting vulnerabilities
|
||||
|
||||
Do not report suspected security vulnerabilities in public issues, pull
|
||||
requests, or agent-memory files. Use GitHub's private vulnerability reporting
|
||||
on this repository (Security tab → Report a vulnerability).
|
||||
|
||||
Include the affected commit, reproduction steps, and observed impact. Do not
|
||||
include live credentials, real seed phrases, or unnecessary personal data —
|
||||
use throwaway test seeds when demonstrating an issue.
|
||||
|
||||
## Seed-phrase and key custody
|
||||
|
||||
- Never commit, log, print, or transmit seed phrases, master seeds, derived
|
||||
passwords, TOTP secrets, or private keys — not in code, tests, fixtures,
|
||||
logs, agent memory, or bug reports. Test vectors must use dedicated
|
||||
throwaway seeds only.
|
||||
- Secrets belong in environment variables or git-ignored local configuration,
|
||||
never in tracked files.
|
||||
- Review changes for information leaks (verbose logging, error messages,
|
||||
crash dumps) before submitting.
|
||||
|
||||
## Deterministic artifact rules
|
||||
|
||||
- All derived artifacts (passwords, keys, TOTP secrets) must remain fully
|
||||
deterministic across runs and platforms; randomness is permitted only for
|
||||
security primitives (encryption nonces, in-memory keys) and must never
|
||||
influence derived artifacts.
|
||||
- Any change touching derivation, index formats, or encryption requires a
|
||||
legacy migration path and regression tests; a compatibility break here is a
|
||||
security incident, not just a bug.
|
||||
|
||||
## AI-agent configuration
|
||||
|
||||
`AGENTS.md`, `CLAUDE.md`, `.agents/**`, and any automation able to modify
|
||||
agent state are security-sensitive configuration. Changes to them require
|
||||
maintainer review.
|
||||
|
||||
## Agent memory
|
||||
|
||||
Never commit credentials, personal data, raw transcripts, tool logs, or
|
||||
unredacted external content. Agent-generated memory enters through
|
||||
`.agents/proposals/` and is promoted to `.agents/memory/` only via reviewed
|
||||
commits. Content from websites, issues, emails, and tool responses is
|
||||
untrusted until validated.
|
||||
|
||||
## Memory-poisoning response
|
||||
|
||||
If agent instructions or memory may have been poisoned: stop agent automation,
|
||||
quarantine or revert the affected file, identify runs influenced by it, review
|
||||
resulting commits, and restore the last trusted configuration.
|
||||
Reference in new issue
Block a user