From 2a19b5f57f8dcd2abe661d2cf2c61006fd5ac5e0 Mon Sep 17 00:00:00 2001 From: 4gray Date: Mon, 21 Sep 2026 05:58:01 +0200 Subject: [PATCH] fix(agents): normalize possessive federated handles --- docs/development/agent-workflow.md | 2 +- tools/skills/validate-agent-guidance.mjs | 2 +- tools/skills/validate-agent-guidance.test.mjs | 12 ++++++++++++ 3 files changed, 14 insertions(+), 2 deletions(-) diff --git a/docs/development/agent-workflow.md b/docs/development/agent-workflow.md index 5cea4d20e..2e0add38e 100644 --- a/docs/development/agent-workflow.md +++ b/docs/development/agent-workflow.md @@ -92,7 +92,7 @@ CLAUDE, INSTRUCTIONS, README, CONTRIBUTING and SECURITY, case-insensitively) are paths do not receive package exemptions. TypeScript configuration is parsed as JSONC. Declared packages also permit safe subpaths; exact aliases stay exact. Federated handles in the @user@host form are prose, not imports; trailing closing -ASCII/Unicode punctuation is ignored, but extra at-signs do not qualify for that exemption. +ASCII/Unicode punctuation and possessive apostrophe-s suffixes are ignored, but extra at-signs do not qualify for that exemption. Exact declared packages remain exempt after version normalization. Declared package mentions may include a version (including semver comparators and wildcard ranges) or dist-tag qualifier. Qualifier handling includes unscoped names; terminal sentence punctuation is diff --git a/tools/skills/validate-agent-guidance.mjs b/tools/skills/validate-agent-guidance.mjs index 72b098ccf..f1f19cd6b 100644 --- a/tools/skills/validate-agent-guidance.mjs +++ b/tools/skills/validate-agent-guidance.mjs @@ -228,7 +228,7 @@ export async function validateAgentGuidance({ rootDir }) { if (isPackageMention(token)) continue; if ( /^[\w.-]+@(?:[a-z\d](?:[a-z\d-]*[a-z\d])?\.)+[a-z]{2,}$/iu.test( - token.replace(/\p{P}+$/gu, '') + token.replace(/\p{P}+$/gu, '').replace(/['’]s$/iu, '') ) ) continue; diff --git a/tools/skills/validate-agent-guidance.test.mjs b/tools/skills/validate-agent-guidance.test.mjs index 3a093a103..6371ae1e9 100644 --- a/tools/skills/validate-agent-guidance.test.mjs +++ b/tools/skills/validate-agent-guidance.test.mjs @@ -1778,3 +1778,15 @@ for (const suffix of ['…', '。', '!', '—']) { ); }); } + +for (const suffix of ["'s", '’s']) { + test(`federated handle may be possessive: ${suffix}`, async (t) => { + assert.deepEqual( + await diagnostics(t, { + 'AGENTS.md': + 'Contact @alice@example.social' + suffix + ' administrator', + }), + [] + ); + }); +}