From 6a14eb1d018e2cc2fc425ede84ae089a5bb2da46 Mon Sep 17 00:00:00 2001 From: Julian Cuni Date: Thu, 30 Apr 2026 21:35:27 +0200 Subject: [PATCH] Fill in commit SHA for Phase 1 tasks 1.1-1.4 in ROADMAP and task files --- .planning/ROADMAP.md | 8 ++++---- .planning/phase-1-throughput/01-project-scaffold.md | 2 +- .planning/phase-1-throughput/02-core-types.md | 2 +- .planning/phase-1-throughput/03-config-and-logging.md | 2 +- .planning/phase-1-throughput/04-postgres-schema.md | 2 +- 5 files changed, 8 insertions(+), 8 deletions(-) diff --git a/.planning/ROADMAP.md b/.planning/ROADMAP.md index 5e5554b..a2a3a59 100644 --- a/.planning/ROADMAP.md +++ b/.planning/ROADMAP.md @@ -47,10 +47,10 @@ These rules govern every task. Any deviation must be discussed and documented as | # | Task | Status | Landed in | |---|------|--------|-----------| -| 1.1 | [Project scaffold](./phase-1-throughput/01-project-scaffold.md) | 🟩 | *(pending commit SHA)* | -| 1.2 | [Core types & contracts](./phase-1-throughput/02-core-types.md) | 🟩 | *(pending commit SHA)* | -| 1.3 | [Configuration & logging](./phase-1-throughput/03-config-and-logging.md) | 🟩 | *(pending commit SHA)* | -| 1.4 | [Postgres connection & `positions` hypertable](./phase-1-throughput/04-postgres-schema.md) | 🟩 | *(pending commit SHA)* | +| 1.1 | [Project scaffold](./phase-1-throughput/01-project-scaffold.md) | 🟩 | `290a08e` | +| 1.2 | [Core types & contracts](./phase-1-throughput/02-core-types.md) | 🟩 | `290a08e` | +| 1.3 | [Configuration & logging](./phase-1-throughput/03-config-and-logging.md) | 🟩 | `290a08e` | +| 1.4 | [Postgres connection & `positions` hypertable](./phase-1-throughput/04-postgres-schema.md) | 🟩 | `290a08e` | | 1.5 | [Redis Stream consumer (XREADGROUP)](./phase-1-throughput/05-stream-consumer.md) | ⬜ | — | | 1.6 | [Per-device in-memory state](./phase-1-throughput/06-device-state.md) | ⬜ | — | | 1.7 | [Position writer (batched upsert)](./phase-1-throughput/07-position-writer.md) | ⬜ | — | diff --git a/.planning/phase-1-throughput/01-project-scaffold.md b/.planning/phase-1-throughput/01-project-scaffold.md index 3f82d2d..da6df44 100644 --- a/.planning/phase-1-throughput/01-project-scaffold.md +++ b/.planning/phase-1-throughput/01-project-scaffold.md @@ -55,4 +55,4 @@ Initialize the Node.js / TypeScript project with the directory layout from the P ## Done -*(pending commit SHA)* — Scaffolded `package.json`, `tsconfig.json`, `tsconfig.test.json`, `eslint.config.js`, `.prettierrc`, `vitest.config.ts`, `vitest.integration.config.ts`, `.env.example`, `.gitignore`, `.dockerignore`, and `src/main.ts`. All tooling passes (`pnpm typecheck`, `pnpm lint`, `pnpm build`, `pnpm test`). Verified `import/no-restricted-paths` boundary rule fires on a temporary `src/core/` → `src/domain/` import. Divergence from tcp-ingestion: the restricted-paths zone targets `src/domain/` (Phase 2 boundary) instead of `src/adapters/` (tcp-ingestion boundary). +Landed in `290a08e`. Scaffolded `package.json`, `tsconfig.json`, `tsconfig.test.json`, `eslint.config.js`, `.prettierrc`, `vitest.config.ts`, `vitest.integration.config.ts`, `.env.example`, `.gitignore`, `.dockerignore`, and `src/main.ts`. All tooling passes (`pnpm typecheck`, `pnpm lint`, `pnpm build`, `pnpm test`). Verified `import/no-restricted-paths` boundary rule fires on a temporary `src/core/` → `src/domain/` import. Divergence from tcp-ingestion: the restricted-paths zone targets `src/domain/` (Phase 2 boundary) instead of `src/adapters/` (tcp-ingestion boundary). diff --git a/.planning/phase-1-throughput/02-core-types.md b/.planning/phase-1-throughput/02-core-types.md index 7cdda3d..88f117d 100644 --- a/.planning/phase-1-throughput/02-core-types.md +++ b/.planning/phase-1-throughput/02-core-types.md @@ -63,4 +63,4 @@ Some Teltonika IO elements are u64 values that exceed `Number.MAX_SAFE_INTEGER` ## Done -*(pending commit SHA)* — Implemented `src/core/types.ts` (Position, StreamRecord, DeviceState, Metrics, AttributeValue) and `src/core/codec.ts` (decodePosition, CodecError). All sentinel reversal rules implemented: `__bigint` → bigint, `__buffer_b64` → Buffer, timestamp ISO string → Date. 26 test cases in `test/codec.test.ts` covering round-trips, u64-max, non-UTF-8 bytes, all error paths. Judgment call: `AttributeValue` extracted as a named type alias (not inline) to aid readability in downstream tasks. +Landed in `290a08e`. Implemented `src/core/types.ts` (Position, StreamRecord, DeviceState, Metrics, AttributeValue) and `src/core/codec.ts` (decodePosition, CodecError). All sentinel reversal rules implemented: `__bigint` → bigint, `__buffer_b64` → Buffer, timestamp ISO string → Date. 26 test cases in `test/codec.test.ts` covering round-trips, u64-max, non-UTF-8 bytes, all error paths. Judgment call: `AttributeValue` extracted as a named type alias (not inline) to aid readability in downstream tasks. diff --git a/.planning/phase-1-throughput/03-config-and-logging.md b/.planning/phase-1-throughput/03-config-and-logging.md index 470f317..171e230 100644 --- a/.planning/phase-1-throughput/03-config-and-logging.md +++ b/.planning/phase-1-throughput/03-config-and-logging.md @@ -73,4 +73,4 @@ return pino({ level, base, timestamp: pino.stdTimeFunctions.isoTime, formatters ## Done -*(pending commit SHA)* — Implemented `src/config/load.ts` (zod schema, loadConfig) and `src/observability/logger.ts` (createLogger, pino-pretty in dev). 37 config test cases covering all defaults, missing required vars, URL protocol validation, and bounded numeric checks. Wired into `src/main.ts`. Divergence from tcp-ingestion config: `INSTANCE_ID` defaults to a fixed `'processor-1'` string rather than a random UUID prefix; rationale: operator-visible name is more useful than randomness in a containerised environment where the instance name can be set deterministically. +Landed in `290a08e`. Implemented `src/config/load.ts` (zod schema, loadConfig) and `src/observability/logger.ts` (createLogger, pino-pretty in dev). 37 config test cases covering all defaults, missing required vars, URL protocol validation, and bounded numeric checks. Wired into `src/main.ts`. Divergence from tcp-ingestion config: `INSTANCE_ID` defaults to a fixed `'processor-1'` string rather than a random UUID prefix; rationale: operator-visible name is more useful than randomness in a containerised environment where the instance name can be set deterministically. diff --git a/.planning/phase-1-throughput/04-postgres-schema.md b/.planning/phase-1-throughput/04-postgres-schema.md index d4eca52..7886ed1 100644 --- a/.planning/phase-1-throughput/04-postgres-schema.md +++ b/.planning/phase-1-throughput/04-postgres-schema.md @@ -86,4 +86,4 @@ Do **not** introduce a heavy framework (Knex, node-pg-migrate). The Processor ha ## Done -*(pending commit SHA)* — Implemented `src/db/pool.ts` (createPool, connectWithRetry), `src/db/migrate.ts` (runMigrations — 30-line runner), and `src/db/migrations/0001_positions.sql` (hypertable + unique index + ts-desc index). Unit tests use a mocked pg.Pool throughout; the real TimescaleDB round-trip is deferred to task 1.10 per spec. The "calls process.exit(1)" pool test uses `maxAttempts=1` to avoid fake-timer unhandled-rejection noise that surfaces when a backoff setTimeout resolves after the outer promise has already thrown. +Landed in `290a08e`. Implemented `src/db/pool.ts` (createPool, connectWithRetry), `src/db/migrate.ts` (runMigrations — 30-line runner), and `src/db/migrations/0001_positions.sql` (hypertable + unique index + ts-desc index). Unit tests use a mocked pg.Pool throughout; the real TimescaleDB round-trip is deferred to task 1.10 per spec. The "calls process.exit(1)" pool test uses `maxAttempts=1` to avoid fake-timer unhandled-rejection noise that surfaces when a backoff setTimeout resolves after the outer promise has already thrown.