Capture the reviewed implementation and manual rehearsal for draft PR review. Master source prerequisites, full clean verification and coordinated Windows CI remain open; production rollout is separate.
Record final reviewed Toolkit and CLI context revisions.
Persist Progress attribution and unresolved W04/W05/W08 prerequisites.
Keep phases 3–6, phase 7 and Manual criteria open.
- writer.ts: export pure planBundle() + WritePlan types; applyBundle now consumes
it (shared computeFileAction/planRules) so classification and application can't drift
- api-content.ts: optional contentHash on LessonSummary (always-fetch fallback when absent)
- generated/api-types.ts: regenerated from local API — catalog lesson type carries contentHash
- tests/writer-plan.test.ts: planBundle/applyBundle parity (created/unchanged/clean/conflict)
F1: updateToolConfig now throws when the merged config has no `tool`
instead of silently persisting an invalid object a later read rejects
wholesale (dropping lang/acknowledgedOrphans).
F2: add command-level course-rules tests — strip-after-apply with
surrounding-content preservation, the human [removed] rules render
line, and the positive --course-rules CAC parse guard.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Land trailing edits: phase 3 SHA write-back into Progress, all manual
verification rows checked (verified live against ~/code/10xCards), and
change.md status → implemented.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
- src/lib/writer.ts: add applyCourseRules?: boolean to ApplyOptions
(default true); when false, skip writing the course block and strip an
existing one via removeRulesBlockWithMarkers (rules.action "removed",
honors dryRun)
- tests/writer.test.ts: opt-out strip / no-op / dry-run / default-idempotent
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Rewrite computeRemovals() for lesson-scoped removal with protected set.
Update manifest building to merge lesson entries, rebuild union files,
and seed from v2/v3-without-lessons manifests. Update existing cleanup
and removal tests for cumulative semantics. Add 8 new behavior tests
covering multi-lesson accumulation, protected-set, upgrade seeding.
Update CLAUDE.md with cumulative manifest documentation.
Files: src/lib/writer.ts, tests/writer.test.ts,
tests/writer-profiles.test.ts, CLAUDE.md
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Add LessonFilesEntry type, lessons? field on CliManifest, isManifest()
validation for lessons, and buildUnionFiles() helper. Includes frame
brief, plan, and plan-brief for the change.
Files: src/lib/manifest.ts, tests/manifest.test.ts,
context/changes/cumulative-manifest/{change,frame,plan,plan-brief}.md
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Analysis of how cumulative per-lesson tracking integrates with
user-edit-protection's v3 manifest, proposed schema shape, upgrade
paths, computeRemovals() rewrite strategy, and interaction matrix.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- Update CLAUDE.md with conflict detection, manifest v3, and removal tracking docs
- Set change.md status to implemented
- Write final SHA references into plan progress section
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- Conflict detection: clean update, user edit, matching edit, each resolution
- v2 manifest upgrade: false positive on diff, clean match, v3 upgrade, 3-way after upgrade
- Removal tracking: skill/prompt removals, empty on fresh, dry-run populates
- Hash persistence: stored after apply, preserved on skip, updated on overwrite/save_user
- Non-TTY conflict resolver: always skips without prompting
- Update get-command test types for new counts.removals field
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- Create conflict-prompt.ts with TTY/non-TTY conflict resolver factory
- Wire createConflictResolver and showUpgradeNotice into get command
- Add v2 manifest upgrade detection before applyBundle
- Render [removed] lines for skill/prompt/config removals
- Render conflict-specific action labels (conflict: overwritten/saved .user/skipped)
- Add removals to JSON output envelope with counts.removals
- Update get-command test for new counts shape
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- Make applyBundle() async with ConflictResolver callback injection
- Three-way conflict detection via stored content hashes in manifest
- Conflict resolutions: overwrite, save-as-.user.<ext>, skip
- Track removals in WriteResult.removals for downstream rendering
- Store per-file contentHashes and promptHashes in v3 manifest
- Update all tests for async applyBundle (writer + writer-profiles)
- Await applyBundle in get.ts command
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- Bump MANIFEST_VERSION to 3 with optional contentHashes/promptHashes fields
- Add contentHash() SHA-256 utility in manifest.ts
- isManifest() accepts both v2 and v3 for backward compat
- Update test assertions for v3 manifest version
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- .github/workflows/ci.yml: add e2e + e2e-windows jobs with Resend secrets,
extend check-windows with build:binary + smoke tests
- docs/reference/platform-support.md: update CI testing table to match reality
- context/changes/e2e/plan.md: mark phase 5 automated steps complete
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>