Temporal Parsing Service
Status
Locked decision: VRDex owns the hosted temporal parsing product, public API, deterministic runtime, serving operations, quotas, and promotion evals.Locked decision: the training dataset and training pipeline remain indiscord-time-appfor this delivery. VRDex consumes a promoted, immutable model artifact and does not create a live cross-repository dependency.Current recommendation: ship the first useful vertical slice as a closed beta for one explicitly granted VRDex account, then widen it through measured rollout and account quotas.
Product In Plain Language
VRDex Time turns a short phrase such as next Friday at 8pm Eastern into a
canonical instant or time range. A small fine-tuned language model translates
the phrase into a constrained Temporal Plan-IR. VRDex validates that plan and a
deterministic calendar and timezone executor produces the answer. The model is
never trusted to invent the final epoch timestamp directly.
The first client is a small page on the VRDex website. The same capability is also a public, authenticated utility API so other VRDex products and external developers can use it without copying the model runtime.
Why VRDex Owns It
VRDex already owns accounts, verified email, API credentials, OAuth direction,
usage limits, product analytics, billing foundations, public documentation, and
event authoring. That makes it the right product boundary for a hosted model.
discord-time-app remains the historical experiment and training workspace;
HammerOverlay may later consume VRDex Time as an ordinary client.
Accuracy Boundary
Locked behavior:
- The model returns compact Temporal Plan-IR JSON.
- VRDex schema-validates the output.
- VRDex executes calendar math and timezone conversion deterministically.
- Ambiguous input returns a clarification outcome.
- Invalid, unsupported, or low-confidence input never silently becomes a singular timestamp.
The promoted baseline is Qwen/Qwen3.5-0.8B with the
qwen-temporal-ir-qwen35-08b-bf16-chat-time-range-2687-lora adapter. The
handoff baseline passed 153 required cases and one diagnostic case. VRDex must
reproduce that executor-backed gate before promoting a different artifact,
prompt, precision, quantization, or serving stack.
Public Product Surface
Website
The first website surface is a minimal signed-in parser:
- text input
- viewer timezone, locale, country, and optional subdivision defaults
- explicit reference instant override behind an advanced control
- canonical instant or range result
- concise clarification when the input is ambiguous
- visible warming state that continues automatically
- transparent input-retention control
The page should prewarm the model when an eligible user arrives. Prewarming is best effort and must not consume a parse quota or create a fake usage result. A durable, global five-minute cooldown ensures that repeated or concurrent page loads trigger at most one provider prewarm request.
API
The provider-neutral contract is:
POST /api/v0/time/parse
GET /api/v0/time/parse/{continuationToken}
Initial request fields:
{
"text": "next Friday at 8pm Eastern",
"timeZone": "America/Indianapolis",
"locale": "en-US",
"country": "US",
"subdivision": "IN",
"referenceInstant": "2026-07-21T16:00:00Z",
"retainInput": true
}
textis required, trimmed, and limited to 500 characters.timeZoneis an optional valid IANA zone. The signed-in website supplies the browser zone. API callers that omit it receive the documented service default ofAmerica/New_Yorkduring beta.locale,country, andsubdivisionare optional validated hints applied by the deterministic executor after the model returns Plan-IR. The inference worker receives only text, the effective reference instant, and timezone.referenceInstantis optional. VRDex materializes the request instant when it is omitted and stores that immutable value with the accepted job, so queueing and retries cannot change the meaning of relative phrases.retainInputis optional and follows the account preference when omitted.falseis a per-request opt-out.
Successful resolution and clarification are both 200 domain outcomes.
Canonical data is returned; Discord timestamp strings remain presentation logic
for clients or higher-level VRDex application services.
The website route at /api/time/parse is a signed-in session facade over the
same service contract; it is not a second parser. API callers may send an
optional Idempotency-Key header containing 1 to 128 letters, numbers, dots,
underscores, colons, or hyphens. Reusing a key for the same account within the
15-minute continuation window returns the original accepted job. A key must
only be reused for an identical request; reuse with different input returns
409 Conflict. VRDex stores a keyed fingerprint of the complete parsed request
and a separate keyed account-and-idempotency lookup identifier until the
continuation expires to enforce this contract. The bearer continuation includes
per-job entropy: accepting a replacement job after expiry produces a new token,
so the expired continuation URL cannot retrieve the replacement.
Continuations And Cold Starts
Cold startup is expected behavior, not a server failure after work has been accepted. When a warm result cannot be returned inside the synchronous budget:
- VRDex creates a durable job and kicks the inference worker.
- The API returns
202 Acceptedimmediately with an opaque continuation token,Location,Retry-After, estimated wait, and expiry. - The client polls the continuation route.
- Polling returns
202while pending and200with the stored result when complete. - Expired continuations return
410 Gone.
The job record in Convex is the durable source of truth. The beta does not use a
separate result cache. Retrieval requires both a currently valid account
credential and the continuation token; the job lookup is bound to its owner
account, so another account cannot redeem the token. Persist only the token hash
and redact tokens from logs and analytics URLs. Rotating a personal token does
not strand the job: any valid time:parse credential for the same account can
poll it.
Authentication And Rollout
Locked beta behavior:
- an active Convex
use_temporal_parsing_betaaccount grant is required - verified email is required
- the website uses the signed-in session
- the public endpoint initially accepts scoped personal API tokens
- OAuth exposure is deferred until the beta contract is stable
PostHog manages presentation rollout and measurement, not authorization. The
web app mirrors the authorized Convex result into the string person property
temporal_parsing_beta=true. The Terraform-managed
temporal-parsing-beta flag targets that property. A PostHog flag must never
grant API access or reveal the private beta surface to an unauthorized account.
The first grant is for the product owner's account only. The grant remains an operator action rather than a committed email address or account identifier.
Quotas, Cost, And Monetization
The beta starts free with defensive limits:
- token burst limit
- account aggregate limit across every personal token and the website session
- one in-flight parse per account
- one global model worker until measurement justifies more
- daily and monthly usage accounting (beta defaults: 250 per UTC day and 2,000 per UTC month)
- operator kill switch
The initial $50/month figure is an operating target, not an absolute product
ceiling. Alerts and a kill switch protect against abuse, but the service should
not surprise-disable ordinary use solely because an early estimate was wrong.
Public pricing is deliberately unresolved. Regular authenticated users should eventually be able to try the utility. A paid tier may provide a much larger allowance or cover genuinely costly operation, but monetization should not make a small general-purpose utility feel extractive. Do not reuse operational trust tiers as product plans.
Data And Learning Posture
Temporal inputs are valuable product and future training data. VRDex may retain them when the user has not opted out, subject to these locked boundaries:
- tell the user that inputs may be retained to improve the parser
- provide an account-level opt-out and a per-request
retainInput: false - do not sell temporal input data
- warn users not to submit secrets, sensitive personal information, or regulated data
- keep raw text out of PostHog event properties, ordinary request logs, error reporting, and provider logs
- store retained text in a controlled Convex record with owner, purpose, retention state, model revision, and deletion support
- retain outcome, latency, cost, and aggregate usage metrics even when raw input retention is disabled, provided they contain no input text
For an opted-out request, the accepted job holds its text and keyed input hash
only while needed for inference, then deletes both on completion, failure, or
expiry. Its completed response remains available through the 15-minute
continuation window, then the response, content-derived error detail, and a
separate keyed idempotency fingerprint are deleted; the fingerprint cannot
recover the expression. An
opted-in beta expression remains stored until the account turns
retention off or an operator deletes it; the beta has no automatic content
expiry. Turning the account preference off takes effect immediately, prevents
in-flight jobs from retaining content, and deletes retained beta history in
bounded asynchronous batches. A still-unexpired continuation whose completed
result was deleted returns 410 Gone. The website confirms this destructive
action.
The initial parser is intentionally bounded to simple temporal phrases. Before accepting arbitrary event descriptions, poster images, or third-party personal data, revisit consent, retention, deletion, provider DPA, access controls, and training-use disclosures.
Serving And Operations
The first provider benchmark is a RunPod Serverless load-balanced endpoint with
scale-to-zero, one worker, a narrow internal bearer credential, and a
VRDex-owned container. Provider setup should be driven through Terraform,
runpodctl, or the RunPod API. Browser setup is acceptable only for an
unavoidable first-time account, payment, or terms action and must be followed by
checked-in reproducible configuration.
The inference process exposes only:
GET /ping:204while loading,200when ready, and503after startup failurePOST /infer: the bounded Temporal Plan-IR request
It does not expose a general OpenAI-compatible completion surface. Base model, adapter, tokenizer, dependencies, and container are pinned by immutable revision or digest. Provider credentials are server-only and can be rotated without a client change.
No billable provider resource is created as part of code delivery without explicit operator approval. The repository should still contain the container, configuration contract, automation, smoke test, and human bootstrap steps.
Evaluation And Observability
Every promotion report records:
- required and diagnostic pass counts
- wrong singular answer count
- Plan-IR validity and rejection counts
- warm p50/p95/p99
- cold-start phases and ready time
- one-request and bounded-burst behavior
- provider worker seconds and estimated cost per 1,000 parses
- model, adapter, tokenizer, dependency lock, container digest, provider revision, GPU, precision, and prompt format
PostHog receives product events and coarse operational dimensions, never raw input text. Convex is authoritative for usage and retained examples. Provider metrics diagnose infrastructure. Promotion requires executor-backed parity, not only syntactically valid model output.
Future Event Understanding
Candidate direction:
- add a separate preview endpoint that turns a natural-language event request into editable structured draft fields
- let that endpoint extract the temporal phrase, slot count, slot duration, and other event fields, then call VRDex Time for the authoritative schedule
- keep preview separate from event creation so probabilistic interpretation never mutates product data automatically
- compare a fast hosted LLM plus the specialized temporal SLM against an LLM using deterministic temporal tools; measure accuracy, latency, and cost
- later accept posters as extraction input for human review; never treat extracted details as owner-confirmed without review
Language models in these flows understand and structure user-provided intent. They should not replace a creator's voice or generate public creative content by default.
Delivery Gate
The implementation is complete only when:
- canonical docs and the source migration manifest exist
- the VRDex-owned runtime and narrow inference container build locally
- migrated required evals reproduce the baseline against the promoted artifact
- authorization, personal-token scope, account quotas, durable continuation, retention opt-out, usage records, and kill switch have automated coverage
- the website parser passes functional and visual review