Repository navigation
ci: main's full unit run starts every leg at once, six UI and six Node legs, and a dispatch can name its commit (AST-030 FR22) - #9207
Conversation
…e legs, and a dispatch can name its commit (AST-030 FR21)
|
The latest updates on your projects. Learn more about Vercel for GitHub.
|
|
AI review status for this pull request.
|
PR Analysis Report🔎 Preview ·
|
| Package | Where | Signature | Usage | |
|---|---|---|---|---|
| + | core |
. · Types · interface FieldStatusProps |
message: string |
import type {FieldStatusProps} from '@astryxdesign/core'; const x: FieldStatusProps = {message: …} |
| + | core |
. · Types · interface FieldStatusProps |
ref?: React.Ref<HTMLDivElement> |
import type {FieldStatusProps} from '@astryxdesign/core'; const x: FieldStatusProps = {ref: …} |
| + | core |
. · Types · interface FieldStatusProps |
type: InputStatusType |
import type {FieldStatusProps} from '@astryxdesign/core'; const x: FieldStatusProps = {type: …} |
| + | core |
. · Types · interface FieldStatusProps |
variant?: FieldStatusVariant = 'attached' |
import type {FieldStatusProps} from '@astryxdesign/core'; const x: FieldStatusProps = {variant: …} |
| + | core |
. · Types · interface FieldStatusProps |
xstyle?: StyleXStyles |
import type {FieldStatusProps} from '@astryxdesign/core'; const x: FieldStatusProps = {xstyle: …} |
| + | core |
. · Types · interface FieldStatusProps |
inherits AriaAttributes, DOMAttributes, HTMLAttributes |
import type {FieldStatusProps} from '@astryxdesign/core' |
| + | core |
. · Types · interface SearchContext |
interface SearchContext<T extends SearchableItem = SearchableItem> |
import type {SearchContext} from '@astryxdesign/core' |
| + | core |
./Typeahead · Also exported from an earlier entry point · SearchContext |
SearchContext (.) |
import {SearchContext} from '@astryxdesign/core/Typeahead' |
| ~ | core |
. · Components · component ComplexSelector |
prop statusVariant?: FieldStatusVariant = 'attached' for input selectors; 'detached' for secondary and ghost selectors → prop statusVariant?: FieldStatusPlacement = 'attached' for input selectors; 'detached' for secondary and ghost selectors |
<ComplexSelector statusVariant="attached" /> |
| ~ | core |
. · Components · component DateInput |
prop statusVariant?: FieldStatusVariant = 'attached' → prop statusVariant?: FieldStatusPlacement = 'attached' |
<DateInput statusVariant="attached" /> |
| ~ | core |
. · Components · component DateRangeInput |
prop statusVariant?: FieldStatusVariant = 'attached' → prop statusVariant?: FieldStatusPlacement = 'attached' |
<DateRangeInput statusVariant="attached" /> |
| ~ | core |
. · Components · component Field |
prop statusVariant?: FieldStatusVariant = 'attached' → prop statusVariant?: FieldStatusPlacement = 'attached' |
<Field statusVariant="attached" /> |
| ~ | core |
. · Components · component FieldStatus |
component FieldStatus(props: FieldStatusProps) → component FieldStatus @deprecated |
<FieldStatus /> |
| ~ | core |
. · Components · component FieldStatus |
prop variant?: FieldStatusVariant = 'attached' → prop variant: FieldStatusVariant = 'attached' |
<FieldStatus variant="attached" /> |
| ~ | core |
. · Components · component FileInput |
prop statusVariant?: FieldStatusVariant = 'attached' → prop statusVariant?: FieldStatusPlacement = 'attached' |
<FileInput statusVariant="attached" /> |
| ~ | core |
. · Components · component MultiSelector |
prop statusVariant?: FieldStatusVariant = 'attached' for input selectors; 'detached' for secondary and ghost selectors → prop statusVariant?: FieldStatusPlacement = 'attached' for input selectors; 'detached' for secondary and ghost selectors |
<MultiSelector statusVariant="attached" /> |
| ~ | core |
. · Components · component NumberInput |
prop statusVariant?: FieldStatusVariant = 'attached' → prop statusVariant?: FieldStatusPlacement = 'attached' |
<NumberInput statusVariant="attached" /> |
| ~ | core |
. · Components · component PowerSearch |
prop statusVariant?: FieldStatusVariant = 'attached' → prop statusVariant?: FieldStatusPlacement = 'attached' |
<PowerSearch statusVariant="attached" /> |
| ~ | core |
. · Components · component Selector |
prop statusVariant?: FieldStatusVariant = 'attached' for input selectors; 'detached' for secondary/ghost selectors → prop statusVariant?: FieldStatusPlacement = 'attached' for input selectors; 'detached' for secondary/ghost selectors |
<Selector statusVariant="attached" /> |
| ~ | core |
. · Components · component TextArea |
prop statusVariant?: FieldStatusVariant = 'attached' → prop statusVariant?: FieldStatusPlacement = 'attached' |
<TextArea statusVariant="attached" /> |
| ~ | core |
. · Components · component TextInput |
prop statusVariant?: FieldStatusVariant = 'attached' → prop statusVariant?: FieldStatusPlacement = 'attached' |
<TextInput statusVariant="attached" /> |
| ~ | core |
. · Components · component TimeInput |
prop statusVariant?: FieldStatusVariant = 'attached' → prop statusVariant?: FieldStatusPlacement = 'attached' |
<TimeInput statusVariant="attached" /> |
| ~ | core |
. · Components · component Tokenizer |
prop statusVariant?: FieldStatusVariant = 'attached' → prop statusVariant?: FieldStatusPlacement = 'attached' |
<Tokenizer statusVariant="attached" /> |
| ~ | core |
. · Components · component Typeahead |
prop statusVariant?: FieldStatusVariant = 'attached' → prop statusVariant?: FieldStatusPlacement = 'attached' |
<Typeahead statusVariant="attached" /> |
| ~ | core |
. · Types · interface FieldStatusProps |
interface FieldStatusProps extends BaseProps<HTMLDivElement> (props of FieldStatus) → interface FieldStatusProps extends BaseProps<HTMLDivElement> |
import type {FieldStatusProps} from '@astryxdesign/core' |
| ~ | core |
. · Types · interface FieldStatusVariantMap |
tooltip: true → tooltip: true @deprecated |
import type {FieldStatusVariantMap} from '@astryxdesign/core'; const x: FieldStatusVariantMap = {tooltip: …} |
| ~ | core |
. · Types · interface SearchSource |
search: (query: string) => Promise<T[]> | T[] → search: (query: string, context?: SearchContext<T>) => Promise<T[]> | T[] |
import type {SearchSource} from '@astryxdesign/core'; const x: SearchSource = {search: …} |
| ~ | core |
. · Types · interface UseInputStatusIconOptions |
statusVariant?: FieldStatusVariant → statusVariant?: FieldStatusPlacement |
import type {UseInputStatusIconOptions} from '@astryxdesign/core'; const x: UseInputStatusIconOptions = {statusVariant: …} |
| ~ | richtext |
. · Components · component RichTextEditor |
prop statusVariant?: FieldStatusVariant = 'attached' → prop statusVariant?: FieldStatusVariant | 'tooltip' = 'attached' |
<RichTextEditor statusVariant="tooltip" /> |
Not run on this PR: add ci:run-visual, ci:run-a11y or ci:run-rtl to run them.
CI impact: 0 job-min per update · pool 0% · standard runners · 1 other workflow changed (not measured) · 1 CI action or script file changed (not measured)
| Before | After | Change | |
|---|---|---|---|
| Job-minutes per PR update | 78.6 | 78.6 | 0 |
| Runner pool, runner-minutes a day | 36,679 | 36,679 | 0 (0%) |
| Average concurrent jobs | 25.5 | 25.5 | 0 |
| Time to green (median → this run) | 14.6 min | — | — |
| Runs a day | 466 | 466 | 0 |
Other workflows: deploy.yml changed: runs on push, workflow_dispatch; standard runners; its minutes are not measured here
Not measured (the jobs that use these keep their recent minutes above): .github/scripts/main-validation-workflow.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.
Current run: CI concluded failure; parts of this report may be missing.
Generated by PR Enrichment workflow | View full report
There was a problem hiding this comment.
Approval waits on an engineering owner's decision on the new spec:AST-030 FR21 and DEC-15. An engineering owner records it by commenting /approve-spec <full head SHA> on this pull request, or asks for changes; the author can do this as an engineering owner. Separately, these need fixing before merge:
- DEC-15 and the new
deploy.ymlcomment saymain's full checks run on a cadence, not on every push, but the Main workflow still runs on every push, as FR12 requires: reword them, or amend FR12 together with a trigger change. - A
shadispatch shares themain-validationgroup, so it can replace a waiting validation of newer commits, or withrecheckcancel the running one, and leave those commits without a result: giveshadispatches a group of their own and add test cases. - A
shaolder than the tip's workflow steps fails for that reason alone (for example, any commit before #9161 lacks thepackage-size.mjsscript the typecheck lane now runs): refuse such commits inmain-commitor guard those steps. - In a
sharun,sync-exportsstill checks outmain's tip: give itneeds: [main-commit]and that commit as itsref.
[Automated review]
| concurrency: | ||
| group: 'main-validation' | ||
| cancel-in-progress: false | ||
| cancel-in-progress: ${{ github.event_name == 'workflow_dispatch' && inputs.recheck && github.triggering_actor == 'github-actions[bot]' }} |
There was a problem hiding this comment.
A sha dispatch joins this group, and a dispatch that names an older commit validates only that commit. It replaces a waiting push run for a newer commit. With recheck from the workflow token it also cancels the running one, because this expression never reads sha. The newer commits then get no Main result until the next push. A concurrency group of its own for a sha dispatch, keyed by the run, keeps them covered, and test cases would pin it.
| if (!['identical', 'ahead'].includes(comparison.status)) { | ||
| throw new Error(`${requested} is not in main's history.`); | ||
| } | ||
| sha = requested; |
There was a problem hiding this comment.
This accepts any commit in main's history, but the run uses the tip's workflow against that commit's files. A commit before #9161 has no .github/scripts/package-size.mjs, so the typecheck lane fails on a missing script. Refusing a commit whose deploy.yml differs from the tip's, or guarding those steps, avoids a red run that says nothing about the commit.
| `main`'s full checks run on a cadence and on demand during a release, not on | ||
| every push, so one run may cost more runner-minutes if it finishes sooner: the |
There was a problem hiding this comment.
This premise does not hold for the Main workflow: it still runs on every push (push: branches: ['main'] is unchanged), as FR12 requires ("Main's own fast checks still run for every push"). Either justify the extra legs per push, or amend FR12 and the trigger in the same change.
There was a problem hiding this comment.
Approval waits on an engineering owner's decision on the new spec:AST-030 FR22, its Verification row and DEC-17. An engineering owner records it by commenting /approve-spec <full head SHA> on this pull request, or asks for changes; the author may do this as an engineering owner. Separately, these need fixing before merge:
- DEC-17 and the new
deploy.ymlcomment saymain's full checks run on a cadence, not on every push, but the Main workflow still runs on every push, as FR12 requires: reword them, or amend FR12 together with a trigger change. - A
shadispatch shares themain-validationgroup, so it can replace a waiting validation of newer commits, or withrecheckcancel the running one, and leave those commits without a result: giveshadispatches a group of their own and add test cases. - A
shaolder than the tip's workflow steps fails for that reason alone (any commit before #9161 lacks thepackage-size.mjsscript the typecheck lane runs): refuse such commits inmain-commitor guard those steps. - In a
sharun,sync-exportsstill checks outmain's tip: give itneeds: [main-commit]and that commit as itsref.
[Automated review]
|
/approve-spec 7983fd9 |
# Conflicts: # docs/specs/AST-030/spec.md
There was a problem hiding this comment.
Approval waits on an engineering owner's decision on the new spec:AST-030 FR22, its Verification row and DEC-17 at the head that merges: the /approve-spec given for the previous head stopped counting when the merge commit was pushed. An engineering owner records it by commenting /approve-spec <full head SHA> on this pull request, or asks for changes; the author may do this as an engineering owner. Separately, these need fixing before merge:
- The merge commit reformats
packages/core/src/MultiSelector/MultiSelector.tsx, which fails the requiredlintcheck for a missing changeset: restoremain's version of the file. - DEC-17 and the new
deploy.ymlcomment say this run happens on a cadence, but it still runs on every push, as FR12 requires: reword them, or amend FR12 together with a trigger change. - A
shadispatch shares themain-validationgroup, so it can replace or cancel the validation of newer commits: giveshadispatches a group of their own and test it. - A
shafrom before #9161 fails the typecheck lane on a missing script, and in asharunsync-exportsstill checks the tip: refuse or guard the first, and givesync-exportsthe resolved commit.
[Automated review]
| el.tabIndex = -1; | ||
| } | ||
| }, triggerModality.ref, ref), | ||
| ref: mergeRefs<HTMLElement>( |
There was a problem hiding this comment.
This reformat came in with the merge of main and changes only whitespace and one trailing comma, but it makes the required lint check fail: changeset coverage reports @astryxdesign/core shipping without a Changeset. Restoring main's version of this file keeps the pull request to its CI change and turns lint green.
| every Vitest leg of `main`'s full unit run at once, with no `max-parallel` | ||
| hold: six UI legs and six Node legs beside the build-and-typecheck lane, each | ||
| inside the fifteen-minute job budget (DEC-17). A dispatch may name `sha`, a | ||
| commit in `main`'s history, and every lane checks that commit out; without |
There was a problem hiding this comment.
sync-exports in deploy.yml has no needs: [main-commit] and no ref, so in a sha run it checks main's tip while the other lanes check the requested commit. Giving it needs: [main-commit] and ref: ${{ needs.main-commit.outputs.sha }} makes this sentence true.
There was a problem hiding this comment.
Approval waits on an engineering owner's decision on the new spec:AST-030 FR22, its Verification row and DEC-17 at the head that merges: the earlier /approve-spec named a previous head, so an engineering owner, the author included, records the decision by commenting /approve-spec <full head SHA> on this pull request, or asks for changes. Restoring MultiSelector.tsx cleared the earlier lint failure; these still need fixing before merge:
- DEC-17 and the new
deploy.ymlcomment say this run happens on a cadence, but it still runs on every push, as FR12 requires: reword them in per-push terms, or land this after #9213. - A
shadispatch shares themain-validationgroup, so it can replace the waiting run for a newer push, and a workflow-tokenrecheckthat namesshacan cancel one: giveshadispatches a group of their own and test both cases. - A
shafrom before #9161 fails the typecheck lane on a missing script, and asharun'ssync-exportsstill checks the tip: refuse the first with a named reason and givesync-exportsthe resolved commit.
[Automated review]
|
/approve-spec fad680a |
…commit before the package-size measurement, and checks sync-exports out at it (AST-030 FR22)
|
/approve-spec 9ad2862 |
There was a problem hiding this comment.
Changes requested: the spec text is owner-approved at this head, but the sha dispatch and the description need fixes before merge.
- The package-size check still accepts the 40 commits from #9161 up to #9164, whose
analyze-pr.jslacks the--main-recordflag the typecheck lane runs, so validating one of them goes red: raise the floor to #9164, amend FR22 to match, and test a commit in that window. - The description says
mainnow runs this on a cadence instead of on every push, but the push trigger stays until #9213 lands, so the extra runner-minutes land on every push: correct it, or land this after #9213. - A
shaof only spaces is trimmed to the tip yet still gets its own concurrency group, so it runs a second validation ofmain: drop the trim so it fails. - A
sharun's checks attach tomain's tip commit: add arun-namethat names the validated commit.
[Automated review]
| // The typecheck lane measures package size with this script; | ||
| // a commit from before it cannot run that lane. | ||
| try { | ||
| await github.rest.repos.getContent({ | ||
| ...context.repo, path: '.github/scripts/package-size.mjs', ref: requested, | ||
| }); | ||
| } catch (error) { | ||
| if (error.status !== 404) throw error; | ||
| throw new Error(`${requested} predates the package-size measurement this run's typecheck lane takes; validate a later commit.`); | ||
| } |
There was a problem hiding this comment.
This floor admits the 40 commits from #9161 up to #9164: they have package-size.mjs, but their analyze-pr.js has no --main-record, which the typecheck lane runs at line 188. That older script ignores the flag, runs the pull-request analysis against a main ref the SHA checkout lacks, and exits 1, so the run goes red for a commit that may be fine. Requiring #9164's commit to be an ancestor of the requested one (the same compareCommitsWithBasehead check as above) closes the window; FR22's floor and a contract case need the same change.
| if (context.eventName !== 'push') { | ||
| const {data} = await github.rest.repos.getBranch({...context.repo, branch: 'main'}); | ||
| sha = data.commit.sha; | ||
| const requested = (context.payload.inputs?.sha ?? '').trim(); |
There was a problem hiding this comment.
The concurrency group at line 31 tests the raw input, but this trims it, so a sha of only spaces gets a group of its own and then validates main's tip beside the running main-validation run. Dropping .trim() makes any non-empty value meet the 40-character check; a spaces-only case belongs in the malformed list of the contract test.
| branches: ['main'] | ||
| workflow_dispatch: | ||
| inputs: | ||
| sha: |
There was a problem hiding this comment.
A dispatch's run belongs to main's tip when it was dispatched, so a sha run's test, leg and typecheck checks attach to that tip and the run is listed under the tip's commit message. A run-name that names the validated commit for a sha dispatch (empty, and so the default, otherwise) keeps a failing older commit from reading as a red check of the tip.
…cords and only-spaces input, and is named for that commit (AST-030 FR22)
There was a problem hiding this comment.
Approval waits on an engineering owner's decision on the new spec:AST-030 FR22, its Verification row and DEC-17: the latest commit changed FR22's sha floor after the last approval, so an engineering owner (the author may, as one) records the decision by commenting /approve-spec <full head SHA> on the pull request. The branch now conflicts with main's AST-030 (FR19 and its Verification row, from #9187), so please resolve that first and have the approval land on the head that will merge. Separately, the description's Dispatch line and the sha input's description in deploy.yml should say that commits before #9164 are refused, since main-commit rejects them. The earlier floor, spaces-only sha, run-name and cost-wording findings are fixed at this head.
[Automated review]
| workflow_dispatch: | ||
| inputs: | ||
| sha: | ||
| description: 'Full SHA of a commit in main history to validate; empty validates main tip' |
There was a problem hiding this comment.
This is the text a person sees in the dispatch form, and it promises any commit in main's history, but main-commit refuses every commit before #9164 (lines 73-83). Suggest 'Full SHA of a commit in main history from #9164 on to validate; empty validates main tip', and the same floor in the description's Dispatch line.
# Conflicts: # docs/specs/AST-030/spec.md
|
/approve-spec 1720978 |
There was a problem hiding this comment.
Changes requested: the spec:AST-030 FR22, Verification row and DEC-17 text is owner-approved at this head, but the dispatch wording promises more than main-commit accepts. The description's Dispatch line and the sha input's description in deploy.yml say that any commit in main's history can be validated, while main-commit refuses every commit before #9164. Please say "a commit in main's history from #9164 on" in both places and list that refusal with the others. Because that edit changes deploy.yml, an engineering owner (the author may, as one) then records the spec approval again with /approve-spec <full head SHA> on the new head.
[Automated review]
|
/approve-spec 2dec806 |
There was a problem hiding this comment.
Recommended for approval: spec:AST-030 FR22, its Verification row and DEC-17 are owner-approved at this head, and the sha input and the description now both say that commits before #9164 are refused, which resolves the earlier change request. FR22's contract test, main-validation-workflow.test.mjs, passes at this head. The failing Touched components job is advisory and fails only because this branch predates main's touched-components.mjs; it feeds no required check.
[Automated review]
…ame their commit; a person's newer run replaces an incomplete one
Maintainer impact
main's full unit run (the Main workflow) split each Vitest project into four legs. Its slowest Node leg took about 8 minutes, and over the last two days the run took a median of 10 minutes and 15 at the 90th percentile. The release train waits on that before it can re-check a fix.max-parallelhold. Measured: every leg took 3–5.2 minutes, and the run took 5.5 minutes. The floor is one Node test file that takes about 6 minutes on its own; more legs would not move it.mainuntil the hourly unit-run change (ci: main's full unit run is about hourly and always finishes; a release needs one at its cut (AST-030 FR21) #9213) lands, so until then the extra minutes land on every push.CI impact: standard GitHub-hosted runners only, no runner class changes; pull-request updates unchanged (
ci.ymluntouched); Main's unit run goes from 51 to 54 runner-minutes per run, about +225 runner-minutes a day at today's ~75 runs (about +0.2 average concurrent jobs, peak 10 → 14 jobs per run); time to green formain's unit run goes from a 10-minute median to 5.5 minutes.sha, a commit inmain's history from ci: drop the size-base job; Main keeps every component's sizes and pull requests read the merge base's record #9164 on, and every lane checks it out; such a run is named for that commit and runs in a concurrency group of its own. Without it the run validatesmain's tip, as before. A commit outsidemain's history, a commit from before ci: drop the size-base job; Main keeps every component's sizes and pull requests read the merge base's record #9164 (whose scripts cannot keep this run's size records), or a value that is not a full SHA (only spaces included) fails before any leg starts.rechecklets a release re-check sent with the workflow token take the validation group, cancelling the running validation; that re-check is itself a full validation ofmain's tip. A person's dispatch cannot cancel anything.ci.yml, the push trigger, thetestjoin and every lane's commands.Authority
Asked for by the Astryx TL: run
main's full checks less often, "but we need to speed up these runs when they happen with more parallelization. It can be more expensive per run with runs less often or on demand during release." This PR addsspec:AST-030FR22 and DEC-17 and needs an owner's/approve-specat this head.Changes
.github/workflows/deploy.yml:test-uiandtest-node: six legs each, withtimeout-minutes: 15.shaandrecheckinputs.main-commitvalidates the requested commit..github/scripts/main-validation-workflow.test.mjs: contract tests for the leg plan, the dispatch inputs, the cancel rule, and the commit resolver (push, tip, a commit inmain's history, outside it, malformed).spec:AST-030: FR22, a Verification row, and DEC-17.Evidence
ci-test-routing,ci-free-runners,ci-heavy-lanes,workflow-paths. That is 131 tests.pnpm check:knowledgepasses.main's own validations. It validatedmain's tip and passed in 5.5 minutes from dispatch to thetestjoin, against a median of 10 and a 90th percentile of 15 before.Scope
main's full unit run.Writing rubric results