# nobrainer-tech-flow 2.3.1: keep your skills under retired names

Release date: 2026-10-13.

Keep your own skill under a name Flow retired and still install or update Flow.
For example, a private `nobrainer-reddit` no longer stops the Python or shell
installer. Both leave the existing file, directory or symlink unchanged through
apply, repeat and undo. `install_skills.py` and `install.sh` report it as
`PRESERVED_FOREIGN`; the guided `install.py` and npm setups continue without a
separate line.

## What changes

- `nobrainer-reddit` is explicitly classified as retired. Flow removed the old
  Reddit CLI rather than absorbing its functionality or trigger into an active
  skill. Another source can legitimately use that name.
- Foreign targets at renamed or absorbed aliases such as `nb-flow` still stop
  installation, so an existing skill cannot silently shadow a Flow trigger.
  Unresolved legacy names such as `nobrainer-fast-audit` also remain conflicts.
- Exact old links owned by the same checkout still require `--migrate-legacy`.
  Migration continues to preserve their recovery backups.

This behavior applies to `install_skills.py`, the Python/npm setups that call
it and the no-Python `install.sh`. Both installers compare an old link against
the exact predecessor paths owned by the same checkout. See
[conflict and migration behavior](../INSTALL.md#conflict-and-migration-behavior).

## Verification record

Local checks on the installer and 2.3.1 metadata (macOS, Python 3.14.5):

- `python3 scripts/validate_skills.py` and
  `python3 scripts/validate_skills.py --suite`: both passed.
- `python3 -m unittest tests.test_installer -v`: 55 tests passed. The new cases
  preserve foreign symlinks, directories and files at the retired name, retain
  exact owned-link migration and reject foreign `nb-flow` targets.
- `python3 -m unittest tests.test_shell_installer -v`: 40 tests passed with
  `/bin/sh`, dash, bash in POSIX mode and zsh emulating sh.
- `python3 -m unittest discover -s tests -v`: 412 tests ran; all passed except
  2 platform-specific skips. This includes the exported-source acceptance check
  without Git metadata.
- Shell checks run in every available POSIX shell and compare exact-link
  classification with Python for absolute, relative and chained old links,
  links to other current skills, loops and targets with trailing newlines. The
  no-Python check also exercises retired-name preservation.
- An isolated Python setup preview, apply and undo preserved a foreign retired
  file's bytes and inode. A mixed retired-name/renamed-alias check still refused
  installation before any canonical write.
- The changed Python files compiled, and the npm command read back `2.3.1`.
- A current-tree secret scan with the repository's gitleaks configuration found
  no leaks.

These checks prove local installer behavior and package metadata. They do not
prove publication, a fresh target-client import or a performance gain.

## Scope and distribution

This is an installer-only fix. The eighteen skill contents are unchanged from
v2.3.0 except for the entry skill's `VERSION` file. No workflow, model-routing or
performance change is claimed.

The native plugin 2.3.1 will carry the same installer. Plugin export, publication
and target-client import each require their own readback. npm registry
publication is still pending; source release files and a locally packed tarball
do not establish registry availability.

## Rollback

Return to the reviewed v2.3.0 source through the documented preview and undo
flow. Keep retained source files while any client links refer to them. A foreign
retired target needs no restoration because this patch leaves it unchanged.
