refactor: de-brand "limina" — read as plain aexp#23
Merged
Conversation
…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>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
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 plainaexp, 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.0release cut.Stages
0237ee4): de-brand the harness tree; delete the stale top-levelskill/(its body told the agent togit clone github.com/theam/limina).cba517b): rename the stored keys with a read-side fallback — existing signac projects + install markers self-heal, no migration.2d77fb5): rename thelimina-branded identifiers; moduleaexp.limina_io→aexp.kb_io.fdd0069): docstrings, comments, slash commands,docs/**, README, pyproject, CHANGELOG.9fb822d): direct unit tests for the dual-read fallback.vendor/directory (c710cb6):src/aexp/vendor/limina/→src/aexp/scaffold/— bothvendor/andlimina/directories gone. Drop the vendoring-ceremony files (VENDORED_FROM.txt,VERSION); retire the "vendor" vocabulary (compute_vendor_sha→compute_scaffold_sha,VENDOR_ROOT→SCAFFOLD_ROOT,vendor_sha→scaffold_sha,_VENDOR_TEMPLATES*, themerge_*vendor*locals→shipped*). Drop deadreference/excludes from pyproject.de80482):aexp.limina_iowas briefly kept as a re-export shim; removed it — no external consumers, no API-stability commitment yet.81bc1bc) and the stale version line +v0.3roadmap from## Status(844e361).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:
install_limina()install_scaffold()is_limina_installed()is_scaffold_installed()compute_vendor_sha()compute_scaffold_sha()LiminaArtifactRefArtifactRefaexp.limina_ioaexp.kb_ioPersisted keys — renamed, with a read-side fallback (no migration)
job.doc["limina"]→job.doc["aexp"]— viaschema.read_run_link()/write_run_link();read_run_linkfalls back to the legacyliminakey,write_run_linkclears it so a re-stamped job self-heals.limina_vendor_sha→scaffold_sha— the install short-circuit dual-reads both.config["limina"]→config["aexp"]— past W&B runs keepconfig.limina; new runs getconfig.aexp.limina.*→aexp.*(not persisted).electricrag's existing
.runs/and.aexp/installed.jsonkeep resolving untouched.Kept on purpose
KadenMc/liminalink in a README "Acknowledgements" section and onedocs/concepts.mdline.CHANGELOG.mdhistory left verbatim.limina_vendor_shain the dual-read fallback.Release — 0.5.0
This PR bumps
pyproject.tomlto 0.5.0 and cuts CHANGELOG[0.5.0]. After merge, the release is tagged + published manually:git tag v0.5.0on the merge commit, thenpoetry publish --buildto PyPI.Consumer (electricrag) follow-ups — after merge, maintainer-run
aexp install --force(--dev, dry-run first) to refresh the de-brandedAGENTS.md/CLAUDE.mdblock-merge + slash commands; re-runaexp airgapped initafter..claude/skills/limina/.from aexp.limina_io import …→from aexp.kb_io import …(hard break — no shim).Testing
ruff check src tests— clean.mypy— only pre-existing noise (untypedsignac/frontmatter,type-arg,no-untyped-def, a ported-kb_validate.pyoperand error); the refactor introduces none.🤖 Generated with Claude Code