forked from blockscout/frontend
-
Notifications
You must be signed in to change notification settings - Fork 0
Sync upstream v2.11.0 #31
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Merged
Merged
Changes from all commits
Commits
Show all changes
78 commits
Select commit
Hold shift + click to select a range
9384c68
fix: add corepack retry + build cache write-back
25c01d7
fix: address review — base stage, set -eu, linear backoff, ignore-error
e1949e0
fix: switch build cache from GHA to registry (ghcr)
81c5bfb
fixup: soften comment — not GitHub-hosted runners
4b7b74c
fix: scope build cache tag by platform set
alik-agaev 7d894d9
fix: address review — pipefail on cache tag, read amd64 cache on rele…
alik-agaev 7ae4826
docs: correct caller enumeration in cache comments
alik-agaev 3e8f493
Merge pull request #3599 from blockscout/fix/corepack-cache-retry
alik-agaev 39bb7b3
chore: install worktree deps on demand and retire landed worktrees
tom2drum da93fde
fix: upgrade dotenv-cli so preset envs with a bare $ load (#3604)
tom2drum 4ce72df
Spec: migrate block countdown from API v1 getblockcountdown to API v2
tom2drum 606c598
chore: pin @blockscout/api-types beta carrying the v2 countdown schema
tom2drum 696c7d6
Fixes for release v2.10.0 (#3597)
tom2drum 269fae4
Add a code review step to the agent task workflow (#3606)
tom2drum dcbd827
Deduplicate the local run scripts and fold the profiling build into `…
tom2drum 4653e1f
Tighten the agent doc-reference checker and fix the paths it was hidi…
tom2drum c66c6e7
Build production bundles with webpack — Turbopack miscompiles the Dyn…
tom2drum 1a39a49
Silence no-console in the perf trace script
tom2drum 7ad9f80
Add DatePicker and TimePicker to the design system (#3603)
tom2drum 5b6048c
Stop production builds from leaving generated files in the working tr…
tom2drum 82aab9b
Keep the team roster a registry and the routing rules in the skills
tom2drum c72bca0
Turn TEAM.md into a general Slack directory and centralize IDs
tom2drum 18895ca
Display the fee payer and batched calls on the transaction details pa…
tom2drum ee4b368
Display the fee payer and batched calls on the transaction details pa…
tom2drum 204ad14
chore: retarget the countdown spec at the v11.2.4 API contract
tom2drum e5ed9af
Merge branch 'main' into release/v2.10.1
tom2drum 9afd8b6
Merge pull request #3612 from blockscout/release/v2.10.1
tom2drum 2e0ff17
feat: move the block countdown page to the API v2 endpoint
tom2drum d51c129
Mark verification task as done
tom2drum 68278e7
chore: close out the block countdown spec
tom2drum 78393b6
Merge branch 'main' of github.com:blockscout/frontend into tom2drum/t…
tom2drum 1d60062
Merge remote-tracking branch 'origin/main' into issue-3583
tom2drum caa680e
Merge pull request #3605 from blockscout/issue-3583
tom2drum a2c5368
Add the "scan" keyword to the home page meta description and footer copy
tom2drum 599e2f8
Make the spec an index of decisions, not a worklog
tom2drum a4d6257
Rework the PR template and wire minimum API versions into releases
tom2drum 5cc4635
Keep issue references out of task commit messages
tom2drum d228275
update screenshots
tom2drum 35d6fa9
Address round-1 review on the workflow docs
tom2drum 9543605
Merge pull request #3617 from blockscout/issue-3616-scan-keyword
tom2drum 50e3eb9
Merge pull request #3618 from blockscout/tom2drum/team-updates
tom2drum bd69c07
Remove RPC icon from homepage degraded view (#3619)
tom2drum b228264
fix multisend dapp page
tom2drum d082c2c
Clean up Rollbar noise from the deferred error-reporting listeners (#…
tom2drum 4911a20
Fix cross-chain In/Out tag always showing "In" on multichain instance…
tom2drum d3d4e13
Send WALLET_CONNECT analytics from the login flow (#3622)
tom2drum 2eec270
update unit tests rule
tom2drum b57dcd6
Reduce noisy JavaScript errors reported to Rollbar (#3625)
tom2drum 618a794
Token page: prime address query, split loading states, and skip JSON …
tom2drum 194522b
Restructure the product task workflow around vertical subtasks (#3629)
tom2drum b5777b9
Don't feed the placeholder dapp URL to the marketplace iframe (#3630)
tom2drum fe1b071
Key token transfer rows by token id so rows stop surviving pagination…
tom2drum 779e056
Keep scam tokens out of the address token list when they arrive over …
tom2drum 69802d5
Replace the Slack-only issue skill with a generic create-issue workfl…
tom2drum 73171c9
update grilling skill
tom2drum e0d8d66
Keep flashblocks rendering one at a time as the block interval drops …
tom2drum 56b1852
Show contract deployer as an eligible signer in the address verificat…
tom2drum b454df3
Add a skill that turns Slack config requests into exact env vars for …
tom2drum 9897b37
Rename OP Stack Flashblocks to Subblocks in the UI (#3643)
tom2drum e4bfcae
Let a skin request run unattended to the demo link
tom2drum b779051
Move production builds back to Turbopack on Next.js 16.3.1 (#3645)
tom2drum 62343f1
Fix chain switch error blocking L2→L1 withdrawal claims (#3646)
tom2drum 9269228
Show transaction status, action, and timestamp in social link preview…
tom2drum 92aa834
Add token-transfer filter link to address hover tooltips (#3648)
tom2drum 4666651
Migrate the TAC operations views to Read API v2 (#3635)
tom2drum 97192e4
Persist Linux pnpm store to speed up Playwright Docker deps installs
tom2drum 7526ccd
Give review findings referenceable IDs and let the reviewer own threa…
tom2drum f1c5967
Dropdown menu "Other": padding (#3651)
tom2drum f685620
Add a time-zone toggle to the CSV export dialog (#3649)
tom2drum e343b44
Stop false "N more transfers" notices on the NFT instance transfers t…
tom2drum a454f50
Add an expedited-review payment section to the token info application…
tom2drum 65b6f5d
[skip ci] clean .env.extra
tom2drum 080a1c4
Restructure the product task workflow docs and skills (#3657)
tom2drum 7e5969a
chore: prepare release v2.11.0
tom2drum 0b83e4f
Fix OP withdrawal claim after connecting a wallet on L2.
tom2drum c09e173
Surface batch-transaction recipients in the tx details To & Value fie…
tom2drum 7895a8b
WIP: Merge upstream v2.11.0 (has conflicts)
github-actions[bot] 6122263
fix(sync): resolve merge conflicts in cross-chain token transfers and…
JOY File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
There are no files selected for viewing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -1,60 +1,169 @@ | ||
| # Team roster for product tasks | ||
| # Team & Slack directory | ||
|
|
||
| The teams involved in product tasks, with the members an agent may need to reach. Teams have several | ||
| people — during a grilling session (`grill-the-task`) the developer picks **one contact per relevant team | ||
| for the task**; the picks are recorded in the spec header and open questions are routed to those contacts. | ||
| The member marked **default** is the fallback when the developer has no task-specific pick. | ||
| The people, teams, and channels the team reaches on Slack, and the IDs needed to address them. This file is | ||
| the **single source of truth** for turning a name into a Slack ID: refer to people, teams, and channels **by | ||
| name** in specs, skills, and requests, and resolve the ID here whenever you actually need to send a message | ||
| or build a mention or link. It is a registry only — *who* gets asked *what* is routing policy that lives in | ||
| the skills that read it. | ||
|
|
||
| Slack **member IDs** are stored deliberately so routing is deterministic (no runtime name lookup). They are | ||
| workspace-scoped identifiers, not credentials — knowing one grants no access. To find yours in Slack: | ||
| A **✓** in a team's *Default* column flags that team's fallback member — the one to contact when a request | ||
| doesn't name a specific person. | ||
|
|
||
| Slack IDs are stored so addressing is deterministic (no runtime name lookup). They are workspace-scoped | ||
| identifiers, **not credentials** — knowing one grants no access. To find your own member ID in Slack: | ||
| your profile → **⋯ More** → **Copy member ID**. Do not add emails to this file. | ||
|
|
||
| ## How to address | ||
|
|
||
| - **Person** — the *Slack member ID* (`U…`) from the People table. Mention as `<@U…>`; to DM, pass the ID as | ||
| the channel to the send tool. | ||
| - **Team / group** — the *Slack group ID* (`S…`) from the Groups table. Mention as `<!subteam^S…>`. | ||
| - **Channel** — the *Channel ID* (`C…`). Pass it as the channel target when sending; refer to it in prose by | ||
| its `#name`. | ||
| - **Permalink** — `https://blockscout.slack.com/archives/<channel-id>/p<message-ts>` (the message timestamp | ||
| with the dot removed). | ||
|
|
||
| ## Product managers | ||
|
|
||
| Own: product intent, scope, priorities, user stories, acceptance. | ||
|
|
||
| | Name | GitHub | Slack member ID | Focus | | | ||
| | --- | --- | --- | --- | --- | | ||
| | Ulyana | @ulyanas | U024DUPJG3A | | default | | ||
| | Nikita S. | @NikitaSavik | U05BR9QEYKB | | | | ||
| ### People | ||
|
|
||
| | Name | GitHub | Slack member ID | Default | | ||
| | --- | --- | --- | --- | | ||
| | Ulyana | @ulyanas | U024DUPJG3A | ✓ | | ||
| | Nikita S. | @NikitaSavik | U05BR9QEYKB | | | ||
|
|
||
| ## Designers | ||
|
|
||
| Own: mockups, missing screens/states, visual decisions. | ||
|
|
||
| | Name | GitHub | Slack member ID | Focus | | | ||
| | --- | --- | --- | --- | --- | | ||
| | Tatyana | @tgladilina | U039P3QLP0A | | default | | ||
| ### People | ||
|
|
||
| | Name | GitHub | Slack member ID | Default | | ||
| | --- | --- | --- | --- | | ||
| | Tatyana | @tgladilina | U039P3QLP0A | ✓ | | ||
|
|
||
| ## Core API | ||
|
|
||
| Own: core API endpoints and response models, field propagation across services, backend release schedule. | ||
|
|
||
| ### People | ||
|
|
||
| | Name | GitHub | Slack member ID | Default | | ||
| | --- | --- | --- | --- | | ||
| | Victor | @vbaranov | U8L403FEG | ✓ | | ||
| | Nikita P. | @nikitosing | U0218K3MTC5 | | | ||
|
|
||
| ### Groups | ||
|
|
||
| ## Backend engineers | ||
| | Team | Slack group ID | | ||
| | --- | --- | | ||
| | Core API | S064H6TD6MA | | ||
|
|
||
| Own: API endpoints, response models, field propagation across services, backend release schedule. | ||
| ## Microservices API | ||
|
|
||
| | Name | GitHub | Slack member ID | Focus | | | ||
| Own: microservice API endpoints and their response models (metadata, stats, admin, interchain, etc.). | ||
|
|
||
| ### People | ||
|
|
||
| | Name | GitHub | Slack member ID | Focus | Default | | ||
| | --- | --- | --- | --- | --- | | ||
| | Victor | @vbaranov | U8L403FEG | Core API | default | | ||
| | Nikita P. | @nikitosing | U0218K3MTC5 | Core API | | | ||
| | Leonid | @lok52 | U01KDJWBCV7 | Microservices API | default | | ||
| | Evgenii | @EvgenKor | U026N2LB01E | Microservices API: Intercahin Indexer, TAC | | | ||
| | Leonid | @lok52 | U01KDJWBCV7 | | ✓ | | ||
| | Evgenii | @EvgenKor | U026N2LB01E | Interchain Indexer, TAC | | | ||
|
|
||
| ### Groups | ||
|
|
||
| | Team | Slack group ID | | ||
| | --- | --- | | ||
| | Microservices API | S064073HASK | | ||
|
|
||
| ### Channels | ||
|
|
||
| | Purpose | Channel | Channel ID | | ||
| | --- | --- | --- | | ||
| | Default for microservices questions | blockscout-rs | C03G1QASRJ8 | | ||
| | Metadata microservice | blockscout-metadata-service | C067RACJ99B | | ||
| | Admin RS microservice | blockscout-admin | C04TC4W81QV | | ||
| | Stats microservice | blockscout-stats-rs | C089CJF6P0X | | ||
|
|
||
| ## Frontend | ||
|
|
||
| Own: architecture, the delegation boundary. | ||
|
|
||
| | Name | GitHub | Slack member ID | Focus | | | ||
| | --- | --- | --- | --- | --- | | ||
| | tom | @tom2drum | U03MN1588AU | | default | | ||
| | Max | @maxaleks | UKP0RR9K9 | | default | | ||
| ### People | ||
|
|
||
| | Name | GitHub | Slack member ID | Default | | ||
| | --- | --- | --- | --- | | ||
| | tom | @tom2drum | U03MN1588AU | ✓ | | ||
| | Max | @maxaleks | UKP0RR9K9 | | | ||
|
|
||
| ### Channels | ||
|
|
||
| | Purpose | Channel | Channel ID | | ||
| | --- | --- | --- | | ||
| | Default for frontend questions | blockscout-frontend | C03MMUTQDNU | | ||
| | Ask a frontend engineer to prepare an instance's config | front-config-requests | C08D60ZL1QB | | ||
|
|
||
| ### Groups | ||
|
|
||
| | Team | Slack group ID | | ||
| | --- | --- | | ||
| | Frontend team | S0601760KT9 | | ||
|
|
||
| ## QA | ||
|
|
||
| Own: test plans, acceptance-criteria verification, regression coverage, release sign-off. | ||
|
|
||
| ### People | ||
|
|
||
| | Name | GitHub | Slack member ID | Default | | ||
| | --- | --- | --- | --- | | ||
| | Yan | @yvaskov | U05Q4R111PB | ✓ | | ||
| | Alyona | @alyonakostina | U08NCHV535X | | | ||
|
|
||
| ### Channels | ||
|
|
||
| | Purpose | Channel | Channel ID | | ||
| | --- | --- | --- | | ||
| | General questions | blockscout-qa | C059WER5EB1 | | ||
|
|
||
| ### Groups | ||
|
|
||
| | Team | Slack group ID | | ||
| | --- | --- | | ||
| | QA team | S06015J7WVD | | ||
|
|
||
| ## DevOps | ||
|
|
||
| Own: deployment and running-instance changes (env vars, image versions, restarts), CI/CD, and infrastructure. | ||
|
|
||
| ### People | ||
|
|
||
| | Name | GitHub | Slack member ID | Default | | ||
| | --- | --- | --- | --- | | ||
| | Nick | @nzenchik | U04RVGGEW4Q | ✓ | | ||
| | Alik | @alik-agaev | U06287SP35W | | | ||
|
|
||
| ### Channels | ||
|
|
||
| | Purpose | Channel | Channel ID | | ||
| | --- | --- | --- | | ||
| | General questions | blockscout-devops | C03K1932X1N | | ||
| | Requests to change a running instance (env vars, image versions, restarts, etc.) | blockscout-devops-requests | C050U1F2E9M | | ||
|
|
||
| ### Groups | ||
|
|
||
| | Team | Slack group ID | | ||
| | --- | --- | | ||
| | DevOps team | S061MTPLJHK | | ||
|
|
||
| ## Slack channels | ||
| ## Product channels | ||
|
|
||
| Product questions are asked **in a channel, not a DM**, so other teams (QA in particular) see the answers. | ||
| The default is the frontend channel below; a large feature may have its own dedicated channel — recorded in | ||
| the task's spec header — and then **all** of that task's questions go there. Channel posts always mention | ||
| the addressee by member ID. | ||
| Dedicated channels for specific large tasks — a single place to gather a feature's requirements and related | ||
| discussion. | ||
|
|
||
| | Purpose | Channel | Channel ID | | ||
| | --- | --- | --- | | ||
| | Default for product questions | blockscout-frontend | C03MMUTQDNU | | ||
| | Multichain explorer | blockscout-multichain-explorer | C08R0UNBE3A | | ||
| | Cross-chain transactions | dev-interchain | C0A7SALNLPL | |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,108 @@ | ||
| # 0001 — webpack for production builds, Turbopack for dev | ||
|
|
||
| | | | | ||
| | --- | --- | | ||
| | Status | superseded by 0003 | | ||
| | Date | 2026-08-04 | | ||
| | Deciders | @tom2drum | | ||
| | Supersedes | — | | ||
|
|
||
| ## Decision | ||
|
|
||
| **Production builds use webpack (`next build --webpack`). Dev keeps Turbopack (the Next 16 default).** | ||
|
|
||
| Applies to every entry point that emits a production bundle: | ||
|
|
||
| | Entry point | Bundler | | ||
| | --- | --- | | ||
| | `pnpm build` — what the `Dockerfile` runs for the shipped image | webpack | | ||
| | `pnpm build:next` | webpack | | ||
| | `pnpm prod:preset <alias>` — local production build, incl. perf measurements | webpack | | ||
| | `pnpm build:analyze`, `pnpm prod:preset <alias> --profile` | webpack (already were) | | ||
| | `pnpm dev`, `pnpm dev:preset`, `pnpm dev:local` | Turbopack | | ||
|
|
||
| Dev stays on Turbopack because it is roughly 3× faster to compile and the crash class below only | ||
| manifests in a minified production build. Production-build regressions are caught in QA rather than | ||
| by making every local dev start slower. | ||
|
|
||
| ## Why | ||
|
|
||
| ### Turbopack miscompiles the Dynamic-labs SDK | ||
|
|
||
| Turbopack's scope hoisting emits code that reads the SDK's `UserFieldEditorContext` through the | ||
| wrong binding. `useContext` therefore receives a non-context value, returns `undefined`, and the SDK | ||
| throws from its own `useUpdateUserWithModal`: | ||
|
|
||
| ``` | ||
| useUserUpdateRequest can only be used inside the context of DynamicContextProvider | ||
| ``` | ||
|
|
||
| The throwing component is the SDK's internal `SyncAuthFlow`, which the SDK itself renders *inside* | ||
| `UserFieldEditorContextProvider` — so in a correct build the context cannot be missing. It is a | ||
| bundler defect, not a provider-tree bug in our code. | ||
|
|
||
| Impact: **a hard crash on the initial load of every page**, for any instance configured with | ||
| `NEXT_PUBLIC_ACCOUNT_AUTH_PROVIDER=dynamic`. It is invisible in dev (unminified, no hoisting) and | ||
| was found only by running the `v2.10.0` image locally. The v2.10.0 release would have broken every | ||
| dynamic-auth instance on rollout; deployed instances were still on v2.9.4 and unaffected. | ||
|
|
||
| Bisected to [#3574](https://github.com/blockscout/frontend/pull/3574) (wallet-stack deferral, | ||
| subtask 4 of [#3566](https://github.com/blockscout/frontend/issues/3566)) — parent commit good, that | ||
| commit bad. The trigger could **not** be reduced to a single import: reverting the lazy `import()` | ||
| wrappers, the `_app.tsx` provider restructure, and the `@wagmi/core` dependency each left it broken. | ||
| That fits the mechanism — scope hoisting groups modules across the whole graph, so the trigger is an | ||
| emergent property of how #3574 reshaped it, and any future graph change could re-trigger it | ||
| somewhere else. Next 16.3.0 does not fix it. | ||
|
|
||
| ### webpack is also the faster bundle | ||
|
|
||
| Two options fixed the crash: `--webpack`, or `experimental.turbopackScopeHoisting: false`. The flag | ||
| turned out to be the expensive one. Production builds of `main`, medians of 3 | ||
| automated traces: | ||
|
|
||
| | Metric | Turbopack | Turbopack, hoisting off | **webpack** | | ||
| | --- | --- | --- | --- | | ||
| | M1 FCP | 432 ms | 790 ms | **501 ms** | | ||
| | M2 first API request | 60 ms | 142 ms | **57 ms** | | ||
| | M5 blocking time | 133 ms | 408 ms | **155 ms** | | ||
| | M6 JS before FCP | 1038 KB | 1064 KB | **697 KB** | | ||
| | Emitted chunk bytes | 49.2 MB | 53.4 MB | **21.4 MB** | | ||
| | Build time | 48 s | 41 s | 2.4 min | | ||
|
|
||
| Disabling scope hoisting nearly doubles FCP and triples blocking time while barely moving M6 (+2.5%) | ||
| — the cost lands in execution, not transfer, so M6 alone would not have caught it. webpack instead | ||
| *improves* pre-FCP JS by 341 KB (−33%) over the Turbopack build, more than any single lever in #3566 | ||
| delivered on its own. | ||
|
|
||
| The measurement harness lives in | ||
| `.agents/tasks/3566-main-page-loading-perf/tools/` (see its README). Absolute values come from | ||
| headless Chromium on a local server and are not comparable to the numbers in that task's spec table; | ||
| the within-comparison deltas are what the decision rests on. | ||
|
|
||
| ## Consequences | ||
|
|
||
| - **CI and image builds get slower** — webpack's compile step measured 84 s to 2.4 min across | ||
| machines and cache states, against 41–48 s for Turbopack, so budget roughly 2–3×. Accepted: | ||
| correctness plus a materially smaller bundle outweigh build latency. | ||
| - **Dev and production now use different bundlers.** A bug in either pipeline can only be caught on | ||
| that pipeline; production-only breakage will not appear in dev. QA runs against a real image. | ||
| - `next.config.js` must keep **both** the `webpack()` and `turbopack` sections in sync — it already | ||
| does, and this decision makes that non-optional. | ||
| - webpack surfaces one unresolvable import Turbopack silently tolerates: | ||
| `@react-native-async-storage/async-storage` inside `@metamask/sdk`, reached via | ||
| `@wagmi/connectors` → `@reown/appkit-adapter-wagmi` → `wagmi-config.ts`. It is an optional peer | ||
| dependency of a React Native code path a browser bundle never takes, so `next.config.js` maps it | ||
| to `false` in `resolve.fallback` (an empty module) and the build is warning-free. If a future | ||
| dependency bump introduces a similar optional import, extend that map rather than silencing | ||
| warnings wholesale. | ||
| - `next build --webpack` is a compatibility path in Next 16 and may eventually be removed. If that | ||
| happens before Turbopack is fixed, the fallback is `experimental.turbopackScopeHoisting: false` | ||
| and its performance cost. | ||
|
|
||
| ## Follow-ups | ||
|
|
||
| - Report the miscompilation upstream to `vercel/next.js` with a minimal reproduction; the bisect | ||
| boundary and the flag that toggles it are the material. | ||
| - Re-test Turbopack on each Next upgrade. If a release fixes it, revisit — Turbopack's build speed | ||
| is worth reclaiming, but only with the M1/M5/M6 numbers above re-measured, not on the release | ||
| notes alone. | ||
Oops, something went wrong.
Oops, something went wrong.
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
📐 Maintainability & Code Quality | 🟡 Minor | ⚡ Quick win
Add a language identifier to each fenced block.
These opening fences violate the configured MD040 rule. Use
textfor diagrams, message examples, and formatted output..agents/adr/0001-webpack-for-production-builds.md#L36-L36: change the opening fence to```text..agents/adr/0002-layer-shaped-ticket-leaves.md#L14-L14: change the opening fence to```text..agents/skills/grilling/SKILL.md#L12-L12: change the opening fence to```text..agents/skills/resolve-config-request/SKILL.md#L135-L135: change the outer opening fence to````text..agents/tasks/structure.md#L11-L11: change the opening fence to```text.🧰 Tools
🪛 markdownlint-cli2 (0.23.2)
[warning] 36-36: Fenced code blocks should have a language specified
(MD040, fenced-code-language)
📍 Affects 5 files
.agents/adr/0001-webpack-for-production-builds.md#L36-L36(this comment).agents/adr/0002-layer-shaped-ticket-leaves.md#L14-L14.agents/skills/grilling/SKILL.md#L12-L12.agents/skills/resolve-config-request/SKILL.md#L135-L135.agents/tasks/structure.md#L11-L11🤖 Prompt for AI Agents
Source: Linters/SAST tools