Skip to content

lantern 0.1.4

Choose a tag to compare

@ianclemence ianclemence released this 29 Sep 05:53
· 22 commits to main since this release

lantern 0.1.4

The assessment flow now takes an instruction in words, not just flags.
lantern ask runs the same pipeline as lantern run, but the operator's
directive — a sentence or a whole framework — travels with the flow instead
of a fixed mission string.

lantern ask

lantern ask --target shop.example.com --scope "shop.example.com" --file framework.md
lantern ask --target example.com --scope "example.com" --prompt "Check TLS and headers, defensive only"
echo "Check DNS and TLS on example.com" | lantern ask --target example.com --scope "example.com"

The full text is stored verbatim as a retention-tracked directive.md
artifact with the flow; each role objective and the plan phase see its
3,000-character head, so a 35-section framework fits the 6,000-token working
set. A framework excerpt measured here reports 7,257 in / 16 out tokens (scripted - estimate) with peak 369/6,000 — headroom confirmed, not assumed.

Intent is read, authority is not moved

The prompt is reduced to intent deterministically — no model call, no tokens,
covered by tests:

  • action verbs and gated tool names (exploit, hydra, sqlmap, active
    testing) mean active testing; coverage nouns alone do not (a framework
    listing "privilege escalation" as a checklist item is a topic, not an
    instruction to escalate);
  • an explicit restraint (defensive only, do not exploit, read-only)
    always wins — even over --offensive;
  • contract fields (SYSTEM_NAME through SPECIAL_INSTRUCTIONS) parse out,
    and --target stays the authority: if it disagrees with the contract's
    TARGETS line, the run warns naming both and the flag governs.

The rule, stated once: the prompt can restrain --offensive, never grant
it. Ask for exploitation without the flag and you get reconnaissance plus the
flag named; pass the flag with a defensive-only prompt and the prompt wins.
Both cases say why, on screen, before anything runs:

instruction : Exploit the login form with hydra and run sqlmap against search
intent      : active testing requested
contract    : none declared (TARGETS etc. all empty)
note        : prompt asks for active testing but --offensive was not passed: running reconnaissance only (re-run with --offensive to allow it)

run and ask report a finished flow through one shared outcome block, so
the two lines at the end — spend and context — read identically either way.

Verified

  • 227 tests pass, 1 ignored (the live NVD query), 0 warnings — up from 213
    at 0.1.3. Fourteen new: ten for intent (including restraint-beats-verbs and
    nouns-are-not-instructions), three for the ask gate, one proving the
    directive artifact lands and the flow options record its length.
  • All four gate paths run live against --dry-run: recon restraint,
    exploit-ask downgrade, flag-vs-restraint, contract parse with eight fields,
    --target mismatch warning, and piped-stdin instruction.
  • run --dry-run: 0.34–0.99 s for the full pipeline; ask --dry-run:
    0.36–0.66 s. lantern doctor exits 0 in 36–39 ms.
  • No warnings across cargo check --workspace --all-targets, and no line
    added here passes the 100-column style.
  • The 20% disk floor did its job on the author again: at 5.82 GB free against
    a 6.16 GB floor, run refused with both numbers in the message — and the
    first "benchmark" pass of this release measured those 5 ms refusals, not
    runs. The timings above are re-measured after clearing regenerable build
    weight.

Upgrade

git pull
cargo build --release          # ~/.cargo/bin/cargo if it is not on PATH
./target/release/lantern doctor

No database schema change: the directive length joins the flow-options blob,
so flows recorded on 0.1.0–0.1.3 still render. No new required variables and
no new required flags — ask reuses --target, --scope, --roles,
--steps, --interactive and --offensive with their existing meanings.

Attached: lantern-v0.1.4-aarch64-linux-gnu (8,612,232 bytes), built on Debian
13 / glibc 2.41 / aarch64. For anything else, build from source as above.