Skip to content

chore: sync workflow templates - #785

Closed
stranske wants to merge 1 commit into
mainfrom
sync/workflows-0ab0029407c1
Closed

chore: sync workflow templates#785
stranske wants to merge 1 commit into
mainfrom
sync/workflows-0ab0029407c1

Conversation

@stranske

@stranske stranske commented Jun 23, 2026

Copy link
Copy Markdown
Owner

Sync Summary

Files Updated

  • autofix.yml: Autofix workflow - automatically fixes lint/format issues
  • agents-issue-intake.yml: Issue intake - processes new issues for agent assignment
  • agents-80-pr-event-hub.yml: PR event hub - consolidates PR meta, bot comments, and verify-to-issue handlers
  • agents-81-gate-followups.yml: Gate followups hub - consolidates keepalive and autofix followups
  • agents-keepalive-sweep.yml: Keepalive sweep (#2267) - periodic level-based resync; dispatches the loop for open agent PRs so silent zero-commit stalls resurface
  • agents-keepalive-loop-reporter.yml: Keepalive reporter - posts summary when keepalive run fails or cancels
  • agents-71-codex-belt-dispatcher.yml: Codex belt dispatcher - selects issues and creates agent branches for work
  • agents-72-codex-belt-worker.yml: Codex belt worker - executes agent on issues with full prompt and context
  • agents-72-codex-belt-worker-dispatch.yml: Codex belt worker dispatch wrapper - allows workflow_dispatch for the worker
  • agents-73-codex-belt-conveyor.yml: Codex belt conveyor - orchestrates belt worker execution and handles completion
  • agents-autofix-dispatcher.yml: Autofix dispatch bridge - acknowledges legacy Gate repository_dispatch events; agents-81-gate-followups handles repair work
  • agents-verifier.yml: Verifier - validates agent work meets acceptance criteria
  • list-llm-models.yml: List LLM Models - helper to show available models for verifier
  • agents-issue-optimizer.yml: Issue optimizer - LangChain-based issue formatting and optimization (Phase 1)
  • agents-verify-to-new-pr.yml: Verify to new PR - creates follow-up issue and immediately dispatches auto-pilot to prepare a replacement PR (bridge inlined)
  • agents-auto-label.yml: Auto-label - suggests/applies labels based on semantic matching (Phase 5A)
  • agents-capability-check.yml: Capability check - pre-flight agent feasibility gate (Phase 3A)
  • agents-decompose.yml: Task decomposition - breaks large issues into sub-tasks (Phase 3B)
  • agents-dedup.yml: Duplicate detection - flags similar open issues (Phase 3C)
  • agents-guard.yml: Agents guard - enforces agents workflow protections (Health 45)
  • agents-pr-health.yml: PR health scanner - periodic conflict resolution and failing check re-dispatch
  • agents-auto-pilot.yml: Auto-pilot - end-to-end automation orchestrator (format → optimize → agent → verify)
  • agents-weekly-metrics.yml: Weekly metrics - aggregates auto-pilot, keepalive, autofix and verifier metrics into summary reports
  • maint-coverage-guard.yml: Coverage guard - daily baseline monitoring with automatic issue creation
  • maint-76-claude-code-review.yml: Claude Code review (opt-in) - runs only on labeled PRs or manual dispatch
  • reusable-pr-context.yml: Reusable PR context workflow - centralized PR data fetching via GraphQL
  • backplane-conformance.yml: Backplane conformance caller stub - calls reusable-backplane-conformance.yml@main to validate a repo's emitted run-contract/v1 envelope (producer) or ingested object (consumer). No-op for non-participants (opt-in). Template lives under templates/consumer-repo/.github/workflows/.
  • keepalive_next_task.md: Keepalive prompt - instructs Codex on next task in PR
  • autofix_from_ci_failure.md: Autofix prompt - instructs Codex to fix CI/Gate failures
  • fix_ci_failures.md: CI fix prompt - general CI failure resolution instructions
  • fix_bot_comments.md: Bot comments prompt - instructs Codex to address bot review comments
  • verifier_acceptance_check.md: Verifier prompt - acceptance criteria validation
  • fix_merge_conflicts.md: Conflict resolution prompt - instructs Codex to resolve merge conflicts
  • sync_dev_dependencies.py: Syncs dev dependency versions from autofix-versions.env to pyproject.toml
  • check_agents_md_freshness.py: Warns when the generated Orchestrator AGENTS.md playbook section cites stale repo paths or commands
  • resolve_mypy_pin.py: Resolves mypy version pinning - required by reusable CI workflow
  • requirements-llm.txt: Pinned LLM dependencies - exact-sync guarded for agent workflows
  • coverage_trend.py: Generates coverage trend summaries - required by reusable CI workflow
  • coverage_guard.py: Checks coverage guard artifacts - required by maint-coverage-guard.yml
  • init.py: Tools package marker for Python helpers imported by synced workflows
  • ci_failure_triage.py: Classifies CI failure logs - required by pr-00-gate.yml summary generation
  • post_ci_summary.py: Builds consolidated Gate summary comments - required by pr-00-gate.yml
  • state_fingerprint.py: Computes workflow state fingerprints for unchanged-state skip gates
  • check_deliberate_break.py: Opt-in Gate helper that proves named deliberate-break acceptance tests fail against the base implementation
  • reference_packs.py: Validates and resolves reference pack configuration for shared runner prompt assembly
  • orchestrator_skill.py: Validates and resolves exported Orchestrator skill context for remote Codex lanes
  • runner_lib/ (3 files): Shared runner prompt assembly, output parsing, and dispatch debounce helpers
  • aggregate_agent_metrics.py: Aggregates downloaded weekly agent metrics - required by agents-weekly-metrics.yml
  • coverage_history_append.py: Appends coverage data to history file - required by reusable CI workflow
  • ci_metrics.py: Collects CI metrics for dashboard - required by reusable CI workflow
  • ci_history.py: Manages CI history data - required by reusable CI workflow
  • ci_coverage_delta.py: Computes coverage delta between runs - required by reusable CI workflow
  • reusable_ci_scope.py: Selects changed-input reusable CI scenarios - required by reusable CI workflows
  • sync_test_dependencies.py: Syncs test dependency pins - required by reusable CI workflow
  • check_test_dependencies.sh: Checks test dependencies match - required by reusable CI workflow
  • autopilot_step_timer.py: Emits step timing timestamps for auto-pilot workflows - required by agents-auto-pilot.yml
  • autopilot_metrics_collector.py: Collects and appends structured auto-pilot metrics to NDJSON log - required by agents-auto-pilot.yml
  • decode_raw_input.py: Decodes raw input from ChatGPT connector
  • parse_chatgpt_topics.py: Parses ChatGPT conversation into issue topics
  • fallback_split.py: Fallback topic splitting when parsing fails
  • detect-changes.js: Detects changed files for CI path-based filtering
  • agents-guard.js: Health 45 agents guard logic used by the workflow protections
  • coverage-normalize.js: Normalizes coverage data across different report formats
  • maint-post-ci.js: Post-CI maintenance tasks and cleanup
  • gate-docs-only.js: Gate check for docs-only changes to skip full CI
  • checkout_source.js: Source checkout utilities for CI workflows
  • package.json: Node package manifest for .github scripts (vendored minimatch)
  • registry.yml: Agent registry - source of truth for agent keys and runner workflow mapping
  • agent_registry.js: Agent registry helper - loads registry and resolves agent key from labels
  • agent_delegation_policy.js: Agent delegation policy - system-driven routing for agent:auto label
  • minimatch/ (53 files): Vendored minimatch dependency for .github scripts
  • brace-expansion/ (13 files): Vendored brace-expansion dependency (transitive dep of minimatch)
  • balanced-match/ (13 files): Vendored balanced-match dependency (transitive dep of brace-expansion)
  • issue_pr_locator.js: Locates PRs associated with issues
  • source_context.js: Classifies PR workflow source context for issue, local, automation, sync, Dependabot, review follow-up, and direct GitHub work
  • issue_context_utils.js: Utilities for issue context extraction
  • terminal_disposition.js: Machine-readable terminal disposition records and source summaries
  • terminal_disposition_coverage.js: Warning-only terminal disposition source coverage preflight
  • bot_comment_auth_coverage.js: Warning-only bot-comment App auth coverage preflight
  • coverage_monitor_summary.js: Machine-readable weekly coverage monitor checkpoint
  • weekly_metrics_artifacts.js: Bounded weekly metrics artifact selection contract
  • weekly_metrics_download_manifest.js: Weekly metrics artifact download and extraction manifest contract
  • issue_scope_parser.js: Parses issue scope and requirements
  • keepalive_instruction_template.js: Generates keepalive instructions for Codex
  • keepalive_loop.js: Core keepalive loop logic
  • token_load_balancer.js: Dynamic token load balancer for API rate limit management
  • keepalive_prompt_routing.js: Prompt routing logic for keepalive - determines which prompt template to use
  • keepalive_state.js: Keepalive state management
  • timeout_config.js: Timeout configuration parser for keepalive - required by keepalive_loop.js
  • keepalive_guard_utils.js: Guard utilities for keepalive state protection
  • keepalive_contract.js: Keepalive contract definitions and validation
  • keepalive_gate.js: Gate evaluation logic for keepalive workflow
  • keepalive_worker_gate.js: Worker gate logic for keepalive workflow
  • keepalive_orchestrator_gate_runner.js: Orchestrator gate runner for keepalive
  • keepalive_post_work.js: Post-work handling for keepalive rounds
  • keepalive_prompt_composer.js: Composes prompts for keepalive Codex calls
  • autopilot_metrics.js: AutoPilot metrics collection and reporting
  • auto_pilot_transitions.js: Auto-pilot transition contract and next-step helper
  • github-api-with-retry.js: GitHub API retry wrapper with exponential backoff and pagination support - required by agents-auto-pilot.yml
  • sync_tracker_state/ (1 files): Shared durable tracker and open PR state helpers for consumer sync workflows
  • github-rate-limited-wrapper.js: Transparent rate-limit proxy - wraps all github.rest.* calls with automatic retry and token switching
  • prompt_injection_guard.js: Security guard against prompt injection attacks
  • prompt_integrity_guard.js: Integrity validation for prompts
  • error_classifier.js: Classifies CI errors for agent handling
  • error_diagnostics.js: Diagnostic utilities for error analysis
  • failure_comment_formatter.js: Formats failure comments for PR status updates
  • conflict_detector.js: Conflict detector - identifies merge conflicts for targeted resolution
  • merge_manager.js: Manages PR merge operations
  • runtime_ac_merge_guard.js: Blocks external merge lanes for PRs that require local Orchestrator runtime acceptance checks
  • comment-dedupe.js: Deduplicates bot comments on issues/PRs
  • bot-comment-dismiss.js: Collects ignored bot review comments for auto-dismiss handling
  • bot-comment-handler.js: Bot comment handler logic - processes bot review comments for dispatch
  • autofix_emit_report.py: Emits autofix report - required by reusable-18-autofix.yml
  • gate_summary.py: Gate summary renderer - generates PR gate check summary
  • should-post-review.js: Evaluates whether a progress review comment should be posted
  • keepalive_review_guard.js: Guards against posting empty/null progress review comments
  • post_completion_comment.js: Posts completion comments on PRs
  • verifier_ci_query.js: Queries CI status for verifier workflow
  • verifier_issue_formatter.js: Formats issues for verifier output
  • verifier_verdict_json.py: Extracts structured post-merge verifier verdict JSON without trusting diff text
  • agents_orchestrator_resolve.js: Resolves agent orchestrator state
  • agents_pr_meta_keepalive.js: PR metadata handling for keepalive
  • agents_pr_meta_orchestrator.js: PR metadata orchestrator logic
  • agents_pr_meta_update_body.js: Updates PR body with agent metadata
  • agents_verifier_context.js: Context gathering for agent verifier
  • agents_dispatch_summary.js: Summarizes agent dispatch operations
  • agents_belt_scan.js: Scans agent belt for available tools
  • api_client.py: Shared GitHub API client used by synced Python automation scripts
  • issue_optimizer.py: Issue optimizer - analyzes issues and suggests improvements
  • structured_output.py: Shared structured output helpers for LangChain workflows
  • trace_utils.py: Shared LangSmith trace metadata helpers for LangChain workflows
  • _llm_client.py: Shared LangChain chat-client construction (get_llm_client/get_llm_clients)
  • verifier_config.py: Shared verifier prompt budgets, schema-repair policy, and terminal artifact validation
  • checklist_utils.py: Shared checklist parsing helpers for issue and follow-up generation
  • issue_formatter.py: Issue formatter - converts raw text to AGENT_ISSUE_TEMPLATE format
  • issue_pr_context.py: Issue/PR context assembly helper with shared token budget caps
  • issue_dedup.py: Issue deduplication - finds similar open issues
  • injection_guard.py: Prompt injection guard - validates prompts before LLM submission
  • progress_reviewer.py: Progress reviewer - evaluates agent progress for keepalive rounds
  • context_extractor.py: Context extractor - extracts relevant context from issues/PRs
  • semantic_matcher.py: Semantic matcher - vector similarity for issues/labels
  • capability_check.py: Capability check - pre-flight agent feasibility assessment
  • task_decomposer.py: Task decomposer - breaks large issues into sub-tasks
  • task_validator.py: Task validator - refines generated issue tasks for actionability
  • label_matcher.py: Label matcher - suggests labels based on semantic matching
  • pr_verifier.py: PR verifier - validates PR changes against acceptance criteria
  • integration_layer.py: Integration layer - coordinates LangChain components
  • topic_splitter.py: Topic splitter - splits conversations into discrete issues
  • format_issue.md: Prompt template for LLM-based issue formatting
  • analyze_issue.md: Prompt template for issue analysis/optimization
  • apply_suggestions.md: Prompt template for applying optimization suggestions
  • context_extract.md: Prompt template for context extraction
  • decompose_task.md: Prompt template for task decomposition
  • pr_evaluation.md: Prompt template for PR evaluation/verification
  • refine_tasks.md: Prompt template for task refinement and validation
  • verdict_extract.py: Verdict extractor - parses verification verdicts from LLM output
  • verdict_policy.py: Verdict policy engine - applies pass/fail rules to verification results
  • llm_provider.py: LLM provider configuration - GitHub Models and OpenAI client setup
  • langchain_client.py: LangChain client builder - multi-provider client with slot-based fallback and configuration
  • llm_registry.py: LLM model registry helper - shared slot/model selection and blocked-model enforcement
  • embedding_provider.py: Embedding provider registry used by synced semantic matching helpers
  • validate_run_contract.py: Validates a repo's emitted run-contract/v1 run envelope (producer/bridge) or ingested satellite object (consumer) against the canonical Workflows schemas + opt-in participant registry. Offline/deterministic; opt-in skip for non-participants. Synced so participants can validate locally and the reusable conformance gate can invoke it.
  • agents-guard.js: Guards against unauthorized agent workflow file changes
  • pr-context-graphql.js: GraphQL PR context fetcher - reduces 4+ REST calls to 1 GraphQL call
  • github-api-cache.js: Shared cache utilities for GitHub API requests used by PR context scripts
  • github-api-cache-client.js: Client wrapper for cached GitHub API requests
  • AGENT_INSTRUCTIONS.md: Agent instructions - base instructions for all Codex runs
  • copilot-instructions.md: Repository-specific instructions for GitHub Copilot
  • copilot-skills/ (4 files): Copilot skill definitions - patterns for CI, GitHub ops, etc.
  • keepalive-instruction.md: Keepalive instruction template - directives for Codex on each round
  • PULL_REQUEST_TEMPLATE.md: Pull request template with Workflow Source fields for direct GitHub and non-issue work
  • path-classification.yml: Path classification config used by the path-classifier composite action
  • agent-event-eligibility/ (2 files): Agent event eligibility action - early no-op gate for agent workflows
  • setup-api-client/ (2 files): Unified API client setup - installs @octokit deps and exports all load balancer tokens
  • resolve-default-branch/ (2 files): Resolves repository default branches for Workflows dual-checkout patterns
  • export-load-balancer-tokens/ (1 files): Export load balancer tokens action - required by reusable-10-ci-python.yml (deprecated, use setup-api-client)
  • path-classifier/ (2 files): Classifies changed PR paths for path-aware expensive job gating
  • artifact-cache/ (2 files): Restores, discovers, and caches workflow artifacts by daily, weekly, or run window
  • AGENT_ISSUE_FORMAT.md: Format specification for agent-compatible issues
  • CI_SYSTEM_GUIDE.md: Guide to the CI system for agents
  • LABELS.md: Label definitions and usage
  • CODEX_TOKEN_REFRESH.md: Codex OAuth token refresh guide
  • AGENTS.md: Context file for agents and coding assistants
  • CLAUDE.md: Context file for Claude/AI assistants
  • agent-runner-output.md: Agent runner output contract specification - required for implementing new agent runners
  • SETUP_CHECKLIST.md: Consumer repo setup checklist. Includes the default_workflow_permissions=write step in section 3.3.1 that prevents a Gate startup_failure on fresh consumers (see #2157). Synced so it no longer drifts across the fleet.
  • tokens.css: Design-system theme tokens (theme-air/theme-paper + density axis). Override tokens in an app stylesheet loaded after this; do not fork.
  • components.css: Design-system component layer (.ds): panels/appbar/kpis/tables/fields + presentation-state patterns (.notice, .empty-state, .badge, .skeleton).
  • ds_streamlit.py: Streamlit adapter for the design system (inject_theme/empty_state/notice/error/translate_error/dev_note/availability_badge/humanize_id) so Streamlit apps consume the same presentation patterns.
  • PRESENTATION_PATTERNS.md: The presentation-patterns standard (P1-P6): the rule behind each pattern + per-app-type application + the finding->pattern map from the 2026-06 UX-Review fleet baseline.
  • README.md: Design-system usage guide: how to apply the theme + components/kit per app type.
  • model_registry.json: Model registry - available LLM models and their capabilities
  • .gitattributes: Git attributes - merge strategies to prevent pr_body.md conflicts
  • agent_task.yml: Agent task issue template - structured format for agent-compatible issues
  • config.yml: Issue template chooser config - controls which templates appear in the UI
  • WORKFLOW_USER_GUIDE.md: Workflow user guide - explains the CI/agent system for repo consumers

Files Skipped

  • pr-00-gate.yml: File exists and sync_mode is create_only
  • ci.yml: File exists and sync_mode is create_only
  • renovate.json: File exists and sync_mode is create_only
  • cross-repo-smoke.yml: File exists and sync_mode is create_only
  • llm_slots.json: None

Review Checklist

  • CI passes with updated workflows
  • No repo-specific customizations were overwritten

Source: stranske/Workflows
Source SHA: 64a8012fcf61ffb010aed2c2f3e0e97f8766826c
Template hash: 0ab0029407c1
Sync branch: sync/workflows-0ab0029407c1
Consumer repo: stranske/Counter_Risk
Manifest: .github/sync-manifest.yml

Summary by CodeRabbit

Release Notes

  • New Features
    • Introduced a unified design system with consistent visual patterns across the application.
    • Added support for light and dark themes with customizable density options.
    • Enhanced error messaging, empty states, and status badges for improved user guidance.
    • Implemented loading placeholders and improved notification displays.

Automated sync from stranske/Workflows
Template hash: 0ab0029407c1

Changes synced from sync-manifest.yml
@stranske stranske added sync Automated sync from Workflows automated Automated sync from Workflows labels Jun 23, 2026
@stranske
stranske temporarily deployed to agent-standard June 23, 2026 04:42 — with GitHub Actions Inactive
@stranske
stranske temporarily deployed to agent-standard June 23, 2026 04:42 — with GitHub Actions Inactive
@coderabbitai

coderabbitai Bot commented Jun 23, 2026

Copy link
Copy Markdown

Review Change Stack

📝 Walkthrough

Walkthrough

Adds a new design-system/ directory containing tokens.css (CSS custom properties for two themes and a density axis), components.css (scoped .ds component styles), ds_streamlit.py (Streamlit helper functions for consistent UI presentation), PRESENTATION_PATTERNS.md, and README.md. Also bumps a pinned action SHA in agents-guard.yml.

Changes

Design System Bootstrap

Layer / File(s) Summary
CSS token foundation
design-system/tokens.css
Defines base spacing, typography, and shape tokens in :root; adds a .density-compact density axis; adds .theme-air and .theme-paper theme scopes with full color, accent, semantic notice, and card presentation tokens.
Scoped component stylesheet
design-system/components.css
Adds all UI components under the .ds namespace consuming the token variables: typography, panels, app bar, KPI cards, tables, forms, buttons, notice variants (info/warn/error/ok), empty-state, badges, skeleton loading with @keyframes ds-shimmer, and a responsive 2-column grid.
Streamlit adapter module
design-system/ds_streamlit.py
Introduces palette constants and _NOTICE_STYLE mapping; implements inject_theme(), empty_state(), notice(), error(), translate_error(), dev_note(), availability_badge(), and humanize_id() as the Streamlit-side runtime for the design system.
Documentation and pattern guide
design-system/README.md, design-system/PRESENTATION_PATTERNS.md
README.md documents token/theme structure, CSS usage, file inventory, and graduation path. PRESENTATION_PATTERNS.md defines 6 presentation patterns (P1–P6), a finding-to-pattern mapping table, Streamlit kit spec, and rollout sequencing steps.

Workflow Action SHA Pin Update

Layer / File(s) Summary
agents-guard.yml action SHA bump
.github/workflows/agents-guard.yml
Replaces the old commit SHA with a new SHA for the stranske/Workflows/.github/actions/setup-api-client fallback step in both the pull_request_target and pull_request trigger paths.

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~20 minutes

Possibly related PRs

  • stranske/Counter_Risk#758: Updates the same agents-guard.yml fallback step SHA for stranske/Workflows/.github/actions/setup-api-client, directly overlapping with the workflow pin change in this PR.
🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Title check ⚠️ Warning The title 'chore: sync workflow templates' does not accurately represent the scope of changes, which include design system files, Python scripts, documentation, and configuration—not just workflow templates. Update the title to reflect the comprehensive nature of the sync, such as 'chore: sync workflow templates and design system files' or 'chore: sync Workflows repository templates and supporting files'.
✅ Passed checks (4 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Docstring Coverage ✅ Passed Docstring coverage is 100.00% which is sufficient. The required threshold is 80.00%.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch sync/workflows-0ab0029407c1

Comment @coderabbitai help to get the list of available commands.

@github-actions

github-actions Bot commented Jun 23, 2026

Copy link
Copy Markdown
Contributor

Workflow state fingerprint for Keepalive Loop Reporter. Do not edit.

@github-actions

github-actions Bot commented Jun 23, 2026

Copy link
Copy Markdown
Contributor

Workflow state fingerprint for Agents Gate Followups. Do not edit.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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

📥 Commits

Reviewing files that changed from the base of the PR and between 765e4a5 and d6e084c.

📒 Files selected for processing (6)
  • .github/workflows/agents-guard.yml
  • design-system/PRESENTATION_PATTERNS.md
  • design-system/README.md
  • design-system/components.css
  • design-system/ds_streamlit.py
  • design-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-level permissions: block on workflow_call reusable 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.yml with description: "Unified API client setup - installs @octokit deps and exports all load balancer tokens" [::stranske/Workflows::]
  • Has comprehensive contract validation in tests/workflows/test_setup_api_client_contract.py and 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 (.ds namespace) 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

  1. Action Pin Update: The SHA pin change for setup-api-client is synchronized across the template source. This should align with related PR #758 in 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.).

  2. Design System Adoption Path: The new design system files enable standardized presentation patterns across consumer Python/web applications. The ds_streamlit.py functions 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.

  3. 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-client contract (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

streamlit dependency is not declared, but ds_streamlit.py is staged template code not yet in use.

The module correctly imports streamlit at runtime (lines 57, 89, 107), but streamlit is not present in Counter_Risk's dependency manifests (pyproject.toml, requirements.txt, or requirements.lock). However, Counter_Risk code does not currently import or use this module. The file is graduated template code synced from stranske/Workflows as part of the design-system rollout (per design-system/README.md status: "STAGED here in the tracker").

If Counter_Risk applications begin calling these helpers, add streamlit to 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

Comment on lines +94 to +95
.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} }

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

📐 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.

Suggested change
.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.

Comment on lines +91 to +95
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,
)

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🔒 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
fi

Repository: 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.py

Repository: 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 1

Repository: 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.md

Repository: 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 -80

Repository: 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 -20

Repository: 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-system

Repository: 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 -10

Repository: 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 -40

Repository: 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 py

Repository: 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.py

Repository: 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.

Comment on lines +169 to +170
tail = str(raw).replace("_", " ").split(":")[0].strip()
return tail or "item"

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🎯 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.

Suggested change
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

Copy link
Copy Markdown

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

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

Comment on lines +83 to +84
- `dev_note(msg)` → logging; `diagnostics_expander()` (P4)
- `availability_badge(label)` (P5)

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🎯 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.

Comment thread design-system/README.md

## 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.

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

📐 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/
fi

Repository: 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"
fi

Repository: 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.

Comment thread design-system/tokens.css
--radius: 10px; --radius-sm: 8px; --btn-radius: 8px; --input-radius: 8px;

/* ---- type ---- */
--font-body: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif;

Copy link
Copy Markdown

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

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

@stranske

Copy link
Copy Markdown
Owner Author

Closing as superseded by newer sync workflow template PR #786 from replacement wave sync/workflows-d0d4ad2bdd25.

@stranske stranske closed this Jun 23, 2026
@stranske
stranske deleted the sync/workflows-0ab0029407c1 branch June 23, 2026 10:28
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

automated Automated sync from Workflows sync Automated sync from Workflows

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant