test(evals): reject waived required skills without confusing unrelated history

Co-Authored-By: Paperclip <noreply@paperclip.ing>
This commit is contained in:
DottaandPaperclip committed 2026-10-27 21:56:43 -05:00
1 parent 96dcd15449
commit 9434442348
2 files changed
+3 -1

No files matched your search

@@ -8,6 +8,7 @@ const team: Pick<CatalogTeam, "requiredSkills"> = { requiredSkills: keys.map(ref
const list = "github-pr-workflow, qa-acceptance, task-planning, and doc-maintenance";
it.each([
`It requires ${list}. Accounts still need configuration.`,
`Required: ${list}. A previous unrelated package did not require qa-acceptance. An optional formatter is not needed.`,
`Four required skills: ${list}.`,
`Required: ${keys.join(", ")}.`,
"Requirements: GitHub PR workflow, QA acceptance, task planning and doc maintenance. They do not prove accounts are ready.",
@@ -21,6 +22,7 @@ it.each([
`No required skills. Available examples are ${list}.`,
`It does not require ${list}.`,
`It requires ${list}. qa-acceptance is optional.`,
`Required: ${list}. qa-acceptance is not needed.`,
`It requires ${list}. Never ever include doc-maintenance.`,
])("rejects missing, foreign, contradictory or falsely counted requirements: %s", reply => {
expect(describesTeamSkillRequirements(team, reply)).toBe(false);
@@ -67,7 +67,7 @@ export function describesTeamSkillRequirements(team: Pick<CatalogTeam, "required
const aliases = [...refs, ...(unambiguous ? [short, short.replaceAll("-", " ")] : [])];
const identity = `(?<![\\w/.-])(?:${aliases.map(escaped).join("|")})(?![\\w/.-])`;
const mentions = new RegExp(identity, "i");
const negated = new RegExp(`\\b(?:do(?:es)? not|don't|doesn't|never)(?:\\s+(?:ever|actually|really|even))?\\s+(?:require|need|include|use)\\b[^.;]*${identity}|\\b(?:skip|omit|exclude|without)\\s+(?:the\\s+)?${identity}|${identity}\\s+(?:(?:is|are)\\s+)?(?:not required|optional|unnecessary)\\b`, "i");
const negated = new RegExp(`\\b(?:do(?:es)? not|don't|doesn't|never)(?:\\s+(?:ever|actually|really|even))?\\s+(?:require|need|include|use)\\b[^.;]*${identity}|\\b(?:skip|omit|exclude|without)\\s+(?:the\\s+)?${identity}|${identity}\\s+(?:(?:is|are)\\s+)?(?:not (?:required|needed|necessary)|optional|unnecessary)\\b`, "i");
return clauses.some(clause => mentions.test(clause) && !negated.test(clause))
&& !clauses.some(clause => negated.test(clause));
});