Releases: rusharlabs/house-party-protocol
Release list
v2.7.0
[2.7.0] — 2026-09-25
Added
- House Session:
hpp deliberateandhpp.deliberation/v1. A deliberation between pinned
deciders, recorded so it can be verified and measured; the harness still calls no model. A panel
(hpp.panel/v1) needs two model families among its participants, one judge in a lane no
participant uses, and the roles its session type needs (plan,review,release-gate,
incident,design). Turns (hpp.turn/v1) list what their seat had read, so the blind first
round is checkable.tallycounts grounded and ungrounded votes apart and marks a seat that did
not answer as not judged, never as a vote against;stopapplies a fixed rule (not-judged,
grounded-convergence,paused-budget,no-new-evidence,max-rounds);recordseals the
session with the judge's decision and keeps the dissent that lost;verifyre-derives the record
from its own turns. Example:examples/house-session. hpp evidence mutate: does the criterion notice broken code? The criterion runs on a copy
of the workspace, clean (it must pass, or the verdict isno-controland nothing else runs) and
once per mutant (it must fail). Mutants are declared (hpp.mutants/v1) or generated from Python
tokens with a fixed operator table, never inside strings or comments. A surviving mutant is a
named blind spot; the score has no value when nothing was measured. The record is
hpp.mutation/v1. Example:examples/criterion-sensitivity.hpp.decision/v1acceptsmethod: panel. A panel is projected as one decision record, with
no confidence and the sealed deliberation as its raw response, sohpp decide evalmeasures a
panel by the same ruler as a single decider.
[2.7.0] — 2026-09-25
Adicionado
- House Session:
hpp deliberateehpp.deliberation/v1. Uma deliberação entre decisores
pinados, registrada para poder ser verificada e medida; o harness continua sem chamar modelo. Um
painel (hpp.panel/v1) exige duas famílias de modelo entre os participantes, um juiz numa lane
que nenhum participante usa, e os papéis que o tipo de sessão pede (plan,review,
release-gate,incident,design). Os turnos (hpp.turn/v1) listam o que o assento tinha
lido, então a primeira rodada cega é verificável.tallyconta votos fundamentados e não
fundamentados à parte e marca um assento que não respondeu como não julgado, nunca como voto
contra;stopaplica uma regra fixa (not-judged,grounded-convergence,paused-budget,
no-new-evidence,max-rounds);recordsela a sessão com a decisão do juiz e guarda a
dissidência que perdeu;verifyre-deriva o registro dos próprios turnos. Exemplo:
examples/house-session. hpp evidence mutate: o critério percebe código quebrado? O critério roda numa cópia do
workspace, limpa (tem de passar, senão o veredito éno-controle nada mais roda) e uma vez por
mutante (tem de falhar). Os mutantes são declarados (hpp.mutants/v1) ou gerados dos tokens
Python com uma tabela fixa de operadores, nunca dentro de strings ou comentários. Um mutante
sobrevivente é um ponto cego nomeado; o score não tem valor quando nada foi medido. O registro é
hpp.mutation/v1. Exemplo:examples/criterion-sensitivity.hpp.decision/v1aceitamethod: panel. Um painel é projetado como um registro de decisão,
sem confiança e com a deliberação selada como resposta bruta, para quehpp decide evalmeça um
painel pela mesma régua de um decisor só.
v2.6.7
[2.6.7] — 2026-09-25
Changed
- Every install in the workflows is hash-pinned. The test runner (CI) and the build backend
(release) install from committed requirements files with--require-hashes, so a job runs the
exact packages that were reviewed, not whatever the index serves that day.
[2.6.7] — 2026-09-25
Alterado
- Toda instalação nos workflows é fixada por hash. O executor de testes (CI) e o backend de
build (release) instalam a partir de arquivos de requisitos versionados com--require-hashes,
então um job roda exatamente os pacotes revisados, não o que o índice servir naquele dia.
v2.6.6
[2.6.6] — 2026-09-25
Added
- OpenSSF Best Practices badge (passing). The project self-certified all 67 criteria of the
passing level, each with its evidence: https://www.bestpractices.dev/projects/14830. The README
shows the badge next to CI, release and Scorecard.
[2.6.6] — 2026-09-25
Adicionado
- Selo OpenSSF Best Practices (passing). O projeto se autocertificou nos 67 critérios do nível
passing, cada um com a sua prova: https://www.bestpractices.dev/projects/14830. O README mostra o
selo ao lado do CI, da release e do Scorecard.
v2.6.5
[2.6.5] — 2026-09-24
Added
- Published to PyPI. From this release on,
pip install house-party-protocolinstalls the
wheel the release workflow built and attested, uploaded by trusted publishing with no stored token. - The provenance bundle is attached to every release as
house_party_protocol-<version>.intoto.jsonl, so a release can be checked offline and scanners
that look for signature files among the assets find it. v2.6.4 received it by hand. - CI compiles every Python file with warnings as errors (
python -X dev -W error -m compileall)
before the tests, so a syntax or deprecation warning fails the build instead of scrolling past.
[2.6.5] — 2026-09-24
Adicionado
- Publicado no PyPI. A partir desta release,
pip install house-party-protocolinstala o wheel
que o workflow de release construiu e atestou, enviado por trusted publishing sem token armazenado. - O bundle de proveniência é anexado a toda release como
house_party_protocol-<version>.intoto.jsonl, para que a release possa ser conferida offline e
scanners que procuram arquivos de assinatura entre os assets o encontrem. A v2.6.4 o recebeu à mão. - O CI compila todo arquivo Python com warnings como erro (
python -X dev -W error -m compileall)
antes dos testes, para que um warning de sintaxe ou de depreciação reprove o build em vez de passar batido.
v2.6.4
[2.6.4] — 2026-09-24
Added
- Build provenance for every release. The wheel and the sdist are attested by the release
workflow after they were installed and run on three systems;gh attestation verify <file> --repo rusharlabs/house-party-protocolchecks where the bytes came from. The identity token
lives in a job of its own, never on the runner that downloads build packages. - OpenSSF Scorecard. A weekly analysis (and one on every push to
mainand every change to
branch protection) publishes the score and sends its findings to code scanning. - PyPI publishing, ready and off. A trusted-publishing job uploads the release with no stored
token once the repository variablePYPI_PUBLISHistrue; until the publisher is registered
on PyPI it does not run, and installation stayspip install git+…@<tag>. - Live badges. The README shows the CI state, the latest release and the Scorecard score.
[2.6.4] — 2026-09-24
Adicionado
- Proveniência de build em toda release. O wheel e o sdist são atestados pelo workflow de
release depois de instalados e executados em três sistemas;gh attestation verify <file> --repo rusharlabs/house-party-protocolconfere de onde vieram os bytes. O token de identidade
vive num job próprio, nunca no runner que baixa pacotes de build. - OpenSSF Scorecard. Uma análise semanal (e uma a cada push na
maine a cada mudança na
proteção de branch) publica a nota e envia os achados ao code scanning. - Publicação no PyPI, pronta e desligada. Um job de trusted publishing envia a release sem
token armazenado quando a variável do repositórioPYPI_PUBLISHfortrue; até o publisher
ser registrado no PyPI ele não roda, e a instalação continuapip install git+…@<tag>. - Badges vivos. O README mostra o estado do CI, a última release e a nota do Scorecard.
v2.6.3
[2.6.3] — 2026-09-24
Changed
- The site is published by a workflow. A
Pagesworkflow deploysdocs/on every push to
main(and on demand), with actions pinned to commits and write access to Pages only in the
deploy job. The legacy branch builder did not run for three consecutive releases. - A release reaches
mainonly after its checks pass. The commit goes up on a release
branch, the three required checks run on its pull request, andmainthen moves to that same
commit — the protection rules now apply to administrators too.
[2.6.3] — 2026-09-24
Alterado
- O site é publicado por um workflow. Um workflow
Pagespublicadocs/a cada push na
main(e sob demanda), com actions fixadas por commit e escrita no Pages só no job de deploy. O
builder legado por branch não rodou em três releases seguidas. - Uma release só chega à
maindepois que os checks passam. O commit sobe numa branch de
release, os três checks obrigatórios rodam no pull request dela, e amainavança para esse
mesmo commit — as regras de proteção agora valem também para administradores.
v2.6.2
[2.6.2] — 2026-09-24
Fixed
- operator-kit 1.6.2 — installing it no longer silences an existing
AGENTS.md. When a project
has both files, Claude Code reads onlyCLAUDE.md.claude_md_from_profile.pynow writes
@AGENTS.mdinto aCLAUDE.mdit creates next to an existingAGENTS.md, and warns (without
touching the file) when an existingCLAUDE.mddoes not import it.
[2.6.2] — 2026-09-24
Corrigido
- operator-kit 1.6.2 — instalá-lo não silencia mais um
AGENTS.mdexistente. Quando um projeto
tem os dois arquivos, o Claude Code lê só oCLAUDE.md. Oclaude_md_from_profile.pyagora
escreve@AGENTS.mdnumCLAUDE.mdque ele cria ao lado de umAGENTS.mdexistente, e avisa (sem
mexer no arquivo) quando umCLAUDE.mdexistente não o importa.
v2.6.1
[2.6.1] — 2026-09-24
Closes what the 2.6.0 reviews left open. No new instrument.
Added
- lane-kit 1.4.1 — a competition can lose a candidate.
lane_board.py withdraw --task <T> --item <X>
records why a candidate left (its lane died, the attempt was abandoned); the withdrawn item stops
counting for readiness and selection, its lane is owed the news like a loser, andrenderand
status <task>show it. Before this, one dead lane left the task undecidable and every other
candidate unmergeable. - A product test runs the lane board self-test with the core importable, so the branch that
verifies anhpp evidencerecord is exercised in CI, not only on a developer machine.
Fixed
- continuity-kit 1.4.1: an evidence record is recognised by its file name wherever
--output
it and with Windows separators; the templates call lane-kit's board through a{{lane_board}}
placeholder instead of a path that resolved inside continuity-kit. - dev-squad-kit 1.1.1:
*evidence-checkmaps a failed recorded run to FAIL and every other
non-pass to CONCERNS;--outfor QA's own record is stated as relative and inside the workspace. - gotcha-memory 1.0.3: the offline relabel loop checks the decider's exit code and writes no
record for a failed call. - operator-kit 1.6.1: rules no longer point at protocols the kit does not ship; the report
builder reads the style keys it defines; an example path is neutral. - The site generator and the tests agree on the pages they check, and the release links in this
file are complete ([2.1.0]points at the release that first shipped it).
[2.6.1] — 2026-09-24
Fecha o que as revisões da 2.6.0 deixaram aberto. Nenhum instrumento novo.
Adicionado
- lane-kit 1.4.1 — uma competição pode perder um candidato.
lane_board.py withdraw --task <T> --item <X>
registra por que um candidato saiu (a lane morreu, a tentativa foi abandonada); o item retirado
deixa de contar para prontidão e seleção, a lane dele recebe o aviso como um perdedor, e o
rendere ostatus <task>mostram isso. Antes, uma lane morta deixava a tarefa sem decisão e
todo outro candidato sem merge. - Um teste do produto roda o self-test do lane board com o núcleo importável, então o ramo que
verifica um registro dohpp evidenceé exercitado no CI, e não só na máquina de quem desenvolve.
Corrigido
- continuity-kit 1.4.1: um registro de evidência é reconhecido pelo nome do arquivo onde quer
que o--outo tenha posto e com separadores do Windows; os templates chamam o board do lane-kit
por um placeholder{{lane_board}}em vez de um caminho que caía dentro do continuity-kit. - dev-squad-kit 1.1.1: o
*evidence-checkmapeia execução registrada que falhou para FAIL e
todo outro não-passou para CONCERNS; o--outdo registro próprio do QA é declarado relativo e
dentro do workspace. - gotcha-memory 1.0.3: o loop offline de reclassificação confere o exit code do decisor e não
grava registro para uma chamada que falhou. - operator-kit 1.6.1: as regras não apontam mais para protocolos que o kit não distribui; o
construtor de relatório lê as chaves de estilo que ele mesmo define; um caminho de exemplo ficou
neutro. - O gerador do site e os testes concordam sobre as páginas que conferem, e os links de release
deste arquivo estão completos ([2.1.0]aponta para a release que o trouxe primeiro).
v2.6.0
[2.6.0] — 2026-09-24
Four instruments that turn a claim into something a checker can re-derive — evidence bundles, a
retrieval ruler, a citation check and typed decisions — and the modules that use them.
Added
- Typed decisions, as evidence — the harness still calls no model.
hpp decide validatechecks
anhpp.decision/v1record made outside the harness (by a rule, a person, a local model or a
hosted typed-decision model) and prints the value a consumer may act on;hpp decide eval
measures any decider you name as a command, against labelled cases. Three rules carry it: a
record is alwaysadvisory; withraise-onlyit may raise a declared value on the question's
ordered options and never lower it;abstentionandinstrument-failureare outcomes that change
nothing. A model record must name the pinned version that answered (aliases such as-latestare
refused) and the hash of the raw response; the judged text never enters the record, and
secret-like text is refused before it is hashed. The report separates coverage, selective
accuracy, confident errors, correct and missed abstentions and instrument failures, publishes a
coverage curve across floors when confidences exist, and computes Brier only from probabilities —
a decider that never decides is reported as no sample, never as 0%, and the reason says how many
cases abstained and how many failed. Version 1 measureschoicequestions only; numeric answers
are refused rather than scored against a label they cannot equal. hpp init --decision-advisor off|typesafe|openrouter|compatible. The installer can record an
optional advisor you declared and print how to integrate it: where YOUR key goes (your shell —
hpp reads and writes none), how to measure it against a lexical baseline first, and how to check
one decision.offis the default and leaves profiles recorded before this option unchanged.examples/typed-decisions/— a lexical baseline, a small synthetic suite (one clear case per
failure family, ambiguous cases that must abstain, an injection attempt, shell text withcurl,
Portuguese messages) and a stdlib HTTP adapter for a typed-decision endpoint that makes one
attempt, keeps the raw response on disk, and maps timeouts, HTTP errors and non-JSON answers to
instrument-failure. It refuses redirects (the key reaches one host only), sends a key only over
https or to loopback, caps the response at 1 MiB, and with--declaredwrites araise-only
record. It is an example, not a module: it sends text off the machine only when a person runs it,
andhpp policy checknow classifies running it asMANUAL(ruledecision-advisor).- Evidence bundles — an end-to-end check whose verdict can be re-derived later; the harness still
drives no browser and calls no model.hpp evidence run --id <name> --artifact <glob> -- <command>
runs the criterion you declare (an end-to-end spec, a test suite, any script) withshell=False
in its own process group, measures its exit code outside the model, hashes every file each
declared glob matches, and writes anhpp.evidence/v1record under.hpp/evidence/by exclusive
create, so no record is ever overwritten. Three rules carry it: the bundle passes only when the
command exited 0 and every declared pattern matched a file this run wrote — a screenshot that
was never written, or one left from an earlier run (listed asunchanged), is not evidence; the record keeps the byte count and sha256 of stdout and stderr, never the text, and
no absolute path; a secret-like command line, a path outside the workspace, a bad id, a
non-positive timeout and--record-eventwithout an--artifactare refused before anything
runs.runexits 0 passed, 1 not passed (failed,missing-artifacts,timeout,
could-not-start) and 2 refused or event not appended; a timeout stops the whole process tree,
not only the direct child, and--record-eventappendsevidence_recordedto the event log only
when the bundle passed.hpp evidence verify <record>re-derives the record from disk: 0valid
for an intact record of a passed run, 1not-evidencefor an intact record of a run that did not
pass, 2blockedwhen the record was edited, contradicts itself, or an artifact changed or went
missing. The limits are part of the contract: the self-hash makes an edit visible and is not a
signature — anyone who can write the file can rewrite it — so a checker that must not trust the
maker re-runs the command instead of relying onverify;runwrites files, so a checker that
must stay read-only re-runs in its own lane or with--outon its own scratch path; and a runner
that clears its output directory at every start leaves the older recordblocked, so artifacts
that must stay verifiable belong in a per-run directory.examples/evidence/runs the cycle
without a browser;--breakshows a failing criterion whose artifacts exist and whose verdict is
stillfailed. - Retrieval ruler —
hpp retrieval evalmeasures a retriever apart from the answer built on it.
The retriever is a command you declare (--retriever-command '<JSON argv>'): it reads
{"query", "k"}as JSON on stdin and prints ranked ids, best first. The ruler scores the top k of
each answer against the ids anhpp.retrieval-suite/v1suite labels relevant and writes an
hpp.retrieval-eval/v1report with hit@k, recall@k, precision@k, MRR and nDCG@k. Three rules
carry it: a retriever that answers and finds nothing relevant is a measured 0, while a timeout, a
crash, a non-zero exit, output that is not JSON or a duplicate id is aninstrument-failure,
counted apart and never scored; means run over measured cases only, and with none measured they
are null and the gate says why, never 0%; the printed order is the ranking, and ascoreis
checked but never used to re-sort, because a distance and a similarity sort in opposite
directions. The gate passes when at least one case was measured, instrument failures are at most
--max-failures(default 0) and mean recall@k is at least--min-recall(default 0.8): exit 0
passed, 1 failed, 2 refused input. Without--retriever-commandit replays the results each case
recorded; with it, every case runs withshell=Falseand a timeout (--timeout, default 10 s).
Limits: relevance is binary per id, and nothing here judges the answer generated from what was
retrieved.examples/retrieval/— seven synthetic questions over ten articles and a keyword
baseline written beside them — proves the ruler works, not any retriever's quality: the baseline
reaches a mean recall@3 of 0.786 and the default gate fails with exit 1. - Citation check —
hpp cite checkturns a claim bigger than its proof into an exit code. It
reads an answer (--text) and the context it was written from (--context: a JSON list of
{"id", "text"}items, or of bare ids) and checks every citation marker against the context ids,
deterministically and without a model. The marker is[ID:<id>]unless--markergives a regex
with exactly one capture group. Block, exit 2:UNKNOWN_ID(a source the answer was never given),
RANGE(one marker naming a range or a list, such as1-3or1,2),EMPTY_MARKER. Warn,
exit 1:TOO_MANY(more than--max-per-sentencemarkers in one sentence, default 4) and
UNCITED_CLAIM(a sentence with a number, a percentage, a currency amount or a date and no
marker). Exit 0 is clean. Context the answer never cites is published as a count, not a finding;
empty text, text that is only code, secret-like text or context and an unusable marker regex are
refused with exit 2 before any report exists. Thehpp.citation-check/v1report carries the
sha256 of the text and of the context. Limits: it never reads a cited source — a marker that
resolves proves the id exists, not that the source supports the sentence; the sentence splitter
and the number detector are heuristics whose known false positives and negatives are written out
inhpp/citations.py, and all of them are warnings, never blocks.examples/citations/ships an
answer that checks clean: 7 sentences, 5 markers, 4 of the 5 context ids cited. - lane-kit 1.4.0: best-of-N between lanes, with
lane_board.py competeandselect.
compete --task <T> --items A,B[,C...]declares claimed items, each from a different builder
lane, as candidates for one task;select --task <T> --winner <item> [--reason "..."]records the
winner, and only when every candidate isCHECKPOINT-READYwith evidence (orVERIFIED) and the
reviewer differs from every builder in lane and in model family. The losers get a terminal
NOT-SELECTEDthatsetcan never write and that never reachesMERGED; no candidate can be
MERGEDbefore its task has a winner, and the winner still needs its ordinaryVERIFIEDfirst.
select --checker-unavailablerecordsDEFERREDfor the task, never a winner. Choosing 1 of N is
pass@N, not reliability: the winner still has to earnpass^k.
set <item> CHECKPOINT-READY --evidence-record .hpp/evidence/<id>-<UTC>.jsonattaches a run
recorded byhpp evidence runinstead of pasted text, accepted only when the HPP core verifies
itvalid; without the core importable the flag exits 2 and writes nothing.
Changed
- Every command hpp runs for you has a timeout that bounds it.
hpp evidence run,
hpp retrieval evalandhpp decide evalrun the declared command through one runner
(hpp/_process.py), which stops the whole process tree on timeout, not only the direct child. A
test runner that started a browser, or a retriever that started a helper, can no longer hold the
wait open past the timeout by keeping the pipes. - operator-kit 1.6.0.
goal_ledger.py --readiness <goal> R2accepts anhpp evidencerecord
as evidence onl...
v2.5.8
[2.5.8] — 2026-09-23
The repository became public, and this release answers the question a public repository has to
answer: what someone — or the agent working for them — does after finding it. It also settles a
contradiction the project was shipping, where four pages opened with artwork the brand document
beside them forbids.
Added
INSTALL_FOR_AGENTS.md, with its Portuguese pair — an install guide written for the agent
rather than for the reader. It identifies the host, checks the preconditions instead of assuming
them, and requires the agent to readhpp init's plan aloud before a single file is written. An
installer that writes before you read is the failure this harness exists to prevent; installing
it by violating it would be the worst possible first impression. A test ties its pinned command
to the README's and to the package version, because a fourth place that teaches installation is
the place that rots.- The wizard names the documentation it ships. Measured before the change:
CATALOGappeared
zero times in the CLI anddocs/zero times, whilehpp doctorappeared eleven — so the ruler
could see the file and the pointer simply was not there. Whoever installed the harness finished
at "Welcome to the party" without learning four pages of manual existed. - The lane board in the README, as a terminal SVG, produced by driving the real state machine
rather than by drawing a picture of one, so the image cannot drift from the behaviour. workflow_dispatchon the release workflow. GitHub emits no tag event when a single push
carries more than three tags; four releases were lost that way and recovered by hand. The
trigger demands the tag as an input, so a manual run can never publish whatever sits on the
branch, and every gate still applies.
Changed
- The brand is one brand. The four HTML pages opened with a mark drawn a day before the
approved lockup, whileBRAND.mdstates of that lockup: "do not redraw, recolour or crop". The
pages were publishing artwork the document beside them forbids. They now open with the approved
lockup resized to 1440 px — a resize is none of the three — and the earlier vectors carry a
tombstone naming their successor instead of being deleted. - The repository belongs to an organization. A user account cannot have a second
administrator: measured against this repository,admin,maintainandtriagewere all
refused andwritewas the ceiling. Every URL was rewritten at the source.
Fixed
- The publication gate stopped reproving a tool cache.
.pytest_cache,.ruff_cacheand
.mypy_cacheleave the linter's universe;__pycache__deliberately stays in it, because
bytecode inside an emitted kit is a packaging defect, while a pytest node id that happens to
containsecret.pemis a test name. The self-test now demands silence inside all three and
noise for the same bytes outside them — either half alone would pass with the detector broken.
[2.5.8] — 2026-09-23
O repositório ficou público, e esta versão responde à pergunta que um repositório público precisa
responder: o que alguém — ou o agente que trabalha para ele — faz depois de encontrá-lo. Ela
também encerra uma contradição que o projeto vinha publicando, em que quatro páginas abriam com
uma arte que o documento de marca ao lado delas veta.
Adicionado
INSTALL_FOR_AGENTS.md, com o par em português — um guia de instalação escrito para o
agente, não para o leitor. Ele identifica o host, confere os pré-requisitos em vez de presumi-los
e obriga o agente a ler em voz alta o plano dohpp initantes de um único arquivo ser escrito.
Um instalador que escreve antes de você ler é a falha que este harness existe para impedir;
instalá-lo violando-o seria a pior primeira impressão possível. Um teste amarra o comando pinado
dele ao do README e à versão do pacote, porque um quarto lugar que ensina a instalar é o lugar
que apodrece.- O wizard nomeia a documentação que embarca. Medido antes da mudança:
CATALOGaparecia zero
vezes na CLI edocs/zero vezes, enquantohpp doctoraparecia onze — ou seja, a régua via o
arquivo e o ponteiro é que não existia. Quem instalava terminava em "Welcome to the party" sem
saber que existiam quatro páginas de manual. - O lane board no README, como SVG de terminal, produzido dirigindo a máquina de estados de
verdade em vez de desenhar uma figura dela, para que a imagem não possa divergir do
comportamento. workflow_dispatchno workflow de release. O GitHub não emite evento de tag quando um push
carrega mais de três; quatro releases se perderam assim e foram recuperadas à mão. O gatilho
exige a tag como entrada, então uma execução manual nunca publica o que estiver na branch, e
todos os portões continuam valendo.
Alterado
- A marca virou uma marca. As quatro páginas HTML abriam com um símbolo desenhado um dia antes
do lockup aprovado, enquanto oBRAND.mddiz desse lockup: "do not redraw, recolour or crop".
As páginas publicavam arte que o documento ao lado delas veta. Agora abrem com o lockup aprovado
redimensionado para 1440 px — redimensionar não é nenhum dos três — e os vetores anteriores
carregam lápide com o sucessor nomeado, em vez de serem apagados. - O repositório pertence a uma organização. Conta de usuário não aceita segundo administrador:
medido neste repositório,admin,maintainetriageforam os três recusados, ewriteera o
teto. Todas as URLs foram reescritas na fonte.
Corrigido
- O gate de publicação parou de reprovar cache de ferramenta.
.pytest_cache,.ruff_cachee
.mypy_cachesaem do universo do linter;__pycache__fica nele de propósito, porque bytecode
dentro de um kit emitido é defeito de empacotamento, enquanto um node id do pytest que por acaso
contémsecret.pemé nome de teste. O self-test agora exige silêncio dentro dos três e ruído
para os mesmos bytes fora deles — qualquer das metades sozinha passaria com o detector quebrado.