Skip to content

refactor: de-brand "limina" — read as plain aexp#23

Merged
KadenMc merged 10 commits into
mainfrom
refactor/debrand-limina
May 21, 2026
Merged

refactor: de-brand "limina" — read as plain aexp#23
KadenMc merged 10 commits into
mainfrom
refactor/debrand-limina

Conversation

@KadenMc
Copy link
Copy Markdown
Owner

@KadenMc KadenMc commented May 21, 2026

Summary

limina (github.com/KadenMc/limina) was vendored in on 2026-04-20 as a research harness — meant as a one-time inspiration, but the name "seeped in deep" (~280 occurrences across code identifiers, a public-API surface, persisted storage keys, the vendored tree, docs, and tests). This makes the harness read as plain aexp, while keeping a modest, honest credit. The package name (agentic-experiments / aexp) is unchanged.

One PR, staged commits A–E, then housekeeping + the 0.5.0 release cut.

Stages

  • A — vendored tree (0237ee4): de-brand the harness tree; delete the stale top-level skill/ (its body told the agent to git clone github.com/theam/limina).
  • B — persisted keys, dual-read (cba517b): rename the stored keys with a read-side fallback — existing signac projects + install markers self-heal, no migration.
  • C — code identifiers / public API (2d77fb5): rename the limina-branded identifiers; module aexp.limina_ioaexp.kb_io.
  • D — prose (fdd0069): docstrings, comments, slash commands, docs/**, README, pyproject, CHANGELOG.
  • test (9fb822d): direct unit tests for the dual-read fallback.
  • E — kill the vendor/ directory (c710cb6): src/aexp/vendor/limina/src/aexp/scaffold/ — both vendor/ and limina/ directories gone. Drop the vendoring-ceremony files (VENDORED_FROM.txt, VERSION); retire the "vendor" vocabulary (compute_vendor_shacompute_scaffold_sha, VENDOR_ROOTSCAFFOLD_ROOT, vendor_shascaffold_sha, _VENDOR_TEMPLATES*, the merge_* vendor* locals→shipped*). Drop dead reference/ excludes from pyproject.
  • shim drop (de80482): aexp.limina_io was briefly kept as a re-export shim; removed it — no external consumers, no API-stability commitment yet.
  • housekeeping: README — drop feature-count tallies (81bc1bc) and the stale version line + v0.3 roadmap from ## Status (844e361).
  • release (c873fb1): version bump to 0.5.0, CHANGELOG [Unreleased] cut to [0.5.0].

Breaking changes (public API)

Old names are removed — no compat shim:

Old New
install_limina() install_scaffold()
is_limina_installed() is_scaffold_installed()
compute_vendor_sha() compute_scaffold_sha()
LiminaArtifactRef ArtifactRef
module aexp.limina_io aexp.kb_io

Persisted keys — renamed, with a read-side fallback (no migration)

  • run-link key job.doc["limina"]job.doc["aexp"] — via schema.read_run_link() / write_run_link(); read_run_link falls back to the legacy limina key, write_run_link clears it so a re-stamped job self-heals.
  • install marker limina_vendor_shascaffold_sha — the install short-circuit dual-reads both.
  • W&B run config config["limina"]config["aexp"] — past W&B runs keep config.limina; new runs get config.aexp.
  • validator error codes limina.*aexp.* (not persisted).

electricrag's existing .runs/ and .aexp/installed.json keep resolving untouched.

Kept on purpose

  • A muted credit + KadenMc/limina link in a README "Acknowledgements" section and one docs/concepts.md line.
  • CHANGELOG.md history left verbatim.
  • The legacy marker key name limina_vendor_sha in the dual-read fallback.

Release — 0.5.0

This PR bumps pyproject.toml to 0.5.0 and cuts CHANGELOG [0.5.0]. After merge, the release is tagged + published manually: git tag v0.5.0 on the merge commit, then poetry publish --build to PyPI.

Consumer (electricrag) follow-ups — after merge, maintainer-run

  1. aexp install --force (--dev, dry-run first) to refresh the de-branded AGENTS.md/CLAUDE.md block-merge + slash commands; re-run aexp airgapped init after.
  2. Hand-delete the now-orphaned .claude/skills/limina/.
  3. Fix the one notebook import from aexp.limina_io import …from aexp.kb_io import … (hard break — no shim).

Testing

  • Full suite: 459 passed, 5 skipped (pre-existing environmental skips), green at each stage.
  • ruff check src tests — clean.
  • mypy — only pre-existing noise (untyped signac/frontmatter, type-arg, no-untyped-def, a ported-kb_validate.py operand error); the refactor introduces none.

🤖 Generated with Claude Code

KadenMc and others added 10 commits May 20, 2026 22:37
…le skill

De-brand the vendored research-harness tree so it reads as plain aexp
functionality rather than a named "Limina" centerpiece:

- AGENTS.md / CLAUDE.md headers -> "Agentic Experiments — ...".
- kb/DASHBOARD.md -> "Research Dashboard".
- The 4 research-methodology skills: drop "Limina" from descriptions and
  prose; the skill logic itself is unchanged.
- VENDORED_FROM.txt slimmed to a concise provenance note (keeps the
  KadenMc/limina credit; drops the dead reference/limina/ pointer).

Delete the stale top-level "limina" skill (vendor/limina/skill/): its
body still told the agent to `git clone github.com/theam/limina` and
`pip install -r requirements.txt`, neither of which is how aexp works —
`aexp install` already scaffolds a project. Remove the singular-skill
copy path and `_SKILL_TOPLEVEL_NAME` from install.py; update the two
test_install.py skill tests (4 research skills, no top-level skill).

The directory src/aexp/vendor/limina/ keeps its name — vendor/<upstream>/
is honest provenance for a vendored snapshot.

Part of the limina de-brand (one PR, four staged commits A-D).

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

Rename the persisted storage keys that carried the "limina" name, with a
read-side fallback so existing signac projects and install markers
self-heal -- no migration script:

- Run-link key: job.doc["limina"] -> job.doc["aexp"]. New helpers
  schema.read_run_link() (reads "aexp", falls back to legacy "limina")
  and schema.write_run_link() (writes "aexp", clears the legacy key so a
  re-stamped job self-heals). All read sites + both write sites
  (runs.py, linking.py, queue.py, trackers/base.py, validate.py) routed
  through the helpers.
- Install marker: .aexp/installed.json "limina_vendor_sha" -> "vendor_sha";
  the install short-circuit dual-reads both keys.
- W&B run config: config["limina"] -> config["aexp"]. Past W&B runs keep
  config.limina; new runs get config.aexp.
- Validator error codes: limina.validation_failed /
  limina.validator_unavailable -> aexp.* (not persisted).

Tests updated to the new keys/codes.

Part of the limina de-brand (one PR, four staged commits A-D).

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

Rename the public-API and internal identifiers that carried the "limina"
name so the package surface reads as plain aexp:

- install_limina()      -> install_scaffold()
- is_limina_installed() -> is_scaffold_installed()
- VENDOR_LIMINA         -> VENDOR_ROOT
- LiminaArtifactRef     -> ArtifactRef
- module aexp.limina_io -> aexp.kb_io  (sits beside aexp.kb_validate)
- conftest fixtures limina_project -> scaffold_project,
  vendored_limina_tree -> vendored_tree

aexp/limina_io.py is kept as a thin deprecation shim (re-exports
aexp.kb_io, emits a DeprecationWarning) for one release -- it covers the
single external import (an electricrag notebook). All in-package
imports, __init__.py __all__, and the tests move to the new names.

The vendored directory src/aexp/vendor/limina/ keeps its name (honest
provenance for a vendored snapshot).

Part of the limina de-brand (one PR, four staged commits A-D).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Final prose pass of the limina de-brand. Drops the proper noun "Limina"
from docstrings, comments, slash-command descriptions, and docs where
the H/E/F vocabulary already carries the meaning:

- docs/*.md, code docstrings/comments, slash-command `description:`
  lines, pyproject `description` + ruff comments.
- docs/concepts.md + docs/mapping.md also correct the run-link key
  references (`job.doc["limina"]` -> `job.doc["aexp"]`, error codes,
  W&B config key) to match the stage-B rename.
- README: the `limina` credit moves out of the "Integrate, don't
  reinvent" bullet into a muted "Acknowledgements" section that keeps
  the KadenMc/limina link.
- CHANGELOG: an [Unreleased] entry documenting the de-brand; history
  left verbatim.

Intentionally still say "limina": the vendored directory path
src/aexp/vendor/limina/, the legacy-key dual-read fallback, the
aexp.limina_io deprecation shim, and the README/CHANGELOG credit.

Completes the limina de-brand (one PR, four staged commits A-D).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Stage B introduced schema.read_run_link() / write_run_link() -- the
read-side fallback that lets pre-de-brand signac job docs (legacy
job.doc["limina"]) keep resolving with no migration. Add direct unit
tests for that contract: current-key read, legacy-key fallback,
current-wins-over-legacy, empty-when-absent, and write-clears-legacy
(self-heal).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
The de-brand left `src/aexp/vendor/limina/` in place — a `vendor/`
directory with a single child, which reads as careless. Move the
bundled research-harness scaffold to its real home and retire the
"vendor" vocabulary:

- `src/aexp/vendor/limina/` -> `src/aexp/scaffold/`; both the `vendor/`
  and `limina/` directories are gone. Drop the vendoring-ceremony files
  `VENDORED_FROM.txt` and `VERSION` (nothing read them; the upstream
  credit lives in the README).
- Identifiers: `compute_vendor_sha` -> `compute_scaffold_sha`,
  `VENDOR_ROOT` -> `SCAFFOLD_ROOT`, install-marker field `vendor_sha` ->
  `scaffold_sha`, `_VENDOR_TEMPLATES*` -> `_SCAFFOLD_TEMPLATES*`, the
  `merge_claude_settings` / `block_merge_markdown` `vendor*`
  params/locals -> `shipped*`, the `vendored_tree` fixture ->
  `scaffold_tree`.
- Docstrings, comments, docs, README, CHANGELOG, pyproject: "vendor" /
  "vendored" -> "scaffold" / "bundled" / rephrased.
- pyproject: drop the dead `reference/` excludes (no such dir) and the
  now-unnecessary ruff `extend-exclude` (the scaffold tree has no .py).

`scaffold_sha` keeps the dual-read fallback to the shipped legacy
marker key `limina_vendor_sha`, so existing install markers still
resolve. `src/aexp/scaffold/` ships in the wheel the same way the old
`vendor/` tree did — it is under the `aexp` package.

Part of the limina de-brand (PR #23: stages A-E).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
The de-brand kept `aexp/limina_io.py` as a re-export shim for one
release. There are no external consumers to protect and no API
stability commitment yet, so the shim is just dead weight -- remove it.
`aexp.limina_io` is gone; import from `aexp.kb_io`.

Nothing in the package imported the shim (all internal imports moved to
`aexp.kb_io` during the identifier rename); the CHANGELOG note is
updated to drop the shim mention.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
"22 tools", "22 verbs", "21 verbs", "22 total", and the "four skills"
counts read as feature-flexing rather than informing -- drop them. The
enumerations that follow already convey the surface. The structural
"three surfaces / three concerns" framing stays: it describes the
architecture (and the point of it is "one canonical API"), not a tally.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
The `## Status` section opened with `Pre-release (v0.2.x)` (the version
drifts from pyproject) and carried a `v0.3 backlog` roadmap (drifts as
work ships) -- duplicate sources of truth that go stale. Drop both. The
platform/CI note, the PyPI-surface note, and the closing line stay; the
`status-beta` badge already conveys maturity.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Cut 0.5.0. Since 0.4.0 this bundles the single-server Jupyter MCP
integration (drop jupyter-compute) + the jupyter-mcp-server pin, and
the limina de-brand / de-vendor: breaking public-API renames, persisted
keys renamed with a dual-read fallback. See CHANGELOG `[0.5.0]`.

Minor bump -- pre-1.0, so breaking changes signal via the minor slot.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
@KadenMc KadenMc merged commit b6bf6b9 into main May 21, 2026
6 checks passed
@KadenMc KadenMc deleted the refactor/debrand-limina branch May 21, 2026 15:56
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