Skip to content

Beislið v0.4.10

Latest

Choose a tag to compare

@sandsower sandsower released this 04 Jul 16:11
· 15 commits to main since this release

Beislið v0.4.10

This release covers all changes since the last published GitHub release, v0.4.0.

Highlights

  • The workflow.md parser contract is now canonical: a golden conformance corpus (17 cases), a frozen error-code catalog, and YAML-lite scalar semantics, all running in CI (BEI-131).
    This is the port target for olin - implementations port against tests/conformance/cases/, not against the Python code.
  • P0 integrity fixes: fail-closed action-policy payload validation, run-ledger redaction aligned with policy secret patterns, and interrupt-safe staged project installs (BEI-128, BEI-129, BEI-130).
  • Execution-envelope contract extracted into declarative JSON schemas, orphaned validators wired into CI, and a nightly agent-smoke suite (BEI-133, BEI-134, BEI-135).

Parser behavior changes (BEI-131)

The deterministic decisions from the 2026-07-03 HITL session (docs/plans/2026-07-03-bei-131-canonical-parser-decisions.md) are now implemented and pinned by the corpus.
Each of these is a behavior change from v0.4.9 and earlier:

  • Trailing comments in unquoted scalars are stripped (YAML semantics): a # preceded by whitespace ends the value, so parallel_safe: true # optional now parses as boolean true.
    Quoted values keep # literally.
    Previously the comment stayed inside the value.
  • Inline flow maps are rejected: - { name: lint, command: 'pnpm lint' } is now a flow_map_unsupported error instead of a silent literal string.
    Block style is the one canonical mapping syntax.
  • Parse diagnostics report absolute workflow.md line numbers, not indexes into a comment-stripped array.
  • Unknown beislid:* fence keys now warn (unknown_fence_key, exit 0) against the full documented fence-key registry (~25 keys), instead of being silently ignored.
    Newer fence keys degrade gracefully against older normalizers.
  • Registered-but-unconsumed fence blocks are now syntax-checked: a malformed scopes or babysit block fails the file with a parse error, where the old normalizer never looked at it.
    Well-formed blocks owned by other tools are still skipped silently.
  • Tier enums are validated at normalize time: tiers keys must be light, standard, heavy, or frontier, and tier_mode must be prefer or require; violations are invalid_value errors.
  • model and models on one route are mutually exclusive: both present is now an invalid_value error instead of model being silently dropped.
  • Decimal floats parse as numbers: -?\d+\.\d+ (e.g. 1.5) is a JSON number.
    Exponents, 1., .5, and 1.5.2 stay strings.
  • Nested inline lists are rejected: a [ inside an inline list is a nested_inline_list error pointing at block style.
  • Strict quote semantics: double-quoted scalars process exactly \n, \t, \\, \"; any other escape is an unknown_escape error.
    Single-quoted scalars are literal except '' -> '.
    Unterminated or mismatched quotes are unterminated_quote errors instead of silently passing through as literal strings.
  • Unterminated fence blocks are malformed_block errors: a beislid:* fence without a closing fence line was previously ignored entirely; it now fails the file.
  • Unterminated inline lists are malformed_block errors (a missing ] with no trailing comment).
  • gate_sets and lifecycle_actions pass through unknown keys in the normalized envelope instead of projecting down to their known fields, matching the other sections.
    Note: sets: null is no longer coerced to {}.
  • Duplicate beislid:* fences keep the existing behavior (warn + first occurrence wins), now pinned by the corpus.

Parser infrastructure (BEI-131)

  • Golden conformance corpus: tests/conformance/cases/ (17 input/expected-envelope pairs) with the scripts/run_conformance.py runner, wired into CI as the normalizer-conformance job.
  • Frozen diagnostic catalog: docs/parser-conformance.md documents all 14 error/warning codes with severity and path conventions.
    These codes are stable from this release onward.
  • Format doc amendments: the scopes examples use block style, and the YAML-lite scalar rules (comments, floats, quotes, inline lists) are documented in .beislid/workflow-md-format.md, so doc and implementation agree.

Fixes and hardening

  • Fail-closed action-policy payload schema validation (BEI-128).
  • Run-ledger redaction aligned with policy secret patterns (BEI-129).
  • Interrupt-safe staged project copy installs (BEI-130).
  • Orphaned validators and tests wired into CI (BEI-133).
  • Skill portability gaps fixed for non-Claude hosts.

Workflow and orchestration

  • Execution-envelope contract extracted into declarative JSON schemas (BEI-134).
  • Nightly agent-smoke suite with fixture library and blueprint/implement/review/rinse/setup scenarios (BEI-135).
  • command_proofs added as a distinct per-slice envelope contract field (RON-146).
  • Babysit now requires a rondo.final_report/v0 JSON final response.
  • Workflow-signal heartbeat hook, sweep command, and stale reporting.
  • scripts/validate.sh local CI mirror plus docs/testing.md.