Repository navigation
Releases: tiagovilasboas/downshift
Release list
v0.1.0-beta.7
Downshift v0.1.0-beta.7
Deterministic model router for coding harnesses (Claude Code, Cursor, Codex, and more).
Routes each subagent to the right-sized model by task complexity — no LLM in the routing loop.
Changelog
Other
- 7074f36: Move benchmarks and training ops to labs; publish REPORT only (@tiagovilasboas)
- f502e25: ci: fast path on PR/push; nightly ci-full for heavy checks (@tiagovilasboas)
- b5741db: test(cmd): isolate HOME so hook tests stop writing to the real events.jsonl (@tiagovilasboas)
Install (macOS / Linux):
curl -fsSL https://raw.githubusercontent.com/tiagovilasboas/downshift/main/install.sh | shInstall (Go toolchain):
go install github.com/tiagovilasboas/downshift/cmd/downshift@v0.1.0-beta.7Verify checksum:
sha256sum -c checksums.txtLicence: Apache License 2.0. See LICENSE.
v0.1.0-beta.6
Launch — GitHub Discussion (pin after enabling Discussions)
Category: Announcements
Title: Harness Downshift is now Downshift
The project started as a coding harness router (Claude Code, Cursor, Codex hooks). The core is broader: deterministic model routing for AI workloads: classify task complexity, apply catalog policy, pick tier without an LLM in the routing loop.
- Same CLI:
downshift - Repo: https://github.com/tiagovilasboas/downshift (redirect from
harness-downshift) - Licence: Apache 2.0 — https://github.com/tiagovilasboas/downshift/blob/main/LICENSE
- Release: https://github.com/tiagovilasboas/downshift/releases/tag/v0.1.0-beta.6
- State dir:
~/.downshift(legacy~/.harness-downshiftsupported) —downshift doctor - Harness is an integration category, not the product name
Docs: ARCHITECTURE · WHEN-TO-USE · BETA-EXIT
Install:
curl -fsSL https://raw.githubusercontent.com/tiagovilasboas/downshift/main/install.sh | sh -s v0.1.0-beta.6Questions and misroutes: open an issue with the misroute label or use Q&A in Discussions.
v0.1.0-beta.5
harness-downshift v0.1.0-beta.5
Harness-native subagent model router for Claude Code, Cursor, Codex, Grok, and OpenRouter.
Routes each subagent to the right-sized model by task complexity — no LLM in the routing loop.
Experimental naive-Bayes flags (default OFF)
Both naive-Bayes second opinions are experimental and default OFF; they record shadow telemetry only and must not be relied on for routing:
DOWNSHIFT_NB_UPSHIFT(#36), shadow telemetrynb_upshiftDOWNSHIFT_NB_DOWNSHIFT(#41), shadow telemetrynb_downshift. Since #42, guardrail R1 (unconfident downshift) also holds the NB TRIVIAL downshift, so with this flag on, effective routing is unchanged on every evaluation split (0 of 21 seed opinions reach the small model).
Changelog
New features
- a28865e: feat(core): add naive-Bayes TRIVIAL downshift for no-signal prompts behind a flag (#41) (@tiagovilasboas)
- bbfa977: feat(core): add naive-Bayes upshift-only second opinion behind a flag (#36) (@tiagovilasboas)
- 8a06cf9: feat(outcome): record small, mid and frontier runs over ZDR (#33) (@tiagovilasboas)
Bug fixes
- 43b99ea: fix(core): escalate via graphify only when the classifier is uncertain (#39) (@tiagovilasboas)
- 74e8fea: fix(core): keep graphify escalation through confidence and intent (#30) (@tiagovilasboas)
- 4a857b5: fix(core): let guardrail R1 hold the NB TRIVIAL downshift (#42) (@tiagovilasboas)
- e0ecda3: fix(core): match signatures in the risk floor only in crypto contexts (#40) (@tiagovilasboas)
- 1a5b5a9: fix(core): never fall back below the classified tier in session routing (#28) (@tiagovilasboas)
- 86dd11e: fix(core): stop buried "explain" and zero-downtime changes from routing to small (#37) (@tiagovilasboas)
- c39386a: fix(telemetry): record allow when the hook leaves the spawn unchanged (#29) (@tiagovilasboas)
Other
- 1f631c4: docs(design): record blind validation of the upshift-only baseline (#35) (@tiagovilasboas)
- caede75: docs(design): record router generalization evidence and next cut (#32) (@tiagovilasboas)
- ea340cc: docs(design): record small over-routing evidence and mark blind-vitrine seen (#38) (@tiagovilasboas)
- c8db1cd: test(benchmark): add blind-vitrine as an externally authored eval split (#34) (@tiagovilasboas)
- b74d69f: test(benchmark): add heldout2 as a second evaluation-only split (#31) (@tiagovilasboas)
Install (macOS / Linux):
curl -fsSL https://raw.githubusercontent.com/tiagovilasboas/harness-downshift/main/install.sh | shInstall (Go toolchain):
go install github.com/tiagovilasboas/harness-downshift/cmd/downshift@v0.1.0-beta.5Verify checksum:
sha256sum -c checksums.txtLicence: Business Source License 1.1 — free for non-commercial use.
Commercial use requires a written licence from Tiago de Carvalho Vilas Boas.
See LICENSE.
v0.1.0-beta.4
harness-downshift v0.1.0-beta.4
Harness-native subagent model router for Claude Code, Cursor, Codex, Grok, and OpenRouter.
Routes each subagent to the right-sized model by task complexity — no LLM in the routing loop.
Changelog
Bug fixes
- 14a75d8: fix(core): keep the current model when a guardrail holds a session downshift (#27) (@tiagovilasboas)
Install (macOS / Linux):
curl -fsSL https://raw.githubusercontent.com/tiagovilasboas/harness-downshift/main/install.sh | shInstall (Go toolchain):
go install github.com/tiagovilasboas/harness-downshift/cmd/downshift@v0.1.0-beta.4Verify checksum:
sha256sum -c checksums.txtLicence: Business Source License 1.1 — free for non-commercial use.
Commercial use requires a written licence from Tiago de Carvalho Vilas Boas.
See LICENSE.
v0.1.0-beta.3
harness-downshift v0.1.0-beta.3
Harness-native subagent model router for Claude Code, Cursor, Codex, Grok, and OpenRouter.
Routes each subagent to the right-sized model by task complexity — no LLM in the routing loop.
Changelog
New features
- 5e40f88: feat(benchmark): add --report, regression gate threshold and issue template (P4.6, P5.6, I6) (@tiagovilasboas)
- 06d7d15: feat(benchmark): add bootstrap confidence intervals and silence CI cache (P4.7, I3) (@tiagovilasboas)
- 6e4f0f7: feat(benchmark): add holdout 300-task split (500 total) and wire PostToolUse quickstart (P4.5, P3.3) (@tiagovilasboas)
- e324600: feat(benchmark): expand dataset from 30 to 108 curated tasks (@tiagovilasboas)
- 70b2522: feat(benchmark): expand seed dataset to 200 tasks and add CI export artifact (P4.4, P2.5) (@tiagovilasboas)
- d5c13b9: feat(brand): adopt downshift v1 identity in README and web monitor (@tiagovilasboas)
- c1cff83: feat(brand): apply v3 kit — github hero, docs diagrams, social assets (@tiagovilasboas)
- 0c7a1e8: feat(catalog): add Antigravity Google Gemini pricing entries (flash_lite, flash, pro) (@tiagovilasboas)
- f8fd01e: feat(classifier): MiniLM semantic boost + benchmark --report/--gate (@tiagovilasboas)
- a881ede: feat(classifier): raise system-design tasks to complex (@tiagovilasboas)
- 4b27ff6: feat(classifier): treat etcd and raft coordination as complex (@tiagovilasboas)
- 6ee5b8a: feat(core): floor risk-sensitive tasks off the small tier (#24) (@tiagovilasboas)
- 6a3f6ad: feat(core): integrate graphify escalation into classification pipeline (@tiagovilasboas)
- 5ae095d: feat(core): post-decision self-correction plus session memo (@tiagovilasboas)
- d9f0daf: feat(decisionintelligence): add shadow-only advisory tier recommender (@tiagovilasboas)
- e53ecbc: feat(ds04): add Claude Code lifecycle observer adapter (@tiagovilasboas)
- 7e88b2c: feat(dsmon): agent lifecycle section + dsmon-hook tracker (@tiagovilasboas)
- e6d61ec: feat(dsmon): floating terminal monitor widget (cmd/dsmon/) (@tiagovilasboas)
- 912a269: feat(dsmon): live relative timestamps + 24h window + 250ms refresh (@tiagovilasboas)
- 7fb1318: feat(dsmon): pulsing ◉/○ indicator + live 'last event X ago' counter (@tiagovilasboas)
- 3089441: feat(eval): add an outcome eval with executable checks and a generated README report (#26) (@tiagovilasboas)
- 2203d7c: feat(evidence): real session data, hook-layer E2E, benchmark protocol (@tiagovilasboas)
- a07b935: feat(graphify): codebase-graph escalation adapter (DS-05) (@tiagovilasboas)
- e29f591: feat(kirocrew): add KiroCrew adapter in policy mode (exit 0/2, no rewrite) (@tiagovilasboas)
- 5637f56: feat(lifecycleobserver): add disabled-by-default Codex observer POC (@tiagovilasboas)
- d181a8e: feat(orchestration): Go planner replaces LangGraph Python graph (@tiagovilasboas)
- de54f46: feat(orchestration): add opt-in provider-agnostic LangGraph planner (@tiagovilasboas)
- b4da251: feat(policy): keep simple tasks on the small tier (@tiagovilasboas)
- bff214b: feat(semantic): enable local MiniLM boost by default with hash fallback (@tiagovilasboas)
- 45c75e4: feat(semantic): measure MiniLM centroids on the holdout split (@tiagovilasboas)
- 4da664d: feat(semantic): retrain prototypes on 200 tasks and record holdout delta (P4.10) (@tiagovilasboas)
- a8cd61e: feat(telemetry): PostToolUse usage hook, no-route baseline, export summary (@tiagovilasboas)
- 98f3590: feat(telemetry): add rewrite_honored, smoke tests and billing template (P1.4, P1.7, P3.7) (@tiagovilasboas)
- 5f0a5a0: feat(telemetry): implement log rotation with size and age-based policies (@tiagovilasboas)
- 68cb6cb: feat(telemetry): implement multi-process file locking for JSONL appends (@tiagovilasboas)
- cbebd62: feat(telemetry): real token-cost foundation + honest estimate labeling (@tiagovilasboas)
- dd5e11d: feat(telemetry): real token-cost foundation + honest estimate labeling (@tiagovilasboas)
- 94b0f19: feat(telemetry): record rewrite_emitted evidence with correlation id (@tiagovilasboas)
- f0e31d7: feat(web): SSE push updates + relative URLs fix (@tiagovilasboas)
- c37aa10: feat(web): add local PWA dashboard + dsmon-server (@tiagovilasboas)
- b77925a: feat(web): merge hero design into dashboard — gear tier cards, savings stat, SSE indicator (@tiagovilasboas)
- 221c53c: feat: heuristic upshift for subagent failures and retries (@tiagovilasboas)
- 1e13fd5: feat: infer honored rewrites and optional Graphify command fetcher (@tiagovilasboas)
- 09e9817: feat: integrate serve into downshift as a subcommand (@tiagovilasboas)
Bug fixes
- c2020ab: fix(adapters): session-gated Antigravity, KiroCrew allowlist, family-path holds, dead code (@tiagovilasboas)
- 4966be6: fix(audit): financial math, FilterByDays, agents privacy (@tiagovilasboas)
- aa161a8: fix(classifier): match add-member prompts with modifiers before the noun (#17) (@tiagovilasboas)
- 0b13d9b: fix(dsmon): add launchd setup script for persistent server (@tiagovilasboas)
- afc799e: fix(dsmon): show all harnesses active today, not just the last one (@tiagovilasboas)
- 77b13c9: fix(policy): do not apply an uncertain upshift (@tiagovilasboas)
- dfe7bbf: fix(release): stamp the real version vars and add a version command (#22) (@tiagovilasboas)
- 9126041: fix(serve): drop the CORS wildcard and reject non-local Host/Origin (#23) (@tiagovilasboas)
Other
- 831c66b: chore(ci): run LangGraph, observer and lifecycle tests; ignore venv and dsmon binary (@tiagovilasboas)
- f507e61: chore(gitignore): ignore dsmon-hook build artifact (@tiagovilasboas)
- 3436b4b: chore(gitignore): ignore dsmon-server build artifact (@tiagovilasboas)
- 829f06c: docs(core): clarify selectSessionTarget fallback semantics for blocked downshifts (@tiagovilasboas)
- 89b7bbe: docs(kirocrew): document policy-mode adapter + setup; scope context-trim hint to small tier (@tiagovilasboas)
- 5a849e5: docs(langgraph): cross-link to full LangChain/LangGraph explainer in harness-core (@tiagovilasboas)
- a5bd4c8: docs(pt): enrich Portuguese documentation index with clear technical prose (@tiagovilasboas)
- dc90076: docs(pt): modernize and enrich entire Portuguese documentation suite (01-09) (@tiagovilasboas)
- b1a6833: docs(pt): product-first index, mixed-tone domain pages (@tiagovilasboas)
- 4227b13: docs(readme): business-first rewrite (@tiagovilasboas)
- 1bc6b16: docs(readme): deterministic switch deep-dive, financial impact model, gaps roadmap (@tiagovilasboas)
- f2dff90: docs(readme): document telemetry evidence limits and Decision Intelligence shadow mode (@tiagovilasboas)
- d4403d6: docs(readme): update benchmark metrics to 108-task dataset (@tiagovilasboas)
- 15ce76b: docs(seo): bridge phrase + keyword-rich intro for agent-harness discovery (@tiagovilasboas)
- 2ee74c3: merge: reconcile pre-rebase remote with rebased local (local is superset) (@tiagovilasboas)
- 2bef2a3: test(benchmark): add an evaluation-only fresh split and guard it against tuning (#25) (@tiagovilasboas)
- de2215e: test(benchmark): update dataset counts to 108-task expanded set (@tiagovilasboas)
- 9b65526: test(semantic): unit tests and seed regression for MiniLM boost (@tiagovilasboas)
Install (macOS / Linux):
curl -fsSL https://raw.githubusercontent.com/tiagovilasboas/harness-downshift/main/install.sh | shInstall (Go toolchain):
go install github.com/tiagovilasboas/harness-downshift/cmd/downshift@v0.1.0-beta.3Verify checksum:
sha256sum -c checksums.txtLicence: Business Source License 1.1 — free for non-comm...
v0.1.0-beta.2
harness-downshift v0.1.0-beta.2
Harness-native subagent model router for Claude Code, Cursor, Codex, Grok, and OpenRouter.
Routes each subagent to the right-sized model by task complexity — no LLM in the routing loop.
Changelog
New features
- e3d3720: feat(benchmark+telemetry): tier accuracy KPI, cost-per-unit flag, privacy docs, tests (@tiagovilasboas)
- acb915b: feat(catalog): add IsExplicitOnly + gpt-6-astra explicit_only entry (@tiagovilasboas)
- 6de8dce: feat(catalog): route subagents by family and effort (Option A) (@tiagovilasboas)
- f4a90a2: feat(cmd): show Intent field in 'downshift try' output (@tiagovilasboas)
- b252ba4: feat(core): add EscalationIntent — named task intent above complexity (@tiagovilasboas)
- 8bea71c: feat(core): fall back to the smallest catalog model when a downgrade cannot apply (@tiagovilasboas)
- 8f2d824: feat(core): route only model ids present in the user session (@tiagovilasboas)
- 1a459a9: feat(downshift): add Antigravity adapter (@tiagovilasboas)
- 7336d24: feat(downshift): catalog GPT-6 routing tiers (@tiagovilasboas)
- 8d9f7cd: feat(downshift): track Codex routing by session (@tiagovilasboas)
- 4b07434: feat(loop): add harness-agnostic feedback workflow (@tiagovilasboas)
- ea986a2: feat(routingv2): add capability router orchestrating full v2 pipeline (@tiagovilasboas)
- c225ec5: feat(routingv2): add deterministic safety rules for minimum tier floor (@tiagovilasboas)
- 04953ac: feat(routingv2): add domain types and interfaces for capability router v2 (@tiagovilasboas)
- bdea4d9: feat(routingv2): add downshift train and benchmark --compare commands (@tiagovilasboas)
- 2829d2d: feat(routingv2): add feature extractor with 13 lexical and structural signals (@tiagovilasboas)
- 19da096: feat(routingv2): add offline training, event collection, and metrics (@tiagovilasboas)
- 708269c: feat(routingv2): add risk-aware policy and model matcher (@tiagovilasboas)
- 7ed6bf3: feat(routingv2): add softmax classifier with embedded weights and risk-weighted loss (@tiagovilasboas)
- a0168cf: feat(telemetry+benchmark): local event log, downshift stats, downshift benchmark (@tiagovilasboas)
- 144a713: feat(training): support complexity labels and default required tier on success (HRN-06) (@tiagovilasboas)
Bug fixes
- 9a528d2: fix(antigravity): extract prompt from subagents array and add unit tests (@tiagovilasboas)
- c3f4437: fix(catalog): add missing EffortFor godoc comment (@tiagovilasboas)
- d154a77: fix(catalog): route Codex frontier tasks to Astra (@tiagovilasboas)
- eb1c943: fix(codex): emit supported hook rewrite envelope (@tiagovilasboas)
- 8ad6470: fix(codex): match namespaced subagent spawns (@tiagovilasboas)
- 2d15cff: fix(docs): cache-bust architecture SVG link (@tiagovilasboas)
- 2178caf: fix(docs): fix architecture SVG — text overflow, add telemetry and benchmark packages (@tiagovilasboas)
- 78abf8e: fix(hooks): harden catalog and hook execution (@tiagovilasboas)
- 9a1e274: fix(install): drop GitHub API from installer; guard claude-haiku-4 id (#4) (@tiagovilasboas)
- 7d01ce2: fix(models): filter section-comment entries from 'models list' output (@tiagovilasboas)
- 48feaf2: fix(routing): reserve Astra for explicit escalation (@tiagovilasboas)
- 91082b9: fix: add f.Sync() to AppendTo, document multi-process limitation, correct README accuracy (70.0%), soften safety property claim (@tiagovilasboas)
- 7445580: fix: installer prerelease fallback, official catalog prices, sourced README claims (#1) (@tiagovilasboas)
Refactors
- a153bdc: refactor(adapters): use centralized capabilities and PreserveExplicit guard (@tiagovilasboas)
- ffd7d79: refactor(catalog): extract merge and validation into catalog/policy.go (@tiagovilasboas)
- ecb603b: refactor(catalog): validate merged routing policies (@tiagovilasboas)
- 8d100f0: refactor(cmd): runHookAdapter accepts io.Reader instead of hardcoding os.Stdin (@tiagovilasboas)
- f596088: refactor(core): centralize HarnessCapabilities table; add ShouldPreserveExplicitModel (@tiagovilasboas)
- e567018: refactor(core): extract classifier signals into signals.go; add signals_test.go (@tiagovilasboas)
- 828e8de: refactor(core): replace local toLower/contains with strings stdlib in escalation.go (@tiagovilasboas)
- 9f23340: refactor(routing): centralize harness capabilities (@tiagovilasboas)
Other
- 451dad7: Add personal sponsor link (@tiagovilasboas)
- 9e25d22: Harden harness routing and define feedback loop gates (@tiagovilasboas)
- 6716616: ci: pin actions by full SHA and set read-only token permissions (#5) (@tiagovilasboas)
- fa35b9c: docs(agents,contributing,refactor): sync architecture, escalation.go, catalog confusion (@tiagovilasboas)
- 0820006: docs(codex): explain hook trust requirement (@tiagovilasboas)
- 5cd804b: docs(contributing): update layout, catalog instructions, licence, contributor assignment (@tiagovilasboas)
- bc10981: docs(install): add PATH note for go install users; improve install.sh PATH warning (@tiagovilasboas)
- 8de30ff: docs(llms): fix license description; add EscalationIntent, explicit_only, family to Key Concepts (@tiagovilasboas)
- b88a781: docs(next): update coverage table to current values; confirm refactor complete (@tiagovilasboas)
- 83766db: docs(readme): add Intent line to try example; fix explicit_only explanation (@tiagovilasboas)
- f38b459: docs(readme): add Quickstart section and Troubleshooting section (@tiagovilasboas)
- 6a0a3b4: docs(readme): add author note — the pain behind the project (@tiagovilasboas)
- 5b9bbb0: docs(readme): add beta banner and honest status section (@tiagovilasboas)
- f42489b: docs(readme): show DOWNSHIFT verdict in how-it-works demo (#2) (@tiagovilasboas)
- 07fd3e8: docs(schema): update catalog.sample.json — add family/routing fields, version 2, multi-harness examples (@tiagovilasboas)
- b3db266: docs(svg): fix gpt-5.3-codex→gpt-5.6-sol in hero; add escalation + models to architecture (@tiagovilasboas)
- fdab590: merge: resolve conflict with origin/main updating catalog (@tiagovilasboas)
- 9daab61: test(adapters): add sibling-field preservation regression tests (@tiagovilasboas)
- 5641256: test(catalog): cover load warning path, EffortFor method, EffortValue edge cases (@tiagovilasboas)
- 18f072f: test(cmd): add package-level tests for runTry and runModels (@tiagovilasboas)
- 928bca6: test(cmd): add runHookAdapter tests for all three harnesses; coverage 47% → 61% (@tiagovilasboas)
- e565813: test(core): cover Tier.String/Effort.String branches and ShouldPreserveExplicitModel paths (@tiagovilasboas)
- 1583ab7: test(core): cover low-traffic paths — raise coverage from 81% to 92% (@tiagovilasboas)
- 650ad4e: test(models): cover catalogSource user-override path (@tiagovilasboas)
Install (macOS / Linux):
curl -fsSL https://raw.githubusercontent.com/tiagovilasboas/harness-downshift/main/install.sh | shInstall (Go toolchain):
go install github.com/tiagovilasboas/harness-downshift/cmd/downshift@v0.1.0-beta.2Verify checksum:
sha256sum -c checksums.txtLicence: Business Source License 1.1 — free for non-commercial use.
Commercial use requires a written licence from Tiago de Carvalho Vilas Boas.
See LICENSE.
v0.1.0-beta.1
harness-downshift v0.1.0-beta.1
Harness-native subagent model router for Claude Code, Cursor, Codex, Grok, and OpenRouter.
Routes each subagent to the right-sized model by task complexity — no LLM in the routing loop.
Changelog
New features
- 9f7d961: feat(adapters): wire catalog.Resolver into all adapters; drop hardcoded model IDs (Tiago Vilas Boas tcarvalhovb@gmail.com)
- cfb13e2: feat(catalog): add Grok entries for cursor and claude-code harnesses (Tiago Vilas Boas tcarvalhovb@gmail.com)
- 4b35da6: feat(catalog): create catalog package with embedded JSON and Resolver interface (Tiago Vilas Boas tcarvalhovb@gmail.com)
- a39533f: feat(catalog): normalise OpenRouter 'provider/model-id' format in LookupByID (Tiago Vilas Boas tcarvalhovb@gmail.com)
- 1cd87b3: feat(catalog): version-agnostic model matching via family prefix (Tiago Vilas Boas tcarvalhovb@gmail.com)
- 46f6878: feat(cmd): add 'downshift models check' subcommand (Tiago Vilas Boas tcarvalhovb@gmail.com)
- d841cdf: feat(cmd): add 'downshift models list' subcommand (Tiago Vilas Boas tcarvalhovb@gmail.com)
- 3d6e388: feat(cmd): add 'downshift models pull' subcommand (Tiago Vilas Boas tcarvalhovb@gmail.com)
- 3935e5c: feat(codex): add Codex multi_agent_v2 subagent model + reasoning router (Tiago Vilas Boas tcarvalhovb@gmail.com)
- 401da0b: feat(core): add Effort type — harness-agnostic reasoning intensity (Tiago Vilas Boas tcarvalhovb@gmail.com)
- aa2c40e: feat(core): add Resolver to Route(); remove hardcoded Catalog from core (Tiago Vilas Boas tcarvalhovb@gmail.com)
- f33e2f8: feat(cursor): add Cursor preToolUse adapter — subagent model routing (Tiago Vilas Boas tcarvalhovb@gmail.com)
- c9af3ff: feat(grok): support Grok CLI via config, document why not a hook (Tiago Vilas Boas tcarvalhovb@gmail.com)
- 7936ce3: feat(release): add goreleaser config, CI release job, and install.sh (Tiago Vilas Boas tcarvalhovb@gmail.com)
- fecb7ae: feat: harness-downshift — right-sized models for every subagent task (Tiago Vilas Boas tcarvalhovb@gmail.com)
Bug fixes
- 4cd76ff: fix(classifier) + test(core): fix re-architect suffix and write tests plural; add edge-case suite (Tiago Vilas Boas tcarvalhovb@gmail.com)
- 1f0398a: fix(gitignore): allow internal/catalog/catalog.json to be committed (Tiago Vilas Boas tcarvalhovb@gmail.com)
- d9aada0: fix: stop .gitignore from excluding cmd/downshift source (Tiago Vilas Boas tcarvalhovb@gmail.com)
Refactors
- 7f35d2c: refactor(adapters): extract shared stringField helper into hookutil (Tiago Vilas Boas tcarvalhovb@gmail.com)
- 4cd1bbc: refactor(cmd): collapse duplicate hook-runner functions (Tiago Vilas Boas tcarvalhovb@gmail.com)
- fdf1700: refactor(core): decompose Route() into focused helpers (Tiago Vilas Boas tcarvalhovb@gmail.com)
- c11f81e: refactor(core): move Complexity.Tier() to policy — classification should not know about tiers (Tiago Vilas Boas tcarvalhovb@gmail.com)
- 2056237: refactor(models): introduce CatalogReader interface; drop *catalog.Catalog from function signatures (Tiago Vilas Boas tcarvalhovb@gmail.com)
- e9b11ef: refactor(resolver): add EffortFor to Resolver interface; close type assertion leak (Tiago Vilas Boas tcarvalhovb@gmail.com)
Other
- 4cee0f5: docs(img): add social-preview.png for GitHub OG image (Tiago Vilas Boas tcarvalhovb@gmail.com)
- 3e983e8: docs(readme): add badges, architecture diagram, catalog override guide (Tiago Vilas Boas tcarvalhovb@gmail.com)
- 340a14d: docs(svg): redesign hero as 1200x630 OG image with two-panel layout (Tiago Vilas Boas tcarvalhovb@gmail.com)
- e98deb0: docs(svg): update hero with real model IDs + effort column; add architecture diagram (Tiago Vilas Boas tcarvalhovb@gmail.com)
- bce34ee: license: add BSL 1.1 copyright header to all Go source files (Tiago Vilas Boas tcarvalhovb@gmail.com)
- 053ea4f: license: add SPDX-License-Identifier: BUSL-1.1 to all Go source and test files (Tiago Vilas Boas tcarvalhovb@gmail.com)
- 2764625: license: add catalog.sample.json and protect catalog.json from accidental commit (Tiago Vilas Boas tcarvalhovb@gmail.com)
- d68c992: license: clarify Commercial Use definition — open source and study stay free (Tiago Vilas Boas tcarvalhovb@gmail.com)
- 47ce11d: license: replace MIT with Business Source License 1.1 (Tiago Vilas Boas tcarvalhovb@gmail.com)
- 961c8e5: license: strengthen BSL 1.1 with tiered liquidated damages and revenue clause (Tiago Vilas Boas tcarvalhovb@gmail.com)
- bd1f372: test(core): decouple policy tests from hardcoded model ID strings (Tiago Vilas Boas tcarvalhovb@gmail.com)
- 751bd14: test(hookutil): add StringField unit tests (Tiago Vilas Boas tcarvalhovb@gmail.com)
- 603a4f3: test(models): add httptest.Server mock tests for check and pull (Tiago Vilas Boas tcarvalhovb@gmail.com)
Install (macOS / Linux):
curl -fsSL https://raw.githubusercontent.com/tiagovilasboas/harness-downshift/main/install.sh | shInstall (Go toolchain):
go install github.com/tiagovilasboas/harness-downshift/cmd/downshift@v0.1.0-beta.1Verify checksum:
sha256sum -c checksums.txtLicence: Business Source License 1.1 — free for non-commercial use.
Commercial use requires a written licence from Tiago de Carvalho Vilas Boas.
See LICENSE.