waypoint-codex 0.13.3 → 0.15.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -53,8 +53,7 @@ That keeps the default conversation focused on diagnosis, progress, and verifica
53
53
 
54
54
  Waypoint scaffolds a Codex-friendly repo around a few core pieces:
55
55
 
56
- - `AGENTS.md` for the startup contract
57
- - `.waypoint/MEMORY.md` for durable user/team preferences and collaboration context
56
+ - `AGENTS.md` for the project-scoped startup contract and durable repo guidance
58
57
  - `.waypoint/WORKSPACE.md` for live operational state
59
58
  - `.waypoint/docs/` for long-lived project docs
60
59
  - `.waypoint/plans/` for durable plan documents
@@ -72,12 +71,16 @@ The philosophy is simple:
72
71
  - investigation before status narration
73
72
  - structured workflows that stay in their own tools
74
73
 
74
+ By default, Waypoint routes docs from `.waypoint/docs/` and plans from `.waypoint/plans/`.
75
+ If your repo keeps routable docs elsewhere, you can add more explicit roots in `.waypoint/config.toml` with `docs_dirs` and `plans_dirs`.
76
+ Waypoint scans each configured root recursively and only includes Markdown files with valid Waypoint frontmatter.
77
+
75
78
  ## Best fit
76
79
 
77
80
  Waypoint is most useful when you want:
78
81
 
79
82
  - multi-session continuity in a real repo
80
- - a durable memory structure for agents
83
+ - clear separation between cross-project user guidance and repo-specific guidance
81
84
  - a cleaner default collaboration style
82
85
  - optional planning, review, QA, and release workflows that travel with the project
83
86
 
@@ -104,7 +107,6 @@ repo/
104
107
  │ └── skills/
105
108
  └── .waypoint/
106
109
  ├── DOCS_INDEX.md
107
- ├── MEMORY.md
108
110
  ├── TRACKS_INDEX.md
109
111
  ├── WORKSPACE.md
110
112
  ├── docs/
@@ -117,6 +119,20 @@ repo/
117
119
 
118
120
  From there, start your Codex session in the repo and follow the generated bootstrap in `AGENTS.md`.
119
121
 
122
+ If you want to add more routable roots, extend `.waypoint/config.toml` like this:
123
+
124
+ ```toml
125
+ docs_dirs = [
126
+ ".waypoint/docs",
127
+ "services/app/docs",
128
+ ]
129
+
130
+ plans_dirs = [
131
+ ".waypoint/plans",
132
+ "services/app/plans",
133
+ ]
134
+ ```
135
+
120
136
  ## Built-in skills
121
137
 
122
138
  Waypoint ships a strong default skill pack for real coding work:
@@ -130,6 +146,7 @@ Waypoint ships a strong default skill pack for real coding work:
130
146
  - `conversation-retrospective`
131
147
  - `frontend-ship-audit`
132
148
  - `backend-ship-audit`
149
+ - `merge-ready-owner`
133
150
  - `workspace-compress`
134
151
  - `pre-pr-hygiene`
135
152
  - `pr-review`
@@ -147,7 +164,7 @@ Waypoint scaffolds these reviewer agents by default:
147
164
  - `code-reviewer`
148
165
  - `plan-reviewer`
149
166
 
150
- They are available for deliberate second passes.
167
+ They are available for deliberate second passes and for ownership workflows like `merge-ready-owner`.
151
168
 
152
169
  ## What makes Waypoint different
153
170
 
@@ -156,7 +173,7 @@ Waypoint is opinionated, but explicit:
156
173
  - state lives in files you can inspect
157
174
  - docs routing is generated, not guessed from memory
158
175
  - the default contract tells the agent to investigate first
159
- - durable memory is separated into user/team memory, live workspace state, project docs, and plan docs
176
+ - durable guidance is separated into user-scoped AGENTS, project-scoped AGENTS, live workspace state, project docs, and plan docs
160
177
  - visual explanation stays lightweight: Mermaid in chat and screenshots from real UI inspection
161
178
  - heavier workflows stay in optional skills
162
179
 
package/dist/src/core.js CHANGED
@@ -1,13 +1,12 @@
1
- import { existsSync, mkdirSync, readFileSync, readdirSync, rmSync, statSync, writeFileSync, } from "node:fs";
1
+ import { existsSync, mkdirSync, readFileSync, readdirSync, realpathSync, rmSync, statSync, writeFileSync, } from "node:fs";
2
2
  import path from "node:path";
3
3
  import * as TOML from "@iarna/toml";
4
4
  import { renderDocsIndex } from "./docs-index.js";
5
5
  import { renderTracksIndex } from "./track-index.js";
6
- import { readTemplate, renderWaypointConfig, MANAGED_BLOCK_END, MANAGED_BLOCK_START, templatePath } from "./templates.js";
6
+ import { defaultWaypointConfig, readTemplate, renderWaypointConfig, MANAGED_BLOCK_END, MANAGED_BLOCK_START, templatePath, } from "./templates.js";
7
7
  const DEFAULT_CONFIG_PATH = ".waypoint/config.toml";
8
8
  const DEFAULT_DOCS_DIR = ".waypoint/docs";
9
9
  const DEFAULT_DOCS_INDEX = ".waypoint/DOCS_INDEX.md";
10
- const DEFAULT_MEMORY = ".waypoint/MEMORY.md";
11
10
  const DEFAULT_PLANS_DIR = ".waypoint/plans";
12
11
  const DEFAULT_TRACK_DIR = ".waypoint/track";
13
12
  const DEFAULT_TRACKS_INDEX = ".waypoint/TRACKS_INDEX.md";
