feat: Add query-index-optimizer skill for EDS content ops - #189
Conversation
|
@dominique-pfister this seems to be your area of expertise, can you take a look, please? |
|
|
||
| ### Key Concepts | ||
|
|
||
| - **helix-query.yaml** — Lives in the GitHub repo root. Defines which properties to index and how they are sourced (from metadata, headings, or content). |
There was a problem hiding this comment.
This is no longer true: it lives in the configuration, see: https://www.aem.live/developer/indexing#setting-up-an-initial-index-with-the-index-admin-tool
| ### Key Concepts | ||
|
|
||
| - **helix-query.yaml** — Lives in the GitHub repo root. Defines which properties to index and how they are sourced (from metadata, headings, or content). | ||
| - **query-index.json** — The live JSON endpoint. Returns an array of page entries with the indexed properties. |
There was a problem hiding this comment.
This is just the default name of the query index, it can also be named differently.
| - **helix-query.yaml** — Lives in the GitHub repo root. Defines which properties to index and how they are sourced (from metadata, headings, or content). | ||
| - **query-index.json** — The live JSON endpoint. Returns an array of page entries with the indexed properties. | ||
| - **Consumers** — Blocks and components that fetch `query-index.json` to build dynamic lists: navigation, footer, card lists, search results, recent posts, tag-filtered collections. | ||
| - **Default limit** — The index returns a maximum of 500 entries by default. Sites with more pages need to paginate or increase the limit. |
There was a problem hiding this comment.
Wrong, it returns 1000 entries by default, as documented here: https://www.aem.live/developer/spreadsheets#offset-and-limit
| - **query-index.json** — The live JSON endpoint. Returns an array of page entries with the indexed properties. | ||
| - **Consumers** — Blocks and components that fetch `query-index.json` to build dynamic lists: navigation, footer, card lists, search results, recent posts, tag-filtered collections. | ||
| - **Default limit** — The index returns a maximum of 500 entries by default. Sites with more pages need to paginate or increase the limit. | ||
| - **Index freshness** — The index updates when pages are previewed or published via Sidekick. Unpublished pages remain in the index until explicitly removed. |
There was a problem hiding this comment.
Wrong, should be:
The index updates when pages are published. (via Sidekick or programmatically does not matter)
|
|
||
| ## How the EDS Query Index Works | ||
|
|
||
| The query index is the primary mechanism for blocks and components to discover and list content in an EDS site. It is configured via a `helix-query.yaml` file in the GitHub repository and served as JSON at `/query-index.json`. |
There was a problem hiding this comment.
No, configured via Index Admin: https://www.aem.live/developer/indexing#setting-up-an-initial-index-with-the-index-admin-tool
dominique-pfister
left a comment
There was a problem hiding this comment.
Already found 4 errors in the first few lines that are repeated later, please fix and align with the current documentation.
…docs Address @dominique-pfister review: - Index is configured via the Index Admin tool / Admin API, not a helix-query.yaml file in the GitHub repo - query-index.json is the default index name; indices can be named differently - Default entry limit is 1000, not 500 (per the spreadsheets doc) - Pages are indexed on publish, not preview - Cite the indexing and spreadsheets docs as sources of truth Co-Authored-By: claude-flow <ruv@ruv.net>
|
Thanks @dominique-pfister — these are exactly right, and I appreciate the careful review with the doc links. I've corrected all four against the current docs: index configured via the Index Admin tool (not a repo You're right that these repeat — we're doing a documentation-grounded pass over the rest of our skills to catch the same class of staleness. Appreciate you keeping the bar high. |
|
@dominique-pfister @trieloff — your review here prompted us to audit our entire content-ops suite against the current aem.live docs, not just this skill. We found the same class of staleness (the Would you prefer one PR per skill (per the usual process here) or a single batched corrections PR? Happy to do whichever is easiest to review. Thanks again — the review made the whole set better. |
|
One PR per skill, please. |
|
cc @trieloff Friendly nudge — Dominique's four corrections were fixed and pushed on June 29, each aligned with the current aem.live docs and cited in the reference file. And understood on one PR per skill for the corrections to the already-merged skills — we'll submit those individually. Anything else needed on this one? (The red |
|
Thanks @dominique-pfister. All five are fixed and aligned with the current docs. Index configuration is now described as managed via the Index Admin tool (not a repo file), query-index.json is called out as the default name (sites can define others), the default limit is corrected to 1000 with the offset/limit doc linked, and the index is described as updating when pages are published (Sidekick or programmatic, the method does not matter). Ready for another look whenever you have a moment. |
|
The failing This PR comes from a fork, and GitHub does not expose repository secrets to workflow runs triggered by The workflow then counts that tool/auth error as a failure and reports it as Local review resultI ran the review locally against this PR's head ( Review Score: 85% — passes the 80% threshold.
Optional polish the judge suggested, if you'd like to raise the content score:
None of these are blocking — the skill passes as-is. I'm opening a separate PR to fix the workflow so fork PRs are handled properly (skipped cleanly when the token isn't available, instead of reported as a quality failure). |
|
Follow-up: the workflow fix is up as #308 — it makes fork PRs work, drops the deprecated |
|
Correction to my earlier comments — I was working from a stale checkout of The root cause I described is right: that run was an unauthenticated Tessl CLI, because
So the fix landed about 72 minutes after this run. The red check above is simply stale. It is over a month old, so GitHub will not let it be re-run directly. Re-triggering it needs a new commit on the branch, or the branch to be updated from My local review result stands and is unchanged — this skill scores 85% and passes the 80% threshold. |
When the Tessl CLI fails to run at all — auth failure, network error, crash — the job counted it as a review failure and reported it as "N skill(s) scored below 80%". That is misleading: the skill was never scored. On #189 this surfaced as a red "below 80%" check on a skill that actually scores 85%, which reads to a contributor as a quality rejection. Track those separately as errors and report them as "review could not be run", with a⚠️ row and an explanatory note in the step summary. They still fail the job — they are just no longer confused with low scores. Also: - Skip cleanly with an explanatory summary when TESSL_TOKEN is not configured, instead of running an unauthenticated CLI and failing. - Pin actions/checkout and tesslio/setup-tessl to commit SHAs, with `# vN` comments so Renovate keeps tracking them. - Add a concurrency group so superseded runs are cancelled. - Use a single redirect block in the skip summary, silencing the one actionlint/shellcheck warning (SC2129) in this file. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Signed-off-by: Lars Trieloff <lars@trieloff.net>
…pets + a definition-vs-live checkpoint (per @trieloff) - Trim Step 3 to a concise consumer map (drop explanations the agent already knows). - Add executable snippets for Step 4 (sitemap vs index diff) and Step 5 (stale-entry HTTP check). - Add a Checkpoint between Steps 2 and 3 to reconcile the index definition against the live output before mapping consumers.
Summary
Adds the query-index-optimizer skill to the EDS content ops plugin.
Audits and tunes the query index — analyzes indexed properties against actual usage, checks index size and pagination, and generates helix-query.yaml recommendations.
Follows the established format (functional description, External Content Safety, concrete code examples, reference file for progressive disclosure, Apache-2.0). Submitted as a standalone PR per @trieloff's request to keep one skill per PR.
Test plan