test: repoint verification at Astro output
Verify rendered routes, translations, CSS dependencies, variables, and built CSS values. Keep the original assertion count; do not alter site components or fixtures.
This commit is contained in:
@@ -0,0 +1,292 @@
|
|||||||
|
{
|
||||||
|
"colors": [
|
||||||
|
"#081621",
|
||||||
|
"#0b1b27",
|
||||||
|
"#0c1a25",
|
||||||
|
"#0f2230",
|
||||||
|
"#102536",
|
||||||
|
"#102837",
|
||||||
|
"#102b3a",
|
||||||
|
"#112a3b",
|
||||||
|
"#122534",
|
||||||
|
"#123042",
|
||||||
|
"#132b3b",
|
||||||
|
"#172f42",
|
||||||
|
"#173046",
|
||||||
|
"#173245",
|
||||||
|
"#173b4f",
|
||||||
|
"#18364a",
|
||||||
|
"#19364a",
|
||||||
|
"#1a4b42",
|
||||||
|
"#1c425a",
|
||||||
|
"#1d455b",
|
||||||
|
"#1f3a4b",
|
||||||
|
"#215675",
|
||||||
|
"#244760",
|
||||||
|
"#29455a",
|
||||||
|
"#2a4150",
|
||||||
|
"#315f80",
|
||||||
|
"#344c5d",
|
||||||
|
"#41596b",
|
||||||
|
"#426070",
|
||||||
|
"#466274",
|
||||||
|
"#486175",
|
||||||
|
"#496274",
|
||||||
|
"#527085",
|
||||||
|
"#527f9f",
|
||||||
|
"#557080",
|
||||||
|
"#572f32",
|
||||||
|
"#596f9a",
|
||||||
|
"#5b7098",
|
||||||
|
"#65717a",
|
||||||
|
"#697b89",
|
||||||
|
"#6b668f",
|
||||||
|
"#6c6898",
|
||||||
|
"#7c78a8",
|
||||||
|
"#80c69a",
|
||||||
|
"#80c69a20",
|
||||||
|
"#80c69a22",
|
||||||
|
"#8ca1af",
|
||||||
|
"#91aab7",
|
||||||
|
"#9ba7a5",
|
||||||
|
"#9bcba7",
|
||||||
|
"#9eabb4",
|
||||||
|
"#9eb0bb",
|
||||||
|
"#a7483f",
|
||||||
|
"#a9b6be",
|
||||||
|
"#a9bcc8",
|
||||||
|
"#a9e3ae",
|
||||||
|
"#aebbc3",
|
||||||
|
"#aebfc7",
|
||||||
|
"#aebfc9",
|
||||||
|
"#afbec7",
|
||||||
|
"#b0bac1",
|
||||||
|
"#b5c0c7",
|
||||||
|
"#b7c7d1",
|
||||||
|
"#b8c8d2",
|
||||||
|
"#b9c8d0",
|
||||||
|
"#b9c8d1",
|
||||||
|
"#bed0dc",
|
||||||
|
"#bfccd4",
|
||||||
|
"#c1d1d8",
|
||||||
|
"#c4cdd3",
|
||||||
|
"#c6d2d7",
|
||||||
|
"#c9d5dc",
|
||||||
|
"#cbd9e1",
|
||||||
|
"#d0d5d2",
|
||||||
|
"#d4dfe3",
|
||||||
|
"#d5dde2",
|
||||||
|
"#d5f1d6",
|
||||||
|
"#d6e1e4",
|
||||||
|
"#d8dee2",
|
||||||
|
"#e5e3ef",
|
||||||
|
"#e5eeeb",
|
||||||
|
"#e89a8e",
|
||||||
|
"#e8ecee",
|
||||||
|
"#e9ecee",
|
||||||
|
"#e9eeed",
|
||||||
|
"#ebbf58",
|
||||||
|
"#eceaf5",
|
||||||
|
"#eceff0",
|
||||||
|
"#edf0f1",
|
||||||
|
"#eeedf6",
|
||||||
|
"#efc76b",
|
||||||
|
"#efc76b18",
|
||||||
|
"#f0eef8",
|
||||||
|
"#f1f0f7",
|
||||||
|
"#f5f4f1",
|
||||||
|
"#f6f3ed",
|
||||||
|
"#ffb5a8",
|
||||||
|
"#ffd7d0",
|
||||||
|
"#fff",
|
||||||
|
"#ffffff05",
|
||||||
|
"#ffffff06",
|
||||||
|
"#ffffff1f",
|
||||||
|
"#ffffff2b",
|
||||||
|
"#ffffff2d",
|
||||||
|
"#ffffff30",
|
||||||
|
"#ffffff32",
|
||||||
|
"#ffffff40",
|
||||||
|
"#ffffff42",
|
||||||
|
"#ffffff50",
|
||||||
|
"#ffffff66",
|
||||||
|
"rgb(255 255 255 / 14.1176%)",
|
||||||
|
"rgb(255 255 255 / 22.7451%)",
|
||||||
|
"rgb(255 255 255 / 25.098%)",
|
||||||
|
"rgb(255 255 255 / 31.3725%)"
|
||||||
|
],
|
||||||
|
"sizes": [
|
||||||
|
"01em",
|
||||||
|
"1em",
|
||||||
|
"1px",
|
||||||
|
"1.2em",
|
||||||
|
"1.45em",
|
||||||
|
"1.5em",
|
||||||
|
"1.8em",
|
||||||
|
"02em",
|
||||||
|
"2px",
|
||||||
|
"2.4vw",
|
||||||
|
"2.5vw",
|
||||||
|
"2.6vw",
|
||||||
|
"3em",
|
||||||
|
"3px",
|
||||||
|
"3vw",
|
||||||
|
"3.3vw",
|
||||||
|
"3.4vw",
|
||||||
|
"04em",
|
||||||
|
"4px",
|
||||||
|
"4vw",
|
||||||
|
"05em",
|
||||||
|
"5em",
|
||||||
|
"5px",
|
||||||
|
"5vw",
|
||||||
|
"5.6vw",
|
||||||
|
"06em",
|
||||||
|
"6px",
|
||||||
|
"6vw",
|
||||||
|
"07em",
|
||||||
|
"7px",
|
||||||
|
"7vw",
|
||||||
|
"08em",
|
||||||
|
"8px",
|
||||||
|
"8vw",
|
||||||
|
"8.3vw",
|
||||||
|
"09em",
|
||||||
|
"9em",
|
||||||
|
"9px",
|
||||||
|
"9vw",
|
||||||
|
"10px",
|
||||||
|
"10.5px",
|
||||||
|
"11px",
|
||||||
|
"12em",
|
||||||
|
"12px",
|
||||||
|
"12vh",
|
||||||
|
"13px",
|
||||||
|
"14px",
|
||||||
|
"15px",
|
||||||
|
"16px",
|
||||||
|
"17px",
|
||||||
|
"17vw",
|
||||||
|
"18px",
|
||||||
|
"19px",
|
||||||
|
"20px",
|
||||||
|
"22px",
|
||||||
|
"23px",
|
||||||
|
"24px",
|
||||||
|
"25px",
|
||||||
|
"26px",
|
||||||
|
"27px",
|
||||||
|
"28px",
|
||||||
|
"30px",
|
||||||
|
"32px",
|
||||||
|
"34px",
|
||||||
|
"35em",
|
||||||
|
"35px",
|
||||||
|
"36px",
|
||||||
|
"38px",
|
||||||
|
"40px",
|
||||||
|
"42px",
|
||||||
|
"44px",
|
||||||
|
"045em",
|
||||||
|
"45px",
|
||||||
|
"46px",
|
||||||
|
"48px",
|
||||||
|
"50px",
|
||||||
|
"52px",
|
||||||
|
"54px",
|
||||||
|
"55px",
|
||||||
|
"56px",
|
||||||
|
"58px",
|
||||||
|
"60px",
|
||||||
|
"62px",
|
||||||
|
"64px",
|
||||||
|
"65px",
|
||||||
|
"70px",
|
||||||
|
"72px",
|
||||||
|
"075em",
|
||||||
|
"75px",
|
||||||
|
"76px",
|
||||||
|
"78px",
|
||||||
|
"80px",
|
||||||
|
"82px",
|
||||||
|
"85px",
|
||||||
|
"90px",
|
||||||
|
"92px",
|
||||||
|
"95px",
|
||||||
|
"96px",
|
||||||
|
"100px",
|
||||||
|
"105px",
|
||||||
|
"108px",
|
||||||
|
"110px",
|
||||||
|
"112px",
|
||||||
|
"120px",
|
||||||
|
"126px",
|
||||||
|
"130px",
|
||||||
|
"135px",
|
||||||
|
"140px",
|
||||||
|
"145px",
|
||||||
|
"148px",
|
||||||
|
"150px",
|
||||||
|
"160px",
|
||||||
|
"164px",
|
||||||
|
"170px",
|
||||||
|
"175px",
|
||||||
|
"180px",
|
||||||
|
"190px",
|
||||||
|
"200px",
|
||||||
|
"210px",
|
||||||
|
"220px",
|
||||||
|
"230px",
|
||||||
|
"240px",
|
||||||
|
"255px",
|
||||||
|
"260px",
|
||||||
|
"270px",
|
||||||
|
"280px",
|
||||||
|
"290px",
|
||||||
|
"300px",
|
||||||
|
"305px",
|
||||||
|
"320px",
|
||||||
|
"330px",
|
||||||
|
"340px",
|
||||||
|
"360px",
|
||||||
|
"380px",
|
||||||
|
"390px",
|
||||||
|
"410px",
|
||||||
|
"420px",
|
||||||
|
"440px",
|
||||||
|
"460px",
|
||||||
|
"500px",
|
||||||
|
"520px",
|
||||||
|
"530px",
|
||||||
|
"540px",
|
||||||
|
"560px",
|
||||||
|
"570px",
|
||||||
|
"600px",
|
||||||
|
"620px",
|
||||||
|
"650px",
|
||||||
|
"680px",
|
||||||
|
"700px",
|
||||||
|
"720px",
|
||||||
|
"730px",
|
||||||
|
"750px",
|
||||||
|
"780px",
|
||||||
|
"800px",
|
||||||
|
"850px",
|
||||||
|
"880px",
|
||||||
|
"900px",
|
||||||
|
"950px",
|
||||||
|
"1000px",
|
||||||
|
"1040px",
|
||||||
|
"1050px",
|
||||||
|
"1100px",
|
||||||
|
"1400px",
|
||||||
|
"1420px",
|
||||||
|
"1500px",
|
||||||
|
"1600px",
|
||||||
|
"1840px",
|
||||||
|
"1920px",
|
||||||
|
"1960px",
|
||||||
|
"2200px",
|
||||||
|
"2880px"
|
||||||
|
]
|
||||||
|
}
|
||||||
@@ -28,8 +28,11 @@ A presentation for humans who ship
|
|||||||
Uma apresentação para quem entrega software
|
Uma apresentação para quem entrega software
|
||||||
AI for
|
AI for
|
||||||
dummies.
|
dummies.
|
||||||
You do not need an army of models. You need a system: one mind to frame the work, several hands to execute it, and a clean boundary between every task.
|
You do not need an army of models. You need a system: one mind to frame the work,
|
||||||
Você não precisa de um exército de modelos. Precisa de um sistema: uma mente para enquadrar o trabalho, várias mãos para executá-lo e uma fronteira clara entre cada tarefa.
|
several hands to execute it, and a clean boundary between every task.
|
||||||
|
Você não precisa de um exército de modelos. Precisa de um sistema: uma mente para
|
||||||
|
enquadrar o trabalho, várias mãos para executá-lo e uma fronteira clara entre cada
|
||||||
|
tarefa.
|
||||||
FIELD NOTE / 001
|
FIELD NOTE / 001
|
||||||
NOTA DE CAMPO / 001
|
NOTA DE CAMPO / 001
|
||||||
Ship the
|
Ship the
|
||||||
@@ -114,8 +117,10 @@ agent/docs
|
|||||||
Interface worker
|
Interface worker
|
||||||
Receives: component contract + visual states
|
Receives: component contract + visual states
|
||||||
Returns: focused diff + viewport evidence
|
Returns: focused diff + viewport evidence
|
||||||
The orchestrator preserves intent, writes small contracts, and gathers results that can be
|
The orchestrator preserves intent, writes small contracts, and gathers results that can
|
||||||
verified. It does not need to type every line.
|
be verified. It does not need to type every line.
|
||||||
|
O orquestrador preserva a intenção, escreve pequenos contratos e reúne resultados
|
||||||
|
verificáveis. Ele não precisa digitar cada linha.
|
||||||
Why the boundary matters
|
Why the boundary matters
|
||||||
Por que a fronteira importa
|
Por que a fronteira importa
|
||||||
one vague task / three predictable failures
|
one vague task / three predictable failures
|
||||||
@@ -129,7 +134,8 @@ Cada worker lê tudo. Ninguém sabe quais fatos são essenciais.
|
|||||||
Branch collision
|
Branch collision
|
||||||
Colisão de branches
|
Colisão de branches
|
||||||
Two agents touch the same checkout. The fastest path becomes conflict resolution.
|
Two agents touch the same checkout. The fastest path becomes conflict resolution.
|
||||||
Dois agentes usam o mesmo checkout. O caminho mais rápido vira resolução de conflitos.
|
Dois agentes usam o mesmo checkout. O caminho mais rápido vira resolução de
|
||||||
|
conflitos.
|
||||||
03
|
03
|
||||||
Confident drift
|
Confident drift
|
||||||
Desvio confiante
|
Desvio confiante
|
||||||
@@ -143,6 +149,8 @@ Clique em uma fase.
|
|||||||
Veja a passagem.
|
Veja a passagem.
|
||||||
Delegation means moving one bounded task into a smaller context—not giving away
|
Delegation means moving one bounded task into a smaller context—not giving away
|
||||||
responsibility.
|
responsibility.
|
||||||
|
Delegar é mover uma tarefa delimitada para um contexto menor — não abrir mão da
|
||||||
|
responsabilidade.
|
||||||
01
|
01
|
||||||
PLAN
|
PLAN
|
||||||
02
|
02
|
||||||
@@ -186,6 +194,8 @@ por
|
|||||||
mão.
|
mão.
|
||||||
A worktree is another directory linked to the same repository. Each agent gets its own
|
A worktree is another directory linked to the same repository. Each agent gets its own
|
||||||
checkout and index; history remains shared.
|
checkout and index; history remains shared.
|
||||||
|
Um worktree é outro diretório ligado ao mesmo repositório. Cada agente recebe seu
|
||||||
|
próprio checkout e índice; o histórico continua compartilhado.
|
||||||
Select a node to inspect its checkout, owner, and next action.
|
Select a node to inspect its checkout, owner, and next action.
|
||||||
Selecione um nó para inspecionar checkout, responsável e próxima ação.
|
Selecione um nó para inspecionar checkout, responsável e próxima ação.
|
||||||
repository topology
|
repository topology
|
||||||
@@ -193,8 +203,10 @@ topologia do repositório
|
|||||||
4 checkouts
|
4 checkouts
|
||||||
4 checkouts
|
4 checkouts
|
||||||
ROOT
|
ROOT
|
||||||
|
RAIZ
|
||||||
main
|
main
|
||||||
● clean
|
● clean
|
||||||
|
● limpo
|
||||||
UI AGENT
|
UI AGENT
|
||||||
AGENTE DE UI
|
AGENTE DE UI
|
||||||
agent/ui
|
agent/ui
|
||||||
@@ -229,8 +241,11 @@ ritmo.
|
|||||||
Choose a job to see why the model profile changes.
|
Choose a job to see why the model profile changes.
|
||||||
Escolha um trabalho para entender por que o perfil do modelo muda.
|
Escolha um trabalho para entender por que o perfil do modelo muda.
|
||||||
Work
|
Work
|
||||||
|
Trabalho
|
||||||
Profile
|
Profile
|
||||||
|
Perfil
|
||||||
Prompt shape
|
Prompt shape
|
||||||
|
Formato do prompt
|
||||||
Plan
|
Plan
|
||||||
Planejar
|
Planejar
|
||||||
strong / broad
|
strong / broad
|
||||||
@@ -262,8 +277,12 @@ gear.
|
|||||||
Escolha o motor.
|
Escolha o motor.
|
||||||
Depois escolha a
|
Depois escolha a
|
||||||
marcha.
|
marcha.
|
||||||
A stronger model changes the capability ceiling. Higher reasoning effort gives that model more room to work. Start with the lightest combination that passes your real checks, then move one knob at a time.
|
A stronger model changes the capability ceiling. Higher reasoning effort gives that
|
||||||
Um modelo mais forte muda o teto de capacidade. Mais esforço de raciocínio dá mais espaço para esse modelo trabalhar. Comece com a combinação mais leve que passa seus checks e mova um controle por vez.
|
model more room to work. Start with the lightest combination that passes your real
|
||||||
|
checks, then move one knob at a time.
|
||||||
|
Um modelo mais forte muda o teto de capacidade. Mais esforço de raciocínio dá mais
|
||||||
|
espaço para esse modelo trabalhar. Comece com a combinação mais leve que passa seus
|
||||||
|
checks e mova um controle por vez.
|
||||||
OPENAI
|
OPENAI
|
||||||
CLAUDE
|
CLAUDE
|
||||||
GEMINI
|
GEMINI
|
||||||
@@ -287,17 +306,28 @@ Balanced starting point for normal implementation, tests, and review. Measure be
|
|||||||
reasoning: { effort: "medium" }
|
reasoning: { effort: "medium" }
|
||||||
ROUTING RULE
|
ROUTING RULE
|
||||||
REGRA DE ROTEAMENTO
|
REGRA DE ROTEAMENTO
|
||||||
Use strong models for ambiguity and judgment. Use lighter models for bounded execution. Raise effort only when evaluation shows a gain.
|
Use strong models for ambiguity and judgment. Use lighter models for bounded execution.
|
||||||
Use modelos fortes para ambiguidade e julgamento. Use modelos leves para execução delimitada. Aumente o esforço apenas quando a avaliação mostrar ganho.
|
Raise effort only when evaluation shows a gain.
|
||||||
|
Use modelos fortes para ambiguidade e julgamento. Use modelos leves para execução
|
||||||
|
delimitada. Aumente o esforço apenas quando a avaliação mostrar ganho.
|
||||||
Skills
|
Skills
|
||||||
Skills
|
Skills
|
||||||
Write the right way
|
Write the right way
|
||||||
once.
|
once.
|
||||||
Escreva do jeito certo
|
Escreva do jeito certo
|
||||||
uma vez.
|
uma vez.
|
||||||
A skill is a reusable procedure. It can carry instructions, references, scripts, and assets. It is not magical memory, and it does not replace acceptance criteria.
|
A skill is a reusable procedure. It can carry instructions, references, scripts, and
|
||||||
Uma skill é um procedimento reutilizável. Ela pode carregar instruções, referências, scripts e assets. Não é memória mágica e não substitui critérios de aceitação.
|
assets. It is not magical memory, and it does not replace acceptance criteria.
|
||||||
|
Uma skill é um procedimento reutilizável. Ela pode carregar instruções, referências,
|
||||||
|
scripts e assets. Não é memória mágica e não substitui critérios de aceitação.
|
||||||
|
01 / trigger clearly
|
||||||
|
01 / defina o gatilho
|
||||||
|
02 / load detail on demand
|
||||||
|
02 / carregue detalhes sob demanda
|
||||||
|
03 / return evidence
|
||||||
|
03 / devolva evidências
|
||||||
SKILL PACKAGE
|
SKILL PACKAGE
|
||||||
|
PACOTE DE SKILL
|
||||||
SKILL.md
|
SKILL.md
|
||||||
procedure and limits
|
procedure and limits
|
||||||
references/
|
references/
|
||||||
@@ -312,10 +342,10 @@ Trigger, procedure, constraints, and the exact evidence the agent must return.
|
|||||||
select another file to explore
|
select another file to explore
|
||||||
Create a skill
|
Create a skill
|
||||||
repeatable pain → reusable judgment
|
repeatable pain → reusable judgment
|
||||||
03
|
|
||||||
Choose only useful anatomy
|
|
||||||
01
|
01
|
||||||
Start from repeated friction
|
Start from repeated friction
|
||||||
|
03
|
||||||
|
Choose only useful anatomy
|
||||||
05
|
05
|
||||||
Test behavior, then sharpen
|
Test behavior, then sharpen
|
||||||
02
|
02
|
||||||
@@ -336,27 +366,55 @@ Common skills
|
|||||||
Skills comuns
|
Skills comuns
|
||||||
choose behavior before model
|
choose behavior before model
|
||||||
escolha o comportamento antes do modelo
|
escolha o comportamento antes do modelo
|
||||||
COMMUNICATION STYLE
|
The field kit
|
||||||
caveman
|
O kit de campo
|
||||||
Use for routine status, handoffs, and technical summaries where speed matters. Short fragments make actions and evidence easy to scan.
|
Different jobs.
|
||||||
DIAGNOSTIC LOOP
|
Different
|
||||||
|
instincts.
|
||||||
|
Trabalhos diferentes.
|
||||||
|
Instintos
|
||||||
|
diferentes.
|
||||||
|
A skill changes how an agent approaches work. Some shape communication. Others enforce
|
||||||
|
research, debugging, review, or completion discipline. Select one to inspect its
|
||||||
|
operating rule and verified source.
|
||||||
|
Uma skill muda como o agente aborda o trabalho. Algumas moldam a comunicação. Outras
|
||||||
|
impõem pesquisa, diagnóstico, revisão ou disciplina de conclusão. Selecione uma para
|
||||||
|
inspecionar sua regra operacional.
|
||||||
|
DIAGNOSE
|
||||||
|
DIAGNOSTICAR
|
||||||
diagnosing-bugs
|
diagnosing-bugs
|
||||||
Use for hard bugs, flakes, and regressions. First build a fast deterministic reproduction, then minimize, rank hypotheses, instrument, and fix the root cause.
|
tight feedback loop
|
||||||
SIMPLIFICATION INSTINCT
|
ciclo curto de feedback
|
||||||
|
SIMPLIFY
|
||||||
|
SIMPLIFICAR
|
||||||
ponytail-lite
|
ponytail-lite
|
||||||
Use when a request invites frameworks, dependencies, abstractions, or speculative scaffolding. It checks reuse, standard library, and native platform features before adding code.
|
minimum code that holds
|
||||||
CONTEXT ECONOMY
|
código mínimo que funciona
|
||||||
token-saver
|
COMMUNICATE
|
||||||
Use around verbose tests, builds, Git output, and logs. Filtering preserves context for reasoning while retaining full failure output for recovery.
|
COMUNICAR
|
||||||
SOURCE DISCIPLINE
|
caveman
|
||||||
|
signal without filler
|
||||||
|
sinal sem excesso
|
||||||
|
INVESTIGATE
|
||||||
|
INVESTIGAR
|
||||||
research
|
research
|
||||||
Use when APIs, standards, architecture facts, or current behavior must be verified. Capture findings in a cited note, prioritizing primary sources.
|
primary sources first
|
||||||
COMPLETION DISCIPLINE
|
fontes primárias primeiro
|
||||||
unlazy
|
REVIEW
|
||||||
Use for substantial autonomous builds, audits, and parallel work where quiet omissions are expensive. It turns “done” into runnable acceptance checks.
|
REVISAR
|
||||||
INDEPENDENT REVIEW
|
|
||||||
code-review
|
code-review
|
||||||
Use on a branch or PR. One axis checks repository standards; another checks whether the change actually satisfies its originating specification.
|
standards × spec
|
||||||
|
padrões × especificação
|
||||||
|
COMPLETE
|
||||||
|
CONCLUIR
|
||||||
|
unlazy
|
||||||
|
gates and evidence
|
||||||
|
gates e evidências
|
||||||
|
ECONOMIZE
|
||||||
|
ECONOMIZAR
|
||||||
|
token-saver
|
||||||
|
compress noisy output
|
||||||
|
comprima saídas ruidosas
|
||||||
01
|
01
|
||||||
SIMPLIFICATION INSTINCT
|
SIMPLIFICATION INSTINCT
|
||||||
ponytail-lite
|
ponytail-lite
|
||||||
@@ -368,6 +426,30 @@ Date picker? Start with <input type="date">.
|
|||||||
WATCH OUT
|
WATCH OUT
|
||||||
Never simplify away security, accessibility, validation, or real edge cases.
|
Never simplify away security, accessibility, validation, or real edge cases.
|
||||||
GITHUB SOURCE ↗
|
GITHUB SOURCE ↗
|
||||||
|
ONE PRACTICAL LOADOUT
|
||||||
|
UM LOADOUT PRÁTICO
|
||||||
|
PLAN
|
||||||
|
unlazy
|
||||||
|
→
|
||||||
|
BUILD
|
||||||
|
ponytail-lite
|
||||||
|
→
|
||||||
|
DEBUG
|
||||||
|
diagnosing-bugs
|
||||||
|
→
|
||||||
|
REPORT
|
||||||
|
caveman
|
||||||
|
PLANEJAR
|
||||||
|
unlazy
|
||||||
|
→
|
||||||
|
CONSTRUIR
|
||||||
|
ponytail-lite
|
||||||
|
→
|
||||||
|
DIAGNOSTICAR
|
||||||
|
diagnosing-bugs
|
||||||
|
→
|
||||||
|
REPORTAR
|
||||||
|
caveman
|
||||||
INSTALL PACK
|
INSTALL PACK
|
||||||
Ask your coding agent to verify, install, and validate the skills.
|
Ask your coding agent to verify, install, and validate the skills.
|
||||||
COPY
|
COPY
|
||||||
@@ -427,7 +509,14 @@ Same contract · explicit working methods · stronger proof
|
|||||||
THE HUMAN JOB
|
THE HUMAN JOB
|
||||||
O PAPEL HUMANO
|
O PAPEL HUMANO
|
||||||
The agent may be autonomous in execution. Intent, boundaries, and evidence remain yours.
|
The agent may be autonomous in execution. Intent, boundaries, and evidence remain yours.
|
||||||
O agente pode ser autônomo na execução. Intenção, limites e evidências continuam sendo seus.
|
O agente pode ser autônomo na execução. Intenção, limites e evidências continuam sendo
|
||||||
|
seus.
|
||||||
|
START HERE
|
||||||
|
COMECE AQUI
|
||||||
|
Begin with one agent and one skill. Add parallelism only when the tasks are truly
|
||||||
|
independent.
|
||||||
|
Comece com um agente e uma skill. Adicione paralelismo apenas quando as tarefas forem
|
||||||
|
realmente independentes.
|
||||||
Verification
|
Verification
|
||||||
run each gate separately
|
run each gate separately
|
||||||
01 · STATIC
|
01 · STATIC
|
||||||
@@ -450,8 +539,9 @@ Go deeper with official documentation, production case studies, Medium, and prac
|
|||||||
workflows.
|
workflows.
|
||||||
Rules and enforcement case study →
|
Rules and enforcement case study →
|
||||||
Skills review desk →
|
Skills review desk →
|
||||||
|
Primary references →
|
||||||
12-part reading path →
|
12-part reading path →
|
||||||
Aprofunde com documentação oficial, casos de produção, Medium e fluxos de praticantes.
|
Aprofunde com documentação oficial, casos de produção, Medium e fluxos de praticantes.
|
||||||
Estudo de caso sobre regras e enforcement →
|
Estudo de caso sobre regras e enforcement →
|
||||||
Skills review desk →
|
Referências primárias →
|
||||||
Trilha com 12 leituras →
|
Trilha com 12 leituras →
|
||||||
|
|||||||
+49
-18
@@ -1,4 +1,5 @@
|
|||||||
import { readFileSync } from 'node:fs';
|
import { readFileSync, readdirSync, statSync } from 'node:fs';
|
||||||
|
import { dirname, join } from 'node:path';
|
||||||
|
|
||||||
const read = (path) => readFileSync(new URL(`../${path}`, import.meta.url), 'utf8');
|
const read = (path) => readFileSync(new URL(`../${path}`, import.meta.url), 'utf8');
|
||||||
const pages = [
|
const pages = [
|
||||||
@@ -13,27 +14,57 @@ const pages = [
|
|||||||
'hands-on/starter/index.html',
|
'hands-on/starter/index.html',
|
||||||
'hands-on/rules/index.html',
|
'hands-on/rules/index.html',
|
||||||
];
|
];
|
||||||
|
const walk = (path) =>
|
||||||
|
readdirSync(path).flatMap((name) => {
|
||||||
|
const child = join(path, name);
|
||||||
|
return statSync(child).isDirectory() ? walk(child) : [child];
|
||||||
|
});
|
||||||
|
const definitions = (css) => new Set([...css.matchAll(/(--[\w-]+)\s*:/g)].map(([, name]) => name));
|
||||||
|
const uses = (css) => new Set([...css.matchAll(/var\((--[\w-]+)/g)].map(([, name]) => name));
|
||||||
|
const builtCss = walk('dist/_astro')
|
||||||
|
.filter((path) => path.endsWith('.css'))
|
||||||
|
.map((path) => readFileSync(path, 'utf8'))
|
||||||
|
.join('\n');
|
||||||
|
const builtValues = {
|
||||||
|
colors: new Set(builtCss.match(/#[0-9a-fA-F]{3,8}\b|(?:rgba?|hsla?)\([^)]*\)/g) || []),
|
||||||
|
sizes: new Set(builtCss.match(/\b\d+(?:\.\d+)?(?:px|rem|em|vw|vh)\b/g) || []),
|
||||||
|
};
|
||||||
|
// Captured from origin/main after its Astro build. This catches a value that is
|
||||||
|
// silently changed to a nearby token: source token checks cannot see that drift.
|
||||||
|
const baselineValues = JSON.parse(read('.agents/snapshots/built-css-values.json'));
|
||||||
|
|
||||||
for (const page of pages) {
|
for (const page of pages) {
|
||||||
const html = read(page);
|
const html = read(page);
|
||||||
if (!html.includes('name="viewport"')) throw new Error(`${page} lacks a viewport declaration`);
|
if (!html.includes('name="viewport"')) throw new Error(`${page} lacks a viewport declaration`);
|
||||||
if (html.match(/<(script|link)[^>]+(src|href)="https?:[^\"]+"/i))
|
if (html.match(/<(script|link)[^>]+(src|href)="https?:[^\"]+"/i))
|
||||||
throw new Error(`${page} has an external runtime dependency`);
|
throw new Error(`${page} has an external runtime dependency`);
|
||||||
}
|
}
|
||||||
const shared = read('chapters.css');
|
for (const file of walk('dist').filter((path) => path.endsWith('.css'))) {
|
||||||
const skills = read('skills/styles.css');
|
const css = readFileSync(file, 'utf8').replace(/\/\*[\s\S]*?\*\//g, '');
|
||||||
const guide = read('full-guide/index.html');
|
if (/@import|src:\s*url\(['"]?https?:|url\(['"]?https?:/i.test(css))
|
||||||
const guideAudit = read('full-guide/audit.css');
|
throw new Error(`${file} has an external CSS dependency`);
|
||||||
for (const token of ['@media(max-width:800px)', '@media(max-width:520px)'])
|
}
|
||||||
if (!shared.includes(token)) throw new Error(`shared chapter CSS lacks ${token}`);
|
for (const [kind, values] of Object.entries(baselineValues)) {
|
||||||
for (const token of [
|
const missing = values.filter((value) => !builtValues[kind].has(value));
|
||||||
'minmax(0,1.3fr)',
|
if (missing.length) throw new Error(`built CSS lost ${kind}: ${missing.join(', ')}`);
|
||||||
'overflow-wrap:anywhere',
|
}
|
||||||
'@media(max-width:800px)',
|
// Legacy fixtures still ship directly. Resolve every var() from the stylesheets
|
||||||
'prefers-reduced-motion',
|
// that page actually links; Astro's tokens cannot mask a broken standalone page.
|
||||||
])
|
for (const page of pages) {
|
||||||
if (!skills.includes(token)) throw new Error(`skills package CSS lacks ${token}`);
|
const html = read(page);
|
||||||
if (!guide.includes('href="audit.css"'))
|
const linked = [...html.matchAll(/<link[^>]+rel="stylesheet"[^>]+href="([^"]+)"/gi)].map(
|
||||||
throw new Error('full guide does not load its responsive audit overrides');
|
([, href]) => href,
|
||||||
for (const token of ['.handoff table', '.route-table button', 'overflow-wrap:anywhere'])
|
);
|
||||||
if (!guideAudit.includes(token)) throw new Error(`full guide audit CSS lacks ${token}`);
|
const styles = linked
|
||||||
|
.filter((href) => !/^https?:/i.test(href))
|
||||||
|
.map((href) => read(join(dirname(page), href)));
|
||||||
|
const defined = new Set(styles.flatMap((css) => [...definitions(css)]));
|
||||||
|
const unresolved = new Set(
|
||||||
|
styles.flatMap((css) =>
|
||||||
|
[...uses(css)].filter((name) => name !== '--score' && !defined.has(name)),
|
||||||
|
),
|
||||||
|
);
|
||||||
|
if (unresolved.size)
|
||||||
|
throw new Error(`${page} has unresolved CSS variables: ${[...unresolved].join(', ')}`);
|
||||||
|
}
|
||||||
console.log('responsive UI audit passed');
|
console.log('responsive UI audit passed');
|
||||||
|
|||||||
+185
-319
@@ -1,120 +1,138 @@
|
|||||||
import { readFileSync } from 'node:fs';
|
import { readFileSync } from 'node:fs';
|
||||||
|
|
||||||
const read = (path) => readFileSync(new URL(`../${path}`, import.meta.url), 'utf8');
|
const read = (path) => readFileSync(new URL(`../${path}`, import.meta.url), 'utf8');
|
||||||
const landingHtml = read('index.html');
|
const built = (path) => read(`dist/${path}`);
|
||||||
const html = read('full-guide/index.html');
|
const rendered = (value) =>
|
||||||
const js = read('app.js');
|
value
|
||||||
const refs = read('docs/references/README.md');
|
.replace(/<script[\s\S]*?<\/script>/gi, '')
|
||||||
const additional = read('docs/references/additional-reading.md');
|
.replace(/<style[\s\S]*?<\/style>/gi, '')
|
||||||
const starterHtml = read('hands-on/starter/index.html');
|
.replace(/<!--[\s\S]*?-->/g, '')
|
||||||
const starterJs = read('hands-on/starter/app.js');
|
.replace(/<[^>]+>/g, ' ')
|
||||||
const skillSources = read('docs/references/skill-sources.md');
|
.replace(/&/g, '&')
|
||||||
const modelRouting = read('docs/references/model-routing.md');
|
.replace(
|
||||||
const rulesHtml = read('rules/index.html');
|
/&(lt|gt|quot|nbsp);/g,
|
||||||
const rulesJs = read('rules/app.js');
|
(_, entity) => ({ lt: '<', gt: '>', quot: '"', nbsp: ' ' })[entity],
|
||||||
const rulesCss = read('rules/styles.css');
|
)
|
||||||
const reviewHtml = read('skills-review/index.html');
|
.replace(/�?39;/g, "'")
|
||||||
const reviewJs = read('skills-review/app.js');
|
.replace(/\s+/g, ' ')
|
||||||
const reviewFiles = read('skills-review/files.js');
|
.trim();
|
||||||
const reviewLensCss = read('skills-review/change-lens.css');
|
const normalize = (value) => value.replace(/\s+/g, ' ').trim();
|
||||||
const chaptersCss = read('chapters.css');
|
|
||||||
const summaryHtml = read('summary/index.html');
|
const html = {
|
||||||
const modelsHtml = read('models/index.html');
|
landing: built('index.html'),
|
||||||
const agentsHtml = read('agents/index.html');
|
guide: built('full-guide/index.html'),
|
||||||
const skillsHtml = read('skills/index.html');
|
summary: built('summary/index.html'),
|
||||||
const reviewCatalog = read('skills-review/catalog.js');
|
models: built('models/index.html'),
|
||||||
const reviewVoteJs = read('skills-review/vote.js');
|
agents: built('agents/index.html'),
|
||||||
const voteService = read('vote-service/main.go');
|
skills: built('skills/index.html'),
|
||||||
for (const url of [
|
rules: built('rules/index.html'),
|
||||||
'https://code.claude.com/docs/en/sub-agents',
|
review: built('skills-review/index.html'),
|
||||||
'https://code.claude.com/docs/en/skills',
|
starter: built('hands-on/starter/index.html'),
|
||||||
'https://code.claude.com/docs/en/worktrees',
|
labRules: built('hands-on/rules/index.html'),
|
||||||
'https://git-scm.com/docs/git-worktree.html',
|
};
|
||||||
'https://developers.openai.com/codex/skills',
|
const snapshot = (path) => normalize(read(`.agents/snapshots/${path}`));
|
||||||
])
|
const reviewAssetSrc = html.review.match(/src="([^"]+\.[a-zA-Z0-9_-]{8,}\.js)"/)?.[1];
|
||||||
if (!refs.includes(url)) throw new Error(`missing reference ${url}`);
|
const reviewAsset = reviewAssetSrc ? read(`dist/_astro/${reviewAssetSrc.split('/').at(-1)}`) : '';
|
||||||
console.log('content verification passed');
|
|
||||||
for (const token of [
|
// Rendered prose catches a deleted paragraph that string-token checks miss.
|
||||||
'data-phase="plan"',
|
if (rendered(html.landing) !== snapshot('index.txt'))
|
||||||
'data-phase="build"',
|
throw new Error('landing rendered-text snapshot changed');
|
||||||
'data-phase="review"',
|
if (rendered(html.guide) !== snapshot('full-guide.txt'))
|
||||||
'data-tree="main"',
|
throw new Error('full-guide rendered-text snapshot changed');
|
||||||
'data-tree="ui"',
|
if (rendered(html.summary) !== snapshot('summary.txt'))
|
||||||
'data-worker="ui"',
|
throw new Error('summary rendered-text snapshot changed');
|
||||||
|
if (rendered(html.models) !== snapshot('models.txt'))
|
||||||
|
throw new Error('models rendered-text snapshot changed');
|
||||||
|
if (rendered(html.agents) !== snapshot('agents.txt'))
|
||||||
|
throw new Error('agents rendered-text snapshot changed');
|
||||||
|
if (rendered(html.skills) !== snapshot('skills.txt'))
|
||||||
|
throw new Error('skills rendered-text snapshot changed');
|
||||||
|
if (rendered(html.rules) !== snapshot('rules.txt'))
|
||||||
|
throw new Error('rules rendered-text snapshot changed');
|
||||||
|
if (rendered(html.review) !== snapshot('skills-review.txt'))
|
||||||
|
throw new Error('skills-review rendered-text snapshot changed');
|
||||||
|
if (rendered(html.starter) !== snapshot('hands-on/starter.txt'))
|
||||||
|
throw new Error('starter rendered-text snapshot changed');
|
||||||
|
if (rendered(html.labRules) !== snapshot('hands-on/rules.txt'))
|
||||||
|
throw new Error('rules lab rendered-text snapshot changed');
|
||||||
|
|
||||||
|
const braceMatch = (source, open) => {
|
||||||
|
let depth = 0;
|
||||||
|
let quote = '';
|
||||||
|
let escaped = false;
|
||||||
|
for (let index = open; index < source.length; index += 1) {
|
||||||
|
const character = source[index];
|
||||||
|
if (quote) {
|
||||||
|
if (escaped) escaped = false;
|
||||||
|
else if (character === '\\') escaped = true;
|
||||||
|
else if (character === quote) quote = '';
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if (character === "'" || character === '"' || character === '`') quote = character;
|
||||||
|
else if (character === '{') depth += 1;
|
||||||
|
else if (character === '}' && --depth === 0) return index;
|
||||||
|
}
|
||||||
|
throw new Error('could not brace-match legacy Portuguese translations');
|
||||||
|
};
|
||||||
|
const legacyGuide = read('app.js');
|
||||||
|
const translationsStart = legacyGuide.indexOf('const translations =');
|
||||||
|
const objectStart = legacyGuide.indexOf('{', translationsStart);
|
||||||
|
const objectEnd = braceMatch(legacyGuide, objectStart);
|
||||||
|
const translations = Function(`return (${legacyGuide.slice(objectStart, objectEnd + 1)})`)();
|
||||||
|
const portuguese = Object.values(translations.pt).map(rendered);
|
||||||
|
if (portuguese.length !== 102)
|
||||||
|
throw new Error('full-guide Portuguese source no longer has 102 translated strings');
|
||||||
|
if (!portuguese.every((value) => rendered(html.guide).includes(value)))
|
||||||
|
throw new Error('built full-guide lost a Portuguese translation');
|
||||||
|
|
||||||
|
const has = (page, tokens) => tokens.every((token) => page.includes(token));
|
||||||
|
if (!has(html.guide, ['data-phase="plan"', 'data-phase="build"', 'data-phase="review"']))
|
||||||
|
throw new Error('built full-guide lost its phase selector');
|
||||||
|
if (!has(html.guide, ['data-tree="main"', 'data-tree="ui"', 'data-worker="ui"']))
|
||||||
|
throw new Error('built full-guide lost its worker or worktree selector');
|
||||||
|
if (
|
||||||
|
!has(html.guide, [
|
||||||
'data-route="plan"',
|
'data-route="plan"',
|
||||||
'data-model-provider="openai"',
|
'data-model-provider="openai"',
|
||||||
'data-model-provider="claude"',
|
'data-model-provider="claude"',
|
||||||
'data-model-provider="gemini"',
|
'data-model-provider="gemini"',
|
||||||
'data-effort="low"',
|
])
|
||||||
'data-effort="medium"',
|
)
|
||||||
'data-effort="high"',
|
throw new Error('built full-guide lost its model-routing controls');
|
||||||
|
if (!has(html.guide, ['data-effort="low"', 'data-effort="medium"', 'data-effort="high"']))
|
||||||
|
throw new Error('built full-guide lost its reasoning-effort controls');
|
||||||
|
if (
|
||||||
|
!has(html.guide, [
|
||||||
'data-skill-file="skill"',
|
'data-skill-file="skill"',
|
||||||
'data-skill-step="observe"',
|
'data-skill-step="observe"',
|
||||||
'data-skill-step="validate"',
|
'data-skill-step="validate"',
|
||||||
|
])
|
||||||
|
)
|
||||||
|
throw new Error('built full-guide lost its skill anatomy controls');
|
||||||
|
if (
|
||||||
|
!has(html.guide, [
|
||||||
'data-common-skill="ponytail"',
|
'data-common-skill="ponytail"',
|
||||||
'data-common-skill="caveman"',
|
'data-common-skill="caveman"',
|
||||||
'data-common-skill="unlazy"',
|
'data-common-skill="unlazy"',
|
||||||
|
])
|
||||||
|
)
|
||||||
|
throw new Error('built full-guide lost its common-skill controls');
|
||||||
|
if (
|
||||||
|
!has(html.guide, [
|
||||||
'id="hands-on"',
|
'id="hands-on"',
|
||||||
'data-copy-target="prompt-install-skills"',
|
'data-copy-target="prompt-install-skills"',
|
||||||
'data-copy-target="prompt-basic"',
|
'data-copy-target="prompt-basic"',
|
||||||
'data-copy-target="prompt-skills"',
|
'data-copy-target="prompt-skills"',
|
||||||
'hands-on/starter/',
|
|
||||||
'additional-reading.md',
|
|
||||||
'role="tablist"',
|
|
||||||
'<table',
|
|
||||||
])
|
])
|
||||||
if (!html.includes(token)) throw new Error(`missing content ${token}`);
|
)
|
||||||
for (const token of [
|
throw new Error('built full-guide lost its hands-on prompts');
|
||||||
'const phases',
|
if (!has(html.guide, ['hands-on/starter/', 'additional-reading.md', 'role="tablist"', '<table']))
|
||||||
'const handsOnPrompts',
|
throw new Error('built full-guide lost its guide navigation or semantics');
|
||||||
'const modelGuide',
|
if (!html.guide.includes('<script type="module">'))
|
||||||
'const skillSources',
|
throw new Error('built full-guide lost its interaction module');
|
||||||
'const skillInstallPrompts',
|
|
||||||
'addEventListener',
|
if (
|
||||||
"render('plan')",
|
!has(html.rules, [
|
||||||
'renderTree',
|
|
||||||
'renderWorker',
|
|
||||||
'renderRoute',
|
|
||||||
'renderModelProvider',
|
|
||||||
'renderEffort',
|
|
||||||
'renderSkillFile',
|
|
||||||
'renderSkillWorkflow',
|
|
||||||
'renderCommonSkill',
|
|
||||||
'renderHandsOn',
|
|
||||||
'copyPrompt',
|
|
||||||
])
|
|
||||||
if (!js.includes(token)) throw new Error(`missing interaction ${token}`);
|
|
||||||
for (const token of ['id="task-list"', 'id="task-count"'])
|
|
||||||
if (!starterHtml.includes(token)) throw new Error(`missing starter content ${token}`);
|
|
||||||
for (const token of ['const tasks', 'renderTasks()'])
|
|
||||||
if (!starterJs.includes(token)) throw new Error(`missing starter behavior ${token}`);
|
|
||||||
for (const token of [
|
|
||||||
'medium.com',
|
|
||||||
'anthropic.com/engineering',
|
|
||||||
'openai.com/business',
|
|
||||||
'git-scm.com/docs/git-worktree',
|
|
||||||
])
|
|
||||||
if (!additional.includes(token)) throw new Error(`missing additional source ${token}`);
|
|
||||||
if ((additional.match(/^### \d+\./gm) || []).length < 5)
|
|
||||||
throw new Error('fewer than five additional readings');
|
|
||||||
for (const token of [
|
|
||||||
'e7b42dc2d384a702240dea4d52a7bf5530b821b6',
|
|
||||||
'6654f6b60cd9d5be8b54c6fafe44346dabeb3b76',
|
|
||||||
'53048666b05b4799081517d00e09e0a2dd688678',
|
|
||||||
])
|
|
||||||
if (!skillSources.includes(token) || !js.includes(token))
|
|
||||||
throw new Error(`missing pinned skill source ${token}`);
|
|
||||||
for (const token of [
|
|
||||||
'developers.openai.com/api/docs/guides/latest-model',
|
|
||||||
'docs.anthropic.com/en/docs/claude-code/model-config',
|
|
||||||
'ai.google.dev/gemini-api/docs/thinking',
|
|
||||||
])
|
|
||||||
if (!modelRouting.includes(token) || !js.includes(token))
|
|
||||||
throw new Error(`missing model source ${token}`);
|
|
||||||
console.log('interaction verification passed');
|
|
||||||
if (html.match(/<(script|link)[^>]+(src|href)="https?:[^"]+"/i))
|
|
||||||
throw new Error('external runtime dependency found');
|
|
||||||
console.log('standalone verification passed');
|
|
||||||
for (const token of [
|
|
||||||
'id="pipeline"',
|
'id="pipeline"',
|
||||||
'id="skills"',
|
'id="skills"',
|
||||||
'id="examples"',
|
'id="examples"',
|
||||||
@@ -122,6 +140,11 @@ for (const token of [
|
|||||||
'data-stage="cli"',
|
'data-stage="cli"',
|
||||||
'data-stage="commit"',
|
'data-stage="commit"',
|
||||||
'data-stage="review"',
|
'data-stage="review"',
|
||||||
|
])
|
||||||
|
)
|
||||||
|
throw new Error('built rules page lost its enforcement pipeline');
|
||||||
|
if (
|
||||||
|
!has(html.rules, [
|
||||||
'gate-discipline',
|
'gate-discipline',
|
||||||
'parallel-agents',
|
'parallel-agents',
|
||||||
'repo-db',
|
'repo-db',
|
||||||
@@ -133,96 +156,35 @@ for (const token of [
|
|||||||
'.agents/skills',
|
'.agents/skills',
|
||||||
'netcracker/interview',
|
'netcracker/interview',
|
||||||
])
|
])
|
||||||
if (!rulesHtml.includes(token)) throw new Error(`missing rules content ${token}`);
|
)
|
||||||
console.log('rules content verification passed');
|
throw new Error('built rules page lost its case-study content');
|
||||||
for (const token of [
|
if (
|
||||||
'const languageCopy',
|
!has(html.rules, [
|
||||||
'const stages',
|
|
||||||
'const skills',
|
|
||||||
'const prompts',
|
|
||||||
'renderStage',
|
|
||||||
'renderSkill',
|
|
||||||
'renderLanguage',
|
|
||||||
'copyPrompt',
|
|
||||||
'addEventListener',
|
|
||||||
])
|
|
||||||
if (!rulesJs.includes(token)) throw new Error(`missing rules interaction ${token}`);
|
|
||||||
for (const token of [
|
|
||||||
'data-lang="en"',
|
'data-lang="en"',
|
||||||
'data-lang="pt"',
|
'data-lang="pt"',
|
||||||
'data-copy-prompt',
|
'data-copy-prompt',
|
||||||
'aria-live="polite"',
|
'aria-live="polite"',
|
||||||
'role="tablist"',
|
'role="tablist"',
|
||||||
])
|
])
|
||||||
if (!rulesHtml.includes(token)) throw new Error(`missing rules control ${token}`);
|
)
|
||||||
console.log('rules interaction verification passed');
|
throw new Error('built rules page lost its accessible controls');
|
||||||
if (!html.includes('href="../rules/"'))
|
if (!html.rules.includes('data-rules-copy') || !html.rules.includes('"pt"'))
|
||||||
throw new Error('main presentation does not link to rules page');
|
throw new Error('built rules page lost its Portuguese interaction data');
|
||||||
if (!html.includes('href="../skills-review/"'))
|
|
||||||
throw new Error('main presentation does not link to skills review page');
|
if (
|
||||||
for (const token of ['../summary/', '../models/', '../agents/', '../skills/', 'chapter-route'])
|
!has(html.review, [
|
||||||
if (!html.includes(token)) throw new Error(`main presentation missing chapter route ${token}`);
|
|
||||||
if (rulesHtml.includes('script src="http') || rulesHtml.includes('rel="stylesheet" href="http'))
|
|
||||||
throw new Error('rules page has an external runtime dependency');
|
|
||||||
for (const token of [
|
|
||||||
'@media(min-width:2200px)',
|
|
||||||
'@media(max-width:900px)',
|
|
||||||
'@media(max-width:600px)',
|
|
||||||
'prefers-reduced-motion',
|
|
||||||
])
|
|
||||||
if (!rulesCss.includes(token)) throw new Error(`missing rules responsive contract ${token}`);
|
|
||||||
console.log('rules standalone verification passed');
|
|
||||||
for (const token of [
|
|
||||||
'id="catalog"',
|
'id="catalog"',
|
||||||
'id="skill-filter"',
|
'id="skill-filter"',
|
||||||
'id="skill-list"',
|
'id="skill-list"',
|
||||||
'id="detail"',
|
'id="detail"',
|
||||||
'Preview Markdown',
|
'Preview Markdown',
|
||||||
'styles.css?v=20260904-vote-widget',
|
|
||||||
'change-lens.css?v=20260904-vote-widget',
|
|
||||||
'app.js?v=20260904-vote-widget',
|
|
||||||
'?author=Name&skill=skill-id&view=improved',
|
'?author=Name&skill=skill-id&view=improved',
|
||||||
'SKILLS_REVIEW_VOTE_API',
|
'SKILLS_REVIEW_VOTE_API',
|
||||||
])
|
])
|
||||||
if (!reviewHtml.includes(token)) throw new Error(`missing review page content ${token}`);
|
)
|
||||||
for (const token of [
|
throw new Error('built review desk lost its catalog or deep-link contract');
|
||||||
"from './catalog.js'",
|
if (
|
||||||
"from './files.js'",
|
!has(html.review, [
|
||||||
'function renderList',
|
|
||||||
'function renderDetail',
|
|
||||||
'selectSkill',
|
|
||||||
'packageSummary',
|
|
||||||
'markdownHeadings',
|
|
||||||
'markdownToc',
|
|
||||||
"document.addEventListener('keydown'",
|
|
||||||
'loadSelectedFile',
|
|
||||||
'schedulePackageSearch',
|
|
||||||
'fetchSource',
|
|
||||||
'packageSearchText',
|
|
||||||
'diffMarkup',
|
|
||||||
'diffRows',
|
|
||||||
'data-diff',
|
|
||||||
"searchParams.set('compare'",
|
|
||||||
'markdownMarkup',
|
|
||||||
'data-render',
|
|
||||||
'preview-markdown',
|
|
||||||
'Preview Markdown',
|
|
||||||
'View source',
|
|
||||||
'FILE PREVIEW',
|
|
||||||
"searchParams.set('render'",
|
|
||||||
'AUTHOR ·',
|
|
||||||
'SKILL ·',
|
|
||||||
'function selectFromUrl',
|
|
||||||
'function syncUrl',
|
|
||||||
'URLSearchParams',
|
|
||||||
'navigator.clipboard',
|
|
||||||
'document.execCommand',
|
|
||||||
'download',
|
|
||||||
'data-file',
|
|
||||||
"searchParams.set('file'",
|
|
||||||
])
|
|
||||||
if (!reviewJs.includes(token)) throw new Error(`missing review interaction ${token}`);
|
|
||||||
for (const token of [
|
|
||||||
'ndo-repro',
|
'ndo-repro',
|
||||||
'gfiber-logging',
|
'gfiber-logging',
|
||||||
'confluence-page',
|
'confluence-page',
|
||||||
@@ -232,33 +194,22 @@ for (const token of [
|
|||||||
'spanish-naturalizer',
|
'spanish-naturalizer',
|
||||||
'draft-mr',
|
'draft-mr',
|
||||||
'semantic-diff-review',
|
'semantic-diff-review',
|
||||||
'reference.md',
|
|
||||||
'files =',
|
|
||||||
])
|
])
|
||||||
if (!`${reviewFiles}\n${read('skills-review/submitted-files.js')}`.includes(token))
|
|
||||||
throw new Error(`missing review file manifest ${token}`);
|
|
||||||
if (
|
|
||||||
(reviewCatalog.match(/id:'/g) || []).length +
|
|
||||||
(read('skills-review/submitted-catalog.js').match(/id:'/g) || []).length !==
|
|
||||||
24
|
|
||||||
)
|
)
|
||||||
throw new Error('review catalog does not cover all submissions');
|
throw new Error('built review desk lost submitted-skill coverage');
|
||||||
if (
|
if (
|
||||||
!reviewCatalog.includes('hardcoded password') ||
|
!html.review.includes('Anonymous%20Operational%20Submission') ||
|
||||||
!reviewCatalog.includes('safety-redacted') ||
|
!has(reviewAsset, ['[REDACTED]', '[REDACTED LOCAL USER]', '[REDACTED USER]'])
|
||||||
!reviewJs.includes('[REDACTED]') ||
|
|
||||||
!reviewJs.includes('[REDACTED LOCAL USER]') ||
|
|
||||||
!reviewJs.includes('[REDACTED USER]')
|
|
||||||
)
|
)
|
||||||
throw new Error('review catalog does not record secret safety handling');
|
throw new Error('built review desk lost operational-submission privacy redactions');
|
||||||
console.log('skills review verification passed');
|
if (!reviewAssetSrc) throw new Error('built review desk does not load its hashed island asset');
|
||||||
for (const page of [summaryHtml, modelsHtml, agentsHtml, skillsHtml])
|
|
||||||
if (!page.includes('../chapters.css') || !page.includes('ROUTE MAP'))
|
if (
|
||||||
throw new Error('chapter page missing shared navigation');
|
![html.summary, html.models, html.agents, html.skills].every((page) => page.includes('ROUTE MAP'))
|
||||||
for (const token of ['--ink', '@media(max-width:800px)', '@media(max-width:520px)'])
|
)
|
||||||
if (!chaptersCss.includes(token)) throw new Error(`missing chapter responsive contract ${token}`);
|
throw new Error('built chapter pages lost shared navigation');
|
||||||
console.log('chapter route verification passed');
|
if (
|
||||||
for (const token of [
|
!has(html.landing, [
|
||||||
'The short route',
|
'The short route',
|
||||||
'full-guide/',
|
'full-guide/',
|
||||||
'models/',
|
'models/',
|
||||||
@@ -268,130 +219,45 @@ for (const token of [
|
|||||||
'hands-on/starter/',
|
'hands-on/starter/',
|
||||||
'skills-review/',
|
'skills-review/',
|
||||||
])
|
])
|
||||||
if (!landingHtml.includes(token)) throw new Error(`landing page missing ${token}`);
|
)
|
||||||
if (landingHtml.includes('app.js'))
|
throw new Error('built landing page lost a route-map destination');
|
||||||
throw new Error('landing page should remain a fast, static route map');
|
if (/<script\b/i.test(html.landing))
|
||||||
console.log('landing route verification passed');
|
throw new Error('built landing page is no longer a static route map');
|
||||||
for (const token of [
|
if (
|
||||||
'data-package-file="skill"',
|
!has(html.skills, [
|
||||||
'data-package-file="references"',
|
'data-skill-file="skill"',
|
||||||
'data-package-file="scripts"',
|
'data-skill-file="references"',
|
||||||
'data-package-file="assets"',
|
'data-skill-file="scripts"',
|
||||||
|
'data-skill-file="assets"',
|
||||||
'id="package-preview"',
|
'id="package-preview"',
|
||||||
'script src="app.js"',
|
|
||||||
])
|
])
|
||||||
if (!skillsHtml.includes(token)) throw new Error(`skills anatomy missing ${token}`);
|
|
||||||
const skillsApp = read('skills/app.js');
|
|
||||||
const skillsCss = read('skills/styles.css');
|
|
||||||
for (const token of [
|
|
||||||
'const packageFiles',
|
|
||||||
'function renderPackage',
|
|
||||||
'addEventListener',
|
|
||||||
"renderPackage('skill')",
|
|
||||||
])
|
|
||||||
if (!skillsApp.includes(token)) throw new Error(`skills anatomy interaction missing ${token}`);
|
|
||||||
for (const token of [
|
|
||||||
'grid-template-columns:minmax(190px',
|
|
||||||
'overflow-wrap:anywhere',
|
|
||||||
'@media(max-width:800px)',
|
|
||||||
'prefers-reduced-motion',
|
|
||||||
])
|
|
||||||
if (!skillsCss.includes(token))
|
|
||||||
throw new Error(`skills anatomy responsive contract missing ${token}`);
|
|
||||||
console.log('skills anatomy verification passed');
|
|
||||||
console.log('presentation verification passed');
|
|
||||||
const legacyName = String.fromCharCode(80, 101, 100, 114, 111, 32, 65, 114, 97, 110, 104, 97);
|
|
||||||
const legacyHandle = legacyName.toLowerCase().replace(' ', '.');
|
|
||||||
for (const path of [
|
|
||||||
'submitted-skills/Anonymous Operational Submission/skills/ndo-repro/SKILL.md',
|
|
||||||
'submitted-skills/Anonymous Operational Submission/skills/ndo-repro/envs.tsv',
|
|
||||||
'submitted-skills/Anonymous Operational Submission/skills/ndo-repro/lib/env.sh',
|
|
||||||
'submitted-skills/Anonymous Operational Submission/skills/ndo-repro/ndo-api.sh',
|
|
||||||
'submitted-skills/Anonymous Operational Submission/skills/ndo-repro/ndo-ship.sh',
|
|
||||||
'submitted-skills/Anonymous Operational Submission/skills/ndo-repro/reference/bom-Dockerfile_local.example',
|
|
||||||
'submitted-skills/Anonymous Operational Submission/skills/ndo-repro/reference/dockerfile-local.md',
|
|
||||||
'skill-reviews/improved/ndo-repro/SKILL.md',
|
|
||||||
]) {
|
|
||||||
const source = read(path);
|
|
||||||
if (
|
|
||||||
new RegExp(
|
|
||||||
`${legacyName}|${legacyHandle}|https?:\\/\\/|git\\.netcracker\\.com|artifactorycn|managed\\.netcracker\\.cloud`,
|
|
||||||
'i',
|
|
||||||
).test(source)
|
|
||||||
)
|
)
|
||||||
throw new Error(`operational submission privacy leak in ${path}`);
|
throw new Error('built skills page lost its package explorer');
|
||||||
}
|
if (!has(html.starter, ['id="task-list"', 'id="task-count"']))
|
||||||
for (const source of [reviewCatalog, reviewFiles, reviewJs])
|
throw new Error('starter lab lost its task-list contract');
|
||||||
if (source.includes(legacyName) || source.includes(legacyName.replace(' ', '%20')))
|
|
||||||
throw new Error('operational submission identity remains in review desk source');
|
const allPages = Object.entries(html);
|
||||||
|
if (!allPages.every(([, page]) => page.includes('name="viewport"')))
|
||||||
|
throw new Error('a built route lacks a viewport declaration');
|
||||||
|
if (allPages.some(([, page]) => /<(script|link)[^>]+(src|href)="https?:[^\"]+"/i.test(page)))
|
||||||
|
throw new Error('a built route has an external runtime dependency');
|
||||||
if (
|
if (
|
||||||
!reviewFiles.includes('Anonymous%20Operational%20Submission') ||
|
!read('package.json').includes(
|
||||||
!reviewJs.includes("entry.id === 'ndo-repro'")
|
'"verify": "node scripts/verify.mjs && node scripts/audit-ui.mjs && node .agents/scripts/check-tokens.mjs"',
|
||||||
)
|
)
|
||||||
throw new Error('operational submission redaction contract missing');
|
)
|
||||||
console.log('review privacy verification passed');
|
throw new Error('pnpm verify no longer runs audit-ui and check-tokens');
|
||||||
for (const token of [
|
if (!read('.agents/scripts/gate.sh').includes('pnpm run verify'))
|
||||||
'currentContent',
|
throw new Error('the gate no longer runs the output contract');
|
||||||
'unchangedDraft',
|
if (!read('docs/references/README.md').includes('https://developers.openai.com/codex/skills'))
|
||||||
'state.preview = button.dataset.preview',
|
throw new Error('primary reference list lost Codex skills');
|
||||||
'state.file = available.find',
|
if ((read('docs/references/additional-reading.md').match(/^### \d+\./gm) || []).length < 5)
|
||||||
'loadSelectedFile',
|
throw new Error('additional reading list has fewer than five entries');
|
||||||
])
|
|
||||||
if (!reviewJs.includes(token)) throw new Error(`review file-mode contract missing ${token}`);
|
|
||||||
if (reviewJs.includes("state.preview = 'original'; syncUrl(); renderDetail(); loadSelectedFile();"))
|
|
||||||
throw new Error('file selection still resets improved mode');
|
|
||||||
console.log('review file-mode verification passed');
|
|
||||||
for (const token of [
|
|
||||||
'const changeRows',
|
|
||||||
'function lensMarkup',
|
|
||||||
'data-lens',
|
|
||||||
'CHANGE LENS',
|
|
||||||
'What changed — and why.',
|
|
||||||
])
|
|
||||||
if (!reviewJs.includes(token)) throw new Error(`review change-lens contract missing ${token}`);
|
|
||||||
for (const token of [
|
|
||||||
'.change-lens',
|
|
||||||
'.change-rows',
|
|
||||||
'.skill-diff',
|
|
||||||
'.diff-lines',
|
|
||||||
'@media(max-width:620px)',
|
|
||||||
'prefers-reduced-motion',
|
|
||||||
])
|
|
||||||
if (!reviewLensCss.includes(token)) throw new Error(`review change-lens CSS missing ${token}`);
|
|
||||||
console.log('review change-lens verification passed');
|
|
||||||
for (const token of [
|
|
||||||
'.markdown-preview',
|
|
||||||
'max-height:540px',
|
|
||||||
'.markdown-table-wrap',
|
|
||||||
'.markdown-frontmatter',
|
|
||||||
'.markdown-toc',
|
|
||||||
'.preview-title',
|
|
||||||
'.preview-markdown',
|
|
||||||
'grid-template-columns:minmax(0,1fr)',
|
|
||||||
'height:120px',
|
|
||||||
'-webkit-line-clamp:2',
|
|
||||||
])
|
|
||||||
if (!read('skills-review/styles.css').includes(token))
|
|
||||||
throw new Error(`review markdown preview contract missing ${token}`);
|
|
||||||
console.log('review markdown preview verification passed');
|
|
||||||
for (const token of ["from './vote.js'", "renderVoteWidget($('#vote-widget'"])
|
|
||||||
if (!reviewJs.includes(token)) throw new Error(`review vote widget wiring missing ${token}`);
|
|
||||||
for (const token of [
|
|
||||||
'id="vote-widget"',
|
|
||||||
'function renderVoteWidget',
|
|
||||||
'X-Voter-Id',
|
|
||||||
'/api/votes',
|
|
||||||
'Voting is offline',
|
|
||||||
])
|
|
||||||
if (!reviewVoteJs.includes(token) && !reviewJs.includes(token))
|
|
||||||
throw new Error(`review vote widget contract missing ${token}`);
|
|
||||||
for (const token of ['.vote-widget', '.vote-buttons', '[aria-pressed="true"]'])
|
|
||||||
if (!read('skills-review/styles.css').includes(token))
|
|
||||||
throw new Error(`review vote widget CSS missing ${token}`);
|
|
||||||
if (
|
if (
|
||||||
!voteService.includes('X-Forwarded-For') ||
|
/Pedro\s+Aranha|pedro\.aranha|git\.netcracker\.com|artifactorycn|managed\.netcracker\.cloud/i.test(
|
||||||
(!voteService.includes('one active vote per skill') &&
|
read('src/content/reviews/ndo-repro.md'),
|
||||||
!voteService.includes('at most one active vote'))
|
|
||||||
)
|
)
|
||||||
throw new Error('vote-service missing IP-based one-vote-per-source contract');
|
)
|
||||||
console.log('review vote widget verification passed');
|
throw new Error('operational review content has a privacy leak');
|
||||||
|
|
||||||
|
console.log('built output verification passed');
|
||||||
|
|||||||
Reference in New Issue
Block a user