Skip to content

docs(lookbook): true up the nine skills + plan doc; add root CLAUDE.md - #4

Merged
thorwhalen merged 2 commits into
mainfrom
claude/skills-truth-up
Aug 15, 2026
Merged

thorwhalen merged 2 commits into
mainfrom
claude/skills-truth-up

Conversation

@thorwhalen

@thorwhalen thorwhalen commented Aug 15, 2026 •

Copy link
Copy Markdown
Collaborator

Documentation truth pass: two merged PRs (#1 technical_quality scorer + curate_for_character/environment facades, #3 IdentitySimilarity/compare_to_reference) shipped real, federation-consumed capabilities that no skill and no plan doc mentioned. Federation agents could not discover them — which is exactly the failure the skills exist to prevent, and these are the capabilities nw and reelee lean on for character consistency.

What changed

  • All nine skills brought in line with the source. lookbook-dev's "current state" stopped at Phase 5 and claimed HTTP exposes 9 verbs — mk_lookbook_app mounts 10. lookbook-http's route table was missing compare_to_reference. lookbook-curate now documents the two curate facades; lookbook-add-scorer uses the identity and technical-quality scorers as worked examples, since they are now the best ones in the registry.
  • Root CLAUDE.md added (modelled on mixing's) — orientation, capability map, and a pointer to each of the nine skills.
  • misc/docs/lookbook_development_plan.md status table updated to shipped reality.
  • Absolute local path scrubbed from lookbook-dev's frontmatter description — it hardcoded a developer's home directory in a tracked file of a public repo. Repo re-swept; no other path, home-dir or email leaks remain.
  • Public namespace cleaned: Any, Mapping, Optional, Sequence, Union no longer leak into dir(lookbook).

Note for review

The namespace fix was done by extracting the facade implementations out of __init__.py into a new lookbook/facade.py, leaving __init__.py as a thin re-export. That is a larger structural change than the leak strictly required, so it deserves the closer look: __all__ carried over unchanged at 27 names and every one still resolves. (The follow-up commit below adds one name, PluginSpec, bringing it to 28 — see below for why.)

Follow-up commit: the truth pass was itself not fully true

An adversarial review of the first commit found that lookbook-dev/SKILL.md — the file an agent reads first — had not actually been verified against source, so "all nine skills" above was overstated. It shipped two claims this very PR corrects elsewhere, and re-verifying every remaining claim in that file turned up three more. All are now fixed:

Contradicted by another file in the same PR:

  • Manifest filename separator was written ::; store.py's _KEY_SEP is -- (Windows disallows : in filenames). lookbook-storage and store.py's docstring already said --.
  • images store values were described as "bytes / path / url payload"; the slot holds metadata records ({"path": ...}), as lookbook-storage and store.py already said.

Not caught by anything until now:

  • Path defaults claimed ~/Library/Application Support on macOS. config2py uses XDG on all POSIX platforms, macOS included → ~/.local/share/lookbook; Windows goes to %LOCALAPPDATA%. Fixed in the skill and in README.md.
  • The architecture diagram named budget as an orchestration module. There is no budget.py — it was planned and never built. Added a "Not taken up" row for it in the plan doc's status table, beside the meshed.DAG one.
  • The backend layer listed pyiqa and apricot as wrapped. Nothing imports either; they are declared-only [embed] extras, and the same file says FacilityLocation is pure-numpy with "no apricot dep". The diagram now lists what is actually wrapped, identically in the skill, CLAUDE.md and README.md.
  • "The four protocols" headed a list of five. base.py defines five Protocols, four of which form the plugin layer.
  • Stores was "three (and a half) MutableMappings" above a four-row table.
  • "Every function and class named above is a top-level export" was false for TechnicalQuality, which is reachable only as the technical_quality registry name.

Plus the two nits from the same review:

  • pipeline.py's module docstring still sold the meshed.DAG swap as scheduled "Phase 1+" work, which this PR's own plan-doc row calls "Not taken up".
  • PluginSpec was in dir(lookbook) but not in __all__, so the "dir(lookbook) is the public API plus submodules" sentence in CLAUDE.md and lookbook-dev was marginally loose. It is a genuine public type (it is the (name, kwargs) plugin-spec form the facade signatures use), so it is now exported — __all__ is 28 names, and non-underscore dir(lookbook) is now exactly __all__ plus submodules.

Note for whoever lands this: meshed is still a declared core dependency in pyproject.toml although nothing imports it. Removing it is a packaging change with release consequences, so it was deliberately left alone here rather than folded into a docs PR.

pytest -q → 152 passed, 3 skipped (unchanged), with the import pinned to this checkout.

https://claude.ai/code/session_01EvKbcwUUanua9yu5aFsPK8

The two capabilities that shipped after the v1 phases — the
technical_quality scorer with curate_for_character / curate_for_environment,
and the cross-image identity scorer with compare_to_reference — were absent
from every skill and from the plan doc, so an agent reading the skills could
not discover them. This is a truth pass over the docs, verified against
source, plus two small code fixes.

Skills:
- lookbook-dev: new "shipped after the five phases" section; HTTP verb count
  9 -> 10; py2mcp -> fastmcp in the layer diagram; meshed.DAG stated as not
  taken up (nothing imports meshed); frontmatter no longer names a local path.
- lookbook-http: compare_to_reference added to the route table and to the
  mk_lookbook_app funcs list; new step for the MCP mirror; the async-task
  note no longer claims Phase 5 work that never happened.
- lookbook-curate: documents both curate_for_* presets and compare_to_reference,
  including that "passed" is advisory and aggregation="max" means "any view".
- lookbook-add-scorer: real registry contents as a table (registry name vs
  metric_id, tier, requires); the invented face-box sketch replaced by the
  two real worked examples — TechnicalQuality (derived) and IdentitySimilarity
  (cross-image, injected embedder); cost_tier text no longer promises a
  budget controller that does not exist.
- lookbook-add-selector: quota is shipped, not "Phase 3" future work.
- lookbook-profile: technical_quality as the no-face quality signal; the
  unshipped scorers marked as unshipped rather than "Phase 2.5+".
- lookbook-recipe: technical_quality / identity_similarity tunables; points
  at the presets before hand-tuning.
- lookbook-storage: manifest filename separator is "--", not "::" (Windows);
  images defaults to JsonFiles metadata records, not Files bytes.
- lookbook-diagnose: compare_to_reference as a fourth diagnostic; the yaw
  bins have _left twins.

Docs: plan doc status snapshot extended with the post-v1 rows and a post-v1
deliverables section; skill count 8 -> 9; everything below the fold marked
as the original plan of record. README gains the two new sections, fixes
py2mcp -> fastmcp, and lists the new modules.

Code:
- lookbook/__init__.py is now pure re-export: curate / score / curate_for_*
  moved to lookbook/facade.py, so Any/Mapping/Optional/Sequence/Union no
  longer leak into dir(lookbook). __all__ is unchanged and every name in it
  still resolves. _resolve became facade.resolve_plugin (used by
  interactive.py, so no underscore) and interactive.py's dead PluginSpec
  string alias is gone.
- store.py docstrings corrected to the "--" separator and to what the images
  store actually holds.

Tests: python -m pytest -q -> 152 passed, 3 skipped. ruff clean.

Claude-Session: https://claude.ai/code/session_01EvKbcwUUanua9yu5aFsPK8
Review follow-up on the skills truth-up. lookbook-dev/SKILL.md was the one
file the sweep had not fully verified against source; it shipped claims the
same commit had already corrected elsewhere, plus three more that no file
had caught.

Contradicted by other files in the same commit:
- manifest filename separator was `::`; store.py's `_KEY_SEP` is `--`
  (Windows disallows `:`). Now states the reason, matching lookbook-storage.
- `images` store values were "bytes / path / url payload"; the slot holds
  metadata records (`{"path": ...}`) written by `ingest_to_store`.

Newly found, verified against source:
- Path defaults claimed `~/Library/Application Support` on macOS. config2py
  is XDG on all POSIX, macOS included: `~/.local/share/lookbook`. Windows
  goes to `%LOCALAPPDATA%`. Corrected in SKILL.md and README.
- Architecture diagram named `budget` as an orchestration module; there is
  no `budget.py` — it was planned in the plan doc and never built. Added a
  "Not taken up" row for it next to the `meshed.DAG` one.
- Backend layer listed `pyiqa` and `apricot` as wrapped; nothing imports
  either (they are declared-only `[embed]` extras, and the same file says
  FacilityLocation is pure-numpy "no apricot dep"). Now lists what is
  actually wrapped, consistently across SKILL.md, CLAUDE.md and README.
- "four protocols" headed a list of five; base.py defines five Protocols,
  four of which are the plugin layer.
- `Stores` was "three (and a half) MutableMappings" over a four-row table.
- "Every function and class named above is a top-level export" was false
  for `TechnicalQuality`, which is registry-only.

Also:
- pipeline.py's docstring still sold the `meshed.DAG` swap as scheduled
  "Phase 1+" work; it is not scheduled and nothing imports meshed.
- Exported `PluginSpec`, so `dir(lookbook)` really is `__all__` plus
  submodules as CLAUDE.md and lookbook-dev both claim.

Claude-Session: https://claude.ai/code/session_01EvKbcwUUanua9yu5aFsPK8
@thorwhalen
thorwhalen merged commit 34dc028 into main Aug 15, 2026
12 checks passed
@thorwhalen
thorwhalen deleted the claude/skills-truth-up branch August 15, 2026 17:39
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant