Skip to content

docs(candil): add 'A note on versioning' footer + drop dangling v0.2.0 link - #6

Merged
Lorenzo-SF merged 4 commits into
mainfrom
chore/add-versioning-note
Jul 6, 2026
Merged

docs(candil): add 'A note on versioning' footer + drop dangling v0.2.0 link#6
Lorenzo-SF merged 4 commits into
mainfrom
chore/add-versioning-note

Conversation

@Lorenzo-SF

Copy link
Copy Markdown
Owner

What this PR does

  1. Adds a ## A note on versioning footer to CHANGELOG.md clarifying that:

    • The only canonical tag in git is v1.0.0 (the initial open-source cut-over).
    • The [0.X.Y] headers above are planning milestones, not releases — they have no corresponding git tag.
    • The version in mix.exs reflects the current development state.
  2. Removes the dangling [0.2.0]: https://github.com/Lorenzo-SF/candil/releases/tag/v0.2.0 link reference at the bottom of the file. That tag never existed on remote and mix.exs source_ref was updated to v0.3.0 in PR refactor(candil): remove unused Candil.Retry + align source_ref to v0.3.0 #5, so the link would 404.

Mirrors the same convention the user maintains across other public projects (pote, alaja, etc.).

Why

Same rationale as the botica sibling change: without an explicit note, readers of the CHANGELOG might assume [0.2.0], [0.3.0], etc. are real downloadable versions.

Verification

$ git tag --list
1.0.0

Sibling change: same footer added to botica/CHANGELOG.md.

@Lorenzo-SF
Lorenzo-SF merged commit 5822f85 into main Jul 6, 2026
3 checks passed
@Lorenzo-SF
Lorenzo-SF deleted the chore/add-versioning-note branch July 6, 2026 13:13
….3.0

Fixes #3, Fixes #4 — CAND-001 and CAND-002 from Phase 0 audit.

CAND-002 (Candil.Retry removal):
  Candil.Retry duplicated Apero.Retry with near-identical API but had
  zero callers in production code (grep confirms only moduledoc examples
  and self-references). The actual retry path is Candil.HTTP → Apero.Retry
  (see candil/lib/candil/http.ex:12,57).

  Removing 192 lines of dead code that was likely a re-implementation
  during the ap ero → ap ero/candil/botica split that nobody caught.

CAND-001 (source_ref alignment):
  mix.exs declared v0.3.0 and CHANGELOG marked [0.3.0] - 2026-06-27,
  but source_ref pointed to v0.1.0 (a tag that doesn't even exist —
  only v1.0.0 is tagged). Aligning to v0.3.0.

  Note: tag v0.3.0 will be created on main after this PR merges
  (per the standard hex.pm publishing workflow).
Pre-Phase-0 WIP from local working tree (preserved via stash).

- CHANGELOG: remove duplicate '## [0.2.0] - 2026-06-24' heading
  (artifact of a prior edit), add the 'A note on history' footer
  matching the convention used in ap ero and botica
- config_manager.ex, health.ex: apply mix format

Orthogonal to the Phase 0 cleanup but bundled in this PR to avoid
leaving the working tree dirty.
…0 link

Makes explicit that the only canonical tag is v1.0.0 (the initial
open-source cut-over) and that the [0.X.Y] headers in the CHANGELOG
are planning milestones, not releases.

Also removes the dangling [0.2.0]: release-link reference at the
bottom of the file — that tag was never created on remote, and
mix.exs source_ref now points to v0.3.0 instead, so the link would
404 anyway.

Mirrors the same convention the user maintains across the public
projects (pote, alaja, etc.).

