Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
Show all changes
27 commits
Select commit Hold shift + click to select a range
5f4687e
docs(plan): Plan v1 milestones, decisions D11-D18, scope and open que…
Oct 30, 2026
77d344c
docs(design): central server, review_by, 13-tool surface, hooks and CLI
Oct 30, 2026
5ca5df6
docs(contract): note the Plan v1 surface changes planned for M1
Oct 30, 2026
489ef7d
docs(contributing): add the Plan v1 engineering rules
Oct 30, 2026
b18efa9
docs(plan): correct the milestone-to-phase mapping
Oct 30, 2026
ff5a734
docs: correct built-state claims and Plan v1 review warnings
Oct 30, 2026
a5051ff
docs: milestone marker and status lines name M1 as current
Oct 30, 2026
1460f8e
docs(plan): milestones replace phases in §3 to §7
Oct 30, 2026
53d54b1
docs(design): central server, milestones and cut surface
Oct 30, 2026
bfa2ef4
docs(contract): milestone references replace phases
Oct 30, 2026
7127de4
docs(readme): operating record category, server required, rename planned
Oct 30, 2026
84f5a21
docs(wiki): milestones, decisions D11 to D18, one-server architecture
Oct 30, 2026
3e0e97b
github: milestone labels m1 to m8 and later; phase labels are history
Oct 30, 2026
c3fb79f
github: roadmap milestones M1 to M8 and Later, with issue mapping
Oct 30, 2026
b74e5e8
github: bootstrap sets a Milestone board field and reads phases from …
Oct 30, 2026
829c1ae
ci: comment names Later for release builds, not phase 10
Oct 30, 2026
27b8e9a
CHANGELOG: link the Plan v1 entry to PR #65
Oct 30, 2026
884f5ef
github: milestone is the built-in board field, not a custom one
Oct 30, 2026
cdc7e50
issue forms: milestone dropdown, decisions D11 to D18, bug environment
Oct 30, 2026
b51f599
ci: docs job named for what it checks
Oct 30, 2026
8ff21ce
docs(wiki): area:server description matches labels.json
Oct 30, 2026
59ba89d
docs: category line is an operating record for coding agents
Oct 30, 2026
af0ab09
docs(readme): serve, mcp and the CLI marked as planned with milestones
Oct 30, 2026
ba67e7d
docs(design): §5 intro points at §5.3 "The server"
Oct 30, 2026
677e12d
docs(wiki): M4, M7 and M8 have no epic yet
Oct 30, 2026
6803709
github: roadmap decision on placing cairn export project
Oct 30, 2026
53d9d6a
Roadmap: M1 children, stale comments for step 9
Oct 30, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
docs: milestone marker and status lines name M1 as current
check-docs.sh checks the cairn-milestone marker in README.md and
docs/PLAN.md, replacing the cairn-phase check. The status lines in
README, PLAN and DESIGN name M1 (Server-mode MCP) as current, and PLAN
§9 states the milestone rule.

Co-Authored-By: Claude Haiku 5.5 <noreply@anthropic.com>
  • Loading branch information
Donovan Maidens and claude committed Oct 30, 2026
commit a5051ffc8ebe1fe73a4b0942ff18b2c577d88865
6 changes: 3 additions & 3 deletions .github/pull_request_template.md
Original file line number Diff line number Diff line change
@@ -1,16 +1,16 @@
Closes #

Milestone: set it to the phase this pull request belongs to (docs/PLAN.md §3).
Milestone: set it to the milestone this pull request belongs to (docs/PLAN.md §3).

## What and why

<!-- What changed, and why. Name the phase and the PLAN §3 work line where it applies. -->
<!-- What changed, and why. Name the milestone and the PLAN §3 work line where it applies. -->

## Checklist

