Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
296 commits
Select commit Hold shift + click to select a range
5b599f5
fix(yubiotp): fix 3 bugs found during integration testing on alpha fi…
DennisDyallo Apr 2, 2026
9931a0a
fix(tests): add AllowUnknownSerials and pin YubiOTP tests to SmartCard
DennisDyallo Apr 2, 2026
364c8ae
docs: update final state — YubiOTP tests done, AllowUnknownSerials do…
DennisDyallo Apr 2, 2026
b80e09e
docs: add CLI shared infrastructure extraction plan (#12)
DennisDyallo Apr 2, 2026
32733e3
feat(cli): extract shared CLI infrastructure into Yubico.YubiKit.Cli.…
DennisDyallo Apr 2, 2026
e854036
docs: update plans and add handoff document
DennisDyallo Apr 2, 2026
c304038
merge: integrate yubikit-piv branch into yubikit-applets
DennisDyallo Apr 2, 2026
60d2111
fix(tests): auto-tag WithYubiKey tests and make build.cs unit-only by…
DennisDyallo Apr 2, 2026
24f1c4b
refactor(build): DRY helpers, fix GetArgument and FilterBullseyeArgs …
DennisDyallo Apr 2, 2026
904712b
refactor: restructure project folders under src/ with stripped prefixes
DennisDyallo Apr 2, 2026
eac64db
fix(tests): correct 8 pre-existing unit test failures across Core, Fi…
DennisDyallo Apr 2, 2026
bbcd2dd
feat(cli): extract InteractiveMenuBuilder and SessionHelper into Cli.…
DennisDyallo Apr 2, 2026
8801c83
fix(tests): use invalid key length in PinUvAuthProtocolV2 test
DennisDyallo Apr 2, 2026
ce945ad
docs: update handoff document for session end
DennisDyallo Apr 2, 2026
f648e03
fix(cli): use firmware-dependent touch timing in FidoTool reset
DennisDyallo Apr 2, 2026
b6f5ed0
chore(build): remove clean from restore dependency chain
DennisDyallo Apr 2, 2026
3106fff
fix(otp,oath): align flag values and defaults with ykman canonical
DennisDyallo Apr 2, 2026
bd97961
fix(build): use incremental builds and add xUnit v3 MTP filter transl…
DennisDyallo Apr 2, 2026
c303277
docs: update handoff document for session end
DennisDyallo Apr 2, 2026
358ed29
docs: update handoff document with ykman fixes and build.cs changes
DennisDyallo Apr 2, 2026
e022e78
style: codebase consistency pass — null checks, regions, timing fixes
DennisDyallo Apr 2, 2026
fbf335d
feat(build): add --smoke flag, DRY helpers, and integration test docs
DennisDyallo Apr 2, 2026
37c251e
style: modernize collection initialization to collection expressions
DennisDyallo Apr 2, 2026
2971a75
fix: remove dead CtapException stub from Core
DennisDyallo Apr 2, 2026
f47adbd
fix(openpgp): correct inverted P2 mapping in VerifyPinAsync
DennisDyallo Apr 2, 2026
99186fb
perf: remove unnecessary .ToArray() allocations on net10
DennisDyallo Apr 2, 2026
e817d3c
fix(openpgp): fix AttestKey response handling and certificate slot index
DennisDyallo Apr 2, 2026
f31cc7d
Merge branch 'style/codebase-consistency-pass' into yubikit-applets
DennisDyallo Apr 2, 2026
66b9a75
fix: use IsSupported() for firmware feature checks on alpha devices
DennisDyallo Apr 2, 2026
addf582
fix(otp): use HidOtp for HMAC-SHA1 challenge-response test
DennisDyallo Apr 2, 2026
23d610d
fix(piv): bypass .NET TripleDES weak key rejection for PIV management…
DennisDyallo Apr 2, 2026
82f8451
fix(core,openpgp,hsmauth): fix TLV parsing, algorithm info fallback, …
DennisDyallo Apr 2, 2026
1017309
ci: install pcscd and fix NuGet cache key for Linux CI
DennisDyallo Apr 2, 2026
738123a
ci,fix,chore: fix Linux CI pcscd setup, SDK graceful degradation, Nat…
DennisDyallo Apr 2, 2026
dd6ba87
docs: update handoff document for session end
DennisDyallo Apr 2, 2026
cab0c29
ci: tighten pcscd socket wait and use chmod 666 (Opus expert review)
DennisDyallo Apr 2, 2026
8dd1043
ci,fix: install libudev-dev and handle missing udev on Linux for HID …
DennisDyallo Apr 2, 2026
e58b611
security(core,fido2,piv): fix sensitive data handling across SCP, PIN…
DennisDyallo Apr 3, 2026
20d31cc
fix(fido2,openpgp,hsmauth,otp,core): fix SDK bugs discovered during i…
DennisDyallo Apr 8, 2026
f32ef63
test: add 30 integration tests covering 60 of 75 identified SDK gaps
DennisDyallo Apr 8, 2026
8bee286
fix(fido2/tests): replace reset hook with known-PIN normalization
DennisDyallo Apr 8, 2026
3c11350
fix(fido2/tests): align FidoTestData.Pin with KnownTestPinString
DennisDyallo Apr 8, 2026
966d701
fix(fido2/tests): mark ForceChangePin as RequiresUserPresence, clean …
DennisDyallo Apr 8, 2026
5511c10
docs: update handoff — FIDO2 fully verified, all 8 modules green
DennisDyallo Apr 8, 2026
c74570e
fix(cli): fix 4 bugs across PivTool, FidoTool, HsmAuthTool, Managemen…
DennisDyallo Apr 8, 2026
64b0311
feat(cli): add unified yk CLI with all 7 YubiKey applets
DennisDyallo Apr 8, 2026
47b0136
fix(cli): wire --force flag on management reset, stage all yk CLI files
DennisDyallo Apr 8, 2026
a9eaa04
docs: update progress file with E2E results and refresh handoff
DennisDyallo Apr 8, 2026
d175b78
fix(cli): map CTAP bio errors to structured exit codes
DennisDyallo Apr 8, 2026
6af5033
docs: update handoff and progress — CTAP exit codes resolved
DennisDyallo Apr 9, 2026
37e9568
Update src/Core/src/SmartCard/Scp/ScpState.cs
DennisDyallo Apr 9, 2026
f749f2a
Update src/Core/src/SmartCard/Scp/ScpState.Scp03.cs
DennisDyallo Apr 9, 2026
15396c8
security(core,fido2,piv): zero sensitive buffers and fix data leak pa…
DennisDyallo Apr 9, 2026
24a0470
security(core,oath,piv,fido2): fix buffer lifecycle and disposal patt…
DennisDyallo Apr 9, 2026
75353fd
security(fido2,openpgp,oath): replace string PIN/password APIs with R…
DennisDyallo Apr 9, 2026
3131dc7
security(cli): migrate CLI tools to ConsoleCredentialReader for PIN/p…
DennisDyallo Apr 9, 2026
b810749
refactor(credentials): move module-specific CredentialReaderOptions t…
DennisDyallo Apr 9, 2026
2d6f2b4
security: address Copilot review findings from PR #447
DennisDyallo Apr 9, 2026
efe0753
security(piv): remove .Memory.Span.ToArray() PIN/key copies in PivToo…
DennisDyallo Apr 9, 2026
b623178
security(openpgp): add IDisposable to Kdf to zero salt/hash material
DennisDyallo Apr 9, 2026
c244013
security: add grep-based security taxonomy audit script
DennisDyallo Apr 9, 2026
d04a49e
chore(skills): add workflow-security-audit skill
DennisDyallo Apr 9, 2026
41e013b
security: expand taxonomy to T12 with T10/T11/T12 from Copilot round-3
DennisDyallo Apr 9, 2026
8de98b4
security(scp): dispose ScpProcessor on auth failure, zero encrypted c…
DennisDyallo Apr 9, 2026
d121b71
security(fido2): fix T12 ownership violation in CredentialManagement.…
DennisDyallo Apr 9, 2026
e0b74f0
security: fix preparedData zeroing, add ownership docs, acknowledge b…
DennisDyallo Apr 9, 2026
e1316c7
chore: update handoff for session close — all security fixes complete
DennisDyallo Apr 9, 2026
c0429bb
security(core): convert ApduCommand from readonly record struct to se…
DennisDyallo Apr 9, 2026
51c7de8
security(core,piv): fix 7 issues from Copilot review round 3
DennisDyallo Apr 9, 2026
4f400f4
chore: update handoff — round 3 Copilot fixes complete, awaiting re-r…
DennisDyallo Apr 9, 2026
0b6938a
security(openpgp): fix Kdf buffer ownership — always clone on init
DennisDyallo Apr 10, 2026
248e7a5
tests: add cancellation token support
DennisDyallo Apr 10, 2026
331e048
misc: add ConfigureAwait(false) to async calls
DennisDyallo Apr 10, 2026
3a4f921
refactor(core): ApduCommand → readonly record struct with passthrough…
DennisDyallo Apr 10, 2026
d9901d5
docs: update CLAUDE.md for ApduCommand readonly record struct refactor
DennisDyallo Apr 10, 2026
59b629e
merge: integrate security remediation into yubikit-applets
DennisDyallo Apr 10, 2026
956bf19
docs: refresh handoff — post-merge state, security remediation complete
DennisDyallo Apr 10, 2026
7166b33
refactor(cli): migrate commands to Cli.Commands shared library
DennisDyallo Apr 10, 2026
4f73fc7
refactor(cli): remove migrated files from YkTool
DennisDyallo Apr 10, 2026
de8437d
fix(management-tests): restrict SCP and performance tests to SmartCar…
DennisDyallo Apr 10, 2026
244943d
fix(yubiopt): increase HID OTP timeout and fix test transport constra…
DennisDyallo Apr 10, 2026
b4e5f7c
fix(piv): TLV encoding bug, buffer zeroing, connection leak, dead code
DennisDyallo Apr 15, 2026
3c38d28
fix(fido2): SHA256 API, auth tag zeroing, DisposeAsync, dead code
DennisDyallo Apr 15, 2026
9ddb021
fix(oath): zero APDU secret buffer, GeneratedRegex, culture-safe parsing
DennisDyallo Apr 15, 2026
70bdf5b
fix(yubiotp): connection leak, NDEF truncation validation, cleanup
DennisDyallo Apr 15, 2026
39a04ec
fix(openpgp): DER P-521 encoding, key zeroing, pin truncation guard
DennisDyallo Apr 15, 2026
cc5303c
fix(secdomain): swapped checksum args, key zeroing, resource leaks, d…
DennisDyallo Apr 15, 2026
bca1819
fix(yubihsm): PublicKeyLength off-by-one, wrong error handler, mutabl…
DennisDyallo Apr 15, 2026
adae46d
refactor(piv): extract EnsureProtocol guard, merge crypto/parser methods
DennisDyallo Apr 15, 2026
a3fd770
refactor(fido2): fix ExtensionOutput.Decode, extract CoseKeyWriter, d…
DennisDyallo Apr 15, 2026
ae0b269
refactor(oath): immutable Credential.Id, TLV concat helper, ArrayBuff…
DennisDyallo Apr 15, 2026
f2c0781
refactor(yubiotp): extract HMAC key processing, constructor validatio…
DennisDyallo Apr 15, 2026
8a5f0fe
refactor(openpgp): fix X25519 slot bug, consolidate KeyRef switches, …
DennisDyallo Apr 15, 2026
ce2ce5b
refactor(secdomain): expand interface, extract PutEcKey helper, Membe…
DennisDyallo Apr 15, 2026
9c84190
refactor(yubihsm): extract retry handler, transmit pattern, immutable…
DennisDyallo Apr 15, 2026
25ad4b8
feat(core): add BerLength utility, ExtractRetryCount, EnsureReady
DennisDyallo Apr 15, 2026
d5a3db4
fix: connection leak in 6 modules' CreateSessionAsync methods
DennisDyallo Apr 15, 2026
ade7d8a
refactor: use Core BerLength and ExtractRetryCount utilities
DennisDyallo Apr 15, 2026
f8a0339
fix(core): remove unused EnsureReady from ApplicationSession
DennisDyallo Apr 15, 2026
81ea261
fix(piv): DES zeroing, BER lengths, retry extraction, ArrayBufferWriter
DennisDyallo Apr 15, 2026
892a2d5
fix(fido2): LargeBlob CBOR parse bug, extract Encapsulate ECDH helper
DennisDyallo Apr 15, 2026
c0acfeb
fix(oath): CredentialData IDisposable, ValidateAsync/SetKeyAsync API …
DennisDyallo Apr 15, 2026
380bef0
fix(yubiotp): strict access code validation, cancellation exception f…
DennisDyallo Apr 15, 2026
3b5f280
fix(openpgp): hash zeroing, Kdf disposal chain, BerLength for ASN.1 I…
DennisDyallo Apr 15, 2026
b996c6e
fix(secdomain): Tlv disposal, bounds check, remove caller key mutatio…
DennisDyallo Apr 15, 2026
a2edc0c
feat(core): add TlvHelper.EncodeAndDisposeList for safe Tlv lifecycle
DennisDyallo Apr 15, 2026
b74c0dc
fix(yubihsm): dispose Tlv objects via EncodeAndDisposeList (10 sites)
DennisDyallo Apr 15, 2026
d6113c8
fix(piv): dispose Tlv objects in parse methods (5 sites)
DennisDyallo Apr 15, 2026
1af1581
Merge branch 'yubikey-codeaudit' of github.com:Yubico/Yubico.NET.SDK …
DennisDyallo Apr 15, 2026
52d9450
refactor(piv): split CryptoBlock into EncryptBlock/DecryptBlock with …
DennisDyallo Apr 15, 2026
fb216d3
docs: add TODO backlog work plan, stage 4 plan, update handoff
DennisDyallo Apr 15, 2026
9421ddb
Merge branch 'yubikey-codeaudit' of github.com:Yubico/Yubico.NET.SDK …
DennisDyallo Apr 15, 2026
24db19c
fix(piv): clone ModPow result before zeroing BigInteger allocation
DennisDyallo Apr 15, 2026
01e4b99
test(fido2): standardize RequiresUserPresence trait to TestCategories…
DennisDyallo Apr 15, 2026
c4c591b
fix(core,fido2): HID DeviceId collision and CTAP2.0 PIN token fallback
DennisDyallo Apr 15, 2026
16c0c27
fix(fido2): ChangePin test uses KnownTestPin instead of hardcoded PIN
DennisDyallo Apr 16, 2026
34171ea
test(fido2): fix AuthenticatorConfig tests for idempotent, self-heali…
DennisDyallo Apr 16, 2026
3b76ca2
refactor(oath): replace ConcatTlvs with collection spread and add Zer…
DennisDyallo Apr 16, 2026
150133d
Merge pull request #455 from Yubico/yubikey-codeaudit
DennisDyallo Apr 18, 2026
3fcf5a4
test(fido2): fix unit tests broken by production code updates
DennisDyallo Apr 20, 2026
8325527
ci: publish 2.0 preview packages to GitHub Packages on push
DennisDyallo Apr 20, 2026
2aa9c06
ci: upgrade GitHub Actions to v5 (Node.js 24)
DennisDyallo Apr 20, 2026
e48dbd6
test(core): fix xUnit1031 and xUnit2031 analyzer warnings
DennisDyallo Apr 20, 2026
594dd84
chore: rename build.cs → toolchain.cs and add publish-remote target
DennisDyallo Apr 20, 2026
b76b614
refactor(toolchain): fix all CodeAudit findings and harden secret han…
DennisDyallo Apr 20, 2026
d6d6e5c
feat(webauthn): scaffold Yubico.YubiKit.WebAuthn module + test project
DennisDyallo Apr 22, 2026
5ee4f95
feat(webauthn): add WebAuthn data-model records + preference enums
DennisDyallo Apr 22, 2026
962a029
feat(webauthn): add COSE primitives (CoseAlgorithm, CoseKey, Aaguid) …
DennisDyallo Apr 22, 2026
be80a9b
fix(fido2): capture raw CBOR slice for AttestationStatement.RawData
DennisDyallo Apr 22, 2026
9f3e4ad
feat(webauthn): add WebAuthnOrigin parser with PSL + enterprise predi…
DennisDyallo Apr 22, 2026
b11a8ac
feat(webauthn): add WebAuthnClientData with hand-built JSON (byte-par…
DennisDyallo Apr 22, 2026
5d55c15
feat(webauthn): add AttestationObject, AttestationStatement variants,…
DennisDyallo Apr 22, 2026
06589a6
feat(webauthn): add WebAuthnClientError + error code enum
DennisDyallo Apr 22, 2026
4442624
feat(webauthn): add IWebAuthnBackend abstraction + FidoSessionWebAuth…
DennisDyallo Apr 22, 2026
59e7a4f
feat(webauthn): add RegistrationOptions and RegistrationResponse types
DennisDyallo Apr 22, 2026
0546dd8
feat(webauthn): add RpIdValidator + UvDecision
DennisDyallo Apr 22, 2026
b4671dc
feat(webauthn): add WebAuthnClient.MakeCredentialAsync (terminal flow…
DennisDyallo Apr 22, 2026
ae2994f
test(webauthn): add WebAuthnClient.MakeCredentialAsync unit tests wit…
DennisDyallo Apr 22, 2026
4188c3d
feat(webauthn): add AuthenticationOptions, AuthenticationResponse, Ma…
DennisDyallo Apr 22, 2026
8193101
feat(webauthn): add CredentialMatcher (allow-list + discoverable enum…
DennisDyallo Apr 22, 2026
25e6ae4
feat(webauthn): wire GetAssertion in FidoSessionWebAuthnBackend
DennisDyallo Apr 22, 2026
547e64a
feat(webauthn): add WebAuthnClient.GetAssertionAsync with deferred Ma…
DennisDyallo Apr 22, 2026
fe37532
test(webauthn): add WebAuthnClient.GetAssertionAsync unit tests
DennisDyallo Apr 22, 2026
e803ede
feat(webauthn): add WebAuthnStatus discriminated record + StatusChann…
DennisDyallo Apr 22, 2026
67c0235
feat(webauthn): add streaming WebAuthn APIs with PIN/UV interaction
DennisDyallo Apr 22, 2026
01d468a
test(webauthn): add streaming + drain-convenience unit tests (5 tests)
DennisDyallo Apr 22, 2026
c8d1033
fix(webauthn): cancel PIN/UV TCS when drain helper has no credentials…
DennisDyallo Apr 22, 2026
3c64c74
feat(webauthn): add extension input/output records (CredProtect, Cred…
DennisDyallo Apr 22, 2026
4baefe0
feat(webauthn): add per-extension adapters dispatching to Fido2 Exten…
DennisDyallo Apr 22, 2026
d943ab6
feat(webauthn): add ExtensionPipeline orchestration (build CBOR, pars…
DennisDyallo Apr 22, 2026
74b5853
feat(webauthn): wire ExtensionPipeline into WebAuthnClient registrati…
DennisDyallo Apr 22, 2026
2ceefe0
test(webauthn): add ExtensionPipeline + adapter unit tests
DennisDyallo Apr 22, 2026
46e5233
fix(webauthn): H-3 remove dangerous PinAuthInvalid retry loop + add c…
DennisDyallo Apr 22, 2026
f7ae5cb
fix(webauthn): H-2 link stream producer cancellation to iterator disp…
DennisDyallo Apr 22, 2026
897d97e
fix(webauthn): H-4 honor CancellationToken in MatchedCredential.Selec…
DennisDyallo Apr 22, 2026
8e31e73
fix(webauthn): H-1 standardize PIN buffer zeroing on whole rented block
DennisDyallo Apr 22, 2026
6400698
fix(webauthn): M-1/M-3/L-7 wrap CBOR errors as WebAuthnClientError
DennisDyallo Apr 22, 2026
58e6024
fix(webauthn): M-2 validate CredBlob assertion output length (1-32 by…
DennisDyallo Apr 22, 2026
11088ae
fix(webauthn): M-4 reject ambiguous PRF evalByCredential matches
DennisDyallo Apr 22, 2026
510ced7
fix(webauthn): M-5/M-6 LargeBlob honest no-op (throws NotSupported un…
DennisDyallo Apr 22, 2026
1f78c46
docs(webauthn): L-2 document Aaguid struct safety rationale
DennisDyallo Apr 22, 2026
fe59e4f
docs(webauthn): append Gate 1 resolutions table to audit
DennisDyallo Apr 22, 2026
10a94b7
fix(webauthn): correct WebAuthnClientError namespace references
DennisDyallo Apr 22, 2026
a5b6781
feat(webauthn/previewSign): add PreviewSignFlags enum + validation ex…
DennisDyallo Apr 22, 2026
77deea7
feat(webauthn/previewSign): add registration input/output + Generated…
DennisDyallo Apr 22, 2026
c123d7c
feat(webauthn/previewSign): add authentication input/output + signing…
DennisDyallo Apr 22, 2026
6de96b1
feat(webauthn/previewSign): add PreviewSignCbor encode/decode helpers…
DennisDyallo Apr 22, 2026
73c201a
feat(webauthn/previewSign): add CTAP error → WebAuthnClientError mapping
DennisDyallo Apr 22, 2026
aece974
test(webauthn/previewSign): add 9 unit tests covering CBOR encoding, …
DennisDyallo Apr 22, 2026
0a62af1
feat(webauthn/previewSign): extend RegistrationExtensionInputs/Output…
DennisDyallo Apr 22, 2026
eff5741
feat(webauthn/previewSign): add PreviewSignAdapter (registration + au…
DennisDyallo Apr 22, 2026
1c47328
feat(webauthn/previewSign): wire PreviewSignAdapter into ExtensionPip…
DennisDyallo Apr 22, 2026
947cbd7
feat(webauthn/previewSign): thread RegistrationOptions into Extension…
DennisDyallo Apr 22, 2026
205400a
docs(fido2): note WebAuthn-layer previewSign location in extensions t…
DennisDyallo Apr 22, 2026
81890f3
test(webauthn/previewSign): add 7 PreviewSignAdapter tests (validatio…
DennisDyallo Apr 22, 2026
3bfb0b0
fix(webauthn): H-2 use CTAP2 canonical (length-then-lex) sort when me…
DennisDyallo Apr 22, 2026
8c1b9ef
fix(webauthn): H-4 ByteArrayKeyComparer uses full-content HashCode.Ad…
DennisDyallo Apr 22, 2026
04ef8be
fix(webauthn): H-3 PreviewSignAuthenticationInput defensively normali…
DennisDyallo Apr 22, 2026
5ca187b
fix(webauthn): M-2 derive previewSign flags from UserVerification onl…
DennisDyallo Apr 22, 2026
6fd4acc
fix(webauthn): C-3 remove dead DecodeSignedRegistrationOutput (always…
DennisDyallo Apr 22, 2026
3364ed1
fix(fido2): C-2-prep capture unsignedExtensionOutputs from MakeCreden…
DennisDyallo Apr 22, 2026
0ae08cf
fix(webauthn): C-2 read previewSign attestation from unsignedExtensio…
DennisDyallo Apr 22, 2026
f142504
fix(webauthn): C-1 encode previewSign auth as flat single-credential …
DennisDyallo Apr 22, 2026
297ca13
fix(webauthn): H-1 wire PreviewSignErrors.MapCtapError at registratio…
DennisDyallo Apr 22, 2026
4a13e72
test(webauthn): M-1 lock down auth CBOR key set (defense-in-depth)
DennisDyallo Apr 22, 2026
950468c
fix(webauthn): M-3 wrap nested attestation parse errors as WebAuthnCl…
DennisDyallo Apr 22, 2026
a2d1b62
fix(webauthn): M-4 validate previewSign AdditionalArgs is well-formed…
DennisDyallo Apr 22, 2026
3ec93ff
docs(webauthn): append Gate-2 audit resolutions table
DennisDyallo Apr 22, 2026
9aa0cca
test(webauthn): fix previewSign tests after Gate-2 wire format changes
DennisDyallo Apr 22, 2026
3780fd5
docs(webauthn): update CLAUDE.md with SDK rewrite details
DennisDyallo Apr 22, 2026
97a502d
docs: clarify --project + --filter usage for targeted test runs
DennisDyallo Apr 22, 2026
95abc0c
fix(webauthn): wire extension passthrough and fix previewSign parser
DennisDyallo Apr 22, 2026
fbe45bc
docs(webauthn): add module CLAUDE.md
DennisDyallo Apr 22, 2026
f90bbc8
test(webauthn): add DeleteAllCredentialsForRpAsync helper
DennisDyallo Apr 22, 2026
63adea3
refactor(webauthn): split PreviewSignCbor key constants into scoped c…
DennisDyallo Apr 22, 2026
eadb8fc
test(webauthn): fix xUnit1051 warnings and CS8625 in GetAssertionTests
DennisDyallo Apr 22, 2026
5f7ab70
docs: correct LoggingFactory→YubiKitLogging in root CLAUDE.md
DennisDyallo Apr 22, 2026
56dfbd5
docs(webauthn): land Phase 9 plan + libfido2/android parity reports +…
DennisDyallo Apr 23, 2026
0b6fa31
docs(webauthn): pivot Phase 9.2 to path 2A — Rust upstream is hardwar…
DennisDyallo Apr 23, 2026
36c9868
test(webauthn): add byte-level CBOR encoding tests for previewSign au…
DennisDyallo Apr 23, 2026
3983cc9
refactor(webauthn): update multi-credential NotSupported message to r…
DennisDyallo Apr 23, 2026
d669174
fix(webauthn): enable previewSign auth test with non-ARKG algorithms
DennisDyallo Apr 23, 2026
b26ef2a
test(webauthn): drop validation-only previewSign test per repo test-p…
DennisDyallo Apr 23, 2026
b54bc0c
test(webauthn): re-skip previewSign auth integration test — ARKG is g…
DennisDyallo Apr 23, 2026
197e0dd
test(webauthn): use [SkippableTheory] so xunit.SkippableFact catches …
DennisDyallo Apr 23, 2026
bd4e0fd
docs(webauthn): record Phase 9.3 hardware verification results
DennisDyallo Apr 23, 2026
5b67f7d
docs(fido2): file Phase 9.4 tracker for canonical extension coverage …
DennisDyallo Apr 23, 2026
728a117
docs(webauthn): handoff for Phase 9 close + PR #466
DennisDyallo Apr 23, 2026
e94e6ff
test(fido2): add canonical previewSign registration and PIN error tests
DennisDyallo Apr 23, 2026
06eb7fc
feat(fido2): add PreviewSignExtension types and encoder
DennisDyallo Apr 23, 2026
95205be
feat(fido2): add WithPreviewSign builder methods
DennisDyallo Apr 23, 2026
c4dcdef
refactor(webauthn): delegate previewSign encoding to Fido2
DennisDyallo Apr 23, 2026
49c75f6
test(fido2): migrate previewSign tests to canonical Fido2 layer
DennisDyallo Apr 23, 2026
57e7733
docs(fido2,webauthn): update CLAUDE.md with architectural truth
DennisDyallo Apr 23, 2026
2df7745
refactor(webauthn): eliminate DRY in attestation-object encoding
DennisDyallo Apr 23, 2026
5c73229
refactor(webauthn): route PreviewSignAdapter through ExtensionBuilder
DennisDyallo Apr 23, 2026
5620dc5
docs(webauthn): handoff capturing architectural cleanup phases 9.5/9.…
DennisDyallo Apr 23, 2026
01f6ed7
refactor(tests): add cancellation token to MakeCredentialStreamAsync …
DennisDyallo Apr 23, 2026
2823809
test(fido2): add Phase 9.4 extension coverage tests
DennisDyallo Apr 23, 2026
46e1061
docs(fido2): mark Phase 9.4 done + file Phase 9.6 credBlob validation…
DennisDyallo Apr 23, 2026
e7624e4
docs(webauthn): final session handoff — Phase 9.4 shipped, Phase 9.6 …
DennisDyallo Apr 23, 2026
b470a5f
refactor(webauthn,fido2): consolidate duplicated behavior to Fido2 (P…
DennisDyallo Apr 24, 2026
3214535
refactor(fido2,webauthn): consolidate AttestationStatement to typed h…
DennisDyallo Apr 24, 2026
4529e8c
refactor(tests): replace Theory with SkippableTheory in test classes
DennisDyallo Apr 27, 2026
d4b9503
docs: trim CLAUDE.md 50% via JIT extraction to discoverable domain docs
DennisDyallo Apr 27, 2026
3107bd5
fix(fido2): parse previewSign unsignedExtensionOutputs at CTAP key 6 …
DennisDyallo Apr 27, 2026
43ea328
fix(fido2,test): re-mint pinUvAuthToken between GetAssertion calls in…
DennisDyallo Apr 27, 2026
37ff02f
fix(fido2,test): guard FidoNfcTests against NotSupportedException on …
DennisDyallo Apr 27, 2026
f62c7c4
feat(webauthn): add client-layer excludeList pre-flight (Java parity)
DennisDyallo Apr 27, 2026
dc2ed14
fix(webauthn): re-mint pinUvAuthToken between excludeList preflight a…
DennisDyallo Apr 27, 2026
a0070db
fix(webauthn): address 4 critical CodeAudit findings (token hygiene, …
DennisDyallo Apr 27, 2026
cfea6e1
docs(handoff): 2026-04-28 — ExcludeList preflight token re-mint + 4 C…
DennisDyallo Apr 27, 2026
489c853
chore(webauthn): remove dead CreateUvRequest + _uvResponseTcs from St…
DennisDyallo Apr 27, 2026
f547fca
fix(fido2,test): add missing 'using Xunit;' to FidoNfcTests for Skip …
DennisDyallo Apr 27, 2026
2b1b085
chore(webauthn): Tier A audit cleanup — typed cancellation + remove d…
DennisDyallo Apr 27, 2026
66fe7bc
docs(handoff): 2026-04-28 — 6-commit cleanup wave (ExcludeList fix + …
DennisDyallo Apr 27, 2026
6ecbae3
fix(fido2,test): port previewSign -9 → -65539 alg fix from Legacy fe8…
DennisDyallo Apr 28, 2026
adcff79
feat(fido2,webauthn): typed CoseSignArgs builder for previewSign ARKG…
DennisDyallo Apr 28, 2026
0fbeb9c
fix(webauthn): decode CTAP-shaped inner attestation object in preview…
DennisDyallo Apr 28, 2026
1865c8b
docs(handoff,plans): 2026-04-28 afternoon — Phase 10 §3 ship + previe…
DennisDyallo Apr 28, 2026
e66e539
fix(claude): remove redundant skill entry from guidance
DennisDyallo Apr 28, 2026
425386b
feat(core,fido2,webauthn): port ARKG-P256 primitives + typed previewS…
DennisDyallo Apr 29, 2026
43a466b
fix(webauthn): wire PreviewSignErrors.MapCtapError for GetAssertion path
DennisDyallo Apr 29, 2026
794eea2
fix(fido2): swap pkBl/pkKem at CBOR -1/-2 in CoseArkgP256SeedKey
DennisDyallo May 13, 2026
128f908
docs(plans): handoff + previewSign root-cause plan for 2026-04-29 PM
DennisDyallo May 13, 2026
5f13700
chore(deps): bump Yubico.NativeShims to stable 1.16.1
DennisDyallo May 14, 2026
92038ad
Merge branch 'yubikit-applets' of github.com:Yubico/Yubico.NET.SDK in…
DennisDyallo May 21, 2026
631e3b0
add AGENTS.md and testing research
DennisDyallo Jun 5, 2026
2056853
refactor(fido2): split extension types into feature folders
DennisDyallo Jun 5, 2026
bfc6bdd
Merge branch 'webauthn/phase-9.2-rust-port' into yubikit-applets
DennisDyallo Jun 5, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
24 changes: 12 additions & 12 deletions .claude/agents/ralph-loop.md
Original file line number Diff line number Diff line change
Expand Up @@ -43,9 +43,9 @@ Execute complex, multi-step engineering tasks autonomously by:

```bash
# ✅ CORRECT - Always use build script
dotnet build.cs build # Build entire solution
dotnet build.cs build --project Piv # Build specific project (partial match)
dotnet build.cs build --clean # Clean rebuild
dotnet toolchain.cs build # Build entire solution
dotnet toolchain.cs build --project Piv # Build specific project (partial match)
dotnet toolchain.cs build --clean # Clean rebuild

# ❌ WRONG - Never use directly
dotnet build # FORBIDDEN
Expand All @@ -56,12 +56,12 @@ dotnet restore # FORBIDDEN

```bash
# ✅ CORRECT - Handles xUnit v2/v3 automatically
dotnet build.cs test # All tests
dotnet build.cs test --project Fido2 # Module tests (partial match)
dotnet build.cs test --filter "FullyQualifiedName~MyTest" # Filter by full name
dotnet build.cs test --filter "Name=ExactMethodName" # Exact method match
dotnet build.cs test --filter "ClassName~Integration" # Filter by class name
dotnet build.cs test --project Piv --filter "Method~Sign" # Combine project + filter
dotnet toolchain.cs test # All tests
dotnet toolchain.cs test --project Fido2 # Module tests (partial match)
dotnet toolchain.cs test --filter "FullyQualifiedName~MyTest" # Filter by full name
dotnet toolchain.cs test --filter "Name=ExactMethodName" # Exact method match
dotnet toolchain.cs test --filter "ClassName~Integration" # Filter by class name
dotnet toolchain.cs test --project Piv --filter "Method~Sign" # Combine project + filter

# ❌ WRONG - Fails on xUnit v3 projects
dotnet test # FORBIDDEN
Expand Down Expand Up @@ -182,12 +182,12 @@ Load skills when encountering specific situations:

### Build Failures
```bash
dotnet build.cs build --clean
dotnet toolchain.cs build --clean
```

### Test Failures
```bash
dotnet build.cs test --filter "FullyQualifiedName~FailingTest"
dotnet toolchain.cs test --filter "FullyQualifiedName~FailingTest"
```

### Stuck
Expand All @@ -199,7 +199,7 @@ dotnet build.cs test --filter "FullyQualifiedName~FailingTest"

## Completion Protocol

1. Run `dotnet build.cs build && dotnet build.cs test`
1. Run `dotnet toolchain.cs build && dotnet toolchain.cs test`
2. Verify all tasks `[x]`
3. Output `<promise>DONE</promise>`

Expand Down
8 changes: 4 additions & 4 deletions .claude/skills/agent-dispatch/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -78,8 +78,8 @@ Good agent prompts are:
BEFORE STARTING: Read CLAUDE.md and review available skills in .claude/skills/

MANDATORY SKILLS (use these - NEVER use direct commands):
- build-project: Use `dotnet build.cs build` - NEVER `dotnet build`
- test-project: Use `dotnet build.cs test` - NEVER `dotnet test`
- build-project: Use `dotnet toolchain.cs build` - NEVER `dotnet build`
- test-project: Use `dotnet toolchain.cs test` - NEVER `dotnet test`
- commit: Follow commit guidelines - NEVER use `git add .`
```

Expand All @@ -89,8 +89,8 @@ MANDATORY SKILLS (use these - NEVER use direct commands):
BEFORE STARTING: Read CLAUDE.md and review available skills in .claude/skills/

MANDATORY SKILLS:
- build-project: Use `dotnet build.cs build` - NEVER `dotnet build`
- test-project: Use `dotnet build.cs test` - NEVER `dotnet test`
- build-project: Use `dotnet toolchain.cs build` - NEVER `dotnet build`
- test-project: Use `dotnet toolchain.cs test` - NEVER `dotnet test`

Fix the 3 failing tests in src/agents/agent-tool-abort.test.ts:

Expand Down
12 changes: 6 additions & 6 deletions .claude/skills/agent-ralph-loop/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -115,11 +115,11 @@ When the engine detects a progress file, it injects these instructions automatic

```
1. RED: Write failing test asserting the task's behavior
Run: `dotnet build.cs test --filter "FullyQualifiedName~{TestClass}"`
Run: `dotnet toolchain.cs test --filter "FullyQualifiedName~{TestClass}"`
Expect: FAILURE

2. GREEN: Write minimal code to pass
Run: `dotnet build.cs test --filter "FullyQualifiedName~{TestClass}"`
Run: `dotnet toolchain.cs test --filter "FullyQualifiedName~{TestClass}"`
Expect: SUCCESS

3. REFACTOR: Clean up, check security, add docs
Expand All @@ -145,9 +145,9 @@ When the engine detects a progress file, it injects these instructions automatic

| Action | Command |
|--------|---------|
| Build | `dotnet build.cs build` |
| Test | `dotnet build.cs test` |
| Test filtered | `dotnet build.cs test --filter "..."` |
| Build | `dotnet toolchain.cs build` |
| Test | `dotnet toolchain.cs test` |
| Test filtered | `dotnet toolchain.cs test --filter "..."` |

**NEVER use `dotnet build` or `dotnet test` directly** - they fail on mixed xUnit v2/v3.

Expand Down Expand Up @@ -246,7 +246,7 @@ bun .claude/skills/agent-ralph-loop/ralph-loop.ts \

```bash
bun .claude/skills/agent-ralph-loop/ralph-loop.ts \
"Run 'dotnet build.cs test'. Analyze failures. Fix code. Repeat until passing." \
"Run 'dotnet toolchain.cs test'. Analyze failures. Fix code. Repeat until passing." \
--completion-promise "TESTS_PASSED" \
--max-iterations 12 \
--model claude-sonnet-4.5
Expand Down
6 changes: 3 additions & 3 deletions .claude/skills/agent-ralph-loop/ralph-loop-utils.ts
Original file line number Diff line number Diff line change
Expand Up @@ -177,8 +177,8 @@ export function formatProgressContext(state: ProgressFileState): string {
All tasks complete! Verify everything passes, then output the completion promise.

Final verification:
1. Run: \`dotnet build.cs build\` - must exit 0
2. Run: \`dotnet build.cs test\` - all tests must pass
1. Run: \`dotnet toolchain.cs build\` - must exit 0
2. Run: \`dotnet toolchain.cs test\` - all tests must pass
3. Check: No regressions in existing tests
`;
}
Expand Down Expand Up @@ -255,7 +255,7 @@ SKILL RULES:
- BEFORE any build/test/commit action, check if a skill covers it
- Use \`skill invoke <name>\` or follow skill instructions
- Mandatory skills MUST be used - direct commands (dotnet build, dotnet test, git add .) are FORBIDDEN
- This repo has mixed xUnit v2/v3 - ONLY use \`dotnet build.cs test\`, never \`dotnet test\`
- This repo has mixed xUnit v2/v3 - ONLY use \`dotnet toolchain.cs test\`, never \`dotnet test\`
`;
}

Expand Down
2 changes: 1 addition & 1 deletion .claude/skills/agent-ralph-loop/ralph-loop.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -248,7 +248,7 @@ feature: Test
const result = formatProgressContext(state);

expect(result).toContain("All tasks complete!");
expect(result).toContain("dotnet build.cs build");
expect(result).toContain("dotnet toolchain.cs build");
});

test("shows remaining tasks in phase", () => {
Expand Down
10 changes: 5 additions & 5 deletions .claude/skills/agent-ralph-loop/ralph-loop.ts
Original file line number Diff line number Diff line change
Expand Up @@ -143,11 +143,11 @@ You are executing a task from a progress file. Follow this protocol for EVERY ta

## TDD Loop
1. **RED:** Write a failing test that asserts the task's expected behavior
- Run: \`dotnet build.cs test --filter "FullyQualifiedName~{TestClass}"\`
- Run: \`dotnet toolchain.cs test --filter "FullyQualifiedName~{TestClass}"\`
- Expect: FAILURE (test must fail first to prove it tests something)

2. **GREEN:** Write minimal code to make the test pass
- Run: \`dotnet build.cs test --filter "FullyQualifiedName~{TestClass}"\`
- Run: \`dotnet toolchain.cs test --filter "FullyQualifiedName~{TestClass}"\`
- Expect: SUCCESS

3. **REFACTOR:** Clean up code, verify security, add XML docs if public API
Expand All @@ -166,9 +166,9 @@ You are executing a task from a progress file. Follow this protocol for EVERY ta
- [ ] Input validation for lengths and ranges

## Build Commands (MANDATORY - never use raw dotnet commands)
- Build: \`dotnet build.cs build\`
- Test: \`dotnet build.cs test\`
- Test filtered: \`dotnet build.cs test --filter "..."\`
- Build: \`dotnet toolchain.cs build\`
- Test: \`dotnet toolchain.cs test\`
- Test filtered: \`dotnet toolchain.cs test --filter "..."\`

**CRITICAL - xUnit v2/v3 MIXED CODEBASE:**
This repo uses BOTH xUnit v2 and v3 test projects with different CLI requirements:
Expand Down
42 changes: 21 additions & 21 deletions .claude/skills/agent-ralph-prompt/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -56,8 +56,8 @@ The prompt may contain completion promises as instructions (e.g., "output `<prom
- Example (good):
```markdown
## Verification Requirements (MUST PASS BEFORE COMPLETION)
1. Build: `dotnet build.cs build` (must exit 0)
2. Test: `dotnet build.cs test` (all tests must pass)
1. Build: `dotnet toolchain.cs build` (must exit 0)
2. Test: `dotnet toolchain.cs test` (all tests must pass)
3. No regressions: existing tests pass, new code covered
Only after ALL pass, output <promise>DONE</promise>.
If any fail, fix and re-verify.
Expand Down Expand Up @@ -108,9 +108,9 @@ git commit -m "refactor(piv): replace manual TLV parsing with Tlv/TlvHelper
- Example:
| Action | Command |
|--------|---------|
| Build | `dotnet build.cs build` |
| Test | `dotnet build.cs test` |
| Coverage | `dotnet build.cs coverage` |
| Build | `dotnet toolchain.cs build` |
| Test | `dotnet toolchain.cs test` |
| Coverage | `dotnet toolchain.cs coverage` |

### 3a. Using Directives First (Before Refactoring)

Expand Down Expand Up @@ -227,19 +227,19 @@ If a test requires:
```markdown
## Phase 1: Create interfaces
Files: IFoo.cs, IBar.cs
Verify: `dotnet build.cs build`
Verify: `dotnet toolchain.cs build`
Commit: "feat(core): add IFoo and IBar interfaces"
→ Output <promise>PHASE_1_DONE</promise>

## Phase 2: Implement classes
Files: Foo.cs, Bar.cs
Verify: `dotnet build.cs build`
Verify: `dotnet toolchain.cs build`
Commit: "feat(core): implement Foo and Bar"
→ Output <promise>PHASE_2_DONE</promise>

## Phase 3: Add tests
Files: FooTests.cs, BarTests.cs
Verify: `dotnet build.cs test`
Verify: `dotnet toolchain.cs test`
Commit: "test(core): add Foo and Bar tests"
→ Output <promise>ALL_DONE</promise>
```
Expand Down Expand Up @@ -267,14 +267,14 @@ If a test requires:
- Include complete test code (no placeholders)

**Step 2: Run test to confirm failure**
Run: `dotnet build.cs test --filter "FullyQualifiedName~TestName"`
Run: `dotnet toolchain.cs test --filter "FullyQualifiedName~TestName"`
Expected: FAIL (describe expected failure)

**Step 3: Minimal implementation**
- Include complete implementation code

**Step 4: Re-run test to confirm pass**
Run: `dotnet build.cs test --filter "FullyQualifiedName~TestName"`
Run: `dotnet toolchain.cs test --filter "FullyQualifiedName~TestName"`
Expected: PASS

**Step 5: Commit**
Expand All @@ -287,8 +287,8 @@ git commit -m "feat: <message>"

## Verification Requirements (MUST PASS BEFORE COMPLETION)

1. Build: `dotnet build.cs build` (must exit 0)
2. Test: `dotnet build.cs test` (all tests must pass)
1. Build: `dotnet toolchain.cs build` (must exit 0)
2. Test: `dotnet toolchain.cs test` (all tests must pass)
3. No regressions: existing tests pass, new code covered

Only after ALL pass, output <promise>{COMPLETION_PROMISE}</promise>.
Expand Down Expand Up @@ -463,7 +463,7 @@ The final phase must include explicit verification steps:
Before delivering completion promise:

1. **Build Verification**
Run: `dotnet build.cs build`
Run: `dotnet toolchain.cs build`
Must: Exit 0 with no errors

2. **Coverage Check** (for documentation tasks)
Expand All @@ -490,12 +490,12 @@ Before starting work, capture baseline build errors to distinguish pre-existing

Run BEFORE making any changes:
```bash
dotnet build.cs build 2>&1 | grep -E "error (CS|MSB)" | sort > /tmp/baseline-errors.txt || true
dotnet toolchain.cs build 2>&1 | grep -E "error (CS|MSB)" | sort > /tmp/baseline-errors.txt || true
```

After each phase, compare:
```bash
dotnet build.cs build 2>&1 | grep -E "error (CS|MSB)" | sort > /tmp/current-errors.txt || true
dotnet toolchain.cs build 2>&1 | grep -E "error (CS|MSB)" | sort > /tmp/current-errors.txt || true
NEW_ERRORS=$(comm -13 /tmp/baseline-errors.txt /tmp/current-errors.txt)
if [ -n "$NEW_ERRORS" ]; then
echo "⚠️ NEW BUILD ERRORS (fix before proceeding):"
Expand Down Expand Up @@ -657,7 +657,7 @@ For each API signature change:

3. **Build after each batch:**
```bash
dotnet build.cs build
dotnet toolchain.cs build
```

4. **Verify no remaining references:**
Expand Down Expand Up @@ -747,10 +747,10 @@ Each phase MUST end with explicit verification commands—not just "verify build
Run these commands and verify expected results:
```bash
# Build must succeed
dotnet build.cs build # Must exit 0
dotnet toolchain.cs build # Must exit 0

# Run unit tests (hardware tests may fail - document expected failures)
dotnet build.cs test -- --filter "Category!=Integration" # Unit tests must pass
dotnet toolchain.cs test -- --filter "Category!=Integration" # Unit tests must pass

# Verify expected file changes
grep -rn "NewClass" src/ # Should find 3 files
Expand Down Expand Up @@ -799,13 +799,13 @@ For complex refactors (3+ phases), use this proven structure:

- [ ] N.X-2: **Build verification**
```bash
dotnet build.cs build
dotnet toolchain.cs build
```
Must exit 0.

- [ ] N.X-1: **Test verification**
```bash
dotnet build.cs test --filter "FullyQualifiedName~Module"
dotnet toolchain.cs test --filter "FullyQualifiedName~Module"
```
All tests must pass.

Expand All @@ -824,7 +824,7 @@ For complex refactors (3+ phases), use this proven structure:
## Anti-Patterns to Avoid
- Vague completion criteria ("when finished")
- Missing test requirement ("when code compiles")
- Wrong commands (`dotnet test` instead of `dotnet build.cs test`)
- Wrong commands (`dotnet test` instead of `dotnet toolchain.cs test`)
- No failure guidance
- Using `git add .` or `git add -A` blindly
- **Cramming multiple phases into one iteration** (causes context rot)
Expand Down
2 changes: 1 addition & 1 deletion .claude/skills/agent-ralph-prompt/WORKFLOW.md
Original file line number Diff line number Diff line change
Expand Up @@ -121,7 +121,7 @@
│ write-ralph-prompt│ │ build-project │ │ test-project │
│ │ │ │ │ │
│ Guidance for │ │ MANDATORY │ │ MANDATORY │
│ ad-hoc prompts │ │ dotnet build.cs │ │ dotnet build.cs │
│ ad-hoc prompts │ │ dotnet toolchain.cs │ │ dotnet toolchain.cs │
│ (when no progress │ │ build │ │ test │
│ file needed) │ │ │ │ │
└───────────────────┘ └───────────────────┘ └───────────────────┘
Expand Down
8 changes: 4 additions & 4 deletions .claude/skills/agent-subagent/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -48,8 +48,8 @@ Execute plan by dispatching fresh subagent per task, with two-stage review after
BEFORE STARTING: Read CLAUDE.md and review .claude/skills/

MANDATORY SKILLS (use these - NEVER use direct commands):
- build-project: `dotnet build.cs build` - NEVER `dotnet build`
- test-project: `dotnet build.cs test` - NEVER `dotnet test`
- build-project: `dotnet toolchain.cs build` - NEVER `dotnet build`
- test-project: `dotnet toolchain.cs test` - NEVER `dotnet test`
- commit: Follow guidelines - NEVER `git add .`
```

Expand All @@ -61,8 +61,8 @@ Use Task tool with agent_type: "general-purpose":
BEFORE STARTING: Read CLAUDE.md and review .claude/skills/

MANDATORY SKILLS:
- build-project: `dotnet build.cs build` - NEVER `dotnet build`
- test-project: `dotnet build.cs test` - NEVER `dotnet test`
- build-project: `dotnet toolchain.cs build` - NEVER `dotnet build`
- test-project: `dotnet toolchain.cs test` - NEVER `dotnet test`
- commit: Follow guidelines - NEVER `git add .`

You are implementing Task N: [task name]
Expand Down
4 changes: 2 additions & 2 deletions .claude/skills/docs-write-skill/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -112,7 +112,7 @@ The `description` field in frontmatter is **critical** - it's what triggers skil
| ❌ Weak | ✅ Strong |
|---------|-----------|
| `Helps with testing` | `Use when implementing features - write failing test first, then minimal code to pass` |
| `Build tool` | `Use when compiling, testing, or packaging .NET code - runs build.cs targets (NEVER use dotnet test directly)` |
| `Build tool` | `Use when compiling, testing, or packaging .NET code - runs toolchain.cs targets (NEVER use dotnet test directly)` |
| `For debugging` | `Use when encountering bugs, test failures, or unexpected behavior - systematic root cause analysis before fixes` |

**Rules:**
Expand Down Expand Up @@ -168,7 +168,7 @@ Use numbered steps for sequential processes, subsections for parallel concerns.
## Core Build Command

```bash
dotnet build.cs [target] [options]
dotnet toolchain.cs [target] [options]
```

## Available Targets
Expand Down
Loading
Loading