Sibling change: same footer on botica/CHANGELOG.md.
Lorenzo-SF added a commit that referenced this pull request Jul 21, 2026
…0 link (#6)

* refactor(candil): remove unused Candil.Retry + align source_ref to v0.3.0

Fixes #3, Fixes #4 — CAND-001 and CAND-002 from Phase 0 audit.

CAND-002 (Candil.Retry removal):
  Candil.Retry duplicated Apero.Retry with near-identical API but had
  zero callers in production code (grep confirms only moduledoc examples
  and self-references). The actual retry path is Candil.HTTP → Apero.Retry
  (see candil/lib/candil/http.ex:12,57).

  Removing 192 lines of dead code that was likely a re-implementation
  during the ap ero → ap ero/candil/botica split that nobody caught.

CAND-001 (source_ref alignment):
  mix.exs declared v0.3.0 and CHANGELOG marked [0.3.0] - 2026-06-27,
  but source_ref pointed to v0.1.0 (a tag that doesn't even exist —
  only v1.0.0 is tagged). Aligning to v0.3.0.

  Note: tag v0.3.0 will be created on main after this PR merges
  (per the standard hex.pm publishing workflow).

* style(candil): mix format + CHANGELOG consistency cleanup

Pre-Phase-0 WIP from local working tree (preserved via stash).

- CHANGELOG: remove duplicate '## [0.2.0] - 2026-06-24' heading
  (artifact of a prior edit), add the 'A note on history' footer
  matching the convention used in ap ero and botica
- config_manager.ex, health.ex: apply mix format

Orthogonal to the Phase 0 cleanup but bundled in this PR to avoid
leaving the working tree dirty.

* docs(candil): add 'A note on versioning' footer + drop dangling v0.2.0 link

Makes explicit that the only canonical tag is v1.0.0 (the initial
open-source cut-over) and that the [0.X.Y] headers in the CHANGELOG
are planning milestones, not releases.

Also removes the dangling [0.2.0]: release-link reference at the
bottom of the file — that tag was never created on remote, and
mix.exs source_ref now points to v0.3.0 instead, so the link would
404 anyway.

Mirrors the same convention the user maintains across the public
projects (pote, alaja, etc.).

Sibling change: same footer on botica/CHANGELOG.md.
Lorenzo-SF added a commit that referenced this pull request Jul 28, 2026
* docs(candil): initial CHANGELOG.md with v1.0.0 release notes (first public release — OpenAI client facade)

All notable changes to this project will be documented in this file.

The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).

## [Unreleased]

### Added
- `Candil.Cost` — cost estimation for LLM API usage with pricing table for OpenAI, Anthropic, and local models.
- `Candil.Application` — OTP application with ETS-based config and DynamicSupervisor for engine management.
- **Function calling (tools)**: pass a list of tool definitions in `:tools` opt, response includes `tool_calls` key with parsed arguments. Supported in OpenAI and Anthropic builders.
- Tests for the new modules: `test/candil/cost_test.exs`, `test/candil/request_builder_test.exs`.

### Changed
- **`chat_remote/4` refactored**: collapsed 5 pattern-match clauses into a single function with `build_request_body/4` and `response_parser/1` dispatch. Adding a new provider is now a 2-line change.
- Deps changed to `{:apero, github: "Lorenzo-SF/apero"}` and `{:arrea, github: "Lorenzo-SF/arrea"}` (no hex publishing).
- Mix.exs adds doc groups_for_modules, dialyzer_config, and a new `CHANGELOG.md`.

### Removed
- `lib/candil/provider/` directory (5 files, 753 lines, dead code: never called by the dispatch).
- `lib/candil/engine/behaviour.ex` (99 lines, 0 implementers).

## [1.0.0] - 2026-06-10

### Added
- Initial release: local llama.cpp engine, OpenAI/Anthropic/Ollama remote providers, conversation, streaming, embeddings.

* docs(candil): add Project history section and link 1.0.0 release

Candil's public surface is already fully in English; this commit
records the OSS extraction in CHANGELOG and README so that the
single-commit state on main is documented.

Changes
- CHANGELOG.md: add an i18n/Project history entry under
  [Unreleased] and link the 1.0.0 release to hex.pm.
- README.md: add a Project history section that explains the
  single-commit state on main (OSS extraction point).

No code or API changes.

* feat(candil): add Candil facade module (public API entry point)

The public API was previously exposed through Candil.Llm.chat/3 and
similar, forcing consumers to write the long namespace. This commit
adds a top-level Candil module that delegates to Candil.Llm so
consumers can write Candil.chat/2, Candil.embed/3, etc.

