Best for
- A graph needs durable state between turns, such as queue position, board
- A skill must read a bounded slice of event state before deciding the next
- A workflow needs to append an auditable event or effect transition with
runxhq/runx/skills/data-store/SKILL.md
Govern provider-agnostic data reads and state transitions through declared data-source operations, not model-authored raw queries.
Decision brief
Operate durable event state through Runx's typed data operations. This skill gives an agent enough context to append, read, and project state without learning provider secrets, inventing queries, or depending on one storage backend.
Compatibility matrix
| Platform | Status | Evidence | What to check |
|---|---|---|---|
| Codex | Not declared | No explicit evidence | Portability before use |
| Claude Code | Not declared | No explicit evidence | Portability before use |
| Cursor | Not declared | No explicit evidence | Portability before use |
| Gemini CLI | Not declared | No explicit evidence | Portability before use |
Installation
The source command is displayed only when detected. A safe inspection prompt is always available so your agent can explain every action before execution.
npx skills add https://github.com/runxhq/runx --skill "skills/data-store"Inspect the Agent Skill "data-store" from https://github.com/runxhq/runx/blob/a6dcd1ecdef05d442516846c7acd690c33176daa/skills/data-store/SKILL.md at commit a6dcd1ecdef05d442516846c7acd690c33176daa. List every install step, command, network request, credential, file read/write, external action, and rollback step. Explain whether it fits my task. Do not install or execute anything until I approve.
Workflow
1. Identify the domain skill and transition first. The data store is a carrier, not the policy owner. 2. Select the logical data source. Use datasourceref to name the project or tenant source; let the project binding choose the adapter. Do not put raw database URLs, provider cre…
The operator chooses a data source at run time. The skill receives datasourceref and operation inputs; project or hosted configuration binds that ref to the concrete adapter. A local development ref might be local://runx-data-store/dev-board. A production ref might be tenant://a…
Reads bounded event pages, projections, and stream-head pages through exact
A graph needs durable state between turns, such as queue position, board
To let a model write arbitrary SQL, Redis commands, or database migrations.
Permission review
No configured static risk pattern was detected
This is not proof of safety. Runtime behavior, indirect dependencies, and hidden external systems are outside the static scan.
Evidence record
| Signal | Value | Evidence type | Meaning |
|---|---|---|---|
| Quality score | 94/100 | Computed | Documentation, specificity, maintenance, and trust rules |
| Repository stars | 83 | Source | Repository attention, not individual Skill quality |
| Compatibility | 0 platforms | Source | Declared in the catalog source record |
| Usage guide | automated source guide | Editorial | Generated or reviewed according to the visible evidence level |
Pinned source
Operate durable event state through Runx's typed data operations. This skill gives an agent enough context to append, read, and project state without learning provider secrets, inventing queries, or depending on one storage backend.
Runx ships native SQLite and an external Redis adapter today. Other providers can implement the same exact operation contract. The boundary is stable: a declared data source exposes typed operations; the graph supplies bounded parameters; runtime configuration selects storage; and the receipt records the resource, authority, idempotency, version, digest, and redaction evidence.
The operator chooses a data source at run time. The skill receives
data_source_ref and operation inputs; project or hosted configuration binds
that ref to the concrete adapter. A local development ref might be
local://runx-data-store/dev-board. A production ref might be
tenant://acme/board bound to data.postgres, data.d1, data.redis, or a
product-owned HTTP adapter.
Do not put provider logic in the domain skill. Messageboard, CRM, support, and business-ops skills ask for durable facts to be read or written; the data-source binding decides where those facts live. Switching a supported provider is a binding change, not a rewrite of the domain skill.
Each runner calls one exact native operation: data.append_event,
data.read_events, data.read_projection, or data.list_stream_heads.
Direct invocation defaults to append_and_readback, so a requested durable
transition is not reported complete until the resulting projection has been
read. Graph callers that already know the operation select the narrower named
runner and reuse its typed result.
Unbound local://... refs default to native durable SQLite under
.runx/data/local-sources/, with one source-scoped database file per logical
ref. There is no generic router tool, JSON fixture store, or provider selector
in the public input schema.
Adapter preference is operator configuration, not model choice. To choose Redis,
SQLite, or a hosted provider, bind the same data_source_ref through
RUNX_DATA_SOURCES or .runx/data-sources.json; do not add provider branches to
the domain skill.
data_source_ref to name the project or
tenant source; let the project binding choose the adapter. Do not put raw
database URLs, provider credentials, or SQL in the skill input.needs_source: the data source, resource, query name, tenant key, or schema
summary is missing.needs_input: required operation params are incomplete, malformed, or not
specific enough to bind a declared data-source operation.needs_authority: the caller lacks the declared read/write scope or provider
grant.needs_version: a mutating operation lacks expected_version where the data
source requires optimistic concurrency.conflict: the current version differs from expected_version, or an
idempotency key is reused with different content.too_broad: the requested read lacks partition filters, exceeds limits, or
asks for raw export.redaction_required: the operation would return secrets, private PII, or
fields outside the declared projection.provider_unavailable: the adapter cannot reach the data source, times out,
or cannot prove whether a write committed.All runners return runx.data.operation_result.v1:
{
"schema": "runx.data.operation_result.v1",
"data_source_ref": "local://example",
"provider": "sqlite-event-store",
"operation": "append_event",
"resource": "board_events",
"aggregate_id": "posting-123",
"status": "committed",
"before_version": 0,
"after_version": 1,
"idempotency_key": "posting-123:create",
"event_ref": "board_events:posting-123:1",
"result_digest": "sha256:...",
"projection_digest": "sha256:...",
"rows": [],
"events": [],
"redactions": [],
"stop_conditions": []
}
Provider adapters may add provider evidence under provider_evidence, but they
must not expose credentials or raw secret material.
For event streams, adapters derive a readable event_type in this order:
explicit event.type, explicit event.event_type, then
event.effect_family + "." + event.operation. Domain skills that emit the
generic runx.effect.transition.v1 packet should include effect_family and
operation on every event so readback projections say board.accept,
business_ops.route, or another meaningful transition instead of data.event.
A product's board skill decides that posting.claimed is allowed. It emits a
domain transition packet. The graph then calls data-store.append_event with
resource board_events, aggregate id posting-123, expected version 2, and
idempotency key posting-123:claim:agent-9. The data adapter appends the event
only if the stream is still at version 2. The receipt proves the decision,
the data operation, and the new version. A later loop turn calls
data-store.read_events or read_projection to resume from the explicit board
state.
data_source_ref (required): stable logical ref for the data source. The
project or hosted binding maps this ref to the concrete adapter and provider
profile.resource (required): declared resource, stream, table, keyspace, or
projection name.operation is not an input.aggregate_id (required for event operations): stream or partition key.event (required for append_event): domain event or transition packet.idempotency_key (required for writes): stable retry key.expected_version (required when the source enforces concurrency): current
stream/resource version expected by the caller.limit (optional): maximum rows or events to return.after_version (optional for read_events): return an ascending page whose
event versions are strictly greater than this value. Omit it to retain the
existing latest-tail read. Compare the last returned event version with
after_version in the result envelope to know whether another page remains.event_types (optional for list_stream_heads): at most 20 exact latest
event types. No pattern or arbitrary field queries are accepted.cursor (optional for list_stream_heads): opaque cursor returned by the
previous page. Limits are capped at 100.Durable local dogfood with the bundled default:
runx skill data-store append_event \
-i data_source_ref=local://runx-data-store/dev-board \
-i resource=board_events \
-i aggregate_id=posting-123 \
--input-json expected_version=0 \
-i idempotency_key=posting-123:create:v1 \
--input-json event='{"type":"posting.created","payload":{"title":"verify a receipt link"}}' \
--json
Production graph shape is the same at the skill boundary:
runx skill data-store append_event \
-i data_source_ref=tenant://acme/board \
-i resource=board_events \
-i aggregate_id=posting-123 \
--input-json expected_version=2 \
-i idempotency_key=posting-123:claim:agent-9 \
--input-json event='{"type":"posting.claimed","payload":{"actor":"agent-9"}}' \
--json
The production command only works once tenant://acme/board is bound to an
installed provider adapter. That binding is operator configuration and may name a
credential profile or hosted grant; it must not carry raw secrets.
Project-specific native SQLite uses the same command shape after binding the
source. data.sqlite is a runtime binding identifier, not a second executable
tool surface:
{
"data_sources": {
"tenant://acme/board": {
"adapter": "data.sqlite",
"database_path": ".runx/data/acme-board.sqlite",
"resources": {
"board_events": {
"kind": "event_stream",
"partition_key": "aggregate_id"
}
}
}
}
}
Pass that document through RUNX_DATA_SOURCES or .runx/data-sources.json.
Redis uses the same skill and graph inputs. Only the binding changes:
{
"data_sources": {
"tenant://acme/board": {
"adapter": "data.redis",
"endpoint": "redis://127.0.0.1:6379/0",
"key_prefix": "runx:{acme-board}",
"resources": {
"board_events": {
"kind": "event_stream",
"partition_key": "aggregate_id"
}
}
}
}
}
The Redis endpoint must not embed credentials. Use local unauthenticated Redis
for OSS dogfood, or put production secrets behind a runx credential profile or
hosted grant. For Redis Cluster, the binding's key_prefix must contain one
safe hash tag, such as {acme-board}, so the stream, idempotency, and head keys
touched by an append share one slot and update atomically. Stream-head pages use
stable keyset cursors rather than mutable offsets. Durable events and
dispositions must not receive TTLs; production Redis should enable persistence
and use a non-evicting policy.
Frequently asked questions
Operate durable event state through Runx's typed data operations. This skill gives an agent enough context to append, read, and project state without learning provider secrets, inventing queries, or depending on one storage backend.
The source record exposes this install command: npx skills add https://github.com/runxhq/runx --skill "skills/data-store". Inspect the command and pinned source before running it.
Alternatives
garrytan/gbrain
End-to-end discipline for turning any large data source (audio libraries, email takeouts, document corpora, chat exports, API dumps) into brain pages at scale. The lifecycle spine: SCHEMA → ACCESS → TRIAL → EVALUATE → IMPROVE → CODIFY → TEST → SKILLIFY → BULK → MONITOR. State is tracked in a durable JSON manifest (see MANIFEST-PATTERN.md) so any crash, session boundary, or subagent fan-out resumes from ground truth instead of memory.
alirezarezvani/claude-skills
App Store Optimization (ASO) toolkit for researching keywords, analyzing competitor rankings, generating metadata suggestions, and improving app visibility on Apple App Store and Google Play Store. Use when the user asks about ASO, app store rankings, app metadata, app titles and descriptions, app store listings, app visibility, or mobile app marketing on iOS or Android. Supports keyword research and scoring, competitor keyword analysis, metadata optimization, A/B test planning, launch checklist
wanshuiyin/Auto-claude-code-research-in-sleep
Use it for operations and research tasks; the detail page covers purpose, installation, and practical steps.
prowler-cloud/prowler
PostgreSQL indexing best practices for Prowler: index design, partial indexes, partitioned table indexing, EXPLAIN ANALYZE validation, concurrent operations, monitoring, and maintenance. Trigger: When creating or modifying PostgreSQL indexes, analyzing query performance with EXPLAIN, debugging slow queries, reviewing index usage statistics, reindexing, dropping indexes, or working with partitioned table indexes. Also trigger when discussing index strategies, partial indexes, or index maintenance