# culture.dev Positioning Implementation Plan

> **For agentic workers:** REQUIRED SUB-SKILL: Use superpowers:subagent-driven-development (recommended) or superpowers:executing-plans to implement this plan task-by-task. Steps use checkbox (`- [ ]`) syntax for tracking.

**Goal:** Reframe culture.dev positioning away from "stateless vs persistent" contrast per issue #267. Rename `why-culture.md` → `what-is-culture.md` (with rewrite), adjust `vision.md` and `mental-model.md` to match, install `jekyll-redirect-from` so `/why-culture/` redirects cleanly, and create `docs/resources/positioning.md` as canonical reusable copy.

**Architecture:** Docs-only change on a Jekyll site. No Python, no protocol, no backends. Copy lives in four prose files; one new Jekyll plugin provides the redirect. The canonical paragraph is duplicated character-identically in two places (page intro + positioning.md) — a grep check at the end enforces parity.

**Tech Stack:** Jekyll 4.3 (`just-the-docs` theme), `jekyll-redirect-from`, `markdownlint-cli2`, `bundle`, `uv` (for version bump via `/version-bump`).

**Spec:** `docs/superpowers/specs/2026-04-18-culture-dev-positioning-design.md`

---

## File Structure

**Create:**

- `docs/culture/what-is-culture.md` (via `git mv` from `why-culture.md`, then full rewrite) — the new definitional anchor.
- `docs/resources/positioning.md` — canonical snippets, not built into the site (already in `_config.base.yml` exclude list).

**Modify:**

- `docs/culture/vision.md` — H1, first-paragraph trim, `nav_order` bump.
- `docs/culture/mental-model.md` — rewrite the second paragraph of the Persistence section.
- `Gemfile` — add `gem "jekyll-redirect-from"`.
- `Gemfile.lock` — regenerated by `bundle install`.
- `_config.base.yml` — add `jekyll-redirect-from` to `plugins:` list.
- `pyproject.toml` + `CHANGELOG.md` — bumped to 7.1.5 by `/version-bump patch`.

**No new Python, no new CSS, no new sidebar structure.**

---

## Task 1: Branch + install `jekyll-redirect-from` plugin

**Files:**

- Modify: `Gemfile`
- Modify: `_config.base.yml:14-17`
- Regenerated: `Gemfile.lock`

**Context:** `jekyll-redirect-from` is a core-team Jekyll plugin that generates static redirect pages from the `redirect_from:` frontmatter key. Needed because Task 2 renames `why-culture.md` → `what-is-culture.md`; existing inbound links to `/why-culture/` must continue to work.

- [ ] **Step 1: Create the working branch**

```bash
git -C /home/spark/git/culture checkout -b docs/culture-positioning-267
```

Expected: `Switched to a new branch 'docs/culture-positioning-267'`

- [ ] **Step 2: Add the gem to `Gemfile`**

Current `Gemfile` (verify with `cat /home/spark/git/culture/Gemfile`):

```ruby
source "https://rubygems.org"

gem "jekyll", "~> 4.3"
gem "just-the-docs", "~> 0.10"
gem "jekyll-seo-tag"
gem "jekyll-relative-links"
gem "jekyll-sitemap"
```

Add one line after `gem "jekyll-sitemap"`:

```ruby
gem "jekyll-redirect-from"
```

Use `Edit` tool — old_string is `gem "jekyll-sitemap"\n`, new_string is `gem "jekyll-sitemap"\ngem "jekyll-redirect-from"\n`.

- [ ] **Step 3: Add the plugin to `_config.base.yml`**

Edit `_config.base.yml` lines 14-17. Current:

```yaml
plugins:
  - jekyll-seo-tag
  - jekyll-relative-links
  - jekyll-sitemap
```

Change to:

```yaml
plugins:
  - jekyll-seo-tag
  - jekyll-relative-links
  - jekyll-sitemap
  - jekyll-redirect-from
```

- [ ] **Step 4: Run `bundle install`**

```bash
cd /home/spark/git/culture && bundle install
```

Expected output includes `Fetching jekyll-redirect-from ...` and `Installing jekyll-redirect-from ...`. `Gemfile.lock` should now contain `jekyll-redirect-from` as a dependency.

- [ ] **Step 5: Verify Jekyll still builds**

```bash
cd /home/spark/git/culture && bundle exec jekyll build --config _config.base.yml,_config.culture.yml --destination _site_culture
```

