Repository navigation
feat(harness): /proteger-harness, a Guarda e o estado protegido como skill genérica (LUI-194) - #19
Closed
argentinaluiz wants to merge 169 commits into
Closed
argentinaluiz wants to merge 169 commits into
argentinaluiz wants to merge 169 commits into
Conversation
Until now "done" was declared by the same agent that wrote the code, and the checks only existed as instructions. This adds one definition of "passed" (scripts/verify.sh) and a CI job that re-runs it on every pull request, in the same Compose environment used for development. Missing evidence fails: an empty suite, a skipped test or a missing report now reject the run. The design and the steps still to come are in docs/harness.md. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
On a fresh clone, PageProps and LayoutProps do not exist until Next.js generates them, so tsc failed in CI while passing on a machine where the dev server had already run. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The CI verdict only counts if nobody can ignore it or quietly change it. The ruleset makes both checks required on main, and the guard rejects a pull request that touches the workflows, the agent settings, the hooks or the verification scripts, so a change to the harness only lands through an admin override. The agent can no longer merge: it uses the human's credential, so this rule is what makes the override trail mean "a human released it". Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
feat: protect main and guard the harness files
- On a push to main the secret scan compared HEAD with itself and looked at no commits. It now starts from the commit before the push. - The GitHub API lists at most 3,000 files per pull request, so a larger one could hide a protected file. The guard now fails closed there. - A pull request could swap a pnpm script for a command that always passes and keep both checks green. The guard now blocks a change to the scripts section of a package.json, and warns about the rest of the inputs the verification depends on. - The local confirmation rule does not cover shell commands. The document no longer promises it does. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
feat: single verification script and CI verdict
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
docs: record that the ruleset is applied on the test repository
Type checking and lint only ran when the agent remembered the definition of done. A Stop hook now runs them whenever a turn ends with unverified code in apps/api or apps/web, and hands the failure back to the agent before the human sees anything. It fails closed when the containers are down, skips a state it has already approved, and lets the turn end with a warning to the user after three blocks in a row, so an error the agent cannot fix does not loop forever. Also drops the Write(...) permission rules: path rules use Edit(...) for every file-writing tool, so they did nothing. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
feat: run the fast checks when the agent ends its turn
Without origin/main in the clone the hook fell back to HEAD as the base and saw only uncommitted files, so code already committed on the branch went unchecked. That was the opposite of failing closed. A missing base now blocks the turn with the instruction to fetch it, under the same three-attempt limit as a failed check. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
fix: block the stop hook when the branch base cannot be found
The warning shown after the third block was built with printf, so a reference name with a double quote produced invalid JSON and the warning could be dropped, at the one point where the hook lets a failure through. It also always told the user to run the fast check, which does not reproduce a missing branch base. Each block now carries its own fix, and the warning is serialized with jq. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
fix: make the stop hook warning valid JSON and point to the real fix
A green CI proves the existing tests pass, not that each acceptance criterion has a test. Until now the pull request claimed coverage in prose, written by the same agent that implemented the change. The pull request now lists which test covers each criterion, and CI checks every row against the reports of its own run: the test must exist, have run and have passed. The table is required when the pull request changes code under apps/, judged by path and not by branch name, which the agent chooses. Also moves actions/checkout and actions/upload-artifact to v7, since v4 runs on a deprecated Node.js. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The checker dropped the first two table lines as header and separator without looking at them. A table made only of criterion rows lost its first two rows, which could cite tests that do not exist and still pass. A table that does not start with the three-column header and the separator line is now rejected as malformed. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
feat: check the acceptance table of the pull request in CI
The agent that writes the code also judges it, and it tends to confirm its own conclusions. The reviewer runs in a new context, receives only the diff and the ticket, and reports findings without fixing anything. The findings go to the pull request as a comment and do not block the merge: the review is inferential, so the decision stays with the user. The reviewer definition is a harness file, so the guard and the local confirmation rule now cover .claude/agents/. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The review diff only carries committed changes, so anything left out of a commit was silently left out of the review. The steps now say so, and the design records the no-ticket input the workflow already allowed. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
feat: add a fresh-context reviewer subagent
The bypass skips every ruleset requirement, not only the harness guard, and the button shows up before the verification finishes. One merge already went in with the verdict still running. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
docs: record waiting for the verdict before an admin bypass
The fast mode had one function per project that differed in a single step, and the compose command was spelled out in every fix hint. Both now come from one place, so a change to the command or to the checks cannot leave one project behind. Also drops a stale sentence and a repeated pointer from the docs. No behavior change. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
refactor: remove duplication from the verification scripts
Running the full verification before pushing was only a written rule, and a control that exists only as an instruction gets skipped. When it was skipped, the error showed up minutes later as a failed CI round. A PreToolUse hook now checks every git push the agent runs. It scans the branch commits for secrets, which is the one check where CI is too late, and requires that the full mode approved the content of the last commit. Docs-only changes do not invalidate the approval. The full mode also counts uncommitted changes when deciding whether the acceptance table is required, since it usually runs before the commit. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_017UJLJcNU6V3ceKgzE23AZ1
The hook matched the words anywhere in the command text, so opening a pull request whose body described the push was denied as if it were one. It now matches only at the start of a line or after a command separator. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_017UJLJcNU6V3ceKgzE23AZ1
Without jq, the hook fell back to the raw JSON, where the command no longer matched the pattern, so the push went through unchecked. It now treats any mention of git and push as a push when the command cannot be decoded. The --delete exemption also covered a compound command, letting a second push ride along. It now applies only to a single command. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_017UJLJcNU6V3ceKgzE23AZ1
feat: block the agent's push until the full verification approved it
The section mixed agent rules with a human setup guide, repeated itself and the projects' AGENTS.md, and contradicted itself about the api container. It now speaks only to the agent, in one section with subsections in the order the agent needs them. The HLD left the playwright service out of the Compose counts, and the LLD tree omitted the test folders and blurred which runner each suite uses. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_017UJLJcNU6V3ceKgzE23AZ1
Checking a change in one app meant running the whole verdict, and adding a command meant reading the whole script. Each app now owns its fast and full groups and the reports the acceptance table may cite, in scripts/verify/<app>.sh, and the APPS registry drives the full verdict, the fast mode and the stop hook. `full <app>` is for day-to-day work only: the web browser suite talks to the real API, so the push and the CI still require `full` without apps. Also condenses the network rule in AGENTS.md. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_017UJLJcNU6V3ceKgzE23AZ1
…incronizar docs: close the gaps of the sync skill and make implement and sync compatible (LUI-188, LUI-190)
…-182 (LUI-186) The xhigh code review of the whole LUI-182 implementation found defects in the fronts script, its hook and one test. Each one has a test that fails without the fix: - novo: the new branch started with origin/main as its upstream, so a plain git push in the front suggested pushing the feature to main (--no-track) - remover: it deleted the branch with local commits made after the merge, and a merged PR of an old life of the branch hid a newer open one; it now refuses a branch whose tip is not the tip of the merged PR, prefers the open PR, and leaves the folder before removing it so it also works from inside - a front whose folder was deleted by hand (prunable) no longer counts toward the limit of three or shows in listar - hook: frentes.sh is denied with the test-mode variables (HARNESS_TEST, FRENTES_GH and the others), which swapped gh and bypassed the merge check - git-mount test: the relative .git cases need Git 2.48, while the script accepts 2.38, so they are left out below it - sincronizar: the list of what entered no longer filters by merge commits, so squashed pull requests show up Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01ANcDtWf5vRMzv1r42Ax9ce
…review fix: the defects of the fronts script found by the code review of LUI-182 (LUI-186)
… pull request (LUI-191) The integration was tested with two pull requests of the fork. The link works by the identifier in the branch, once the Linear app has access to the repository, the issue stays In Progress while the pull request is open, and In Review comes with a review request or review activity, not with the opening. The empty test pull requests could not be merged, because the harness guard fails a pull request with no changed file. Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01ANcDtWf5vRMzv1r42Ax9ce
The review trigger of the Linear automation needs a reviewer other than the author, and the project has none to count on, so the team automation moves the issue to In Review when the pull request opens. A pull request is only opened with the full approved, so opening already means waiting for the review of the user, and a draft keeps the issue In Progress. Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01ANcDtWf5vRMzv1r42Ax9ce
…-revisao docs: what the Linear and GitHub integration does with the issue of a pull request (LUI-191)
…h the profile per slot - AGENTS.md: the merge is still a decision of the user, but the agent may do it when the user expressly authorizes that pull request or task, with the Veredito and the harness guard green; a harness pull request only enters by the override of the user. The old text said never, not even when asked, and the work of LUI-182 was merged on the express authorization of the user. - aceite of LUI-186, CA10: the browser advice is one profile per slot, since the incognito windows of one session share their cookies. The text of the criterion still carried the old advice that the AGENTS.md had already corrected. Changed at the explicit request of the user, who is the one that unfreezes the plan. Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01ANcDtWf5vRMzv1r42Ax9ce
…rgence points (LUI-192) Acceptance file docs/tickets/LUI-182/LUI-192/aceite.md (CA1-CA3). Nothing changes in the contract or the schema: the ticket only touches the harness scripts, the classification file and the sync skill. Decision: the base (remote, main branch and the default origin/main) comes from one sourced file, scripts/harness-base.sh, that both scripts/verify.sh and scripts/frentes.sh load, like scripts/harness-dir.sh already is. Two owners of the same default let the fronts script create a front from one base while the migration order and the secret scan check against another. Decision: schema.prisma and apps/api/.env.example become a new type, manual, and do not go to documentos. They are merged by hand like code, but documentos is for the documents of the project, and the report of the sync skill names the documents it merged. The type manual counts as touching logic, as a hand-merged schema already does. The migration folders stay migracoes, which keeps the mechanical rename. Decision: apps/api/src/app.module.ts stays registros, since the order of the imports of a Nest module does not change how the modules are resolved. The rule of registros gets one clause: a list whose order matters is not a registros but a manual. The rule of each type stays in the skill, and the classification file only classifies. Decision: the listar prints a manual conflict in the "pede atenção" group, with its type in parentheses as it already does for documentos, so the mechanical group only has what is resolved by a rule. Decision: the folder of the ticket is under LUI-182, since the ticket came from the review of that spec, although it is not a sub-issue of it in Linear. Files and interfaces the implementation will touch: - scripts/harness-base.sh (new): defines BASE_REF, BASE_REMOTE and BASE_BRANCH from HARNESS_BASE_REF, with origin/main as the default. - scripts/verify.sh: loads scripts/harness-base.sh instead of defining BASE_REF. - scripts/frentes.sh: loads scripts/harness-base.sh and takes REMOTE and MAIN_BRANCH from it; cmd_listar sends the manual type to the attention group; the header and the comments say five types. - scripts/pontos-de-convergencia.txt: the new type manual (schema.prisma, .env.example) and the header with five types. - .claude/skills/sincronizar/SKILL.md: the rule of the manual type and the clause of registros. - scripts/test/harness-base.test.sh (new): the CA1 cases. - scripts/test/frentes.test.sh: the CA2 case. Existing tests whose behavior changes: none. Data changes: none. Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01ANcDtWf5vRMzv1r42Ax9ce
…he convergence points (LUI-192) - scripts/harness-base.sh is the only place that reads HARNESS_BASE_REF and knows the default (origin/main); scripts/verify.sh and scripts/frentes.sh load it, so the migration order, the secret scan and a new front look at the same base. frentes.sh uses BASE_REMOTE and BASE_BRANCH directly, without aliases. - scripts/pontos-de-convergencia.txt has a fifth type, manual, for the Prisma schema and the example environment file, which are merged by hand, and the type migracoes is only the migration folders. The listar prints a manual conflict in the attention group, with its type, and keeps the migration folders and the OpenAPI snapshot in the mechanical group. - The sync skill describes the rule of manual, and says that a registros list is one whose order does not matter, so a list that is grouped by topic or ordered is manual. - scripts/test/verify-review.test.sh copies scripts/harness-base.sh too, since scripts/verify.sh now loads it. Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01ANcDtWf5vRMzv1r42Ax9ce
…-e-ca10 docs: the rule of the merge as practised, and the CA10 of LUI-186 with the profile per slot
The main got the rule of the merge in the AGENTS.md and the new text of the CA10 of LUI-186. Nothing in it touches what this branch changes. Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01ANcDtWf5vRMzv1r42Ax9ce
feat: a single base for the harness and an honest classification of the convergence points (LUI-192)
The /abrir-frentes reads the sub-issues and their blocking relations, picks the tickets with no pending blocker and no front, fits them to the free slots, confirms the list with the user and creates one front per ticket with scripts/frentes.sh novo. It leaves the planning, the implementation and the status of the issue to the session of each ticket. The AGENTS.md points to it in the section on parallel fronts. Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01ANcDtWf5vRMzv1r42Ax9ce
Dry run of the skill against the spec of folders (LUI-177) showed that a ticket with a branch but no worktree, or with the status "In Progress", would be offered as free, and that novo would then create a second branch for it. The skill now also looks at the branches and at the status in the tracker, leaves out the tickets with no code to build (design), counts the main checkout when it is on a detached HEAD, and checks the overlap with the tickets that are already running. Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01ANcDtWf5vRMzv1r42Ax9ce
The first evaluation showed three tickets of the spec of folders (and one of the spec of fronts) marked "In Progress" in the tracker whose work is already in the base. The skill called them work to resume and warned of an overlap with them. It now checks the branch against the base before calling the work open, puts the stale ones in their own group for the user to close, and compares the overlap only with work that is still pending. Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01ANcDtWf5vRMzv1r42Ax9ce
In the second evaluation round the agent read the "-" that git cherry prints for a commit with an equivalent in the base as a pending commit, and offered a ticket whose work is already merged as work to resume. The skill now says what each sign means. Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01ANcDtWf5vRMzv1r42Ax9ce
feat: skill /abrir-frentes para abrir as frentes dos tickets prontos de uma spec
…ommit dropped The commit 63c24d1 (a fix of the reports folder, LUI-185) also emptied the permissions block of .claude/settings.json, which had eight deny rules. The root AGENTS.md still says the file denies the reading and the writing of docs/sessoes, docs/specs and the .fig, and the merge rule counts on the denial of gh pr merge. This brings back the eight deny rules. The six ask rules stay out, as decided. Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01ANcDtWf5vRMzv1r42Ax9ce
… of the flow The evaluation of the implement, sync, conformance-review, plan and open-fronts skills found contradictions and gaps between them and the root AGENTS.md. Decided one by one: - One sequence to close a ticket: commit, sync, reviews, full, push on request. The sync now comes before the reviews, so they see what the merge adapted. - The main checkout rests on the principal branch; a detached HEAD is not a rest state and counts as a front. - The review is not a mechanical gate, but a high finding left unfixed stops to ask. - The implement skill gets a last step that waits for the request to push, open the pull request and publish the review and the report of the sync. - The plan skill moves the issue to In Progress and may propose a correction of a stale criterion text, only with the approval of the user. - A ticket is always a sub-issue; the conformance review covers the harness tickets with an acceptance file too; skills are not harness files, on purpose. Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01ANcDtWf5vRMzv1r42Ax9ce
…issoes fix(harness): restaurar as regras deny do settings.json
docs: alinhar o AGENTS.md e as skills do fluxo do ticket
…194) Acceptance file docs/tickets/LUI-193/LUI-194/aceite.md (CA1-CA6). Nothing changes in the contract or the schema: the ticket only moves harness mechanisms into skills. Decision: the guard reads the protected files from a list file that its caller passes (the workflow passes the one from the checked-out main, never the pull request's), one line per pattern with the type, a tab and the path. In the list the star matches inside one folder level and the double star crosses slashes, so the frozen acceptance rule keeps its depth (issue and ticket). The first pattern that matches wins. A missing, unreadable or invalid list, or an empty list of changed files, ends with code 2: no evidence is not approval. Decision: the project list lives in the project skill /verificar, which is born here with only that file. It blocks the scripts and hooks of any skill, the agents, the workflow, settings.json, scripts/ and the list itself, and warns on the test map of each ticket (the file docs/tickets/*/*/mapa-de-testes.*, whose format LUI-196 defines) and on the convergence points. The text of a skill stays free. Decision: the state folder definition, the shell command reader and the state hook go to /proteger-harness. The hook leaves push-verify.sh and becomes its own hook in settings.json; the project help line (who unlocks the full) arrives as an argument of the hook command, so the skill does not cite verify.sh. push-verify.sh keeps loading the quote splitter from the skill, since a project file may load a generic skill's file. Decision: until LUI-196 creates the test map, the cases that move into skills keep their acceptance tag in the case name, so no frozen criterion loses coverage. The shell tests of a generic skill carry their own small helper, because a generic skill cannot load the project's. Decision: the verification finds the tests of every skill with a search over the skills folder (a test folder next to a scripts or hooks folder), for both the Node and the shell suites, and the paths that invalidate the approval of the full include the scripts and hooks folders of the skills. Files and interfaces the implementation will touch: - .claude/skills/proteger-harness/SKILL.md (new): the skill, its values and the list format. - .claude/skills/proteger-harness/scripts/harness-guard.sh (moved from scripts/): takes the list file first and the declared count second. - .claude/skills/proteger-harness/scripts/harness-dir.sh and harness-state-guard.sh (moved from scripts/). - .claude/skills/proteger-harness/hooks/state-guard.sh (new): the state hook, with --ajuda <text>. - .claude/skills/proteger-harness/scripts/test/harness-guard.test.sh and hooks/test/state-guard.test.sh: the CA1, CA2 and CA4 cases, with a helper of their own. - .claude/skills/verificar/SKILL.md and arquivos-protegidos.txt (new), and scripts/test/arquivos-protegidos.test.sh: the CA3 cases. - .claude/hooks/push-verify.sh: no longer denies the state folder; loads the splitter from the skill. - .claude/hooks/stop-verify.sh and record-touched.sh: load harness-dir.sh from the skill. - .claude/settings.json: the state hook. - .github/workflows/harness-guard.yml: calls the guard in the skill with the project list. - scripts/verify.sh: loads harness-dir.sh from the skill, adds the skills' scripts and hooks folders to the verified paths and finds the skill tests; scripts/verify/skill-tests.sh (new) and scripts/test/skill-tests.test.sh (new): the CA5 cases. - scripts/test/push-verify.test.sh: the state cases move to the state hook test. - AGENTS.md: the section of the skills of the ticket and the harness files rule. Existing tests whose behavior changes: the state folder cases of scripts/test/push-verify.test.sh move to the state hook test; scripts/test/harness-guard.test.sh moves into the skill and calls the guard with a list. Data changes: none. Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
…kill proteger-harness (LUI-194) The guard reads the protected files from a list that its caller passes, one line per pattern with the type (bloqueado, aviso, congelado or comandos), instead of a fixed list in the script. The list of this project lives in the new project skill verificar and also blocks the scripts and hooks of any skill and the list itself. The state folder definition, the shell command reader and the state hook move into the skill, and the hook leaves push-verify.sh to become its own hook in settings.json. The full verification finds the tests of every skill without a list by hand, and the scripts and hooks folders of the skills invalidate its approval. Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
…harness (LUI-194) The state hook leaves early when the input does not mention the harness, the guard classifies without a subshell per path, and a test checks that the unlock sentence of the hook in settings.json is the one of the verification. Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
…n a manifest jq cannot read (LUI-194) Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
…nreadable list (LUI-194) Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Contributor
Author
Revisão de conformidade: LUI-194
Sobre o que o revisor não conseguiu conferir: acrescentei o caso da lista ilegível ao CA2 (a Guarda sai com 2). O restante é conferido pelo Relatório do revisor, na íntegraAchados
O que não consegui conferir
|
Contributor
Author
|
Aberto por engano neste repositório; o trabalho vive em argentinaluiz/spec-pullrequest-ia. |
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.
O que muda
A Guarda do harness e a proteção da pasta de estado deixam a pasta
scripts/e viram a skill genérica/proteger-harness. É o primeiro ticket a pôr mecanismo dentro de uma skill (LUI-194, da LUI-193).bloqueado,aviso,congeladoecomandos). Sem lista, ilegível, inválida, sem caminhos ou com o total acima do limite da API, sai com 2./verificar(arquivos-protegidos.txt) e bloqueia também os scripts e os hooks de qualquer skill e a própria lista; o texto de uma skill fica livre.settings.json, com a frase de destravar vinda do projeto em--ajuda.scripts/verify/skill-tests.sh), e as pastasscripts/ehooks/das skills invalidam a aprovação.Harness
Este PR altera arquivos do harness (
.github/,.claude/settings.json,.claude/hooks/,scripts/, scripts e hooks de skills). AGuarda do harnesso reprova, e ele só entra por override do usuário.Aceite
docs/tickets/LUI-193/LUI-194/aceite.md
Sincronização
Nada entrou na
maindesde que a branch saiu dela; não houve merge nem conflito.🤖 Generated with Claude Code