Skip to content

v0.45.0

Choose a tag to compare

@github-actions github-actions released this 04 Oct 21:08
· 1960 commits to master since this release

This release makes context.db the one database Magic Context keeps its data in, and lowers what each turn costs: reasoning from older turns now leaves the request on every provider, emergency drops skip passes that would save almost nothing, and a turn writes far less to disk. A pass that fails partway no longer sends the conversation without its reductions. Agents can recover a dropped item by its tag, and Pi's status displays stop showing raw estimates as usage. On OpenCode 2 it now needs 2.0.22 or newer, the dreamer's curate task works there again, and its retrospective task runs there for the first time. It also carries a long list of fixes across caching, compression, Pi, the CLI, config handling and search.

Upgrading

  • The database moves from schema v91 to v94. Three migrations run the first time the new version opens context.db: v92 records the database's single-store state and adds boundary columns to compartments, v93 tracks a history revision per session, and v94 stores each session's last good request in pieces instead of one record that grew on every turn. On a 7.5 GB database the first start took about 6 to 45 seconds longer than usual, almost all of it v94, and later starts are normal. The migration now runs on a separate thread, so OpenCode keeps answering while it works, including the /health checks that supervisors such as OpenChamber use.
  • Quit every OpenCode and Pi process before starting the new version. This includes OpenCode 1 and OpenCode 2 servers, Pi and OMP processes, and instances in other projects, because they all share the database. While a process on an older version is still running, the new version refuses to migrate, and its turns fail with OpenCode's generic "Unexpected server error" (the reason is in the Magic Context log). Once every old process has quit, start the new version. After the migration, 0.44.4 and earlier refuse the v94 database, and downgrading the plugin does not downgrade the database.
  • Expect a cache rebuild on a session's first turn after upgrading. The guidance and tool descriptions sent to the model changed. A session usually rebuilds its cached prefix once; one that resumes from a saved request may do so on a later turn instead.
  • Rust transform mode (experimental) needs a one-time offline migration. ck-mc now refuses a store that has not been moved into context.db, with MC-C14: "Magic Context's Rust mode needs a one-time migration of its store. Quit OpenCode and every ck-mc process, then run magic-context doctor single-store migrate." The command backs up both databases first. To roll back, restore ck-mc together with context.db and store.db from that backup.
  • OpenCode 2 needs 2.0.22 or newer. Magic Context creates and deletes its background sessions through the session API that OpenCode 2.0.22 added. On an older OpenCode 2 it stays off and refuses every turn before anything reaches the model, with a notice: "Magic Context is disabled: OpenCode 2.0.22 or newer is required (session.remove and session.compact). Upgrade OpenCode and restart." It never sends a turn it hasn't prepared. doctor prints the requirement next to the OpenCode version it finds.
  • OpenCode 2 does not install plugin updates on its own. Open /plugins, select Magic Context and press ctrl+u, or run opencode plugin update.

