Finds source-visible semantic runtime bugs without running tests or builds. Use for repository bug hunts from an agent, Codex automation, or Claude loop that should report actionable correctness, security, dataflow, state/lifecycle, API-contract, validation, cache/persistence, or error-path bugs, not style, lint, architecture, maintainability, or missing-test feedback.
74
93%
Does it follow best practices?
Run evals on this skill
Adds up to 20 points to the overall score
View guide
Passed
No findings from the security scan
Use this only to turn a trail into concrete repo-specific probes. Do not report generic design advice. Every probe must aim at a reachable runtime bug.
Before sending an Arrow, lead Devana must translate the selected trail into a repo-specific prompt:
Do not send an Arrow a bare trail label and expect it to infer this context.
Use this as a cross-cutting lens when a repo has production workflows, scheduled automation, distributed components, or release/config surfaces. It is not a separate trail; fold the relevant probes into the selected trail prompt.
Look for incident-shaped bug clusters:
Prompt use: name the specific config key, flag, dependency, cache, migration, job, or external service in the Arrow prompt. Ask for a concrete event sequence, not a general reliability concern.
Good proof: incident-style timeline showing trigger -> missed guardrail -> wrong runtime state or user-visible impact.
Reject when: the issue is only poor observability or process hygiene without a concrete reachable bad behavior.
Keywords: incident, postmortem, rollout, drift, flag, stale, timeout, retry, fallback, dependency, migration, guardrail, alert.
Start from: core mutators, aggregate roots, reducers, parsers, state machines, transaction coordinators, resource owners, business-rule modules.
Look for:
Probes: callers of mutators; public wrappers around core helpers; branches that bypass validation; repeated internal state writes; core functions with external side effects.
Good proof: control-flow trace from core function to caller-visible bad state, with concrete pre-state and caller path.
Reject when: the concern is only large function, low cohesion, abstraction, or refactor preference.
Keywords: mutator, aggregate, reducer, parser, state machine, transaction, business rule, side effect, branch order.
Start from: routes, CLI commands, webhooks, message consumers, scheduled jobs, UI actions, public APIs, SDK methods, plugin hooks.
Look for:
Probes: external input fields; route/job/webhook handlers; auth middleware ordering; config reads; feature flags; queue consumers; scheduled jobs.
Good proof: entrypoint-to-sink trace with exact input, actor, config, or event order.
Reject when: no external or scheduled path reaches the behavior.
Keywords: route, webhook, consumer, cron, CLI, flag, config, env, retry, duplicate, timeout, cancellation.
Start from: docs, schemas, type names, constructor guards, aggregate rules, state enums, tests, caller/callee expectations.
Look for:
Probes: unchecked constructors; validate, ensure, assert, rep_ok; state enum transitions; schema fields; docstrings; migration defaults.
Good proof: violated invariant plus smallest counterexample value, state, or transition.
Reject when: expected behavior is not encoded in code, docs, tests, schema, or nearby callers.
Keywords: invariant, precondition, postcondition, impossible state, typestate, aggregate, schema, enum, nullability, units.
Start from: numeric/string/date ranges, collection sizes, parser inputs, pagination, rate limits, time windows, locales, encodings.
Look for:
Probes: comparisons; loops; slicing/indexing; parser branches; limit/page parameters; date/time conversions; canonical signature inputs.
Good proof: concrete boundary value and oracle showing the observed behavior violates source-visible intent.
Reject when: the boundary value is only unusual, not plausibly wrong.
Keywords: empty, null, zero, one, min, max, off-by-one, timezone, locale, encoding, canonicalization, malformed.
Start from: user input, auth claims, tenant/project/user IDs, config/env values, serialized fields, cache keys, message payloads.
Look for:
Probes: source-to-sink paths; transforms; serializers/deserializers; permission context propagation; joins between actor-owned and resource-owned data.
Good proof: dataflow trace from source to sink with missing/wrong check and affected behavior.
Reject when: the flow is sanitized, reauthorized, canonicalized, or constrained before the sink.
Keywords: source, sink, taint, tenant, owner, actor, permission, transform, serializer, canonicalize, derived value.
Start from: init/use/cleanup, subscriptions, timers, workers, sessions, locks, pooled resources, cancellation, retries.
Look for:
Probes: constructors; start/stop hooks; close, dispose, finally, defer; lock acquisition order; retry loops; cancellation handlers.
Good proof: state transition trace or event order that reaches invalid state.
Reject when: lifecycle concern cannot affect runtime behavior or resource availability.
Keywords: init, cleanup, dispose, RAII, cancel, timeout, retry, lock, race, atomic, listener, timer, pool.
Start from: adapters, interface implementations, API clients, request/response shapes, error paths, fallbacks, retries.
Look for:
Probes: catch blocks; fallback branches; adapter implementations; return-value checks; ignored promises/results; OpenAPI/GraphQL/protobuf schema changes.
Good proof: caller/callee or producer/consumer mismatch with concrete failure branch.
Reject when: error conversion is documented and all callers handle it.
Keywords: catch, fallback, null, partial, retry, idempotency, versioning, backward compatibility, adapter, contract drift.
Start from: cache keys, invalidation, TTL, stale reads, transactions, migrations, background jobs, outbox/inbox, message delivery.
Look for:
Probes: cache get/set/delete; key builders; transaction boundaries; migrations/defaults; job retry logic; idempotency keys; message ordering assumptions.
Good proof: sequence of read/write/delete/event operations that leaves stale, duplicated, or inconsistent state.
Reject when: stale data is explicitly allowed and cannot escape its tolerance window.
Keywords: cache key, TTL, invalidation, stale, stampede, transaction, isolation, lost update, write skew, outbox, inbox, duplicate.
Start from: auth, ownership, tenant/project/user scoping, path/file access, deserialization, reflection, secrets, policy fallbacks.
Look for:
Probes: auth middleware order; resource lookup filters; tenant/user/project IDs; path joins; deserializers; reflection/internal access; secret logging; policy catch blocks.
Good proof: actor-to-resource trace showing unauthorized access, data exposure, injection, or unsafe fallback.
Reject when: framework or caller guarantees the boundary and evidence confirms it.
Keywords: auth, ownership, tenant, project, scope, trust boundary, confused deputy, canonicalization, deserialization, path, secret, policy.