Repository navigation
Conversation
|
The latest updates on your projects. Learn more about Vercel for GitHub.
|
|
AI review status for this pull request.
|
PR Analysis Report🔎 Preview ·
|
| Before | After | Change | |
|---|---|---|---|
| Job-minutes per PR update | 78.7 | 78.7 | 0 |
| Runner pool, runner-minutes a day | 36,690 | 36,690 | 0 (0%) |
| Average concurrent jobs | 25.5 | 25.5 | 0 |
| Time to green (median → this run) | — | 25.7 min | — |
| Runs a day | 466 | 466 | 0 |
Not measured (the jobs that use these keep their recent minutes above): .github/scripts/knowledge-paths.test.mjs.
Assumptions: before is each job's average over the last 20 pull-request runs; after keeps that for unchanged jobs and uses this run's minutes for added or changed ones, weighted by how often each changed job ran in those runs; runs a day averages the seven whole days before today; time to green compares this run with the median of those runs that ran the same jobs.
Generated by PR Enrichment workflow | View full report
There was a problem hiding this comment.
The record form, ids and locations match AST-093 FR1 and the knowledge-contracts architecture, and the rule text carries over unchanged. Approval waits on one owner decision: whether the seven Swift rules, which main still marks Status: draft, become authority: current with the text at this head (including the accessibility record's new projection and readiness note), or land as authority: draft. An engineering owner records approval by commenting /approve-spec <full head SHA> on this pull request, and the author may do so as an engineering owner. Whatever is decided, these fixes are still needed:
Avatar.spec.mdstill citesarchitecture:native-swift-library-tooltipin FR8 andpackages/native/specs/swift/library/in its Governing rules row, both removed by this change.- The accessibility readiness cell and Verification note say every view's label, traits and value are tested, but no test asserts a value, Card and Text have no accessibility assertion, and X2, X3 and X6 are unproven; its Review checks cell also drops X3's load-time exception.
packages/native/specs/README.mdsays native specs are checked bypnpm check:knowledge, which does not readpackages/native/yet.approved_at: 2026-10-23predates six of the seven texts, and the accessibility record lost its two WWDC references.
[Automated review]
| | System behavior | Name, role, state, and value come from the core contract; disabled controls stay reachable; covered messages announce once after load; every setting in X6 is honored. | | ||
| | End-user impact | A VoiceOver user on iPhone hears the same name, role, state, and messages as a screen-reader user on the web; people using Reduce Motion, Bold Text, and the other settings get them honored. | | ||
| | Builder impact | A Swift component author maps the core contract to SwiftUI accessibility APIs by these rules instead of deciding them per component. | | ||
| | Compatibility/readiness | Current. Unit tests assert each Swift view's label, traits, and value; no Swift component has an accessibility audit yet. | |
There was a problem hiding this comment.
This cell says unit tests assert each Swift view's label, traits and value, but no test in packages/native/apple/Tests/AstryxTests/ asserts an accessibility value (Button sets one at Button.swift:100), and Card and Text have no accessibility assertion. Name the views that carry label and trait assertions instead.
| | End-user impact | A VoiceOver user on iPhone hears the same name, role, state, and messages as a screen-reader user on the web; people using Reduce Motion, Bold Text, and the other settings get them honored. | | ||
| | Builder impact | A Swift component author maps the core contract to SwiftUI accessibility APIs by these rules instead of deciding them per component. | | ||
| | Compatibility/readiness | Current. Unit tests assert each Swift view's label, traits, and value; no Swift component has an accessibility audit yet. | | ||
| | Review checks | Reject a Swift component that renames a core accessible name or role, drops a disabled control from VoiceOver, announces a message present at load, or ignores a setting X6 lists. | |
There was a problem hiding this comment.
X3 (lines 70–80) requires a message that VoiceOver can reach only through its announcement to announce even as the screen loads, so this check would reject a component that follows X3. Carry the exception into the cell.
| Unit tests assert each Swift view's label, traits, and value (X1). No Swift | ||
| component has an accessibility audit yet, so the audit rows (X4, X5, X7) are | ||
| unproven. |
There was a problem hiding this comment.
X2, X3 and X6 have no test or capture either (Button's loading announcement at Button.swift:102 is untested), so listing only the audit rows as unproven reads as if the others were proven. List them too.
| archive_reason: null | ||
| superseded_by: null | ||
| approved_by: cixzhang | ||
| approved_at: 2026-10-23 |
There was a problem hiding this comment.
All seven records carry approved_at: 2026-10-23, but six of these texts first landed on 2026-10-24 and theme-environment and theme-generator changed again on 2026-10-25. Set approved_by and approved_at from the approval of this head, or leave them null with authority: draft.
| library, in its own String Catalog, with the same meaning as core's default | ||
| strings on the web. | ||
|
|
||
| References: Apple's Human Interface Guidelines pages on |
There was a problem hiding this comment.
The source file's WWDC24 and WWDC23 references were dropped here, although the description says References carry over. Restore them.
| template_version: 3 | ||
| kind: architecture | ||
| id: architecture:native-swift-library-tooltip | ||
| id: architecture:native-swift-tooltip |
There was a problem hiding this comment.
packages/native/apple/Sources/Astryx/Avatar/Avatar.spec.md:94 (FR8) still requires the tooltip through architecture:native-swift-library-tooltip, and :40 lists records under packages/native/specs/swift/library/; both need the new id and path, as Icon's spec got.
| `TabList.tsx`. The rules live in | ||
| Every native spec is a standard knowledge record | ||
| ([`architecture:knowledge-contracts`](../../../docs/architecture/knowledge-contracts.md) | ||
| INV27), checked by `pnpm check:knowledge`. The rules live in |
There was a problem hiding this comment.
pnpm check:knowledge does not read packages/native/ at this head: discoverKnowledgeRecords covers docs/ records, themes and component packages' src/ only, so these records are checked only by review until discovery reaches them.
7b79852 to
5ce51db
Compare
There was a problem hiding this comment.
The conversion matches the knowledge-record form, location and ids that knowledge-contracts INV27 and AST-093 FR1 set, and the rule text carries over unchanged. Approval waits on one owner decision: whether the seven Swift rules, which main still marks Status: draft, become authority: current with the approved_at dates at this head, or land as authority: draft with approved_by and approved_at null; an engineering owner records approval by commenting /approve-spec <full head SHA> on this pull request, and the author may do so as an engineering owner. One fix is needed either way, and it is best made before that comment, since a new commit needs a new approval:
packages/native/specs/swift/accessibility.spec.mdsays X6 has no tests, butEnvironmentTests.swift(boldTextStepsCustomFacesHeavier,theStyleReadsBoldTextFromTheEnvironment) tests its Bold Text clause.
[Automated review]
| Avatar, Banner, Button, Card, Heading, Icon, Text, and TextInput. | ||
| - Unit tests assert the accessible names and traits that Avatar, Banner, | ||
| Button, Heading, Icon, and TextInput set, and Button's Loading value; Card | ||
| and Text have no accessibility assertions. X2, X3, and X6 have no tests, |
There was a problem hiding this comment.
This says X6 has no tests, but packages/native/apple/Tests/AstryxTests/EnvironmentTests.swift tests its Bold Text clause: boldTextStepsCustomFacesHeavier checks that a custom face draws one weight heavier with Bold Text on while system fonts follow it themselves, and theStyleReadsBoldTextFromTheEnvironment checks that legibilityWeight = .bold reaches the style. Suggested wording: "X2 and X3 have no tests; X6 has unit tests only for Bold Text, and no captures."
5ce51db to
0fa2289
Compare
There was a problem hiding this comment.
The record form, location and ids match knowledge-contracts INV27 and AST-093 FR1, and the rule text carries over, but the branch is behind main and needs a rebase before anyone approves it:
packages/native/apple/Sources/Astryx/Avatar/Avatar.spec.mdconflicts withmain.main's newThumbnail.spec.md(FR5 and its Governing rules row) andAvatarStatusDot.spec.md(Governing rules row) still cite the old tooltip id andlibrary/, which this change removes.component-apiandtooltipchanged onmainafter this branch's base, so their records need that text, and the accessibility and styles Current state should list AvatarStatusDot and Thumbnail.
After the rebase, approval waits on one owner decision: whether the seven Swift rules, which main marks Status: draft, become authority: current, or land as authority: draft with approved_by and approved_at null. An engineering owner records approval by commenting /approve-spec <full head SHA> on the rebased head, and the author may do so as an engineering owner.
[Automated review]
| template_version: 3 | ||
| kind: architecture | ||
| id: architecture:native-swift-library-tooltip | ||
| id: architecture:native-swift-tooltip |
There was a problem hiding this comment.
Main's packages/native/apple/Sources/Astryx/Thumbnail/Thumbnail.spec.md:88 (FR5, added in #8323 after this branch's base) still shows its label through architecture:native-swift-library-tooltip, and Thumbnail.spec.md:40 and AvatarStatusDot.spec.md:39 name records under packages/native/specs/swift/library/. They merge without a conflict, so update all three on the rebase, as Avatar and Icon got.
| | Compatibility/readiness | Additive: a new view and generated `AvatarProps`. Draft; built and tested on macOS and the iOS Simulator; device captures are attached to the change. | | ||
| | Review checks | Reject a size or shape beyond the contract, a disabled state, a link or button that draws differently from the static avatar, a layout that grows for the touch target, or a static avatar VoiceOver reads without a name. | | ||
| | Governing rules | `spec:AST-082` FR3, FR4, FR7; `spec:AST-093` FR1–FR5; the Swift component API (A1–A9), theme environment, and accessibility records under `packages/native/specs/swift/library/`. | | ||
| | Governing rules | `spec:AST-082` FR3, FR4, FR7; `spec:AST-093` FR1–FR5; the Swift component API (A1–A9), theme environment, and accessibility records under `packages/native/specs/swift/`. | |
There was a problem hiding this comment.
This row and FR8 (line 94) conflict with main, where #8328 rewrote the Contract at a glance and requirement tables for the status slot. On the rebase, keep main's rows and apply only the new path and tooltip id.
| generated node type, as `packages/native/specs/swift/library/slots.md` says, | ||
| generated node type, as `architecture:native-swift-slots` says, | ||
| and both build the view from the same `<Name>Props` values; the view's `body` | ||
| reads only those values and slots. |
There was a problem hiding this comment.
Main's library/component-api.md now ends A3 with "The two initializers are one API in two Swift spellings (architecture:public-component-api INV21): the labeled one builds the props the other takes." (#8532), and its Current state names AvatarStatusDot and Thumbnail. This record needs both after the rebase, and approved_at: 2026-10-25 predates them.
| - On `main`, the Swift package `packages/native/apple` holds generated props, | ||
| the wire, and the logic host, and no SwiftUI views. | ||
| - No Swift component has accessibility tests or an audit. | ||
| - The `Astryx` product in `packages/native/apple` holds the SwiftUI views |
0fa2289 to
ebc2d4e
Compare
There was a problem hiding this comment.
The conversion matches the record form, location and ids that knowledge-contracts INV27 and AST-093 FR1 set, and the rule text carries over unchanged, but approval waits on an engineering owner deciding whether the seven Swift rules, which main marks Status: draft, become authority: current or land as authority: draft with approved_by and approved_at null. An engineering owner records approval by commenting /approve-spec <full head SHA> on this pull request, and the author may do so as an engineering owner; since a new commit needs a new approval, these fixes are best made first:
- Seven comments in five Swift files still cite
library/tooltip.spec.md, which this change moves (TooltipPresenter.swift:41and:60,Avatar.swift:65,Thumbnail.swift:74,TooltipPresenterTests.swift:8and:137,AvatarTests.swift:209). - The accessibility record's Current state leaves AvatarStatusDot and Thumbnail out of the views with name and trait tests and says X2 and most of X6 are untested, though
ThumbnailTests.swiftandAvatarStatusDotTests.swifttest them. component-api.spec.mdsetsapproved_at: 2026-10-25, but its text includes main's edits of 2026-10-26.
[Automated review]
| template_version: 3 | ||
| kind: architecture | ||
| id: architecture:native-swift-library-tooltip | ||
| id: architecture:native-swift-tooltip |
There was a problem hiding this comment.
The id and the file move, but seven comments still cite library/tooltip.spec.md: packages/native/apple/Sources/Astryx/Tooltip/TooltipPresenter.swift:41 and :60, Sources/Astryx/Avatar/Avatar.swift:65, Sources/Astryx/Thumbnail/Thumbnail.swift:74, Tests/AstryxTests/TooltipPresenterTests.swift:8 and :137, and Tests/AstryxTests/AvatarTests.swift:209. Point them at architecture:native-swift-tooltip, as the swift-ios-theme.mjs header now points at its record.
| - Unit tests assert the accessible names and traits that Avatar, Banner, | ||
| Button, Heading, Icon, and TextInput set, and Button's Loading value; Card | ||
| and Text have no accessibility assertions. X2 and X3 have no tests; of X6, | ||
| only Bold Text is tested; and no Swift component has an accessibility audit | ||
| yet. |
There was a problem hiding this comment.
AvatarStatusDot and Thumbnail also have name and trait assertions (AvatarStatusDotTests.swift:30-33, :122-124; ThumbnailTests.swift:33-36). X2 has a test: ThumbnailTests.swift:57-62 keeps the open and remove buttons mounted while disabled or loading, which Thumbnail FR4 cites as X2. X6 has more than Bold Text: ThumbnailTests.swift:126-129 checks the Reduce Motion resting skeleton (Thumbnail FR2), and AvatarStatusDotTests.swift:37-54 checks each variant's own shape (AvatarStatusDot AR3, Differentiate Without Color).
| archive_reason: null | ||
| superseded_by: null | ||
| approved_by: cixzhang | ||
| approved_at: 2026-10-25 |
There was a problem hiding this comment.
This record carries main's 2026-10-26 text (A3's INV21 sentence and the AvatarStatusDot and Thumbnail Current-state lines), so by the rule in the description approved_at is 2026-10-26, or null if the seven land as draft.
ebc2d4e to
3421a90
Compare
There was a problem hiding this comment.
The conversion matches the record form, location and ids that knowledge-contracts INV27 and AST-093 FR1 set, the rule text carries over word for word, and the three fixes from the previous review are in. Approval now waits only on an engineering owner deciding whether the seven Swift rules, which main marks Status: draft, become authority: current or land as authority: draft with approved_by and approved_at null. An engineering owner records approval by commenting /approve-spec <full head SHA> on this pull request, and the author may do so as an engineering owner. Optionally, before that comment (a new commit needs a new approval), drop Increase Contrast from the X6 list in accessibility.spec.md, since X6 does not cover that setting.
[Automated review]
| AvatarStatusDot, Banner, Button, Heading, Icon, TextInput, and Thumbnail set, | ||
| and Button's Loading value; Card and Text have no accessibility assertions. | ||
| X2 is tested in part (Thumbnail's disabled buttons stay mounted and inert), | ||
| and so is X6 (Reduce Motion, Increase Contrast, and Bold Text, and |
There was a problem hiding this comment.
Optional: Increase Contrast is not one of X6's settings (Reduce Motion, Reduce Transparency, Bold Text, Differentiate Without Color, Button Shapes); its tests prove theme-environment E1's colorSchemeContrast row. Suggested: “and so is X6 (Reduce Motion, Bold Text, and AvatarStatusDot's status shown by shape as well as color)”. Best made before any /approve-spec, since a new commit needs a new approval.
e7102bb to
a6dca7f
Compare
There was a problem hiding this comment.
The conversion matches the record form, location and ids that knowledge-contracts INV27 and AST-093 FR1 set, and the rule text carries over word for word, but GitHub reports this branch as conflicting with main (from main's latest edit to library/component-api.md, whose wording component-api.spec.md already carries), so it needs a rebase first. After that, approval waits on an engineering owner deciding whether the seven Swift rules, which main marks Status: draft, become authority: current or land as authority: draft with approved_by and approved_at null. An engineering owner records approval by commenting /approve-spec <full head SHA> on the rebased head, and the author may do so as an engineering owner.
[Automated review]
7afe3aa to
3fd2b0e
Compare
There was a problem hiding this comment.
The conversion matches the record form, location and ids that knowledge-contracts INV27 and AST-093 FR1 set, the rule text carries over word for word, and the rebase has cleared the conflict with main. Approval now waits only on an engineering owner deciding whether the seven Swift rules, which main marks Status: draft, become authority: current or land as authority: draft with approved_by and approved_at null. An engineering owner records approval by commenting /approve-spec <full head SHA> on this pull request, and the author may do so as an engineering owner. Optionally, refresh the description's accessibility bullet, which still says X2 and X6 have no tests while the record now says both are tested in part.
[Automated review]
3fd2b0e to
7f12932
Compare
There was a problem hiding this comment.
The conversion matches the record form, location and ids that knowledge-contracts INV27 and AST-093 FR1 set, and the rule text carries over word for word. Approval waits on an engineering owner deciding whether the seven Swift rules, which main marks Status: draft, become authority: current or land as authority: draft with approved_by and approved_at null; an engineering owner records approval by commenting /approve-spec <full head SHA> on this pull request, and the author may do so as an engineering owner. Two small fixes are optional:
augmentable-variants.spec.mdOwning code places the generated variant types inSources/Astryx/, while V1's types come frompackages/native/src/contract/intoSources/AstryxNative/Generated/.theme-generator.spec.mdleavespackages/native/src/theme/swiftIOSTheme.test.ts, which holds the generator's tests, out ofverified_by.
[Automated review]
| ## Owning code | ||
|
|
||
| - `packages/native/scripts/` — the theme generator, which extends each augmentable type with a theme's own variants. | ||
| - `packages/native/apple/Sources/Astryx/` — the string-backed variant types and the views that draw them. |
There was a problem hiding this comment.
Not blocking: V1 has the contract generator emit the string-backed variant types, and generated contract types live in Sources/AstryxNative/Generated/ (today's ButtonVariant is in Generated/Button.swift). Name packages/native/src/contract/ and Sources/AstryxNative/Generated/ for V1, and keep Sources/Astryx/ for V2's Variants.swift and the views.
| owners: [cixzhang] | ||
| applies_to: [packages/native/] | ||
| verified_by: | ||
| [.github/scripts/native-swift.sh, scripts/check-package-boundaries.js] |
There was a problem hiding this comment.
Not blocking: the generator's G3, G4, G6–G8, G12 and G13 tests, the drift test included, are in packages/native/src/theme/swiftIOSTheme.test.ts, which native-swift.sh does not run. Add it here, as the description says verified_by names each rule's tests.
7f12932 to
b8d29bc
Compare
There was a problem hiding this comment.
The conversion matches the record form, location and ids that the knowledge-contracts architecture (INV27) and AST-093 set, the rule text carries over from main word for word, and the three Current-state updates hold against the code. Approval waits on one decision: the seven Swift rule sets are marked draft on main, and this pull request makes them authority: current. An engineering owner records that decision by commenting /approve-spec <full head SHA> on this pull request (the author may do so as an engineering owner); otherwise the seven can land as authority: draft with approved_by and approved_at null.
[Automated review]
… generator's tests and latest approval, and Item; component specs and headers cite the moved records
b8d29bc to
7ced8af
Compare
There was a problem hiding this comment.
The conversion matches the record form, location and ids that AST-093 FR1 and the knowledge-contracts architecture (INV27) set, and the rule text carries over from main word for word. Approval waits on one decision: the seven Swift rule sets are marked draft on main and this pull request makes them authority: current, so an engineering owner records that decision by commenting /approve-spec <full head SHA> (the author may do so as an engineering owner), or the seven land as authority: draft with approved_by and approved_at null. Either way, one fix is needed first:
packages/native/specs/swift/component-api.spec.mdline 10 should readapproved_at: 2026-11-01, since its text last changed onmainwith #8321, approved that day, and the description's sentence dating it to #8310 needs the same correction.
[Automated review]
| archive_reason: null | ||
| superseded_by: null | ||
| approved_by: cixzhang | ||
| approved_at: 2026-10-26 |
There was a problem hiding this comment.
approved_at should be 2026-11-01: this record carries main's text word for word, and that text last changed with #8321 (Item added to the Current state), whose final head carries the owner's /approve-spec of 2026-11-01. That is the same rule that moved theme-generator to 2026-11-01.
…ge that last edited it
There was a problem hiding this comment.
The conversion matches the record form, location and ids that AST-093 FR1 and the knowledge-contracts architecture (INV27) set, main's rule text carries over word for word, and component-api's approved_at now matches its last approved text. Approval waits on one decision: the seven Swift rule sets that main marks draft become authority: current here, so an engineering owner records that decision by commenting /approve-spec <full head SHA> on this pull request (the author may do so as an engineering owner), or the seven land as authority: draft with approved_by and approved_at null. The failing build and build-storybook checks come from a quoting error in .github/workflows/ci.yml that this pull request does not touch.
[Automated review]
There was a problem hiding this comment.
The conversion matches the record form, location and ids that AST-093 FR1 and the knowledge-contracts architecture (INV27) set, and main's rule text carries over word for word. Approval waits on one decision: the seven Swift rule sets that main marks draft become authority: current here, so an engineering owner records that decision by commenting /approve-spec <full head SHA> on this pull request (the author may do so as an engineering owner), or the seven land as authority: draft with approved_by and approved_at null. Nothing else needs to change.
[Automated review]
Maintainer impact
The rules shared by every Swift component live in
packages/native/specs/swift/library/*.mdin a package-only format: no frontmatter, no owner, and nospecs:forroute. A contributor changing Swift code gets no list of the rules that govern it, and a change to those rules gets no spec-owner gate. This PR turns each one into an architecture record, so they behave like every other spec. It is split out of #8288 (which makescheck:knowledgerequire this) so each part stays under the review size limit.Intended invariant
Each Swift shared rule is one architecture record at
packages/native/specs/swift/<slug>.spec.mdwith idarchitecture:native-swift-<slug>. The approved text is unchanged; only its sections are renamed into the architecture template. The native package keeps no spec template of its own: a native component's spec, which now sits beside core's indocs/specs/components/, is built from the repository's component template like every other component record.Change
authority: current, withapproved_atset to the date main last approved each text:verified_bynames.github/scripts/native-swift.shplus each rule's tests.augmentable-variantsOwning code names the contract generator and the generated variant types inSources/AstryxNative/Generated/;theme-generatorlistsswiftIOSTheme.test.tsinverified_by.tooltip.spec.md, already a draft record inlibrary/(idarchitecture:native-swift-library-tooltip), moves beside the others. Stated update: its id changes fromarchitecture:native-swift-library-tooltiptoarchitecture:native-swift-tooltip, the id its new path derives; its text is unchanged. Avatar's FR8 and Thumbnail's FR5, the only records on main that cite it, now cite the new id. (knowledge-paths.test.mjskeeps the oldlibrary/path only as a path-derivation example.)styles: the views exist, and there's no public style yet;slots: the typedIconNameslot exists, and Icon draws the built-in names as SF Symbols;accessibility: which views exist (now including Item) and which names, traits and values the unit tests assert (Avatar, AvatarStatusDot, Banner, Button, Heading, Icon, TextInput, Thumbnail, plus Item's selected trait). Card and Text have no assertions. X2 and X6 are tested in part, X3 has no tests, and there's no audit yet.approved_atis the date the record's current text was last approved on main.theme-environmenttook its latest approved text with feat(native): Swift Button takes core's props; every view reads typed tokens #8310, whose final head carries the owner's/approve-specof 2026-10-26, so it moves from 2026-10-25 to 2026-10-26.component-apitook its latest text with feat(native): Swift Item draws core's row with typed slots, as a link or a button #8321, approved by/approve-specon 2026-11-01, so it is dated 2026-11-01.theme-generatortook its latest text with feat(native): Swift theme generator reads the CSS colors and lengths its spec lists #8420 and feat(native): Swift theme generator warns on lossy values and falls back for impossible ones #8422, whose final heads carry the owner's/approve-specof 2026-11-01, so it moves from 2026-10-25 to 2026-11-01. Approving this pull request also approves those three dates.packages/native/specs/TEMPLATE.mdandlibrary/are removed. The specs READMEs describe the records, say tooltip is the one draft, and keep main's location for native component specs beside core's.library/files are updated:apple/README.md, theswift-ios-theme.mjsheader, the Swift specs for Icon, Button, TextInput and Item, Avatar's (its FR8 now citesarchitecture:native-swift-tooltip), thecss-values.mjsheader, and one path inknowledge-paths.test.mjs. Cross-references inside the records name each other by id.pnpm check:knowledgereads native specs; feat(knowledge): check every specification in the repository as a knowledge record, and convert the native specs #8288 adds that once it does.Evidence
library/text section for section, including References, apart from the three Current-state updates. Main's later edits (tocomponent-api,theme-environment, and feat(native): Swift theme generator reads the CSS colors and lengths its spec lists #8420's and feat(native): Swift theme generator warns on lossy values and falls back for impossible ones #8422's rewrites oftheme-generator) carry into the records word for word, checked by script section for section.specs/swift/library/orspecs/TEMPLATE.md.pnpm check:knowledgepasses, and it now validates records underpackages/native/specs/(kindarchitecture, path-derived id): a record changed tokind: bogusfails it.pnpm specs:for --unreachedreports no unreached current record.Scope
Writing rubric results
The approved text is unchanged. The rubric was run over the added sections, the Current-state updates, and the AST-093 bullet:
Testing
pnpm check:knowledge.pnpm vitest run --project node .github/scripts/knowledge-paths.test.mjs scripts/specs-for-file.test.mjs packages/native(all pass).