Signals
PostHog/posthog
How to query the documentembeddings table for raw signal data using HogQL.
Canonical rules for writing and reviewing reactive code in Shift.
$ npx skills add shift-editor/shift --skill signals -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install shift-editor/shift signals --agent claude-codeProject scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).
$ git clone --depth 1 https://github.com/shift-editor/shift.git skills-src && mkdir -p .claude/skills && cp -r skills-src/.codex/skills/signals .claude/skills/signals && rm -rf skills-srcUse ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.
Claude Code skills documentation · loads skills from .claude/skills/
Install the "signals" agent skill from https://github.com/shift-editor/shift/tree/main/.codex/skills/signals into .claude/skills/signals/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "signals", then confirm the skill loads.Claude Code copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$skill-installer install https://github.com/shift-editor/shift/tree/main/.codex/skills/signalsType this inside Codex. $skill-installer <name> installs a curated skill from openai/skills. The installer writes to $CODEX_HOME/skills (default ~/.codex/skills). Restart Codex if the skill does not show up.
$ npx skills add shift-editor/shift --skill signals -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install shift-editor/shift signals --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/shift-editor/shift.git skills-src && mkdir -p .agents/skills && cp -r skills-src/.codex/skills/signals .agents/skills/signals && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "signals" agent skill from https://github.com/shift-editor/shift/tree/main/.codex/skills/signals into .agents/skills/signals/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "signals", then confirm the skill loads.Codex copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add shift-editor/shift --skill signals -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install shift-editor/shift signals --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/shift-editor/shift.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/.codex/skills/signals .cursor/skills/signals && rm -rf skills-srcUse ~/.cursor/skills/ instead of .cursor/skills for a personal install.
Cursor skills documentation · loads skills from .cursor/skills/, .agents/skills/, .claude/skills/, .codex/skills/
Install the "signals" agent skill from https://github.com/shift-editor/shift/tree/main/.codex/skills/signals into .cursor/skills/signals/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "signals", then confirm the skill loads.Cursor copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gemini skills install https://github.com/shift-editor/shift.git --path .codex/skills/signals--scope user (default) or --scope workspace; --path is the subfolder of the repo that holds the skill; --consent skips the security confirmation prompt.
$ npx skills add shift-editor/shift --skill signals -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install shift-editor/shift signals --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/shift-editor/shift.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/.codex/skills/signals .gemini/skills/signals && rm -rf skills-srcUse ~/.gemini/skills/ instead of .gemini/skills for a personal install, then run /skills reload.
Gemini CLI skills documentation · loads skills from .gemini/skills/, .agents/skills/
Install the "signals" agent skill from https://github.com/shift-editor/shift/tree/main/.codex/skills/signals into .gemini/skills/signals/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "signals", then confirm the skill loads.Gemini CLI copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gh skill install shift-editor/shift signalsInstalls for Copilot at project scope by default; add --scope user for a personal install. Preview a skill first with gh skill preview. Needs GitHub CLI 2.90.0 or later (public preview).
$ npx skills add shift-editor/shift --skill signals -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/shift-editor/shift.git skills-src && mkdir -p .github/skills && cp -r skills-src/.codex/skills/signals .github/skills/signals && rm -rf skills-srcUse ~/.copilot/skills/ instead of .github/skills for a personal install. Commit .github/skills so cloud agent and code review can use it.
GitHub Copilot skills documentation · loads skills from .github/skills/, .claude/skills/, .agents/skills/
Install the "signals" agent skill from https://github.com/shift-editor/shift/tree/main/.codex/skills/signals into .github/skills/signals/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "signals", then confirm the skill loads.GitHub Copilot copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add shift-editor/shift --skill signals -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install shift-editor/shift signals --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/shift-editor/shift.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/.codex/skills/signals .opencode/skills/signals && rm -rf skills-srcUse ~/.config/opencode/skills/ instead of .opencode/skills for a personal install.
OpenCode skills documentation · loads skills from .opencode/skills/, .claude/skills/, .agents/skills/
Install the "signals" agent skill from https://github.com/shift-editor/shift/tree/main/.codex/skills/signals into .opencode/skills/signals/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "signals", then confirm the skill loads.OpenCode copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
signalsCanonical rules for writing and reviewing reactive code in Shift.
Signals is an agent skill from shift-editor/shift. Canonical rules for writing and reviewing reactive code in Shift. Use whenever you add or change code that uses signal, computed, effect, track, peek, untracked, batch, keyedCache, or useSignalState; when you touch the model (Font, Glyph, FontStore, layers), node definitions, render passes, or text layout; and whenever a UI or canvas "doesn't update", updates late, or redraws too often.
Its SKILL.md is about 2.5k tokens, which your agent loads only when the skill is triggered. It is a single SKILL.md file with no bundled scripts.
The repository describes itself as: A cross-platform font editor built in Rust and TypeScript. The licence is Apache-2.0.
8 steps, taken from the step headings in SKILL.md.
Read from SKILL.md and the folder at commit 6ade7f2. It shows what the files ask for, not the result of running them.
Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.
From allowed-tools in the SKILL.md frontmatter.
No scripts in the folder and no shell commands in SKILL.md (its code samples are typescript).
From the folder's file list and the shell code blocks in SKILL.md.
No URLs in SKILL.md.
From URLs in SKILL.md, links to its own repository left out.
Names no API keys, tokens, secrets or passwords.
From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.
Signals loads about 2.5k tokens when it runs. Until then it costs about 105 tokens; SKILL.md has 1,273 words of instructions outside code blocks.
Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.
The automated check found no risky patterns in SKILL.md.
Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.
The full file from shift-editor/shift at commit 6ade7f2, republished under its Apache-2.0 licence (© shift-editor). 1,273 words, ~2,456 tokens.
.claude/skills/signals/SKILL.md (or your agent's skills folder).A reactive bug rarely throws. The canvas just stops updating, updates one step late, or redraws on every unrelated change. Each rule below exists because Shift shipped exactly that bug. How the library itself works (equality, laziness, batching, disposal) lives in packages/editor/src/lib/signals/docs/DOCS.md; this skill is about applying it.
Every value a reactive reader depends on must reach it through a signal it subscribes to, at the narrowest granularity that still works.
If a reader can get a value without subscribing (a plain field, a peek(), a lookup that misses), it will not rerun when that value changes. If it subscribes to more than it needs, it reruns on changes it doesn't care about.
A Map or Set that indexes reactive state must be a computed over its source signal, or an immutable collection held in a signal. Never a hand-maintained collection kept "in sync" next to a signal.
// Wrong: every reader must remember track(#layersCell); every writer must refill the map.
readonly #layersBySourceId = new Map<SourceId, GlyphLayer>();
// Right: reading it subscribes by construction.
readonly #layersBySourceIdCell = computed(
() => new Map(this.#layersCell.value.map((layer) => [layer.sourceId, layer])),
);Lint enforces this with shift/no-mutable-collection-field: mutating a collection field outside the constructor, in a file that uses signals, is an error unless the collection holds signals or the field carries // non-reactive: <reason>. Only annotate after checking the field is never read from a computed, effect, or render path.
Origin: Glyph kept component glyphs in a plain Map mutated in place; render models never saw a base glyph arrive, so added components drew nothing (#453).
FontStore.#projectionCells. A single signal holding the whole map makes every reader rerun on every load and forces a copy per write.Origin: FontStore.glyphForId once tracked the whole loaded-glyph map, so the scene and text layout reran on every glyph load (#454).
.value, track, and peek| Where | Read with |
|---|---|
Inside computed / effect bodies, value used | cell.value |
| Inside a reactive body, value unused (invalidation only) | track(cell) |
| Callbacks invoked from a computed (e.g. functions passed into a render model) | track(cell) then cell.peek() |
| Imperative code (event handlers, commands, tests) | cell.peek() |
Lint (shift/no-reactive-value-outside-boundary) rejects .value outside reactive boundaries, which is why callbacks use track + peek. A bare peek() in reactive code means "deliberately do not rerun on this"; leave a comment saying why, because it reads identically to the bug.
When a reactive lookup can miss (data not loaded yet), two things must be true:
null, not a plain Map.get that returns undefined and subscribes to nothing.Origin: typing a character whose glyph wasn't loaded laid it out at advance 0 and never re-laid out (#454); a component whose base glyph was never loaded stayed outline-less because the model skipped it instead of loading it (#453).
Object.is. Mutating a value in place and re-setting the same reference notifies nobody. Build a new reference.Glyph.replaceComponentGlyphs skips unchanged sets so directory updates don't invalidate every render model.{ nodes } wrapper) still reads as changed under the default Object.is. When it sits under a broad source, give it a structural equals so readers don't rerun — e.g. Scene compares nodes by identity so selection writes to the shared store don't reach scene readers.FontStore.committedRevisionCell. A computed that returns the same object after a change looks unchanged and its readers will not rerun.computed.async method with try/catch that logs, and call it with void (see Font.#loadComponentGlyphs).schedule to coalesce to one frame; React uses useSignalState(cell, { schedule: "frame" }) for high-frequency cells.Whoever creates a computed or effect disposes it. Disposing a computed silently orphans everything that reached its source through it; if a subscriber can outlive the intermediate, give it a direct edge to the source (details in signals/docs/DOCS.md). Use keyedCache for per-key derived objects so identity is stable and old entries dispose.
Two copies of the signals module means two dependency trackers: computeds built with one never see signals from the other, and everything looks subscribed but never updates. In the desktop dev server this happened when workspace packages resolved through pnpm symlinks (#447; fixed by resolve.preserveSymlinks: false in apps/desktop/vite.renderer.config.ts). Any bundler or alias change for @shift/* packages must keep one real path per module.
Work down this list before changing code:
signals/signal.ts twice (e.g. once under node_modules/@shift/editor). Symptom: many unrelated things stale at once.peek(), or a mutated-in-place object anywhere on that path breaks it.computed/effect tracks nothing.traceReactiveRun() inside the suspect computed/effect to log which tracked ancestors changed; signalDebug.dump(node) prints its dependency graph.Reproduce with the object the UI actually holds. Get the live render model or layout before the change, subscribe an effect to it the way the renderer does, perform the change through the real editor (TestEditor, real engine), then assert on what the reader ends up seeing. Fetching a fresh object after the change hides exactly the bugs this skill is about.
const model = editor.sceneGlyphRenderModel!;
const seen: number[] = [];
const subscription = effect(() => seen.push(model.contoursCell.value.length));
await editor.addComponent(baseGlyphId);
subscription.dispose();
expect(model.contours).toHaveLength(1);Reproduce the realistic precondition: data saved and reopened so it is not already loaded (see ComponentEditing.test.ts). For state that arrives asynchronously after an edit settles, use expect.poll. Assert on final observable values, never on how many times something ran — see the writing-tests skill.
// non-reactive: with a verified reason.peek() inside reactive code is intentional and commented.© shift-editor, Apache-2.0. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file
Just SKILL.md in .codex/skills/signals of shift-editor/shift.
Open the folder on GitHubat commit 6ade7f2
Signals next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.
| Skill | Stars | Used in | Tokens | Auto-check | Licence | Repo updated |
|---|---|---|---|---|---|---|
| Signals this skillshift-editor/shift | 347 | — | ~2.5k | Automated safety check: Pass | Apache-2.0 | |
| SignalsPostHog/posthog | 40k | — | ~4.3k | Automated safety check: Pass | Custom licence | |
| Trader Signalruvnet/ruflo | 74k | 1 repos | ~605 | Automated safety check: Notes | MIT | |
| Agent Signal Pipelinelobehub/lobehub | 83k | — | ~1.7k | Automated safety check: Pass | Custom licence | |
| Signal Writegithub/awesome-copilot | 40k | — | ~1.3k | Automated safety check: Pass | MIT | |
| Signal Channel for NanoClawnanocoai/nanoclaw | 31k | — | ~3.6k | Automated safety check: Notes | MIT |
PostHog/posthog
How to query the documentembeddings table for raw signal data using HogQL.
ruvnet/ruflo
Generate trading signals using npx neural-trader anomaly detection engine with Z-score scoring and neural prediction
lobehub/lobehub
Guides building event-driven background work for LobeHub agents, with sources, signals, actions, policies, workflow handoff and deduplication.
github/awesome-copilot
Emit structured agent signals — hands-up, blocked, done, checkpoint, partnership.
nanocoai/nanoclaw
Links NanoClaw to Signal as a secondary device on your existing phone, with a native adapter that talks to a signal-cli daemon and needs no bot API.
sickn33/agentic-awesome-skills
Fetch and explain TraderSpy's AI crypto futures signals: entry, take-profit ladder, stop, triggers, status against the live price, and how recent signals resolved.
shift-editor/shift
Rules for writing git commits in the Shift font editor repo: Conventional Commits subjects, user-facing changelog wording, concise subjects and logical commit boundaries.
shift-editor/shift
Finds unused files, exports and class members with Knip, then verifies each candidate through reference tracing before removing anything, never using knip --fix.
shift-editor/shift
Updates or creates DOCS.md files for Shift subsystems, recording the architecture invariants and constraints that cannot be learned from reading the source.
shift-editor/shift
Fact-checks DOCS.md files against the source code, testing each concrete claim and sorting it as true, false, stale or unverifiable.
shift-editor/shift
Sets the rules for finding, writing and updating Shift GitHub issues: search for duplicates first, use outcome-focused titles and testable acceptance criteria.
shift-editor/shift
Guides writing JSDoc for Shift exported APIs as a stable caller contract, covering ownership, lifetime, side effects and nullability that TypeScript types cannot express.
Canonical rules for writing and reviewing reactive code in Shift. Signals is an agent skill from shift-editor/shift. Canonical rules for writing and reviewing reactive code in Shift.
Signals fits situations like: change code that uses signal; you touch the model (Font; Node definitions; canvas doesnt update.
Run `npx skills add shift-editor/shift --skill signals -a claude-code`. Or copy the skill folder (.codex/skills/signals in shift-editor/shift) into .claude/skills/signals in your project. Claude Code loads it when a task matches its description.
Run `npx skills add shift-editor/shift --skill signals -a codex`. Or copy the skill folder (.codex/skills/signals in shift-editor/shift) into .agents/skills/signals in your project. Codex loads it when a task matches its description.
Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add shift-editor/shift --skill signals -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/signals, .gemini/skills/signals, .github/skills/signals and .opencode/skills/signals in your project.
SKILL.md names no scripts, command-line tools or credentials: Signals is instructions for the agent only.
SKILL.md contains no URLs. Any network use would come from the scripts or tools the agent runs. This is read from the text; nothing was executed.
Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. Review the folder before installing.
Signals is published under the Apache-2.0 licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.
About 2.5k tokens (SKILL.md is roughly 9.8k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.
Skills that share tags, products or a category with Signals: Signals (PostHog/posthog, 40k stars), Trader Signal (ruvnet/ruflo, 74k stars), Agent Signal Pipeline (lobehub/lobehub, 83k stars) and Signal Write (github/awesome-copilot, 40k stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
shift-editor (a GitHub organization) maintains it in shift-editor/shift, which has 347 GitHub stars. The repository holds 14 skills in this directory. The repository was last updated on October 7, 2026.
Source: shift-editor/shift on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.