One database

  • context.db is the only authoritative store. In Rust transform mode, memories, notes, compartments and session state now live in context.db, shared with the plugin, instead of being copied between context.db and the module's own store.db. store.db keeps only caches that can be rebuilt. OpenCode and Pi without Rust mode already used context.db and need no action beyond the restart above.
  • doctor single-store migrates the store (migrate; --prefer-history <session>=store|context picks which copy of a session's history to keep) and restores a session history the migration left incomplete from its backup (repair-history --from-backup <dir>).
  • Installs with no host (only ck-mc) get a database with npx @cortexkit/magic-context doctor store init, which setup now runs. Without it, ck-mc refuses with MC-C15.

Lower costs

  • Old reasoning leaves the request on every provider. Reasoning from older turns was only cleared on Anthropic routes. It is now removed, with its provider metadata such as OpenAI's encrypted reasoning, on OpenAI, Vertex, Bedrock, OpenRouter and other routes too. The newest assistant turn keeps its reasoning.
  • Models whose reasoning must stay a contiguous run (Fable 5.1, Opus 5.5 and Sonnet 5.5, on any route) have the oldest reasoning trimmed from the front, so the provider never sees a gap that invalidates the rest.
  • Dropping a tool call or message also removes the reasoning tied to it on every provider, instead of writing [cleared] into the reasoning text.
  • Emergency drops skip passes that would reclaim less than 2,000 tokens. Before, a pass could rewrite a 300K-token prefix, and lose its cache, to save under 200 tokens.
  • Far fewer disk writes per turn. The last good request and replay decisions are now stored in pieces, so a turn no longer rewrites a record that grows with the session. On a large session, writes per new-message pass fell from about 3.6 MB to about 0.1 MB, and ck-mc's own writes fell by a similar factor.
  • Faster passes on large sessions. A whitespace check scanned every tag in the session on each pass; on a measured large session the median new-message pass went from 780 ms to 100 ms. Rust mode caches its compartment boundary checks between passes.
  • Identical parallel reads are deduplicated. Duplicate-tool cleanup only knew MCP-prefixed tool names, so it never matched OpenCode's and Pi's own read, grep and glob. When one reply makes the same call twice, the older copy is now dropped on the next pass that rebuilds the cache anyway, and a protected newest copy no longer keeps an older one alive.
  • A restart no longer re-splits embedded history. After every start, the first check of which history still needed embedding tokenized the whole session's text again. Magic Context now records how each compartment was split and skips that work while the text is unchanged (#604).

A failed pass is never sent unmanaged

  • The last good request is replayed, or the turn is refused. When a stage that changes the request fails (for example, tagging under a busy database), Magic Context used to continue and could send the conversation without its drops, once 2.5 times larger than the turn before. It now sends the last good request again or refuses the turn with MC-S06: "This request was not sent: Magic Context could not finish preparing it, and without that preparation it could be far larger than the previous request. Send your message again."
  • A request estimated above the context limit is refused when its pass was degraded in a way that could change or grow it. Pi refuses the same way instead of falling through to the raw history.

For agents

  • ctx_expand tag=N recovers an item by its tag. It accepts the number from a §N§ prefix or a [dropped §N§] placeholder and returns that text or tool call, including dropped ones. Before, agents passed the tag to message=, which counts raw messages and often recovered a neighbouring item (#585).
  • Explicit self-tagging guidance. Where tag prefixes are shown, the guidance now tells the agent to start each reply that has text with the next tag number, and that a reply of only tool calls gets none. This makes the stored text of a reply match what the provider returned more often, which routes that continue from earlier replies need (#582).
  • Tool descriptions match what the tools do (#575). ctx_search says an empty sources list searches everything and lists primer; ctx_note says an omitted filter includes pending smart notes and that reads take at most 50 IDs; ctx_memory no longer advertises a limit it ignores.

OpenCode 2

  • Background sessions use OpenCode's own lifecycle. Each historian and dreamer run gets a new session, under your session when there is one, and Magic Context deletes it through OpenCode's session API when the run ends. Background sessions that earlier versions recorded for reuse are deleted in small batches at startup (#589, #594).
  • Background runs survive OpenCode compacting them. When a historian or dreamer prompt was large enough for OpenCode 2 to compact its new session before the first step, Magic Context no longer recognised its own prompt and refused every run with hidden_prompt_unrecognized. Those runs now go through.
  • The retrospective task runs on OpenCode 2. It had no way to read OpenCode 2 history, found nothing, and still reported success. Manual and scheduled runs now read your messages from OpenCode 2's store (#602).
  • Skipped tasks are recorded as skipped, on every host. A dreamer task that cannot run (compress-cues with mural off, a retrospective with no history source, a Pi model chain with no available model, or a run held back by the single-store migration) now shows as skipped with its reason in run summaries and /ctx-status, not as a success (#602).
  • A refusal before the model is its own error. When Magic Context refuses a background request before it reaches the model, the run now fails with MC-D12, "Memory maintenance was refused before reaching the model.", and points to the log, instead of MC-D02 with advice to check the model connection (#602).
  • Tool calls are read the same way as on OpenCode 1. A call whose arguments arrive wrapped is recovered, and a wrongly typed field no longer throws; ctx_search had answered "query is required".
  • After a provider rejects a request as too long, the next turn keeps the size the rejection reported instead of going back to the smaller reading from the previous reply, so recovery works from the real size.

Pi

  • Status shows real usage. While Pi retries a failed request it estimates the whole raw branch, which /ctx-status and the mc: status line showed as usage (125.9% in one report). They now set that estimate aside, as the transform already did.
  • A context limit proven on one model stays with that model. A large prompt accepted by a 1M-window model no longer raises the usable limit after switching to a smaller one.
  • A historian or dreamer model Pi doesn't know is reported. When none of the configured models is in Pi's registry, the session now gets a notice naming each one and the closest registered match, and doctor checks the chains against pi --list-models.
  • Background maintenance rarely blocks turns (#601). Maintenance now holds the database for short stretches: registering a project's embeddings went from about 210 ms to under 2 ms on a 7 GB store, and old saved requests are deleted in small pieces instead of one delete, which took 6.6 seconds on a large store's backlog. Startup maintenance runs in the background. A Pi turn waits at most 250 ms for the database, then sends its last good request again or refuses the turn; it never sends the unreduced history. Reading notes, which every pass does, no longer takes the write lock, so it doesn't fail with "database is locked".
  • Less work per pass on large sessions. On a large session, saving the last good request fell from about 176 ms to 13 ms per pass and reading the session's tags from about 38 ms to 3 ms, with byte-identical requests.
  • /ctx-wrapup summarises the whole session. After its first window it lost track of the Pi session and reported completion at a shortened boundary (#603).
  • /ctx-dream runs in the background in interactive Pi instead of freezing the prompt for the whole run, like /ctx-recomp already did.
  • Historian and other background runs finish when their Pi process exits, even if a helper it started keeps its output open, and a provider error that Pi retries on its own (429, 529, 5xx) no longer fails the run.
  • A pasted screenshot no longer hides a session from the dreamer. An entry over 1 MB is read as an empty entry of the same kind, so the retrospective and primer refresh still read the rest of the session.
  • The historian no longer loses a tool's output when a shell command entry sits between the result and the next message, assistant replies are searchable as soon as they end, and a session switch that another extension cancels keeps the current session's state.

Rust transform mode (experimental)

  • Recovering from a ck-mc outage keeps the cache. While ck-mc can't answer, Rust mode sends the last good request with your newer messages after it. Every such replay, including ones served while the module was parked or by the outer handler, now keeps sending those exact bytes after the module comes back, after a refused turn, and after a restart that finds the replay in the saved request, instead of rebuilding the cache over the outage. The freeze ends after a bounded number of new messages, or earlier when the replay no longer fits and the module's output does.
  • No 400s from stale thinking after a restart. When the first pass after a restart replaces bytes the outage served, thinking produced against them is removed first, so Opus 5.5, Sonnet 5.5 and Fable 5.1 accept the request.
  • Replays are checked against the real prompt limit. A replay is measured by what the request carries, not by OpenCode's own tool metadata or base64 images, and checked against the model's prompt limit rather than its larger hard limit (for GitHub Copilot's gpt-5-mini, 128K rather than 232K). An oversized replay isn't sent, and a small one isn't refused. If both the replay and the compressed history exceed the window the provider reported, the turn is refused with MC-H07: "This request was not sent: the conversation is larger than the context window the provider reported, and the compressed history Magic Context has ready does not fit either." Run /ctx-flush, then send your message again.
  • A failed pass never sends the raw history. With compaction on, a Rust-mode pass that fails sends the last good request again or refuses the turn with MC-S06. A connection to ck-mc that drops mid-pass does the same in either mode instead of resending the whole request, and a ck-mc that keeps crashing and restarting ends the pass after two reconnects instead of holding it.
  • Large sessions stay cached in ck-mc. ck-mc now keeps one copy of each message's text in its per-session cache instead of three, which roughly halves that cache for large sessions. A session too large for the cache used to fall back to a full resend on every pass, and for a very large session that resend could be refused outright for exceeding the frame limit. Both now go through, and a session that still can't be cached is logged once.
  • A ck-mc restart no longer costs the next turn. After ck-mc restarted, the plugin's next request hit a stale connection that never sent anything, and was treated as an interrupted transform: the turn was refused or served from the last good request, which later cost a cache rebuild. That provably unsent request is now retried once on a fresh connection.
  • Large replies come back in pages. A reply of several megabytes used to go out as one frame that held up ck-mc's health checks and every other session. Replies are now paged against the connection's frame budget, so a 6 MB reply takes about a dozen round trips, and long work no longer runs on the thread that answers health checks.
  • Project identity matches the plugin's. A new repository inside another checkout no longer borrows the outer project's memories, and a checkout where git fails keeps its known identity, or pauses memory for that pass, instead of inventing a directory identity.
  • Config is read the way the plugin reads it. ck-mc now accepts magic-context.json when there is no .jsonc, strips a byte-order mark, warns about a file it can't parse instead of silently using defaults, and ignores a relative XDG_CONFIG_HOME. On Windows it finds your home directory instead of putting context.db under whatever directory it started in.
  • doctor single-store migrate --dry-run works on scratch copies, so it no longer changes the live store.db or creates the backup directory that the real run then refuses.
  • Search hints match memories on every word, not only on the first 24 words in alphabetical order.

Other changes

  • The historian runs with no tools on OpenCode and Pi.
  • The historian fits its prompt to its model's window. It leaves room for the system prompt, memories and recent summaries before sizing the chunk, and checks the prompt before opening a session. A window too small for even the fixed parts is reported once (MC-H05) and retried only when the model or window changes (#595).
  • Dreamer map-memories and verify work in batches of 20 memories instead of 80, with new default token budgets fitted to measured cost: 2.5M for map-memories and verify, 3M for verify-broad (dreamer.tasks.<task>.token_budget). A memory-mapping run that approaches its step limit is asked for what it has checked so far, and keeps that, instead of failing with MC-D10 and losing the whole batch.
  • A plugin build replaced under a running host is reported once. If the plugin files a running OpenCode or Pi loaded from are rebuilt or replaced, the next missing file is reported once with the fix ("type /reload" in Pi, "restart the host" in OpenCode) instead of failing the same way on every background run.
  • Local embeddings run in a worker thread instead of on OpenCode's event loop (#494).
  • Diagnostics stay out of your terminal. SQLite wait messages and other [magic-context] lines go to the log file instead of the host's console.
  • Smart notes follow redirects when checking a URL condition, validating each hop, bound their GitHub checks, and tell you when a condition can't be checked. A condition whose source needs a login, such as a private repository, is parked and its owner told once, instead of being retried every night. A condition that waits for a page to be deleted (404) or withdrawn (410) can now be met, and a GitHub rate limit is retried after it resets.
  • Auto-search hints keep to their 3-second budget from the start of the turn, preparation included, on OpenCode and Pi. A result that arrives late is dropped instead of becoming a hint, and a later turn can search again.
  • Gemini's context limit is learned from its overflow error.
  • User profile entries drop the repeated "User" subject. The profile block shows "Prefers concise explanations" instead of "User prefers concise explanations" on every line, and the historian and the profile review now write new entries that way. Stored entries are unchanged, and existing sessions pick up the shorter form on their next full history rebuild.

Fixed

  • The status dialog no longer crashes on an unusable reply, and the sidebar and status find the session's server when directory spellings differ (#584).
  • doctor reports historian runs, failure counters and sessions under Node, not only Bun (#585).
  • Pi no longer strips a message that owns a tool call, which caused OpenAI Responses 400 errors (#586).
  • On OpenCode 1, dreamer sessions wait for a real parent session instead of appearing as blank sessions at startup, and provider errors are reported instead of "no output" (#587). OpenCode 2 can't hide them yet.
  • On OpenCode 2, a session whose history boundary went missing is re-anchored instead of sending the whole window and failing with HTTP 400 (#590).
  • /ctx-recomp works on OpenCode 2 instead of failing with MC-R01 (#591).
  • OpenCode 2's /btw gets the managed context instead of the raw history, and can't change the next main turn (#592).
  • An over-window session no longer retries the historian on every idle, opening a new hidden session each time (#595).
  • The dashboard's dreamer card clears an old failure badge after a later successful run (#596).
  • On Windows, discovery records whose process ID was reused by another program no longer block doctor merge-identities --apply; doctor --prune-discovery lists any record still unresolved and removes it after you confirm (#597).
  • doctor merge-identities no longer proposes merging a repository's identity into an empty one (#598).
  • Dreamer tasks are scheduled only for projects that have work for them, and schedules of idle projects are removed daily (#599).
  • Clean builds no longer fail on Windows when there are no old build chunks to delete (#600).
  • /ctx-status fits the terminal (#605, #611). In OpenCode it keeps its two columns inside the dialog instead of running past its right edge. In Pi and OMP, the status overlay stays within the terminal height, keeping its title, close hint and border visible, and scrolls its body with the arrow keys, Page Up/Down and Home/End.
  • Caveman compression no longer cuts or glues words next to accented letters, which turned "día para" into "dípara" (#606). Its English word rules no longer rewrite other languages: when your language setting is not English, it keeps only the passes that don't depend on language, including in auto-search hints (#607).
  • An OpenCode 2 /fork inherits the parent's compressed history, notes and drops up to the fork point instead of sending the whole raw history on its first request (293% of the window in one report); this applies outside Rust mode. A session whose first request is more than 1.1 times the window now runs the historian and emergency drops first, and a request still over the window is refused with MC-H06, "This request was not sent: this session's history is larger than the model's context window, and Magic Context does not have a summary of it yet to send in its place.", on OpenCode 1 and 2 (#608).
  • Curate works again on OpenCode 2. Since 0.44.3 every run failed with MC-D06 even when its memory changes had been applied (#609).
  • On OpenCode, a turn whose newest message has no content yet because it hadn't finished saving is refused with "Your message hadn't finished arriving. Send it again." instead of sending a request that ends in an empty message.
  • On OpenCode 1, historian runs, the dreamer's user-memory review and smart-note compilation no longer fail with "The operation timed out." after five to six minutes; historian_timeout_ms is now the limit.

More fixes

Cache stability

  • A cleanup pass and the turn after it now send the same bytes on OpenCode and Pi, so a cleanup no longer costs a second cache rebuild. The same holds after raising clear_reasoning_age, where caveman compression had brought back inline thinking for one turn.
  • Two parts of one message could be sent with the same §N§ tag after the host reordered its parts; each part now keeps its own.
  • /clone, Pi branches and OpenCode 2 forks keep the source session's stripped reasoning, removed placeholders and queued drops, so the copy sends what the source sent. Cloning a session with more than 32,766 tags no longer fails under node:sqlite (Pi, OpenCode Desktop).
  • After an idle gap past the cache lifetime, an aborted first attempt no longer makes the resend look fresh, and a system prompt change on that turn (such as the date line moving overnight) is adopted on it, instead of costing a second rebuild one request later. Such a turn is recorded as an idle expiry, so the dashboard names its cause instead of "Unattributed cache bust" (#610).
  • A context limit learned from a provider overflow no longer raises a model's window above its declared input cap. Before, one overflow on a 272k-input model could set the window to 1M, which raised the protected recent-work floor and stopped emergency drops (#614).
  • On Oh My Pi, disabling a built-in tool such as grep or glob no longer kills Magic Context's background agents at startup. They now leave out tools the host doesn't have, log which ones, and run without built-in tools when none are left (#617).
  • On Oh My Pi, Magic Context now reads the host's system prompt correctly, since OMP returns it in segments. The historian no longer logs an extension error on every run, the busy-storage resend can measure its fit, and /ctx-status shows the current system prompt size (#618).
  • Searching past messages (ctx_search and the automatic search on each prompt) now looks only at the current session's messages first, instead of matching across every session in the database and discarding the rest. Results are unchanged; on large databases the search is faster.
  • The historian now sees what agents do through tools. A new historian.expand_tools option turns chosen tool calls into readable lines in the historian's input, built from the call's input and result, for example PM to ALF: … or Asked: … → <the user's answer>. Defaults cover Magic Context's own tools, OpenCode's question, task and todowrite, and Prefrontal's ask, peer_send, board, room and work. You can add templates for other tools or turn one off with false. Expanded calls are kept even when the message also has text, which used to hide them. ctx_expand shows the expanded lines in its verbose listing only.
  • On OpenCode 2, subagent sessions now run in reduced mode from their first request (reduced guidance, no historian runs), as on OpenCode 1, and an agent that denies ctx_reduce no longer has it advertised (#612). Subagents already running when you upgrade keep their mode until they end.
  • A very large session no longer freezes OpenCode for minutes when its history is trimmed at a summary boundary: retiring the trimmed messages' tags used to scan every tag once per trimmed message while holding the database write lock. It now takes one pass and short transactions.
  • Phone and camera photos are counted at their real size instead of a fixed 1,200 tokens, which can move when a pressure threshold is reached.

Compression and history

  • Caveman compression runs in linear time on long unbroken text, keeps the indentation of fenced code, and no longer joins a line to the one before it when it drops a word. Compressed text keeps its §N§ tag, so the agent can still reference or drop it, and compressing a message no longer removes its reasoning. The new rules take effect on a turn that already rebuilds the cache.
  • On OpenCode 1.17.8 and older, a message you sent while the agent was working is no longer emptied and dropped once it ages, and the historian now sees it.
  • The historian keeps compartments whose title contains > (such as "Migrate store -> SQLite"), decodes escaped text such as &amp;lt; once, keeps summaries that mention <p2> or </compartment> in their prose intact, and attaches events and primer candidates to the right compartment when the model writes compartments out of order.
  • The historian retries on whole words and status codes: "author" no longer counts as an auth error, and "250000" no longer counts as a 500.
  • A /ctx-recomp or historian run whose summary was saved is reported as succeeded even if a later step fails, and /ctx-wrapup or history embedding no longer show as running forever after an error.

CLI setup and doctor

  • Setup keeps the comments in magic-context.jsonc and in plugin lists it edits, writes new properties on their own lines, and writes through a symlinked config (stow, chezmoi, home-manager) to the file it points at, keeping its permissions. The plugin's own config migration and the dashboard also keep a symlinked config a symlink.
  • Setup prepares every OpenCode config before writing any, so a failure leaves none half-changed. A string cache_ttl such as "1h" no longer crashes it, and a file starting with a byte-order mark can be edited.
  • Setup and doctor resolve a relative plugin path the way OpenCode does, from the config file's directory, so running them elsewhere no longer adds a second copy of the plugin. Setup finds opencode-dcp under OpenCode 2's plugins key, and adds its .gitignore rule only at a repository root.
  • doctor never clears the OpenCode 1 plugin cache while OpenCode may be running, ranks a prerelease CLI below its release in the update check, and writes --issue --report <path> without prompting on OpenCode and OMP. doctor --force on Pi and OMP writes only the $schema line into a new config instead of pinning every default.
  • migrate-session works under Node (npx) instead of exiting with empty .bak files, --yes skips the "OpenCode stopped?" question, and a migration that races a concurrent doctor fails cleanly. repair-db warns before it migrates a salvaged database past what installed plugin copies can read, and a cancelled prompt prints "Cancelled." once.

Config trust

  • A repository's config can no longer reset your settings with a wrongly typed value (such as compaction: false), and a project threshold of 81 to 90 can no longer lower a higher one of yours.
  • A repository's command block can only add well-formed new commands; it can't replace yours, shadow a /ctx-* command or wipe your commands.
  • Logs redact more secrets: keys such as db_password and id_token, Basic and other non-Bearer authorization headers, x-api-key style headers, and passwords in URLs.
  • ctx_search returns at most 25 results however large a limit the model asks for.
  • Smart-note file and git conditions refuse git arguments that start with -, and keep their path checks when the CortexKit data directory is a symlink.

Search and dreamer

  • Hybrid search scores memories that match by meaning even after the 60-second embedding cache expires.
  • Message search no longer matches every message of a role on a word like "user"; a query containing a NUL character no longer throws; commit search treats % and _ literally.
  • The git indexer reads commits that a merge brings in with older dates, works in repositories using SHA-256 and in worktrees that contain a file named HEAD, and maintain-docs keeps going on very large diffs.
  • Embedding endpoints that return vectors out of order (some OpenAI-compatible proxies) no longer store vectors against the wrong text.
  • The user-memory review removes candidates it promoted or merged, so the same trait isn't promoted again. Retrospective learnings decode escaped text once.
  • A dreamer schedule with a step in the day field, such as */2, and a weekday fires only on days matching both, as cron does, and an impossible date such as 31 February no longer slows the scheduler.
  • Clearing or deleting a session removes its older search rows, so they don't come back as duplicates. A failure in a project's first maintenance run after startup is logged and shown in /ctx-status instead of risking the host process.

Dashboard

  • Dashboard 0.18.2, released separately, reads Broca sessions in the newer log format, keeps config comments on save, follows a symlinked config, stops serve mode stalling behind a slow read, follows the database path the plugin uses, and fixes memory search paging and backslash escaping.

Credits

Thanks to @Ema-prowler (#494), @Zireael (#575, #617, #618), @joetifa2003 (#582), @VikTekItt (#584), @tppawelgrzesik (#585), @lyston11 (#586), @Tahmid-kabir-addin (#587), @DexterHuang (#589), @augustoolucas (#590, #591), @null-axiom (#592, #612), @gaojunran (#594, #595, #608), @morpheus9393 (#596, #597, #598, #599), @DevChiniwala (#600), @zhexulong (#601), @bazuhq (#602), @dhaern (#604, #606, #607, #614), @slighter12 (#605), @kido5217 (#609) and @TreedsSlop (#610) for the reports, and to @SettingDust for the fix in #603 and @slighter12 for the fix in #611.