Skip to content

v0.6.0 β€” the agent contract

Choose a tag to compare

@Stupidoodle Stupidoodle released this 25 Aug 12:12
· 32 commits to main since this release

v0.6.0 β€” the agent contract

Board facts stop being prose. The wire contract gets the fixes the v0.5
agent-UX review deferred. (CV tailoring moves to the v0.7.0 milestone.)

Boards as data

$ sdj boards
8 boards β€” select with --board <id|country>, persist with `sdj config --boards`
swissdevjobs     ch   SwissDevJobs        CHF  enabled  it Β· salary
…
jobsch           ch   jobs.ch             CHF  enabled  all-industries Β· no-salary Β· search-driven Β· no-native-apply Β· categories: it
  • New list_boards MCP tool and sdj boards command: scope,
    currency, salary availability, search-driven, native apply, category
    aliases, and enabled state β€” straight from the registry, per board.
  • The MCP category enum and the CLI --category choices derive from
    the registry
    (known_categories()). A future board registering a
    finance alias appears in every surface without touching prose.
  • The deprecated country param drops its duplicated enum, and
    annotations.title no longer repeats the tool title β€” smaller
    tools/list, one source of truth.
  • Skills and server instructions now say call list_boards instead of
    hardcoding board facts that drift.

Payload contract (BREAKING for sdj list --json)

  • sdj list --json now returns compact summary rows in an envelope,
    capped at 50 by default (--limit 0 = uncapped). The old output β€” full
    raw wire rows, ~470 tokens each, uncapped β€” is preserved byte-for-byte
    behind --raw. Migration: add --raw.
  • Summary rows are omit-empty: keys that are None or empty are dropped
    (jobs.ch/jobup.ch rows shed six dead fields), and salary is
    numeric-only β€” salary_from/salary_to plus currency, no
    formatted string.
  • Stable MCP error codes: unknown_selector, job_not_found, and
    internal_error replace leaked Python class names (ValueError used to
    cover two unrelated failures).
  • In-band coverage steering: search results name boards_searched and
    carry a note when a search-driven board ran without a query
    ("returned newest postings only β€” pass query for coverage") β€” steering
    that survives context compaction, unlike skill prose.

230 tests, 92.6% coverage, CI on 3.9 + 3.14.

Full Changelog: v0.5.1...v0.6.0