Expected: exit code 0, last line `done in N.NN seconds.`

- [ ] **Step 6: Commit**

```bash
git -C /home/spark/git/culture add Gemfile Gemfile.lock _config.base.yml
git -C /home/spark/git/culture commit -m "$(cat <<'EOF'
build: add jekyll-redirect-from plugin

Enables redirect_from frontmatter for upcoming page rename
(why-culture.md -> what-is-culture.md) per #267.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
EOF
)"
```

Expected: pre-commit hooks pass (only the Gemfile and yaml hooks run for this change).

---

## Task 2: Rename `why-culture.md` → `what-is-culture.md` and fully rewrite

**Files:**

- Rename: `docs/culture/why-culture.md` → `docs/culture/what-is-culture.md` (via `git mv`)
- Rewrite: `docs/culture/what-is-culture.md` — full replacement body

**Context:** This is the central edit. The new page replaces all content from `why-culture.md` and establishes the definitional positioning per the spec. The `redirect_from: [/why-culture/]` frontmatter field preserves inbound links.

- [ ] **Step 1: Rename the file via `git mv`**

```bash
git -C /home/spark/git/culture mv docs/culture/why-culture.md docs/culture/what-is-culture.md
```

Expected: no output on success. `git status` now shows `renamed: docs/culture/why-culture.md -> docs/culture/what-is-culture.md`.

- [ ] **Step 2: Replace file contents**

Use the `Write` tool to overwrite `docs/culture/what-is-culture.md` with:

```markdown
---
title: "What is Culture?"
parent: "Vision & Patterns"
nav_order: 1
sites: [culture]
description: Culture is a professional workspace for specialized agents. Here's what that means.
permalink: /what-is-culture/
redirect_from:
  - /why-culture/
---

# What is Culture?

Culture is a professional workspace for specialized agents. Through AgentIRC,
it provides the shared environment — rooms, presence, roles, coordination,
and history that persists across sessions — where agents and humans work
together. Harnesses are optional connectors: they let an agent stay present
in the culture without being pushed to read every message, so participating
in the workspace doesn't mean drowning in it.

## A professional workspace for specialized agents

A culture is one or more rooms with named members. Some members are humans,
some are specialized agents — a reviewer, a test runner, a migration watcher,
a writer. Agents and humans share the same rooms and the same protocol, so
collaboration is native rather than brokered through an API. You decide
which roles to fill, and the workspace grows as you add them.

## The unit of design is the culture, not the single agent

You don't configure one agent to be everything. You compose a culture — pick
the rooms, invite the members, assign the roles — and each member stays
focused on what it does well. A small team might have one room and two
specialists; a larger one might span servers and host a dozen. The culture
starts minimal and gains structure as it earns it.

## Teachability supports the workspace

Continuity in Culture lives in two places. The workspace itself persists —
rooms, history, presence, and roles survive across sessions — so new members
join an ongoing context rather than a blank slate. And your agent can bring
its own persistence on top: a skill that learns from each task, a memory
system, per-project notes. That belongs to the agent, and it fits naturally
inside a culture.

Teachability is real and important — but it is not what sets Culture apart.
What sets Culture apart is the shared professional workspace of specialized
agents.

## Reference points

Systems like OpenClaw are useful reference points because they focus on the
growth of an individual agent through files. Culture focuses instead on the
workspace where specialized agents operate together. These are different
models, not opposing ones.

Codex and Claude Code are also useful reference points: they each have their
own ways of persisting context and improving over time, but the center of
gravity is still the individual agent or session flow rather than the culture
as a workspace.

These are different shapes, not rivals. An agent that carries its own memory
— built the OpenClaw way or with a skill that learns from each task — fits
naturally in a culture; the workspace is a place for such agents to operate,
not a replacement for what they already carry.

## Continue reading

- For the broader model and where this is going → [Vision]({{ '/vision/' | relative_url }}).
- For the conceptual model (spaces, membership, reflection) → [Mental model]({{ '/mental-model/' | relative_url }}).
- For the capability list → [Features]({{ '/features/' | relative_url }}).
```

- [ ] **Step 3: Run markdownlint on the new file**

```bash
cd /home/spark/git/culture && markdownlint-cli2 "docs/culture/what-is-culture.md"
```

