Skip to content

Latest commit

 

History

History
386 lines (309 loc) · 21.6 KB

File metadata and controls

386 lines (309 loc) · 21.6 KB

Changelog

All notable changes to this project will be documented in this file.

Format follows Keep a Changelog. This project adheres to Semantic Versioning.

[0.8.0] - 2026-07-24

Added

  • FaceEngine (engine.py): the YuNet+SFace engine extracted from reachy-mini-cli — lazy cv2 import, model-zoo download with .part-then-rename and size sanity floors, synchronous largest-face detect(); byte-identical model URLs/filenames preserve the embedding space, plus an opportunistic (fully guarded) cv2 CUDA DNN backend on the detector only
  • FaceStore (store.py): the ported two-tier embedding store — cosine matching, faces.json + one .npy per embedding (byte-compatible with reachy-written stores, proven by a reachy-authored fixture), secrets-generated 4-char ids, write-then-replace saves, corrupt-index degrade, base_dir=/clock=/now= determinism seams
  • Per-consumer face banks (state.py): $FACE_RECOGNITION_STATE_DIR → $XDG_STATE_HOME/face-recognition-cli → ~/.local/state/face-recognition-cli, with banks/<name>/ per consumer, $FACE_RECOGNITION_BANK / --bank selection, and a bank-independent shared models/ directory
  • CLI verbs: enroll, match, list, forget, and forget-all (dry-run by default, --apply commits, per-bank scoped) — every verb takes --json and --bank; enroll/match take --image <path> or - for stdin bytes
  • build_face_recognition(*, models_dir=None, store_base_dir=None) public API (api.py, re-exported at the package root): probe-first, lazy-import, returns (engine, store) or None with one process-wide warning — the call shape reachy-mini-cli already uses
  • [cpu] and [gpu] extras (both opencv-python-headless over the same ONNX models — same embedding space) and numpy as the single base dependency
  • explain catalog entries for the five verbs plus a banks concept entry; a skippable end-to-end enroll→match roundtrip test; a reachy-store compatibility fixture

Changed

  • README rewritten to the shipped surface, including a Privacy & consent section (local-only storage, sole network path = one-time model download, one-verb deletion)
  • CLAUDE.md realigned: domain work moved from planned to landed, the five open questions recorded as decisions
  • CLI parser/learn/overview self-descriptions updated from the template wording to face identity

[0.7.0] - 2026-07-24