- [ ] `make build`, `make vet`, `make fmt-check` and `make test` pass locally
- [ ] `CHANGELOG.md` is updated, or the `skip-changelog` label is set
- [ ] If a phase exit check passed: the phase marker and status line in README.md and docs/PLAN.md are updated
- [ ] If a milestone exit check passed: the milestone marker and status lines in README.md, docs/PLAN.md, docs/DESIGN.md and the wiki are updated
- [ ] If the contract changed: DESIGN.md, CONTRACT.md, `internal/core` and `internal/conformance` change together (CLAUDE.md)
- [ ] If user-facing behaviour changed: the wiki page is updated
- [ ] Any decision that departs from docs/PLAN.md §8 is raised with the operator first
15 changes: 8 additions & 7 deletions CONTRIBUTING.md
Original file line number Diff line number Diff line change
Expand Up @@ -35,9 +35,9 @@ request as equivalent or accepted, with a reason.
one, and reference it.
2. **Branch.** Branch from `main`, named for the change.
3. **Pull request.** Use the pull request template. It asks for `Closes #N`
and the phase milestone.
4. **CI.** `build, vet, fmt, test` must pass. The docs job checks the phase
markers and the changelog, and shellcheck lints the scripts. Only
and the milestone.
4. **CI.** `build, vet, fmt, test` must pass. The docs job checks the milestone
marker and the changelog, and shellcheck lints the scripts. Only
`build, vet, fmt, test` is required on `main`.
5. **Review.** See the rule below.
6. **Merge.** An agent may merge a pull request once CI is green and the
Expand Down Expand Up @@ -110,10 +110,11 @@ the reason. Adopted decisions are listed in PLAN.md §8.