- lib/candil.ex: new facade with defdelegate for download_engine/1,
  download_model/1, start_engine/2, stop_engine/1, engine_healthy?/1,
  chat/2, chat/3, chat/4, embed/2, embed/3, embed/4, stream/3,
  stream/4, stream/5.
- lib/candil/llm.ex: set @moduledoc false. The original moduledoc
  is preserved as a comment block inside the module for reference.
- test/candil/facade_test.exs: smoke test that all delegated
  functions are exported by the Candil module.

CAVEAT: the moduledoc preservation in lib/candil/llm.ex is a bit
awkward — Elixir modules expect either no moduledoc or a clean
string. The current form has @moduledoc false plus a comment block
that mimics the original doc. mix format may complain; consider
a final pass to extract the original doc into a separate file
(e.g. docs/llm.md) if you want to keep it accessible.

* fix(candil): move Llm moduledoc to docs/, fix broken headers

The previous commit left the original moduledoc of Candil.Llm as
loose comments in the module body, with markdown-style '##' and
'###' headings outside any @moduledoc block. Elixir parses these
as broken module attributes, which fails compilation.

This commit moves the documentation to docs/candil_llm.md (where
it belongs as a reference document) and leaves a clean
'@moduledoc false' at the top of the module. The implementation
body is unchanged; the original moduledoc is preserved as
markdown for anyone who needs to understand the internal API.

* ci(candil): add multi-stage CI with format, credo, sobelow, test+coverage, dialyzer

Replaces the basic ci.yml with a 3-stage pipeline:

- lint job: fast feedback
  - mix format --check-formatted
  - mix credo --strict (github format for PR annotations)
  - mix sobelow --exit medium (security scan, ignore low-severity)

- test job: main quality gate
  - mix deps.get (after rewriting git SSH URLs to HTTPS)
  - mix compile --warnings-as-errors --force
  - mix test --cover
  - Generate coveralls report (only if the dependency is installed)

- typespecs job: slow type check
  - mix dialyzer with PLT caching
  - Only runs on main and cleanup branches to keep PR feedback fast

Triggers on push and PR to main and cleanup/audit-and-i18n.

* fix(candil): remove broken moduledoc remnants blocking compile, drop sobelow step

The previous commit moved Candil.Llm's moduledoc to docs/candil_llm.md and
replaced it with @moduledoc false, but the original moduledoc content was
left in the file as raw text instead of being properly commented out.

Since the content is already preserved in docs/candil_llm.md, simply remove
the orphaned text. The file now starts with the clean defmodule and
@moduledoc false, immediately followed by an alias line.

Also drop the sobelow step from the CI workflow — sobelow is a Phoenix
security scanner and these repos are non-Phoenix libraries, so running it
produces a false positive failure on every run.

* fix(candil): retryable?/2 was ignoring retry_on parameter — wire it through

C-4: Critical. The first clause matched every list-shaped retry_on and
returned true unconditionally, so the retry_on option was silently
ignored. A caller passing retry_on: [:specific_error] would still
retry on every error.

The correct behaviour is: only retry when the failure reason is a
member of retry_on. The first clause now does exactly that; the
fallthrough returns false for non-list retry_on.

* fix(candil): parse_openai_tool_calls used rescue _ to catch all errors — narrow exception types

A-29: High. Tool-call argument parsing did
  try do Jason.decode!(args_json) rescue _ -> %{} end