Added

  • CLAUDE.md is now a real runtime prompt — the /init pass replaced the bootstrap seed. Grounded in the build brief (#1) and the sibling reachy-mini-cli checkout, it documents: the agent-first CLI contract (verb registration, the parser_class=type(p) rule for noun groups, the CliError / hint: / exit-code policy, the stdout-vs-stderr split, the explain catalog gotcha); the deliberate naming split (console script face-recognition, import package face_recognition_cli — never face_recognition, which would shadow the unrelated dlib distribution on PyPI); the planned domain work (the YuNet+SFace FaceEngine and FaceStore to extract, their contracts and test seams, the dry-run-by-default forget-all, the build_face_recognition API reachy-mini-cli consumes); the [cpu] / [gpu] compute-class split and its non-negotiable same-embedding-space invariant; the five open design questions from the brief; the migration protocol for reachy-mini-cli (open an issue, publish first, never push into that repo); and CI/release, skills, and workflow conventions. Planned work is marked as planned throughout — no face-recognition code is checked in yet.
  • Worktree, memory, and ask-colleague conventions restored into CLAUDE.md. CHANGELOG.md 0.6.1 documented a worktree-location convention that lived in the template's CLAUDE.md and was lost when the scaffold replaced that file with the seed; it is back, repo-named as ../.worktrees.face-recognition-cli/<name>/. The memory-discipline note is written against the vendored scripts' actual behaviour (default --visibility public → the in-repo <repo-root>/.eidetic/memory), which differs from the description text in the skills' own frontmatter.
  • A Privacy section in README.md — the build brief asks for the biometric stance to be written down, since this repo is public and the tool stores identifiers of real people. States the design commitments: everything stays on the machine, the only network access is the one-time OpenCV model-zoo download, deletion is a first-class verb (forget / forget-all), and what is stored is a 128-dim embedding rather than a photograph.
  • A Roadmap section in README.md listing the planned enroll / match / list / forget / forget-all verbs (with forget-all documented as dry-run-by-default, --apply to commit) and the [cpu] / [gpu] extras with their same-embedding-space guarantee — kept separate from the verb table of what actually runs today.

Changed

  • README.md rewritten from the culture-agent-template boilerplate into an agent-specific readme. The template's "Make it your own" cloning instructions are gone (this repo has already been cloned and renamed), replaced by a status banner that marks the repo as scaffold-only, the install/extras table, the current CLI surface, and the roadmap.

Fixed

  • Recorded the culture.yaml backend mismatch rather than leaving it to be rediscovered. The build brief lists the backend as claude "as scaffolded" and the old seed CLAUDE.md repeated that, but the checked-in reality is backend: colleague with AGENTS.colleague.md on disk, inherited verbatim from the template. The reconciliation the brief asks for is still open; CLAUDE.md now names the three things that move together, including that doctor would still pass (_PROMPT_FILE maps claudeCLAUDE.md, which exists) while test_whoami_text / test_whoami_json would fail on their backend == "colleague" assertions. Records the mesh evidence gathered from devex pr delta: devague's CLAUDE.md calls claude "the mesh standard", and of the siblings in this workspace only steward (and this repo, via the template) declares colleague. Also records that the mismatch is already breaking a tool — devex pr reply rejects backend: colleague outright (unknown backend, expecting one of claude/codex/copilot/acp), so the cicd skill's reply lane needs an explicit --agent claude-code override until the declaration is reconciled.

[0.6.1] - 2026-07-20

Added

  • Worktree location convention in CLAUDE.md — every worktree you create by hand (workforce fan-out lanes, scratch checkouts) lives in ../.worktrees.face-recognition-cli/<name>/, one repo-named directory beside the checkout, replacing a shared ../worktrees/ folder. This workspace holds many sibling projects, so a generic shared folder accumulates orphaned trees from several repos at once with nothing indicating ownership — a stale-tree sweep can't tell a live lane from junk. Matches the convention already documented in sibling repo reachy-mini-cli. Adds branch-prefix guidance (scope the prefix to the work; plain agent/* collides with leftovers from earlier fan-outs and fails git worktree add -b), and notes that the vendored assign-to-workforce skill uses both the shared path and agent/<task-id> branches in its fan-out example — it is cited verbatim and must not be edited, so both are overridden when following it. Teardown guidance names git worktree remove <path> as the verb that actually deletes a worktree; git worktree prune only clears metadata for directories that are already gone. Tool-managed throwaways are explicitly out of scope: ask-colleague's read-only verbs create a detached worktree under ${TMPDIR:-/tmp} and reap it on an EXIT trap, so they never persist to need an owner.

[0.6.0] - 2026-07-18

Added

  • Four devague-origin skills re-vendored into .claude/skills/ (cite-don't-import), synced to the fixed devague source (devague#74/#75/#76):

    • challenge — a risk-scaled blind-spot discovery pass that runs between /think and /spec-to-plan, routing findings back through the existing deterministic moves as human-adjudicated proposals.
    • scope — the idea→scope leg that surveys the surfaces an idea touches before framing, seeding the Announcement Frame with provenance-backed boundary/non-goal/assumption claims.
    • deviate — stops an in-flight assign-to-workforce run when execution must diverge from the confirmed plan and records the divergence as a first-class, append-only deviation record.
    • summarize-delivery — closes the loop after an assign-to-workforce run with a planned-vs-actual accountability artifact.

    These four originate in devague and are re-broadcast via guildmaster; see docs/skill-sources.md for provenance.

[0.5.0] - 2026-06-24

Added

  • Memory-discipline "Conventions and workflow" section in CLAUDE.md — a per-task recall-before / remember-after convention (scope localized to this repo's nick) so the vendored remember / recall skills are actually used, not just present: /recall before non-trivial work to build on prior decisions instead of re-deriving them, and /remember when a non-obvious decision, constraint, fix-and-why, or hard-won gotcha surfaces. The section documents this repo's memory as in-repo and public — records resolve to <repo-root>/.eidetic/memory (committed, team- and mesh-shared). Inserted idempotently (skipped if already present), slotted under an existing "Conventions and workflow" heading when one exists, else appended.

Changed

  • Refreshed the remember + recall wrappers from eidetic-cli 0.10.0 (cite-don't-import) — picks up eidetic's project-local store default: the files backend now resolves per record by visibility — PUBLIC records inside a git repo go to <repo-root>/.eidetic/memory (committed, team-shared), PRIVATE records (or any record outside a repo) go to $HOME/.eidetic/memory (never committed), an explicit EIDETIC_DATA_DIR still wins, and recall reads both stores and merges. Also carries the 0.9.3 hardening (interactive-stdin guard, help as a search term, SIGPIPE-safe suffix parsing). Recipe policy override (the wrappers here are NOT byte-verbatim): the injected default visibility is flipped from eidetic's private to public, so a plain /remember lands the note in ./.eidetic/memory in this repo, kept as part of the repo — pass --visibility private to route a record to $HOME instead. remember drives eidetic remember (idempotent upsert of one JSON record or an NDJSON batch on stdin); recall drives eidetic recall with four search modes (exact / approximate / keyword / hybrid). Each SKILL.md is localized only in the illustrative --scope <nick> examples (Provenance keeps "First-party to eidetic-cli"). Runtime dep: the eidetic CLI on PATH (else a local eidetic-cli checkout with uv) — eidetic >= 0.10.0 for the in-repo routing; on an older CLI the public records still work but are stored in $HOME/.eidetic/memory instead of in-repo. Propagated by rollout-cli's eidetic-memory recipe.

[0.4.0] - 2026-06-23

Added

  • Vendored the remember + recall memory skills from eidetic-cli (cite-don't-import) — the write/read halves of eidetic's shared $HOME/.eidetic/memory surface, so this agent (Claude and its colleague backend) can persist facts across sessions and recall them later, sharing one store. remember drives eidetic remember (idempotent upsert of one JSON record or an NDJSON batch on stdin, dedup by id + content hash); recall drives eidetic recall with four search modes — exact / approximate / keyword / hybrid — each hit carrying text, full provenance metadata, a relevance score, and a freshness signal. The .sh wrappers are byte-verbatim from eidetic-cli (their first-party origin); each SKILL.md is localized only in the illustrative --scope <nick> examples (Provenance keeps "First-party to eidetic-cli"). Both default to this agent's PRIVATE scope, reading the suffix from culture.yaml. Runtime dep: the eidetic CLI on PATH (else a local eidetic-cli checkout with uv). Propagated by rollout-cli's eidetic-memory recipe.

[0.3.4] - 2026-06-20

Fixed

  • Identity docs and self-description strings still claimed backend: claude (prompt file CLAUDE.md), but this template was promoted to a colleague resident in #14/#15: culture.yaml declares backend: colleague (Qwen) with AGENTS.colleague.md as the resident prompt. Corrected the stale claim in CLAUDE.md (Identity section), README.md, docs/skill-sources.md, and the two CLI description strings (overview artifacts and explain doctor). The doctor backend→prompt-file mapping and the tests were already on colleague; this aligns the prose and self-description with them.

[0.3.3] - 2026-06-20

Fixed

  • pyproject.toml: correct the license field and PyPI classifier from MIT to Apache-2.0 to match the LICENSE file. The README License section was already corrected in 0.3.2, but the package metadata was missed; the built wheel now reports License-Expression: Apache-2.0.

[0.3.2] - 2026-06-18

Added

  • ask-colleague skill: monitor/guide/stop pilot verbs plus a --watch flag to dispatch, watch the live feed of, send mid-flight guidance to, and cooperatively stop a running colleague flight (re-vendored from colleague).

Changed

  • README: correct the License section from MIT to Apache 2.0 to match the LICENSE file.

[0.3.1] - 2026-06-13

Changed

  • CLAUDE.md: add a convention to reach for the ask-colleague skill reflexively for explore/review/write/grade — read-only review/explore are always safe; side-effecting write needs the user's go-ahead.

[0.3.0] - 2026-06-13

Added

  • AGENTS.colleague.md resident prompt file (backend colleague <-> AGENTS.colleague.md)

Changed

  • Promote agent identity to a colleague resident: culture.yaml backend claude -> colleague with a pinned model. The doctor backend-consistency map gains colleague -> AGENTS.colleague.md.

[0.2.1] - 2026-06-12

Changed

  • Re-vendored the ask-colleague skill from colleague (now 1.7.0, up from the 0.39.2 sync) — the wrapper had drifted multiple releases behind origin. Picks up the clean verb (reap stale/corrupt colleague/* branches + orphaned .colleague/ artifacts a crashed run left behind), the --json flag on every verb (result JSON on stdout, diagnostics/digest on stderr), the _colleague_via_uv local-dev resolution that honors --repo, and the tri-state (0/1/2) exit-code contract. scripts/ask-colleague.sh + prompts/ are byte-identical to the origin; SKILL.md diverges only in the one consumer-identifying Provenance clause (face-recognition-cli vendors from guildmaster). docs/skill-sources.md sync row updated to 2026-06-12 (colleague 1.7.0, direct). Refs: colleague#183, #186.

[0.2.0] - 2026-06-06

Added

  • ask-colleague skill (.claude/skills/ask-colleague/) — the first-party front door to the colleague CLI (the renamed convertible). On top of explore / review / write it adds a feedback verb (grade a finished work item — the ROI loop), and write now previews by default in a throwaway worktree (no side effects) unless --apply / --pr is given. Reach for it reflexively — review for a diverse second opinion on a committed diff before opening a PR, explore for a fresh read of an unfamiliar area.

Changed

  • Replaced the outsource skill with ask-colleague. outsource was renamed to ask-colleague upstream (colleague#148). Because guildmaster has not re-broadcast the rename yet (its kit still ships the old outsource), ask-colleague is vendored directly from the sibling colleague checkout rather than from guildmaster — a tracked local divergence recorded in docs/skill-sources.md, parallel to the agexdevex one. Vendored verbatim except one consumer-identifying clause in the Provenance paragraph.
  • Ledger + CLAUDE.md + .gitignore: point docs/skill-sources.md and the CLAUDE.md Skills section at colleague / ask-colleague, swap the optional runtime prerequisite convertiblecolleague (env prefix CONVERTIBLE_*COLLEAGUE_*, with the legacy names kept as a deprecated fallback), and gitignore the .colleague/ run-artifact dir the skill writes (plus the stale .agex/).

[0.1.4] - 2026-05-31

Added

  • Vendor the outsource skill (.claude/skills/outsource/) from guildmaster's canonical copy (origin agentculture/convertible, re-broadcast via guildmaster — guildmaster #51). Every agent cloned from this template now inherits the ability to hand a scoped task to a different engine/mind: explore (read-only investigation), review (a diverse second opinion on the committed diff), and write (delegate a small implementation). explore/review run isolated in a throwaway git worktree; write refuses a dirty tree. Fulfils #8.
  • Ledger + CLAUDE.md: record outsource in docs/skill-sources.md (origin = convertible, re-broadcast via guildmaster; vendored verbatim — it already carries type: command) and document its optional runtime dependency on the convertible CLI (the skill exits with an install hint if absent, so a clone that never uses it is unaffected).

Changed

Fixed

[0.1.3] - 2026-05-31

Changed

  • Expanded the clone-and-rename instructions in CLAUDE.md: added README.md to the rename targets and a portable git grep discovery command so a cloner can find every occurrence of the template name (hard-coded in ~100 places across the package, including the CLI command files and _ISSUES_URL in face_recognition_cli/cli/__init__.py) rather than renaming by hand.
  • Synced README.md's "Make it your own" checklist with CLAUDE.md: it now lists README.md itself as a rename target and points to CLAUDE.md's discovery command as the authoritative procedure, so the two onboarding checklists no longer drift.

[0.1.2] - 2026-05-30

Changed

  • Renamed the PR-lifecycle CLI references agex / agex-cli to devex (same tool, new name) across CLAUDE.md, docs/skill-sources.md, .gitignore, and the vendored cicd, assign-to-workforce, and communicate skills — the cicd scripts now invoke devex pr.
  • Logged the vendored-skill in-place patch as a local divergence in docs/skill-sources.md; the matching canonical rename is tracked upstream for guildmaster in agentculture/guildmaster#48 so a future re-sync reconciles cleanly.
  • Aligned the documented devex version floor to >=0.21 across the vendored cicd SKILL.md and workflow.sh install hint (were >=0.1), matching docs/skill-sources.md and the await-era feature set; flagged upstream on guildmaster#48.

Fixed

  • SonarCloud now reports code coverage — added relative_files = true to [tool.coverage.run] so coverage.xml emits repo-relative paths that map to sonar.sources=face_recognition_cli (absolute / .venv paths were dropped as unmappable). Mirrors the sibling convertible setup.

[0.1.1] - 2026-05-26

Changed

  • CI gates on the SonarCloud quality gate (issue #3) — added sonar.qualitygate.wait=true to sonar-project.properties so a failing gate fails the test job when SONAR_TOKEN is set. Token-less repos and fork PRs remain green (the scan step is guarded by if: env.SONAR_TOKEN != '').

[0.1.0] - 2026-05-26

Added

  • Onboarded into the AgentCulture mesh (issue #1).
  • Agent-first CLI cited from teken's (afi-cli) python-cli reference (teken cli cite) — verbs whoami, learn, explain, overview, doctor, and the cli noun group. Runtime is self-contained (dependencies = []); teken>=0.8 is a dev dependency only. Passes the seven-bundle agent-first rubric (teken cli doctor . --strict). doctor checks the agent-identity invariants (prompt-file-present, backend-consistency, skills-present).
  • Mesh identity: culture.yaml (suffix: face-recognition-cli, backend: claude) and the matching CLAUDE.md prompt file.
  • Canonical guildmaster skill kit (11 skills) vendored under .claude/skills/ (cite-don't-import): agent-config, assign-to-workforce, cicd, communicate, doc-test-alignment, pypi-maintainer, run-tests, sonarclaude, spec-to-plan, think, version-bump. Every SKILL.md carries type: command (load-bearing for the culture/claude backend); cicd / communicate consumer-identifying prose adapted, all script bodies verbatim. Provenance in docs/skill-sources.md. Three skills (think, spec-to-plan, assign-to-workforce) originate in devague, re-broadcast via guildmaster.
  • Build + deploy baseline: pyproject.toml (hatchling), tests/ (pytest, xdist, coverage), .github/workflows/{tests,publish}.yml (CI rubric/lint gate, PyPI Trusted Publishing), .flake8, .markdownlint-cli2.yaml, sonar-project.properties, and .claude/skills.local.yaml.example.

Changed

Fixed