From nobody Thu Apr 2 18:47:38 2026 Received: from BYAPR05CU005.outbound.protection.outlook.com (mail-westusazon11010055.outbound.protection.outlook.com [52.101.85.55]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id F37A02F39C7 for ; Thu, 26 Mar 2026 21:05:23 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=52.101.85.55 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774559125; cv=fail; b=HLaID02/1K7a9pQDkbGZbavSHObtRKgrM2iKrUxM6qNNRWSN828oIr6VixZHZdcPCqfnfFjr/+9Y4MveTbRn/vipleBzMoiwbqGVioqxTYoBaCntIuJruGDtvml3IAE42xppGWwXFBuIojoeBB4Ws/6yDDero2PdwB7yMuxzGO8= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774559125; c=relaxed/simple; bh=Sz0z4XUKe52tZ1LgJok6y9OtrGECLfH36YeeoRIlB2E=; h=From:To:CC:Subject:Date:Message-ID:MIME-Version:Content-Type; b=ckm8dSBrgs77liZ7LWmZSaz5RVON9c832XUTArXYci1ZdUl2PkLMkkwmZzAlmTI5DzsVSOaIVxGsqXn5y4kaSmedD16PG5V/Dez9kqUBfjQGUjz3W1tvNd8/D8vqnrFWsvmrN7xoe1Chh10J/F/To636nMhRJQo86guyfUV/ZY8= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=amd.com; spf=fail smtp.mailfrom=amd.com; dkim=pass (1024-bit key) header.d=amd.com header.i=@amd.com header.b=vaPg5KG0; arc=fail smtp.client-ip=52.101.85.55 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=amd.com Authentication-Results: smtp.subspace.kernel.org; spf=fail smtp.mailfrom=amd.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=amd.com header.i=@amd.com header.b="vaPg5KG0" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=PDgLHsixFX3mKeRYoo7s/aHq3/C9fwLAfjPcC5ISVYraI+JjHprL4PbTvYFh8tPcWNqqh+4NbyJbj0GHDVOA4Bae9HFNKB/EA24dyNQbpNBJnmE8rCKT/6jqiiYD0ppV0TszMnO10XRs9QXu9T4ABDFrWyweWo51SDcUSgGQcP+KxsUwPbC5IStcbBf4qvxgkjwUeCKSStd5L8pqtojWLslQk0NG1C0j61APVT2qd/FV4FIqnYg0lN/jpdRg3HBB5c3vbM4ca8xpQsJygnFT/VHl1ysGvxIJ5++pY55Rz874dIBQEgFtZVnwT+Cq5xXxo/HaJsNJ6bj1pZdUTFtBCQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector10001; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=TtqwHEh+Of2MPJK/AzgCsZWRPlipIgkVqteglNe0rJE=; b=QxmHsH3szM8duiJQtnHHtVrGlJlq9DfOppusj6IrC/ChZ3nj/mgG+OKICV8oJQT4oL0C2yFxDWOpcx86PlWI++uKpkrkPSTwrxgfeXv3ClwfTk9qzn80igb2XHy08uHCmR5OP4jyskTSqQbUNhNcZYigkR+oahP2ilHnYiqjU/3knjj47J0If2aaJgsyhrHvPTkaRrtMiXXcz8t2pVEFj86HPcT1/lBo8HLdpdyZ0o7KQ700qsnZcZ3QM+Up7vXzpDsO8cd03ChQs27IpQTtmGJUXG8ofcdUnkTOhg3/MB/xnzHL5oklF77nQlQzD0oOd82aEoipfbl43oDQUS/HVg== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass (sender ip is 165.204.84.17) smtp.rcpttodomain=canonical.com smtp.mailfrom=amd.com; dmarc=pass (p=quarantine sp=quarantine pct=100) action=none header.from=amd.com; dkim=none (message not signed); arc=none (0) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=amd.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=TtqwHEh+Of2MPJK/AzgCsZWRPlipIgkVqteglNe0rJE=; b=vaPg5KG0Eqt6pzUi7nry/RgytoFgLHn28TvjvCDj0/xVTcl9O5VQr3Q+6G82a6usFxS3OTCRyrI5zceSmEeyanQbAKf+px/WmuQMV19gZI7ErTFc50rRm8L62Pi2h3p8YnFtM6XphRGOtoJC3/q8bp5aJs2UeMBcuzhstj/+ntI= Received: from IA1P220CA0017.NAMP220.PROD.OUTLOOK.COM (2603:10b6:208:464::16) by IA0PR12MB8424.namprd12.prod.outlook.com (2603:10b6:208:40c::15) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9769.10; Thu, 26 Mar 2026 21:05:19 +0000 Received: from BN3PEPF0000B36E.namprd21.prod.outlook.com (2603:10b6:208:464:cafe::a3) by IA1P220CA0017.outlook.office365.com (2603:10b6:208:464::16) with Microsoft SMTP Server (version=TLS1_3, cipher=TLS_AES_256_GCM_SHA384) id 15.20.9745.22 via Frontend Transport; Thu, 26 Mar 2026 21:05:20 +0000 X-MS-Exchange-Authentication-Results: spf=pass (sender IP is 165.204.84.17) smtp.mailfrom=amd.com; dkim=none (message not signed) header.d=none;dmarc=pass action=none header.from=amd.com; Received-SPF: Pass (protection.outlook.com: domain of amd.com designates 165.204.84.17 as permitted sender) receiver=protection.outlook.com; client-ip=165.204.84.17; helo=satlexmb08.amd.com; pr=C Received: from satlexmb08.amd.com (165.204.84.17) by BN3PEPF0000B36E.mail.protection.outlook.com (10.167.243.165) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9769.0 via Frontend Transport; Thu, 26 Mar 2026 21:05:19 +0000 Received: from satlexmb07.amd.com (10.181.42.216) by satlexmb08.amd.com (10.181.42.217) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.2562.17; Thu, 26 Mar 2026 16:05:18 -0500 Received: from hwentlanryzen (10.180.168.240) by satlexmb07.amd.com (10.181.42.216) with Microsoft SMTP Server id 15.2.2562.17 via Frontend Transport; Thu, 26 Mar 2026 16:05:17 -0500 From: Harry Wentland To: , , CC: , , Harry Wentland , Jonathan Corbet , Jani Nikula Subject: [PATCH] scripts/checkpatch: add Assisted-by: tag validation Date: Thu, 26 Mar 2026 17:05:08 -0400 Message-ID: <20260326210508.996461-1-harry.wentland@amd.com> X-Mailer: git-send-email 2.53.0 Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-EOPAttributedMessage: 0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: BN3PEPF0000B36E:EE_|IA0PR12MB8424:EE_ X-MS-Office365-Filtering-Correlation-Id: 6075d842-72ca-44b9-8c7b-08de8b7b6311 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|376014|36860700016|82310400026|1800799024|56012099003|18002099003|20052099010; X-Microsoft-Antispam-Message-Info: 56H3MumDoLoPZZce+wAWzcakvPCNmBNpI4PdGjMhOCteMpG1IiYhWz+ipx2iBipAnYoboMbKYav98AVM/mnNvoaRADVLC2ShPZJqevp23/dpT0MBvvvc/tiet1B8plz0ALC8sCt2SumHyDHqGgTscPawjhN/y9qXhUp0F+3JCYp8epkp1vj4hJ+6MsDWcPmf5aiYhEO7llnBZkKn3ZkpkA7ltsjv5TbjvfNDcGx8nfT8ngq01liOe/qyVFSmc91UZW8CQXqDqgb28eujpRY1MT9bkhMGUN+jBD4o2MBXHyHkGp5Bh9SWjV2JbFdXr7d8APfMsuMW1tKSLyGncUba4Xk87FkAIde7G7+zHCHFBT8Xbziv0QCG5eeZAWwqHTNI0gC4MxhNeyvSLXE2AMRuTymgWSqIPls1kcWYsYXvihWGT3VkjzjIMUq15x9fvIoYdDudSsaxT3t4EmlVHIXLV1UdkD2bB5158vKLT+U//JYppw+Db8GXVwL4ZYXnIrOSpkPKVbu0OoodmStTK66dBLbMpNtCH1fbXD7A8MiUfBsLkzG+Au8BAjmWqUdJYy0YZKEmr7Uf/toYSvYd9G3gOtnZLS4BiC/I6Puj/frcRnP9MsWqht6Pxf8ElskwNlMLizZwDao9ArJ5gXLjXbxd/YNc97vnhD+7/XKTbyXD6SVe0QY4Ws+JIEai5SvTjEHga4R+r8sObRP+SyUcMQDBxCZ9tRH4Id5cSfWkxi470lgBO24PgwvdWMrZvYd4a1NtFrrXaxlcMKL0EIoBqrfi4Q== X-Forefront-Antispam-Report: CIP:165.204.84.17;CTRY:US;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:satlexmb08.amd.com;PTR:InfoDomainNonexistent;CAT:NONE;SFS:(13230040)(376014)(36860700016)(82310400026)(1800799024)(56012099003)(18002099003)(20052099010);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: hQ0bmYx+ngwMheUnvLpN7vVAO1VR2Rb+M/DnPuiepn/zIjO903Z7FDE7ICPahWQVqaSJOiYfArlBqZGrECMNzEPRnLojshQQRTrweHRHQ9+b0yNwV9PVwktaw6e+JbFbnoZmDRLLRy/ubw5NPbcUqpu7zmthBD2lrVRHDykUnU+epn9Jd9ucUYRfznWD3Wbo5eGAtEHGXOL6r86igVOyBF8tPVBRf23/F6dm5yXKweTF0CdwaX1LP9zZyfCncJli4FdrtRc5qe/LfapNPxLAnTrSY5k5sEF/FHn+gyXdrr0nWyHrecrK3wOsqvPawMqxgXGVJDzoJmRW/fGHyWHJZD16kM7ZPW02ZfuSDF3egzys+k7Gm8+ngvkoH55yEecC1aoCraV5YLbIEyaPI2rOX4kGcZRgNmCqc92cyGuN5D2vmhQHqCgeoDl1KhextTRh X-OriginatorOrg: amd.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 26 Mar 2026 21:05:19.2086 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 6075d842-72ca-44b9-8c7b-08de8b7b6311 X-MS-Exchange-CrossTenant-Id: 3dd8961f-e488-4e60-8e11-a82d994e183d X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=3dd8961f-e488-4e60-8e11-a82d994e183d;Ip=[165.204.84.17];Helo=[satlexmb08.amd.com] X-MS-Exchange-CrossTenant-AuthSource: BN3PEPF0000B36E.namprd21.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: IA0PR12MB8424 Content-Type: text/plain; charset="utf-8" The coding-assistants.rst documentation defines the Assisted-by: tag format for AI-assisted contributions as: Assisted-by: AGENT_NAME:MODEL_VERSION [TOOL1] [TOOL2] This format does not use an email address, so checkpatch currently reports a false positive about an invalid email when encountering this tag. Add Assisted-by: to the recognized signature tags and standard signature list. When an Assisted-by: tag is found, validate it instead of checking for an email address. The validation accepts AGENT_NAME with an optional :MODEL_VERSION, followed by optional tool names which may themselves carry a colon-separated version. MODEL_VERSION containing dots triggers a warning suggesting hyphens per convention. Cc: Jonathan Corbet Cc: Jani Nikula Assisted-by: Claude:claude-opus-4-6 Signed-off-by: Harry Wentland --- scripts/checkpatch.pl | 146 +++++++++++++++++++++++------------------- 1 file changed, 79 insertions(+), 67 deletions(-) diff --git a/scripts/checkpatch.pl b/scripts/checkpatch.pl index e56374662ff7..3d0688f50b7c 100755 --- a/scripts/checkpatch.pl +++ b/scripts/checkpatch.pl @@ -641,6 +641,7 @@ our $signature_tags =3D qr{(?xi: Reviewed-by:| Reported-by:| Suggested-by:| + Assisted-by:| To:| Cc: )}; @@ -737,7 +738,7 @@ sub find_standard_signature { my ($sign_off) =3D @_; my @standard_signature_tags =3D ( 'Signed-off-by:', 'Co-developed-by:', 'Acked-by:', 'Tested-by:', - 'Reviewed-by:', 'Reported-by:', 'Suggested-by:' + 'Reviewed-by:', 'Reported-by:', 'Suggested-by:', 'Assisted-by:' ); foreach my $signature (@standard_signature_tags) { return $signature if (get_edit_distance($sign_off, $signature) <=3D 2); @@ -3105,88 +3106,99 @@ sub process { } } =20 - my ($email_name, $name_comment, $email_address, $comment) =3D parse_ema= il($email); - my $suggested_email =3D format_email(($email_name, $name_comment, $emai= l_address, $comment)); - if ($suggested_email eq "") { - ERROR("BAD_SIGN_OFF", - "Unrecognized email address: '$email'\n" . $herecurr); +# Assisted-by: uses format AGENT_NAME[:MODEL_VERSION] [TOOL1[:VER]] [TOOL2= [:VER]] instead of email + if ($sign_off =3D~ /^assisted-by:$/i) { + if ($email !~ /^\S+(\s+\S+)*$/) { + WARN("BAD_ASSISTED_BY", + "Assisted-by: should use format: 'Assisted-by: AGENT_NAME[:MODEL= _VERSION] [TOOL1[:VER]] [TOOL2[:VER]]'\n" . $herecurr); + } elsif ($email =3D~ /^[^:\s]+:(\S+)/ && $1 =3D~ /\./) { + WARN("BAD_ASSISTED_BY", + "Assisted-by: MODEL_VERSION should use hyphens instead of dots: = '$email'\n" . $herecurr); + } } else { - my $dequoted =3D $suggested_email; - $dequoted =3D~ s/^"//; - $dequoted =3D~ s/" 1) { - WARN("BAD_SIGN_OFF", - "Use a single name comment in email: '$email'\n" . $herecurr); - } + # Only one name comment should be allowed + my $comment_count =3D () =3D $name_comment =3D~ /\([^\)]+\)/g; + if ($comment_count > 1) { + WARN("BAD_SIGN_OFF", + "Use a single name comment in email: '$email'\n" . $herecurr); + } =20 =20 - # stable@vger.kernel.org or stable@kernel.org shouldn't - # have an email name. In addition comments should strictly - # begin with a # - if ($email =3D~ /^.*stable\@(?:vger\.)?kernel\.org/i) { - if (($comment ne "" && $comment !~ /^#.+/) || - ($email_name ne "")) { - my $cur_name =3D $email_name; + # stable@vger.kernel.org or stable@kernel.org shouldn't + # have an email name. In addition comments should strictly + # begin with a # + if ($email =3D~ /^.*stable\@(?:vger\.)?kernel\.org/i) { + if (($comment ne "" && $comment !~ /^#.+/) || + ($email_name ne "")) { + my $cur_name =3D $email_name; + my $new_comment =3D $comment; + $cur_name =3D~ s/[a-zA-Z\s\-\"]+//g; + + # Remove brackets enclosing comment text + # and # from start of comments to get comment text + $new_comment =3D~ s/^\((.*)\)$/$1/; + $new_comment =3D~ s/^\[(.*)\]$/$1/; + $new_comment =3D~ s/^[\s\#]+|\s+$//g; + + $new_comment =3D trim("$new_comment $cur_name") if ($cur_name ne $n= ew_comment); + $new_comment =3D " # $new_comment" if ($new_comment ne ""); + my $new_email =3D "$email_address$new_comment"; + + if (WARN("BAD_STABLE_ADDRESS_STYLE", + "Invalid email format for stable: '$email', prefer '$new_email'\n= " . $herecurr) && + $fix) { + $fixed[$fixlinenr] =3D~ s/\Q$email\E/$new_email/; + } + } + } elsif ($comment ne "" && $comment !~ /^(?:#.+|\(.+\))$/) { my $new_comment =3D $comment; - $cur_name =3D~ s/[a-zA-Z\s\-\"]+//g; =20 - # Remove brackets enclosing comment text - # and # from start of comments to get comment text - $new_comment =3D~ s/^\((.*)\)$/$1/; + # Extract comment text from within brackets or + # c89 style /*...*/ comments $new_comment =3D~ s/^\[(.*)\]$/$1/; - $new_comment =3D~ s/^[\s\#]+|\s+$//g; + $new_comment =3D~ s/^\/\*(.*)\*\/$/$1/; =20 - $new_comment =3D trim("$new_comment $cur_name") if ($cur_name ne $ne= w_comment); - $new_comment =3D " # $new_comment" if ($new_comment ne ""); - my $new_email =3D "$email_address$new_comment"; + $new_comment =3D trim($new_comment); + $new_comment =3D~ s/^[^\w]$//; # Single lettered comment with non wo= rd character is usually a typo + $new_comment =3D "($new_comment)" if ($new_comment ne ""); + my $new_email =3D format_email($email_name, $name_comment, $email_ad= dress, $new_comment); =20 - if (WARN("BAD_STABLE_ADDRESS_STYLE", - "Invalid email format for stable: '$email', prefer '$new_email'\n"= . $herecurr) && + if (WARN("BAD_SIGN_OFF", + "Unexpected content after email: '$email', should be: '$new_email'= \n" . $herecurr) && $fix) { $fixed[$fixlinenr] =3D~ s/\Q$email\E/$new_email/; } } - } elsif ($comment ne "" && $comment !~ /^(?:#.+|\(.+\))$/) { - my $new_comment =3D $comment; - - # Extract comment text from within brackets or - # c89 style /*...*/ comments - $new_comment =3D~ s/^\[(.*)\]$/$1/; - $new_comment =3D~ s/^\/\*(.*)\*\/$/$1/; - - $new_comment =3D trim($new_comment); - $new_comment =3D~ s/^[^\w]$//; # Single lettered comment with non wor= d character is usually a typo - $new_comment =3D "($new_comment)" if ($new_comment ne ""); - my $new_email =3D format_email($email_name, $name_comment, $email_add= ress, $new_comment); - - if (WARN("BAD_SIGN_OFF", - "Unexpected content after email: '$email', should be: '$new_email'\= n" . $herecurr) && - $fix) { - $fixed[$fixlinenr] =3D~ s/\Q$email\E/$new_email/; - } } } =20 --=20 2.53.0