printing_job.created_at is ISO-8601 text (VARCHAR(40), written with Instant.now().toString()) and its QQQ field is a STRING. QQQ therefore cannot apply a relative date filter ("created in the last day"), a date sort or a date bucket to print jobs. The assistant and the data-analysis screens need exactly that ("printed documents from the last day, grouped by format").
Change (additive)
Area
Change
Schema
printing_job.created_time, a TIMESTAMP without time zone holding UTC (the QQQ DATE_TIME convention).
Write
The job INSERT writes created_at and created_time from one Instant.
Metadata
Read-only field Created (created_time, DATE_TIME); it replaces the text field in the Print jobs default columns and Summary section.
Kept
created_at is untouched: queue order, history cursors, admission seeding, the Printing home and the job API still read it. Its field stays in Details, relabelled Created at (ISO text).
initialize()
ADD COLUMN IF NOT EXISTS, backfill of existing rows from created_at (repeated on each start), printing_job_created_time_idx (tenant_id, created_time, id).
Docs
CHANGELOG (Unreleased 1.2.0) and README, including the host schema step.
No wire or contract change (extension 2.4.0, wire v1). Other *_at text columns (device commands, devices, printers) are not changed.
Host-owned schemas: required step before deploying
A host that never calls initialize() must add the column in its own migrations. The PostgreSQL statements are in CHANGELOG.md. Without the column this version fails loudly and stores nothing: every submission is rolled back with the database's missing-column error for created_time, and QQQ cannot read the Print jobs table. The previous library keeps working on the new schema.
Validation (as run)
Check
Result
./mvnw -B verify -Pui-demo on this commit (Windows, JVM zone America/Chicago)
PrintingJobCreatedTimeTest with the main sources reverted
5 of 5 fail
PostgreSQL 16 (throwaway local container, server zone America/Chicago), host-owned schema built from Forge's printing changesets plus the CHANGELOG statements; not part of the repository tests
statements idempotent; 8 legacy rows (0 to 9 fractional digits) backfilled to the same instant; service submission stores the same instant in both columns; QQQ (Postgres module 4.1.0-RC.25) created_time >= now - 1 day returns the recent job and not a 30-hour-old one; count by format and day buckets work; submission on a schema without the column fails with column "created_time" of relation "printing_job" does not exist and stores nothing
New tests: a submitted job carries the instant in both columns (UTC, independent of the JVM zone); the produced field is DATE_TIME and in the default columns; a relative criterion (NowWithOffset.minus(1, DAYS), GREATER_THAN_OR_EQUALS) returns the recent job and not an old one, with sort, count by format and day buckets; initialize() backfills existing rows; a schema without the column refuses submissions and reads.
Notes for the merge
CHANGELOG.md adds an Unreleased (1.2.0) section at the top; the in-flight multi-node and station-identity branches add one too, so whichever merges second has a trivial textual conflict there.
Not merged, not tagged. A release needs a v1.2.0-RC.N (or v1.2.0) tag on main after the merge.
## Problem
`printing_job.created_at` is ISO-8601 text (`VARCHAR(40)`, written with `Instant.now().toString()`) and its QQQ field is a `STRING`. QQQ therefore cannot apply a relative date filter ("created in the last day"), a date sort or a date bucket to print jobs. The assistant and the data-analysis screens need exactly that ("printed documents from the last day, grouped by format").
## Change (additive)
| Area | Change |
|---|---|
| Schema | `printing_job.created_time`, a `TIMESTAMP` without time zone holding UTC (the QQQ `DATE_TIME` convention). |
| Write | The job `INSERT` writes `created_at` and `created_time` from one `Instant`. |
| Metadata | Read-only field **Created** (`created_time`, `DATE_TIME`); it replaces the text field in the Print jobs default columns and Summary section. |
| Kept | `created_at` is untouched: queue order, history cursors, admission seeding, the Printing home and the job API still read it. Its field stays in Details, relabelled **Created at (ISO text)**. |
| `initialize()` | `ADD COLUMN IF NOT EXISTS`, backfill of existing rows from `created_at` (repeated on each start), `printing_job_created_time_idx (tenant_id, created_time, id)`. |
| Docs | CHANGELOG (Unreleased 1.2.0) and README, including the host schema step. |
No wire or contract change (extension 2.4.0, wire v1). Other `*_at` text columns (device commands, devices, printers) are not changed.
## Host-owned schemas: required step before deploying
A host that never calls `initialize()` must add the column in its own migrations. The PostgreSQL statements are in `CHANGELOG.md`. Without the column this version fails loudly and stores nothing: every submission is rolled back with the database's missing-column error for `created_time`, and QQQ cannot read the Print jobs table. The previous library keeps working on the new schema.
## Validation (as run)
| Check | Result |
|---|---|
| `./mvnw -B verify -Pui-demo` on this commit (Windows, JVM zone America/Chicago) | BUILD SUCCESS: 209 tests, 0 failures, 0 errors, 1 skipped (the opt-in `PrintingWorkloadTest`), 0 Checkstyle violations |
| `PrintingJobCreatedTimeTest` with the main sources reverted | 5 of 5 fail |
| PostgreSQL 16 (throwaway local container, server zone America/Chicago), host-owned schema built from Forge's printing changesets plus the CHANGELOG statements; not part of the repository tests | statements idempotent; 8 legacy rows (0 to 9 fractional digits) backfilled to the same instant; service submission stores the same instant in both columns; QQQ (Postgres module 4.1.0-RC.25) `created_time >= now - 1 day` returns the recent job and not a 30-hour-old one; count by format and day buckets work; submission on a schema without the column fails with `column "created_time" of relation "printing_job" does not exist` and stores nothing |
New tests: a submitted job carries the instant in both columns (UTC, independent of the JVM zone); the produced field is `DATE_TIME` and in the default columns; a relative criterion (`NowWithOffset.minus(1, DAYS)`, `GREATER_THAN_OR_EQUALS`) returns the recent job and not an old one, with sort, count by format and day buckets; `initialize()` backfills existing rows; a schema without the column refuses submissions and reads.
## Notes for the merge
- `CHANGELOG.md` adds an `Unreleased (1.2.0)` section at the top; the in-flight multi-node and station-identity branches add one too, so whichever merges second has a trivial textual conflict there.
- Not merged, not tagged. A release needs a `v1.2.0-RC.N` (or `v1.2.0`) tag on `main` after the merge.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
printing_job.created_at is ISO-8601 text and its QQQ field is a string, so QQQ
could not apply a relative date filter ("created in the last day"), a date sort
or a date bucket to print jobs.
- printing_job gains created_time, a TIMESTAMP without time zone holding UTC
(the QQQ date-time convention), written by the same INSERT from the same
instant as created_at.
- The job table exposes it as the read-only DATE_TIME field "Created"; it
replaces the text field in the default columns and Summary section. The text
field stays (relabelled "Created at (ISO text)") because the queue order,
history cursors, admission seeding, the Printing home and the job API read it.
- initialize() adds the column, backfills existing rows from created_at and
creates printing_job_created_time_idx (tenant_id, created_time, id).
- A host that owns the schema must add the column first (PostgreSQL statements
in CHANGELOG.md). Without it every submission is rolled back with the
missing-column error and QQQ cannot read the table; nothing is stored silently.
No wire or contract change (extension 2.4.0, wire v1).
Tests: PrintingJobCreatedTimeTest (5 tests; all fail without the change).
./mvnw -B verify -Pui-demo: 209 tests, 0 failures, 0 errors, 1 skipped
(opt-in workload test), 0 Checkstyle violations.
Co-Authored-By: Claude Fable 5.2 <noreply@anthropic.com>
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Problem
printing_job.created_atis ISO-8601 text (VARCHAR(40), written withInstant.now().toString()) and its QQQ field is aSTRING. QQQ therefore cannot apply a relative date filter ("created in the last day"), a date sort or a date bucket to print jobs. The assistant and the data-analysis screens need exactly that ("printed documents from the last day, grouped by format").Change (additive)
printing_job.created_time, aTIMESTAMPwithout time zone holding UTC (the QQQDATE_TIMEconvention).INSERTwritescreated_atandcreated_timefrom oneInstant.created_time,DATE_TIME); it replaces the text field in the Print jobs default columns and Summary section.created_atis untouched: queue order, history cursors, admission seeding, the Printing home and the job API still read it. Its field stays in Details, relabelled Created at (ISO text).initialize()ADD COLUMN IF NOT EXISTS, backfill of existing rows fromcreated_at(repeated on each start),printing_job_created_time_idx (tenant_id, created_time, id).No wire or contract change (extension 2.4.0, wire v1). Other
*_attext columns (device commands, devices, printers) are not changed.Host-owned schemas: required step before deploying
A host that never calls
initialize()must add the column in its own migrations. The PostgreSQL statements are inCHANGELOG.md. Without the column this version fails loudly and stores nothing: every submission is rolled back with the database's missing-column error forcreated_time, and QQQ cannot read the Print jobs table. The previous library keeps working on the new schema.Validation (as run)
./mvnw -B verify -Pui-demoon this commit (Windows, JVM zone America/Chicago)PrintingWorkloadTest), 0 Checkstyle violationsPrintingJobCreatedTimeTestwith the main sources revertedcreated_time >= now - 1 dayreturns the recent job and not a 30-hour-old one; count by format and day buckets work; submission on a schema without the column fails withcolumn "created_time" of relation "printing_job" does not existand stores nothingNew tests: a submitted job carries the instant in both columns (UTC, independent of the JVM zone); the produced field is
DATE_TIMEand in the default columns; a relative criterion (NowWithOffset.minus(1, DAYS),GREATER_THAN_OR_EQUALS) returns the recent job and not an old one, with sort, count by format and day buckets;initialize()backfills existing rows; a schema without the column refuses submissions and reads.Notes for the merge
CHANGELOG.mdadds anUnreleased (1.2.0)section at the top; the in-flight multi-node and station-identity branches add one too, so whichever merges second has a trivial textual conflict there.v1.2.0-RC.N(orv1.2.0) tag onmainafter the merge.🤖 Generated with Claude Code
printing_job.created_at is ISO-8601 text and its QQQ field is a string, so QQQ could not apply a relative date filter ("created in the last day"), a date sort or a date bucket to print jobs. - printing_job gains created_time, a TIMESTAMP without time zone holding UTC (the QQQ date-time convention), written by the same INSERT from the same instant as created_at. - The job table exposes it as the read-only DATE_TIME field "Created"; it replaces the text field in the default columns and Summary section. The text field stays (relabelled "Created at (ISO text)") because the queue order, history cursors, admission seeding, the Printing home and the job API read it. - initialize() adds the column, backfills existing rows from created_at and creates printing_job_created_time_idx (tenant_id, created_time, id). - A host that owns the schema must add the column first (PostgreSQL statements in CHANGELOG.md). Without it every submission is rolled back with the missing-column error and QQQ cannot read the table; nothing is stored silently. No wire or contract change (extension 2.4.0, wire v1). Tests: PrintingJobCreatedTimeTest (5 tests; all fail without the change). ./mvnw -B verify -Pui-demo: 209 tests, 0 failures, 0 errors, 1 skipped (opt-in workload test), 0 Checkstyle violations. Co-Authored-By: Claude Fable 5.2 <noreply@anthropic.com>