Skip to content

fix(skills): unbreak memory-ci and ship the five unsynced skills - #9

Merged
voidhrithik merged 2 commits into
mainfrom
chore/move-skills-to-top-level
Jul 22, 2026
Merged

fix(skills): unbreak memory-ci and ship the five unsynced skills#9
voidhrithik merged 2 commits into
mainfrom
chore/move-skills-to-top-level

Conversation

@anshroboto

@anshroboto anshroboto commented Jul 22, 2026

Copy link
Copy Markdown
Contributor

Problem / Intent

Five team skills lived under entries/skills/, but the roboto-mem CLI only ever globs top-level skills/* (src/core/skill.ts:118), so those skills had never reached a single teammate's ~/.claude/skills/. Worse, the entry linter treats everything under entries/ as a memory entry, so those directories produced 35 lint errors — and memory-ci.yml runs that linter on every pull request, so CI was red on every PR opened against this repo. This moves the five skills to the location the CLI actually reads and fixes the CRLF line endings that made two of them unparseable.

Summary

  • Moved json-ld, prep, sanity-plugin-md-notes, ship-pr, and ui-match from entries/skills/ to top-level skills/, joining pr-review-orchestrator which was already correctly placed. entries/ now holds only the four real scopes: org, projects, squads, stacks. These six skills will materialize into teammates' ~/.claude/skills/ on their next session start after merge — for five of them, for the first time.
  • Converted skills/prep/SKILL.md and skills/ship-pr/SKILL.md from CRLF to LF. Both opened with ---\r\n, and parseSkillFrontmatter requires raw.startsWith("---\n") (src/core/skill.ts:43), so both were rejected with a misleading missing YAML frontmatter despite having valid frontmatter. They were the only two CRLF files in the repo.
  • Added .gitattributes so *.md is normalized to LF on commit, preventing a Windows or misconfigured editor from reintroducing the same failure.
  • Fixes CI: node .roboto-mem/cli.mjs lint goes from exit 1 with 35 errors to ✓ 24 entries, 0 problems, exit 0. All 35 errors originated in entries/skills/**; none came from anywhere else.

This is a content-only change. No CLI change is required, and no file's contents were rewritten — 37 of the 39 moves are byte-identical (R100), and the two CRLF files hash identically to their originals once carriage returns are stripped.

Core file changes

File Change
entries/skills/{json-ld,sanity-plugin-md-notes,ui-match}/**skills/** 37 pure renames (R100) into the only directory loadSkills reads
entries/skills/prep/SKILL.mdskills/prep/SKILL.md Rename plus CRLF→LF, so its frontmatter parses
entries/skills/ship-pr/SKILL.mdskills/ship-pr/SKILL.md Rename plus CRLF→LF, same fix
.gitattributes New: *.md text eol=lf, so CRLF cannot come back

Verification

Run against the staged tree extracted in isolation (git checkout-index -a --prefix=$TMP/), so it matches exactly what CI checks out.

  • node .roboto-mem/cli.mjs lint — the exact command memory-ci.yml runs → ✓ 24 entries, 0 problems, exit 0. Baseline on main in a throwaway worktree: exit 1, 35 errors, all 35 from entries/skills/**.
  • grep -rlU $'\r' --exclude-dir=.git . returns nothing.
  • ls skills/ lists all six: json-ld, pr-review-orchestrator, prep, sanity-plugin-md-notes, ship-pr, ui-match.
  • ls entries/ lists only org, projects, squads, stacks.
  • Skill loader picks them up → ✓ 24 entries, 6 skills, 0 problems, exit 0. On main the loader sees none of the five.
  • Post-merge, cannot run yet: roboto-mem sync on a bound machine reports 6 skills materialized. sync reads the clone at ~/.roboto-mem/repos/, which tracks main. The loader check above is the substantive half — sync materializes exactly what the loader finds.

Summary by CodeRabbit

  • Documentation
    • Added comprehensive JSON-LD structured data guides for Next.js, including a full skill, schema-by-schema implementation examples, templates, validation guidance, and an audit workflow.
    • Added Sanity Markdown help-notes documentation for end-to-end setup across Vite, Webpack, and Turbopack, plus supporting authoring/opt-in guidance.
    • Added a UI comparison workflow documentation bundle, including screenshot capture, findings structure, and per-page ticket reporting guidance.
    • Clarified preparation and pull request workflows, including safer failure handling during ticket updates.
  • Chores
    • Standardized Markdown files to Unix line endings.

@anshroboto anshroboto self-assigned this Jul 22, 2026
@anshroboto
anshroboto requested a review from voidhrithik July 22, 2026 04:54
@coderabbitai

coderabbitai Bot commented Jul 22, 2026

Copy link
Copy Markdown

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: ASSERTIVE

Plan: Pro

Run ID: a0918bb4-d265-4837-8c76-2e9d7b63c8c3

📥 Commits

Reviewing files that changed from the base of the PR and between a2f94bd and 201b743.

📒 Files selected for processing (1)
  • skills/sanity-plugin-md-notes/AUTHORING.md

📝 Walkthrough

Walkthrough

The PR adds JSON-LD, Sanity help-plugin, and UI comparison skill documentation, expands preparation and shipping workflow guidance, adds UI capture utilities, updates metadata, fixes Markdown fencing, and configures LF endings for Markdown files.

Changes

JSON-LD skill

Layer / File(s) Summary
Core guidance, schema references, and audit workflow
skills/json-ld/AGENTS.md, skills/json-ld/README.md, skills/json-ld/SKILL.md, skills/json-ld/metadata.json, skills/json-ld/rules/*
Adds type-safe Next.js JSON-LD patterns for 15+ schema types, reusable templates and categories, validation references, and a route audit workflow covering discovery, classification, detection, reporting, implementation, and re-auditing.

Sanity Markdown help

Layer / File(s) Summary
Authoring and integration workflow
skills/sanity-plugin-md-notes/AUTHORING.md, skills/sanity-plugin-md-notes/OPT-IN.md, skills/sanity-plugin-md-notes/SKILL.md
Documents .help.md authoring, schema opt-in, singleton and menu integrations, idempotent setup, verification, and constraints.
Bundler-specific setup
skills/sanity-plugin-md-notes/VITE.md, skills/sanity-plugin-md-notes/WEBPACK.md
Defines Vite and Webpack/Turbopack plugin wiring, loaders, code generation, type declarations, configuration composition, and verification.

UI match skill

Layer / File(s) Summary
Capture, comparison, and reporting workflow
skills/ui-match/SKILL.md, skills/ui-match/README.md, skills/ui-match/metadata.json, skills/ui-match/references/*
Defines Figma/live capture, section inventories, existence-only classification, findings JSON, screenshot handling, and per-page Linear ticket formatting and persistence.
Capture utilities
skills/ui-match/scripts/*
Adds ImageMagick crop/chunk/scale commands and browser-side section extraction returning crop coordinates and labels.

Workflow and formatting updates

Layer / File(s) Summary
Preparation and shipping guidance
skills/prep/SKILL.md, skills/ship-pr/SKILL.md
Clarifies ticket, branch, planning, exploration, implementation-plan, and failed-Linear-update handling.
Markdown conventions
.gitattributes
Sets Markdown files to use LF line endings.

Estimated code review effort: 4 (Complex) | ~45 minutes

Possibly related PRs

  • robotostudio/team-memory#3: Introduces overlapping shared skill documentation, including JSON-LD, prep, Sanity help, ship-pr, and UI-match materials.

Suggested reviewers: voidhrithik

Poem

A rabbit stacks docs in a neat little row,
JSON-LD schemas begin to glow.
Figma and live pages hop into tune,
Sanity help blooms beneath the moon.
LF lines keep the burrow bright.

🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title accurately summarizes the main change: fixing memory-ci by shipping the five unsynced skills.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
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.
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch chore/move-skills-to-top-level

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

loadSkills only globs skills/*, so the five skills under entries/skills/ never synced to anyone; the entry linter also flagged them as malformed entries, failing memory-ci on every PR. Also converts prep and ship-pr from CRLF to LF, which the frontmatter parser rejected as "missing YAML frontmatter".
@anshroboto
anshroboto force-pushed the chore/move-skills-to-top-level branch from b4d92a6 to a2f94bd Compare July 22, 2026 04:57
@coderabbitai
coderabbitai Bot requested a review from jonoroboto July 22, 2026 04:58
@anshroboto
anshroboto removed the request for review from jonoroboto July 22, 2026 04:59

@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: 31

🤖 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 `@skills/json-ld/AGENTS.md`:
- Line 2319: Remove /careers and /jobs from the JobPosting pattern in
skills/json-ld/AGENTS.md at lines 2319-2319, retaining only /careers/[slug] and
/jobs/[slug]. Update the corresponding mapping in
skills/json-ld/rules/audit-project.md at lines 66-66 to apply only to individual
job-detail routes; route index pages through content analysis or manual review.
- Line 1539: Sanitize job.description with an allowlist before it reaches the
dangerouslySetInnerHTML render boundary. Update the component containing this
JSX to use the project’s existing HTML sanitizer if available, preserving only
the markup required for job descriptions; otherwise render structured content
instead of raw HTML.
- Around line 1461-1462: Update the JobPosting example’s validThrough value near
datePosted so it is not a fixed date that can become expired, using a dynamic
future closing date or a non-date placeholder while preserving valid JobPosting
markup.

In `@skills/json-ld/rules/_template.md`:
- Around line 12-13: Add one blank line after each of the When to Use, Common
Mistakes, and Validation headings in skills/json-ld/rules/_template.md (lines
12-13), skills/json-ld/rules/content-article.md (lines 12-13),
skills/json-ld/rules/content-blog-posting.md (lines 12-13),
skills/json-ld/rules/content-course.md (lines 12-13),
skills/json-ld/rules/content-event.md (lines 12-13),
skills/json-ld/rules/content-job-posting.md (lines 12-13),
skills/json-ld/rules/content-recipe.md (lines 12-13),
skills/json-ld/rules/ecom-product.md (lines 12-13),
skills/json-ld/rules/interactive-faq-page.md (lines 12-13),
skills/json-ld/rules/interactive-howto.md (lines 12-13),
skills/json-ld/rules/local-local-business.md (lines 12-13), and
skills/json-ld/rules/media-video-object.md (lines 12-13), preserving the
existing lists.

In `@skills/json-ld/rules/content-course.md`:
- Around line 104-114: Update the Course guidance in
skills/json-ld/rules/content-course.md (lines 104-114) to match current Google
documentation: do not mark provider as required or present price/format as
Google eligibility fields. In skills/json-ld/rules/content-event.md (lines
129-146), label the online-event example as schema.org-only and state that
Google Event rich results require a physical location. In
skills/json-ld/rules/interactive-faq-page.md (lines 2-23), revise the title,
impactDescription, and introduction to limit FAQ accordion claims to
authoritative government and health sites. In
skills/json-ld/rules/interactive-howto.md (lines 2-10), remove promises of
Google HowTo rich-result visibility.

In `@skills/json-ld/rules/content-job-posting.md`:
- Line 113: Sanitize job.description before passing it to
dangerouslySetInnerHTML in the job posting render, using the project’s existing
HTML sanitizer with an appropriate allowlist. Keep the rendered description
behavior while ensuring untrusted ATS/database content cannot inject arbitrary
markup or scripts.
- Around line 35-36: Update the validThrough value in the job-posting structured
data to derive from the posting’s closing date or replace it with a clearly
future placeholder, ensuring it is not already expired while preserving the
existing ISO timestamp format.

In `@skills/json-ld/rules/content-recipe.md`:
- Around line 112-124: The Recipe JSON-LD example in
skills/json-ld/rules/content-recipe.md (lines 112-124) must match the rendered
text content: either add rendered image, rating, and video fields or remove the
corresponding image, aggregateRating, and video entries. Apply the same
correction to skills/json-ld/rules/ecom-product.md (lines 84-102) by either
rendering the rating/review content or removing aggregateRating and review from
the JSON-LD.

In `@skills/json-ld/rules/ecom-product.md`:
- Line 80: Update the product offer guidance around priceValidUntil so the field
is emitted only when a genuine expiration date exists, rather than being
universally required. Replace the aging 2026-12-31 example and update the later
example to match the conditional behavior, revising the accompanying guidance
text accordingly.

In `@skills/json-ld/rules/local-local-business.md`:
- Around line 140-152: Update the `geo` row in the properties table to remain
Recommended and revise its description so it does not claim latitude and
longitude are required for local-pack placement. Update the related `Common
Mistakes` guidance to avoid presenting omitted `geo` as disqualifying, and
change the example coordinate values to use at least five decimal places.

In `@skills/json-ld/rules/nav-website.md`:
- Around line 3-4: Remove the outdated sitelinks search box promise and lower
the rule’s impact metadata in skills/json-ld/rules/nav-website.md (lines 3-4).
Update skills/json-ld/AGENTS.md (lines 287-383) to retain WebSite
semantic/site-name guidance while removing sitelinks guarantees from the
description, property table, and mistakes; replace the result claim in
skills/json-ld/SKILL.md (lines 52-57); and remove the promised implementation
outcome from skills/json-ld/rules/audit-project.md (lines 130-134).

In `@skills/json-ld/rules/org-organization.md`:
- Around line 12-15: Correct Organization guidance across
skills/json-ld/rules/org-organization.md lines 12-15 and 86-103 and
skills/json-ld/AGENTS.md lines 73-76 and 147-164: recommend placing Organization
markup on one relevant home/about page instead of every page or the root layout,
state that no Organization properties are required, and allow logo values as
either a URL or ImageObject while marking applicable properties as recommended.

In `@skills/json-ld/SKILL.md`:
- Around line 59-65: The FAQPage entry in skills/json-ld/SKILL.md (lines 59-65)
must no longer be classified as HIGH for most sites; qualify it for
authoritative government and health sites and lower its generic priority. In
skills/json-ld/rules/audit-project.md (lines 140-144), add an eligibility check
before recommending FAQPage for rich-result outcomes.
- Around line 67-74: Remove the HowTo row’s “Step-by-step rich result” promise
from the priority table in skills/json-ld/SKILL.md at lines 67-74. In
skills/json-ld/AGENTS.md lines 1045-1196, revise the HowTo outcome and
validation guidance to present it as optional semantic markup rather than a
MEDIUM-priority Google rich-result implementation; preserve guidance for
supported schema validation.

In `@skills/prep/SKILL.md`:
- Line 61: Add a language identifier to the fenced example in SKILL.md, using
markdown (or another appropriate identifier) immediately after the opening fence
to satisfy markdownlint rule MD040.
- Around line 31-36: Update the branch setup instructions around the custom
branch validation and “B. Create and checkout the branch” so `git fetch origin`
runs before checking `origin/<provided-name>` with `git rev-parse --verify`.
Preserve the existing fallback to the local ref and error prompt, but ensure
validation uses freshly fetched remote refs.

In `@skills/sanity-plugin-md-notes/AUTHORING.md`:
- Around line 150-163: Fix the closing fence placement in the example template
around the Related and Walkthrough sections: remove the premature outer fence
before ## Related and use a single four-backtick fence after the Loom URL to
close the entire template, leaving no empty fenced block.

In `@skills/sanity-plugin-md-notes/OPT-IN.md`:
- Around line 133-144: Markdown fenced code blocks lack language identifiers and
trigger MD040. Mark the flowchart fence in
skills/sanity-plugin-md-notes/OPT-IN.md lines 133-144 as text, the command fence
in skills/sanity-plugin-md-notes/WEBPACK.md lines 88-90 as sh, and the path-only
fence in skills/sanity-plugin-md-notes/WEBPACK.md lines 104-106 as text.

In `@skills/sanity-plugin-md-notes/SKILL.md`:
- Around line 58-63: Update the “Static checks you run” guidance for withHelp
verification: search for any withHelp( occurrence in the target schema file
rather than requiring the single-line withHelp(<schemaName> pattern, then
inspect the surrounding code or AST to confirm the schema is wired and avoid
duplicate wrapping. Keep the other prescribed checks unchanged.

In `@skills/sanity-plugin-md-notes/VITE.md`:
- Around line 13-21: Update the vite.config.ts example to preserve the existing
Vite configuration and plugins, appending sanityHelpVite() to the current
plugins array rather than replacing it. Show the existing config structure as
retained while adding the new plugin.
- Around line 42-55: Update the VITE.md guidance so the step is skipped only
when "vite/client" is explicitly available through compilerOptions.types or a
/// <reference types="vite/client" /> declaration. Remove the instruction to
skip when compilerOptions.types is absent, and retain the existing instruction
to add "vite/client" when neither inclusion is present.

In `@skills/sanity-plugin-md-notes/WEBPACK.md`:
- Around line 79-90: Align the package scripts for dev, predev, and prebuild so
they all invoke codegen with the same custom --in and --out paths. Update the
watcher command and both lifecycle scripts consistently, preferably by reusing
one shared command to prevent path drift.
- Around line 35-40: Update the webpack configuration callback so the helpMdRule
is registered in the relevant oneOf branch when one exists, and only unshift it
into config.module.rules when no oneOf branch is available. Ensure each .help.md
file can match the rule only once and avoid adding the same rule through both
paths.

In `@skills/ship-pr/SKILL.md`:
- Around line 72-77: Update Step 6 of the ship-pr workflow to document recovery
when attaching the PR URL or moving the Linear ticket to “In Review” fails:
identify the failed operation, preserve the existing PR, and provide a sync-only
retry or manual remediation path that does not recreate or roll back the PR.

In `@skills/ui-match/references/linear.md`:
- Around line 34-44: Update the upload command in the prepare/upload flow to
capture and validate the HTTP status before embedding the returned assetUrl.
Treat any non-200 PUT response as a failed upload and retry or abort without
calling save_issue or referencing the dead assetUrl; preserve the existing
inline markdown behavior for successful uploads.
- Around line 3-7: Update the Linear MCP guidance in the referenced workflow
documentation to require discovering available Linear tools with
ToolSearch("+linear") before selecting or invoking a namespace. Replace the
hard-coded mcp__plugin_linear_linear__ references, including the authentication
fallback, with instructions that use the discovered tool names while preserving
the existing OAuth authentication flow.
- Around line 17-19: Update the Linear issue workflow described in the “Upload
each screenshot” section to reuse an existing ticket on reruns by looking up the
previously stored ticketUrl or ticketKey before creating a new issue, then
update that ticket instead of creating a duplicate. If reuse cannot be
supported, explicitly document that reruns intentionally create new issues.

In `@skills/ui-match/scripts/site_sections.js`:
- Around line 19-21: Update the section filtering logic in the visible-section
collection flow to retain visible elements with heights below 40px. Only exclude
zero-height or hidden elements, or replace the fixed threshold with an explicit
configurable threshold while preserving legitimate slim sections in the
inventory.
- Around line 7-8: Update the candidate selection and host setup around
candidates and host so inventory generation includes the full visible page shell
rather than preferring main alone. Merge visible header, main, and footer
sections in DOM order, or select the appropriate page-shell container, while
preserving the body fallback when no shell is available.

In `@skills/ui-match/SKILL.md`:
- Around line 25-26: Update the per-page setup instructions for SLUG in SKILL.md
to remove the existing /tmp/ui-match/$SLUG/figma and /tmp/ui-match/$SLUG/site
directories, including generated screenshots, before recreating them with mkdir
-p. Preserve the existing directory layout and ensure cleanup is scoped only to
the validated page.
- Around line 35-41: Update the Figma capture instructions in the “Get the Figma
pixels” section to fall back to the user-provided PNG for any MCP capture
failure, including unavailable tools, timeouts, permission errors, and non-image
responses. Preserve the requirement to retain the failure diagnostic while
continuing with PNG segmentation and Figma inventory creation.
🪄 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

Run ID: 0aac6271-747d-4341-ba2c-8c3791d93b8c

📥 Commits

Reviewing files that changed from the base of the PR and between e99b9b9 and a2f94bd.

📒 Files selected for processing (40)
  • .gitattributes
  • skills/json-ld/AGENTS.md
  • skills/json-ld/README.md
  • skills/json-ld/SKILL.md
  • skills/json-ld/metadata.json
  • skills/json-ld/rules/_sections.md
  • skills/json-ld/rules/_template.md
  • skills/json-ld/rules/audit-project.md
  • skills/json-ld/rules/content-article.md
  • skills/json-ld/rules/content-blog-posting.md
  • skills/json-ld/rules/content-course.md
  • skills/json-ld/rules/content-event.md
  • skills/json-ld/rules/content-job-posting.md
  • skills/json-ld/rules/content-recipe.md
  • skills/json-ld/rules/ecom-product.md
  • skills/json-ld/rules/interactive-faq-page.md
  • skills/json-ld/rules/interactive-howto.md
  • skills/json-ld/rules/local-local-business.md
  • skills/json-ld/rules/media-video-object.md
  • skills/json-ld/rules/nav-breadcrumb-list.md
  • skills/json-ld/rules/nav-site-navigation.md
  • skills/json-ld/rules/nav-website.md
  • skills/json-ld/rules/org-organization.md
  • skills/json-ld/rules/org-person.md
  • skills/json-ld/rules/org-service.md
  • skills/prep/SKILL.md
  • skills/sanity-plugin-md-notes/AUTHORING.md
  • skills/sanity-plugin-md-notes/OPT-IN.md
  • skills/sanity-plugin-md-notes/SKILL.md
  • skills/sanity-plugin-md-notes/VITE.md
  • skills/sanity-plugin-md-notes/WEBPACK.md
  • skills/ship-pr/SKILL.md
  • skills/ui-match/README.md
  • skills/ui-match/SKILL.md
  • skills/ui-match/metadata.json
  • skills/ui-match/references/capture.md
  • skills/ui-match/references/findings.md
  • skills/ui-match/references/linear.md
  • skills/ui-match/scripts/crop.sh
  • skills/ui-match/scripts/site_sections.js

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

Caution

Inline review comments failed to post. This is likely due to GitHub's internal server error or limits when posting large numbers of comments. If you are seeing this consistently it is likely a permissions issue. Please check "Moderation" -> "Code review limits" under your organization settings.

🛑 Comments failed to post (31)
skills/json-ld/AGENTS.md (3)

1461-1462: 🎯 Functional Correctness | 🟠 Major | ⚡ Quick win

Do not publish an already-expired job example.

validThrough: '2026-06-15T23:59:59Z' is in the past as of July 22, 2026, while the sample still renders the job as active. Use a dynamic closing date or a non-date placeholder; Google disallows expired jobs remaining live with JobPosting markup. (developers.google.com)

🤖 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 `@skills/json-ld/AGENTS.md` around lines 1461 - 1462, Update the JobPosting
example’s validThrough value near datePosted so it is not a fixed date that can
become expired, using a dynamic future closing date or a non-date placeholder
while preserving valid JobPosting markup.

1539-1539: 🔒 Security & Privacy | 🟠 Major | ⚡ Quick win

Sanitize ATS/CMS HTML before rendering it.

This raw dangerouslySetInnerHTML is separate from the protected JSON-LD serialization. A malicious or compromised ATS/CMS description can inject active HTML (for example event handlers) into the page. Sanitize with an allowlist before this boundary, or render structured content instead.

🤖 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 `@skills/json-ld/AGENTS.md` at line 1539, Sanitize job.description with an
allowlist before it reaches the dangerouslySetInnerHTML render boundary. Update
the component containing this JSX to use the project’s existing HTML sanitizer
if available, preserving only the markup required for job descriptions;
otherwise render structured content instead of raw HTML.

2319-2319: 🎯 Functional Correctness | 🟠 Major | ⚡ Quick win

Never classify careers/jobs indexes as JobPosting. Google permits JobPosting only on a detailed page for one job, not job-listing or search-result pages. Keep it for the [slug] routes and send /careers and /jobs through content analysis/manual review instead. (developers.google.com)

  • skills/json-ld/AGENTS.md#L2319-L2319: remove /careers and /jobs from the JobPosting pattern.
  • skills/json-ld/rules/audit-project.md#L66-L66: restrict the mapping to individual job-detail routes.
📍 Affects 2 files
  • skills/json-ld/AGENTS.md#L2319-L2319 (this comment)
  • skills/json-ld/rules/audit-project.md#L66-L66
🤖 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 `@skills/json-ld/AGENTS.md` at line 2319, Remove /careers and /jobs from the
JobPosting pattern in skills/json-ld/AGENTS.md at lines 2319-2319, retaining
only /careers/[slug] and /jobs/[slug]. Update the corresponding mapping in
skills/json-ld/rules/audit-project.md at lines 66-66 to apply only to individual
job-detail routes; route index pages through content analysis or manual review.
skills/json-ld/rules/_template.md (1)

12-13: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

Add blank lines after headings before lists.

markdownlint-cli2 reports MD022 for the When to Use, Common Mistakes, and Validation headings throughout these files. Add one blank line after each affected heading.

  • skills/json-ld/rules/_template.md#L12-L13: fix all three list-oriented headings.
  • skills/json-ld/rules/content-article.md#L12-L13: fix all three list-oriented headings.
  • skills/json-ld/rules/content-blog-posting.md#L12-L13: fix all three list-oriented headings.
  • skills/json-ld/rules/content-course.md#L12-L13: fix all three list-oriented headings.
  • skills/json-ld/rules/content-event.md#L12-L13: fix all three list-oriented headings.
  • skills/json-ld/rules/content-job-posting.md#L12-L13: fix all three list-oriented headings.
  • skills/json-ld/rules/content-recipe.md#L12-L13: fix all three list-oriented headings.
  • skills/json-ld/rules/ecom-product.md#L12-L13: fix all three list-oriented headings.
  • skills/json-ld/rules/interactive-faq-page.md#L12-L13: fix all three list-oriented headings.
  • skills/json-ld/rules/interactive-howto.md#L12-L13: fix all three list-oriented headings.
  • skills/json-ld/rules/local-local-business.md#L12-L13: fix all three list-oriented headings.
  • skills/json-ld/rules/media-video-object.md#L12-L13: fix all three list-oriented headings.
🧰 Tools
🪛 markdownlint-cli2 (0.23.0)

[warning] 12-12: Headings should be surrounded by blank lines
Expected: 1; Actual: 0; Below

(MD022, blanks-around-headings)

📍 Affects 12 files
  • skills/json-ld/rules/_template.md#L12-L13 (this comment)
  • skills/json-ld/rules/content-article.md#L12-L13
  • skills/json-ld/rules/content-blog-posting.md#L12-L13
  • skills/json-ld/rules/content-course.md#L12-L13
  • skills/json-ld/rules/content-event.md#L12-L13
  • skills/json-ld/rules/content-job-posting.md#L12-L13
  • skills/json-ld/rules/content-recipe.md#L12-L13
  • skills/json-ld/rules/ecom-product.md#L12-L13
  • skills/json-ld/rules/interactive-faq-page.md#L12-L13
  • skills/json-ld/rules/interactive-howto.md#L12-L13
  • skills/json-ld/rules/local-local-business.md#L12-L13
  • skills/json-ld/rules/media-video-object.md#L12-L13
🤖 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 `@skills/json-ld/rules/_template.md` around lines 12 - 13, Add one blank line
after each of the When to Use, Common Mistakes, and Validation headings in
skills/json-ld/rules/_template.md (lines 12-13),
skills/json-ld/rules/content-article.md (lines 12-13),
skills/json-ld/rules/content-blog-posting.md (lines 12-13),
skills/json-ld/rules/content-course.md (lines 12-13),
skills/json-ld/rules/content-event.md (lines 12-13),
skills/json-ld/rules/content-job-posting.md (lines 12-13),
skills/json-ld/rules/content-recipe.md (lines 12-13),
skills/json-ld/rules/ecom-product.md (lines 12-13),
skills/json-ld/rules/interactive-faq-page.md (lines 12-13),
skills/json-ld/rules/interactive-howto.md (lines 12-13),
skills/json-ld/rules/local-local-business.md (lines 12-13), and
skills/json-ld/rules/media-video-object.md (lines 12-13), preserving the
existing lists.

Source: Linters/SAST tools

skills/json-ld/rules/content-course.md (1)

104-114: 🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
set -euo pipefail

printf '\n== content-course.md ==\n'
sed -n '1,220p' skills/json-ld/rules/content-course.md

printf '\n== content-event.md ==\n'
sed -n '1,220p' skills/json-ld/rules/content-event.md

printf '\n== interactive-faq-page.md ==\n'
sed -n '1,120p' skills/json-ld/rules/interactive-faq-page.md

printf '\n== interactive-howto.md ==\n'
sed -n '1,120p' skills/json-ld/rules/interactive-howto.md

Repository: robotostudio/team-memory

Length of output: 18223


🌐 Web query:

Google structured data Course rich results ItemList provider requirement online course event location FAQPage HowTo rich results deprecated current documentation

💡 Result:

As of July 22, 2026, the status of these Google structured data features is as follows: Course Rich Results Google continues to support Course structured data [1]. To be eligible for Course rich results (including the course info carousel), you must provide specific required properties, including name, description, and provider [2][3]. While the legacy "course list" markup remains supported, Google now recommends including detailed information—such as pricing, educational level, ratings, and length—using the Course type [1]. A key requirement for current eligibility is providing hasCourseInstance, which details specific offerings (e.g., online, onsite, or blended) [4][3]. ItemList (Carousel) Rich Results The ItemList structured data type is supported by Google to enable carousel-style rich results for specific content types, including Course, Movie, Recipe, and Restaurant [5][6][7]. To be eligible, you must include at least two items (using the ListItem type) within the ItemList container [5][7]. Each item must specify its position (1-based integer) and a canonical URL [5][7]. FAQPage and HowTo Rich Results Both FAQPage and HowTo rich results are fully deprecated [8][9][10]. - FAQPage: As of May 7, 2026, FAQ rich results no longer appear in Google Search [8][9]. Google has removed the FAQ search appearance, rich result reporting, and support in the Rich Results Test [9][10]. - HowTo: This feature is also deprecated and no longer appears in search results on either desktop or mobile [8][11]. - Status of Schema: While these specific rich result features have been removed, FAQPage and HowTo remain valid Schema.org types [9][10]. Google has stated that you are not required to proactively remove this structured data from your site, as it does not cause errors, even though it will not produce visible rich result enhancements in Google Search [11][9][10].

Citations:


🏁 Script executed:

#!/bin/bash
set -euo pipefail

python3 - <<'PY'
from pathlib import Path
for p in [
    Path("skills/json-ld/rules/content-course.md"),
    Path("skills/json-ld/rules/content-event.md"),
    Path("skills/json-ld/rules/interactive-faq-page.md"),
    Path("skills/json-ld/rules/interactive-howto.md"),
]:
    text = p.read_text()
    print(p, "lines:", text.count("\n")+1)
PY

Repository: robotostudio/team-memory

Length of output: 370


🌐 Web query:

site:developers.google.com/search/docs structured data course rich results itemlist provider online course event virtual location FAQPage HowTo deprecated

💡 Result:

As of July 22, 2026, there is no official documentation from Google declaring Course, FAQPage, HowTo, ItemList, or Provider structured data as deprecated for general schema usage. However, Google Search only provides special rich result appearances for specific, documented structured data types [1][2]. While these types may exist in the Schema.org vocabulary, they are only eligible for rich results if they are explicitly listed in the Google Search Central documentation for supported features [1][2]. If a specific schema type is not listed in the Google Search Gallery, Google does not currently provide a dedicated rich result appearance for it, regardless of whether the schema is technically valid for other search engines or services [1][3]. For any structured data implementation, you should prioritize the Google Search Central feature guides to confirm current support, as Google recommends relying on their documentation as the definitive source for Google Search behavior rather than Schema.org definitions [1][4]. You can test your markup using the Google Rich Results Test to see if a page is eligible for a specific search appearance [3]. Any markup not tied to a specific Google feature can still be used for general Schema.org validation using the Schema Markup Validator [3].

Citations:


🌐 Web query:

site:developers.google.com/search/docs/appearance/structured-data/event Google online event VirtualLocation OnlineEventAttendanceMode rich results

💡 Result:

Google does not support virtualLocation or onlineEventAttendanceMode in its Event structured data for rich results [1]. According to official Google Search Central documentation, events must take place at a physical location to be eligible for event rich results [1]. Google explicitly states that virtual experiences without a real-world component are not supported [1]. For the location property, you must use a schema.org Place type with a defined address and name [1].

Citations:


🌐 Web query:

site:developers.google.com/search/blog FAQ rich results deprecated HowTo rich results deprecated Google Search Central

💡 Result:

As of July 22, 2026, Google has significantly restricted the eligibility of FAQ and How-To rich results [1]. These features were not fully deprecated for all sites simultaneously, but rather underwent a process of reduced visibility and tightened criteria starting in 2023 [1]. FAQ Rich Results As of the changes announced in August 2023, FAQ rich results (powered by FAQPage structured data) are no longer shown regularly for most websites [1]. They are now limited to well-known, authoritative government and health websites [1]. While site owners may still have this structured data on their pages, it generally does not result in the FAQ rich result appearing in Search for sites outside of those specific categories [1]. How-To Rich Results How-To rich results (powered by HowTo structured data) were also restricted in 2023 [1]. Following an initial update that limited them to desktop devices, Google fully deprecated How-To rich results on September 13, 2023 [1]. They no longer appear in Google Search results on any device [1]. Recommendations for Site Owners Google has explicitly stated that there is no requirement to proactively remove FAQ or How-To structured data from your site [1]. Structured data that is not actively used for rich results does not cause technical issues for Google Search, though it will not provide the benefit of rich result display [1]. Google continues to simplify its search results page by phasing out various structured data types that provide less significant value [2].

Citations:


🌐 Web query:

site:developers.google.com/search/docs/appearance/structured-data/course Google Course rich results provider hasCourseInstance itemlist

💡 Result:

Google Search Central documentation for Course rich results does not include hasCourseInstance as a supported or required property [1]. To implement Course list structured data, you must use the ItemList schema, which requires the itemListElement property along with ListItem objects containing position and url properties [1]. For a Course entity, Google specifies the following: - Required properties: description, name [1]. - Recommended properties: provider [1]. - List requirements: You must mark up at least three courses using the ItemList structure [1]. The property hasCourseInstance is not part of the Google-supported schema for Course rich results [1].

Citations:


Separate schema.org guidance from Google Search eligibility.

  • skills/json-ld/rules/content-course.md: align the Course section with Google’s current Course docs; provider shouldn’t be presented as required, and price/format shouldn’t be described as Google eligibility fields.
  • skills/json-ld/rules/content-event.md: keep the online-event example as schema.org markup only; Google Event rich results require a physical location and don’t support virtual-only events.
  • skills/json-ld/rules/interactive-faq-page.md: update the title/impactDescription and intro copy so they no longer promise a Google FAQ accordion for general sites; that appearance is now limited to authoritative government and health sites.
  • skills/json-ld/rules/interactive-howto.md: remove the Google rich-result promise; HowTo rich results are no longer shown in Search.
📍 Affects 4 files
  • skills/json-ld/rules/content-course.md#L104-L114 (this comment)
  • skills/json-ld/rules/content-event.md#L129-L146
  • skills/json-ld/rules/interactive-faq-page.md#L2-L23
  • skills/json-ld/rules/interactive-howto.md#L2-L10
🤖 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 `@skills/json-ld/rules/content-course.md` around lines 104 - 114, Update the
Course guidance in skills/json-ld/rules/content-course.md (lines 104-114) to
match current Google documentation: do not mark provider as required or present
price/format as Google eligibility fields. In
skills/json-ld/rules/content-event.md (lines 129-146), label the online-event
example as schema.org-only and state that Google Event rich results require a
physical location. In skills/json-ld/rules/interactive-faq-page.md (lines 2-23),
revise the title, impactDescription, and introduction to limit FAQ accordion
claims to authoritative government and health sites. In
skills/json-ld/rules/interactive-howto.md (lines 2-10), remove promises of
Google HowTo rich-result visibility.
skills/json-ld/rules/content-job-posting.md (2)

35-36: 🎯 Functional Correctness | 🟠 Major | ⚡ Quick win

🧩 Analysis chain

🏁 Script executed:

sed -n '1,120p' skills/json-ld/rules/content-job-posting.md

Repository: robotostudio/team-memory

Length of output: 3679


🏁 Script executed:

python3 - <<'PY'
from pathlib import Path
p = Path('skills/json-ld/rules/content-job-posting.md')
text = p.read_text()
for i, line in enumerate(text.splitlines(), 1):
    if 25 <= i <= 50:
        print(f"{i:>4}: {line}")
PY

Repository: robotostudio/team-memory

Length of output: 1432


Use a future validThrough value.
validThrough is hard-coded to 2026-06-15T23:59:59Z, which is already expired; derive it from the posting’s closing date or use a clearly future placeholder.

🤖 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 `@skills/json-ld/rules/content-job-posting.md` around lines 35 - 36, Update the
validThrough value in the job-posting structured data to derive from the
posting’s closing date or replace it with a clearly future placeholder, ensuring
it is not already expired while preserving the existing ISO timestamp format.

113-113: 🔒 Security & Privacy | 🟠 Major | ⚡ Quick win

Sanitize job.description before using dangerouslySetInnerHTML.

This value comes from an ATS/database and is written directly into the page. The JSON-LD escaping above does not protect this separate HTML sink; sanitize it with an allowlist or render trusted structured content.

🤖 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 `@skills/json-ld/rules/content-job-posting.md` at line 113, Sanitize
job.description before passing it to dangerouslySetInnerHTML in the job posting
render, using the project’s existing HTML sanitizer with an appropriate
allowlist. Keep the rendered description behavior while ensuring untrusted
ATS/database content cannot inject arbitrary markup or scripts.
skills/json-ld/rules/content-recipe.md (1)

112-124: 🎯 Functional Correctness | 🟠 Major | ⚡ Quick win

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
set -euo pipefail

printf '\n== content-recipe.md (around cited lines) ==\n'
sed -n '1,220p' skills/json-ld/rules/content-recipe.md

printf '\n== ecom-product.md (around cited lines) ==\n'
sed -n '1,220p' skills/json-ld/rules/ecom-product.md

printf '\n== structured-data related references ==\n'
rg -n "structured data|JSON-LD|aggregateRating|VideoObject|reviewBody|visible page content|recipe image|Recipe example|Product example" skills -S

Repository: robotostudio/team-memory

Length of output: 31607


🏁 Script executed:

#!/bin/bash
set -euo pipefail

printf '\n== Recipe rule around common mistakes / guidance ==\n'
sed -n '150,190p' skills/json-ld/rules/content-recipe.md

printf '\n== Product rule around common mistakes / guidance ==\n'
sed -n '120,150p' skills/json-ld/rules/ecom-product.md

printf '\n== AGENTS recipe section ==\n'
sed -n '1690,1810p' skills/json-ld/AGENTS.md

printf '\n== AGENTS product section ==\n'
sed -n '900,1045p' skills/json-ld/AGENTS.md

Repository: robotostudio/team-memory

Length of output: 12899


🌐 Web query:

Google structured data visible page content recipe product reviews aggregateRating video structured data match visible content

💡 Result:

Google's primary requirement for structured data is that it must be a true and complete representation of the content visible to users on the page [1][2]. Implementing structured data that describes information not visible to the user is considered misleading and a violation of Google's spam policies, which can result in manual actions or the loss of rich result eligibility [1][2][3]. Key principles regarding visible content and structured data include: Visible Content Match: Structured data must describe the same information that a user sees on the rendered page [1][4]. For example, if you include Recipe or Product structured data with an aggregateRating property, the rating and review information must be clearly visible to users on that same page [1][5][3]. Similarly, if you mark up a video, that video must be present and watchable on the page [1][2]. Completeness: You must include all relevant information that is visible to users in your structured data [1][2]. For instance, if a page displays multiple reviews, you should mark up all of those reviews rather than a selective subset [1][2]. Prohibition of Hidden Data: Do not mark up content that is hidden from the user, even if the information is factually accurate [6]. Creating or using structured data to describe content that is not present or visible on the page is explicitly discouraged and constitutes a misuse of structured data [6][7][3]. These guidelines apply universally to all structured data types, including Recipe, Product, and VideoObject [1][2]. While Google can read structured data injected dynamically via JavaScript, it still requires that the final rendered page match the structured data provided [6][3]. Failure to align structured data with visible page content is a common trigger for penalties because it misleads users who expect to see the information described in the search results [2][3].

Citations:


Keep the Recipe/Product JSON-LD matched to rendered content.

  • skills/json-ld/rules/content-recipe.md#L112-L124: this example emits image, aggregateRating, and video, but the page only renders text content. Either render those fields or remove them from JSON-LD.
  • skills/json-ld/rules/ecom-product.md#L84-L102: this example emits aggregateRating and review, but the page only renders the product name, description, and price. Either render the ratings/reviews or drop them from JSON-LD.
📍 Affects 2 files
  • skills/json-ld/rules/content-recipe.md#L112-L124 (this comment)
  • skills/json-ld/rules/ecom-product.md#L84-L102
🤖 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 `@skills/json-ld/rules/content-recipe.md` around lines 112 - 124, The Recipe
JSON-LD example in skills/json-ld/rules/content-recipe.md (lines 112-124) must
match the rendered text content: either add rendered image, rating, and video
fields or remove the corresponding image, aggregateRating, and video entries.
Apply the same correction to skills/json-ld/rules/ecom-product.md (lines 84-102)
by either rendering the rating/review content or removing aggregateRating and
review from the JSON-LD.
skills/json-ld/rules/ecom-product.md (1)

80-80: 🎯 Functional Correctness | 🟠 Major | ⚡ Quick win

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
set -euo pipefail

# Inspect the referenced file and nearby sections.
wc -l skills/json-ld/rules/ecom-product.md
sed -n '1,220p' skills/json-ld/rules/ecom-product.md

Repository: robotostudio/team-memory

Length of output: 5023


🌐 Web query:

Google Search Central Product structured data priceValidUntil required optional offer expiry

💡 Result:

The priceValidUntil property is an optional field in Google's Product structured data [1][2]. It is used to specify the date (in ISO 8601 format) after which a price is no longer available [1][2]. While it is not strictly required, it is recommended when applicable—particularly for sales, discounts, or other temporary price reductions—to ensure Google displays accurate and timely pricing information [2][3]. If you include the property, you should ensure the date is accurate; if the property indicates a past date, your product snippet or merchant listing may not display [1][4][2][5]. For context, other key properties like price and priceCurrency are fundamental for structured data to be effective, especially for merchant listing experiences [1][2][6]. If you see warnings regarding a "missing" priceValidUntil field in tools like the Rich Results Test, it is often a recommendation to improve the richness and accuracy of your data rather than a mandatory requirement that would prevent eligibility for all rich results [3].

Citations:


🏁 Script executed:

#!/bin/bash
set -euo pipefail

sed -n '120,150p' skills/json-ld/rules/ecom-product.md

Repository: robotostudio/team-memory

Length of output: 1798


Make priceValidUntil conditional and fix the guidance text.
priceValidUntil should only be emitted when the offer has a real expiry, and the 2026-12-31 example will age out. Update the later example too, and avoid describing the field as universally required.

🤖 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 `@skills/json-ld/rules/ecom-product.md` at line 80, Update the product offer
guidance around priceValidUntil so the field is emitted only when a genuine
expiration date exists, rather than being universally required. Replace the
aging 2026-12-31 example and update the later example to match the conditional
behavior, revising the accompanying guidance text accordingly.
skills/json-ld/rules/local-local-business.md (1)

140-152: 🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win

🧩 Analysis chain

🏁 Script executed:

sed -n '120,170p' skills/json-ld/rules/local-local-business.md

Repository: robotostudio/team-memory

Length of output: 2351


🌐 Web query:

Google Search Central local business structured data geo required recommended local pack latitude longitude

💡 Result:

According to official Google Search Central documentation, the geo property—which includes latitude and longitude—is categorized as a recommended property for LocalBusiness structured data, not a required one [1][2]. Key technical requirements and best practices include: 1. Recommended vs. Required: While the address property is typically required to define the business location [1][2], the geo property is recommended [1][2][3]. Including it provides search engines with a precise pin-drop location, which is particularly beneficial for businesses in areas where addresses might be ambiguous or shared [3]. 2. Technical Specification: When you choose to implement the geo property, it must use the GeoCoordinates type [1][2]. Both the latitude and longitude properties are required within that GeoCoordinates object [1][2][4]. 3. Precision: Google specifies that for the latitude and longitude values, the precision must be at least 5 decimal places [1][2]. Providing as much structured data as possible—including recommended properties like geo—is encouraged by Google to increase the quality of the information provided to users [2].

Citations:


🌐 Web query:

site:developers.google.com/search/docs local business structured data geo latitude longitude recommended required

💡 Result:

For LocalBusiness structured data as defined by Google, the geo-coordinates (latitude and longitude) are considered recommended properties rather than required properties [1]. While they are not strictly required for eligibility to appear as a rich result, providing accurate geo-coordinates is recommended to add more information about your business and can improve how Google understands and presents your location data [1]. When you choose to include them: - They must be implemented within a GeoCoordinates object [1]. - Both latitude and longitude are required within that object if the geo property is used [1]. - The precision for both latitude and longitude must be at least 5 decimal places [1]. Always prioritize the official Google Search Central documentation for LocalBusiness structured data requirements, as Google's specific implementation needs may differ from the broader definitions found on schema.org [1][2]. Ensure that your business also includes all mandatory required properties—such as name, address, and telephone (where applicable)—to maintain eligibility for rich result display [1].

Citations:


🏁 Script executed:

rg -n "latitude|longitude|geo|coordinates|decimal" skills/json-ld/rules/local-local-business.md

Repository: robotostudio/team-memory

Length of output: 541


Make geo recommended, not required, and use higher-precision coordinates. The guidance overstates geo as needed for local-pack placement, and the example latitude/longitude values only use 4 decimal places; use at least 5.

🧰 Tools
🪛 markdownlint-cli2 (0.23.0)

[warning] 151-151: 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 `@skills/json-ld/rules/local-local-business.md` around lines 140 - 152, Update
the `geo` row in the properties table to remain Recommended and revise its
description so it does not claim latitude and longitude are required for
local-pack placement. Update the related `Common Mistakes` guidance to avoid
presenting omitted `geo` as disqualifying, and change the example coordinate
values to use at least five decimal places.
skills/json-ld/rules/nav-website.md (1)

3-4: 🎯 Functional Correctness | 🟠 Major | ⚡ Quick win

Stop promising a sitelinks search box. Google removed this Search UI on November 21, 2024; SearchAction no longer enables it. Keep WebSite guidance for its remaining semantic/site-name value, but remove the feature promise and reassess its CRITICAL priority. (developers.google.com)

  • skills/json-ld/rules/nav-website.md#L3-L4: revise the impact metadata.
  • skills/json-ld/AGENTS.md#L287-L383: remove sitelinks-search-box guarantees from the description, property table, and mistakes.
  • skills/json-ld/SKILL.md#L52-L57: replace the “Sitelinks search box” result claim.
  • skills/json-ld/rules/audit-project.md#L130-L134: remove that promised implementation outcome.
📍 Affects 4 files
  • skills/json-ld/rules/nav-website.md#L3-L4 (this comment)
  • skills/json-ld/AGENTS.md#L287-L383
  • skills/json-ld/SKILL.md#L52-L57
  • skills/json-ld/rules/audit-project.md#L130-L134
🤖 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 `@skills/json-ld/rules/nav-website.md` around lines 3 - 4, Remove the outdated
sitelinks search box promise and lower the rule’s impact metadata in
skills/json-ld/rules/nav-website.md (lines 3-4). Update skills/json-ld/AGENTS.md
(lines 287-383) to retain WebSite semantic/site-name guidance while removing
sitelinks guarantees from the description, property table, and mistakes; replace
the result claim in skills/json-ld/SKILL.md (lines 52-57); and remove the
promised implementation outcome from skills/json-ld/rules/audit-project.md
(lines 130-134).
skills/json-ld/rules/org-organization.md (1)

12-15: 🎯 Functional Correctness | 🟠 Major | ⚡ Quick win

Correct the Organization requirements. Google has no required Organization properties, allows logo as either a URL or ImageObject, and recommends placing markup on the home/about page rather than every page. The current guidance contradicts both Google and this skill’s README example. (developers.google.com)

  • skills/json-ld/rules/org-organization.md#L12-L15: change “root layout/every page” to recommended single relevant page placement.
  • skills/json-ld/rules/org-organization.md#L86-L103: mark properties as recommended when applicable and permit URL or ImageObject logos.
  • skills/json-ld/AGENTS.md#L73-L76: correct placement guidance.
  • skills/json-ld/AGENTS.md#L147-L164: correct the required-property and logo-type claims.
🧰 Tools
🪛 markdownlint-cli2 (0.23.0)

[warning] 12-12: Headings should be surrounded by blank lines
Expected: 1; Actual: 0; Below

(MD022, blanks-around-headings)

📍 Affects 2 files
  • skills/json-ld/rules/org-organization.md#L12-L15 (this comment)
  • skills/json-ld/rules/org-organization.md#L86-L103
  • skills/json-ld/AGENTS.md#L73-L76
  • skills/json-ld/AGENTS.md#L147-L164
🤖 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 `@skills/json-ld/rules/org-organization.md` around lines 12 - 15, Correct
Organization guidance across skills/json-ld/rules/org-organization.md lines
12-15 and 86-103 and skills/json-ld/AGENTS.md lines 73-76 and 147-164: recommend
placing Organization markup on one relevant home/about page instead of every
page or the root layout, state that no Organization properties are required, and
allow logo values as either a URL or ImageObject while marking applicable
properties as recommended.
skills/json-ld/SKILL.md (2)

59-65: 🎯 Functional Correctness | 🟠 Major | ⚡ Quick win

Do not prioritize FAQPage for generic sites. Google limits FAQ rich results to well-known authoritative government and health sites, so calling it HIGH for “most sites” and promising an accordion produces misleading audit plans. (developers.google.com)

  • skills/json-ld/SKILL.md#L59-L65: qualify FAQ eligibility and lower its generic priority.
  • skills/json-ld/rules/audit-project.md#L140-L144: require an eligibility check before recommending FAQPage for the rich-result outcome.
🧰 Tools
🪛 markdownlint-cli2 (0.23.0)

[warning] 59-59: Headings should be surrounded by blank lines
Expected: 1; Actual: 0; Below

(MD022, blanks-around-headings)


[warning] 60-60: Tables should be surrounded by blank lines

(MD058, blanks-around-tables)

🪛 SkillSpector (2.3.11)

[error] 44: [OH1] Unvalidated Output Injection: Model output is used without validation or sanitization. Unvalidated output injected into downstream contexts (SQL, shell, HTML) enables injection attacks and arbitrary code execution.

Remediation: Validate and sanitize all model output before using it in downstream contexts. Use parameterized queries for SQL, shell quoting for commands, and HTML encoding for web output.

(Output Handling (OH1))

📍 Affects 2 files
  • skills/json-ld/SKILL.md#L59-L65 (this comment)
  • skills/json-ld/rules/audit-project.md#L140-L144
🤖 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 `@skills/json-ld/SKILL.md` around lines 59 - 65, The FAQPage entry in
skills/json-ld/SKILL.md (lines 59-65) must no longer be classified as HIGH for
most sites; qualify it for authoritative government and health sites and lower
its generic priority. In skills/json-ld/rules/audit-project.md (lines 140-144),
add an eligibility check before recommending FAQPage for rich-result outcomes.

67-74: 🎯 Functional Correctness | 🟠 Major | ⚡ Quick win

Remove the HowTo rich-result promise. Google deprecated HowTo rich results and removed HowTo support from the Rich Results Test. Present this as optional semantic markup, not a MEDIUM-priority Google rich-result implementation. (developers.google.com)

  • skills/json-ld/SKILL.md#L67-L74: remove “Step-by-step rich result” from the priority table.
  • skills/json-ld/AGENTS.md#L1045-L1196: revise the outcome and validation guidance.
🧰 Tools
🪛 markdownlint-cli2 (0.23.0)

[warning] 67-67: Headings should be surrounded by blank lines
Expected: 1; Actual: 0; Below

(MD022, blanks-around-headings)


[warning] 68-68: Tables should be surrounded by blank lines

(MD058, blanks-around-tables)

🪛 SkillSpector (2.3.11)

[error] 44: [OH1] Unvalidated Output Injection: Model output is used without validation or sanitization. Unvalidated output injected into downstream contexts (SQL, shell, HTML) enables injection attacks and arbitrary code execution.

Remediation: Validate and sanitize all model output before using it in downstream contexts. Use parameterized queries for SQL, shell quoting for commands, and HTML encoding for web output.

(Output Handling (OH1))

📍 Affects 2 files
  • skills/json-ld/SKILL.md#L67-L74 (this comment)
  • skills/json-ld/AGENTS.md#L1045-L1196
🤖 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 `@skills/json-ld/SKILL.md` around lines 67 - 74, Remove the HowTo row’s
“Step-by-step rich result” promise from the priority table in
skills/json-ld/SKILL.md at lines 67-74. In skills/json-ld/AGENTS.md lines
1045-1196, revise the HowTo outcome and validation guidance to present it as
optional semantic markup rather than a MEDIUM-priority Google rich-result
implementation; preserve guidance for supported schema validation.
skills/prep/SKILL.md (2)

31-36: 🎯 Functional Correctness | 🟠 Major | ⚡ Quick win

Fetch remote refs before validating custom branches.

Line [33] checks origin/<provided-name> before Line [36] runs git fetch origin. With stale local refs, an existing remote branch is incorrectly reported as missing and the user is asked again. Fetch before branch selection/validation, or fetch the requested ref directly.

Proposed ordering fix
 ## Step 2: Create Git Branch
 
+1. Run `git fetch origin` to ensure the latest refs.
+
 **A. Ask for base branch.**
 ...
-3. Option 3 (custom): use `origin/<provided-name>`. Verify it exists with `git rev-parse --verify origin/<branch>`.
+3. Option 3 (custom): use `origin/<provided-name>`. Verify it exists with `git rev-parse --verify origin/<branch>`.
 ...
-1. Run `git fetch origin` to ensure the latest refs.
📝 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.

1. Run `git fetch origin` to ensure the latest refs.

- Option 1 (Enter/main): use `origin/main`.
- Option 2 (current): use `origin/<current-branch>`. If current branch has no remote tracking, use the local branch as base.
- Option 3 (custom): use `origin/<provided-name>`. Verify it exists with `git rev-parse --verify origin/<branch>`. If not found, try the local ref. If neither exists, report the error and ask again.

**B. Create and checkout the branch.**
🤖 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 `@skills/prep/SKILL.md` around lines 31 - 36, Update the branch setup
instructions around the custom branch validation and “B. Create and checkout the
branch” so `git fetch origin` runs before checking `origin/<provided-name>` with
`git rev-parse --verify`. Preserve the existing fallback to the local ref and
error prompt, but ensure validation uses freshly fetched remote refs.

61-61: 📐 Maintainability & Code Quality | 🟡 Minor | ⚡ Quick win

Add a language identifier to the fenced example.

markdownlint-cli2 reports MD040 here. Use ```markdown (or another appropriate language) instead of an unlabeled fence.

🧰 Tools
🪛 markdownlint-cli2 (0.23.0)

[warning] 61-61: Fenced code blocks should have a language specified

(MD040, fenced-code-language)

🤖 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 `@skills/prep/SKILL.md` at line 61, Add a language identifier to the fenced
example in SKILL.md, using markdown (or another appropriate identifier)
immediately after the opening fence to satisfy markdownlint rule MD040.

Source: Linters/SAST tools

skills/sanity-plugin-md-notes/AUTHORING.md (1)

150-163: 🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win

Fix the example template’s closing fences.

The outer template closes at Line 150, so the Related and Walkthrough sections render outside the example. Lines 161-163 then create an empty fenced block, which also triggers MD040.

Proposed fix
-````
-
 ## Related
@@
 https://www.loom.com/share/<id>
 
-```
-
-```
+````
📝 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.

## Related

- [Edit the homepage](/structure/intent/edit/id=homepage;type=page)
- [Create a new article](/structure/intent/create/type=article)

## Walkthrough

https://www.loom.com/share/<id>

🧰 Tools
🪛 markdownlint-cli2 (0.23.0)

[warning] 161-161: Fenced code blocks should have a language specified

(MD040, fenced-code-language)

🤖 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 `@skills/sanity-plugin-md-notes/AUTHORING.md` around lines 150 - 163, Fix the
closing fence placement in the example template around the Related and
Walkthrough sections: remove the premature outer fence before ## Related and use
a single four-backtick fence after the Loom URL to close the entire template,
leaving no empty fenced block.

Source: Linters/SAST tools

skills/sanity-plugin-md-notes/OPT-IN.md (1)

133-144: 📐 Maintainability & Code Quality | 🟡 Minor | ⚡ Quick win

Add languages to all fenced code blocks.

These fences trigger MD040 and can fail documentation linting.

  • skills/sanity-plugin-md-notes/OPT-IN.md#L133-L144: mark the flowchart fence as text.
  • skills/sanity-plugin-md-notes/WPACK.md#L88-L90: mark the command fence as sh.
  • skills/sanity-plugin-md-notes/WPACK.md#L104-L106: mark the path-only fence as text.
🧰 Tools
🪛 markdownlint-cli2 (0.23.0)

[warning] 133-133: Fenced code blocks should have a language specified

(MD040, fenced-code-language)

📍 Affects 2 files
  • skills/sanity-plugin-md-notes/OPT-IN.md#L133-L144 (this comment)
  • skills/sanity-plugin-md-notes/WEBPACK.md#L88-L90
  • skills/sanity-plugin-md-notes/WEBPACK.md#L104-L106
🤖 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 `@skills/sanity-plugin-md-notes/OPT-IN.md` around lines 133 - 144, Markdown
fenced code blocks lack language identifiers and trigger MD040. Mark the
flowchart fence in skills/sanity-plugin-md-notes/OPT-IN.md lines 133-144 as
text, the command fence in skills/sanity-plugin-md-notes/WEBPACK.md lines 88-90
as sh, and the path-only fence in skills/sanity-plugin-md-notes/WEBPACK.md lines
104-106 as text.

Source: Linters/SAST tools

skills/sanity-plugin-md-notes/SKILL.md (1)

58-63: 🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win

Use a syntax-tolerant verification check for withHelp().

The prescribed search withHelp(<schemaName> does not match the canonical multiline form shown in OPT-IN.md. An agent may falsely conclude the schema is unwired and wrap it twice. Check for withHelp( in the target schema file, then inspect the surrounding AST/code manually.

🧰 Tools
🪛 SkillSpector (2.3.11)

[warning] 20: [MP2] Context Window Stuffing: Skill attempts to fill the context window with filler content, displacing legitimate instructions and safety constraints. This can degrade agent performance or bypass safety boundaries.

Remediation: Implement context-window management that detects and rejects padding or stuffing attempts. Prioritize system instructions over user-injected content.

(Memory Poisoning (MP2))


[warning] 20: [MP2] Context Window Stuffing: Skill attempts to fill the context window with filler content, displacing legitimate instructions and safety constraints. This can degrade agent performance or bypass safety boundaries.

Remediation: Implement context-window management that detects and rejects padding or stuffing attempts. Prioritize system instructions over user-injected content.

(Memory Poisoning (MP2))


[warning] 22: [MP2] Context Window Stuffing: Skill attempts to fill the context window with filler content, displacing legitimate instructions and safety constraints. This can degrade agent performance or bypass safety boundaries.

Remediation: Implement context-window management that detects and rejects padding or stuffing attempts. Prioritize system instructions over user-injected content.

(Memory Poisoning (MP2))


[warning] 22: [MP2] Context Window Stuffing: Skill attempts to fill the context window with filler content, displacing legitimate instructions and safety constraints. This can degrade agent performance or bypass safety boundaries.

Remediation: Implement context-window management that detects and rejects padding or stuffing attempts. Prioritize system instructions over user-injected content.

(Memory Poisoning (MP2))


[warning] 23: [MP2] Context Window Stuffing: Skill attempts to fill the context window with filler content, displacing legitimate instructions and safety constraints. This can degrade agent performance or bypass safety boundaries.

Remediation: Implement context-window management that detects and rejects padding or stuffing attempts. Prioritize system instructions over user-injected content.

(Memory Poisoning (MP2))


[warning] 24: [MP2] Context Window Stuffing: Skill attempts to fill the context window with filler content, displacing legitimate instructions and safety constraints. This can degrade agent performance or bypass safety boundaries.

Remediation: Implement context-window management that detects and rejects padding or stuffing attempts. Prioritize system instructions over user-injected content.

(Memory Poisoning (MP2))


[warning] 24: [MP2] Context Window Stuffing: Skill attempts to fill the context window with filler content, displacing legitimate instructions and safety constraints. This can degrade agent performance or bypass safety boundaries.

Remediation: Implement context-window management that detects and rejects padding or stuffing attempts. Prioritize system instructions over user-injected content.

(Memory Poisoning (MP2))


[warning] 25: [MP2] Context Window Stuffing: Skill attempts to fill the context window with filler content, displacing legitimate instructions and safety constraints. This can degrade agent performance or bypass safety boundaries.

Remediation: Implement context-window management that detects and rejects padding or stuffing attempts. Prioritize system instructions over user-injected content.

(Memory Poisoning (MP2))


[warning] 25: [MP2] Context Window Stuffing: Skill attempts to fill the context window with filler content, displacing legitimate instructions and safety constraints. This can degrade agent performance or bypass safety boundaries.

Remediation: Implement context-window management that detects and rejects padding or stuffing attempts. Prioritize system instructions over user-injected content.

(Memory Poisoning (MP2))


[warning] 26: [MP2] Context Window Stuffing: Skill attempts to fill the context window with filler content, displacing legitimate instructions and safety constraints. This can degrade agent performance or bypass safety boundaries.

Remediation: Implement context-window management that detects and rejects padding or stuffing attempts. Prioritize system instructions over user-injected content.

(Memory Poisoning (MP2))


[warning] 27: [MP2] Context Window Stuffing: Skill attempts to fill the context window with filler content, displacing legitimate instructions and safety constraints. This can degrade agent performance or bypass safety boundaries.

Remediation: Implement context-window management that detects and rejects padding or stuffing attempts. Prioritize system instructions over user-injected content.

(Memory Poisoning (MP2))


[warning] 27: [MP2] Context Window Stuffing: Skill attempts to fill the context window with filler content, displacing legitimate instructions and safety constraints. This can degrade agent performance or bypass safety boundaries.

Remediation: Implement context-window management that detects and rejects padding or stuffing attempts. Prioritize system instructions over user-injected content.

(Memory Poisoning (MP2))


[error] 69: [TM1] Tool Parameter Abuse: Tool parameters are crafted to achieve unintended or unsafe behavior. Parameter abuse can bypass intended safety checks (e.g. shell=True, --force, dangerous glob patterns).

Remediation: Validate all tool parameters against an allowlist. Reject dangerous parameter values (shell=True, --force, -rf /) and use safe defaults.

(Tool Misuse (TM1))


[error] 87: [TM1] Tool Parameter Abuse: Tool parameters are crafted to achieve unintended or unsafe behavior. Parameter abuse can bypass intended safety checks (e.g. shell=True, --force, dangerous glob patterns).

Remediation: Validate all tool parameters against an allowlist. Reject dangerous parameter values (shell=True, --force, -rf /) and use safe defaults.

(Tool Misuse (TM1))

🤖 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 `@skills/sanity-plugin-md-notes/SKILL.md` around lines 58 - 63, Update the
“Static checks you run” guidance for withHelp verification: search for any
withHelp( occurrence in the target schema file rather than requiring the
single-line withHelp(<schemaName> pattern, then inspect the surrounding code or
AST to confirm the schema is wired and avoid duplicate wrapping. Keep the other
prescribed checks unchanged.
skills/sanity-plugin-md-notes/VITE.md (2)

13-21: 🗄️ Data Integrity & Integration | 🟠 Major | ⚡ Quick win

Append sanityHelpVite() instead of replacing existing Vite plugins.

This example is presented as an edit to an existing vite.config.ts, but assigning plugins: [sanityHelpVite()] removes any existing React, Sanity, or other Vite plugins. Show the plugin being appended to the existing array and explicitly preserve the rest of the config.

Proposed fix
 export default defineConfig({
-  plugins: [sanityHelpVite()],
+  plugins: [
+    // ...existing plugins
+    sanityHelpVite(),
+  ],
 })
📝 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.

import { defineConfig } from 'vite'
import { sanityHelpVite } from 'sanity-plugin-md-notes/vite'

export default defineConfig({
  plugins: [
    // ...existing plugins
    sanityHelpVite(),
  ],
})
🤖 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 `@skills/sanity-plugin-md-notes/VITE.md` around lines 13 - 21, Update the
vite.config.ts example to preserve the existing Vite configuration and plugins,
appending sanityHelpVite() to the current plugins array rather than replacing
it. Show the existing config structure as retained while adding the new plugin.

42-55: 🎯 Functional Correctness | 🟠 Major | ⚡ Quick win

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
set -euo pipefail

printf '\n== File context ==\n'
sed -n '1,120p' skills/sanity-plugin-md-notes/VITE.md | cat -n

printf '\n== Search for related tsconfig/types guidance ==\n'
rg -n --hidden --glob '!**/.git/**' -S 'vite/client|compilerOptions.types|ImportMeta\.glob|tsconfig.json' skills || true

Repository: robotostudio/team-memory

Length of output: 5858


🌐 Web query:

Vite import.meta.glob type declarations compilerOptions.types vite/client triple-slash reference types

💡 Result:

To ensure TypeScript recognizes Vite-specific features like import.meta.glob, you must include Vite's client-side type definitions in your project [1][2]. Vite provides these definitions via the vite/client package [1][3]. You can make these types available in your TypeScript configuration using one of the following two methods: Method 1: compilerOptions.types Add vite/client to the types array within your tsconfig.json file [1][4]: { "compilerOptions": { "types": ["vite/client"] } } Note: If you specify the types array, TypeScript will only include the listed packages in the global scope, excluding other visible @types packages [1][3]. Method 2: Triple-Slash Reference Alternatively, if you prefer not to modify compilerOptions.types or need to maintain existing type includes, you can use a triple-slash directive in a TypeScript declaration file (e.g., vite-env.d.ts) [5]: /// The vite/client definitions shim the environment for client-side code, providing types for: - The import.meta.glob function [4][2]. - Vite-injected constants on import.meta.env [1][3]. - The HMR API on import.meta.hot [1][3]. - Asset imports (e.g.,.svg,.css) [1][3][6]. If you are using custom type overrides for assets, ensure that your override declaration file is included in your tsconfig.json and that the reference to your override file precedes the reference to vite/client [5].

Citations:


Only skip when vite/client is already included
A missing compilerOptions.types array doesn’t prove import.meta.glob types are available. Skip this step only if vite/client is present via compilerOptions.types or a /// <reference types="vite/client" /> declaration.

🤖 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 `@skills/sanity-plugin-md-notes/VITE.md` around lines 42 - 55, Update the
VITE.md guidance so the step is skipped only when "vite/client" is explicitly
available through compilerOptions.types or a /// <reference types="vite/client"
/> declaration. Remove the instruction to skip when compilerOptions.types is
absent, and retain the existing instruction to add "vite/client" when neither
inclusion is present.
skills/sanity-plugin-md-notes/WEBPACK.md (2)

35-40: 🎯 Functional Correctness | 🟠 Major | ⚡ Quick win

🧩 Analysis chain

🏁 Script executed:

sed -n '1,140p' skills/sanity-plugin-md-notes/WEBPACK.md

Repository: robotostudio/team-memory

Length of output: 4885


🌐 Web query:

Webpack oneOf top-level rules and Next.js webpack config duplicate rule application semantics

💡 Result:

In Webpack, the oneOf property and the rules property define distinct behaviors for how modules are processed [1][2]. Webpack oneOf Semantics: The oneOf property takes an array of rules [1][3]. Webpack iterates through these rules and applies only the first one that matches the module [1][3]. Once a match is found and applied, Webpack stops evaluating subsequent rules within that oneOf block [1][4]. This makes oneOf ideal for conditional logic, such as using different loaders based on resource queries (e.g., handling a file differently if it has an?inline query vs. a default type) [1][5]. Webpack rules Semantics: In contrast, rules (or nested rules) within a parent rule are all evaluated [2]. If a module matches the parent rule, all rules defined in its rules array are also checked and applied if they match, effectively allowing multiple loaders or rule configurations to be applied to the same module in sequence [2][5]. Next.js Webpack Configuration: Next.js provides a webpack function in next.config.js that allows you to extend the internal Webpack configuration [6]. When customizing this configuration: 1. Rule Extension: You typically push new rules to config.module.rules [6]. Because Next.js maintains its own complex set of internal loaders and rules, modifying these requires caution [6][7]. 2. Duplicate Application Risks: Next.js uses internal heuristics and explicit loader references to manage features like Fast Refresh and built-in CSS/Sass support [7][8][9]. If you manually push a rule that overlaps with or duplicates the functionality of an internal Next.js rule (e.g., adding a custom babel-loader rule), you risk conflicts, duplicate module errors, or performance degradation [10][8][9]. 3. Best Practices: Next.js internal configuration often uses specific loader instances. When you need to wrap or extend these, it is safer to check the existing rules for specific loader matches (like defaultLoaders.babel) rather than simply appending new, redundant rules to the main array [6][7][8]. If you encounter "duplicate module" errors, it is often because multiple rules are attempting to transform the same files, often due to wildcard matches or insufficiently specific test/include conditions [10][9]. Top Results: [1], [2], [6], [7], [8]

Citations:


🌐 Web query:

webpack multiple matching rules same module asset/source oneOf top-level duplicate application

💡 Result:

In Webpack, when multiple rules match the same module, the behavior depends on whether the rules are in a standard rules array or wrapped in a oneOf block [1][2]. Standard Rules Array When rules are defined in the top-level module.rules array, Webpack evaluates all of them [3]. If multiple rules match a module, all matching rules will be applied [3]. This allows you to chain loaders or apply different configurations (such as parser settings) sequentially to the same file [3]. Rule.oneOf The oneOf property is specifically designed to handle cases where you want to choose only one rule [1][4]. When a module matches a oneOf block, Webpack iterates through the rules inside the array and applies only the first one that matches [1][5]. Subsequent matching rules within that same oneOf block are ignored [1][2]. This is frequently used for asset modules to select between different processing strategies (e.g., inlining vs. emitting a separate file) based on resource queries [1][5]. Duplicate Application If you accidentally have multiple top-level rules that both attempt to process the same file, Webpack will apply both sets of loaders or configurations [3]. For example, if you have two rules that both use the same asset/source type or different loaders for the same file extension, Webpack may process the file multiple times or throw errors if the configurations conflict [3]. To prevent this, use oneOf to ensure a single, mutually exclusive match, or use specific conditions (like resourceQuery or exclude) to ensure that rules are targeted correctly and do not overlap unintentionally [5]. If you intended for a module to be processed by different rules, ensure that the rules are intended to be additive. If the goal is to choose one behavior, the oneOf construct is the authoritative way to enforce single-rule matching [1][5].

Citations:


Avoid registering the same .help.md rule in both paths. module.rules entries are all evaluated, so unshifting this rule at the root and into every oneOf can make the same file match twice. Add it to the relevant oneOf branch, and only fall back to module.rules when no oneOf exists.

🤖 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 `@skills/sanity-plugin-md-notes/WEBPACK.md` around lines 35 - 40, Update the
webpack configuration callback so the helpMdRule is registered in the relevant
oneOf branch when one exists, and only unshift it into config.module.rules when
no oneOf branch is available. Ensure each .help.md file can match the rule only
once and avoid adding the same rule through both paths.

79-90: 🗄️ Data Integrity & Integration | 🟠 Major | ⚡ Quick win

Use the same codegen paths for predev, prebuild, and the watcher.

The custom-path example changes only dev to --in ./src/... --out ./src/..., while predev and prebuild still run the default paths. This can leave the imported generated module missing or stale during development/builds.

Define one shared command or repeat the identical --in/--out flags in all three scripts.

🧰 Tools
🪛 markdownlint-cli2 (0.23.0)

[warning] 88-88: Fenced code blocks should have a language specified

(MD040, fenced-code-language)

🤖 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 `@skills/sanity-plugin-md-notes/WEBPACK.md` around lines 79 - 90, Align the
package scripts for dev, predev, and prebuild so they all invoke codegen with
the same custom --in and --out paths. Update the watcher command and both
lifecycle scripts consistently, preferably by reusing one shared command to
prevent path drift.
skills/ship-pr/SKILL.md (1)

72-77: 🗄️ Data Integrity & Integration | 🟠 Major | ⚡ Quick win

Document a recovery path for failed Linear updates.

If attaching the PR or moving the ticket fails, merely warning leaves the PR and Linear state inconsistent; rerunning /ship-pr will stop at Step 2 because the working tree is clean. Report which operation failed and provide a sync-only retry/manual remediation path without recreating or rolling back the PR.

🧰 Tools
🪛 markdownlint-cli2 (0.23.0)

[warning] 77-77: Files should end with a single newline character

(MD047, single-trailing-newline)

🤖 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 `@skills/ship-pr/SKILL.md` around lines 72 - 77, Update Step 6 of the ship-pr
workflow to document recovery when attaching the PR URL or moving the Linear
ticket to “In Review” fails: identify the failed operation, preserve the
existing PR, and provide a sync-only retry or manual remediation path that does
not recreate or roll back the PR.
skills/ui-match/references/linear.md (3)

3-7: 🎯 Functional Correctness | 🟠 Major | ⚡ Quick win

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
set -euo pipefail

printf 'Files:\n'
git ls-files 'skills/ui-match/references/linear.md' 'skills/pr-review-orchestrator/SKILL.md' 'skills/**/SKILL.md' | sed -n '1,50p'