- **Changelog.** Every pull request adds an entry under `## [Unreleased]` in
[CHANGELOG.md](CHANGELOG.md), unless it carries the `skip-changelog` label.
- **Phase marker.** README.md and docs/PLAN.md each carry one
`<!-- cairn-phase: N -->` marker, and the two N values match.
`scripts/check-docs.sh` checks that they agree. When N and the status lines
change is set out in [PLAN §9](docs/PLAN.md#9-project-management).
- **Milestone marker.** README.md and docs/PLAN.md each carry one
`<!-- cairn-milestone: M -->` marker, naming the current milestone (M1 to M8,
or Later), and the two values match. `scripts/check-docs.sh` checks that they
agree. When the marker and the status lines change is set out in
[PLAN §9](docs/PLAN.md#9-project-management).
- **Contract changes.** DESIGN.md, CONTRACT.md, `internal/core` and
`internal/conformance` change together. See
[Changes to the design](#changes-to-the-design) above.
Expand Down
8 changes: 3 additions & 5 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,12 +8,10 @@ every agent follows.
A cairn is a pile of stones left on a trail for whoever comes next. Each task
in Cairn leaves the same kind of marker.

<!-- cairn-phase: 3 -->
<!-- cairn-milestone: M1 -->

> **Status as of 2026-10-29:** phase 1 (contract) is done, and its exit check
> passed with the operator's review of [CONTRACT.md §9](docs/CONTRACT.md#9-settled-here-for-review).
> Phase 2 (core and local store) is done, and its exit check passed. Phase 3
> (MCP adapter) is current. Live progress is on the
> **Status as of 2026-10-30:** M1 (Server-mode MCP) is current. Phases 0 to 2
> are done, and their exit checks passed. Live progress is on the
> [milestones](https://github.com/djm56/cairn-memory/milestones)
> and the [Cairn Memory Roadmap board](https://github.com/djm56/cairn-memory/projects).
>
Expand Down
6 changes: 2 additions & 4 deletions docs/DESIGN.md
Original file line number Diff line number Diff line change
@@ -1,9 +1,7 @@
# Cairn Memory — Design

**Status as of 2026-10-29: phase 1 (contract) is done, and its exit check passed
with the operator's review of
[CONTRACT.md §9](CONTRACT.md#9-settled-here-for-review). Phase 2 (core and local
store) is done, and its exit check passed. Phase 3 (MCP adapter) is current. Live progress is on the
**Status as of 2026-10-30: M1 (Server-mode MCP) is current. Phases 0 to 2 are
done, and their exit checks passed. Live progress is on the
[milestones](https://github.com/djm56/cairn-memory/milestones) and the
[Cairn Memory Roadmap board](https://github.com/djm56/cairn-memory/projects).**

Expand Down
43 changes: 23 additions & 20 deletions docs/PLAN.md
Original file line number Diff line number Diff line change
@@ -1,11 +1,10 @@
# Cairn Memory — Build Plan

<!-- cairn-phase: 3 -->
<!-- cairn-milestone: M1 -->

**Status as of 2026-10-29: phase 1 (contract) is done, and its exit check
passed with the operator's review of [CONTRACT.md](CONTRACT.md) §9. Phase 2
(core and local store) is done, and its exit check passed. Phase 3
(MCP adapter) is current. Live progress is on the
**Status as of 2026-10-30: M1 (Server-mode MCP) is current. Phases 0 to 2 are
done, and their exit checks passed. Plan v1 replaces phases 3 to 10 with the
milestones in §3. Live progress is on the
[milestones](https://github.com/djm56/cairn-memory/milestones) and the
[Cairn Memory Roadmap board](https://github.com/djm56/cairn-memory/projects).
The rule for this line is in §9.**
Expand Down Expand Up @@ -378,24 +377,28 @@ that is not a numbered decision here, and the table says what.

## 9. Project management

- **Milestones** mirror the phases in §3, one milestone per phase.
- **`.github/roadmap.json`** holds copies of each phase's exit check and work
items from §3. Change §3 and roadmap.json together.
- **Board, labels and bootstrap.** The labels, the Projects board and the
roadmap issues are set up by `scripts/github/bootstrap.sh`. It is a dry run
by default. `--apply` fills what is missing and never changes what a person
set. The operator runs `--apply`.
- **Milestones** are the rows of the milestone table in §3: M1 to M8, and
Later. Each has a GitHub milestone of the same name. Phases 0 to 2 are
history; their milestones and labels stay as they are.
- **`.github/roadmap.json`** holds copies of each milestone's exit check, and
the issues that §3 and the Plan v1 issue list name. Change §3 and
roadmap.json together.
- **Board, labels and bootstrap.** The labels (`m1` to `m8`, `later`), the
Projects board and the roadmap issues are set up by
`scripts/github/bootstrap.sh`. It is a dry run by default. `--apply` fills
what is missing and never changes what a person set. The operator runs
`--apply`.
- **Wiki.** The GitHub wiki is published from `wiki/` in this repository.
- **Status.** The status line appears in README.md, in this file, in
docs/DESIGN.md, in docs/CONTRACT.md (whose line states the contract's own
state, draft or approved, rather than the phase), and at the top of each
`wiki/*.md` content page. The `cairn-phase` marker appears in README.md and in
this file. All of these carry the phase only: which phase is current, and
docs/DESIGN.md, and at the top of each `wiki/*.md` content page. The
`cairn-milestone` marker appears in README.md and in this file, and
`scripts/check-docs.sh` checks that the two agree. docs/CONTRACT.md's line
states the contract's own state (draft or approved), not a milestone. The
status lines and the marker name only the milestone that is current, and
whether its exit check has passed. They change together, and only when a
phase's exit check passes, so they cannot go stale between exits.
`scripts/check-docs.sh` checks only the README and PLAN markers, not the
status lines. They never carry pull request numbers or merge state. Live
progress (pull requests, issues, merges) is on the
milestone's exit check passes, so they cannot go stale between exits. They
never carry pull request numbers or merge state. Live progress (pull
requests, issues, merges) is on the
[milestones](https://github.com/djm56/cairn-memory/milestones) and the
[Cairn Memory Roadmap board](https://github.com/djm56/cairn-memory/projects).

Expand Down
52 changes: 25 additions & 27 deletions scripts/check-docs.sh
Original file line number Diff line number Diff line change
@@ -1,9 +1,10 @@
#!/usr/bin/env bash
# check-docs.sh — documentation checks for Cairn (CONTRIBUTING.md).
#
# Phase markers: README.md and docs/PLAN.md must each carry exactly one
# <!-- cairn-phase: N --> marker, N an integer from 0 to 10, and the two N
# must match.
# Milestone markers: README.md and docs/PLAN.md must each carry exactly one
# <!-- cairn-milestone: M --> marker, M the current milestone (M1 to M8, or
# Later), and the two M values must match. The marker changes together with
# the status lines (PLAN §9).
#
# Changelog (pull requests only): CHANGELOG.md must be among the files the
# pull request changes, unless the pull request has the skip-changelog label.
Expand All @@ -13,7 +14,7 @@
#
# --base and --labels default to $PR_BASE_SHA and $PR_LABELS, which the docs
# workflow sets. Without a base the changelog check is skipped, so the script
# also runs locally with the phase check alone. --labels is comma-separated.
# also runs locally with the milestone check alone. --labels is comma-separated.
# Exits 0 when every check passes, 1 when any fails.

set -euo pipefail
Expand Down Expand Up @@ -62,58 +63,55 @@ while [ "$#" -gt 0 ]; do
esac
done

# marker_phase FILE: print the phase N in FILE's single cairn-phase marker.
# Returns 1 with a reason on stderr when the marker is missing, repeated,
# malformed or out of range.
marker_phase() {
# marker_milestone FILE: print the milestone named in FILE's single
# cairn-milestone marker. Returns 1 with a reason on stderr when the marker is
# missing, repeated, malformed or names no milestone.
marker_milestone() {
local file="$1" opens value
if [ ! -f "$file" ]; then
echo "$file: not found" >&2
return 1
fi

# Count occurrences, not lines, so two markers on one line still fail.
opens="$(grep -o -E '<!-- *cairn-phase:' "$file" | wc -l | tr -d ' ' || true)"
opens="$(grep -o -E '<!-- *cairn-milestone:' "$file" | wc -l | tr -d ' ' || true)"
if [ "$opens" -eq 0 ]; then
echo "$file: no <!-- cairn-phase: N --> marker" >&2
echo "$file: no <!-- cairn-milestone: M --> marker" >&2
return 1
fi
if [ "$opens" -gt 1 ]; then
echo "$file: $opens cairn-phase markers, expected exactly one" >&2
echo "$file: $opens cairn-milestone markers, expected exactly one" >&2
return 1
fi

value="$(grep -o -E '<!-- *cairn-phase: *[^ >]* *-->' "$file" | head -n 1 \
| sed -E 's/.*cairn-phase: *([^ >]*) *-->.*/\1/' || true)"
value="$(grep -o -E '<!-- *cairn-milestone: *[^ >]* *-->' "$file" | head -n 1 \
| sed -E 's/.*cairn-milestone: *([^ >]*) *-->.*/\1/' || true)"
case "$value" in
''|*[!0-9]*)
echo "$file: cairn-phase marker is malformed (value: '${value}')" >&2
M[1-8]|Later) ;;
*)
echo "$file: cairn-milestone marker is malformed or names no milestone (value: '${value}'; expected M1 to M8 or Later)" >&2
return 1
;;
esac
if [ "$value" -gt 10 ]; then
echo "$file: cairn-phase $value is out of range (0 to 10)" >&2
return 1
fi
printf '%s\n' "$value"
}

FAILED=0

readme_phase=""
plan_phase=""
if readme_phase="$(marker_phase "$ROOT/README.md")"; then
echo "phase marker: README.md says $readme_phase"
readme_milestone=""
plan_milestone=""
if readme_milestone="$(marker_milestone "$ROOT/README.md")"; then
echo "milestone marker: README.md says $readme_milestone"
else
FAILED=1
fi
if plan_phase="$(marker_phase "$ROOT/docs/PLAN.md")"; then
echo "phase marker: docs/PLAN.md says $plan_phase"
if plan_milestone="$(marker_milestone "$ROOT/docs/PLAN.md")"; then
echo "milestone marker: docs/PLAN.md says $plan_milestone"
else
FAILED=1
fi
if [ -n "$readme_phase" ] && [ -n "$plan_phase" ] && [ "$readme_phase" != "$plan_phase" ]; then
echo "phase marker: README.md ($readme_phase) and docs/PLAN.md ($plan_phase) disagree" >&2
if [ -n "$readme_milestone" ] && [ -n "$plan_milestone" ] && [ "$readme_milestone" != "$plan_milestone" ]; then
echo "milestone marker: README.md ($readme_milestone) and docs/PLAN.md ($plan_milestone) disagree" >&2
FAILED=1
fi

Expand Down