chore!: rename the project to firenze - #16
Merged
Conversation
…hing Closes E1. The generator produces a structure the solver has approved; this turns it into prose a player would want to read. Two boundaries define the module, and they are the whole design. It takes `Case`, never `CaseWithSolution` — the same signature discipline as the solver, for a different reason. A writer who knew the culprit would telegraph it. Nobody would mean to; the guilty character would simply end up with the sharper description, and the mystery would be over before the first question. A test asserts the stronger property: every suspect appears exactly once in the prompt, so nothing in the text distinguishes them. It is only ever shown public facts. The veneer has no use for a restricted one, so it never receives one and cannot leak one. The canary check on the output is therefore not aimed at the model — it is aimed at us, because a canary in this output means context assembly upstream is broken (RN-010, RN-012). The output schema is narrow on purpose: role, appearance, manner, and a scene. There is no field in which to invent evidence, move somebody through the house, or name a killer. What the schema cannot prevent, validation rejects: an invented or dropped character, a duplicated id, one suspect described with another's name, a blank or runaway field. A rejected draft is discarded rather than repaired — a model that broke the cast once will break it differently on a patch. Failure is not fatal. No key, a refusal, a network error, a rejected draft: the case still prints, with a note on stderr. Prose is a luxury; the mystery is not. The prompt is a versioned file in prompts/veneer/, never a string literal, and the tests read it rather than restating it. Also finishes the ADR-0006 rename that phase 0 left behind: Configuracao became Settings, and the health endpoint now answers with version and environment. 63 tests, all of them keyless — the model is a stub returning exactly the drafts that must not reach a player. Waiting for a real model to produce one of those by chance is not a test strategy.
The veneer is short, structured, and its failure modes — an invented character, a swapped name, a leaked canary — are caught by validation rather than by model quality. The prompt measures ~400 input tokens and the reply ~400 output, which puts Haiku 4.5 at roughly US$ 0.0025 per case: about 400 cases per dollar. Opus would be ~5x that on paper and more in practice, because adaptive thinking is on by default there and thinking tokens bill as output. That headroom is better spent in phase 2, where six NPCs each answer a turn against the R$ 0,50 per-match budget. Env-switchable through MANSAO_VENEER_MODEL, so comparing the two on the same seed costs about a cent.
The repository was firenze, the product was Mansão, and the Python package was mansao. Three names for one thing, on a public repository where the first one a visitor sees is the repository's. Now they are the same word, and the plan drops its "(working title)" marker because the name is settled. Mechanical throughout: package, imports, entry point, env prefix (MANSAO_ -> FIRENZE_), compose project, database user and name, API title, CLI command, and every path cited in the documents and ADRs. Nothing in the domain changed. The manor is still the only setting the generator knows how to build — whether the game follows the name to Italy is a separate question about content, not about what anything is called. Local containers and the pgvector volume were provisioned under the old project name. `docker compose -p mansao down -v` clears them; `make dev` rebuilds under the new one. No data is lost that matters — no case is persisted yet, and there are no migrations.
The branch carried the original veneer commits while main carried them squashed — divergent history over identical content, so every renamed file conflicted falsely. The branch tree already contains everything main has plus the rename, which is what makes -s ours the honest resolution here rather than a shortcut.
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.
Stacked on #15 — merge that one first and GitHub retargets this to
mainautomatically.
Three names, one thing
firenze(repository)firenzemansao(Python package, env prefix, database)firenzeOn a public repository the first name a visitor meets is the repository's, and
it named nothing in the game. The plan also drops its
(working title)marker,since the name is now decided.
What moved
Package and imports, the
firenzeCLI command,MANSAO_→FIRENZE_, thecompose project, the database user and name, the FastAPI title, and every path
cited in the documents and the ADRs.
The case is byte-identical before and after: the rename touches no constant the
generator seeds from.
Local cleanup, once
Containers and the pgvector volume were created under the old project name:
Nothing of value is lost — no case is persisted yet and there are no migrations.
Still open, deliberately
The generator only knows how to build a manor, and the veneer prompt still says
"a Brazilian manor house in the 1930s". Whether the setting follows the name to
Florence is a question about content, and it belongs in its own change.