printf '\nOutline linear.md:\n'
ast-grep outline skills/ui-match/references/linear.md --view expanded || true

printf '\nOutline pr-review-orchestrator/SKILL.md:\n'
ast-grep outline skills/pr-review-orchestrator/SKILL.md --view expanded || true

printf '\nSearch for Linear MCP tool references and ToolSearch:\n'
rg -n 'ToolSearch|mcp__.*linear|plugin_linear|authenticate|namespace|Linear MCP' skills -S

Repository: robotostudio/team-memory

Length of output: 3195


🏁 Script executed:

#!/bin/bash
set -euo pipefail

printf 'Files:\n'
git ls-files 'skills/ui-match/references/linear.md' 'skills/pr-review-orchestrator/SKILL.md' 'skills/**/SKILL.md' | sed -n '1,80p'

printf '\n--- linear.md ---\n'
nl -ba skills/ui-match/references/linear.md | sed -n '1,120p'

printf '\n--- pr-review-orchestrator/SKILL.md (first 240 lines) ---\n'
nl -ba skills/pr-review-orchestrator/SKILL.md | sed -n '1,240p'

printf '\n--- Search for Linear MCP tool references and discovery logic ---\n'
rg -n 'ToolSearch|mcp__.*linear|plugin_linear|authenticate|Linear MCP|namespace' skills -S

