Skip to content

v0.28.0 — a daemon you can do without, and a build that is not a change

Choose a tag to compare

@l0kifs l0kifs released this 18 Sep 12:40
· 60 commits to main since this release

docir runs where it used to only nearly run, and stops reporting drift you did not cause.

🐛 The three reported defects

  • A daemon that cannot be started runs the command in process (#15). The daemon keeps the
    model warm and serializes writes; it decides nothing, and every command it answers
    --no-daemon answers too. Inside a read-only agent sandbox the client had nowhere to fall
    back to, so every read ended in a Python traceback. It now falls back with one warning on
    stderr and stdout untouched. Reproducing it turned up the half that mattered more: the MCP
    server built its own executor beside the CLI's, so a CLI-only fix would have left the crash
    exactly where an adopter meets it.
  • A code: glob hashes what the repository tracks, not what it builds (#20). Ignored files
    were fingerprinted, so one compile drifted every src/**-style glob at once in any repository
    that builds beside its sources — bin/, obj/, target/, dist/, build/ — and the
    finding was indistinguishable from a real one. The matcher now reads the repository's own
    .gitignore files, and only those: not .git/info/exclude, not your global excludes, both
    per-machine. It was live here too, through benchmarks/.coverage.
  • docir self upgrade brings the store's .gitignore up to the running build (#21).
    release-check.json was written into every store and ignored nowhere, and the file itself was
    written once by docir init and never again — so feedback/ never reached a store created
    before it. Entries are appended under a comment naming the version, never rewritten over.

🔧 Also fixed

  • docir doctor and docir daemon status survive a home with nowhere to listen — the two
    commands you run to diagnose the first failure.
  • The embedding model moved to ~/.docir/models. A temp directory is where the system puts what
    it may delete, so the 64 MB download was re-paid on every sweep.
  • A cached peer reader expires when that peer moves, so a repaired peer stops being skipped.
  • A daemon that loaded a different docs-schema.yaml is replaced.
  • docir query --code '.github/workflows/**' finds its documents.
  • docir self upgrade counts the corpus instead of reciting all 56 findings.

📝 The writing skill says a document is the current state

Agents append, because --append-section destroys nothing and so never refuses — and a
document becomes a log of its own life. The body grows against its type's ceiling, and the
superseded half keeps being retrieved, because the index has no idea a later paragraph
overruled an earlier one. Rule 3: git holds what was true before, so something that changed is
edited rather than answered beside. A date in a heading is the signal. Terminal states are
exempt.

⬆️ Upgrading

  • Expect one code-drifted per pattern whose match set shrank. Read the document and
    docir update <id> --verified. Where the defect was live, that is every governed document,
    and the re-baseline is the fix arriving.
  • Until everyone upgrades, code-drifted is a per-build opinion; nothing refuses anything.
  • The model is re-downloaded once. It is the last one a sweep can force.
  • docir self upgrade tops up the store's .gitignore and names what it added.

🔗 Full Changelog

See CHANGELOG.md