Expected: exit code 0, no violations. If markdownlint flags line-length (MD013), the existing `.markdownlint-cli2.yaml` disables it — verify the file doesn't introduce anything the repo config hasn't already disabled.

- [ ] **Step 4: Build Jekyll and verify the page renders + redirect is emitted**

```bash
cd /home/spark/git/culture && bundle exec jekyll build --config _config.base.yml,_config.culture.yml --destination _site_culture
```

Expected: exit code 0.

Then verify the redirect file was generated:

```bash
ls /home/spark/git/culture/_site_culture/why-culture/index.html
cat /home/spark/git/culture/_site_culture/why-culture/index.html | head -20
```

Expected: file exists, contains a `<meta http-equiv="refresh" content="0; url=.../what-is-culture/">` tag produced by `jekyll-redirect-from`.

Then verify the new page exists:

```bash
ls /home/spark/git/culture/_site_culture/what-is-culture/index.html
```

Expected: file exists.

- [ ] **Step 5: Commit**

```bash
git -C /home/spark/git/culture add docs/culture/what-is-culture.md
git -C /home/spark/git/culture commit -m "$(cat <<'EOF'
docs(culture): rename Why Culture to What is Culture? and rewrite

Replaces adversarial "Persistent, not ephemeral" framing with positive
definitional content per #267. New page intro, "A professional workspace
for specialized agents", "The unit of design is the culture", "Teachability
supports the workspace", and a Reference points section that names OpenClaw,
Codex, and Claude Code as neighbors rather than targets.

Permalink moves to /what-is-culture/ with redirect_from /why-culture/.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
EOF
)"
```

---

## Task 3: Adjust `vision.md` (H1, intro trim, nav_order)

**Files:**

- Modify: `docs/culture/vision.md`

**Context:** Today `vision.md` has `# What is Culture?` as its H1 and opens with a sentence that duplicates the new page's job. With `what-is-culture.md` taking the definitional role, `vision.md` shifts to the worldview/lifecycle role. This edit changes the H1 and removes one sentence; the rest of the body stays.

- [ ] **Step 1: Update `nav_order` in frontmatter**

Current frontmatter line (line 4):

```yaml
nav_order: 1
```

Change to:

```yaml
nav_order: 2
```

Use `Edit` tool on `docs/culture/vision.md`:

- `old_string`: `nav_order: 1`
- `new_string`: `nav_order: 2`

- [ ] **Step 2: Change the H1**

Current (line 13):

```markdown
# What is Culture?
```

Change to:

```markdown
# The Culture vision
```

Use `Edit` tool:

- `old_string`: `# What is Culture?`
- `new_string`: `# The Culture vision`

- [ ] **Step 3: Remove the migrated intro sentence**

Current (lines 15-16):

```
Culture is a space where humans and AI agents live and work side by side.
You decide what that space looks like.
```

Change to:

```
You decide what that space looks like.
```

Use `Edit` tool:

- `old_string`: `Culture is a space where humans and AI agents live and work side by side.\nYou decide what that space looks like.`
- `new_string`: `You decide what that space looks like.`

Note: the remaining sentence leads naturally into `## You design the structure` below it.

- [ ] **Step 4: Run markdownlint**

```bash
cd /home/spark/git/culture && markdownlint-cli2 "docs/culture/vision.md"
```

Expected: exit code 0.

- [ ] **Step 5: Build Jekyll and verify the sidebar + page**

```bash
cd /home/spark/git/culture && bundle exec jekyll build --config _config.base.yml,_config.culture.yml --destination _site_culture
```

Expected: exit code 0.

Verify H1 in built output:

```bash
grep -E "(<h1|The Culture vision)" /home/spark/git/culture/_site_culture/vision/index.html | head -5
```

Expected: at least one match showing `The Culture vision` inside an `<h1>` tag.

- [ ] **Step 6: Commit**

```bash
git -C /home/spark/git/culture add docs/culture/vision.md
git -C /home/spark/git/culture commit -m "$(cat <<'EOF'
docs(culture): retitle vision.md to 'The Culture vision'

Trims the duplicative intro sentence (migrated to what-is-culture.md)
and pushes Vision to nav_order=2, behind the new What is Culture?
page. Vision now owns the longer-horizon/social-model axis; What is
Culture? owns the definitional axis. Ref #267.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
EOF
)"
```

---

## Task 4: Rewrite `mental-model.md` Persistence section

**Files:**

- Modify: `docs/culture/mental-model.md:33-40`

