chore: release 0.6.1 - #217
Merged
Merged
Conversation
…erge chore: begin 0.7.0.dev0 + backmerge main into dev (post-0.6.0)
Replace the stale v0.1/v0.2 scope framing with the current release (v0.6.0 on PyPI; dev on 0.7.0.dev0) and the v0.7–v1.0 next-scope, keeping it a scope anchor rather than a feature list (CHANGELOG owns shipped-work detail).
…209) AnsiRenderer now paints the four verdict tiers (kept / kept-uncertain / dropped / flagged) in the SignalForge Design-System hues when the terminal advertises 24-bit colour, falling back to the existing 16-colour SGR codes otherwise. - Add brand-hex truecolor palette (#2FCB7F / #4F90F7 / #FB5A60 / #F5A623) in one constant block mirroring tokens/colors.css; _truecolor() helper emits \x1b[38;2;r;g;bm; _TIER_CODES_16 / _TIER_CODES_TRUECOLOR maps. - New _should_emit_truecolor() is a SECOND axis below the DEC-021 colour-on chain: only consulted once colour is on, resolved via an explicit truecolor kwarg or COLORTERM in {truecolor,24bit}. NO_COLOR / precedence / unconditional ANSI-strip (DEC-007) all unchanged. - Header counts, table tier cells, and the proposed-test-files +++ header all read the same palette map for cross-surface consistency. - 16-colour output is byte-identical to pre-#209: every existing *.ansi golden regenerates unchanged. New truecolor_tiers.ansi golden pins the brand-hex bytes (snapshot case count 13 -> 14). - Deterministic tests: snapshot recipes pass truecolor explicitly; test_renderers.py autouse-clears COLORTERM so 16-colour assertions are env-independent; new test section covers detection + both kwarg overrides + colour-off short-circuit. - Docs + rule parity: docs/diff-ops.md colour section + tier table; .claude/rules/diff-renderer.md new palette section. No CLI flag / DiffConfig field — detection is automatic via COLORTERM; the truecolor kwarg is the test seam + future --color-mode wiring point.
feat(diff): brand-hex truecolor tier palette with 16-color fallback (#209)
On a colour TTY, 'signalforge generate' progress lines now carry the brand spark-amber ◆ glyph, a dim stage label, and a right-aligned per-stage fact (model id / kept·dropped / mean grade). Colour-off output is byte-identical to pre-#210, so piped logs and existing snapshots are unchanged. - Promote the brand palette + 24-bit primitives + COLORTERM detection to a shared signalforge._common.palette module so the CLI progress and the diff renderer (#209) read the SAME bytes. diff/_renderers imports them (values unchanged -> every diff golden stays byte-identical). - resolve_progress_style(verbose) decides colour once (stderr-keyed: FORCE_COLOR > NO_COLOR > stderr.isatty; --verbose forces progress not colour; truecolor via COLORTERM). Threaded through the emit calls like progress_on. - emit_progress_entry/done/batch gain a ProgressStyle: colour-off keeps the exact '[N/total] stage: body' / 'done in X' lines; colour-on emits '◆ [N/total] stage body' + right-aligned dim fact. Decisions D3/D4 (#208): keep the safety line AND the [N/total] counter. - print_stderr gains allow_sgr=True — the narrow #60 strip-at-the-sink exception for trusted glyph/dim SGR (the emitter pre-strips user content). - Facts: draft->model, prune->'N kept · M dropped', grade->'mean X.XX', computed from in-scope objects (DEC-026, never hardcoded). - Tests: shared palette unit tests; resolve_progress_style precedence + emit plain/colour/right-align/glyph unit tests; rewrote the TTY progress tests palette-robustly (strip SGR, assert structure) + a spark-amber SGR pin + a plain-path byte-stability pin; autouse fixture isolates the colour env per test (the --no-color os.environ mutation leaks across in-process main() runs). - Docs/rules: cli-layer.md progress section, diff-renderer.md palette section (now _common.palette), docs/cli-ops.md progress example. prune-existing progress stays plain (passes no style) — scoped to generate.
feat(cli): ◆ glyphed progress UX for signalforge generate (#210)
A successful single-model 'signalforge generate' run now closes with a two-line stderr footer below the diff: a 'wrote …' line naming the artifacts actually written, and a '✓ done in <X> · $cost' line with the per-provider LLM cost. - build_run_footer / format_cost_clause / _format_usd / _check_glyph in _helpers.py. ✓ is signal-green (palette.SIGNAL/GREEN); glyph + colour only when style.color (reuses the #210 ProgressStyle); plain path is glyph-free. - Footer built in _run_single_model (single-model + progress_on only), stored on _SingleModelOutcome.footer_text, emitted by the dispatcher AFTER sys.stdout.write(diff) + flush so it reads below the table and > diffs.txt stays clean. Batch closes with format_batch_summary (per-model cost would be cumulative across the append-only audit JSONLs) — footer_text="" in batch. - Cost from signalforge.llm.cost.rollup_audit_dir, SUPPLEMENTARY: a rollup failure degrades to no cost clause, never fails the run (cli-layer.md DEC-005). Sub-cent renders <$0.01. Warehouse cost omitted (no actual-bytes figure at end-of-run; --estimate is the planner preview). - wrote line is honest: schema.yml (N kept) only under --write, diff.json unless --dry-run, grade.json when graded; 'dry run — no files written' under --dry-run. - Tests: format_cost_clause + build_run_footer units (color/plain/dry-run/ sub-cent/sorted/zero-skip); integration tests for footer-in-TTY (on stderr, not stdout) + --quiet suppression. - Docs/rules: cli-layer.md footer section, docs/cli-ops.md footer subsection.
- format_cost_clause strips ANSI from the unknown-provider fallback (the raw audit-derived key) before it reaches print_stderr(allow_sgr=True) — consistency with the #210 'emitter pre-strips user content' rule. - Footer gates .signalforge/grade.json on 'not dry_run' so --dry-run reports 'dry run — no files written' (honours the dry-run contract) instead of claiming a deliverable; added an integration test pinning it. - docs: add 'text' language specifier to the cli-layer.md footer fence.
feat(cli): end-of-run footer — wrote … + ✓ done in <X> · $cost (#211)
#212) Closes the brand-CLI epic's table-polish child. No production change — the em-dash N/A score and the 6-column table were already correct; this pins the brand-voice invariants and records the column-layout decision. - tests/test_brand_no_emoji.py: a rendered-output 'no emoji' gate over every diff snapshot case + the CLI progress/footer surfaces. Keyed on emoji/ pictographic codepoint ranges that exclude the BMP glyphs the brand uses (✓ → ◆ — … └─ ↳) and accented Latin user text. Planted-violation self-check (predicate must catch 🐰/✨ and pass ✓/◆/café) per testing-signal.md. - D2 decision recorded in diff-renderer.md: KEEP the 6-column table (TIER · ARTIFACT · TEST · REASON · SCORE · WHY). The Design-System mockup's 5-column fold (REASON into WHY) is NOT adopted — REASON carries the load-bearing DropReason literal, distinct reviewer signal from the prose WHY. - diff-renderer.md also pins the em-dash N/A score (already implemented + tested by test_score_none_renders_em_dash) and the no-emoji gate. Em-dash work item was already complete (src + test_score_none_renders_em_dash); this ticket reduced to the glyph audit + the D2 decision.
test(diff): brand glyph audit (no emoji) + record D2 6-column decision (#212)
|
Caution Review failedPull request was closed or merged during review 📝 WalkthroughWalkthroughThis PR delivers v0.6.1 with unified terminal output styling: a shared ANSI/truecolor palette module, CLI progress rendering with spark glyphs and right-aligned facts, end-of-run footers with cost rollup, brand-hex tier colors in diff output, and enforcement of a "no emoji" brand gate across all surfaces. ChangesCLI and Diff Output Branding
Estimated code review effort🎯 4 (Complex) | ⏱️ ~60 minutes Possibly related PRs
Suggested labels
Poem
🚥 Pre-merge checks | ✅ 4 | ❌ 1❌ Failed checks (1 warning)
✅ Passed checks (4 passed)
✏️ Tip: You can configure your own custom pre-merge checks in the settings. ✨ Finishing Touches📝 Generate docstrings
Comment |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Cuts v0.6.1 to PyPI — the brand Design-System CLI styling (#208 epic: #209 truecolor tier palette, #210 ◆ glyphed progress, #211 done+cost footer, #212 table decision + no-emoji gate).
Dev-ahead-of-main release:
release/0.6.1is cut fromdevHEAD (10 commits ahead of main with the v0.6.1 content), diff vsorigin/devis only the 4 release-prep files.Pre-flight passed: ruff / ruff format / pyright / pytest (3809 passed, 0 type errors).
uv build+uvx twine checkPASSED on wheel and sdist. CHANGELOG promoted from[Unreleased]→[0.6.1] — 2026-06-11. Verified end-to-end via the v0.6.1rc1 TestPyPI dry-run.Post-merge: tag v0.6.1 → non-prerelease GitHub Release →
publish-pypi. dev stays on 0.7.0.dev0 (0.6.1 is an interim patch; the 0.7 line continues toward the Airflow operator).Summary by CodeRabbit
Release Notes – v0.6.1
New Features
Improvements
FORCE_COLOR,NO_COLOR, andCOLORTERMenvironment variables.