@@ -36,11 +35,11 @@ const LEGACY_WAYPOINT_GITIGNORE_RULES = new Set([
36
35
  ".agents/skills/frontend-ship-audit/",
37
36
  ".agents/skills/backend-ship-audit/",
38
37
  ".agents/skills/conversation-retrospective/",
38
+ ".agents/skills/merge-ready-owner/",
39
39
  ".agents/skills/workspace-compress/",
40
40
  ".agents/skills/pre-pr-hygiene/",
41
41
  ".agents/skills/pr-review/",
42
42
  ".waypoint/config.toml",
43
- ".waypoint/MEMORY.md",
44
43
  ".waypoint/README.md",
45
44
  ".waypoint/SOUL.md",
46
45
  ".waypoint/WORKSPACE.md",
@@ -67,6 +66,7 @@ const SHIPPED_SKILL_NAMES = [
67
66
  "adversarial-review",
68
67
  "break-it-qa",
69
68
  "conversation-retrospective",
69
+ "merge-ready-owner",
70
70
  "workspace-compress",
71
71
  "pre-pr-hygiene",
72
72
  "pr-review",
@@ -84,18 +84,75 @@ const TIMESTAMPED_WORKSPACE_SECTIONS = new Set([
84
84
  "## Done Recently",
85
85
  ]);
86
86
  const TIMESTAMPED_ENTRY_PATTERN = /^(?:[-*]|\d+\.)\s+\[\d{4}-\d{2}-\d{2} \d{2}:\d{2} [A-Z]{2,5}\]/;
87
+ function configuredRootDirs(projectRoot, roots, legacyRoot, fallbackRoot) {
88
+ const configuredRoots = roots && roots.length > 0
89
+ ? roots
90
+ : legacyRoot
91
+ ? [legacyRoot]
92
+ : [fallbackRoot];
93
+ const normalizedRoots = [];
94
+ const seen = new Set();
95
+ for (const root of configuredRoots) {
96
+ const trimmedRoot = root.trim();
97
+ if (trimmedRoot.length === 0) {
98
+ continue;
99
+ }
100
+ const resolvedRoot = path.resolve(projectRoot, trimmedRoot);
101
+ let dedupeKey = path.normalize(resolvedRoot);
102
+ if (existsSync(resolvedRoot)) {
103
+ try {
104
+ dedupeKey = realpathSync(resolvedRoot);
105
+ }
106
+ catch {
107
+ dedupeKey = path.normalize(resolvedRoot);
108
+ }
109
+ }
110
+ if (seen.has(dedupeKey)) {
111
+ continue;
112
+ }
113
+ seen.add(dedupeKey);
114
+ normalizedRoots.push(resolvedRoot);
115
+ }
116
+ return normalizedRoots.length > 0 ? normalizedRoots : [path.resolve(projectRoot, fallbackRoot)];
117
+ }
118
+ function docsRootDirs(projectRoot, config) {
119
+ return configuredRootDirs(projectRoot, config?.docs_dirs, config?.docs_dir, DEFAULT_DOCS_DIR);
120
+ }
121
+ function plansRootDirs(projectRoot, config) {
122
+ return configuredRootDirs(projectRoot, config?.plans_dirs, config?.plans_dir, DEFAULT_PLANS_DIR);
123
+ }
124
+ function docsSectionHeading(projectRoot, dir) {
125
+ const relativePath = path.relative(projectRoot, dir).split(path.sep).join("/");
126
+ const normalizedPath = relativePath.length === 0 ? "." : relativePath;
127
+ return normalizedPath.endsWith("/") ? normalizedPath : `${normalizedPath}/`;
128
+ }
87
129
  function docsIndexSections(projectRoot, config) {
88
130
  return [
89
- {
90
- heading: ".waypoint/docs/",
91
- dir: path.join(projectRoot, config?.docs_dir ?? DEFAULT_DOCS_DIR),
92
- },
93
- {
94
- heading: ".waypoint/plans/",
95
- dir: path.join(projectRoot, config?.plans_dir ?? DEFAULT_PLANS_DIR),
96
- },
131
+ ...docsRootDirs(projectRoot, config).map((dir) => ({
132
+ heading: docsSectionHeading(projectRoot, dir),
133
+ dir,
134
+ })),
135
+ ...plansRootDirs(projectRoot, config).map((dir) => ({
136
+ heading: docsSectionHeading(projectRoot, dir),
137
+ dir,
138
+ })),
97
139
  ];
98
140
  }
141
+ function buildWaypointConfig(projectRoot, existingConfig, options) {
142
+ const defaults = defaultWaypointConfig({ profile: options.profile });
143
+ return {
144
+ version: existingConfig?.version ?? defaults.version,
145
+ profile: options.profile,
146
+ workspace_file: existingConfig?.workspace_file ?? defaults.workspace_file,
147
+ docs_dirs: configuredRootDirs(projectRoot, existingConfig?.docs_dirs, existingConfig?.docs_dir, DEFAULT_DOCS_DIR).map((dir) => path.relative(projectRoot, dir).split(path.sep).join("/")),
148
+ plans_dirs: configuredRootDirs(projectRoot, existingConfig?.plans_dirs, existingConfig?.plans_dir, DEFAULT_PLANS_DIR).map((dir) => path.relative(projectRoot, dir).split(path.sep).join("/")),
149
+ docs_index_file: existingConfig?.docs_index_file ?? defaults.docs_index_file,
150
+ features: {
151
+ repo_skills: existingConfig?.features?.repo_skills ?? defaults.features?.repo_skills,
152
+ docs_index: existingConfig?.features?.docs_index ?? defaults.features?.docs_index,
153
+ },
154
+ };
155
+ }
99
156
  function ensureDir(dirPath) {
100
157
  mkdirSync(dirPath, { recursive: true });
101
158
  }
@@ -120,13 +177,8 @@ function migrateLegacyRootFiles(projectRoot) {
120
177
  if (existsSync(legacyWorkspace) && !existsSync(newWorkspace)) {
121
178
  writeText(newWorkspace, readFileSync(legacyWorkspace, "utf8"));
122
179
  }
123
- const legacyMemory = path.join(projectRoot, "MEMORY.md");
124
- const newMemory = path.join(projectRoot, DEFAULT_MEMORY);
125
- if (existsSync(legacyMemory) && !existsSync(newMemory)) {
126
- writeText(newMemory, readFileSync(legacyMemory, "utf8"));
127
- }
128
180
  removePathIfExists(legacyWorkspace);
129
- removePathIfExists(legacyMemory);
181
+ removePathIfExists(path.join(projectRoot, "MEMORY.md"));
130
182
  removePathIfExists(path.join(projectRoot, "DOCS_INDEX.md"));
131
183
  }
132
184
  function appendGitignoreSnippet(projectRoot) {
@@ -288,6 +340,7 @@ function scaffoldOptionalCodex(projectRoot) {
288
340
  export function initRepository(projectRoot, options) {
289
341
  ensureDir(projectRoot);
290
342
  migrateLegacyRootFiles(projectRoot);
343
+ const config = buildWaypointConfig(projectRoot, loadWaypointConfig(projectRoot), options);
291
344
  // Any Waypoint-owned path removed from the scaffold should be added here
292
345
  // so `waypoint init` / `waypoint upgrade` can actively prune stale copies.
293
346
  for (const deprecatedPath of [
@@ -315,6 +368,7 @@ export function initRepository(projectRoot, options) {
315
368
  ".codex/agents/implementer.toml",
316
369
  ".waypoint/agents",
317
370
  ".waypoint/automations",
371
+ ".waypoint/MEMORY.md",
318
372
  ".waypoint/rules",
319
373
  ".waypoint/state",
320
374
  ]) {
@@ -323,11 +377,8 @@ export function initRepository(projectRoot, options) {
323
377
  writeText(path.join(projectRoot, ".waypoint/README.md"), readTemplate(".waypoint/README.md"));
324
378
  writeText(path.join(projectRoot, ".waypoint/SOUL.md"), readTemplate(".waypoint/SOUL.md"));
325
379
  writeText(path.join(projectRoot, ".waypoint/agent-operating-manual.md"), readTemplate(".waypoint/agent-operating-manual.md"));
326
- writeIfMissing(path.join(projectRoot, DEFAULT_MEMORY), readTemplate(".waypoint/MEMORY.md"));
327
380
  scaffoldWaypointOptionalTemplates(projectRoot);
328
- writeText(path.join(projectRoot, DEFAULT_CONFIG_PATH), renderWaypointConfig({
329
- profile: options.profile,
330
- }));
381
+ writeText(path.join(projectRoot, DEFAULT_CONFIG_PATH), renderWaypointConfig(config));
331
382
  writeIfMissing(path.join(projectRoot, DEFAULT_WORKSPACE), readTemplate("WORKSPACE.md"));
332
383
  ensureDir(path.join(projectRoot, DEFAULT_DOCS_DIR));
333
384
  ensureDir(path.join(projectRoot, DEFAULT_PLANS_DIR));
@@ -339,14 +390,15 @@ export function initRepository(projectRoot, options) {
339
390
  scaffoldSkills(projectRoot);
340
391
  scaffoldOptionalCodex(projectRoot);
341
392
  appendGitignoreSnippet(projectRoot);
342
- const docsIndex = renderDocsIndex(projectRoot, docsIndexSections(projectRoot));
393
+ const docsIndexPath = path.join(projectRoot, config.docs_index_file ?? DEFAULT_DOCS_INDEX);
394
+ const docsIndex = renderDocsIndex(projectRoot, docsIndexSections(projectRoot, config));
343
395
  const tracksIndex = renderTracksIndex(projectRoot, path.join(projectRoot, DEFAULT_TRACK_DIR));
344
- writeText(path.join(projectRoot, DEFAULT_DOCS_INDEX), `${docsIndex.content}\n`);
396
+ writeText(docsIndexPath, `${docsIndex.content}\n`);
345
397
  writeText(path.join(projectRoot, DEFAULT_TRACKS_INDEX), `${tracksIndex.content}\n`);
346
398
  return [
347
399
  "Initialized Waypoint scaffold",
348
400
  "Installed managed AGENTS block",
349
- "Created .waypoint/MEMORY.md, .waypoint/WORKSPACE.md, .waypoint/docs/, .waypoint/plans/, and .waypoint/track/ scaffold",
401
+ "Created .waypoint/WORKSPACE.md, .waypoint/docs/, .waypoint/plans/, and .waypoint/track/ scaffold",
350
402
  "Installed repo-local Waypoint skills",
351
403
  "Installed coding/reviewer agents and project Codex config",
352
404
  "Generated .waypoint/DOCS_INDEX.md and .waypoint/TRACKS_INDEX.md",
@@ -458,7 +510,6 @@ export function doctorRepository(projectRoot) {
458
510
  }
459
511
  }
460
512
  for (const requiredFile of [
461
- path.join(projectRoot, DEFAULT_MEMORY),
462
513
  path.join(projectRoot, ".waypoint", "SOUL.md"),
463
514
  path.join(projectRoot, ".waypoint", "agent-operating-manual.md"),
464
515
  path.join(projectRoot, ".waypoint", "scripts", "prepare-context.mjs"),
@@ -476,27 +527,33 @@ export function doctorRepository(projectRoot) {
476
527
  }
477
528
  }
478
529
  const docsIndexPath = path.join(projectRoot, config.docs_index_file ?? DEFAULT_DOCS_INDEX);
479
- const docsDir = path.join(projectRoot, config.docs_dir ?? DEFAULT_DOCS_DIR);
480
- const plansDir = path.join(projectRoot, config.plans_dir ?? DEFAULT_PLANS_DIR);
530
+ const configuredDocsDirs = docsRootDirs(projectRoot, config);
531
+ const configuredPlansDirs = plansRootDirs(projectRoot, config);
481
532
  const docsIndex = renderDocsIndex(projectRoot, docsIndexSections(projectRoot, config));
482
533
  const trackDir = path.join(projectRoot, DEFAULT_TRACK_DIR);
483
534
  const tracksIndexPath = path.join(projectRoot, DEFAULT_TRACKS_INDEX);
484
535
  const tracksIndex = renderTracksIndex(projectRoot, trackDir);
485
- if (!existsSync(docsDir)) {
536
+ for (const docsDir of configuredDocsDirs) {
537
+ if (existsSync(docsDir)) {
538
+ continue;
539
+ }
486
540
  findings.push({
487
541
  severity: "error",
488
542
  category: "docs",
489
- message: ".waypoint/docs/ directory is missing.",
490
- remediation: "Run `waypoint init` to scaffold docs.",
543
+ message: `${docsSectionHeading(projectRoot, docsDir)} directory is missing.`,
544
+ remediation: "Create the configured docs directory or update `.waypoint/config.toml`.",
491
545
  paths: [docsDir],
492
546
  });
493
547
  }
494
- if (!existsSync(plansDir)) {
548
+ for (const plansDir of configuredPlansDirs) {
549
+ if (existsSync(plansDir)) {
550
+ continue;
551
+ }
495
552
  findings.push({
496
553
  severity: "error",
497
554
  category: "docs",
498
- message: ".waypoint/plans/ directory is missing.",
499
- remediation: "Run `waypoint init` to scaffold plans.",
555
+ message: `${docsSectionHeading(projectRoot, plansDir)} directory is missing.`,
556
+ remediation: "Create the configured plans directory or update `.waypoint/config.toml`.",
500
557
  paths: [plansDir],
501
558
  });
502
559
  }
@@ -1,4 +1,4 @@
1
- import { readFileSync, existsSync, readdirSync, statSync } from "node:fs";
1
+ import { existsSync, readFileSync, readdirSync, realpathSync } from "node:fs";
2
2
  import path from "node:path";
3
3
  const SKIP_DIRS = new Set([
4
4
  ".git",
@@ -50,18 +50,25 @@ function parseFrontmatter(filePath) {
50
50
  }
51
51
  return { summary, lastUpdated, readWhen };
52
52
  }
53
- function walkDocs(projectRoot, currentDir, output, invalid) {
54
- for (const entry of readdirSync(currentDir)) {
55
- const fullPath = path.join(currentDir, entry);
56
- const stat = statSync(fullPath);
57
- if (stat.isDirectory()) {
58
- if (SKIP_DIRS.has(entry)) {
53
+ function walkDocs(projectRoot, currentDir, output, invalid, visitedDirs) {
54
+ const resolvedCurrentDir = realpathSync(currentDir);
55
+ if (visitedDirs.has(resolvedCurrentDir)) {
56
+ return;
57
+ }
58
+ visitedDirs.add(resolvedCurrentDir);
59
+ for (const entry of readdirSync(currentDir, { withFileTypes: true })) {
60
+ if (entry.isSymbolicLink()) {
61
+ continue;
62
+ }
63
+ const fullPath = path.join(currentDir, entry.name);
64
+ if (entry.isDirectory()) {
65
+ if (SKIP_DIRS.has(entry.name)) {
59
66
  continue;
60
67
  }
61
- walkDocs(projectRoot, fullPath, output, invalid);
68
+ walkDocs(projectRoot, fullPath, output, invalid, visitedDirs);
62
69
  continue;
63
70
  }
64
- if (!entry.endsWith(".md") || SKIP_NAMES.has(entry)) {
71
+ if (!isMarkdownDoc(entry)) {
65
72
  continue;
66
73
  }
67
74
  const { summary, lastUpdated, readWhen } = parseFrontmatter(fullPath);
@@ -77,10 +84,13 @@ function collectDocEntries(projectRoot, docsDir) {
77
84
  const entries = [];
78
85
  const invalidDocs = [];
79
86
  if (existsSync(docsDir)) {
80
- walkDocs(projectRoot, docsDir, entries, invalidDocs);
87
+ walkDocs(projectRoot, docsDir, entries, invalidDocs, new Set());
81
88
  }
82
89
  return { entries, invalidDocs };
83
90
  }
91
+ function isMarkdownDoc(entry) {
92
+ return entry.isFile() && entry.name.endsWith(".md") && !SKIP_NAMES.has(entry.name);
93
+ }
84
94
  export function renderDocsIndex(projectRoot, sections) {
85
95
  const lines = [
86
96
  "# Docs Index",
@@ -1,3 +1,4 @@
1
+ import * as TOML from "@iarna/toml";
1
2
  import { readFileSync } from "node:fs";
2
3
  import { existsSync } from "node:fs";
3
4
  import { fileURLToPath } from "node:url";
@@ -25,7 +26,32 @@ export function templatePath(relativePath) {
25
26
  export function readTemplate(relativePath) {
26
27
  return readFileSync(templatePath(relativePath), "utf8");
27
28
  }
28
- export function renderWaypointConfig(options) {
29
- return readTemplate(".waypoint/config.toml")
30
- .replace("__PROFILE__", options.profile);
29
+ export function defaultWaypointConfig(options) {
30
+ return {
31
+ version: 1,
32
+ profile: options.profile,
33
+ workspace_file: ".waypoint/WORKSPACE.md",
34
+ docs_dirs: [".waypoint/docs"],
35
+ plans_dirs: [".waypoint/plans"],
36
+ docs_index_file: ".waypoint/DOCS_INDEX.md",
37
+ features: {
38
+ repo_skills: true,
39
+ docs_index: true,
40
+ },
41
+ };
42
+ }
43
+ export function renderWaypointConfig(config) {
44
+ const renderedConfig = {
45
+ version: config.version,
46
+ profile: config.profile,
47
+ workspace_file: config.workspace_file,
48
+ docs_dirs: config.docs_dirs,
49
+ plans_dirs: config.plans_dirs,
50
+ docs_index_file: config.docs_index_file,
51
+ features: config.features ? {
52
+ repo_skills: config.features.repo_skills,
53
+ docs_index: config.features.docs_index,
54
+ } : undefined,
55
+ };
56
+ return TOML.stringify(renderedConfig);
31
57
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "waypoint-codex",
3
- "version": "0.13.3",
3
+ "version": "0.15.0",
4
4
  "description": "Codex-native repository operating system: scaffolding, docs routing, repo-local skills, doctor, and sync.",
5
5
  "license": "MIT",
6
6
  "type": "module",
@@ -1,11 +1,11 @@
1
1
  ---
2
2
  name: adversarial-review
3
- description: Run a deliberate second-pass review loop for ship-readiness or risky changes. Use when the user asks for a final review pass, asks whether something is ready to ship, asks to "close the loop," or when the implementation risk clearly warrants an explicit closeout workflow. This skill scopes the slice, runs `code-reviewer`, runs `code-health-reviewer` when the change is medium or large or structurally risky, runs `code-guide-audit`, waits for the required outputs, fixes real findings, and repeats with fresh rounds until no meaningful issues remain. Do not use this for tiny obvious edits, normal debugging back-and-forth, pre-implementation plan review, or active PR comment triage.
3
+ description: Second-pass closeout review for a non-trivial implementation slice. Use when risky work needs a deliberate final review before being called done. This skill scopes the slice, runs the right reviewer agents and code-guide checks, fixes meaningful findings, and repeats until only optional polish remains.
4
4
  ---
5
5
 
6
6
  # Adversarial Review
7
7
 
8
- Use this skill when you explicitly want a closeout-grade second pass instead of a normal implementation loop.
8
+ Use this skill when you explicitly want a closeout-grade second pass before calling a non-trivial slice done or ready to ship.
9
9
 
10
10
  This skill coordinates the specialist reviewers, keeps the scope tight, waits as long as needed, fixes meaningful findings, and reruns fresh review rounds until the remaining feedback is only optional polish or no findings at all.
11
11
 
@@ -1,4 +1,4 @@
1
1
  interface:
2
2
  display_name: "Adversarial Review"
3
- short_description: "Close out a code slice with iterative review"
4
- default_prompt: "Use $adversarial-review to close out this non-trivial implementation slice before calling it done."
3
+ short_description: "Run a deliberate second-pass closeout review"
4
+ default_prompt: "Use $adversarial-review when this non-trivial implementation slice needs a deliberate final review loop with reviewer agents and code-guide checks before we call it done."
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: backend-context-interview
3
- description: Gather and persist durable backend project context when it is missing, stale, contradictory, or too weak to support implementation, architecture, migration, or ship-readiness decisions. Use when a task needs project-level backend facts such as deployment reality, user exposure, scale, criticality, tenant model, compatibility expectations, security posture, observability expectations, or compliance constraints, and those facts are not already clear in `AGENTS.md` or the repo docs. This is not a feature-discovery skill and should not trigger for endpoint details, acceptance criteria, or other task-specific product questions.
3
+ description: Fill missing backend project context that materially changes engineering decisions. Use when durable backend facts like exposure, scale, criticality, compatibility, tenant model, security, observability, or compliance are not already clear in `AGENTS.md` or routed docs.
4
4
  ---
5
5
 
6
6
  # Backend Context Interview
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: backend-ship-audit
3
- description: Audit a backend scope for practical ship readiness with evidence-based findings focused on real release risk rather than style. Use when the user asks whether a backend service, API, worker, scheduler, endpoint group, pull request, or backend directory is ready to ship; when Codex needs to perform a release-risk review before launch; when the audit scope must be resolved from repository structure; when complete-file reading is required to understand behavior and dependencies; when only high-leverage deployment-context questions should be asked after repository exploration; or when a timestamped backend audit should be written under `.waypoint/audit/`. Do not use this for frontend ship review, generic style review, PR comment triage, or a one-off coding-guide check.
3
+ description: Audit a backend scope for ship-readiness with evidence-based findings focused on real release risk. Use when a backend service, API, worker, scheduler, PR, or backend area needs a launch-readiness review rather than style feedback or PR comment triage.
4
4
  ---
5
5
 
6
6
  # Backend ship audit
@@ -1,4 +1,4 @@
1
1
  interface:
2
2
  display_name: "Break-It QA"
3
3
  short_description: "Try to break a feature through the UI"
4
- default_prompt: "Use this skill to verify a user-facing feature by trying to break it through the browser with invalid inputs, wrong action order, refreshes, back navigation, repeated clicks, and other adversarial interactions, then fix clear issues and repeat."
4
+ default_prompt: "Use $break-it-qa to verify this user-facing feature by trying to break it through the browser with invalid inputs, wrong action order, refreshes, back navigation, repeated clicks, and other adversarial interactions, then fix clear issues and repeat."
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: code-guide-audit
3
- description: Audit a specific feature, file set, or implementation slice against the coding guide and report only coding-guide-related violations or risks in that scope. Use when the user asks for a code-guide audit, coding-guide compliance check, guide-specific review, or wants to know whether a change follows rules like no silent fallbacks, strong boundary validation, frontend reuse, explicit state handling, and behavior-focused verification. Do not use this for broad ship-readiness review, generic bug hunting, PR comment triage, or repo-wide cleanup.
3
+ description: Audit a scoped implementation slice against the code guide and report only guide-related violations or risks. Use for coding-guide compliance checks on explicit behavior, root-cause fixes, boundary validation, security, concurrency, accessibility, performance, and future legibility.
4
4
  ---
5
5
 
6
6
  # Code Guide Audit
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: frontend-context-interview
3
- description: Gather and persist durable frontend project context when missing or insufficient for implementation or review work. Use this to ask project-level questions about audience, deployment surface, browser/device expectations, accessibility, SEO, localization, analytics obligations, and other durable frontend context that is not clearly documented. This is not a feature-discovery skill.
3
+ description: Fill missing frontend project context that materially changes implementation or review decisions. Use when durable frontend facts like audience, deployment surface, browser and device support, accessibility, SEO, localization, analytics, or design-system constraints are not already clear in `AGENTS.md` or routed docs.
4
4
  ---
5
5
 
6
6
  # Frontend Context Interview
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: frontend-ship-audit
3
- description: Audit a defined frontend scope for ship-readiness with a strong focus on real product risk, user-facing correctness, and evidence from the repository. Use when Codex needs to review an app, route group, feature, page set, component area, PR, or frontend directory to decide whether it is ready to ship; resolve the actual reviewable frontend scope from the user request and repository structure; read all relevant frontend code and docs completely; ask a concise high-leverage interview only for missing context that materially changes the release bar; persist durable frontend deployment context into the project root AGENTS.md under a Frontend Context section; and write an evidence-based audit with prioritized P0-P4 findings at .waypoint/audit/dd-mm-yyyy-hh-mm-frontend-audit.md.
3
+ description: Audit a frontend scope for ship-readiness with evidence-based findings focused on product risk and user-facing correctness. Use when an app area, route group, feature, PR, or frontend surface needs a launch-readiness review rather than style feedback or PR comment triage.
4
4
  ---
5
5
 
6
6
  Audit ship-readiness like a strong frontend reviewer. Optimize for user impact, release risk, and production correctness. Do not optimize for style policing.
@@ -0,0 +1,175 @@
1
+ ---
2
+ name: merge-ready-owner
3
+ description: Own a non-trivial change from approved plan through implementation, verification, PR creation or update, review handling, and merge-ready handoff. Use when the user wants Codex to take full ownership after the problem and plan are agreed, keep going without repeated check-ins, and return only when there is a clean PR ready to merge or a concrete blocker that cannot be cleared alone.
4
+ ---
5
+
6
+ # Merge Ready Owner
7
+
8
+ Use this skill when the user wants one continuous ownership loop instead of a handoff after coding.
9
+
10
+ The job is not "write some code." The job is "carry the agreed work all the way to a merge-ready PR or a clearly explained blocker."
11
+
12
+ ## When Not To Use This Skill
13
+
14
+ - Skip it when the problem is still being shaped or the plan is not actually approved. Use `planning` first.
15
+ - Skip it for tiny local edits that do not justify a full ship loop.
16
+ - Skip it when the user explicitly wants to stay in the loop for each step instead of delegating the closeout.
17
+
18
+ ## Finish Line
19
+
20
+ Before starting, treat this as the default definition of done:
21
+
22
+ - the agreed scope is implemented
23
+ - the work is based on the repo's current default branch state
24
+ - the right PR exists and is up to date when the repo uses PRs
25
+ - the relevant tests, typechecks, lint, builds, or smoke checks for the touched surface are green
26
+ - real verification has been done against the risky user or runtime path when practical
27
+ - docs, trackers, and workspace state are updated when the shipped behavior changed materially
28
+ - review comments are answered and meaningful findings are fixed
29
+ - CI is green when the repo uses CI
30
+ - the PR is merge-ready, or there is a concrete blocker that cannot be cleared alone
31
+
32
+ When the product surface makes it practical, extend done to include:
33
+
34
+ - a short recorded walkthrough of the verified final browser or app flow
35
+ - the local path to that recording
36
+
37
+ Do not stop at "the code compiles" or "the first push is up."
38
+
39
+ ## Step 1: Reconfirm The Scope And Ownership Mode
40
+
41
+ - Make sure the plan is already approved or the user explicitly said to proceed.
42
+ - Restate the finish line to yourself before editing.
43
+ - Identify the highest-risk parts of the change so verification matches the real failure surface.
44
+
45
+ If the plan is not actually settled, stop and use `planning` instead of guessing.
46
+
47
+ ## Step 2: Start From Fresh Branch State
48
+
49
+ - Sync with the repo's current default branch and base the work on that fresh state.
50
+ - If there is no branch yet, create one from the refreshed default branch.
51
+ - If there is already a PR, confirm it is still open before pushing more commits.
52
+ - If an old PR was closed or merged, create a fresh branch from the current default branch, carry forward only the needed work, and open a new PR if the repo uses PRs.
53
+
54
+ ## Step 3: Implement In Small Verified Chunks
55
+
56
+ - Make the change in small logical chunks.
57
+ - Commit in small steps when the repo workflow benefits from granular history.
58
+ - Keep unrelated local changes intact.
59
+ - Do not stop after the first implementation pass if clear follow-up fixes are still needed.
60
+
61
+ For bugs, prefer reproducing the problem first, then fixing it, then proving the fix.
62
+
63
+ ## Step 4: Use The Right Repo-Local Helpers
64
+
65
+ Use the repo's existing skills and reviewer agents instead of inventing a parallel process.
66
+
67
+ - Use `work-tracker` when the work or verification checklist is too large for `WORKSPACE.md`.
68
+ - Use `docs-sync` when shipped behavior, routes, contracts, or commands changed materially.
69
+ - Use `pre-pr-hygiene` before pushing or opening/updating a PR when the change surface is substantial.
70
+ - Use `pr-review` once active PR review or automated review has started.
71
+ - Use `break-it-qa` for extra abuse testing on risky interactive flows when that pass is worth the time.
72
+
73
+ If the repo ships reviewer agents under `.codex/agents/`, use them in the closeout flow when they are available:
74
+
75
+ - run `code-reviewer` for every non-trivial implementation slice before declaring the work clear
76
+ - run `code-health-reviewer` when the change is medium or large, especially when it adds structure, duplicates logic, or introduces new abstractions
77
+ - launch them in parallel when both apply
78
+ - treat them as fresh closeout passes, not as optional decoration
79
+ - if meaningful fixes follow from their findings, rerun the most relevant verification and, when warranted, rerun fresh reviewer passes instead of trusting stale results
80
+
81
+ If those reviewer agents are not present in the repo, do the equivalent closeout thinking locally and continue instead of blocking on missing helpers.
82
+
83
+ ## Step 5: Choose Verification That Matches The Real Risk
84
+
85
+ - Discover and use the verification tools that already exist in the current project instead of assuming one fixed stack.
86
+ - For browser-facing work, use the available browser QA tooling and exercise the real UI.
87
+ - For mobile or desktop app work, use the app or simulator tooling available in the repo and exercise the real flow.
88
+ - For backend work, hit the real route, worker, or runtime boundary when practical instead of trusting only unit tests.
89
+ - For environment-specific bugs, prefer the environment's logs, traces, payloads, or metrics over local guesswork.
90
+
91
+ If an existing repo-local skill clearly matches the verification surface, use it.
92
+
93
+ ## Step 6: Run The Full Pre-Push Loop
94
+
95
+ - Run the required tests and typechecks for every touched package or service.
96
+ - Run builds, lint, migrations, or focused smoke tests when they are part of the real risk surface.
97
+ - Fix failing checks before pushing unless the user explicitly accepts an exception.
98
+ - For user-facing flows, do at least one realistic manual or UI-driven pass beyond pure unit coverage.
99
+
100
+ Do not push a branch that still obviously fails its own touched-surface checks.
101
+
102
+ ## Step 7: Open Or Update The PR Cleanly
103
+
104
+ When the repo uses PRs:
105
+
106
+ - open the PR if one does not exist
107
+ - keep the PR title and body focused on user value and capability, not implementation trivia
108
+ - keep the PR description concise
109
+ - request preview or staging environments when they are part of validation
110
+
111
+ If the repo does not use PRs, keep moving through the equivalent review and handoff workflow instead of forcing PR-shaped steps.
112
+
113
+ ## Step 8: Babysit The PR Instead Of Dropping It
114
+
115
+ When the repo uses PRs, CI, or preview environments:
116
+
117
+ - watch CI until it settles
118
+ - investigate red checks instead of treating them as someone else's problem
119
+ - if a preview, staging, or deployment environment is required for validation, follow it through until the environment is usable or a real external blocker is proven
120
+ - if the live preview or deployed environment is the real risk surface, verify it directly when helpful instead of waiting only on a bot summary
121
+
122
+ The ownership loop is still active while CI, preview, or rollout is in flight.
123
+
124
+ ## Step 9: Close The Review Loop
125
+
126
+ Once review starts:
127
+
128
+ - use `pr-review`
129
+ - read every meaningful comment
130
+ - fix valid findings
131
+ - reply inline where the workflow supports inline reply
132
+ - rerun the relevant verification after review-driven fixes
133
+
134
+ Do not leave comments unanswered just because the code changed.
135
+
136
+ ## Step 10: Re-Test The Risky User Paths
137
+
138
+ - Re-run the happy path after fixes.
139
+ - Re-run the exact paths that were previously broken.
140
+ - For stateful flows, also probe nearby failure surfaces: repeat actions, bad input, stale state, back navigation, recovery, and environment toggles.
141
+ - Capture screenshots when using interactive UI tooling if the environment allows it.
142
+
143
+ Record the walkthrough only after the verified final state is stable. Do not record the first flaky pass and call that proof.
144
+
145
+ ## Step 11: Hand Back A Merge-Ready Truthful State
146
+
147
+ Only close out when you can truthfully say one of these:
148
+
149
+ - the PR is ready to merge
150
+ - or there is a concrete blocker you cannot clear alone
151
+
152
+ The final handoff should say:
153
+
154
+ - what is now working for the user
155
+ - what verification actually ran
156
+ - the PR link when there is one
157
+ - any remaining blocker or caveat that still matters
158
+
159
+ Keep the handoff plain and direct. The point of this skill is to reduce the user's need to supervise the loop.
160
+
161
+ ## Gotchas
162
+
163
+ - Do not mistake planning approval for permission to stop at implementation; this skill owns the full closeout.
164
+ - Do not rely only on automated tests when the risky surface is interactive.
165
+ - Do not let stale previews, staging selectors, old PR branches, or half-deployed environments quietly poison verification.
166
+ - Do not treat CI failures, review comments, or rollout gates as outside the task once the user asked for full ownership.
167
+ - Do not declare success while known meaningful review findings or failing checks still exist.
168
+ - Do not confuse a reusable test harness or scripted UI test with the final walkthrough artifact; the artifact should show the real verified surface when practical.
169
+ - Do not forget the reviewer-agent loop when `code-reviewer` and `code-health-reviewer` are available. They are part of the closeout signal, not an afterthought.
170
+
171
+ ## Keep This Skill Sharp
172
+
173
+ - Add new gotchas when the same ownership failure mode repeats.
174
+ - Tighten the description if the skill fires too early before planning is settled.
175
+ - If the closeout loop keeps depending on the same helper skills, reviewer agents, or verification surfaces, encode that expectation here instead of rediscovering it in chat.
@@ -0,0 +1,4 @@
1
+ interface:
2
+ display_name: "Merge-Ready Owner"
3
+ short_description: "Own approved work through merge-ready closeout"
4
+ default_prompt: "Use $merge-ready-owner when the plan is already approved and you should carry the work all the way through implementation, verification, reviewer-agent passes, PR handling, and merge-ready handoff without repeated check-ins."
@@ -4,12 +4,11 @@ sandbox_mode = "workspace-write"
4
4
  developer_instructions = """
5
5
  Read these files in order before doing anything else:
6
6
  1. .waypoint/SOUL.md
7
- 2. .waypoint/MEMORY.md if it exists
8
- 3. .waypoint/agent-operating-manual.md
9
- 4. .waypoint/WORKSPACE.md
10
- 5. .waypoint/context/MANIFEST.md
11
- 6. every file listed in that manifest
12
- 7. .waypoint/docs/code-guide.md
7
+ 2. .waypoint/agent-operating-manual.md
8
+ 3. .waypoint/WORKSPACE.md
9
+ 4. .waypoint/context/MANIFEST.md
10
+ 5. every file listed in that manifest
11
+ 6. .waypoint/docs/code-guide.md
13
12
 
14
13
  After reading them, follow these operating instructions:
15
14
 
@@ -15,11 +15,11 @@
15
15
  .agents/skills/frontend-ship-audit/
16
16
  .agents/skills/backend-ship-audit/
17
17
  .agents/skills/conversation-retrospective/
18
+ .agents/skills/merge-ready-owner/
18
19
  .agents/skills/workspace-compress/
19
20
  .agents/skills/pre-pr-hygiene/
20
21
  .agents/skills/pr-review/
21
22
  .waypoint/config.toml
22
- .waypoint/MEMORY.md
23
23
  .waypoint/README.md
24
24
  .waypoint/SOUL.md
25
25
  .waypoint/WORKSPACE.md
@@ -2,7 +2,6 @@
2
2
 
3
3
  Repo-local Waypoint configuration and project memory files.
4
4
 
5
- - `MEMORY.md` — durable user/team preferences, collaboration context, and stable product defaults
6
5
  - `config.toml` — Waypoint feature toggles and file locations
7
6
  - `WORKSPACE.md` — live operational state; new or materially revised entries in multi-topic sections are timestamped
8
7
  - `DOCS_INDEX.md` — generated docs and plans routing map
@@ -13,3 +12,8 @@ Repo-local Waypoint configuration and project memory files.
13
12
  - `agents/` — agent prompt files that Waypoint's reviewer agents can read and follow
14
13
  - `context/` — generated session context bundle
15
14
  - `scripts/` — repo-local Waypoint helper scripts
15
+
16
+ Durable guidance now lives in `AGENTS.md`:
17
+
18
+ - user-scoped `AGENTS.md` for cross-project preferences and standing rules
19
+ - project-scoped repo `AGENTS.md` for project-specific context and constraints
@@ -12,6 +12,8 @@ You're direct, warm, opinionated, and evidence-driven. You read before you write
12
12
 
13
13
  **Investigation beats status narration.** When something looks broken, figure out what is happening and what to do next before talking about whether it is "done."
14
14
 
15
+ **Fix causes, not symptoms.** A bug is often evidence of a bad underlying decision. Prefer the real fix, even when it means deleting shaky code, changing architecture, or paying down the debt that caused the problem.
16
+
15
17
  **Honesty should be useful.** Say what is true, what you know, what you do not know yet, and what you are checking next. Do not hide behind disclaimer language when you could be diagnosing the issue.
16
18
 
17
19
  **The repo must remain legible.** If the next agent cannot understand what happened by reading markdown files and code, the work is incomplete.
@@ -18,11 +18,10 @@ Bootstrap sequence:
18
18
 
19
19
  1. Run `node .waypoint/scripts/prepare-context.mjs`
20
20
  2. Read `.waypoint/SOUL.md`
21
- 3. Read `.waypoint/MEMORY.md` if it exists
22
- 4. Read this file
23
- 5. Read `.waypoint/WORKSPACE.md`
24
- 6. Read `.waypoint/context/MANIFEST.md`
25
- 7. Read every file listed in that manifest
21
+ 3. Read this file
22
+ 4. Read `.waypoint/WORKSPACE.md`
23
+ 5. Read `.waypoint/context/MANIFEST.md`
24
+ 6. Read every file listed in that manifest
26
25
 
27
26
  Do not skip this sequence.
28
27
 
@@ -35,7 +34,8 @@ Do not skip this sequence.
35
34
 
36
35
  The repository should contain the context the next agent needs.
37
36
 
38
- - `.waypoint/MEMORY.md` is the durable user/team memory layer: collaboration preferences, stable defaults, and long-lived context that should survive across sessions
37
+ - user-scoped `AGENTS.md` is the durable cross-project guidance layer: collaboration preferences, personal workflow rules, and stable defaults that should apply across repos
38
+ - the repo root `AGENTS.md` is the project-scoped guidance layer: repo-specific context, constraints, and durable rules for this project
39
39
  - `.waypoint/WORKSPACE.md` is the live operational record: in progress, current state, next steps
40
40
  - `.waypoint/track/` is the optional execution-tracking layer for active long-running work that genuinely needs durable progress state
41
41
  - `.waypoint/docs/` is the durable project memory: architecture, decisions, integration notes, and debugging knowledge
@@ -50,9 +50,13 @@ If something important lives only in your head or in the chat transcript, the re
50
50
  - Follow the repo's documented patterns when they are healthy.
51
51
  - If the user approves a plan or explicitly tells you to proceed, treat that as authorization to finish the approved work end to end.
52
52
  - When the user shows a bug, screenshot, or broken behavior, investigate first. Lead with what is happening, why it is likely happening, what you checked, and what you are doing next.
53
+ - Fix underlying causes instead of papering over symptoms. If the real fix requires changing a shaky abstraction, deleting stale compatibility logic, or cleaning up debt that is directly causing the bug, do that work instead of shipping a hot patch around it.
54
+ - Do not stop at the first local patch that makes the symptom disappear if the root cause is still obviously in place.
53
55
  - Do not lead with readiness disclaimers such as "I can't call this done yet" unless the user explicitly asked whether the work is ready, shippable, or complete.
54
56
  - Honesty means accurate diagnosis, explicit uncertainty, and clear verification limits. It does not mean substituting process language for investigation.
55
- - Update `.waypoint/MEMORY.md` only when you learned a durable user/team preference, collaboration rule, or stable product default.
57
+ - Before making meaningful frontend or backend decisions, inspect the available user-scoped and project-scoped `AGENTS.md` guidance. If the task depends on frontend or backend context that is missing from the project-scoped guidance and routed docs, use the corresponding `*-context-interview` skill to fill that gap instead of guessing.
58
+ - Update the user-scoped `AGENTS.md` when you learn a durable preference, workflow rule, or default that should apply across projects and your environment allows you to edit it.
59
+ - Update the project-scoped repo `AGENTS.md` when you learn durable repo truth, project constraints, or stable project-specific collaboration rules.
56
60
  - Update `.waypoint/WORKSPACE.md` as live execution state when progress meaningfully changes. In multi-topic sections, prefix new or materially revised bullets with a local timestamp like `[2026-03-06 20:10 PST]`.
57
61
  - For large multi-step work that is likely to span sessions or needs durable progress state, create or update a tracker in `.waypoint/track/`, keep detailed execution state there, and point at it from `## Active Trackers` in `.waypoint/WORKSPACE.md`.
58
62
  - Update `.waypoint/docs/` when durable project knowledge changes, update `.waypoint/plans/` when durable plans change, and refresh each changed routable doc's `last_updated` field.
@@ -1,8 +1,8 @@
1
1
  version = 1
2
2
  profile = "__PROFILE__"
3
3
  workspace_file = ".waypoint/WORKSPACE.md"
4
- docs_dir = ".waypoint/docs"
5
- plans_dir = ".waypoint/plans"
4
+ docs_dirs = [".waypoint/docs"]
5
+ plans_dirs = [".waypoint/plans"]
6
6
  docs_index_file = ".waypoint/DOCS_INDEX.md"
7
7
 
8
8
  [features]
@@ -1,6 +1,6 @@
1
1
  ---
2
- summary: Universal coding conventions — explicit behavior, type safety, frontend consistency, reliability, and behavior-focused verification
3
- last_updated: "2026-03-10 10:05 PDT"
2
+ summary: Universal coding conventions — explicit behavior, root-cause fixes, security, concurrency, accessibility, performance, and behavior-focused verification
3
+ last_updated: "2026-03-25 10:40 PDT"
4
4
  read_when:
5
5
  - writing code
6
6
  - coding standards
@@ -24,7 +24,16 @@ Do not preserve old behavior unless a user-facing requirement explicitly asks fo
24
24
  - Do not keep dead fields, dual formats, or migration-only logic "just in case."
25
25
  - If compatibility must stay, document the exact contract being preserved and the removal condition.
26
26
 
27
- ## 2. Type safety is non-negotiable
27
+ ## 2. Fix root causes, not symptoms
28
+
29
+ Bug fixes should remove the reason the problem exists, not only hide its most obvious effect.
30
+
31
+ - Do not ship hot patches that leave the bad underlying decision untouched when the real cause is visible and fixable.
32
+ - If the real fix requires deleting stale code, changing an unhealthy abstraction, or paying down the debt that directly caused the issue, do that work.
33
+ - Prefer one clear correction over layering guards, retries, fallbacks, or one-off conditionals around broken logic.
34
+ - If you intentionally choose a temporary mitigation, label it clearly as temporary, explain the remaining risk, and leave a removal path.
35
+
36
+ ## 3. Type safety is non-negotiable
28
37
 
29
38
  The compiler is part of the design, not an afterthought.
30
39
 
@@ -35,7 +44,7 @@ The compiler is part of the design, not an afterthought.
35
44
  - Validate external data at boundaries with schema validation and convert it into trusted internal shapes once.
36
45
  - Avoid cross-package type casts unless there is no better contract available; fix the shared types instead when practical.
37
46
 
38
- ## 3. Fail clearly, never quietly
47
+ ## 4. Fail clearly, never quietly
39
48
 
40
49
  Errors are part of the contract.
41
50
 
@@ -45,7 +54,7 @@ Errors are part of the contract.
45
54
  - Required configuration has no silent defaults. Missing required config is a startup or boundary failure.
46
55
  - Error messages should identify what failed, where, and why.
47
56
 
48
- ## 4. Validate at boundaries
57
+ ## 5. Validate at boundaries
49
58
 
50
59
  Anything crossing a boundary is untrusted until proven otherwise.
51
60
 
@@ -53,7 +62,17 @@ Anything crossing a boundary is untrusted until proven otherwise.
53
62
  - Reject invalid data instead of "normalizing" it into something ambiguous.
54
63
  - Keep validation near the boundary instead of scattering half-validation deep inside the system.
55
64
 
56
- ## 5. Prefer direct code over speculative abstraction
65
+ ## 6. Security and privacy by default
66
+
67
+ Security and privacy work is part of normal engineering, not a later hardening pass.
68
+
69
+ - Validate authorization at boundaries and re-check it when trust changes across layers or actors.
70
+ - Minimize privileges for services, jobs, tokens, and humans. Do not grant broad access when the narrower contract is known.
71
+ - Protect secrets in config, logs, traces, prompts, fixtures, screenshots, and error paths.
72
+ - Sanitize untrusted content before rendering, executing, storing, or forwarding it.
73
+ - Avoid storing, returning, or exposing sensitive data unless the product truly needs it.
74
+
75
+ ## 7. Prefer direct code over speculative abstraction
57
76
 
58
77
  Do not invent complexity for hypothetical future needs.
59
78
 
@@ -61,7 +80,7 @@ Do not invent complexity for hypothetical future needs.
61
80
  - Prefer straightforward code and small duplication over the wrong generic layer.
62
81
  - If a helper hides critical validation, state changes, or failure modes, it is probably hurting clarity.
63
82
 
64
- ## 6. Make state, contracts, and provenance explicit
83
+ ## 8. Make state, contracts, and provenance explicit
65
84
 
66
85
  Readers should be able to tell what states exist, what transitions are legal, and what data can be trusted.
67
86
 
@@ -71,7 +90,16 @@ Readers should be able to tell what states exist, what transitions are legal, an
71
90
  - New schema and persistence work should make provenance obvious and protect against duplication with the right uniqueness constraints, foreign keys, or equivalent invariants.
72
91
  - Shared schemas, fixtures, and contract types must match the real API and stored data shape.
73
92
 
74
- ## 7. Frontend must reuse and fit the existing system
93
+ ## 9. Time, concurrency, and distributed failure are real inputs
94
+
95
+ Systems do not run in a single-threaded, perfectly ordered world.
96
+
97
+ - Be explicit about timeouts, cancellation, retries, duplicate delivery, race conditions, clock assumptions, and ordering guarantees.
98
+ - Treat retry behavior, background work, and message handling as correctness boundaries, not incidental plumbing.
99
+ - Assume network calls, workers, queues, and remote dependencies can be slow, reordered, repeated, or partially failed.
100
+ - Make conflict handling and failure recovery explicit where concurrency can affect user or system state.
101
+
102
+ ## 10. Frontend must reuse and fit the existing system
75
103
 
76
104
  Frontend changes should extend the app, not fork its design language.
77
105
 
@@ -81,7 +109,16 @@ Frontend changes should extend the app, not fork its design language.
81
109
  - Handle all states for async and data-driven UI: loading, success, empty, error.
82
110
  - Optimistic UI must have an explicit rollback or invalidation strategy. Never leave optimistic state hanging without a recovery path.
83
111
 
84
- ## 8. Observability is part of correctness
112
+ ## 11. Accessibility is part of correctness
113
+
114
+ UI work is not correct if important users cannot operate it.
115
+
116
+ - Support keyboard navigation, semantic structure, accessible names, focus states, and readable contrast.
117
+ - Make interactive states and errors perceivable to assistive technologies, not only visually obvious.
118
+ - Treat accessibility regressions as correctness issues, not optional polish.
119
+ - Verify accessibility behavior in the actual UI surface when the change affects interaction or rendering.
120
+
121
+ ## 12. Observability is part of correctness
85
122
 
86
123
  If you cannot see the failure path, you have not finished the work.
87
124
 
@@ -90,7 +127,16 @@ If you cannot see the failure path, you have not finished the work.
90
127
  - Failed async work, retries, degraded paths, and rejected inputs must leave a useful trace.
91
128
  - Do not use noisy logging to compensate for unclear control flow.
92
129
 
93
- ## 9. Test behavior, not implementation
130
+ ## 13. Performance by measurement
131
+
132
+ Optimize based on real impact, not superstition, but do not ignore performance failures once users or operators feel them.
133
+
134
+ - Measure before and after when performance work matters.
135
+ - Treat pathological queries, unnecessary renders, large payloads, and unbounded memory or retry behavior as correctness issues once they affect users, cost, or operations.
136
+ - Prefer targeted fixes at the real bottleneck over broad speculative optimization.
137
+ - Keep performance assumptions visible in code, docs, or comments when they are important to correctness.
138
+
139
+ ## 14. Test behavior, not implementation
94
140
 
95
141
  Tests should protect the contract users depend on.
96
142
 
@@ -101,7 +147,17 @@ Tests should protect the contract users depend on.
101
147
  - For frontend bugs, prefer manual QA by default; add automated regression coverage only when there is a stable user-visible behavior worth protecting.
102
148
  - Do not merge behavior changes without leaving behind executable or clearly documented evidence of the new contract.
103
149
 
104
- ## 10. Optimize for future legibility
150
+ ## 15. Simplicity in naming and organization
151
+
152
+ Code should be easy to navigate under pressure.
153
+
154
+ - Use names that describe intent, not cleverness, incidental mechanics, or historical accidents.
155
+ - Keep functions, modules, and APIs small enough that a reader can understand the responsibility without cross-referencing half the repo.
156
+ - Prefer one obvious place for a behavior over scattering it across thin wrappers and pass-through layers.
157
+ - Group code by responsibility and boundary, not by vague convenience buckets.
158
+ - If a file or API has grown hard to name clearly, it is probably doing too much.
159
+
160
+ ## 16. Optimize for future legibility
105
161
 
106
162
  Write code for the next engineer or agent who has to change it under pressure.
107
163
 
@@ -17,11 +17,10 @@ Run the Waypoint bootstrap only in these cases:
17
17
  Bootstrap sequence:
18
18
  1. Run `node .waypoint/scripts/prepare-context.mjs`
19
19
  2. Read `.waypoint/SOUL.md`
20
- 3. Read `.waypoint/MEMORY.md` if it exists
21
- 4. Read `.waypoint/agent-operating-manual.md`
22
- 5. Read `.waypoint/WORKSPACE.md`
23
- 6. Read `.waypoint/context/MANIFEST.md`
24
- 7. Read every file listed in the manifest
20
+ 3. Read `.waypoint/agent-operating-manual.md`
21
+ 4. Read `.waypoint/WORKSPACE.md`
22
+ 5. Read `.waypoint/context/MANIFEST.md`
23
+ 6. Read every file listed in the manifest
25
24
 
26
25
  This is mandatory, not optional.
27
26
 
@@ -34,7 +33,10 @@ This is mandatory, not optional.
34
33
  Before making meaningful implementation, review, architectural, or tradeoff decisions, inspect the project root guidance files for persisted project context.
35
34
 
36
35
  Project guidance rules:
36
+ - Distinguish user-scoped guidance from project-scoped guidance.
37
+ - User-scoped `AGENTS.md` applies across projects and holds durable personal preferences, workflow rules, and collaboration defaults for this user.
37
38
  - Prefer `AGENTS.md` in the project root if present.
39
+ - The project root `AGENTS.md` is project-scoped and should hold repo-specific context, constraints, standards, and durable project truth.
38
40
  - Look for context sections relevant to the task, including `## Project Context`, `## Frontend Context`, and `## Backend Context`.
39
41
  - Treat relevant context sections as active inputs to decision-making, not passive documentation.
40
42
  - Apply that context to scope, architecture, implementation depth, review standards, risk tolerance, testing strategy, compatibility expectations, rollout caution, and UX/product quality bar.
@@ -53,8 +55,8 @@ Examples of durable context that can materially change the correct approach:
53
55
 
54
56
  If relevant context is missing, empty, stale, or insufficient and that gap would materially change the correct approach:
55
57
  - do not guess silently
56
- - use `frontend-context-interview` when project-level frontend context is missing
57
- - use `backend-context-interview` when project-level backend context is missing
58
+ - if the task touches frontend and the needed frontend project context is not present in `AGENTS.md` or routed docs, use `frontend-context-interview`
59
+ - if the task touches backend and the needed backend project context is not present in `AGENTS.md` or routed docs, use `backend-context-interview`
58
60
  - ask only the missing high-leverage questions
59
61
  - ask about the project, deployment reality, and operating constraints rather than the concrete feature
60
62
  - persist only durable context back into the project guidance file
@@ -79,6 +81,8 @@ Delivery expectations:
79
81
  - This communication rule applies to how you explain the work, not to how you do it. Your actual reasoning, coding, debugging, and verification should stay technical, precise, and rigorous.
80
82
  - When the user shows a bug, broken behavior, or a screenshot of something wrong, investigate before discussing readiness.
81
83
  - Lead with the useful truth: what is happening, the likely cause, what you checked, and what you are doing next.
84
+ - Fix the underlying problem, not only the visible symptom. If the real fix requires removing a bad old decision, paying down local technical debt, or simplifying shaky architecture, do that instead of hot-patching around it.
85
+ - Do not ship a bug fix that knowingly leaves the real cause in place behind a cosmetic patch unless the user explicitly asked for a temporary workaround.
82
86
  - Do not lead with refusal or readiness-disclaimer language like "I can't call this done yet" unless the user explicitly asked for a ship/readiness judgment.
83
87
  - Honesty means accurate diagnosis, explicit uncertainty, and clear verification limits. It does not mean hiding behind procedural disclaimers when you could be investigating.
84
88
  - Before you say the work is complete, verify it yourself whenever you reasonably can with the tools available in the environment.
@@ -91,7 +95,8 @@ Delivery expectations:
91
95
 
92
96
  Working rules:
93
97
  - Keep `.waypoint/WORKSPACE.md` current as the live execution state, with timestamped new or materially revised entries in multi-topic sections
94
- - Keep `.waypoint/MEMORY.md` for durable user/team preferences, collaboration context, and stable product defaults; keep task status and active execution state out of it
98
+ - Update user-scoped `AGENTS.md` when you learn a durable preference, standing rule, or default that should apply across projects and your environment allows you to edit that file
99
+ - Update the project-scoped repo `AGENTS.md` when you learn durable repo truth, project constraints, or stable project-specific collaboration rules
95
100
  - Update `.waypoint/docs/` when durable project knowledge changes, update `.waypoint/plans/` when a durable plan changes, and refresh `last_updated` on touched routable docs
96
101
  - Keep most work in the main agent. Use repo-local skills, trackers, reviewer agents, or `coding-agent` when they create clear leverage, not as default ceremony.
97
102
  - Let repo-local skills describe their own triggers. The managed block should keep only the high-level rule: use those tools deliberately when they clearly help the task.
@@ -1,20 +0,0 @@
1
- # Memory
2
-
3
- Durable user, team, and collaboration context for this repository.
4
-
5
- Use this file for:
6
-
7
- - stable communication preferences
8
- - durable workflow preferences
9
- - standing product defaults or guardrails
10
- - user or team context that matters across sessions
11
-
12
- Do not use this file for:
13
-
14
- - active task status
15
- - current blockers or next steps
16
- - detailed architecture notes
17
- - transient complaints or one-off debugging chatter
18
-
19
- Put live execution state in `.waypoint/WORKSPACE.md`.
20
- Put durable project behavior and architecture in `.waypoint/docs/`.