Skip to content

fix: two defects that broke famstack on a clean install - #49

Merged
arthware-dev merged 2 commits into
chore/agent-self-loopfrom
feat/paperless-3
Jul 31, 2026
Merged

fix: two defects that broke famstack on a clean install#49
arthware-dev merged 2 commits into
chore/agent-self-loopfrom
feat/paperless-3

Conversation

@arthware-dev

@arthware-dev arthware-dev commented Jul 31, 2026

Copy link
Copy Markdown
Contributor

Summary

Two unrelated defects found while bringing the memory and agent stacklets up on the dev rig. Neither is Paperless work; they landed on this branch because they blocked getting there. Each is a standalone commit.

stack memory person could not run on a normal install. It died with No module named 'frontmatter' on any host that had not run pip install. The vault loaders imported the third-party python-frontmatter package, which ships only in the test extra. stack memory correspondents had the same defect.

The reason it shipped is worth recording: the test environment installs a dependency the production host does not, so the suite stayed green while the command was broken for every user. tests/stacklets/test_memory_host_stdlib.py closes that hole by blocking the module in sys.modules, making a machine that never ran pip install the thing under test. All four of its tests fail against the old code.

Both loaders now use lib/stack/frontmatter.py, the stdlib-only parser already built for exactly this, keeping the CLI's documented zero-pip-deps promise. List fields go through _fm_list so a single value written where a list belongs can no longer iterate into one entry per character.

That surfaced a third thing: the shipped correspondents seed teaches inline [a, b] list syntax, which the vault format spec excludes and the parser does not read. Seed and test fixture now use block lists. Whether the parser should instead accept flow syntax is a real design question and is deliberately not decided here.

A stacklet whose containers are all optional could never finish setup. When COMPOSE_PROFILES excludes every service, docker compose exits 1 with no service selected. That is an empty selection, not a failure to start, but the CLI read any non-zero as "Failed to start services" and withheld the setup marker. The ai stacklet is the case that surfaced it: STACK_AI_NO_VOICE=1 clears the profile and its only container sits behind voice, so the documented local-dev opt-out could never complete, which in turn blocked everything that requires ai.

The exit code and stderr text pinned in those tests came from a real docker compose up run rather than from reading source, so they assert compose's actual contract.

When COMPOSE_PROFILES excludes every service in a compose file,
docker compose exits 1 with "no service selected". That is an empty
selection, not a service that failed to start, but the CLI read any
non-zero as "Failed to start services" and refused to write the
setup marker.

The ai stacklet is the case that surfaced it: STACK_AI_NO_VOICE=1
clears the profile and its only container sits behind "voice", so
the documented local-dev opt-out could never complete setup, which
in turn blocked everything that requires the ai stacklet.
The command died with "No module named 'frontmatter'" on any host
that had not run pip install. It read the vault through loaders that
imported the third-party python-frontmatter package, which ships only
in the test extra, so the suite stayed green while the command was
broken for everyone. stack memory correspondents had the same defect.

Both loaders now use lib/stack/frontmatter.py, the stdlib-only parser
already built for exactly this, keeping the CLI's zero-pip-deps
promise. List fields go through _fm_list so a single value written
where a list belongs can no longer iterate into one entry per
character.

The shipped correspondents seed taught inline "[a, b]" list syntax,
which the vault format spec excludes and the parser does not read.
Seed and test fixture now use block lists.
@arthware-dev
arthware-dev merged commit a5fb078 into chore/agent-self-loop Jul 31, 2026
1 check passed
@arthware-dev
arthware-dev deleted the feat/paperless-3 branch July 31, 2026 21:17
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