@olegkoval/agent-skills 1.74.1 → 1.75.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +5 -3
- package/adapters/claude/olko-github-pr/skills/lekker-review/scripts/eval-runner.mjs +34 -0
- package/adapters/claude/olko-github-pr/skills/lekker-review/scripts/finding-core.mjs +34 -0
- package/adapters/claude/olko-github-pr/skills/lekker-review/scripts/validate-lines.mjs +3 -33
- package/adapters/claude/olko-web-ops/skills/evidence-dashboards/SKILL.md +112 -0
- package/adapters/claude/olko-web-ops/skills/evidence-dashboards/references/design-standard.md +67 -0
- package/adapters/claude/olko-web-ops/skills/evidence-dashboards/references/roazon-playbook.md +47 -0
- package/adapters/claude/olko-web-ops/skills/evidence-dashboards/references/specification.md +59 -0
- package/adapters/codex/olko-web-ops/README.md +1 -0
- package/adapters/cursor/olko-web-ops/skills/evidence-dashboards/SKILL.md +112 -0
- package/adapters/cursor/olko-web-ops/skills/evidence-dashboards/references/design-standard.md +67 -0
- package/adapters/cursor/olko-web-ops/skills/evidence-dashboards/references/roazon-playbook.md +47 -0
- package/adapters/cursor/olko-web-ops/skills/evidence-dashboards/references/specification.md +59 -0
- package/adapters/grok/olko-web-ops/skills/evidence-dashboards/SKILL.md +112 -0
- package/adapters/grok/olko-web-ops/skills/evidence-dashboards/references/design-standard.md +67 -0
- package/adapters/grok/olko-web-ops/skills/evidence-dashboards/references/roazon-playbook.md +47 -0
- package/adapters/grok/olko-web-ops/skills/evidence-dashboards/references/specification.md +59 -0
- package/adapters/hermes/olko-web-ops/README.md +1 -0
- package/adapters/pi/olko-web-ops/README.md +1 -0
- package/catalog/skills.json +21 -0
- package/package.json +1 -1
- package/plugins/olko-apple-kit/.claude-plugin/plugin.json +1 -1
- package/plugins/olko-creative/.claude-plugin/plugin.json +1 -1
- package/plugins/olko-garmin-kit/.claude-plugin/plugin.json +1 -1
- package/plugins/olko-git-tools/.claude-plugin/plugin.json +1 -1
- package/plugins/olko-github-pr/.claude-plugin/plugin.json +1 -1
- package/plugins/olko-github-pr/skills/lekker-review/scripts/eval-runner.mjs +34 -0
- package/plugins/olko-github-pr/skills/lekker-review/scripts/finding-core.mjs +34 -0
- package/plugins/olko-github-pr/skills/lekker-review/scripts/validate-lines.mjs +3 -33
- package/plugins/olko-obsidian/.claude-plugin/plugin.json +1 -1
- package/plugins/olko-product/.claude-plugin/plugin.json +1 -1
- package/plugins/olko-reflection/.claude-plugin/plugin.json +1 -1
- package/plugins/olko-release/.claude-plugin/plugin.json +1 -1
- package/plugins/olko-skill-meta/.claude-plugin/plugin.json +1 -1
- package/plugins/olko-web-ops/.claude-plugin/plugin.json +1 -1
- package/plugins/olko-web-ops/skills/evidence-dashboards/SKILL.md +111 -0
- package/plugins/olko-web-ops/skills/evidence-dashboards/references/design-standard.md +67 -0
- package/plugins/olko-web-ops/skills/evidence-dashboards/references/roazon-playbook.md +47 -0
- package/plugins/olko-web-ops/skills/evidence-dashboards/references/specification.md +59 -0
- package/scripts/lib/catalog.mjs +1 -1
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
# Visual and semantic standard
|
|
2
|
+
|
|
3
|
+
Use these as practical defaults, not rigid styling rules. Honor the installed Grafana version and the operator's task.
|
|
4
|
+
|
|
5
|
+
## Visual grammar
|
|
6
|
+
|
|
7
|
+
| Evidence | Preferred form | Required context |
|
|
8
|
+
|---|---|---|
|
|
9
|
+
| Change over time | Thin line with points for sparse events | Unit, interval, timezone, gaps |
|
|
10
|
+
| Comparable categories | Aligned horizontal bars, directly labeled | Common unit and scale, ordering |
|
|
11
|
+
| Comparable entities over time | Small multiples | Shared axes and observation window |
|
|
12
|
+
| Distribution | Histogram, heatmap, or measured quantiles | Buckets, population, sample count |
|
|
13
|
+
| Current exception | Compact table sorted by severity or age | Entity, measured value, threshold, observation time |
|
|
14
|
+
| Current condition | Restrained stat with contextual trend where available | NOW label, freshness, threshold provenance |
|
|
15
|
+
| Sequential processing | Stage comparison plus delays/backlog | Stage definitions and cohort compatibility |
|
|
16
|
+
|
|
17
|
+
Avoid gauges without a meaningful bound, doughnuts for precise comparisons, gratuitous icons, gradients, 3D effects, repeated decorative headings, and walls of equally prominent stats. Use tables when exact values or heterogeneous states matter more than shape.
|
|
18
|
+
|
|
19
|
+
## Layout and typography
|
|
20
|
+
|
|
21
|
+
Use a clear title and short subtitle for scope. Keep panel titles concrete: “Published catalog age by market” is stronger than “Health”. Place related evidence next to each other and align plot edges. Use whitespace for grouping, restrained separators, and transparent panels where the theme supports them.
|
|
22
|
+
|
|
23
|
+
Aim for one principal question per panel. Keep descriptions concise; put definitions in tooltips or a small methodology panel. Do not expose implementation internals unless the operator needs them to choose an action.
|
|
24
|
+
|
|
25
|
+
Do not prescribe a fixed panel count or hide useful exceptions solely to fit one screen. A dense overview should still allow readable labels and a clear investigation path.
|
|
26
|
+
|
|
27
|
+
## Color and accessibility
|
|
28
|
+
|
|
29
|
+
Use neutral tones for context, one consistent accent for the principal series, and restrained warning/error colors for justified conditions. Preserve series identity across panels and themes. Encode status in text or shape as well as color. Validate contrast in both themes; avoid hard-coded white backgrounds or near-black labels.
|
|
30
|
+
|
|
31
|
+
Thresholds must come from a documented SLO, business rule, or explicit operator decision. If no threshold exists, show the measurement and its age rather than invent a green state.
|
|
32
|
+
|
|
33
|
+
## Scales and comparisons
|
|
34
|
+
|
|
35
|
+
- Start quantitative bars at zero. Never truncate bars to exaggerate differences.
|
|
36
|
+
- Use consistent scales for small multiples and related comparisons. State independent scales explicitly when they are necessary.
|
|
37
|
+
- Do not use dual axes unless the relationship is essential and unmistakably labeled; separate panels are usually clearer.
|
|
38
|
+
- Distinguish counts, rates, ratios, latency, and elapsed age. Show the denominator for percentages and the sample count for quantiles where available.
|
|
39
|
+
- Use integer ticks for small event counts and sensible precision for durations.
|
|
40
|
+
- Do not stack unrelated populations. Preserve additive semantics for stacked series.
|
|
41
|
+
- Avoid smoothing sparse events or joining gaps when that would imply observations.
|
|
42
|
+
- Use log scales only for a defensible analytical need and label them conspicuously.
|
|
43
|
+
|
|
44
|
+
## Time and completeness
|
|
45
|
+
|
|
46
|
+
Choose UTC or the documented business timezone and display it. Distinguish event time, ingestion time, last successful publication, and observation time. “Refreshed now” does not prove the underlying data is current.
|
|
47
|
+
|
|
48
|
+
Label partial first/last buckets. Do not compare a partial current day with a full previous day without making exposure clear. Align comparison periods by duration, bucket resolution, and population. Handle counter resets and daylight-saving boundaries according to the source semantics.
|
|
49
|
+
|
|
50
|
+
Treat the following states separately:
|
|
51
|
+
|
|
52
|
+
| State | Representation |
|
|
53
|
+
|---|---|
|
|
54
|
+
| Observed zero | Numeric 0 with normal source coverage |
|
|
55
|
+
| Missing observation | Gap or unavailable label |
|
|
56
|
+
| Stale source | Last observed value plus age and stale indicator |
|
|
57
|
+
| Partial coverage | Observed value plus explicit coverage qualification |
|
|
58
|
+
| Failed query | Visible error state, not a cached green number |
|
|
59
|
+
| No matching records | Empty-state explanation tied to filters |
|
|
60
|
+
|
|
61
|
+
Never apply blanket null-to-zero transformations. A missing denominator or a zero denominator does not imply a 0% rate. Do not subtract independent stage totals and call the difference “drop-off” without a shared cohort.
|
|
62
|
+
|
|
63
|
+
## Query cost and maintainability
|
|
64
|
+
|
|
65
|
+
Use appropriate resolution and bounded windows. Avoid per-entity request explosions, uncontrolled label cardinality, and unnecessary repeated queries. Reuse compatible query results when the tooling permits it. Preserve enough detail to diagnose outliers without placing customer identifiers or sensitive payloads in public artifacts.
|
|
66
|
+
|
|
67
|
+
A successful HTTP response can still contain empty frames, null labels, stale values, or an embedded query error. Verify the rendered interpretation against source values.
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
# Roazon and catalog operations playbook
|
|
2
|
+
|
|
3
|
+
Use this when the target is Roazon or a similar scrape/import/publication pipeline. These are investigation questions, not assertions that specific metrics or endpoints exist. Discover the actual architecture and available signals first.
|
|
4
|
+
|
|
5
|
+
## The central distinction
|
|
6
|
+
|
|
7
|
+
Workflow completion, scraping, importing, and publication are different events. A successful run may retain a last-known-good catalog while a required source is unavailable. Show freshness of the data customers can actually read, together with coverage and the upstream reason for a delay.
|
|
8
|
+
|
|
9
|
+
Do not mark a market current merely because another market or source completed. Do not replace missing data with zero products. Do not infer complete coverage from an artifact receipt or successful task alone.
|
|
10
|
+
|
|
11
|
+
## Candidate views
|
|
12
|
+
|
|
13
|
+
### Catalog evidence
|
|
14
|
+
|
|
15
|
+
Question: Is the published catalog current and complete for the intended market/source set?
|
|
16
|
+
|
|
17
|
+
Prefer a ranked freshness view by market and source, a publication timeline, and a concise exceptions table. Separate last successful scrape, completed import, publication time, and observed customer-visible version when those signals exist. Show expected versus completed source coverage only when an authoritative expected set exists.
|
|
18
|
+
|
|
19
|
+
A useful exception row contains market/source, published-data age, latest upstream outcome, retained/fresh state, and a link to the relevant run or artifact. Choose thresholds from actual freshness requirements.
|
|
20
|
+
|
|
21
|
+
### Pipeline flow
|
|
22
|
+
|
|
23
|
+
Question: Where is work delayed or failing?
|
|
24
|
+
|
|
25
|
+
Use queue depth and oldest-message age together; a small queue may still contain very old work. Show throughput, retries, dead-letter work, processing duration, and stage lag where measured. Distinguish queued, in-flight, retried, and terminal failures to avoid double counting.
|
|
26
|
+
|
|
27
|
+
Compare stages only for the same cohort or clearly label them as independent activity totals. A queue drain does not establish successful publication. A retry count does not necessarily equal distinct failed items.
|
|
28
|
+
|
|
29
|
+
### Customer-facing service
|
|
30
|
+
|
|
31
|
+
Question: Is the service delivering useful responses?
|
|
32
|
+
|
|
33
|
+
Use request rates, error rates with denominators, latency quantiles with sample context, and availability if telemetry supports them. Separate health probes from customer traffic. Connect visible service health to catalog freshness without implying that HTTP success proves data freshness.
|
|
34
|
+
|
|
35
|
+
### Recent changes and investigation
|
|
36
|
+
|
|
37
|
+
Question: What changed before the observed condition?
|
|
38
|
+
|
|
39
|
+
Use deployment/run annotations when their times and identities are authoritative. Link to existing logs, run details, or artifacts with scoped filters. Temporal proximity is a lead for investigation, not evidence of causation.
|
|
40
|
+
|
|
41
|
+
## Scope control
|
|
42
|
+
|
|
43
|
+
Begin with one coherent overview. Split catalog, pipeline, and service views only when the available evidence and investigation workflow justify it. Keep stable links and existing useful dashboards.
|
|
44
|
+
|
|
45
|
+
For unavailable signals, write a gap entry: operational question, missing evidence, current substitute and its limits, smallest useful instrumentation, and proposed owner. Keep that proposal separate from the authorized dashboard implementation.
|
|
46
|
+
|
|
47
|
+
Never bake a NAS address, SSH account, token, Grafana organization, or current deployment version into this reusable skill. Resolve those from the target environment and current configuration.
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
# Dashboard specification and evidence record
|
|
2
|
+
|
|
3
|
+
Create a concise task artifact using this template. Include only relevant sections; do not copy sensitive raw payloads into the document.
|
|
4
|
+
|
|
5
|
+
## Task binding
|
|
6
|
+
|
|
7
|
+
- Operator and decisions:
|
|
8
|
+
- Repository / worktree / source revision:
|
|
9
|
+
- Delivery boundary: specification / local implementation / pushed source / live deployment
|
|
10
|
+
- Target Grafana instance, organization, folder, and discovered version:
|
|
11
|
+
- Existing dashboards and stable UIDs:
|
|
12
|
+
- Baseline faults and screenshots:
|
|
13
|
+
|
|
14
|
+
## Panel contract
|
|
15
|
+
|
|
16
|
+
Complete before implementing each panel.
|
|
17
|
+
|
|
18
|
+
| Field | Required answer |
|
|
19
|
+
|---|---|
|
|
20
|
+
| Question | What decision does the operator make? |
|
|
21
|
+
| Evidence | Exact observed metric, source, or query definition |
|
|
22
|
+
| Population | Market, source, entity set, exclusions, denominator |
|
|
23
|
+
| Measurement | Event counter, gauge, snapshot, histogram, or derived value |
|
|
24
|
+
| Time | Event/observation timestamp, timezone, window, bucket, cadence |
|
|
25
|
+
| Semantics | Unit, aggregation, reset handling, partial periods |
|
|
26
|
+
| Completeness | Expected coverage, missingness, freshness rule |
|
|
27
|
+
| Presentation | Chart type, series identity, scale, ordering, labels |
|
|
28
|
+
| Interaction | Variables, range control, links, drill-down |
|
|
29
|
+
| Failure | Zero, null, no records, stale data, query error |
|
|
30
|
+
| Cost | Window limits, cardinality, query frequency |
|
|
31
|
+
| Acceptance | Concrete result and evidence location |
|
|
32
|
+
|
|
33
|
+
## Verification matrix
|
|
34
|
+
|
|
35
|
+
| Check | Expected result | Actual result | Evidence |
|
|
36
|
+
|---|---|---|---|
|
|
37
|
+
| Generated source | Reproducible and current | | |
|
|
38
|
+
| Panel queries | Valid frames and meaningful values | | |
|
|
39
|
+
| Time controls | Query and displayed interval agree | | |
|
|
40
|
+
| Scoped filters | Intended population only | | |
|
|
41
|
+
| Sparse/zero/null/error | Semantics remain distinct | | |
|
|
42
|
+
| Partial/stale data | Coverage and age visible | | |
|
|
43
|
+
| Light/dark browser | Readable, no clipping or errors | | |
|
|
44
|
+
| Laptop/desktop | Main questions remain legible | | |
|
|
45
|
+
| Live definition | Matches intended deployed source | | |
|
|
46
|
+
|
|
47
|
+
Use PASS, FAIL, UNAVAILABLE, or NOT_APPLICABLE. Distinguish fixture results from production observations. Record exact commands and source revisions where available.
|
|
48
|
+
|
|
49
|
+
## Delivery and rollback
|
|
50
|
+
|
|
51
|
+
- Changed source and generated files:
|
|
52
|
+
- Tests and build:
|
|
53
|
+
- Pushed commit, branch, PR, and CI if in scope:
|
|
54
|
+
- Deployment method and actual live verification:
|
|
55
|
+
- Backup location and exact restore method:
|
|
56
|
+
- Dashboard links and sanitized screenshots:
|
|
57
|
+
- Telemetry gaps and limitations:
|
|
58
|
+
- Human acceptance, if performed:
|
|
59
|
+
- Smallest remaining action:
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: evidence-dashboards
|
|
3
|
+
description: Design, implement, and verify evidence-focused Grafana dashboards with Tufte-inspired charts, honest data semantics, and reproducible provisioning. Use for operational dashboard redesigns, clearer monitoring, or Roazon-style catalog freshness and pipeline visibility.
|
|
4
|
+
license: MIT
|
|
5
|
+
compatibility: Agent Skills compatible tools with repository access. Live verification requires authorized Grafana access and browser automation; use the project's existing tooling.
|
|
6
|
+
metadata:
|
|
7
|
+
author: Oleg Koval
|
|
8
|
+
tags:
|
|
9
|
+
- grafana
|
|
10
|
+
- observability
|
|
11
|
+
- data-visualization
|
|
12
|
+
- dashboard-design
|
|
13
|
+
- operations
|
|
14
|
+
---
|
|
15
|
+
<!-- Generated by scripts/build-adapters.sh. Do not edit directly. -->
|
|
16
|
+
|
|
17
|
+
# Evidence Dashboards
|
|
18
|
+
|
|
19
|
+
Build operational dashboards that make the evidence legible: what happened, how much, over which period, with what coverage, and what needs attention. Deliver working charts backed by real queries and reproducible source.
|
|
20
|
+
|
|
21
|
+
## When to use
|
|
22
|
+
|
|
23
|
+
Activate for requests such as “redesign our Grafana dashboards”, “make the charts Tufte-style”, “show catalog freshness”, or “replace the wall of stats with useful evidence”. Use the workflow for new dashboards or an existing dashboard repair and redesign.
|
|
24
|
+
|
|
25
|
+
For a design-only request, deliver the specification and identify unverified assumptions. For implementation, finish the authorized source and verification work. This skill does not independently authorize production changes, new instrumentation, credential changes, external messages, or publishing.
|
|
26
|
+
|
|
27
|
+
## Working principles
|
|
28
|
+
|
|
29
|
+
- Start with an operator's decision; choose a chart only after defining its evidence.
|
|
30
|
+
- Prefer trends, comparisons, distributions, and exceptions over decorative summaries.
|
|
31
|
+
- Make missing, stale, partial, failed, and genuine zero observations distinguishable.
|
|
32
|
+
- Keep the source, time window, unit, denominator, and aggregation explicit.
|
|
33
|
+
- Preserve useful detail without making the reader decode an interface.
|
|
34
|
+
- Use existing telemetry honestly; record gaps rather than manufacture evidence.
|
|
35
|
+
|
|
36
|
+
## Workflow
|
|
37
|
+
|
|
38
|
+
### 1. Establish the actual system
|
|
39
|
+
|
|
40
|
+
Read applicable repository instructions. Inspect Git status, remotes, current branch, default-branch source, and deployment provenance. Preserve unrelated work and use an isolated worktree when appropriate.
|
|
41
|
+
|
|
42
|
+
Find dashboard definitions, generators, datasource provisioning, deployment scripts, checks, and existing HTTP tooling. Verify the intended Grafana instance, organization, folder, datasource UID, and plugin versions; do not infer these from a familiar hostname or an old checkout.
|
|
43
|
+
|
|
44
|
+
Use existing project scripts first, then CLI, MCP, or SDK. Follow the repository's HTTP policy. Repeated HTTP inspection belongs in reusable tooling with bounded retries and persisted, access-controlled raw responses. Redact credentials and sensitive customer data; never store authorization headers or cookies in artifacts.
|
|
45
|
+
|
|
46
|
+
Record a compact baseline: dashboard URLs and UIDs, source revision, visible faults, query failures, current layout screenshots, and the requested delivery boundary.
|
|
47
|
+
|
|
48
|
+
### 2. Define the evidence before the layout
|
|
49
|
+
|
|
50
|
+
Name the actor and three to five decisions the dashboard must support. For each proposed panel, complete the panel contract in [the specification template](references/specification.md).
|
|
51
|
+
|
|
52
|
+
Inspect actual query results and producer code. Identify event counters, gauges, snapshots, histograms, and retained history; record cadence and known coverage. Confirm whether records belong to comparable populations before deriving rates or funnels.
|
|
53
|
+
|
|
54
|
+
For Roazon or a catalog ingestion system, load [the catalog operations playbook](references/roazon-playbook.md). For all projects, load [the visual and semantic standard](references/design-standard.md).
|
|
55
|
+
|
|
56
|
+
Drop panels that cannot answer a useful question. Classify missing instrumentation separately from dashboard defects. Do not silently expand a redesign into an observability-platform rebuild.
|
|
57
|
+
|
|
58
|
+
### 3. Compose the visual argument
|
|
59
|
+
|
|
60
|
+
Arrange content in reading order:
|
|
61
|
+
|
|
62
|
+
1. Identity, scope, selected period, and source freshness.
|
|
63
|
+
2. A small number of current conditions requiring a decision.
|
|
64
|
+
3. The principal historical evidence, with context or comparable series.
|
|
65
|
+
4. Ranked exceptions or stage diagnostics that explain where to investigate.
|
|
66
|
+
5. Coverage, definitions, and links to existing operational detail.
|
|
67
|
+
|
|
68
|
+
Use the Grafana grid and native typography. Start with a dominant trend and supporting aligned comparisons; add separate dashboards only when actors or time scales differ materially. Keep the main view understandable at an ordinary laptop viewport without shrinking labels.
|
|
69
|
+
|
|
70
|
+
Apply the reference standard for scales, color, missing data, and density. Explain the proposed structure briefly and proceed with routine design choices inside the authorized scope.
|
|
71
|
+
|
|
72
|
+
### 4. Implement reproducibly
|
|
73
|
+
|
|
74
|
+
Edit canonical source, then regenerate outputs using repository commands. Preserve stable dashboard UIDs and useful deep links. Keep datasource secrets in the existing protected configuration boundary; dashboards contain identifiers, never bearer credentials.
|
|
75
|
+
|
|
76
|
+
Use supported native panels and installed plugins. Verify unfamiliar or version-sensitive options against official documentation. Prefer a maintainable query or transform to elaborate reshaping. Inspect the actual frame fields after transformations: category labels and null values can disappear even when requests return HTTP 200.
|
|
77
|
+
|
|
78
|
+
Connect every time-dependent query to the visible controls. If an API only supports trailing-day windows, expose those supported choices and ensure the chart displays the same range. Explicitly label snapshots as current even when historical controls are visible.
|
|
79
|
+
|
|
80
|
+
Add focused checks for meaningful invariants: generated output freshness, stable IDs, non-overlapping grid, variable propagation, units, and unavailable-versus-zero behavior. Do not add tests that merely restate every JSON property.
|
|
81
|
+
|
|
82
|
+
### 5. Verify data and appearance
|
|
83
|
+
|
|
84
|
+
Run applicable generation, validation, and repository checks. Execute every panel query through its real datasource path. Inspect frame contents and transformations, not just transport success.
|
|
85
|
+
|
|
86
|
+
Exercise representative data states: sparse history, a reported zero, null/unavailable, no rows, stale source, partial boundary periods, and a failed query. Use isolated fixtures where production cannot safely produce those states; label fixture evidence separately from live evidence.
|
|
87
|
+
|
|
88
|
+
Verify at least two supported time windows, and scoped filters where present. Confirm the query interval, returned timestamps, displayed axis, timezone, and refresh cadence agree. Check inclusive boundaries and cumulative versus per-period interpretation.
|
|
89
|
+
|
|
90
|
+
Use a real browser with an appropriate authorized user. Inspect light and dark themes at laptop and desktop widths. Check labels, units, ticks, tooltips, legends, clipping, empty/error states, navigation, and browser/network errors. Save sanitized screenshots and query evidence. API-only verification is not visual acceptance.
|
|
91
|
+
|
|
92
|
+
### 6. Deploy within scope and prove the result
|
|
93
|
+
|
|
94
|
+
When deployment is authorized, back up the targeted live definitions and provisioning before writing. Record the rollback location and method. Change only the relevant files or resources; avoid unrelated datasource changes and service restarts.
|
|
95
|
+
|
|
96
|
+
Apply through the existing deployment workflow. Confirm the live definitions match the intended generated source, provisioned ownership is correct, every panel query succeeds, and the rendered result still passes. If verification fails, repair the scoped change or restore the backup; report the actual resulting state.
|
|
97
|
+
|
|
98
|
+
If live access or authority is unavailable, complete reviewable local work and report the exact remaining gate. Do not claim deployment or visual acceptance from source tests.
|
|
99
|
+
|
|
100
|
+
## Acceptance and handoff
|
|
101
|
+
|
|
102
|
+
The result is ready only when the requested boundary is evidenced:
|
|
103
|
+
|
|
104
|
+
- Every panel has a decision, valid source, explicit scope, and honest interpretation.
|
|
105
|
+
- Trends, comparisons, and exception views use appropriate scales and units.
|
|
106
|
+
- Zero, missing, stale, and partial data retain their meanings.
|
|
107
|
+
- Controls alter both the requested data and the visible range as intended.
|
|
108
|
+
- Source generation and applicable checks pass on the final artifact.
|
|
109
|
+
- Required browser and live checks are recorded, or clearly marked unavailable.
|
|
110
|
+
- Authorized deployment has a backup, verified live state, and rollback instructions.
|
|
111
|
+
|
|
112
|
+
Report dashboard links, changed source, exact verification, screenshots, telemetry gaps, and rollback evidence. Keep local correctness, pushed source, CI, deployment, and human acceptance separate. Follow the host's delivery receipt and review requirements; this skill does not replace them.
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
# Visual and semantic standard
|
|
2
|
+
|
|
3
|
+
Use these as practical defaults, not rigid styling rules. Honor the installed Grafana version and the operator's task.
|
|
4
|
+
|
|
5
|
+
## Visual grammar
|
|
6
|
+
|
|
7
|
+
| Evidence | Preferred form | Required context |
|
|
8
|
+
|---|---|---|
|
|
9
|
+
| Change over time | Thin line with points for sparse events | Unit, interval, timezone, gaps |
|
|
10
|
+
| Comparable categories | Aligned horizontal bars, directly labeled | Common unit and scale, ordering |
|
|
11
|
+
| Comparable entities over time | Small multiples | Shared axes and observation window |
|
|
12
|
+
| Distribution | Histogram, heatmap, or measured quantiles | Buckets, population, sample count |
|
|
13
|
+
| Current exception | Compact table sorted by severity or age | Entity, measured value, threshold, observation time |
|
|
14
|
+
| Current condition | Restrained stat with contextual trend where available | NOW label, freshness, threshold provenance |
|
|
15
|
+
| Sequential processing | Stage comparison plus delays/backlog | Stage definitions and cohort compatibility |
|
|
16
|
+
|
|
17
|
+
Avoid gauges without a meaningful bound, doughnuts for precise comparisons, gratuitous icons, gradients, 3D effects, repeated decorative headings, and walls of equally prominent stats. Use tables when exact values or heterogeneous states matter more than shape.
|
|
18
|
+
|
|
19
|
+
## Layout and typography
|
|
20
|
+
|
|
21
|
+
Use a clear title and short subtitle for scope. Keep panel titles concrete: “Published catalog age by market” is stronger than “Health”. Place related evidence next to each other and align plot edges. Use whitespace for grouping, restrained separators, and transparent panels where the theme supports them.
|
|
22
|
+
|
|
23
|
+
Aim for one principal question per panel. Keep descriptions concise; put definitions in tooltips or a small methodology panel. Do not expose implementation internals unless the operator needs them to choose an action.
|
|
24
|
+
|
|
25
|
+
Do not prescribe a fixed panel count or hide useful exceptions solely to fit one screen. A dense overview should still allow readable labels and a clear investigation path.
|
|
26
|
+
|
|
27
|
+
## Color and accessibility
|
|
28
|
+
|
|
29
|
+
Use neutral tones for context, one consistent accent for the principal series, and restrained warning/error colors for justified conditions. Preserve series identity across panels and themes. Encode status in text or shape as well as color. Validate contrast in both themes; avoid hard-coded white backgrounds or near-black labels.
|
|
30
|
+
|
|
31
|
+
Thresholds must come from a documented SLO, business rule, or explicit operator decision. If no threshold exists, show the measurement and its age rather than invent a green state.
|
|
32
|
+
|
|
33
|
+
## Scales and comparisons
|
|
34
|
+
|
|
35
|
+
- Start quantitative bars at zero. Never truncate bars to exaggerate differences.
|
|
36
|
+
- Use consistent scales for small multiples and related comparisons. State independent scales explicitly when they are necessary.
|
|
37
|
+
- Do not use dual axes unless the relationship is essential and unmistakably labeled; separate panels are usually clearer.
|
|
38
|
+
- Distinguish counts, rates, ratios, latency, and elapsed age. Show the denominator for percentages and the sample count for quantiles where available.
|
|
39
|
+
- Use integer ticks for small event counts and sensible precision for durations.
|
|
40
|
+
- Do not stack unrelated populations. Preserve additive semantics for stacked series.
|
|
41
|
+
- Avoid smoothing sparse events or joining gaps when that would imply observations.
|
|
42
|
+
- Use log scales only for a defensible analytical need and label them conspicuously.
|
|
43
|
+
|
|
44
|
+
## Time and completeness
|
|
45
|
+
|
|
46
|
+
Choose UTC or the documented business timezone and display it. Distinguish event time, ingestion time, last successful publication, and observation time. “Refreshed now” does not prove the underlying data is current.
|
|
47
|
+
|
|
48
|
+
Label partial first/last buckets. Do not compare a partial current day with a full previous day without making exposure clear. Align comparison periods by duration, bucket resolution, and population. Handle counter resets and daylight-saving boundaries according to the source semantics.
|
|
49
|
+
|
|
50
|
+
Treat the following states separately:
|
|
51
|
+
|
|
52
|
+
| State | Representation |
|
|
53
|
+
|---|---|
|
|
54
|
+
| Observed zero | Numeric 0 with normal source coverage |
|
|
55
|
+
| Missing observation | Gap or unavailable label |
|
|
56
|
+
| Stale source | Last observed value plus age and stale indicator |
|
|
57
|
+
| Partial coverage | Observed value plus explicit coverage qualification |
|
|
58
|
+
| Failed query | Visible error state, not a cached green number |
|
|
59
|
+
| No matching records | Empty-state explanation tied to filters |
|
|
60
|
+
|
|
61
|
+
Never apply blanket null-to-zero transformations. A missing denominator or a zero denominator does not imply a 0% rate. Do not subtract independent stage totals and call the difference “drop-off” without a shared cohort.
|
|
62
|
+
|
|
63
|
+
## Query cost and maintainability
|
|
64
|
+
|
|
65
|
+
Use appropriate resolution and bounded windows. Avoid per-entity request explosions, uncontrolled label cardinality, and unnecessary repeated queries. Reuse compatible query results when the tooling permits it. Preserve enough detail to diagnose outliers without placing customer identifiers or sensitive payloads in public artifacts.
|
|
66
|
+
|
|
67
|
+
A successful HTTP response can still contain empty frames, null labels, stale values, or an embedded query error. Verify the rendered interpretation against source values.
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
# Roazon and catalog operations playbook
|
|
2
|
+
|
|
3
|
+
Use this when the target is Roazon or a similar scrape/import/publication pipeline. These are investigation questions, not assertions that specific metrics or endpoints exist. Discover the actual architecture and available signals first.
|
|
4
|
+
|
|
5
|
+
## The central distinction
|
|
6
|
+
|
|
7
|
+
Workflow completion, scraping, importing, and publication are different events. A successful run may retain a last-known-good catalog while a required source is unavailable. Show freshness of the data customers can actually read, together with coverage and the upstream reason for a delay.
|
|
8
|
+
|
|
9
|
+
Do not mark a market current merely because another market or source completed. Do not replace missing data with zero products. Do not infer complete coverage from an artifact receipt or successful task alone.
|
|
10
|
+
|
|
11
|
+
## Candidate views
|
|
12
|
+
|
|
13
|
+
### Catalog evidence
|
|
14
|
+
|
|
15
|
+
Question: Is the published catalog current and complete for the intended market/source set?
|
|
16
|
+
|
|
17
|
+
Prefer a ranked freshness view by market and source, a publication timeline, and a concise exceptions table. Separate last successful scrape, completed import, publication time, and observed customer-visible version when those signals exist. Show expected versus completed source coverage only when an authoritative expected set exists.
|
|
18
|
+
|
|
19
|
+
A useful exception row contains market/source, published-data age, latest upstream outcome, retained/fresh state, and a link to the relevant run or artifact. Choose thresholds from actual freshness requirements.
|
|
20
|
+
|
|
21
|
+
### Pipeline flow
|
|
22
|
+
|
|
23
|
+
Question: Where is work delayed or failing?
|
|
24
|
+
|
|
25
|
+
Use queue depth and oldest-message age together; a small queue may still contain very old work. Show throughput, retries, dead-letter work, processing duration, and stage lag where measured. Distinguish queued, in-flight, retried, and terminal failures to avoid double counting.
|
|
26
|
+
|
|
27
|
+
Compare stages only for the same cohort or clearly label them as independent activity totals. A queue drain does not establish successful publication. A retry count does not necessarily equal distinct failed items.
|
|
28
|
+
|
|
29
|
+
### Customer-facing service
|
|
30
|
+
|
|
31
|
+
Question: Is the service delivering useful responses?
|
|
32
|
+
|
|
33
|
+
Use request rates, error rates with denominators, latency quantiles with sample context, and availability if telemetry supports them. Separate health probes from customer traffic. Connect visible service health to catalog freshness without implying that HTTP success proves data freshness.
|
|
34
|
+
|
|
35
|
+
### Recent changes and investigation
|
|
36
|
+
|
|
37
|
+
Question: What changed before the observed condition?
|
|
38
|
+
|
|
39
|
+
Use deployment/run annotations when their times and identities are authoritative. Link to existing logs, run details, or artifacts with scoped filters. Temporal proximity is a lead for investigation, not evidence of causation.
|
|
40
|
+
|
|
41
|
+
## Scope control
|
|
42
|
+
|
|
43
|
+
Begin with one coherent overview. Split catalog, pipeline, and service views only when the available evidence and investigation workflow justify it. Keep stable links and existing useful dashboards.
|
|
44
|
+
|
|
45
|
+
For unavailable signals, write a gap entry: operational question, missing evidence, current substitute and its limits, smallest useful instrumentation, and proposed owner. Keep that proposal separate from the authorized dashboard implementation.
|
|
46
|
+
|
|
47
|
+
Never bake a NAS address, SSH account, token, Grafana organization, or current deployment version into this reusable skill. Resolve those from the target environment and current configuration.
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
# Dashboard specification and evidence record
|
|
2
|
+
|
|
3
|
+
Create a concise task artifact using this template. Include only relevant sections; do not copy sensitive raw payloads into the document.
|
|
4
|
+
|
|
5
|
+
## Task binding
|
|
6
|
+
|
|
7
|
+
- Operator and decisions:
|
|
8
|
+
- Repository / worktree / source revision:
|
|
9
|
+
- Delivery boundary: specification / local implementation / pushed source / live deployment
|
|
10
|
+
- Target Grafana instance, organization, folder, and discovered version:
|
|
11
|
+
- Existing dashboards and stable UIDs:
|
|
12
|
+
- Baseline faults and screenshots:
|
|
13
|
+
|
|
14
|
+
## Panel contract
|
|
15
|
+
|
|
16
|
+
Complete before implementing each panel.
|
|
17
|
+
|
|
18
|
+
| Field | Required answer |
|
|
19
|
+
|---|---|
|
|
20
|
+
| Question | What decision does the operator make? |
|
|
21
|
+
| Evidence | Exact observed metric, source, or query definition |
|
|
22
|
+
| Population | Market, source, entity set, exclusions, denominator |
|
|
23
|
+
| Measurement | Event counter, gauge, snapshot, histogram, or derived value |
|
|
24
|
+
| Time | Event/observation timestamp, timezone, window, bucket, cadence |
|
|
25
|
+
| Semantics | Unit, aggregation, reset handling, partial periods |
|
|
26
|
+
| Completeness | Expected coverage, missingness, freshness rule |
|
|
27
|
+
| Presentation | Chart type, series identity, scale, ordering, labels |
|
|
28
|
+
| Interaction | Variables, range control, links, drill-down |
|
|
29
|
+
| Failure | Zero, null, no records, stale data, query error |
|
|
30
|
+
| Cost | Window limits, cardinality, query frequency |
|
|
31
|
+
| Acceptance | Concrete result and evidence location |
|
|
32
|
+
|
|
33
|
+
## Verification matrix
|
|
34
|
+
|
|
35
|
+
| Check | Expected result | Actual result | Evidence |
|
|
36
|
+
|---|---|---|---|
|
|
37
|
+
| Generated source | Reproducible and current | | |
|
|
38
|
+
| Panel queries | Valid frames and meaningful values | | |
|
|
39
|
+
| Time controls | Query and displayed interval agree | | |
|
|
40
|
+
| Scoped filters | Intended population only | | |
|
|
41
|
+
| Sparse/zero/null/error | Semantics remain distinct | | |
|
|
42
|
+
| Partial/stale data | Coverage and age visible | | |
|
|
43
|
+
| Light/dark browser | Readable, no clipping or errors | | |
|
|
44
|
+
| Laptop/desktop | Main questions remain legible | | |
|
|
45
|
+
| Live definition | Matches intended deployed source | | |
|
|
46
|
+
|
|
47
|
+
Use PASS, FAIL, UNAVAILABLE, or NOT_APPLICABLE. Distinguish fixture results from production observations. Record exact commands and source revisions where available.
|
|
48
|
+
|
|
49
|
+
## Delivery and rollback
|
|
50
|
+
|
|
51
|
+
- Changed source and generated files:
|
|
52
|
+
- Tests and build:
|
|
53
|
+
- Pushed commit, branch, PR, and CI if in scope:
|
|
54
|
+
- Deployment method and actual live verification:
|
|
55
|
+
- Backup location and exact restore method:
|
|
56
|
+
- Dashboard links and sanitized screenshots:
|
|
57
|
+
- Telemetry gaps and limitations:
|
|
58
|
+
- Human acceptance, if performed:
|
|
59
|
+
- Smallest remaining action:
|
|
@@ -9,3 +9,4 @@ into the active Hermes profile. The canonical packages are:
|
|
|
9
9
|
- `plugins/olko-web-ops/skills/search-console-indexing-audit/SKILL.md`
|
|
10
10
|
- `plugins/olko-web-ops/skills/docs-index-keeper/SKILL.md`
|
|
11
11
|
- `plugins/olko-web-ops/skills/website-analytics-bootstrap/SKILL.md`
|
|
12
|
+
- `plugins/olko-web-ops/skills/evidence-dashboards/SKILL.md`
|
package/catalog/skills.json
CHANGED
|
@@ -1513,6 +1513,27 @@
|
|
|
1513
1513
|
"grok",
|
|
1514
1514
|
"hermes"
|
|
1515
1515
|
]
|
|
1516
|
+
},
|
|
1517
|
+
{
|
|
1518
|
+
"name": "evidence-dashboards",
|
|
1519
|
+
"lookupName": "olko:evidence-dashboards",
|
|
1520
|
+
"path": "plugins/olko-web-ops/skills/evidence-dashboards",
|
|
1521
|
+
"description": "Build and verify evidence-focused Grafana dashboards: honest metrics, clear charts, reproducible provisioning, and catalog operations visibility.",
|
|
1522
|
+
"tags": [
|
|
1523
|
+
"grafana",
|
|
1524
|
+
"observability",
|
|
1525
|
+
"data-visualization",
|
|
1526
|
+
"dashboard-design",
|
|
1527
|
+
"operations"
|
|
1528
|
+
],
|
|
1529
|
+
"adapters": [
|
|
1530
|
+
"claude",
|
|
1531
|
+
"codex",
|
|
1532
|
+
"cursor",
|
|
1533
|
+
"grok",
|
|
1534
|
+
"pi",
|
|
1535
|
+
"hermes"
|
|
1536
|
+
]
|
|
1516
1537
|
}
|
|
1517
1538
|
]
|
|
1518
1539
|
}
|
package/package.json
CHANGED
|
@@ -49,6 +49,9 @@ export function caseKey(e) {
|
|
|
49
49
|
}
|
|
50
50
|
|
|
51
51
|
const SHA = /^[0-9a-f]{7,40}$/i;
|
|
52
|
+
const FULL_SHA = /^[0-9a-f]{40}$/i;
|
|
53
|
+
const RUN_ID = /^[A-Za-z0-9][A-Za-z0-9._-]*$/;
|
|
54
|
+
const SEVERITIES = new Set(['critical', 'important', 'observation', 'idiomatic']);
|
|
52
55
|
|
|
53
56
|
const isMultiRun = (v) => Array.isArray(v) && v.length > 0 && v.every(Array.isArray);
|
|
54
57
|
|
|
@@ -71,6 +74,37 @@ export function validateManifest(manifest) {
|
|
|
71
74
|
return prs;
|
|
72
75
|
}
|
|
73
76
|
|
|
77
|
+
export function normalizeArchivedEvidence(entry, run, worktree, document) {
|
|
78
|
+
const key = caseKey(entry);
|
|
79
|
+
const unscored = (reason) => ({ key, reason });
|
|
80
|
+
if (typeof entry.runId !== 'string' || !RUN_ID.test(entry.runId)) return unscored('unsafe or missing runId');
|
|
81
|
+
if (typeof entry.sha !== 'string' || !FULL_SHA.test(entry.sha)) return unscored('manifest needs a full 40-character sha');
|
|
82
|
+
if (!run) return unscored('run.json missing or malformed');
|
|
83
|
+
if (run.runId !== entry.runId) return unscored('runId mismatch');
|
|
84
|
+
if (run.status !== 'ok') return unscored('run status is not ok');
|
|
85
|
+
if (!['lgtm', 'lgtm-with-changes', 'needs-work'].includes(run.verdict)) return unscored('run verdict is missing or invalid');
|
|
86
|
+
if (run.review?.name !== 'lekker-review-core' || run.review.status !== 'completed') return unscored('completed review record unavailable');
|
|
87
|
+
if (run.repo !== entry.repo || run.target !== `pr-${entry.pr}`) return unscored('run repo or target mismatch');
|
|
88
|
+
if (!worktree) return unscored('worktree.json missing or malformed');
|
|
89
|
+
if (typeof worktree.headSha !== 'string' || !FULL_SHA.test(worktree.headSha)) return unscored('worktree headSha is not a full SHA');
|
|
90
|
+
if (worktree.headSha.toLowerCase() !== entry.sha.toLowerCase()) return unscored('worktree headSha mismatch');
|
|
91
|
+
const findings = Array.isArray(document) ? document : document?.findings;
|
|
92
|
+
if (!Array.isArray(findings)) return unscored('findings.json missing or malformed');
|
|
93
|
+
if (findings.some((f) => !f || typeof f.file !== 'string' || !f.file.trim() || !SEVERITIES.has(f.severity)
|
|
94
|
+
|| !(f.line === null || (Number.isInteger(f.line) && f.line > 0)))) {
|
|
95
|
+
return unscored('findings.json contains a malformed finding');
|
|
96
|
+
}
|
|
97
|
+
return { key, findings, reason: null };
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
// Validate archive references before reading any run directories.
|
|
101
|
+
export function validateArchiveRunIds(entries) {
|
|
102
|
+
const duplicate = entries.find((entry, index) => entry.runId
|
|
103
|
+
&& entries.slice(0, index).some(previous => previous.runId === entry.runId));
|
|
104
|
+
if (duplicate) throw new Error(`archive manifest reuses runId ${duplicate.runId}`);
|
|
105
|
+
return entries;
|
|
106
|
+
}
|
|
107
|
+
|
|
74
108
|
export function score(manifest, results) {
|
|
75
109
|
const rows = validateManifest(manifest).map((e) => {
|
|
76
110
|
const key = caseKey(e);
|