**Context:** The Persistence section's second paragraph reads *"This persistence is what makes ongoing collaboration possible — not one-shot task execution, but work that continues over time."* The "not one-shot task execution" contrast is exactly what #267 warns against. Replace the paragraph with a positive framing that treats persistence as a property supporting the workspace, not as a contrast axis.

- [ ] **Step 1: Replace the second paragraph of the Persistence section**

Use `Edit` tool on `docs/culture/mental-model.md`.

- `old_string`:

```
This persistence is what makes ongoing collaboration possible — not one-shot
task execution, but work that continues over time.
```

- `new_string`:

```
Persistence gives agents a stable ongoing context for work, so they can
continue participating in the culture over time. It is one of the properties
that helps the workspace hold together across sessions.
```

No other sections of `mental-model.md` change.

- [ ] **Step 2: Run markdownlint**

```bash
cd /home/spark/git/culture && markdownlint-cli2 "docs/culture/mental-model.md"
```

Expected: exit code 0.

- [ ] **Step 3: Grep to confirm the old phrase is gone from `docs/culture/`**

```bash
grep -rn "not one-shot" /home/spark/git/culture/docs/culture/
```

Expected: no output (exit code 1 in grep — that's success for this gate).

Also:

```bash
grep -rn "not ephemeral\|isolated, ephemeral" /home/spark/git/culture/docs/culture/
```

Expected: no output. Any hit means residual adversarial framing that needs addressing before continuing.

- [ ] **Step 4: Build Jekyll**

```bash
cd /home/spark/git/culture && bundle exec jekyll build --config _config.base.yml,_config.culture.yml --destination _site_culture
```

Expected: exit code 0.

- [ ] **Step 5: Commit**

```bash
git -C /home/spark/git/culture add docs/culture/mental-model.md
git -C /home/spark/git/culture commit -m "$(cat <<'EOF'
docs(culture): reframe mental-model persistence as positive property

Removes the 'not one-shot task execution' contrast, which #267 warns
against. Persistence is now described as a property that supports
agents' continued participation in the culture, not as a contrast
with competitors.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
EOF
)"
```

---

## Task 5: Create `docs/resources/positioning.md`

**Files:**

- Create: `docs/resources/positioning.md`

**Context:** Canonical positioning snippets for reuse in README, GitHub repo description, site meta, and LLM summarizers. Lives under `docs/resources/` alongside `visual-anchor.md` and `docs-renovations.md`; that directory is in `_config.base.yml`'s `exclude:` list, so this file is not built into the Jekyll site. It is a reference for human and agent editors of this repo.

- [ ] **Step 1: Create the file**

Use `Write` tool to create `docs/resources/positioning.md` with:

```markdown
---
title: "Positioning"
---

# Positioning

Canonical copy for the README, GitHub repo description, site meta, and
anywhere an LLM summarizer might ingest one paragraph about Culture. Keep
these blocks in sync with `docs/culture/what-is-culture.md`; this file
is the source of truth.

## The paragraph

Culture is a professional workspace for specialized agents. Through AgentIRC,
it provides the shared environment — rooms, presence, roles, coordination,
and history that persists across sessions — where agents and humans work
together. Harnesses are optional connectors: they let an agent stay present
in the culture without being pushed to read every message, so participating
in the workspace doesn't mean drowning in it.

## Reference points

Systems like OpenClaw are useful reference points because they focus on the
growth of an individual agent through files. Culture focuses instead on the
workspace where specialized agents operate together. These are different
models, not opposing ones.

Codex and Claude Code are also useful reference points: they each have their
own ways of persisting context and improving over time, but the center of
gravity is still the individual agent or session flow rather than the culture
as a workspace.

These are different shapes, not rivals. An agent that carries its own memory
— built the OpenClaw way or with a skill that learns from each task — fits
naturally in a culture; the workspace is a place for such agents to operate,
not a replacement for what they already carry.

## When to use which

- **Site meta description / short bios (≤160 chars):** the first sentence
  only — "Culture is a professional workspace for specialized agents."
- **README, GitHub "About", LLM summaries:** the full paragraph.
- **Comparison or positioning questions:** the full paragraph plus the
  Reference points block.
```

- [ ] **Step 2: Run markdownlint**

```bash
cd /home/spark/git/culture && markdownlint-cli2 "docs/resources/positioning.md"
```

Expected: exit code 0.

- [ ] **Step 3: Verify the file is NOT built into the site**

```bash
cd /home/spark/git/culture && bundle exec jekyll build --config _config.base.yml,_config.culture.yml --destination _site_culture
ls /home/spark/git/culture/_site_culture/resources/ 2>&1 || echo "not present — expected"
```

Expected: `_site_culture/resources/` does not exist (directory excluded via `_config.base.yml` line 54). If it *does* exist, the exclusion rule has drifted — fix before continuing.

- [ ] **Step 4: Parity check — canonical paragraph is character-identical across locations**

```bash
cd /home/spark/git/culture && diff \
  <(awk '/^# What is Culture\?/{flag=1; next} flag && /^## /{exit} flag' docs/culture/what-is-culture.md) \
  <(awk '/^## The paragraph/{flag=1; next} flag && /^## /{exit} flag' docs/resources/positioning.md)
```

Expected: no diff output (exit code 0). If the two paragraphs drift, fix before committing. This gate is what keeps the canonical paragraph single-sourced.

- [ ] **Step 5: Commit**

```bash
git -C /home/spark/git/culture add docs/resources/positioning.md
git -C /home/spark/git/culture commit -m "$(cat <<'EOF'
docs(resources): add positioning.md canonical snippets

Source-of-truth copy for README, site meta, repo description, and LLM
summarizers. Mirrors the intro paragraph of /what-is-culture/ and the
Reference points block verbatim. Lives in docs/resources/ (excluded
from the Jekyll build). Ref #267.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
EOF
)"
```

---

## Task 6: Version bump + CHANGELOG entry

**Files:**

- Modify: `pyproject.toml` (via `/version-bump`)
- Modify: `CHANGELOG.md` (via `/version-bump`)
- Modify: `uv.lock` (if `/version-bump` touches it)

**Context:** Per `CLAUDE.md`: "Bump the version before creating a PR." Docs-only change → patch bump → 7.1.4 → 7.1.5.

- [ ] **Step 1: Run `/version-bump patch` as a Skill**

Invoke the `version-bump` skill with argument `patch`. This updates `pyproject.toml`, inserts a new section at the top of `CHANGELOG.md` under `[7.1.5] - 2026-04-18`, and (when applicable) updates `uv.lock`.

If running outside a Claude Code session, fall back to manual edits:

```bash
# pyproject.toml — change version = "7.1.4" to version = "7.1.5"
# CHANGELOG.md — insert at top (after the "All notable changes..." block):
#   ## [7.1.5] - 2026-04-18
#
#   ### Changed
#
#   - Renamed `docs/culture/why-culture.md` → `docs/culture/what-is-culture.md` and rewrote the body to lead with the definitional "Culture is a professional workspace for specialized agents" framing. Added Reference points section that names OpenClaw, Codex, Claude Code as neighbors rather than targets (#267).
#   - `docs/culture/vision.md` retitled to "The Culture vision"; `nav_order` pushed to 2 behind What is Culture?. Intro trimmed to remove duplicate definitional sentence (#267).
#   - `docs/culture/mental-model.md` Persistence section reframed: removed "not one-shot task execution" contrast; persistence now presented as a property that supports ongoing participation in the culture (#267).
#
#   ### Added
#
#   - `jekyll-redirect-from` plugin added to Gemfile and `_config.base.yml` so `/why-culture/` redirects to `/what-is-culture/` without breaking inbound links (#267).
#   - `docs/resources/positioning.md`: canonical positioning snippets (the paragraph + reference points + usage notes). Source of truth for README, repo description, site meta, and LLM summarizers (#267).
```

- [ ] **Step 2: Verify the version bumped**

```bash
grep "^version" /home/spark/git/culture/pyproject.toml
```

Expected: `version = "7.1.5"`.

```bash
head -5 /home/spark/git/culture/CHANGELOG.md | grep "7.1.5"
```

Expected: `## [7.1.5] - 2026-04-18` appears near the top.

- [ ] **Step 3: Commit (if `/version-bump` didn't commit on its own)**

Check with `git status`; if `pyproject.toml` and `CHANGELOG.md` are staged-but-uncommitted or unstaged:

```bash
git -C /home/spark/git/culture add pyproject.toml CHANGELOG.md uv.lock 2>/dev/null
git -C /home/spark/git/culture commit -m "$(cat <<'EOF'
chore: bump version to 7.1.5 for culture.dev positioning (#267)

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
EOF
)"
```

(`uv.lock` may not change for a pure version bump; the `2>/dev/null` swallows "did not match any files" if it's untouched.)

---

## Task 7: Final verification gate

**Files:** (read-only checks)

**Context:** Runs every verification criterion from the spec in one pass. Any failure here blocks the PR.

- [ ] **Step 1: Clean rebuild**

```bash
cd /home/spark/git/culture && rm -rf _site_culture && bundle exec jekyll build --config _config.base.yml,_config.culture.yml --destination _site_culture
```

Expected: exit code 0.

- [ ] **Step 2: Markdownlint sweep across all four touched markdown files**

```bash
cd /home/spark/git/culture && markdownlint-cli2 \
  "docs/culture/what-is-culture.md" \
  "docs/culture/vision.md" \
  "docs/culture/mental-model.md" \
  "docs/resources/positioning.md"
```

Expected: exit code 0, no violations.

- [ ] **Step 3: Redirect verification**

```bash
test -f /home/spark/git/culture/_site_culture/why-culture/index.html && \
  grep -q "what-is-culture" /home/spark/git/culture/_site_culture/why-culture/index.html && \
  echo "redirect OK" || echo "redirect BROKEN"
```

Expected: `redirect OK`.

- [ ] **Step 4: Grep gate — no "not X" contrast phrasing remains in `docs/culture/`**

```bash
grep -rnE "not one-shot|not ephemeral|isolated, ephemeral" /home/spark/git/culture/docs/culture/
```

Expected: no output. (`docs/agentirc/` and `docs/superpowers/plans/` hits from earlier remain, but they are out of scope per the spec.)

- [ ] **Step 5: Sidebar ordering check**

Open the built site locally if possible:

```bash
cd /home/spark/git/culture && bundle exec jekyll serve --config _config.base.yml,_config.culture.yml --destination _site_culture --no-watch &
sleep 3
curl -s http://127.0.0.1:4000/ > /dev/null && echo "server up" || echo "server FAIL"
kill %1 2>/dev/null
```

For manual sidebar verification, load `http://127.0.0.1:4000/what-is-culture/` and confirm the "Vision & Patterns" nav group shows **What is Culture?** above **Vision**. (The agent executing this step may skip the manual browser check; ordering is also verifiable via grepping `nav_order` in the two frontmatters — `what-is-culture.md` = 1, `vision.md` = 2.)

Automated sidebar-order check:

```bash
grep -E "^nav_order:" /home/spark/git/culture/docs/culture/what-is-culture.md /home/spark/git/culture/docs/culture/vision.md
```

Expected:

```
docs/culture/what-is-culture.md:nav_order: 1
docs/culture/vision.md:nav_order: 2
```

- [ ] **Step 6: Canonical paragraph parity**

Re-run the diff from Task 5 step 4:

```bash
cd /home/spark/git/culture && diff \
  <(awk '/^# What is Culture\?/{flag=1; next} flag && /^## /{exit} flag' docs/culture/what-is-culture.md) \
  <(awk '/^## The paragraph/{flag=1; next} flag && /^## /{exit} flag' docs/resources/positioning.md)
```

Expected: no diff output.

- [ ] **Step 7: OpenClaw + Codex reference parity**

```bash
cd /home/spark/git/culture && diff \
  <(awk '/^## Reference points/{flag=1; next} flag && /^## /{exit} flag' docs/culture/what-is-culture.md | sed '/^## Continue reading/,$d') \
  <(awk '/^## Reference points/{flag=1; next} flag && /^## /{exit} flag' docs/resources/positioning.md)
```

Expected: no diff output. This confirms the OpenClaw paragraph + Codex/Claude Code line + closing sentences are character-identical across both locations.

- [ ] **Step 8: Push the branch**

```bash
git -C /home/spark/git/culture push -u origin docs/culture-positioning-267
```

Expected: `Branch 'docs/culture-positioning-267' set up to track...`.

- [ ] **Step 9: Open the PR**

```bash
gh pr create --repo OriNachum/culture --title "docs: reframe culture.dev positioning — Why Culture → What is Culture? (#267)" --body "$(cat <<'EOF'
## Summary

- Renames `docs/culture/why-culture.md` → `docs/culture/what-is-culture.md` with a full rewrite. New page leads with "Culture is a professional workspace for specialized agents" and replaces "Persistent, not ephemeral" framing with positive definitional content.
- Adds a Reference points section that names OpenClaw, Codex, and Claude Code as neighbors rather than targets; welcomes per-agent persistence as fitting inside Culture.
- Retitles `docs/culture/vision.md` to "The Culture vision" and pushes its `nav_order` to 2 behind What is Culture?. Trims the duplicate definitional sentence from the intro.
- Reframes `docs/culture/mental-model.md` Persistence section: removes "not one-shot task execution" contrast; persistence now presented as a property that supports ongoing participation.
- Adds `docs/resources/positioning.md` (not built into the site) as canonical reusable copy for README, repo description, site meta, and LLM summarizers.
- Installs `jekyll-redirect-from` so `/why-culture/` redirects to `/what-is-culture/`.
- Version bumped to 7.1.5.

Spec: `docs/superpowers/specs/2026-04-18-culture-dev-positioning-design.md`

Closes #267.

## Test plan

- [x] `bundle exec jekyll build` exits 0 (culture site)
- [x] `markdownlint-cli2` passes on all four edited markdown files
- [x] `/why-culture/` redirects to `/what-is-culture/` on built site
- [x] Grep gate: no `not one-shot | not ephemeral | isolated, ephemeral` in `docs/culture/`
- [x] What is Culture? above Vision in "Vision & Patterns" sidebar
- [x] Canonical paragraph character-identical between `what-is-culture.md` and `positioning.md`
- [x] Reference points block character-identical between the two locations
- [ ] Reviewer confirms `culture.dev` preview build looks correct
- [ ] `/sonarclaude` check green before marking ready

🤖 Generated with [Claude Code](https://claude.com/claude-code)
EOF
)"
```

Expected: GitHub returns a PR URL.

---

## Self-Review

**Spec coverage walkthrough:**

| Spec requirement | Task | Status |
|---|---|---|
| Install `jekyll-redirect-from` (Edit plan §5) | Task 1 | ✅ |
| Rename `why-culture.md` → `what-is-culture.md` (Edit plan §1) | Task 2 | ✅ |
| New page frontmatter (permalink, redirect_from, nav_order) | Task 2 | ✅ |
| New page body — all 5 sections and closing callout | Task 2 | ✅ |
| Canonical paragraph used verbatim in page intro | Task 2 | ✅ |
| OpenClaw + Codex/Claude Code + closing in Reference points | Task 2 | ✅ |
| Vision.md H1 → "The Culture vision" (Edit plan §2) | Task 3 | ✅ |
| Vision.md intro trim (remove migrated sentence) | Task 3 | ✅ |
| Vision.md `nav_order: 2` | Task 3 | ✅ |
| Mental-model Persistence rewrite (Edit plan §3) | Task 4 | ✅ |
| Create `docs/resources/positioning.md` (Edit plan §4) | Task 5 | ✅ |
| Version bump to 7.1.5 (Rollout) | Task 6 | ✅ |
| Verification §1 (Jekyll build exits 0) | Task 7 step 1 | ✅ |
| Verification §2 (markdownlint passes) | Task 7 step 2 | ✅ |
| Verification §3 (redirect works) | Task 7 step 3 | ✅ |
| Verification §4 (manual read-through on built site) | Task 7 step 5 (automated fallback) | ✅ |
| Verification §5 (sidebar ordering) | Task 7 step 5 | ✅ |
| Verification §6 (parity check) | Task 7 steps 6 + 7 | ✅ |
| Verification §9 (grep gate) | Task 4 step 3 + Task 7 step 4 | ✅ |
| Branch + PR + SonarCloud (Rollout) | Task 7 steps 8 + 9 | ✅ |

**Placeholder scan:** No "TBD", "TODO", "implement later", "handle edge cases", or "similar to Task N" — every task shows the exact code, exact command, and expected output.

**Type / identifier consistency:** File paths match across tasks. Permalink `/what-is-culture/` used consistently. `nav_order` values (1 and 2) match the frontmatter writes. Verbatim paragraphs appear identically in Tasks 2 and 5 (parity gate enforces this at build time).

**One note for the executor:** Task 6's `/version-bump` invocation relies on the `version-bump` skill being available in the session. The fallback manual edits are written out explicitly. If `/version-bump` updates `CHANGELOG.md` with a generic blurb instead of the detailed entries above, overwrite with the detailed entries before committing.
