@burdenoff/be-sdk 2026.1005.1 → 2026.1008.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -204,3 +204,67 @@ PROPRIETARY - Copyright Burdenoff Consultancy Services Pvt. Ltd.
204
204
  ## Support
205
205
 
206
206
  For support, email contact@burdenoff.com or visit [https://burdenoff.com/support](https://burdenoff.com/support).
207
+
208
+ ## Shared DuckLake dataset contract (BOFF-8254)
209
+
210
+ The DuckLake catalog PostgreSQL database owns `shared_lake_datasets` and
211
+ `shared_lake_dataset_consumers` (migration in `prisma/lake-registry/`).
212
+ `dataset_id` is the existing BigConsole sink UUID, `metadata_schema` is
213
+ `dl_<UUID with underscores>`, and the S3 prefix stays
214
+ `datasinks/<dataset_id>/`. BigConsole's service database continues to own the
215
+ ingest watermark and dashboard payload behavior; it mirrors legacy metadata
216
+ to this registry. Run its idempotent `scripts/backfill-shared-lake-registry.ts`
217
+ after the catalog migration, then let normal writes keep it current.
218
+
219
+ Legacy `payload_versions` and `payload_elements` are JSON dashboard data, not
220
+ an operational TimeCampus contract. A product owner adds a typed table in the
221
+ same catalog schema (or a new dataset), with non-null `workspace_id` and
222
+ nullable `product_id`. A null `product_id` explicitly marks a row shared with
223
+ all **approved** dataset consumers. Product-specific rows carry their product
224
+ slug. Readers use both `workspace_id` and `(product_id = consumer OR
225
+ product_id IS NULL)` in every query. Column names and types are versioned by
226
+ `schema_version`; an incompatible change requires a new version/table and a
227
+ staged consumer migration. A single designated owner writes each typed table;
228
+ readers never write. Owners serialize commits and update
229
+ `last_committed_version` only after the lake transaction succeeds. Add DuckLake
230
+ product/date partitions only after file-size and query-profile evidence shows
231
+ that pruning is useful; partitions are a performance choice, not an access
232
+ control mechanism.
233
+
234
+ The first TimeCampus GraphQL operation exposes only typed `time_entries`
235
+ tables classified L1 or L2. Other approved datasets remain service-only until
236
+ their fields and end-user RBAC are reviewed explicitly.
237
+
238
+ Rollout for a TimeCampus grant:
239
+
240
+ 1. Apply `bun run lake:registry:migrate` against the catalog with
241
+ `DUCKLAKE_REGISTRY_MIGRATION_URL`. Backfill existing BigConsole sinks.
242
+ 2. Create the typed table and a representative fixture in alpha, validate
243
+ workspace/product columns and version, then call `registerTyped` with the
244
+ original sink ID/routing and `lifecycle: 'ready'`. BigConsole continues using
245
+ its legacy payload tables in the same schema.
246
+ 3. Add the dataset UUID to `timecampus_ducklake_dataset_ids.alpha` in
247
+ `tf-aws-cloud/roots/secrets`, review/apply the S3 policy through IaC, and
248
+ provision a separate static access key in the TimeCampus Secrets Manager
249
+ bundle. The TimeCampus catalog login must be a member of the
250
+ `boff_timecampus_lake_reader` role; put its read-only URL in
251
+ `DUCKLAKE_CATALOG_URL`. Add `DUCKLAKE_S3_BUCKET`,
252
+ `DUCKLAKE_S3_ACCESS_KEY_ID`, and `DUCKLAKE_S3_SECRET_ACCESS_KEY` to the same
253
+ bundle. The workload already imports its bundle through GitOps.
254
+ 4. Run `bun run lake:grant:timecampus` with the approved `LAKE_DATASET_ID` and
255
+ `LAKE_GRANT_ACTOR`. This grants catalog schema SELECT and activates the
256
+ product grant. The approved view prevents TimeCampus's catalog login from
257
+ reading the unfiltered registry tables. The IAM key can read only the
258
+ reviewed S3 prefix. Validate discovery, direct read, denied guessed ID, and
259
+ mixed-product rows with
260
+ `timecampus-doctor/wspace/modules/timecampus/scripts/test-timecampus.sh --test lake`
261
+ in alpha; then
262
+ repeat the reviewed grant and validation in prod.
263
+
264
+ To adopt a second product, add its own catalog view and NOLOGIN reader role,
265
+ per-dataset PostgreSQL schema grants, IAM principal/prefix policy, Secrets
266
+ Manager bundle values, and service using `LakeDatasetRegistry` plus
267
+ `AuthorizedLakeReader`. Grant revocation must use
268
+ `LAKE_GRANT_ACTION=revoke bun run lake:grant:timecampus`, remove the dataset
269
+ UUID from the Terraform S3 policy, and rotate credentials if a removed product
270
+ previously held them. Do not share BigConsole's broad lake credentials.
@@ -1,6 +1,6 @@
1
1
  import { B as BurdenoffGraphQLClient } from '../graphql-AaLJfGzz.js';
2
2
  import { a as SDKContext } from '../index-CfRZtB99.js';
3
- import { G as GraphQLContext } from '../types-Biv0uaJk.js';
3
+ import { G as GraphQLContext } from '../types-C-6m9NoG.js';
4
4
  import 'graphql-request';
5
5
  import '../layer-GNAVXBMf.js';
6
6
  import 'graphql';
@@ -8,7 +8,7 @@ import 'graphql-yoga';
8
8
  import '../client-CCXpAZ2r.js';
9
9
  import '@prisma/adapter-pg';
10
10
  import 'pg';
11
- import '../workspace-extension-DlxYz3P4.js';
11
+ import '../workspace-extension-DiNiTLa3.js';
12
12
  import '../types-C8TbSdEj.js';
13
13
 
14
14
  interface CookieOptions {