Repository: robotostudio/team-memory

Length of output: 437


🏁 Script executed:

#!/bin/bash
set -euo pipefail

printf '%s\n' '--- skills/ui-match/references/linear.md ---'
sed -n '1,80p' skills/ui-match/references/linear.md

printf '\n%s\n' '--- skills/ui-match/README.md ---'
sed -n '1,120p' skills/ui-match/README.md

printf '\n%s\n' '--- skills/ui-match/SKILL.md ---'
sed -n '1,160p' skills/ui-match/SKILL.md

printf '\n%s\n' '--- skills/pr-review-orchestrator/SKILL.md (relevant section) ---'
sed -n '55,85p' skills/pr-review-orchestrator/SKILL.md

Repository: robotostudio/team-memory

Length of output: 12933


Discover the Linear MCP tools before selecting a namespace.
skills/pr-review-orchestrator/SKILL.md already treats Linear tool names as variable (ToolSearch("+linear")), but this file hard-codes mcp__plugin_linear_linear__*. That will fail on installs using a different namespace and can block the auth fallback.

🤖 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 `@skills/ui-match/references/linear.md` around lines 3 - 7, Update the Linear
MCP guidance in the referenced workflow documentation to require discovering
available Linear tools with ToolSearch("+linear") before selecting or invoking a
namespace. Replace the hard-coded mcp__plugin_linear_linear__ references,
including the authentication fallback, with instructions that use the discovered
tool names while preserving the existing OAuth authentication flow.