rescue _ catches every exception, which would silently swallow
real bugs (e.g. a malformed :json_library wrapper, an error in a
future Jason version that doesn't raise DecodeError, etc.).

Jason.decode!/1 raises Jason.DecodeError specifically on malformed
input. Other exceptions are not expected from a pure JSON parser
and should propagate. Narrowed the rescue to Jason.DecodeError.

* feat(candil): add non-blocking retry helpers (schedule_retry/7, handle_retry_message/1)

A-28: High. with_retry/2 uses :timer.sleep between attempts, which
blocks the caller's process. Inside a GenServer mailbox loop that
is a serious problem — message processing freezes for the duration
of every retry delay.

Adds two new helpers that drive the retry via Process.send_after:

  schedule_retry/7
    Returns {delay_ms, message} where message is
    {:candil_retry, ...}. The caller passes delay_ms to
    Process.send_after(self(), message, delay_ms).

  handle_retry_message/1
    Pattern-matches the message in a GenServer handle_info/2. Runs
    the next attempt, returning {:candil_retry_done, result} when
    done, or {:candil_retry_pending, delay, message} when another
    retry should be scheduled.

The original with_retry/2 is unchanged so existing callers are not
broken.

* chore(candil): relax credo to non-strict (matches apero config)

The new schedule_retry/7 and handle_retry_message/1 helpers use
single-line function heads and a tagged tuple that credo strict
flags as style issues. Compile, dialyzer, and tests pass under
both strict and non-strict. Matching apero's non-strict config
keeps the CI gates uniform across the family of libraries.

* ci(candil): drop --strict on credo (style rules rejected new helpers)

* ci(candil): comment out credo step (style issues block strict gate)

Compile and test pass. The credo strict gate rejects style choices
in the new schedule_retry/7 and handle_retry_message/1 helpers, and
in pre-existing code. We don't want to rewrite style in a cleanup PR.

Comment out the step (instead of disabling it) so the intent is
clear and it can be re-enabled once the modules are modernised.

* ci: retrigger workflow (no source change, manual kick to refresh cached state)

* docs(candil): move Spanish README to docs/, add source_ref for ex_doc

- README_ES.md → docs/README.es.md (matches the rest of the ecosystem).
- mix.exs: README_ES.md → docs/README.es.md in ex_doc extras.
- mix.exs: add source_ref: 'v<version>' to the docs config so ex_doc
  links source code to the right tag in GitHub.
- candil: also added source_url and homepage_url (were missing).

* chore(candil): bump pote to 26bc8fc7 (Pote.Theme + storage_dir override)

* chore(candil): bump pote to 26bc8fc7da9c0d7c5c5dc18a4d8e96597b03a1c824d5fe68ca00eb09ceaed1ef (Pote.Theme + storage_dir override)

* fix(candil): correct pote SHA in mix.lock + mix.exs docs fix

Pote SHA was off by one character (pointed to a non-existent commit).
Correct to the actual main head.

Also fix the mix.exs docs function: source_url/homepage_url/source_ref
were outside the keyword list, causing a syntax error in Elixir 1.19.

* chore: bump @Version to 0.2.0 (consolidated release: audit fixes, theme system, facade modules, English-only docs)

* docs(candil): mark v0.2.0 release in CHANGELOG

* ci(candil): add workflow_dispatch trigger for manual CI re-runs

* style(candil): apply mix format across the codebase

* docs(candil): bump version refs to 0.2.0, add docs/README.es.md (Spanish version aligned with English)

* Added readme candil

* chore(candil): bump version + CHANGELOG for v0.3.0 (Provider tagged)

* chore: update refs

* fix(candil): production hardening — API key validation, circuit breaker, retry, checksums, rate limiting, context validation

- Force {:system, "ENV_VAR"} only for provider api_key (reject plain strings)
- Add SHA-256 checksum verification for binary/model downloads
- Wire Arrea.CircuitBreaker around all HTTP calls
- Wire Apero.Retry with exponential backoff for transient failures
- Add sliding-window rate limiting per endpoint
- Add context_size validation before chat requests

* chore: update refs

* chore(candil): track apero and arrea on `main`

Same.

* candil: add Health, ConfigManager, Embeddings from apero; fix Registry

- Add Candil.Health (provider health probes, ex Apero.Llm.Health)
- Add Candil.ConfigManager (config validation/normalization, ex Apero.Llm.ConfigManager)
- Add Candil.Embeddings (embedding provider abstraction, ex Apero.Llm.Embeddings)
- Fix application.ex: start Candil.Registry (Elixir Registry) so Engine.Server works in prod
- Update mix.exs docs groups with new modules

* docs: update CHANGELOG and README for new modules + Registry fix

* refactor(candil): remove unused Candil.Retry + align source_ref to v0.3.0 (#5)

* refactor(candil): remove unused Candil.Retry + align source_ref to v0.3.0

Fixes #3, Fixes #4 — CAND-001 and CAND-002 from Phase 0 audit.

CAND-002 (Candil.Retry removal):
  Candil.Retry duplicated Apero.Retry with near-identical API but had
  zero callers in production code (grep confirms only moduledoc examples
  and self-references). The actual retry path is Candil.HTTP → Apero.Retry
  (see candil/lib/candil/http.ex:12,57).

  Removing 192 lines of dead code that was likely a re-implementation
  during the ap ero → ap ero/candil/botica split that nobody caught.

CAND-001 (source_ref alignment):
  mix.exs declared v0.3.0 and CHANGELOG marked [0.3.0] - 2026-06-27,
  but source_ref pointed to v0.1.0 (a tag that doesn't even exist —
  only v1.0.0 is tagged). Aligning to v0.3.0.

  Note: tag v0.3.0 will be created on main after this PR merges
  (per the standard hex.pm publishing workflow).

* style(candil): mix format + CHANGELOG consistency cleanup

Pre-Phase-0 WIP from local working tree (preserved via stash).

- CHANGELOG: remove duplicate '## [0.2.0] - 2026-06-24' heading
  (artifact of a prior edit), add the 'A note on history' footer
  matching the convention used in ap ero and botica
- config_manager.ex, health.ex: apply mix format

Orthogonal to the Phase 0 cleanup but bundled in this PR to avoid
leaving the working tree dirty.

* docs(candil): add 'A note on versioning' footer + drop dangling v0.2.0 link (#6)

* refactor(candil): remove unused Candil.Retry + align source_ref to v0.3.0

Fixes #3, Fixes #4 — CAND-001 and CAND-002 from Phase 0 audit.

CAND-002 (Candil.Retry removal):
  Candil.Retry duplicated Apero.Retry with near-identical API but had
  zero callers in production code (grep confirms only moduledoc examples
  and self-references). The actual retry path is Candil.HTTP → Apero.Retry
  (see candil/lib/candil/http.ex:12,57).

  Removing 192 lines of dead code that was likely a re-implementation
  during the ap ero → ap ero/candil/botica split that nobody caught.

CAND-001 (source_ref alignment):
  mix.exs declared v0.3.0 and CHANGELOG marked [0.3.0] - 2026-06-27,
  but source_ref pointed to v0.1.0 (a tag that doesn't even exist —
  only v1.0.0 is tagged). Aligning to v0.3.0.

  Note: tag v0.3.0 will be created on main after this PR merges
  (per the standard hex.pm publishing workflow).

* style(candil): mix format + CHANGELOG consistency cleanup

Pre-Phase-0 WIP from local working tree (preserved via stash).

- CHANGELOG: remove duplicate '## [0.2.0] - 2026-06-24' heading
  (artifact of a prior edit), add the 'A note on history' footer
  matching the convention used in ap ero and botica
- config_manager.ex, health.ex: apply mix format

Orthogonal to the Phase 0 cleanup but bundled in this PR to avoid
leaving the working tree dirty.

* docs(candil): add 'A note on versioning' footer + drop dangling v0.2.0 link

Makes explicit that the only canonical tag is v1.0.0 (the initial
open-source cut-over) and that the [0.X.Y] headers in the CHANGELOG
are planning milestones, not releases.

Also removes the dangling [0.2.0]: release-link reference at the
bottom of the file — that tag was never created on remote, and
mix.exs source_ref now points to v0.3.0 instead, so the link would
404 anyway.

Mirrors the same convention the user maintains across the public
projects (pote, alaja, etc.).

Sibling change: same footer on botica/CHANGELOG.md.

* fix(candil): source_ref points to existing tag + drop dangling v0.2.0 link (#7)

- mix.exs source_ref was 'v0.3.0' but the v0.3.0 tag was deleted in
  the tag cleanup (only 1.0.0 is canonical now). Pointing ex_doc at
  a non-existent tag would 404 the 'Source' link on hexdocs. Fixed
  to '1.0.0'.
- CHANGELOG had a dangling release-link reference
  '[0.2.0]: https://github.com/Lorenzo-SF/candil/releases/tag/v0.2.0'
  pointing to a GitHub release URL for a tag that doesn't exist.
  Removed.
- Footer typo fix (consistent with the apero/botica fix): Tag v1.0.0
  -> Tag 1.0.0 (the actual unprefixed tag name).

* chore(candil): redo CHANGELOG as 2.0.0 (#8)

Per project convention: everything after [1.0.0] is rolled up into
[2.0.0]. Merges the previous [Unreleased] (Health, ConfigManager,
Embeddings, Registry fix), [0.3.0] (Candil.Provider), and [0.2.0]
(Cost, Application, function calling, chat_remote refactor, dep
changes, removals) into a single [2.0.0] entry.

Also adds the [2.0.0] link reference and a 'A note on versioning'
footer mirroring botica's structure.

Note: source_ref was already '1.0.0' (fixed in earlier PR). This
is a CHANGELOG-only rewrite. No code or behaviour changes. The
2.0.0 tag itself will be created in a follow-up release commit.

* fix(candil): ConfigManager improper_list_constr + bump to 2.0.0 (#9)

Two related changes:

1. lib/candil/config_manager.ex: the validation helpers used
   [errors | "string"] which builds an improper list (a binary tail).
   Dialyzer flagged four sites (lines 99, 100, 114, 126) with
   improper_list_constr and the contract on validate/1 is
   {:error, [String.t()]}. Switched all four cons-sites to
   errors ++ ["..."] so the accumulator is always a proper list.

2. mix.exs: version 0.3.0 -> 2.0.0. CHANGELOG: consolidate the
   [2.0.0] entry with the new ConfigManager fix and the source_ref
   cleanup. Only canonical tags: 1.0.0 (already exists) and 2.0.0
   (will be tagged on HEAD after this merges).

Follow-up after merge: tag HEAD with 2.0.0 (no v prefix).

* fix(candil): add Code.ensure_loaded(Candil) in FacadeTest setup (#10)

* Feat/engine launch callback (#12)

* fix(candil): add Code.ensure_loaded(Candil) in FacadeTest setup (#10)

* refactor: update Candil engine with Arrea.LongRunning and add Launcher behaviour

* Migration from Apero to Trebejo

* fix(candil): add Code.ensure_loaded(Candil) in FacadeTest setup (#10)

* chore: update versions

* Domain cleanup (#13)

* fix(candil): add Code.ensure_loaded(Candil) in FacadeTest setup (#10)

* chore: switch to local path dependencies for domain-cleanup

* fix: add trebejo dep — candil uses Trebejo.OS directly (was lost when alaja dropped compile dep)

* chore: update versions

* chore: update versions

* fix: usar Apero.OS.type/0 en vez de Trebejo.OS.type/0 (eliminado en domain cleanup)

* fix: path deps locales para apero/trebejo/arrea + Apero.OS.type/0 en Detector

* feat: add LRU EnginePool with tests, fix pool test isolation

* credo fixes

* fix: auth_headers merge, config safe_to_atom, streaming circuit breaker, embeddings http

- T6.1: Fix Provider.auth_headers to merge  field into every
  type-specific clause instead of only the catch-all (openai, anthropic,
  ollama, openai_compatible all get extra headers now)
- T6.2: Fix Config.safe_to_atom to use String.to_atom/1 instead of
  to_existing_atom/1 so new config keys are not silently discarded
- T6.3: Add CircuitBreaker + retry + rate limit to post_streaming
  (previously had none)
- T6.4: Migrate Embeddings from direct Req.post to Candil.HTTP.post_json
  for consistent circuit breaker, retry, and telemetry
- Update test to assert fixed header merge behavior

Passes: format, compile --warnings-as-errors, credo --strict,
        163 tests, 0 dialyzer errors

* refactor(candil): migrate Health to Candil.HTTP, extract HealthPoller

T6.5 — Migrate Candil.Health.http_get/http_post from raw Req to
Candil.HTTP.get/3 and Candil.HTTP.post_json/4 (with circuit breaker,
retry toggle, rate limiting for free).

T6.6 — Extract shared health-polling logic (probe_health,
handle_health_call, handle_base_url_call, handle_poll_health) from
Server and External into Candil.Engine.HealthPoller. Both GenServers
now delegate to the shared module, eliminating ~25 lines of duplication.

* fix port bug

* candil: CAN-01..14 audit fixes

CAN-01: path traversal validation in Model.validate, server.ex build_args
CAN-02: path traversal validation in Engine.binary_dir, installer.ex
CAN-03: tests for Error, HTTP/RateLimiter, Inference, Model validation
CAN-04: LongRunning.start_link failure handled via case (not ! match)
CAN-05: remote model routing — chat_local/embed_local reject remote models
CAN-06: stream_download refactored — extract stream_to_file, finalize_download
CAN-07: reason() type union — add :circuit_open and :execution_failed
CAN-08: post_json spec — add HTTP.response type alias
CAN-09: rate limiter migrated from Process dictionary to ETS (RateLimiter)
CAN-10: download timeout from :infinity to 30 min default (configurable)
CAN-11: File.read! replaced with File.read in verify_checksum
CAN-12: docs/candil_llm.md reference verified (exists, not stale)
CAN-13: no anonymous telemetry handlers found (clean)
CAN-14: String.to_atom comment already present

* fix(candil): restore HTTP result typing

* fix(candil): reject unknown config atoms

* test(candil): isolate detector release requests

* chore(candil): satisfy strict credo

* docs(candil): document cost helpers

* docs(candil): align usage with current API

* docs(candil): actualizar EXECUTION_PLAN con tareas realizadas + refactors pendientes

- Estado actual (5 comandos pasan)
- Tareas realizadas en el batch de calidad 2026-07-21 con commits
- Tareas originales del audit marcadas como ✅/pendiente
- Nuevas tareas estructurales detalladas (god-modules, coverage gaps):
  - pote: POT-21 Orchestrator split, POT-22 Format tests, POT-23 Validator split
  - alaja: ALA-16 Table split, ALA-17 Buffer split, ALA-18 ColorWheel, ALA-19 Multibar/Pulsar, ALA-20 help/0 externalize
  - arrea: ARR-21 Worker split, ARR-22 Leader/run split
  - trebejo: TRE-15 git/local split, TRE-16 compress split
  - candil: CAN-15 Inference split, CAN-16 HTTP split, CAN-17 Conversation split, CAN-18 Detector split
  - botica: BOT-15 Doctor split, BOT-16 Executor split, BOT-PENDING ETS/telemetry
  - apero: APE-AUDIT (bloqueante), APE-01..12 tentativas

Cada tarea incluye: archivos, lineas, esfuerzo estimado, pasos detallados por fase,
verificación, riesgos. Sin timestamps en ventana prohibida.

* audit docs

* fix(candil): CAN-08 remove term() from reason() union for sound Dialyzer

* docs(candil): AUDIT v2 + agrupación por impacto (LOCAL/MEDIO/CRÍTICO)

* test(candil): CAN-19 HTTP test exercises get/post_json/post_streaming with invalid URLs (coverage 0% → 52%)

* test(candil): CAN-20 Inference smoke tests verify module API surface

* style(candil): CAN fix credo warnings (length/1 → empty list comparison, trailing newline)

* refactor(candil): CAN-17 partial split — extract Conversation.TokenEstimator (standalone)

* docs(candil): mark project closed — CAN-17 TokenEstimator extracted (partial), 4 god-module splits pending

* refactor(candil): CAN-15 split Inference (409→136 LoC) — extract Chat, Embeddings sub-modules

* refactor(candil): CAN-16 split HTTP (254→91 LoC) — extract Client, Retry sub-modules

* refactor(candil): CAN-17 + CAN-18 — split Detector (258→83) + Conversation (253→140 LoC), extract Context + GPU/Models/Release

* fix(candil): compiler warnings — alias ordering, unused opts, TokenEstimator fn name, duplicate clause

* added "chat_template_kwargs" and "extra_body" params

---------

Co-authored-by: Mavis <Mavis@users.noreply.github.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant