SQLStreams

the messaging platform that is just Postgres

You last visited on 9999-99-99 Show what's new since then
Posted: 2026-09-08 · Report this thread
brandon Site Admin brandon profile Posts: 677

Blame claude for the bad ideas. All the good ones were mine though.

RecordDateDecisionStatus
07842026-09-12Pages project is recreated as sqlstreamsaccepted
07832026-09-12Heartbeats are jittered like ticksaccepted
07822026-09-12sqlstreams.io is the documentation originsuperseded
07812026-09-12A declined claim backs off in the pool, and live instances keep their poll rateaccepted
07802026-09-12The group manager keeps its stream's upkeep and drops the system rowsaccepted
07792026-09-12The idle fleet's cost is the manager tick, and its losing claims convoy on the shared system rowsaccepted
07782026-09-12The profile effect begins after four idle secondsaccepted
07772026-09-12CLI migration names follow the clientaccepted
07762026-09-12The profile text container expands to viewport widthsuperseded
07752026-09-12The profile effect begins after three idle secondssuperseded
07742026-09-12CLI alert JSON and maintenance durations follow the read contractaccepted
07732026-09-12Profile scroll slowdown is eased slightlysuperseded
07722026-09-12Profile scrolling slows as the personal text growssuperseded
07712026-09-12Scheduler concurrency help follows produce validationaccepted
07702026-09-12CLI resource JSON and binding scope follow the clientsuperseded
07692026-09-12The profile fades while idle and its personal text growssuperseded
07682026-09-12CLI registration, health, and worker reads name their client operationsaccepted
07672026-09-12The multistream ladder is retired for unpaced ceiling holdsaccepted
07662026-09-12CLI commands mirror client verbsaccepted
07652026-09-12Accept all memes use WebP imagesaccepted
07642026-09-12Avatar images match their display sizesaccepted
07632026-09-12Header wordmark links homeaccepted
07622026-09-12Client imports use the declared package nameaccepted
07612026-09-12Repository cleanup preserves records and repairs site linksaccepted
07602026-09-12Client package lives at the module rootsuperseded
07592026-09-11Partition creation runs in an explicit transactionaccepted
07582026-09-11The debug buffer stays always-on at its measured costaccepted
07572026-09-11Retain per-stream tables instead of LIST/RANGE subpartitioningaccepted
07562026-09-11Accept all wears the dark patternaccepted
07552026-09-11Benchmark commands and runs use benchaccepted
07542026-09-11Benchmark runs share configuration and outputaccepted
07532026-09-11Manager coordinates existing benchmark rolessuperseded
07522026-09-11Proposed site pages exist only for features a user consumesaccepted
07512026-09-11Results follow maintained scenario familiesaccepted
07502026-09-11Benchmarks retain recurring workloads and freeze completed investigationssuperseded
07492026-09-11Benchmark runner lives at the .bench rootsuperseded
07482026-09-11Published throughput uses three fixed-duration runs and retains every outcomeaccepted
07472026-09-11Throughput scenarios can disable message recording while retaining aggregate measurementsaccepted
07462026-09-10Concurrent lab handlers use independent record filesaccepted
07452026-09-10Maximum throughput uses the reliability lab with explicit workload and environment settingssuperseded
07442026-09-10Controllers keep dependencies and registration owns declarationsaccepted
07432026-09-10Maintenance completion tracking and startup delay are deferredaccepted
07422026-09-10Maintenance settings and operations are separatesuperseded
07412026-09-10Vacuum settings follow stream declarationssuperseded
07402026-09-10Scheduled key vacuum is opt-insuperseded
07392026-09-09Partial sweep grace applies to every batchaccepted
07382026-09-09Partial message sweeps have a bounded grace periodsuperseded
07372026-09-09Examples are a visible root and both test trees live in the .tests moduleaccepted
07362026-09-09Integration tests live in a nested .tests module over testcontainersaccepted
07352026-09-09Idempotency expiry uses timestamp orderaccepted
07342026-09-09Janitor probes oldest row before sweepingaccepted
07332026-09-09Claim observations use xidaccepted
07322026-09-09Diagnostic codes use the SQL prefixaccepted
07312026-09-09vulkantest is one published fixture package with a schema per testsuperseded
07302026-09-09Tests are pure, database, or e2e, and a database test runs against Postgres itselfsuperseded
07292026-09-09SQLStreams wordmark ends with an amber semicolonaccepted
07282026-09-09Rename proposal review stays off the live websiteaccepted
07272026-09-09SQLStreams technical identity follows the product namesuperseded
07262026-09-09SQLStreams cutover recreates disposable databases and keeps a temporary docs originsuperseded
07252026-09-09SQLStreams is the project nameaccepted
07242026-09-09The metric root is singularaccepted
07232026-09-08Repository support, build-output, and benchmark roots are hiddenaccepted
07222026-09-08Repository support and build-output roots are hiddensuperseded
07212026-09-08Repository-only roots are hiddensuperseded
07202026-09-08End-to-end tests and runnable examples have separate hidden rootssuperseded
07192026-09-08Programs under .e2e are e2e testsaccepted
07182026-09-08End-to-end labs and runnable examples have separate rootssuperseded
07172026-09-08The OpenTelemetry integration module is otelaccepted
07162026-09-08Tools holds all repository-only developer toolingsuperseded
07152026-09-07Throughput work excludes the archived delivery consumeraccepted
07142026-09-07Consumer observations allocate transaction ids before advancing cursorssuperseded
07132026-09-07Sustainable throughput keeps both producer and consumer queues boundedaccepted
07122026-09-07Documentation starts with a runnable example and separates progress from delivery outcomesaccepted
07112026-09-07The reliability lab is the benchmark harness, and a benchmark is a scenariosuperseded
07102026-09-07Consumer defaults use small batches and responsive pollingaccepted
07092026-09-07Topic alerts evaluate every minuteaccepted
07082026-09-07Exporter health has a collection scopeaccepted
07072026-09-07Export validation checks only export compatibilityaccepted
07062026-09-07Portable export validation and read healthsuperseded
07052026-09-07OTel readers collect from the produceraccepted
07042026-09-07Alert snapshots expose existing evaluationaccepted
07032026-09-07Collector progress uses manager lease historyaccepted
07022026-09-07Instance log timestamps follow existing namesaccepted
07012026-09-07Worker instance log writes and retentionsuperseded
07002026-09-07Worker instance history proves lease coverageaccepted
06992026-09-07Alert timing fields are inlineaccepted
06982026-09-07All existing alerts share retained historysuperseded
06972026-09-07The record tables are produce_record and handler_recordaccepted
06962026-09-06The checker drains on the consumer group cursor, and every scenario declares the safety checksaccepted
06952026-09-07Partition alerts calculate retained durationsuperseded
06942026-09-07Alert evaluations return explicit statesaccepted
06932026-09-06Metrics collection owns alert evidenceaccepted
06922026-09-06Alert evaluations carry findings and evidencesuperseded
06912026-09-06Compaction options are constructed inlineaccepted
06902026-09-06Alert history uses stored message timeaccepted
06892026-09-06Alert implementation starts in existing recordingaccepted
06882026-09-06Shared alert history evaluation contractsuperseded
06872026-09-06The reliability lab is a ledger and a checker, with scenarios written as Go and printed, never parsedaccepted
06862026-09-06History-based pending belongs to the shared alert frameworksuperseded
06852026-09-06A claim poll reads its snapshot before any transaction and opens the reclaim transaction only on an expired leasesuperseded
06842026-09-06Collector progress contract and bounded historysuperseded
06832026-09-06Alert pending duration is derived from measurement historysuperseded
06822026-09-06Metrics export uses an OTel producer and source-read healthaccepted
06812026-09-06The rule files carry no decision citations; the decision map is the indexaccepted
06802026-09-06pkg/concurrency is infrastructure and lives under commonaccepted
06792026-09-06The doc site splits by page kind: a Reference board, one thread per handleaccepted
06782026-09-06Metrics export distinguishes read success and observation freshnesssuperseded
06772026-09-06Public API comments state their contractaccepted
06762026-09-06Admin owns orchestration and domains own validation rules and resource readsaccepted
06752026-09-06The message's own time is sent_atrejected
06742026-09-06Playground examples share handle, instance, and lifecycle patternsaccepted
06732026-09-06The scheduled time is a message_log column on every messagerejected
06722026-09-06Client results remain unnamedaccepted
06712026-09-06Fatal consumption errors stop the sessionaccepted
06702026-09-06Public surface review retains capabilities and removes shared mutationaccepted
06692026-09-06An index is named for its table then its leading columnsaccepted
06682026-09-06A cursor table carries its own id and the owner's id as UNIQUEaccepted
06672026-09-06Every _config table carries created_at and updated_ataccepted
06662026-09-06The payload never reaches a log line or an erroraccepted
06652026-09-06Vulkan defines the supported public APIaccepted
06642026-09-06Defaults use the normal client APIaccepted
06632026-09-05The janitor timeout names cleanupaccepted
06622026-09-05Janitor cleanup steps have separate deadlinessuperseded
06612026-09-05The system declaration configures the metrics collectoraccepted
06602026-09-05Ensuring a compaction head is one upsertaccepted
06592026-09-05A missing compaction head has a lockable rowsuperseded
06582026-09-05Built-in alert config names the alert, not its scheduled workaccepted
06572026-09-05The datastore holds Logger and Retry onceaccepted
06562026-09-05Search-engine indexing has one path policyaccepted
06552026-09-05Code-page meta descriptions come from code factsaccepted
06542026-09-05The shared layout qualifies document titlesaccepted
06532026-09-05Consumer names the public group handleaccepted
06522026-09-05Astro's build emits the canonical sitemapaccepted
06512026-09-05documentation links related mechanisms in contextaccepted
06502026-09-05The migration version reads through the clientaccepted
06492026-09-05Alerts take the metrics shape and the one registryaccepted
06482026-09-05Metric scope belongs to the diagnostic declarationaccepted
06472026-09-05First-class metrics use one declaration catalogsuperseded
06462026-09-04the topic handle carries the message type; a message key is a handle under itsuperseded
06452026-09-03Binding is a handle under the group; client lists are bare pluralsaccepted
06442026-09-03Public type names state semantic rolessuperseded
06432026-09-03One declaration per type, vulkan as the client plus aliasesaccepted
06422026-09-02The client's own ConsumerInstance runs the manager beside Consumeaccepted
06412026-09-02Run is a per-caller loop; the row is the only arbiteraccepted
06402026-09-02The shared loop re-claims instead of endingaccepted
06392026-09-02The instance target is vocabulary, not a field poked after constructionaccepted
06382026-09-02The manager row is gated and Run is sharedaccepted
06372026-09-02The pool builder is client-package APIaccepted
06362026-09-02The client takes the poolaccepted
06352026-09-02Consume runs the system manageraccepted
06342026-09-02ProduceInTx takes the messageaccepted
06332026-09-02The datastore takes the caller's poolaccepted
06322026-09-01The pool sets no search_pathaccepted
06312026-09-01Every SQL literal names its schemaaccepted
06302026-09-01A Postgres schema is one Vulkan installationaccepted
06292026-09-01"schema" names a Postgres schema and nothing elseaccepted
06282026-09-01The table-name functions are public APIaccepted
06272026-09-01worker liveness is an alert, not a register-time checkaccepted
06262026-08-31newest-wins is the only declaration formaccepted
06252026-08-30one client over the datastore; resources as handles; verbs on the handleaccepted
06242026-08-30the first RegisterTopic stands up the control-plane schemaaccepted
06232026-08-30the standard library's uuid package replaces github.com/google/uuidaccepted
06222026-08-30IdempotencyKey is a caller string, resolved to the claim table's UUIDaccepted
06212026-08-30a schedule is a producer on a cron expression; "cron job" is renamed "schedule" everywhereaccepted
06202026-08-30a missing-partition heal creates the partition of the sequence's next id and reruns under the retry policyaccepted
06192026-08-30the Message type argument sits on Register, not on NewProducer / NewConsumeraccepted
06182026-08-30the schema version is a message_log column declared by the Message type, not a topic keyaccepted
06172026-08-29ordered delivery per key; concurrency values parallel / exclusive / orderedaccepted
06162026-08-29a new group's cursor position: consumergroup.CursorPosition, Head()accepted
06152026-08-29delivery_log is keyed by its own id, not by attemptaccepted
06142026-08-29handler outcomes by error classificationaccepted
06132026-08-29column naming rulesaccepted
06122026-08-29the message key is promoted out of compactionsuperseded
06112026-08-29table names are `<root>_<kind>`accepted
06102026-08-28example attribute values on code threadsaccepted
06092026-08-28website/VOICE.md: the doc site's prose voice fileaccepted
06082026-08-28Playwright covers the editor swap and the initial-JS ceilingaccepted
06072026-08-28the sandbox quiesces before closing its databaseaccepted
06062026-08-28the doc site's browser support lineaccepted
06052026-08-28the member profile pageaccepted
06042026-08-27the transition's ready promise is caught at the sourceaccepted
06032026-08-27the page-failure net ignores browser cancellationssuperseded
06022026-08-27doc site mobile pass: two breakpoints, sandbox gated off phonesaccepted
06012026-08-27doc site versioning: one live site, frozen deployments per versionaccepted
06002026-08-27each consent control gets its own answer, and Accept all gets its own componentaccepted
05992026-08-27the cookie notice is the site's privacy note, on its own surfacesuperseded
05982026-08-27the site notice's full-page face is cut until something needs itaccepted
05972026-08-27website layered error handlingaccepted
05962026-08-26the decision records publish as a boardaccepted
05952026-08-26spacing token scale: exact values, pixel-value names, one tieraccepted
05942026-08-26initial-payload ceilings are NOT builtrejected
05932026-08-26the night board, chosen from the footeraccepted
05922026-08-26ClientRouter, without persisting the sandboxaccepted
05912026-08-26the sandbox's Postgres is not prefetchedrejected
05902026-08-26a fix substitutes the caller's valuesaccepted
05892026-08-25a declaration's diagnose part is SQLaccepted
05882026-08-25the compatibility matrix is exported from the gate's own ruleaccepted
05872026-08-24sandbox consumers auto-run on their own clocksaccepted
05862026-08-24the sandbox's Tick runs the real consume path, and drift is counted per verbaccepted
05852026-08-24the claim path's snapshot gate proves on PGlite, so the sandbox can tickaccepted
05842026-08-23the site's SQL console runs the library's own SQL in PGliteaccepted
05832026-08-23the doc site is a phpBB-era message boardaccepted
05822026-08-23site stack: Astro without Starlight, Svelte 5 islandsaccepted
05812026-08-22the doc site documents shipped behavior onlyaccepted
05802026-08-22Every migration step declares MinCompatibleVersion; the schema gate admits min_compatible_version <= build <= currentaccepted
05792026-08-22migration txn steps run under lock_timeout; timeout retriesaccepted
05782026-08-22fillfactor audit: adopt nothing, defaults everywhereaccepted
05772026-08-22Worker metadata history is an append-only worker_logaccepted
05762026-08-22CLI --output jsonsuperseded
05752026-08-22Public read-models carry json struct tagsaccepted
05742026-08-22Compaction-key deadlock evaluation: no cycles batched, no library retryaccepted
05732026-08-22binding_log retention: the consumer group janitoraccepted
05722026-08-22Append-only is for history tablesaccepted
05712026-08-22Per-topic table split ruleaccepted
05702026-08-22Topic truth stays on the topic row; history is an append-only log (topic_log, binding_log)accepted
05692026-08-21Metric declarations join the shared VK registrysuperseded
05682026-08-21Summary lines declare and carry a help breadcrumbaccepted
05672026-08-21Stop line as session summaryaccepted
05662026-08-21Slow-operation threshold loggingaccepted
05652026-08-20logging grows a record pipeline under the Logger seamaccepted
05642026-08-20Repeated Warn/Error suppression in the logging pipelineaccepted
05632026-08-20Coded declarations move to pkg/common/diagnosticaccepted
05622026-08-20Log events carry VK codes from the error registryaccepted
05612026-08-20Logging machinery moves to pkg/common/loggingaccepted
05602026-08-20SQL literal owner commentsaccepted
05592026-08-20Per-operation debug bufferaccepted
05582026-08-20Logging rule sheetaccepted
05572026-08-20Developer tooling is a dev-only tools/ modulesuperseded
05562026-08-20Standing walks over plain raise stringsaccepted
05552026-08-20Package kinds, the seam law, and worker placementaccepted
05542026-08-20Plain-error construction standardaccepted
05532026-08-19Which errors get codes: the declaration boundaryaccepted
05522026-08-19A missing system topic raises migrate.ErrNotRegisteredaccepted
05512026-08-19Retry classification is consulted, never encoded; one retry typeaccepted
05502026-08-19Structured error anatomy: five parts + recovery, flat codesaccepted
05492026-08-19worker.Definition becomes data; the concrete machines are *Provisioneraccepted
05482026-08-19The receiver letter is the initial of the type's final wordaccepted
05472026-08-19Run-side worker structs are named *Instance; the concrete Definition keeps both rolesaccepted
05462026-08-19Controller and datastore verbs drop their own domain nounaccepted
05452026-08-19The waterline worker is renamed cursor_advancer; AdvanceWaterline becomes AdvanceCommittedaccepted
05442026-08-19Dead-field pass: two deletions, one exemptionaccepted
05432026-08-19Config field order: domain-first, ambient tailaccepted
05422026-08-19Config & options refinement: the three shape decisionsaccepted
05412026-08-19examples, bench, and reference become dev-only nested modulessuperseded
05402026-08-19Bare sub-consumer constructors: doc fencing, not structural fencingaccepted
05392026-08-19Blank-line convention for function bodiesaccepted
05382026-08-19File content ordering conventionaccepted
05372026-08-18Every worker kind carries a controller layeraccepted
05362026-08-18MessageOptions is the sanctioned nilable sparse sub-documentaccepted
05352026-08-18consumer/base cleanup: pure constructors, symmetric key verbs, RecordMarginaccepted
05342026-08-18The metrics domain's write door is pkg/metrics/produceraccepted
05332026-08-18Field absence is the zero value, never a nil pointeraccepted
05322026-08-18Consumer read-models live with the controller whose verbs return themaccepted
05312026-08-18System-topic and cron-job declarations live in the domain's controlleraccepted
05302026-08-18pkg/compaction stays two-layer; MessageRow lives in commonaccepted
05292026-08-17One Querier contract; the produce transaction is the one sanctioned crossingaccepted
05282026-08-17pkg/logger, pkg/retry, pkg/errors, pkg/context merge into a flat pkg/commonaccepted
05272026-08-17pkg/migrate adopts the three-layer templateaccepted
05262026-08-17migrate.Controller is the package's only door; the schema gate reads by idaccepted
05252026-08-16ProduceBatch: one call, N messages, one transactionaccepted
05242026-08-16Alert pipeline instrumentation: state gauges pulled, run outcomes pushedaccepted
05232026-08-16The metric point type is Measurement, not Sampleaccepted
05222026-08-16Metrics are samples on __system.metrics written by a collector worker; otel exposure moves to its own moduleaccepted
05212026-08-15Only a declarer writes config, so the CLI creates nothing (amends 0518, 0520)accepted
05202026-08-15Cron jobs are declared like every other resource; built-in alert config moves into RegisterSystem (amends 0518)accepted
05192026-08-15Topic config lives in append-only declaration rows; topic keeps identity onlysuperseded
05182026-08-15Config is code-owned, the latest declaration wins, and the CLI never writes configaccepted
05172026-08-15Uniform config get/set/unset surface; alter dies in the CLI; Go Alter* verbs take tri-state Update[T]superseded
05162026-08-15AlertRepeatInterval moves to alert worker metadata; system config becomes a stubaccepted
05152026-08-15Group tunables live in worker metadata as {default, override}; users tune through domain nounssuperseded
05142026-08-15DestroySystem is RegisterSystem's inverse: drop every topic, then the control-plane schemaaccepted
05132026-08-14Create-ahead ships with the 95% backstop mark, and destroyed topics evict their claim entryaccepted
05122026-08-14Producer create-ahead triggers at the partition's 80% mark id; heal path serialized by advisory lockaccepted
05112026-08-13Binding sets are declared at consumer Register; replacement waits for zero live declarersaccepted
05102026-08-01ConsumerType and its constants are demoted; NewConsumer defaults to cursor consumptionaccepted
05092026-08-01The retry surface is trimmed to Policy and the two error typesaccepted
05082026-08-01The concurrency package goes internal; consumers build queue and pool from ConsumerConfigaccepted
05072026-08-01The public surface is organized by three audiences; plumbing types are demotedsuperseded
05062026-07-28Reconciliation refunds systemic failures on CLOSE, run by the probe winner; recovery is automaticaccepted
05052026-07-28The breaker's trip threshold is a conservative debounce, not statisticsaccepted
05042026-07-28The breaker trips per instance; global OPEN is a quorum of locally-open instancesaccepted
05032026-07-28Breaker input is user error classification, recorded as error_class on the delivery rowaccepted
05022026-07-28The consumer gets an opt-in circuit breaker for systemic downstream failureaccepted
05012026-08-01Schema provisioning is a library call, not an external migrate stepaccepted
04902026-08-13The register-time evaluator pass is log-only and never writes to the alerts topicaccepted
04892026-08-13Checks declare themselves at `RegisterSystem`, with binds made idempotent by `UNIQUE` + `ON CONFLICT DO NOTHING`accepted
04882026-08-13"handler" and "publisher" are retired as domain nouns; the write door is `AlertController.Record`accepted
04872026-08-13The alert domain owns measurement and decision; producer and consumer inject itaccepted
04862026-08-13Alert executors are worker definitions the manager claims, never embedded goroutinesaccepted
04852026-08-13There is no notifier component: notification is a side effect of `Record` observing a status changeaccepted
04842026-08-13Alert transitions are decided by one pure function, and evidence never enters itaccepted
04832026-08-13The `__system.alerts` topic is the alert state store, dedup memory, and integration surfaceaccepted
04822026-08-13One consumer group per check; the central alert dispatcher is deadaccepted
04812026-08-13Each default alert check is its own cron job and worker-kind subpackageaccepted
04732026-08-12Status and request-listing reads are flat per-fact queries composed in Go, not one CTE statementaccepted
04722026-08-12"Firing" is retired from the codebase's vocabularyaccepted
04712026-08-12`RunCronJob` takes a fresh v7 idempotency key per call and defaults to concurrency 'allow'accepted
04702026-08-12The scheduler produces each due job in its own transactionaccepted
04692026-08-12Vendor the robfig cron schedule core instead of hand-rolling or adding a dependencyaccepted
04682026-08-12Registry verbs: idempotent `RegisterCronJob` that errors on config mismatch, `Alter` re-seeds `next_scheduled_time`, destroy gated by `AllowDestroy`accepted
04672026-08-12Status classification checks terminal outcomes before the not-head "superseded" caseaccepted
04662026-08-12`__system.job_requests` runs with `DeliveryLogModeAll` so successes leave rowsaccepted
04652026-08-12Job-request status is derived from existing tables, never writtenaccepted
04642026-08-12Missed scheduled times are dropped: the scheduler walks to the newest due time and produces only thataccepted
04632026-08-12Cron concurrency is enforced at consume time by the key lease, never by the scheduleraccepted
04622026-08-12The job name is the routing key; there is no handler columnaccepted
04612026-08-12Scheduled work is built on the existing messaging machinery, with one compacted `__system.job_requests` topicaccepted
04512026-08-04Consumption-loop package names keep the house stutter for nowaccepted
04502026-08-04rangeState and claimBuffer stay private, not their own packagesaccepted
04492026-08-04deliveryconsumer kept in the tree but not wired to runaccepted
04482026-08-04No shared base package for the consumption-loop packages at firstsuperseded
04472026-08-04uuid.UUID above the datastore, pgtype.UUID below; ErrLeaseLost declared where detectedaccepted
04462026-08-04ConsumerDatastore's phantom type parameter deletedaccepted
04452026-08-04MessageMeta lives in the one new leaf, pkg/consumer/messageaccepted
04442026-08-04Consumption-loop packages sit under the door with their own narrow configsaccepted
04432026-08-04pkg/consumer is a door, not a vocabulary layeraccepted
04422026-08-02All input validation lives at the controller; datastores trust their inputsaccepted
04412026-08-02Every domain gets the same three-layer package shapeaccepted
04312026-08-09The umbrella package is systemmanager, not Maintaineraccepted
04302026-08-08NoInstanceTarget (-1) for self-claimed consumer loopsaccepted
04292026-08-08Duplicate beside pkg/maintain, don't retrofit itaccepted
04282026-08-11EnsureNextPartition deleted without a replacement homeaccepted
04272026-08-08Snapshot verdicts are classify functions returning named enumsaccepted
04262026-08-08Producer split into pure factory plus Register; the stored lifecycleCtx droppedaccepted
04252026-08-09One system manager row; the daemon is the same manager at deployment scopeaccepted
04242026-08-08The consumer inversion: consumption loops are worker rows the manager spawnsaccepted
04232026-08-08The manager respawns only on ErrInstanceLost and propagates every other erroraccepted
04222026-08-08Exclusivity is claim-per-instance, not claim-per-tickaccepted
04212026-08-08One generic worker/worker_instance pair replaces per-feature maintenance/duty plumbingaccepted
04112026-08-06FamilyHealth and VersionHealth live in pkg/admin, not as a pkg/metrics compositionsuperseded
04102026-08-06Topic display identity stays two structured fields, not a concatenated name@vN stringaccepted
04092026-08-06There is no unversioned GetTopic(name); every topic read is version-addressedsuperseded
04082026-08-06The topic catalog column is named schema_version, accepting the overlap with schema_log.schema_versionsuperseded
04072026-08-06The bridge derives its IdempotencyKey deterministically from the source message idaccepted
04062026-08-06FamilyHealth never reports a compacted topic safe to retireaccepted
04052026-08-06The topic catalog is keyed (name, schema_version), and constructors require SchemaVersion positionallysuperseded
04042026-08-06Message row metadata reaches consumer functions via consumer.MetaFromContext, not a signature changeaccepted
04032026-08-06Compaction's winner rule generalized to a signed caller-supplied rank compared before idaccepted
04022026-08-06Migrating a compacted topic to a new version is a user-space bridge consumer, not a library verbaccepted
04012026-08-06A message schema change is a new physical topic under the same name, never an in-place migrationsuperseded
04002026-08-01Connection-death SQLSTATEs are retryable; resource-exhaustion, corruption, and misconfiguration codes are notaccepted
03992026-08-01Process keeps per-tick-fatal claim errors; no loop-level retry/backoffaccepted
03982026-08-01No DELETE CASCADEs and no triggers; integrity and logging stay in visible DMLaccepted
03972026-08-01No index on deliveries status for v1; reopen only on measured evidence, and prefer a partial index thenaccepted
03962026-08-01An idle poll short-circuits after the read-only snapshot statementaccepted
03952026-08-01The pending (head, xmax) pair is stored unconditionally on every pollaccepted
03942026-08-01Cursor claims stop at a proven head via a snapshot fence, not the visible MAX(id)superseded
03932026-08-01Binding changes are forward-only; history the FanOut mark has passed stays as routedaccepted
03922026-08-01cursor claimed advances via GREATEST so a group running both paths cannot regress its frontieraccepted
03912026-08-01FanOut's scan bound is a scalar subquery, not a join on old_valuesaccepted
03902026-08-01FanOut delivers eagerly past the proven head; only the mark waits for proofaccepted
03892026-08-01FanOut tracks a per-group high-water mark on the cursor table; LIFECYCLE groups register cursor rows and pin retentionaccepted
03882026-08-01The cursor-claim query locks the cursor row with FOR UPDATE in the old_values readaccepted
03872026-08-01A missing cursor row errors loudly, detected by restructuring the claim query instead of adding an existence checkaccepted
03862026-08-01The abandoned-routine Add/Remove race is fixed structurally with a reaper goroutineaccepted
03852026-08-01The abandoned-routines tracking map stays unbounded; no config knobaccepted
03842026-08-01The partition drain loop is bounded, giving up via an unexported sentinelaccepted
03832026-08-01Partition-drop batch size is a fixed constant of 100, not a config knobaccepted
03822026-08-01Partition batches use plain DROP TABLE IF EXISTS with no DETACH firstaccepted
03812026-08-01topic.Destroy drops partitions in batches across multiple transactionsaccepted
03802026-07-28The datastore interfaces are deleted in favor of the concrete typesaccepted
03792026-07-28Multi-partition create-ahead (a PartitionsAhead knob) is rejected; PartitionSize is the leverrejected
03782026-07-28PartitionSafetyBuffer is deleted; the janitor always keeps the next partition createdaccepted
03772026-07-28Configs validate at construction via an exported WithDefaults-then-Validate pairaccepted
03762026-07-28Always-on idempotency: make idempotency_key the enforced identity of message_logsuperseded
03752026-07-28Exception retry backoff reuses retry.Policy instead of a separate config surfaceaccepted
03742026-07-28Datastore retry policy becomes retry.Policy, carried per config, not a globalaccepted
03732026-07-28QueueTimeout is renamed QueueMargin; WorkTimeout and AckMargin keep their namesaccepted
03722026-07-28Janitor and partition tuning fields are topic-scoped and persisted on the topic rowaccepted
03712026-07-28The table-name functions move to internal/topicsuperseded
03702026-07-28Topic administration moves to an admin object holding the datastoreaccepted
03692026-07-28The payload generic is named Message, cascading Work* type names to Message*accepted
03682026-07-28The consumer shutdown hook is deleted; the app that constructs the datastore closes itaccepted
03672026-07-28Janitor splits into a gated public entrypoint and a private loopaccepted
03662026-07-28Consumer session loops keep their ctx and run under a merged ctx; wind-down returns nilaccepted
03652026-07-28Registration is once per instance, and lifecycle sentinels live in pkg/errorsaccepted
03642026-07-28A non-cancellable lifecycle ctx is an error, with an explicit DisableGracefulShutdown opt-outaccepted
03632026-07-28Register validates the topic handle fail-fast: by-name fetch plus whole-struct compareaccepted
03622026-07-28NewMessageProducer takes the raw PostgresDatastore and builds its datastores internallyaccepted
03612026-07-28MessageProducer.Register(ctx) captures the instance lifetime and gates Producesuperseded
03562026-07-20No git tag marks this body of workaccepted
03552026-07-20CLI flags map onto the sparse config structs via cmd.Flags().Changedaccepted
03542026-07-20The CLI is a nested Go module, resolved locally through a gitignored go.workaccepted
03532026-07-20delivery_log_<id> is always created; DisableDeliveryLog gates only the writesaccepted
03522026-07-20Renaming a topic is its own verb, not a NewName field on the alter patchaccepted
03512026-07-20renameTopic pins the id first and updates WHERE id = $1, never WHERE name = $1accepted
03502026-07-20PartitionSize is immutable by omission from AlterConfig; dynamic partition bounds deferredaccepted
03492026-07-20The alter UPDATE is one static COALESCE($n, col) statement, not a dynamically built SET listaccepted
03482026-07-20AlterTopic takes a sparse pointer-per-field patch; nil means leave alonesuperseded
03472026-07-20Missing or mismatched schema surfaces as teaching errors, not raw Postgres errorsaccepted
03462026-07-20Migration registries are explicit ordered slices, not init() registrationaccepted
03452026-07-20One advisory lock id, two hold-times: session-scoped for a migrate run, xact-scoped for RegisterSystemaccepted
03442026-07-20System scope and topic scope version independentlyaccepted
03432026-07-20One append-only schema_log table; current version is the latest-by-id success row, not MAX(schema_version)accepted
03422026-07-20A migration is a sparse struct of func fields, run against a Querier that cannot manage transactionsaccepted
03412026-07-20Schema lives as versioned Go code; golang-migrate and its .sql files are deletedaccepted
03282026-07-16The Datastore interfaces' fate was deferred to a standing cleanup phase, not decided mid-auditaccepted
03272026-07-16Commit's per-exception writes are batched; RecordException stays one message at a timeaccepted
03262026-07-16Nested timeouts use context.WithTimeoutCause naming the budget that firedaccepted
03252026-07-16deliveries went per-topic, and the six remaining shared tables were singularized, before the audit table shippedaccepted
03242026-07-16delivery_log_<topic_id> records only failed attempts; a row's absence is the success signalaccepted
03232026-07-16InTransaction does not retryaccepted
03222026-07-16Partition self-heal in ProduceInTx is per-target via SAVEPOINT, with no opt-outaccepted
03212026-07-16Multi-topic atomic publish exposes the transaction via a closure, not a declarative PublishAllaccepted
03052026-07-14One queue-state query is the only derivation of the DB-truth health numbersaccepted
03042026-07-14Logging goes through a caller-supplied interface with an io.Writer-backed defaultaccepted
03032026-07-14The metrics snapshot is the single source for both the debug readout and the OTel instrumentsaccepted
03022026-07-14pkg/ depends on the OTel metric API only, never the SDK or an exporteraccepted
03012026-07-14The waterline rollup stays lazy; no cursor update at commit timeaccepted
02942026-07-12The retry.Wrap success-after-retries bug was fixed with a plain early-return, not a classification rewriteaccepted
02932026-07-12The abandoned-goroutine registry is a mutex-guarded map keyed by (MessageId, Attempt), kept as plain in-process stateaccepted
02922026-07-12AbandonedRoutines.Remove runs after recover() within the same deferaccepted
02912026-07-12Panic recovery's defer lives inside the spawned goroutine and sends into doneaccepted
02902026-07-12Timeout errors record the message id in last_error, never the work payloadaccepted
02892026-07-12WorkTimeoutGrace defaults to 100ms, sized from a measured scheduler latencyaccepted
02882026-07-12The hard per-message timeout is a detached-goroutine race, with abandonment accepted and trackedaccepted
02872026-07-12One shared callSafely wraps consumerFunc for all three claim pathsaccepted
02862026-07-12Graceful shutdown narrows the interrupted lease instead of freeing itaccepted
02852026-07-12Commit() classification lives inline at each call site; Wrap passes pre-classified errors throughaccepted
02842026-07-12The idempotency check's measured cost was cut with a batched CTE and a per-call opt-outaccepted
02832026-07-12An idempotency_key claim table prevents double-publish on ambiguous commit acksaccepted
02822026-07-12Datastore blips are retried via pkg/retry with explicit retryable/permanent classificationaccepted
02812026-07-12Every consumerFunc failure shape lands in the existing per-message retry/backoff/dead-letter pathaccepted
02732026-07-11The synchronous latest_key write cost was measured and accepted, hot-key serialization includedaccepted
02722026-07-11The compaction_key partial index was dropped once latest_key left it without a consumeraccepted
02712026-07-11The correlated scan's cost was measured before committing to latest_keyaccepted
02702026-07-11A latest_key backfill was built, verified live, then revertedrejected
02692026-07-11Retention stays compaction-unaware; janitors garbage-collect dangling latest_key rowsaccepted
02682026-07-11latest_key is one shared table across all topics, not per-topicaccepted
02672026-07-11The latest_key upsert guard compares id values, not commit orderaccepted
02662026-07-11Key deletion is expressed in the payload; there is no schema-level tombstoneaccepted
02652026-07-11Optional produce inputs travel in a ProduceOptions struct, not positional stringsaccepted
02642026-07-11The compaction_key index is partial, covering only keyed rowssuperseded
02632026-07-11The latest-per-key predicate is unbounded, not bounded by the claim's own highaccepted
02622026-07-11latest_key trades a second synchronous write per keyed publish for an O(1) latest-per-key readaccepted
02612026-07-11Compacted topics resolve latest-per-key at claim time, not by background deletionaccepted
02482026-07-10Two routing_key slices sharing one topic share that topic's drop floor, by designaccepted
02472026-07-10No deliveries.status index until real evidence demands oneaccepted
02462026-07-10deliveries stays one shared table across every topic, unlike message_logaccepted
02452026-07-10Topics are registered explicitly and never auto-created on useaccepted
02442026-07-10Topic identity is a per-call datastore parameter, not a field on the datastoreaccepted
02432026-07-10topic_id joins the keys of cursor/deliveries/binding; lease gets the column onlyaccepted
02422026-07-10routing_key/bindings stay a coarser concept above topics, not folded into themaccepted
02412026-07-10Each topic is its own physical table with its own sequence, partitions, and janitoraccepted
02272026-07-08Partition automation is the Janitor loop in Go, not pg_partmanaccepted
02262026-07-08Retention shipped scoped to the one shared log, per-topic scoping deferredsuperseded
02252026-07-08Register creates cursor rows only for CURSOR-type groupsaccepted
02242026-07-08Partition labs swap message_log to a lab-scale width and restore the schema on exitsuperseded
02232026-07-08Retention respects a MIN(committed) drop floor unless explicitly opted outaccepted
02222026-07-08Retention is a hybrid: whole-partition drop plus a bounded sweep of survivorsaccepted
02212026-07-08message_log is partitioned by RANGE (id), not created_ataccepted
02082026-07-03FanOut keeps its full-table rescan; a per-group high-water mark is deferredaccepted
02072026-07-03binding.kind, header_match, and their CHECK constraint were droppedaccepted
02062026-07-03Matching is on routing_key only; no header or content matcheraccepted
02052026-07-03Reads name their columns explicitly; SELECT * is outaccepted
02042026-07-03BindTopic and ClearBindings are admin calls, not Datastore interface methodsaccepted
02032026-07-03Binding patterns are true wildcards, not NATS-style depth-precise matchersaccepted
02022026-07-03Routing is one shared predicate evaluated at read time in both consume pathsaccepted
02012026-07-03Producers publish a routing_key attribute; groups opt in via binding rows; no binding means receive everythingaccepted
01922026-07-03ExceptionClaim payload unmarshal failure is fatal, not retriedaccepted
01912026-07-03A range past MaxRangeReclaims moves into the per-message exception pathaccepted
01902026-07-03Reclaim is one atomic UPDATE, not DELETE plus INSERTaccepted
01892026-07-03String building in SQL uses concat(), not ||accepted
01882026-07-03Resolution verbs are RecordExceptionSuccess/RecordExceptionFailure, not Ack/Nackaccepted
01872026-07-03No ON CONFLICT on the exception INSERTaccepted
01862026-07-03MessageException and MessageTerminal are two distinct types, not a flagaccepted
01852026-07-03DrainExceptions runs as its own poll loop, separate from CursorClaimaccepted
01842026-07-03ClaimExceptions dead-letters crash-looping rows before claimingaccepted
01832026-07-03The waterline pins below unresolved exceptions; dead rows do not block itaccepted
01822026-07-03Commit frees the lease before recording exception rowsaccepted
01812026-07-03A deliveries row exists only while a message needs individual attention; success is no rowaccepted
01662026-06-30Waterline advance moved to a lazy roller; per-message MoveCursor deletedaccepted
01652026-06-30The cap on repeated reclaims was deferred until the exception path existedaccepted
01642026-06-30Reclaim drains before fresh claim, one expired lease per pollaccepted
01632026-06-30A lease covers (low, high], matching the claim read's conventionaccepted
01622026-06-30AdvanceWaterline is two statements, not one UPDATEaccepted
01612026-06-30Crash recovery rides on a lease per claimed range, not per-message rowsaccepted
01452026-06-26`claimed` advances at claim time, before processing, with no leasesuperseded
01442026-06-26The claim reads the pre-update `claimed` via an `old_values` CTE, not PostgreSQL 18's `old` aliasaccepted
01432026-06-26`MoveCursor` gains the monotonic guard `WHERE committed < $1`accepted
01422026-06-26`committed` advances after each message, not once per batch at `high`accepted
01412026-06-26Two cursor frontiers (`claimed`, `committed`) carry the happy path with no per-message rowaccepted
01262026-06-23The poll loop waits one interval before its first claimaccepted
01252026-06-23A `consumerFunc` error stops the whole poll loop; per-group retry and DLQ are deferredaccepted
01242026-06-23Fan-out does not need a monotonic cursor guard; `MoveCursor` stays `SET position = $1`superseded
01232026-06-23The codebase keeps `message_log`/`cursor`/`position` naming rather than renaming to events/consumersaccepted
01222026-06-23`Process` is a continuous poll loop, not a single-shot passaccepted
01212026-06-23A newly registered consumer group starts at position 0 and replays retained historyaccepted
01072026-06-23Claimed rows are drained with `CollectRows` before the claim transaction commitsaccepted
01062026-06-23Dropped lifecycle and lease machinery is parked as reference, not deletedaccepted
01052026-06-23`FOR UPDATE` on the cursor serializes concurrent claims only, not the process-then-advance windowaccepted
01042026-06-23`MoveCursor` stays a bare `SET position = $1` with no monotonic guardsuperseded
01032026-06-23The cursor advances after each message, not once per batchaccepted
01022026-06-23The cursor claim must `ORDER BY id`; an unordered claim silently loses messagesaccepted
01012026-06-23Consuming reads an append-only log through a per-group cursor instead of mutating message rowsaccepted
00862026-06-20The knob is set via ALTER DATABASE, and reset to on after the sweepaccepted
00852026-06-20synchronous_commit=local is not measuredaccepted
00842026-06-20The on/off sweep is read by shape with best-of-3/max, and conc=1 is the number to trustaccepted
00832026-06-20The crash lab proves off's cost is duplicate reruns, not loss, by SIGKILL with a widened WAL writer windowaccepted
00822026-06-20synchronous_commit=off is safe for this queue: it adds no new failure modeaccepted
00812026-06-20Measure synchronous_commit only; skip the batch-ack measurementaccepted
00672026-06-20Scaling levers are applied in a fixed orderaccepted
00662026-06-20MaxConns is set explicitly on the datastore poolaccepted
00652026-06-20The claim index is a partial index on id covering ready and processingaccepted
00642026-06-20Throughput is min(supply(batch), ack_capacity(workers))accepted
00632026-06-20Claim per batch, record success or failure per messageaccepted
00622026-06-20The in-memory buffer stays shallow: depth is a lease-safety constraint, not a throughput leveraccepted
00612026-06-20The prefetcher blocks on WaitForRoom; the buffer never drops a claimed rowaccepted
00472026-06-15Delivery is at-least-once; consumerFunc must be idempotentaccepted
00462026-06-15The consumer owns the operational knobs; the datastore takes only connection paramsaccepted
00452026-06-15The stuck window is the work timeout plus a 5s bufferaccepted
00442026-06-15Lease reclamation is a claim-predicate branch, not a reaper daemonaccepted
00432026-06-15The dead-letter queue is WHERE status='dead', not a separate tableaccepted
00422026-06-15Failures return to ready with a backoff on can_run_after; max attempts goes deadaccepted
00412026-06-15The claim is row data (status + locked_at), not a held DB lockaccepted
00232026-06-14ProducerFunc takes a concrete pgx.Txaccepted
00222026-06-14AppendMessage threads its transaction into a producer callbackaccepted
00212026-06-14The queue lives in the same Postgres database as the business dataaccepted
00062026-06-13The table is named message_log, not jobsaccepted
00052026-06-13Graceful shutdown lets the in-flight batch finish under context.WithoutCancelaccepted
00042026-06-13Batch limit pinned to 1accepted
00032026-06-13The row lock is held for the entire processing durationsuperseded
00022026-06-13The message DELETE commits in the same transaction as the claimaccepted
00012026-06-13Claims use SELECT ... FOR UPDATE SKIP LOCKEDaccepted