17-19: 🗄️ Data Integrity & Integration | 🟠 Major | ⚡ Quick win

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
set -euo pipefail

printf '\n## file outline\n'
wc -l skills/ui-match/references/linear.md
sed -n '1,140p' skills/ui-match/references/linear.md

printf '\n## search identifiers\n'
rg -n "ticketUrl|ticketKey|save_issue|Linear" skills -S

Repository: robotostudio/team-memory

Length of output: 15139


🏁 Script executed:

#!/bin/bash
set -euo pipefail

echo "== skills/ui-match/references/linear.md (1-140) =="
sed -n '1,140p' skills/ui-match/references/linear.md

echo
echo "== matches for ticketUrl / ticketKey / save_issue =="
rg -n "ticketUrl|ticketKey|save_issue|Linear" skills/ui-match -S

Repository: robotostudio/team-memory

Length of output: 7663


🏁 Script executed:

#!/bin/bash
set -euo pipefail

echo "== findings.json references =="
rg -n "findings\.json|ticketUrl|ticketKey" .

echo
echo "== ui-match skill docs around ticket filing =="
sed -n '40,80p' skills/ui-match/SKILL.md

Repository: robotostudio/team-memory

Length of output: 3208


🏁 Script executed:

#!/bin/bash
set -euo pipefail

