Skip to content

home issue 1

Caleb Buxton edited this page Jul 3, 2026 · 1 revision

Research & Planning — Issue #1: Ship duckling gem (time extraction via Magnus + Duckling (Rust))

What this answers: How to ship a Ruby gem that extracts time/date entities from text using the duckling Rust crate wrapped via Magnus — no Haskell runtime, no HTTP call — and publish it as duckling 0.2.0.

Status: 0.2.0 has shipped. The implementation plans below fully executed — see Stale Plans — Fully Executed (0.2.0 Shipped). What's left is tracked as GitHub issues, summarized in the roadmap (kept in the repo, not the wiki, so it stays close to the code it tracks).

Reading Order

Start here, then follow the path for your role:

Implementer (picking up follow-on work): the roadmap — lists the open GitHub issues by theme.

Reviewer (understanding design): Research Key Findings → Plans Key Decisions → Plans.

Newcomer (orienting to the space): Research → Plans.

Table of Contents

Research

Plans

  • the roadmapThe live plan: what's left after 0.2.0, tracked as GitHub issues by theme (environment/tooling, Rakefile workflow, API design exploration, test coverage, performance). Lives in the repo, not the wiki.

Settled Decisions (0.2.0, verified shipped)

  • duckling on crates.io — Published as duckling = "0.4". Use crates.io dep in Cargo.toml. No publish blocker. (Resolved in commit b17070e.)
  • Symbol vs. String keys — All entity hash keys and dim/type/grain values are Ruby Symbols (:body, :dim, :value, :type, :grain, :day, etc.). Settled by the hill tests in PR #2, confirmed shipped in test/duckling_test.rb on main. → See Target Ruby Hash Schema (0.2.0 — Time Entities Only)
  • NaiveDateTime format — Option N1 (bare ISO8601, no offset). Shipped as-is for 0.2.0. → See Target Ruby Hash Schema (0.2.0 — Time Entities Only)

Open Questions (all now tracked as GitHub issues — see the roadmap)

Both items below were open when this research was written; neither is unresolved prose anymore:

  1. reference_time: timezone loss. Shipped as documented (Unix i64, reconstructs at UTC+0). Accepting a Ruby Time object instead is tracked as issue #45.

  2. NoGrain"nosec" vs. "no_grain". Shipped "no_grain" for 0.2.0. Whether any real Time entity in the extended corpus actually carries NoGrain is folded into issue #34 (extended test corpus).

Clone this wiki locally