lambe — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited lambe (Agent Skill) and scored it 100/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 0 flagged
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
lam) — structured data queriesLambë is on the user's PATH after dart pub global activate lambe. You invoke it via shell. The binary is named lam.
Sandbox note for agent harnesses: some agent shells do not inherit the user's interactive PATH. If lam: command not found appears, fall back to the absolute path ~/.pub-cache/bin/lam, which is where dart pub global activate installs it. This is a shell-environment behavior, not a lambë issue.
lamThe user wants to do something with a structured data file:
Don't reach for lam when:
try/catch, regex, or accumulating state — write code instead.# Extract — single value or path
lam '.database.host' config.toml
# Filter + project
lam '.users | filter(.age > 30) | map(.name)' data.json
# Aggregate
lam '.items | map(.price) | sum' data.json
# Inspect structure (returns JSON Schema)
lam --print-shape data.json
# Static query trace (no execution; surfaces shape per stage + warnings)
lam --explain '.config | flatten | as(toml)' data.json
# CI assertion (exit 0 on true, 1 on false)
lam --assert '.replicas >= 2' deployment.yaml
# Convert format
lam --to yaml '.config' data.json
# Run without input (literal-only queries)
lam -n '[1, 2, 2, 3] | unique'
# Markdown headings (use `text` op, not `.children[0].text`)
lam '.children | filter(.type == "heading") | map(text)' README.mdProperty access: .field, .users[0], .users[-1], .tags[1:3], .["x-axis"] (bracket form for non-identifier keys).
Pipeline ops chained with |: filter(p), map(e), sort, sort_by(k), group_by(k), unique, unique_by(k), flatten, reverse, length, first, last, sum, avg, min, max, keys, values, has("k"), to_entries, from_entries, to_number, type, filter_values(p), map_values(e), filter_keys(p), text (markdown), as(fmt) (cross-format bridge).
Expressions: arithmetic + - * / %, comparison < > <= >= == !=, boolean && || !, null fallback //, conditional if c then a else b, object construction {name, total: .price * .qty}, string interpolation "\(.name) is \(.age)", list literal [1, 2, 3].
Boolean keywords: lambë's logic operators are && || !. and and or are accepted as keyword aliases (jq compatibility). not is not aliased; use !.
Markdown parses to a CommonMark AST. Root is {type: "document", children: [...]}. Every node has a type. Container nodes have children; leaves carry content directly.
Common queries:
# Heading texts (use `text` op for prose extraction)
lam '.children | filter(.type == "heading") | map(text)' doc.md
# Headings with levels
lam '.children | filter(.type == "heading") | map({level, title: text})' doc.md
# Code blocks by language
lam '.children | filter(.type == "code_block") | map({language, code})' doc.md
# Whole document as plain text
lam '. | text' doc.mdThe text op walks any node tree and concatenates prose recursively (text + code + code_block + image alt). Use it instead of .children[0].text — that pattern only sees the first immediate child and misses nested emphasis, links, and inline code.
--no-pretty forcompact output, or -r for raw top-level strings (no quotes).
.missing is null,doesn't throw); computation throws (.missing + 5 errors). Use .field == null to test, or .field // default to substitute.
first/last return null on empty;min/max/avg throw; sum returns 0.
any in shape inference. Real-worldmarkdown children, mixed JSON arrays. The shape system is honest about this; --print-shape shows the widening.
lam --to toml ...rejects the shape, the error names the as(...) bridge to apply.
errors. It prints the shape at every stage statically, plus warnings for runtime-rejected ops and provably-empty filters.
.. recursive descent, def user functions, try/catch, regex, getpath/setpath, in-place mutation, streaming. If you draft a query needing any of these, lambë will tell you with an "unknown pipe op" error or a _jqIdiomHint. See the non-goals reference for the lambë idiom that replaces each omission.
Deeper reference lives in the lambë repo:
AGENTS.md — broader reference: more examples, full pipeline oplist, error pattern table, format auto-detect rules. <https://github.com/hakimjonas/lambe/blob/main/AGENTS.md>
doc/syntax.md — language reference.<https://github.com/hakimjonas/lambe/blob/main/doc/syntax.md>
doc/recipes.md — end-to-end examples.<https://github.com/hakimjonas/lambe/blob/main/doc/recipes.md>
doc/non-goals.md — what lambë deliberately doesn't do, and thelambë idiom that replaces each omission. <https://github.com/hakimjonas/lambe/blob/main/doc/non-goals.md>
The MCP server lam-mcp is available for sandboxed agents that can't shell out.
~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.