sed -n '1,120p' skills/ui-match/references/findings.md

Repository: robotostudio/team-memory

Length of output: 1465


Reuse the stored Linear ticket on reruns. ticketUrl/ticketKey are only written after creation, and findings.json is overwritten on reruns, so the same page will create duplicate Linear issues instead of updating the existing one. Look up the saved ticket first, or document that reruns intentionally create a new issue.

🧰 Tools
🪛 markdownlint-cli2 (0.23.0)

[warning] 17-17: 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 `@skills/ui-match/references/linear.md` around lines 17 - 19, Update the Linear
issue workflow described in the “Upload each screenshot” section to reuse an
existing ticket on reruns by looking up the previously stored ticketUrl or
ticketKey before creating a new issue, then update that ticket instead of
creating a duplicate. If reuse cannot be supported, explicitly document that
reruns intentionally create new issues.

34-44: 🩺 Stability & Availability | 🟡 Minor | ⚡ Quick win

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
set -euo pipefail

printf '--- file: skills/ui-match/references/linear.md (around lines 1-120) ---\n'
nl -ba skills/ui-match/references/linear.md | sed -n '1,120p'

Repository: robotostudio/team-memory

Length of output: 253


🏁 Script executed:

#!/bin/bash
set -euo pipefail

printf -- '--- file: skills/ui-match/references/linear.md (around lines 1-120) ---\n'
nl -ba skills/ui-match/references/linear.md | sed -n '1,120p'

