Assura keeps deterministic repository checks fast enough to run during the edit loop, not
only at commit time. Every tracked cold project beats native LS-Lint in this checked release
cohort; installed hook entry latency is measured separately from the CLI comparison.
Faster than native LS-Lint across eight cold comparisons.
The speed comparison isolates the policy surface both tools share. Assura-only checks such as
file contents, Markdown, references, and agent repair guidance are reported separately.
OptionBest atAgent-loop tradeoff
AssuraFast repository-wide structure, content, and policy signalsPersistent sessions, bounded output, and repair guidance for early feedback
LS-LintFast file and directory naming rulesOne-shot filesystem checks; no content rules or rule-specific agent repair guidance
Language lintersDeep checks inside code for one language or runtimeEssential later layer, but not one language-agnostic project signal
Custom scripts and hooksProject-specific checks and delivery gatesPerformance and output vary; hooks often arrive after a larger batch of work
Only native LS-Lint is included in the numeric benchmark. Other options are shown for workflow context, not as measured speed claims. Installed agent-hook entry is a separate operation.
Quality policy use case
A package contract agents cannot quietly drift from.
A fully featured Assura policy captures the project practices an agent should preserve.
LS-Lint covers the naming and cardinality subset; the comparison below shows the remaining gap.
Agentic monorepo policy
One contract for every package.
The package tree is required while apps remain optional. Every workspace that exists receives
the same guidance, manifest, naming, size, and directory-health policy.
Quality policy exampleExpected shape
Broad defaults, exact project contracts.
Project rootAlways checked
AGENTS.md, README.md, and workspace files required
Selected policy is visible and project-owned
Dot directories and generated output are bounded
packages/*/Every package
AGENTS.md and package.json required
Recursive defaults cover nested source and docs
Line and child-count thresholds stay advisory
Exact declarations refine closed wildcard rules
$workspace and $skill rebase the repeated hierarchy, while ./**/ applies one compact health layer to every authored directory.
Configuration comparison
The extra lines define quality policies LS-Lint cannot express.
55 policy linesShared filesystem checks plus five project-quality policies.
42 policy linesClosest naming, scope, count, and ignore coverage.
These are intentionally not equivalent-size configs. Assura is larger because it also defines exact project shape, thresholds, content checks, reusable contracts, and repair context.
CapabilityAssuraLS-Lint
File and directory namingRecursive defaults + reusable rulesSupported with cascading scopes
The cold benchmark measures only shared naming, ignore, scope, and cardinality work. Assura-only capabilities are shown here as product coverage, not counted as LS-Lint performance work. All 6 red limitations are exercised against the same pinned native LS-Lint 2.3.0 package used by the performance report.
AssuraFull reusable project contract
rules:
# Progressive-disclosure entrypoints.
agent-entrypoint:
max_lines: 160
severity: low
message: See docs/agent-guidance.md.
skill-entrypoint:
max_lines: 500
markdown:
require_frontmatter: true
message: See docs/agent-guidance.md#skills.
# Shared non-blocking directory health.
folder-health:
limit_children: 10
severity: low
message: See docs/structure.md.
# Closed-directory building blocks.
closed-entry:
exists: 0
message: See docs/agent-guidance.md#layout.
closed:
./*/: $closed-entry
./*: $closed-entry
# Repeated directory contracts.
skill:
./: $closed
./{agents,assets,references,scripts}/:
./: exists:0-1
inherit: false
SKILL.md: exists:1 | $skill-entrypoint
workspace:
AGENTS.md: exists:1 | $agent-entrypoint
package.json: exists:1
structure:
# Directories, as shown by an IDE explorer.
.agents/:
./: exists:0-1 | $closed
skills/:
./: exists:0-1
./*/: kebab-case | $skill
./*: $closed-entry
apps/:
./: exists:0-1
./*/: $workspace
packages/:
./: exists:1
./*/: $workspace
# Required root files, alphabetically.
AGENTS.md: exists:1 | $agent-entrypoint
package.json: exists:1
pnpm-{lock,workspace}.yaml: exists:1
README.md: exists:1
turbo.json: exists:1
# Direct root dot directories.
./.*/: kebab-case | exists:0-10
# Defaults inside every directory, including root.
Closest available coverageDirectory namingAuthored-file namingScoped skill namesGenerated-output ignores
Performance regression suiteMeasured fixtures stay separate from the use case.
These generated projects isolate pruning, matcher scale, and configuration lookup against equivalent LS-Lint work.
Checked files2 to 1,501 per fixture
Directories2 to 801 per fixture
Effective rules1 to 801 per fixture
Timed samples5 per case
All eight measured casesSee what changes and how the speed changes with it.
Each row runs equivalent naming, scope, count, and ignore work through both cold release CLIs. Warm timing is the persistent Assura agent loop; neither row is installed-hook timing. Report: @ls-lint/ls-lint@2.3.0 · 2026-09-13 UTC.
Test caseDifference testedCold CLI timeMeasured difference
Small library Rust package
Small startup-sensitive tree 5 checked · 4 dirs · 6 rules
Guards config loading and scope lookup when a monorepo declares 800 explicit package policies.
Assura cold
54.3 ms
LS-Lint cold
56.2 ms
Assura warm
3.28 ms
Why latency matters
Parallel waiting adds up. Late refactors cost more.
A check that feels small in one terminal repeats across every agent, worktree, and edit loop.
Fast local signals reduce interruption without turning every early warning into a hard gate.
Parallel loops
Keep feedback off the critical path.
When several agents edit at once, repeated startup and full-tree scans compete for CPU, filesystem access, and wall-clock time.
Deterministic first pass
Use rules before another model turn.
Repository policy can answer structural questions locally, reserving agent context and reasoning for work that needs judgment.
Earlier correction
Warn while the patch is still small.
Assura can surface drift during the loop and reserve blocking behavior for rules explicitly configured as commit or CI gates.
This benchmark measures elapsed runtime. CPU utilization, disk I/O, agent memory or token use, and avoided rework are product rationale for keeping checks fast, not measured outcomes in this report.
Benchmark boundary
The speed claim covers the rules both tools share.
Each cold row runs the same generated project with an LS-Lint policy migrated into Assura. The aggregate uses all eight accepted fixtures shown above.
Included in the cold comparisonNaming · ignores · scopes · cardinality
Both release CLIs run process to process, including startup, config loading, traversal, validation, and exit.
Not counted against LS-LintLine limits · content · references · repair guidance
These Assura-only capabilities have no native LS-Lint equivalent and are measured separately.
Separate warm resultPersistent Assura session
Repeated checks avoid paying the full process startup cost on every agent turn.