chore: sync workflow templates - #785
Conversation
Automated sync from stranske/Workflows Template hash: 0ab0029407c1 Changes synced from sync-manifest.yml
📝 WalkthroughWalkthroughAdds a new ChangesDesign System Bootstrap
Workflow Action SHA Pin Update
Estimated code review effort🎯 3 (Moderate) | ⏱️ ~20 minutes Possibly related PRs
🚥 Pre-merge checks | ✅ 4 | ❌ 1❌ Failed checks (1 warning)
✅ Passed checks (4 passed)
✏️ Tip: You can configure your own custom pre-merge checks in the settings. ✨ Finishing Touches📝 Generate docstrings
🧪 Generate unit tests (beta)
Comment |
|
Workflow state fingerprint for Keepalive Loop Reporter. Do not edit. |
|
Workflow state fingerprint for Agents Gate Followups. Do not edit. |
There was a problem hiding this comment.
Actionable comments posted: 7
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In `@design-system/components.css`:
- Around line 94-95: The .ds .skeleton class applies a continuous ds-shimmer
animation without respecting user accessibility preferences for reduced motion.
Add a media query for `@media (prefers-reduced-motion: reduce)` that disables
the animation on the .ds .skeleton element by setting animation to none or
animation-duration to 0s. This ensures users who prefer reduced motion will not
see the shimmer effect, improving accessibility.
In `@design-system/ds_streamlit.py`:
- Around line 169-170: The humanize_id() function currently returns the first
segment of a colon-delimited ID by using split(":")[0], but based on its
docstring and purpose, it should return the trailing human-readable segment
instead. Fix this by changing the split indexing in the tail variable assignment
from accessing the first element [0] to accessing the last element [-1], so that
colon-delimited IDs like "namespace:readable_name" properly return
"readable_name" instead of "namespace".
- Around line 91-95: User-controlled parameters in the `empty_state()`,
`notice()`, and `availability_badge()` functions (specifically `title`, `desc`,
`icon`, `body`, `action`, and badge `label`) are being directly interpolated
into HTML strings without escaping before being rendered with
`unsafe_allow_html=True`, which creates an HTML injection vulnerability. Import
`html.escape` from the standard library and apply it to each user-controlled
parameter before inserting them into the f-strings that construct the HTML
content passed to `st.markdown()`. This will sanitize any special HTML
characters in the user input while still allowing safe rendering.
In `@design-system/PRESENTATION_PATTERNS.md`:
- Line 16: The headings in the document are missing required blank lines after
them, which violates markdownlint rule MD022. For each heading starting with
"###" or similar markdown heading syntax (including "P1 — Light, understated
theme by default" and all other headings mentioned in the comment), add a blank
line immediately after the heading text. This blank line separator is required
by the markdown linting rules to pass documentation checks.
- Around line 83-84: The documentation in PRESENTATION_PATTERNS.md lists
diagnostics_expander() as part of the API kit contract, but this function does
not exist in ds_streamlit.py, creating a cross-file mismatch. Either implement
the diagnostics_expander() function in ds_streamlit.py to match the documented
contract, or remove the reference to diagnostics_expander() from the
PRESENTATION_PATTERNS.md file to align documentation with actual implementation.
Choose the approach based on whether this helper is intended to be part of the
design system or if it was incorrectly documented.
In `@design-system/README.md`:
- Line 51: The README.md file contains a broken reference to a non-existent
`../PLAN.md` file in the text on line 51. Remove the entire reference to
`../PLAN.md` §3.3 from the sentence, or if the information is important, replace
it with a reference to an actual existing documentation file such as
`PRESENTATION_PATTERNS.md`. Ensure the edited sentence remains grammatically
correct and provides clear context for readers in synced consumer repositories.
In `@design-system/tokens.css`:
- Line 29: The font-family value in the --font-body variable violates
Stylelint's value-keyword-case rule due to inconsistent casing of font names.
Convert all font family keywords to lowercase to comply with the configured
Stylelint rule. This includes changing BlinkMacSystemFont to blinkmacsystemfont,
and ensuring Roboto, Helvetica, and Arial are also in lowercase
(blinkmacsystemfont, roboto, helvetica, arial). Apply the same fix to the
similar font-family declaration at line 74 (also applies to: 74-74).
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: Organization UI
Review profile: ASSERTIVE
Plan: Pro Plus
Run ID: 684d5907-475e-4c34-b9c0-5b5f8501437b
📒 Files selected for processing (6)
.github/workflows/agents-guard.ymldesign-system/PRESENTATION_PATTERNS.mddesign-system/README.mddesign-system/components.cssdesign-system/ds_streamlit.pydesign-system/tokens.css
🔗 Linked repositories identified
CodeRabbit considers these linked repositories for cross-repo context during reviews:
stranske/Workflows(auto-detected)
📜 Review details
🧰 Additional context used
📓 Path-based instructions (3)
.github/workflows/**/*.yml
📄 CodeRabbit inference engine (.github/copilot-instructions.md)
.github/workflows/**/*.yml: Do not add top-levelpermissions:block onworkflow_callreusable workflows - this conflicts with caller permissions
Avoid invalid YAML syntax, invalid permission scopes, and circular workflow references when creating GitHub Actions workflows
Files:
.github/workflows/agents-guard.yml
.github/workflows/agents-*.yml
📄 CodeRabbit inference engine (CLAUDE.md)
Agent workflow files (agents-*.yml) should be fixed in stranske/Workflows, not edited locally in the consumer repository
agents-*.yml workflow files should be fixed in stranske/Workflows, not edited locally in the consumer repo
Files:
.github/workflows/agents-guard.yml
**/*.py
📄 CodeRabbit inference engine (.github/copilot-instructions.md)
In Manager-Database repository, import Prefect 2.x schedules from
prefect.client.schemas.schedules
Files:
design-system/ds_streamlit.py
🪛 markdownlint-cli2 (0.22.1)
design-system/PRESENTATION_PATTERNS.md
[warning] 16-16: Headings should be surrounded by blank lines
Expected: 1; Actual: 0; Below
(MD022, blanks-around-headings)
[warning] 22-22: Headings should be surrounded by blank lines
Expected: 1; Actual: 0; Below
(MD022, blanks-around-headings)
[warning] 30-30: Headings should be surrounded by blank lines
Expected: 1; Actual: 0; Below
(MD022, blanks-around-headings)
[warning] 39-39: Headings should be surrounded by blank lines
Expected: 1; Actual: 0; Below
(MD022, blanks-around-headings)
[warning] 46-46: Headings should be surrounded by blank lines
Expected: 1; Actual: 0; Below
(MD022, blanks-around-headings)
[warning] 54-54: Headings should be surrounded by blank lines
Expected: 1; Actual: 0; Below
(MD022, blanks-around-headings)
[warning] 77-77: Headings should be surrounded by blank lines
Expected: 1; Actual: 0; Below
(MD022, blanks-around-headings)
[warning] 88-88: Headings should be surrounded by blank lines
Expected: 1; Actual: 0; Below
(MD022, blanks-around-headings)
🪛 Stylelint (17.13.0)
design-system/tokens.css
[error] 29-29: Expected "BlinkMacSystemFont" to be "blinkmacsystemfont" (value-keyword-case)
(value-keyword-case)
[error] 29-29: Expected "Roboto" to be "roboto" (value-keyword-case)
(value-keyword-case)
[error] 29-29: Expected "Helvetica" to be "helvetica" (value-keyword-case)
(value-keyword-case)
[error] 29-29: Expected "Arial" to be "arial" (value-keyword-case)
(value-keyword-case)
[error] 74-74: Expected "Georgia" to be "georgia" (value-keyword-case)
(value-keyword-case)
🔀 Multi-repo context stranske/Workflows
Linked repositories findings
Based on my comprehensive exploration of the stranske/Workflows repository, I've identified key cross-repository context for this PR:
stranske/Workflows
Setup API Client Action Usage & Scope:
The setup-api-client action being pinned in the PR is heavily used across 60+ workflows in the source repository:
- Referenced in
.github/actions/agent-run-base/action.yml(line 46) as the primary infrastructure setup for agent workflows [::stranske/Workflows::] - Used in 40+ consumer-facing agent workflows:
agents-63-issue-intake.yml,agents-71-codex-belt-dispatcher.yml,agents-72-codex-belt-worker.yml,agents-73-codex-belt-conveyor.yml,agents-auto-pilot.yml,agents-autofix-dispatcher.yml,agents-verifier.yml, and many others [::stranske/Workflows::] - Documented in
.github/sync-manifest.ymlwith description: "Unified API client setup - installs@octokitdeps and exports all load balancer tokens" [::stranske/Workflows::] - Has comprehensive contract validation in
tests/workflows/test_setup_api_client_contract.pyand GitHub action pin validation tests [::stranske/Workflows::]
Design System Graduation into Consumer Templates:
The design-system files are newly graduated into the consumer sync as part of commit 64a8012 (titled "feat(design-system): graduate shared design system into the consumer sync"):
- Located in
templates/consumer-repo/design-system/in the source:tokens.css— CSS token foundation (spacing, typography, colors, themes) [::stranske/Workflows::]components.css— Reusable scoped components (.dsnamespace) and presentation-state patterns [::stranske/Workflows::]ds_streamlit.py— Streamlit adapter with functions:inject_theme(),empty_state(),notice(),error(),translate_error(),dev_note(),availability_badge(),humanize_id()[::stranske/Workflows::]PRESENTATION_PATTERNS.md— 6 presentation patterns (P1–P6) for consistent UI (theming, empty states, error messaging, diagnostics, availability marking, humanized IDs) [::stranske/Workflows::]README.md— Design system usage documentation and rollout plan [::stranske/Workflows::]
First-Party Consumer Network:
13 registered consumer repos are synced from this template, including Counter_Risk (the PR's destination), via the maint-68-sync-consumer-repos.yml workflow [::stranske/Workflows::]
Sync Coordination:
The README confirms a multi-repo sync strategy with health checks: health-68-consumer-sync-drift.yml, health-72-template-sync.yml, and related validation workflows ensure drift detection and consistent rollout [::stranske/Workflows::]
Review Implications
-
Action Pin Update: The SHA pin change for
setup-api-clientis synchronized across the template source. This should align with related PR#758in Counter_Risk which also updates the same action SHA. Verify the commit message or changelog of the new SHA to document what changed (dependency versions, token handling, npm retry logic, etc.). -
Design System Adoption Path: The new design system files enable standardized presentation patterns across consumer Python/web applications. The
ds_streamlit.pyfunctions will be available to Counter_Risk for consistent UI error handling, empty states, and theming—but will require consumer applications to adopt these helpers intentionally. -
Cross-Consumer Consistency: This sync maintains a single source of truth for workflow infrastructure and design tokens, reducing drift. However, reviewers should verify that no breaking changes to the
setup-api-clientcontract (inputs/outputs) or design-system CSS selectors will silently fail in downstream apps.
🔇 Additional comments (2)
design-system/ds_streamlit.py (1)
57-57: 🩺 Stability & Availability
streamlitdependency is not declared, butds_streamlit.pyis staged template code not yet in use.The module correctly imports
streamlitat runtime (lines 57, 89, 107), butstreamlitis not present in Counter_Risk's dependency manifests (pyproject.toml,requirements.txt, orrequirements.lock). However, Counter_Risk code does not currently import or use this module. The file is graduated template code synced fromstranske/Workflowsas part of the design-system rollout (perdesign-system/README.mdstatus: "STAGED here in the tracker").If Counter_Risk applications begin calling these helpers, add
streamlitto the project's dependencies before shipping. Until then, no runtime impact..github/workflows/agents-guard.yml (1)
114-114: LGTM!Also applies to: 183-183
| .ds .skeleton { background:linear-gradient(90deg,var(--panel) 25%,var(--border) 37%,var(--panel) 63%); background-size:400% 100%; border-radius:var(--radius-sm); animation:ds-shimmer 1.3s ease infinite; min-height:14px; } | ||
| @keyframes ds-shimmer { 0%{background-position:100% 0} 100%{background-position:0 0} } |
There was a problem hiding this comment.
📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win
Add reduced-motion fallback for skeleton shimmer animation.
Respecting prefers-reduced-motion avoids unnecessary motion for sensitive users.
Suggested fix
.ds .skeleton { background:linear-gradient(90deg,var(--panel) 25%,var(--border) 37%,var(--panel) 63%); background-size:400% 100%; border-radius:var(--radius-sm); animation:ds-shimmer 1.3s ease infinite; min-height:14px; }
`@keyframes` ds-shimmer { 0%{background-position:100% 0} 100%{background-position:0 0} }
+
+@media (prefers-reduced-motion: reduce) {
+ .ds .skeleton { animation: none; }
+}📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
| .ds .skeleton { background:linear-gradient(90deg,var(--panel) 25%,var(--border) 37%,var(--panel) 63%); background-size:400% 100%; border-radius:var(--radius-sm); animation:ds-shimmer 1.3s ease infinite; min-height:14px; } | |
| @keyframes ds-shimmer { 0%{background-position:100% 0} 100%{background-position:0 0} } | |
| .ds .skeleton { background:linear-gradient(90deg,var(--panel) 25%,var(--border) 37%,var(--panel) 63%); background-size:400% 100%; border-radius:var(--radius-sm); animation:ds-shimmer 1.3s ease infinite; min-height:14px; } | |
| `@keyframes` ds-shimmer { 0%{background-position:100% 0} 100%{background-position:0 0} } | |
| `@media` (prefers-reduced-motion: reduce) { | |
| .ds .skeleton { animation: none; } | |
| } |
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In `@design-system/components.css` around lines 94 - 95, The .ds .skeleton class
applies a continuous ds-shimmer animation without respecting user accessibility
preferences for reduced motion. Add a media query for `@media
(prefers-reduced-motion: reduce)` that disables the animation on the .ds
.skeleton element by setting animation to none or animation-duration to 0s. This
ensures users who prefer reduced motion will not see the shimmer effect,
improving accessibility.
| st.markdown( | ||
| f"<div class='ds-empty'><div style='font-size:22px;opacity:.6'>{icon}</div>" | ||
| f"<div class='t'>{title}</div><div class='d'>{desc}</div></div>", | ||
| unsafe_allow_html=True, | ||
| ) |
There was a problem hiding this comment.
🔒 Security & Privacy | 🟠 Major
🧩 Analysis chain
🏁 Script executed:
#!/bin/bash
# First, check if the file exists and get its line count
if [ -f "design-system/ds_streamlit.py" ]; then
wc -l design-system/ds_streamlit.py
else
echo "File not found at design-system/ds_streamlit.py"
find . -name "ds_streamlit.py" -type f
fiRepository: stranske/Counter_Risk
Length of output: 193
🏁 Script executed:
#!/bin/bash
# Read the design-system/ds_streamlit.py file to verify the content
cat -n design-system/ds_streamlit.pyRepository: stranske/Counter_Risk
Length of output: 7802
🏁 Script executed:
#!/bin/bash
# Search for usage of the design system functions in Counter_Risk
rg "(empty_state|notice|error|availability_badge|translate_error|inject_theme)" --type py -A 2 -B 1Repository: stranske/Counter_Risk
Length of output: 159
🏁 Script executed:
#!/bin/bash
# Check if there are any Python apps that import ds_streamlit
find . -name "*.py" -type f | xargs grep -l "ds_streamlit\|from design_system" 2>/dev/null || echo "No direct imports found"Repository: stranske/Counter_Risk
Length of output: 191
🏁 Script executed:
#!/bin/bash
# Check git status to see if this is a new file in the PR
git log --oneline --all design-system/ds_streamlit.py 2>&1 | head -5 || echo "File may be new"
git diff HEAD~1 design-system/ds_streamlit.py 2>&1 | head -30 || echo "Cannot get diff"Repository: stranske/Counter_Risk
Length of output: 405
🏁 Script executed:
#!/bin/bash
# Check the PR/branch context - see what files are in design-system/
ls -la design-system/Repository: stranske/Counter_Risk
Length of output: 600
🏁 Script executed:
#!/bin/bash
# Check README.md to understand design system adoption plan
cat -n design-system/README.mdRepository: stranske/Counter_Risk
Length of output: 2769
🏁 Script executed:
#!/bin/bash
# Check PRESENTATION_PATTERNS.md for guidance on usage
cat -n design-system/PRESENTATION_PATTERNS.md | head -80Repository: stranske/Counter_Risk
Length of output: 5854
🏁 Script executed:
#!/bin/bash
# Check if there are any current Streamlit apps in Counter_Risk that might use these functions
find . -name "*.py" -type f ! -path "./design-system/*" | head -20Repository: stranske/Counter_Risk
Length of output: 840
🏁 Script executed:
#!/bin/bash
# Look for any Streamlit entry points or app files
find . -name "*.py" -type f ! -path "./design-system/*" -exec grep -l "streamlit\|st\\.markdown\|st\\.button" {} \;Repository: stranske/Counter_Risk
Length of output: 239
🏁 Script executed:
#!/bin/bash
# Search more specifically for Streamlit app files
find . -name "app.py" -o -name "*_streamlit.py" -o -name "streamlit_*.py" | grep -v design-systemRepository: stranske/Counter_Risk
Length of output: 159
🏁 Script executed:
#!/bin/bash
# Check git log to understand the commit that added design-system
git log --oneline --all | grep -i "design\|sync" | head -10Repository: stranske/Counter_Risk
Length of output: 771
🏁 Script executed:
#!/bin/bash
# Verify the design-system was just synced by checking the commit
git show d6e084c --stat | head -40Repository: stranske/Counter_Risk
Length of output: 2332
🏁 Script executed:
#!/bin/bash
# Check if html module is already imported anywhere in the codebase
rg "import html" --type pyRepository: stranske/Counter_Risk
Length of output: 159
🏁 Script executed:
#!/bin/bash
# Verify the exact lines mentioned in the review to confirm all locations
sed -n '91,95p; 110,117p; 158,161p' design-system/ds_streamlit.pyRepository: stranske/Counter_Risk
Length of output: 1004
Escape user-controlled text before rendering with unsafe_allow_html=True.
title, desc, icon, body, action, and badge label are inserted into raw HTML without escaping, creating an HTML injection surface. This applies to empty_state(), notice(), and availability_badge() functions.
Suggested fix
import logging
+import html
from collections.abc import Callable, Mapping
from typing import Any
@@
st.markdown(
- f"<div class='ds-empty'><div style='font-size:22px;opacity:.6'>{icon}</div>"
- f"<div class='t'>{title}</div><div class='d'>{desc}</div></div>",
+ f"<div class='ds-empty'><div style='font-size:22px;opacity:.6'>{html.escape(icon)}</div>"
+ f"<div class='t'>{html.escape(title)}</div><div class='d'>{html.escape(desc)}</div></div>",
unsafe_allow_html=True,
)
@@
head = f"<strong>{title}</strong><br>" if title else ""
act = f"<div style='margin-top:6px'>{action}</div>" if action else ""
st.markdown(
f"<div class='ds-notice' style='background:{bg};border-color:{color}33'>"
f"<span class='ic' style='color:{color}'>{ic}</span>"
- f"<div>{head}{body}{act}</div></div>",
+ f"<div>{html.escape(head)}{html.escape(body)}{html.escape(act)}</div></div>",
unsafe_allow_html=True,
)
@@
def availability_badge(label: str) -> str:
- return f"<span class='ds-badge'>{label}</span>"
+ return f"<span class='ds-badge'>{html.escape(label)}</span>"🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In `@design-system/ds_streamlit.py` around lines 91 - 95, User-controlled
parameters in the `empty_state()`, `notice()`, and `availability_badge()`
functions (specifically `title`, `desc`, `icon`, `body`, `action`, and badge
`label`) are being directly interpolated into HTML strings without escaping
before being rendered with `unsafe_allow_html=True`, which creates an HTML
injection vulnerability. Import `html.escape` from the standard library and
apply it to each user-controlled parameter before inserting them into the
f-strings that construct the HTML content passed to `st.markdown()`. This will
sanitize any special HTML characters in the user input while still allowing safe
rendering.
| tail = str(raw).replace("_", " ").split(":")[0].strip() | ||
| return tail or "item" |
There was a problem hiding this comment.
🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win
humanize_id() currently returns the leading segment, not the trailing human segment.
The implementation conflicts with its own docstring/comment and can display the wrong label for colon-delimited IDs.
Suggested fix
- tail = str(raw).replace("_", " ").split(":")[0].strip()
+ tail = str(raw).replace("_", " ").split(":")[-1].strip()📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
| tail = str(raw).replace("_", " ").split(":")[0].strip() | |
| return tail or "item" | |
| tail = str(raw).replace("_", " ").split(":")[-1].strip() | |
| return tail or "item" |
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In `@design-system/ds_streamlit.py` around lines 169 - 170, The humanize_id()
function currently returns the first segment of a colon-delimited ID by using
split(":")[0], but based on its docstring and purpose, it should return the
trailing human-readable segment instead. Fix this by changing the split indexing
in the tail variable assignment from accessing the first element [0] to
accessing the last element [-1], so that colon-delimited IDs like
"namespace:readable_name" properly return "readable_name" instead of
"namespace".
|
|
||
| ## The 6 patterns | ||
|
|
||
| ### P1 — Light, understated theme by default |
There was a problem hiding this comment.
📐 Maintainability & Code Quality | 🟡 Minor | ⚡ Quick win
Fix markdownlint MD022 heading spacing violations.
These headings are missing the required blank line below and can fail docs lint checks.
Also applies to: 22-22, 30-30, 39-39, 46-46, 54-54, 77-77, 88-88
🧰 Tools
🪛 markdownlint-cli2 (0.22.1)
[warning] 16-16: Headings should be surrounded by blank lines
Expected: 1; Actual: 0; Below
(MD022, blanks-around-headings)
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In `@design-system/PRESENTATION_PATTERNS.md` at line 16, The headings in the
document are missing required blank lines after them, which violates
markdownlint rule MD022. For each heading starting with "###" or similar
markdown heading syntax (including "P1 — Light, understated theme by default"
and all other headings mentioned in the comment), add a blank line immediately
after the heading text. This blank line separator is required by the markdown
linting rules to pass documentation checks.
Source: Linters/SAST tools
| - `dev_note(msg)` → logging; `diagnostics_expander()` (P4) | ||
| - `availability_badge(label)` (P5) |
There was a problem hiding this comment.
🎯 Functional Correctness | 🟠 Major | ⚡ Quick win
diagnostics_expander() is documented but not present in ds_streamlit.py.
This cross-file API mismatch can cause adopters to call a non-existent helper. Either add the function or remove it from the kit contract here.
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In `@design-system/PRESENTATION_PATTERNS.md` around lines 83 - 84, The
documentation in PRESENTATION_PATTERNS.md lists diagnostics_expander() as part
of the API kit contract, but this function does not exist in ds_streamlit.py,
creating a cross-file mismatch. Either implement the diagnostics_expander()
function in ds_streamlit.py to match the documented contract, or remove the
reference to diagnostics_expander() from the PRESENTATION_PATTERNS.md file to
align documentation with actual implementation. Choose the approach based on
whether this helper is intended to be part of the design system or if it was
incorrectly documented.
|
|
||
| ## Status & next step | ||
|
|
||
| **STAGED** here in the tracker. Graduates to `Workflows/templates/consumer-repo/design-system/` with a `sync-manifest.yml` entry (`is_directory: true`; base tokens `template_sync: exact`) as a deliberate Workflows PR — see [`../PLAN.md`](../PLAN.md) §3.3. Claude Design imports from the Workflows path once graduated, enabling the prototype-in-Design → land-in-repo round-trip. |
There was a problem hiding this comment.
📐 Maintainability & Code Quality | 🔴 Critical
🧩 Analysis chain
🏁 Script executed:
#!/bin/bash
set -euo pipefail
# Check for PLAN.md candidates in repo and verify relative target from design-system/README.md.
echo "Candidates:"
fd -i '^PLAN\.md$' || true
echo
echo "Relative target from design-system/README.md:"
test -f "PLAN.md" && echo "FOUND: PLAN.md at repo root" || echo "NOT FOUND: PLAN.md at repo root"Repository: stranske/Counter_Risk
Length of output: 250
🏁 Script executed:
#!/bin/bash
# Check if PLAN.md exists in Workflows repo near design-system
echo "=== Searching for PLAN.md in Workflows ==="
fd -i '^PLAN\.md$' || echo "No PLAN.md found"
echo
echo "=== Checking sync-manifest.yml for design-system entry ==="
if [ -f ".github/sync-manifest.yml" ]; then
rg -A 5 "design-system" .github/sync-manifest.yml || true
fi
echo
echo "=== Checking design-system directory structure ==="
if [ -d "templates/consumer-repo/design-system" ]; then
ls -la templates/consumer-repo/design-system/
fiRepository: stranske/Workflows
Length of output: 2490
🏁 Script executed:
#!/bin/bash
# Read the design-system/README.md to see the full context of the link
echo "=== Full design-system/README.md ==="
if [ -f "design-system/README.md" ]; then
cat -n design-system/README.md
else
echo "design-system/README.md not found"
fiRepository: stranske/Counter_Risk
Length of output: 2806
Remove or fix the broken ../PLAN.md link on line 51.
The file does not exist in Counter_Risk or in the source Workflows repository, and is not included in the sync-manifest.yml entry. Users reading this README in synced consumer repos will encounter a broken link when following the reference to ../PLAN.md §3.3. Either replace it with a valid target (e.g., PRESENTATION_PATTERNS.md) or remove the reference entirely.
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In `@design-system/README.md` at line 51, The README.md file contains a broken
reference to a non-existent `../PLAN.md` file in the text on line 51. Remove the
entire reference to `../PLAN.md` §3.3 from the sentence, or if the information
is important, replace it with a reference to an actual existing documentation
file such as `PRESENTATION_PATTERNS.md`. Ensure the edited sentence remains
grammatically correct and provides clear context for readers in synced consumer
repositories.
| --radius: 10px; --radius-sm: 8px; --btn-radius: 8px; --input-radius: 8px; | ||
|
|
||
| /* ---- type ---- */ | ||
| --font-body: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif; |
There was a problem hiding this comment.
📐 Maintainability & Code Quality | 🟡 Minor | ⚡ Quick win
Resolve Stylelint value-keyword-case violations on font-family values.
These lines currently violate the configured Stylelint rule and can fail lint-gated CI.
Suggested fix
- --font-body: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif;
+ --font-body: -apple-system, blinkmacsystemfont, "Segoe UI", roboto, helvetica, arial, sans-serif;
...
- --font-heading: Georgia, "Times New Roman", serif;
+ --font-heading: georgia, "Times New Roman", serif;Also applies to: 74-74
🧰 Tools
🪛 Stylelint (17.13.0)
[error] 29-29: Expected "BlinkMacSystemFont" to be "blinkmacsystemfont" (value-keyword-case)
(value-keyword-case)
[error] 29-29: Expected "Roboto" to be "roboto" (value-keyword-case)
(value-keyword-case)
[error] 29-29: Expected "Helvetica" to be "helvetica" (value-keyword-case)
(value-keyword-case)
[error] 29-29: Expected "Arial" to be "arial" (value-keyword-case)
(value-keyword-case)
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In `@design-system/tokens.css` at line 29, The font-family value in the
--font-body variable violates Stylelint's value-keyword-case rule due to
inconsistent casing of font names. Convert all font family keywords to lowercase
to comply with the configured Stylelint rule. This includes changing
BlinkMacSystemFont to blinkmacsystemfont, and ensuring Roboto, Helvetica, and
Arial are also in lowercase (blinkmacsystemfont, roboto, helvetica, arial).
Apply the same fix to the similar font-family declaration at line 74 (also
applies to: 74-74).
Source: Linters/SAST tools
|
Closing as superseded by newer sync workflow template PR #786 from replacement wave sync/workflows-d0d4ad2bdd25. |
Sync Summary
Files Updated
Files Skipped
Review Checklist
Source: stranske/Workflows
Source SHA:
64a8012fcf61ffb010aed2c2f3e0e97f8766826cTemplate hash:
0ab0029407c1Sync branch:
sync/workflows-0ab0029407c1Consumer repo:
stranske/Counter_RiskManifest:
.github/sync-manifest.ymlSummary by CodeRabbit
Release Notes