Repository: robotostudio/team-memory

Length of output: 274


🏁 Script executed:

python3 - <<'PY'
from pathlib import Path
path = Path('skills/ui-match/references/linear.md')
for i, line in enumerate(path.read_text().splitlines(), 1):
    if 1 <= i <= 120:
        print(f"{i:4d}: {line}")
PY

Repository: robotostudio/team-memory

Length of output: 5415


Stop on non-200 upload responses in skills/ui-match/references/linear.md:34-44. curl only prints the status code here, so a failed PUT can still flow into save_issue with a dead assetUrl; retry or abort before embedding the image.

🧰 Tools
🪛 LanguageTool

[uncategorized] ~42-~42: Did you mean the formatting language “Markdown” (= proper noun)?
Context: .... Just reference the bare assetUrl in markdown: ![<title>](<assetUrl>). When you `sa...

(MARKDOWN_NNP)

🪛 markdownlint-cli2 (0.23.0)

[warning] 34-34: Fenced code blocks should be surrounded by blank lines

(MD031, blanks-around-fences)


[warning] 39-39: Fenced code blocks should be surrounded by blank lines

(MD031, blanks-around-fences)

🤖 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 `@skills/ui-match/references/linear.md` around lines 34 - 44, Update the upload
command in the prepare/upload flow to capture and validate the HTTP status
before embedding the returned assetUrl. Treat any non-200 PUT response as a
failed upload and retry or abort without calling save_issue or referencing the
dead assetUrl; preserve the existing inline markdown behavior for successful
uploads.
skills/ui-match/scripts/site_sections.js (2)

7-8: 🎯 Functional Correctness | 🟠 Major | 🏗️ Heavy lift

Include the full page shell, not only <main>.

Selecting <main> unconditionally excludes visible header and footer siblings. The skill promises full-page parity, and findings.md even uses Footer as a matched example. Build the inventory from the page shell, or merge visible header/main/footer sections in DOM order.

🤖 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 `@skills/ui-match/scripts/site_sections.js` around lines 7 - 8, Update the
candidate selection and host setup around candidates and host so inventory
generation includes the full visible page shell rather than preferring main
alone. Merge visible header, main, and footer sections in DOM order, or select
the appropriate page-shell container, while preserving the body fallback when no
shell is available.

19-21: 🎯 Functional Correctness | 🟠 Major | ⚡ Quick win

Do not discard visible sections solely because they are under 40px.

A slim announcement bar, navigation strip, or legal section can be a legitimate component. Skipping it removes it from the site inventory and can produce false missing findings. Filter zero-height/hidden nodes only, or make the threshold explicit and configurable.

🤖 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 `@skills/ui-match/scripts/site_sections.js` around lines 19 - 21, Update the
section filtering logic in the visible-section collection flow to retain visible
elements with heights below 40px. Only exclude zero-height or hidden elements,
or replace the fixed threshold with an explicit configurable threshold while
preserving legitimate slim sections in the inventory.
skills/ui-match/SKILL.md (2)

25-26: 🎯 Functional Correctness | 🟠 Major | ⚡ Quick win

Clear the per-page output before a rerun.

mkdir -p preserves old NN-*.png and chunk-*.png files. A rerun with fewer or renamed sections can therefore leave stale screenshots beside the new findings. Delete the validated page’s figma and site directories, or clean generated files, before recreating them.

🧰 Tools
🪛 SkillSpector (2.3.11)

[warning] 50: [RA2] Session Persistence: Skill establishes unauthorized persistence across sessions via cron jobs, startup scripts, or state files. Session persistence allows an attacker to maintain access beyond the current interaction.

Remediation: Remove any persistence mechanisms (cron jobs, startup scripts, state files). Skills should not maintain state across sessions without explicit user consent.

(Rogue Agent (RA2))

🤖 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 `@skills/ui-match/SKILL.md` around lines 25 - 26, Update the per-page setup
instructions for SLUG in SKILL.md to remove the existing
/tmp/ui-match/$SLUG/figma and /tmp/ui-match/$SLUG/site directories, including
generated screenshots, before recreating them with mkdir -p. Preserve the
existing directory layout and ensure cleanup is scoped only to the validated
page.

35-41: 🩺 Stability & Availability | 🟠 Major | ⚡ Quick win

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
set -euo pipefail

# Inspect the relevant skill doc and the referenced capture guide.
sed -n '1,140p' skills/ui-match/SKILL.md
printf '\n--- capture.md ---\n'
sed -n '1,220p' skills/ui-match/references/capture.md

Repository: robotostudio/team-memory

Length of output: 8034


🏁 Script executed:

#!/bin/bash
set -euo pipefail

# Find any other mentions of screenshot fallback / error handling in this skill.
rg -n "fallback|permission|MCP|screenshot|PNG" skills/ui-match -S

Repository: robotostudio/team-memory

Length of output: 4453


Use the PNG fallback for any MCP failure.
skills/ui-match/SKILL.md:35-41 only falls back on access/permission errors. If the Figma tool is unavailable, times out, or returns a non-image/error response, the PNG export is ignored and the Figma inventory can’t be built. Fall back on any failed MCP capture and keep the diagnostic.

🧰 Tools
🪛 markdownlint-cli2 (0.23.0)

[warning] 35-35: Headings should be surrounded by blank lines
Expected: 1; Actual: 0; Below

(MD022, blanks-around-headings)

🪛 SkillSpector (2.3.11)

[warning] 50: [RA2] Session Persistence: Skill establishes unauthorized persistence across sessions via cron jobs, startup scripts, or state files. Session persistence allows an attacker to maintain access beyond the current interaction.

Remediation: Remove any persistence mechanisms (cron jobs, startup scripts, state files). Skills should not maintain state across sessions without explicit user consent.

(Rogue Agent (RA2))

🤖 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 `@skills/ui-match/SKILL.md` around lines 35 - 41, Update the Figma capture
instructions in the “Get the Figma pixels” section to fall back to the
user-provided PNG for any MCP capture failure, including unavailable tools,
timeouts, permission errors, and non-image responses. Preserve the requirement
to retain the failure diagnostic while continuing with PNG segmentation and
Figma inventory creation.

The four-backtick fence closed early, so Related and Walkthrough escaped the example template and rendered as real headings, followed by an empty code block.
@voidhrithik
voidhrithik merged commit a295639 into main Jul 22, 2026
2 checks passed
@anshroboto
anshroboto deleted the chore/move-skills-to-top-level branch July 22, 2026 05:21
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants