tigrbl 0.4.4.dev7__tar.gz → 0.4.5.dev1__tar.gz

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.
Files changed (112) hide show
  1. {tigrbl-0.4.4.dev7 → tigrbl-0.4.5.dev1}/PKG-INFO +123 -45
  2. {tigrbl-0.4.4.dev7 → tigrbl-0.4.5.dev1}/README.md +122 -44
  3. {tigrbl-0.4.4.dev7 → tigrbl-0.4.5.dev1}/pyproject.toml +1 -1
  4. {tigrbl-0.4.4.dev7 → tigrbl-0.4.5.dev1}/LICENSE +0 -0
  5. {tigrbl-0.4.4.dev7 → tigrbl-0.4.5.dev1}/NOTICE +0 -0
  6. {tigrbl-0.4.4.dev7 → tigrbl-0.4.5.dev1}/tigrbl/__init__.py +0 -0
  7. {tigrbl-0.4.4.dev7 → tigrbl-0.4.5.dev1}/tigrbl/__main__.py +0 -0
  8. {tigrbl-0.4.4.dev7 → tigrbl-0.4.5.dev1}/tigrbl/canonical_json.py +0 -0
  9. {tigrbl-0.4.4.dev7 → tigrbl-0.4.5.dev1}/tigrbl/cli.py +0 -0
  10. {tigrbl-0.4.4.dev7 → tigrbl-0.4.5.dev1}/tigrbl/config/__init__.py +0 -0
  11. {tigrbl-0.4.4.dev7 → tigrbl-0.4.5.dev1}/tigrbl/config/constants.py +0 -0
  12. {tigrbl-0.4.4.dev7 → tigrbl-0.4.5.dev1}/tigrbl/config/defaults.py +0 -0
  13. {tigrbl-0.4.4.dev7 → tigrbl-0.4.5.dev1}/tigrbl/ddl/__init__.py +0 -0
  14. {tigrbl-0.4.4.dev7 → tigrbl-0.4.5.dev1}/tigrbl/decorators/__init__.py +0 -0
  15. {tigrbl-0.4.4.dev7 → tigrbl-0.4.5.dev1}/tigrbl/decorators/allow_anon.py +0 -0
  16. {tigrbl-0.4.4.dev7 → tigrbl-0.4.5.dev1}/tigrbl/decorators/engine.py +0 -0
  17. {tigrbl-0.4.4.dev7 → tigrbl-0.4.5.dev1}/tigrbl/decorators/hook.py +0 -0
  18. {tigrbl-0.4.4.dev7 → tigrbl-0.4.5.dev1}/tigrbl/decorators/middlewares.py +0 -0
  19. {tigrbl-0.4.4.dev7 → tigrbl-0.4.5.dev1}/tigrbl/decorators/op.py +0 -0
  20. {tigrbl-0.4.4.dev7 → tigrbl-0.4.5.dev1}/tigrbl/decorators/response.py +0 -0
  21. {tigrbl-0.4.4.dev7 → tigrbl-0.4.5.dev1}/tigrbl/decorators/rest.py +0 -0
  22. {tigrbl-0.4.4.dev7 → tigrbl-0.4.5.dev1}/tigrbl/decorators/schema.py +0 -0
  23. {tigrbl-0.4.4.dev7 → tigrbl-0.4.5.dev1}/tigrbl/decorators/session.py +0 -0
  24. {tigrbl-0.4.4.dev7 → tigrbl-0.4.5.dev1}/tigrbl/engine/__init__.py +0 -0
  25. {tigrbl-0.4.4.dev7 → tigrbl-0.4.5.dev1}/tigrbl/engine/bind.py +0 -0
  26. {tigrbl-0.4.4.dev7 → tigrbl-0.4.5.dev1}/tigrbl/engine/builders.py +0 -0
  27. {tigrbl-0.4.4.dev7 → tigrbl-0.4.5.dev1}/tigrbl/engine/capabilities.py +0 -0
  28. {tigrbl-0.4.4.dev7 → tigrbl-0.4.5.dev1}/tigrbl/engine/collect.py +0 -0
  29. {tigrbl-0.4.4.dev7 → tigrbl-0.4.5.dev1}/tigrbl/engine/plugins.py +0 -0
  30. {tigrbl-0.4.4.dev7 → tigrbl-0.4.5.dev1}/tigrbl/engine/registry.py +0 -0
  31. {tigrbl-0.4.4.dev7 → tigrbl-0.4.5.dev1}/tigrbl/engine/resolver.py +0 -0
  32. {tigrbl-0.4.4.dev7 → tigrbl-0.4.5.dev1}/tigrbl/factories/__init__.py +0 -0
  33. {tigrbl-0.4.4.dev7 → tigrbl-0.4.5.dev1}/tigrbl/factories/app.py +0 -0
  34. {tigrbl-0.4.4.dev7 → tigrbl-0.4.5.dev1}/tigrbl/factories/column.py +0 -0
  35. {tigrbl-0.4.4.dev7 → tigrbl-0.4.5.dev1}/tigrbl/factories/engine.py +0 -0
  36. {tigrbl-0.4.4.dev7 → tigrbl-0.4.5.dev1}/tigrbl/factories/hook.py +0 -0
  37. {tigrbl-0.4.4.dev7 → tigrbl-0.4.5.dev1}/tigrbl/factories/op.py +0 -0
  38. {tigrbl-0.4.4.dev7 → tigrbl-0.4.5.dev1}/tigrbl/factories/responses.py +0 -0
  39. {tigrbl-0.4.4.dev7 → tigrbl-0.4.5.dev1}/tigrbl/factories/router.py +0 -0
  40. {tigrbl-0.4.4.dev7 → tigrbl-0.4.5.dev1}/tigrbl/factories/schema.py +0 -0
  41. {tigrbl-0.4.4.dev7 → tigrbl-0.4.5.dev1}/tigrbl/factories/table.py +0 -0
  42. {tigrbl-0.4.4.dev7 → tigrbl-0.4.5.dev1}/tigrbl/hook/exceptions.py +0 -0
  43. {tigrbl-0.4.4.dev7 → tigrbl-0.4.5.dev1}/tigrbl/hook/types.py +0 -0
  44. {tigrbl-0.4.4.dev7 → tigrbl-0.4.5.dev1}/tigrbl/middlewares/__init__.py +0 -0
  45. {tigrbl-0.4.4.dev7 → tigrbl-0.4.5.dev1}/tigrbl/middlewares/compose.py +0 -0
  46. {tigrbl-0.4.4.dev7 → tigrbl-0.4.5.dev1}/tigrbl/op/__init__.py +0 -0
  47. {tigrbl-0.4.4.dev7 → tigrbl-0.4.5.dev1}/tigrbl/op/canonical.py +0 -0
  48. {tigrbl-0.4.4.dev7 → tigrbl-0.4.5.dev1}/tigrbl/op/collect.py +0 -0
  49. {tigrbl-0.4.4.dev7 → tigrbl-0.4.5.dev1}/tigrbl/op/types.py +0 -0
  50. {tigrbl-0.4.4.dev7 → tigrbl-0.4.5.dev1}/tigrbl/orm/__init__.py +0 -0
  51. {tigrbl-0.4.4.dev7 → tigrbl-0.4.5.dev1}/tigrbl/requests.py +0 -0
  52. {tigrbl-0.4.4.dev7 → tigrbl-0.4.5.dev1}/tigrbl/rest/__init__.py +0 -0
  53. {tigrbl-0.4.4.dev7 → tigrbl-0.4.5.dev1}/tigrbl/schema/__init__.py +0 -0
  54. {tigrbl-0.4.4.dev7 → tigrbl-0.4.5.dev1}/tigrbl/schema/builder/__init__.py +0 -0
  55. {tigrbl-0.4.4.dev7 → tigrbl-0.4.5.dev1}/tigrbl/schema/builder/build_schema.py +0 -0
  56. {tigrbl-0.4.4.dev7 → tigrbl-0.4.5.dev1}/tigrbl/schema/builder/cache.py +0 -0
  57. {tigrbl-0.4.4.dev7 → tigrbl-0.4.5.dev1}/tigrbl/schema/builder/extras.py +0 -0
  58. {tigrbl-0.4.4.dev7 → tigrbl-0.4.5.dev1}/tigrbl/schema/builder/helpers.py +0 -0
  59. {tigrbl-0.4.4.dev7 → tigrbl-0.4.5.dev1}/tigrbl/schema/builder/list_params.py +0 -0
  60. {tigrbl-0.4.4.dev7 → tigrbl-0.4.5.dev1}/tigrbl/schema/builder/strip_parent_fields.py +0 -0
  61. {tigrbl-0.4.4.dev7 → tigrbl-0.4.5.dev1}/tigrbl/schema/jsonrpc.py +0 -0
  62. {tigrbl-0.4.4.dev7 → tigrbl-0.4.5.dev1}/tigrbl/schema/utils.py +0 -0
  63. {tigrbl-0.4.4.dev7 → tigrbl-0.4.5.dev1}/tigrbl/security/__init__.py +0 -0
  64. {tigrbl-0.4.4.dev7 → tigrbl-0.4.5.dev1}/tigrbl/security/dependencies.py +0 -0
  65. {tigrbl-0.4.4.dev7 → tigrbl-0.4.5.dev1}/tigrbl/session/__init__.py +0 -0
  66. {tigrbl-0.4.4.dev7 → tigrbl-0.4.5.dev1}/tigrbl/session/base.py +0 -0
  67. {tigrbl-0.4.4.dev7 → tigrbl-0.4.5.dev1}/tigrbl/session/spec.py +0 -0
  68. {tigrbl-0.4.4.dev7 → tigrbl-0.4.5.dev1}/tigrbl/shortcuts/__init__.py +0 -0
  69. {tigrbl-0.4.4.dev7 → tigrbl-0.4.5.dev1}/tigrbl/shortcuts/app.py +0 -0
  70. {tigrbl-0.4.4.dev7 → tigrbl-0.4.5.dev1}/tigrbl/shortcuts/column.py +0 -0
  71. {tigrbl-0.4.4.dev7 → tigrbl-0.4.5.dev1}/tigrbl/shortcuts/engine.py +0 -0
  72. {tigrbl-0.4.4.dev7 → tigrbl-0.4.5.dev1}/tigrbl/shortcuts/hook.py +0 -0
  73. {tigrbl-0.4.4.dev7 → tigrbl-0.4.5.dev1}/tigrbl/shortcuts/op.py +0 -0
  74. {tigrbl-0.4.4.dev7 → tigrbl-0.4.5.dev1}/tigrbl/shortcuts/responses.py +0 -0
  75. {tigrbl-0.4.4.dev7 → tigrbl-0.4.5.dev1}/tigrbl/shortcuts/rest.py +0 -0
  76. {tigrbl-0.4.4.dev7 → tigrbl-0.4.5.dev1}/tigrbl/shortcuts/router.py +0 -0
  77. {tigrbl-0.4.4.dev7 → tigrbl-0.4.5.dev1}/tigrbl/shortcuts/schema.py +0 -0
  78. {tigrbl-0.4.4.dev7 → tigrbl-0.4.5.dev1}/tigrbl/shortcuts/table.py +0 -0
  79. {tigrbl-0.4.4.dev7 → tigrbl-0.4.5.dev1}/tigrbl/specs.py +0 -0
  80. {tigrbl-0.4.4.dev7 → tigrbl-0.4.5.dev1}/tigrbl/system/__init__.py +0 -0
  81. {tigrbl-0.4.4.dev7 → tigrbl-0.4.5.dev1}/tigrbl/system/diagnostics/__init__.py +0 -0
  82. {tigrbl-0.4.4.dev7 → tigrbl-0.4.5.dev1}/tigrbl/system/diagnostics/healthz.py +0 -0
  83. {tigrbl-0.4.4.dev7 → tigrbl-0.4.5.dev1}/tigrbl/system/diagnostics/hookz.py +0 -0
  84. {tigrbl-0.4.4.dev7 → tigrbl-0.4.5.dev1}/tigrbl/system/diagnostics/kernelz.py +0 -0
  85. {tigrbl-0.4.4.dev7 → tigrbl-0.4.5.dev1}/tigrbl/system/diagnostics/methodz.py +0 -0
  86. {tigrbl-0.4.4.dev7 → tigrbl-0.4.5.dev1}/tigrbl/system/diagnostics/router.py +0 -0
  87. {tigrbl-0.4.4.dev7 → tigrbl-0.4.5.dev1}/tigrbl/system/diagnostics/utils.py +0 -0
  88. {tigrbl-0.4.4.dev7 → tigrbl-0.4.5.dev1}/tigrbl/system/docs/__init__.py +0 -0
  89. {tigrbl-0.4.4.dev7 → tigrbl-0.4.5.dev1}/tigrbl/system/docs/lens.py +0 -0
  90. {tigrbl-0.4.4.dev7 → tigrbl-0.4.5.dev1}/tigrbl/system/docs/openapi/__init__.py +0 -0
  91. {tigrbl-0.4.4.dev7 → tigrbl-0.4.5.dev1}/tigrbl/system/docs/openapi/helpers.py +0 -0
  92. {tigrbl-0.4.4.dev7 → tigrbl-0.4.5.dev1}/tigrbl/system/docs/openapi/metadata.py +0 -0
  93. {tigrbl-0.4.4.dev7 → tigrbl-0.4.5.dev1}/tigrbl/system/docs/openapi/mount.py +0 -0
  94. {tigrbl-0.4.4.dev7 → tigrbl-0.4.5.dev1}/tigrbl/system/docs/openapi/schema.py +0 -0
  95. {tigrbl-0.4.4.dev7 → tigrbl-0.4.5.dev1}/tigrbl/system/docs/openrpc.py +0 -0
  96. {tigrbl-0.4.4.dev7 → tigrbl-0.4.5.dev1}/tigrbl/system/docs/swagger.py +0 -0
  97. {tigrbl-0.4.4.dev7 → tigrbl-0.4.5.dev1}/tigrbl/system/favicon/__init__.py +0 -0
  98. {tigrbl-0.4.4.dev7 → tigrbl-0.4.5.dev1}/tigrbl/system/favicon/assets/favicon.svg +0 -0
  99. {tigrbl-0.4.4.dev7 → tigrbl-0.4.5.dev1}/tigrbl/system/uvicorn.py +0 -0
  100. {tigrbl-0.4.4.dev7 → tigrbl-0.4.5.dev1}/tigrbl/transport/__init__.py +0 -0
  101. {tigrbl-0.4.4.dev7 → tigrbl-0.4.5.dev1}/tigrbl/transport/jsonrpc/__init__.py +0 -0
  102. {tigrbl-0.4.4.dev7 → tigrbl-0.4.5.dev1}/tigrbl/transport/jsonrpc/helpers.py +0 -0
  103. {tigrbl-0.4.4.dev7 → tigrbl-0.4.5.dev1}/tigrbl/transport/jsonrpc/models.py +0 -0
  104. {tigrbl-0.4.4.dev7 → tigrbl-0.4.5.dev1}/tigrbl/transport/rest/__init__.py +0 -0
  105. {tigrbl-0.4.4.dev7 → tigrbl-0.4.5.dev1}/tigrbl/transport/rest/aggregator.py +0 -0
  106. {tigrbl-0.4.4.dev7 → tigrbl-0.4.5.dev1}/tigrbl/types/__init__.py +0 -0
  107. {tigrbl-0.4.4.dev7 → tigrbl-0.4.5.dev1}/tigrbl/utils/__init__.py +0 -0
  108. {tigrbl-0.4.4.dev7 → tigrbl-0.4.5.dev1}/tigrbl/utils/schema.py +0 -0
  109. {tigrbl-0.4.4.dev7 → tigrbl-0.4.5.dev1}/tigrbl/vendor/__init__.py +0 -0
  110. {tigrbl-0.4.4.dev7 → tigrbl-0.4.5.dev1}/tigrbl/vendor/jinja.py +0 -0
  111. {tigrbl-0.4.4.dev7 → tigrbl-0.4.5.dev1}/tigrbl/vendor/pydantic.py +0 -0
  112. {tigrbl-0.4.4.dev7 → tigrbl-0.4.5.dev1}/tigrbl/vendor/sqlalchemy.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: tigrbl
3
- Version: 0.4.4.dev7
3
+ Version: 0.4.5.dev1
4
4
  Summary: Schema-first ASGI framework for REST, JSON-RPC, streaming, SSE, WebSocket, runtime plans, hooks, diagnostics, and engine plugins.
5
5
  License: Apache License
6
6
  Version 2.0, January 2004
@@ -299,13 +299,6 @@ Application developers, platform teams, and service owners building schema-first
299
299
 
300
300
  It re-exports stable author-facing classes and decorators while delegating resident behavior to core, base, runtime, kernel, atoms, ORM, and operation packages.
301
301
 
302
- ## Certification Status
303
-
304
- - Package status: governed package in the `tigrbl/tigrbl` workspace.
305
- - Governance source: [SSOT registry](https://github.com/tigrbl/tigrbl/blob/master/.ssot/registry.json).
306
- - Release evidence: [publish workflow](https://github.com/tigrbl/tigrbl/actions/workflows/publish.yml) validates package builds, tests, GitHub release assets, and PyPI publication for managed packages.
307
- - Local certification guard: `pkgs/core/tigrbl_tests/tests/unit/test_package_badges_and_notices.py` verifies every package README keeps the Discord badge, Apache 2.0 badge, explicit Python-version badge, `LICENSE`, and `NOTICE`.
308
- - Scope note: this README documents the package boundary. Runtime feature support remains governed by `.ssot/` entities and the conformance docs linked below.
309
302
 
310
303
  ## Install
311
304
 
@@ -418,46 +411,123 @@ Tigrbl is organized as a split framework behind this facade:
418
411
 
419
412
  Use the facade for application code unless you are maintaining a framework layer, testing a boundary in isolation, or writing a package that intentionally plugs into one of the lower layers.
420
413
 
421
- ## Authoring BCP
414
+ ## Convenient Authoring Path and Best Current Practice (BCP)
422
415
 
423
- The facade is the normal application authoring surface. Use `docs/developer/AUTHORING_BCP.md` for the full policy; this package README keeps the public-package guidance explicit because it is the README most application developers see first.
416
+ Tigrbl is most convenient when application code describes behavior once and lets the framework project that behavior into routes, RPC methods, schemas, docs, lifecycle hooks, diagnostics, tests, and transport-aware runtime plans. The best current practice is to use tables, default canonical operations, operation specs, custom handlers, and lifecycle hooks together instead of spreading one behavior across lower-level framework surfaces. The detailed policy is in [`docs/developer/AUTHORING_BCP.md`](https://github.com/tigrbl/tigrbl/blob/master/docs/developer/AUTHORING_BCP.md).
424
417
 
425
- If you are translating concepts from Starlette, FastAPI, Flask, ASGI 3,
426
- WebSocket, WebTransport, SQLAlchemy, or backend-specific SQL engines, start with
418
+ For readers translating from Starlette, FastAPI, Flask, ASGI 3, WebSocket,
419
+ WebTransport, SQLAlchemy, or database-engine concepts, use
427
420
  [`docs/developer/EQUIVALENCE_INDEX.md`](https://github.com/tigrbl/tigrbl/blob/master/docs/developer/EQUIVALENCE_INDEX.md).
428
- Those guides describe analogous lower-layer concepts while keeping Tigrbl-owned
429
- authoring surfaces as the application contract.
430
-
431
- Do:
432
-
433
- - Do import application-facing classes, decorators, helpers, and shortcuts from `tigrbl` unless you are intentionally maintaining a lower-level package. Why: the facade is the supported application contract and hides lower-layer package splits.
434
- - Do create services with `TigrblApp`, `TigrblRouter`, facade route/operation decorators, table helpers, column helpers, hook decorators, response decorators, schema helpers, and engine decorators. Why: these entry points are visible to runtime planning, docs, diagnostics, schemas, and tests.
435
- - Do model domain actions as Tigrbl operations, including canonical CRUD operations, operation-pack verbs, or explicit custom operation specs. Why: operations are the unit Tigrbl can project consistently across protocol surfaces.
436
- - Do use operation handlers through Tigrbl specs and kernel/runtime dispatch so REST, JSON-RPC, HTTP streams, SSE, WebSocket, WebTransport-aware runtime units, OpenAPI, OpenRPC, diagnostics, schemas, hooks, and tests stay aligned. Why: handler dispatch is where protocol projection and lifecycle guarantees meet.
437
- - Do express field behavior through Tigrbl table, column, datatype, storage, IO, request, response, and operation specs. Why: specs are the shared source for storage lowering, wire schemas, docs, runtime planning, hooks, and diagnostics.
438
- - Do use `get_schema(...)` or schema helpers for operation request/response payloads. Why: generated schemas keep payloads aligned with operation specs and docs.
439
- - Do bind engines declaratively at app, router, table, or operation scope. Why: declarative binding lets the runtime own session selection, transaction scope, diagnostics, and backend-specific behavior.
440
- - Do use lifecycle hooks for policy, validation, enrichment, audit, response shaping, and post-response work. Why: hooks make policy visible to lifecycle ordering, diagnostics, tests, and transport-independent execution.
441
- - Do use `/system/methodz`, `/system/hookz`, `/system/kernelz`, OpenAPI, and OpenRPC to inspect the registered framework state. Why: these surfaces show the compiled Tigrbl state instead of a lower-level framework's partial view.
442
-
443
- Do not:
444
-
445
- - Do not author application endpoints with FastAPI `FastAPI`, `APIRouter`, dependency wiring, route decorators, middleware registration, docs generation, or lifecycle hooks. Why: that makes FastAPI the application contract instead of Tigrbl's operation, binding, hook, schema, docs, and diagnostics contract.
446
- - Do not author application endpoints with Starlette route, request, response, middleware, background-task, or lifecycle classes. Why: Starlette is a lower-level runtime substrate here, not the application-facing authoring surface.
447
- - Do not author application endpoints with Flask `Flask`, `Blueprint`, route decorators, request/response globals, `MethodView`, extension registration, or lifecycle hooks. Why: Flask route objects cannot preserve Tigrbl's shared operation inventory, schema generation, lifecycle phases, or transport plan.
448
- - Do not use raw SQLAlchemy `mapped_column(...)` or `Column(...)` as the primary application authoring surface when Tigrbl column helpers or specs can represent the field behavior. Why: raw ORM declarations are only one lowering target and cannot carry the full storage, IO, validation, docs, hook, and runtime contract.
449
- - Do not build ad-hoc SQLAlchemy engines, sessions, or sessionmakers inside request handlers. Why: ad-hoc construction bypasses declarative engine binding, session policy, pooling, diagnostics, tests, and backend adapters.
450
- - Do not call direct database/session methods such as `flush()` or `commit()` from application hooks or handlers unless you are implementing a framework-level atom with the correct lifecycle guard contract. Why: direct calls bypass lifecycle guards and can commit partial state before hooks, errors, rollback handlers, or response shaping have run.
451
- - Do not wrap model behavior in one-off route handlers when an operation spec can represent the behavior. Why: route wrappers hide behavior from protocol projection, docs, hooks, diagnostics, and tests.
452
- - Do not bypass kernel/runtime plans when wiring REST, JSON-RPC, HTTP stream, SSE, WebSocket, or WebTransport behavior. Why: bypasses skip legality checks, lifecycle phases, transaction ownership, protocol framing policy, and fail-closed unsupported-combination handling.
453
-
454
- Avoid:
455
-
456
- - Avoid treating ASGI, FastAPI, Flask, Starlette, SQLAlchemy ORM materialization, or direct DB methods as the user-facing application contract. Tigrbl owns the authoring contract; lower-level libraries are implementation substrates behind Tigrbl-owned adapters, engines, tests, or benchmarks. Why: lower-level substrates are legal implementation tools, but not the supported application API.
457
- - Avoid duplicating field behavior in SQLAlchemy, Pydantic, docs, and route handlers. Put reusable behavior in Tigrbl specs so storage, schema, docs, runtime, hooks, and diagnostics read the same source. Why: duplicated rules create stale validation, stale docs, and protocol-specific behavior differences.
458
- - Avoid hand-written Pydantic envelopes for payloads that belong to a Tigrbl operation. Why: generated schemas keep request/response payloads aligned with operation specs and docs.
459
- - Avoid transport-specific wrappers for authentication, authorization, validation, or dispatch when security dependencies, hooks, operation specs, or lifecycle phases can express the rule once. Why: transport-layer policy can make REST, JSON-RPC, streams, SSE, WebSocket, and WebTransport disagree about the same domain operation.
460
- - Avoid teaching lower-level internals in application README examples unless the example is clearly marked as a test, benchmark, migration, engine adapter, or framework-internal compatibility surface. Why: examples without a boundary marker become accidental guidance.
421
+ Those guides explain nearby concepts without making lower-layer frameworks the
422
+ Tigrbl application authoring contract.
423
+
424
+ ### Keep the facade as the application contract
425
+
426
+ - Avoid: Treating ASGI, FastAPI, Flask, Starlette, SQLAlchemy ORM materialization, or direct database/session calls as the user-facing application contract.
427
+ - Do: Build application services with `TigrblApp`, `TigrblRouter`, facade decorators, table helpers, column helpers, operation specs, hook specs, binding specs, engine specs, and generated schemas.
428
+ - Why: Tigrbl-owned authoring surfaces are the entry points that runtime planning, docs, diagnostics, schemas, and tests understand.
429
+
430
+ ### Start with tables and default canonical operations
431
+
432
+ - Avoid: Hand-writing endpoint-specific behavior before checking whether table-backed default operations already express it.
433
+ - Do: Model resources with Tigrbl tables and use default canonical operations such as `create`, `read`, `update`, `replace`, `delete`, `list`, and `clear` where they fit.
434
+ - Why: Tables plus canonical operations give Tigrbl a durable resource model that can be projected consistently across REST, JSON-RPC, schemas, docs, hooks, diagnostics, and tests.
435
+
436
+ ### Use operations and custom handlers for domain actions
437
+
438
+ - Avoid: Splitting one domain action across separate REST handlers, JSON-RPC handlers, stream handlers, docs snippets, and protocol-specific wrappers.
439
+ - Do: Model domain actions as Tigrbl operations with operation specs and custom handlers when the default canonical operations are not enough.
440
+ - Why: Operations are the unit Tigrbl can bind, document, inspect, test, and project across protocol surfaces.
441
+
442
+ ### Use lifecycle hooks around operations
443
+
444
+ - Avoid: Embedding lifecycle policy directly inside transport-specific handlers or lower-level framework middleware.
445
+ - Do: Use lifecycle hooks around operations for validation, authorization, enrichment, auditing, response shaping, rollback handling, and post-response work.
446
+ - Why: Hooks make behavior visible before and after the operation, while preserving lifecycle ordering across REST, JSON-RPC, streams, SSE, WebSocket, and WebTransport-aware runtime plans.
447
+
448
+ ### Support persistence and non-persistence operations
449
+
450
+ - Avoid: Assuming every operation or custom handler must be database-backed.
451
+ - Do: Use operations and custom handlers for persistence workflows and for non-persistence workflows such as computed responses, orchestration, control-plane commands, stream/session commands, or external-service actions.
452
+ - Why: The operation model gives both persistence and non-persistence behavior the same docs, hooks, diagnostics, protocol projection, and runtime planning path.
453
+
454
+ ### Put field behavior in Tigrbl specs
455
+
456
+ - Avoid: Duplicating field behavior across SQLAlchemy declarations, Pydantic models, route handlers, and docs.
457
+ - Do: Describe field behavior through Tigrbl tables, `FieldSpec`, `ColumnSpec`, `StorageSpec`, and `IOSpec`.
458
+ - Why: These specs keep field semantics aligned for storage lowering, validation, schemas, docs, hooks, diagnostics, and runtime planning.
459
+
460
+ ### Use generated schemas for operation payloads
461
+
462
+ - Avoid: Hand-written Pydantic envelopes for payloads that belong to a Tigrbl operation.
463
+ - Do: Use `get_schema(...)` or other Tigrbl schema helpers for operation request and response payloads.
464
+ - Why: Generated schemas keep payloads aligned with operation specs, docs, validation, and protocol projections.
465
+
466
+ ### Keep engines and transactions declarative
467
+
468
+ - Avoid: Creating ad-hoc SQLAlchemy engines, sessions, sessionmakers, commits, or flushes inside application handlers.
469
+ - Do: Bind engines declaratively at app, router, table, or operation scope, and let kernel/runtime phases own dispatch and transaction progression.
470
+ - Why: Declarative binding lets the runtime own session selection, transaction scope, rollback behavior, pooling, diagnostics, backend adapters, and post-response work.
471
+
472
+ ### Keep examples in Tigrbl style
473
+
474
+ - Avoid: README examples that present lower-level framework internals as normal application style.
475
+ - Do: Use Tigrbl facade imports and Tigrbl-owned authoring surfaces in application examples unless the example is explicitly marked as a lower-layer test, benchmark, migration, engine adapter, or framework-internal compatibility example.
476
+ - Why: Examples should show the framework path that keeps operations, schemas, docs, hooks, diagnostics, and runtime planning aligned.
477
+
478
+ ### Keep workspace docs in their right lanes
479
+
480
+ - Avoid: Using the root README as the only documentation for a distributable package.
481
+ - Do: Use package-local README files to explain package boundaries, install targets, import roots, dependency surfaces, usage examples, and links to governed docs.
482
+ - Why: The root README orients the workspace, while package READMEs serve PyPI users who arrive at one install target.
483
+
484
+ ### Do not wire endpoints around the operation plan
485
+
486
+ - Do not: Bypass operation specs, handlers, kernel plans, runtime atoms, or lifecycle phases with one-off route wrappers for REST, JSON-RPC, HTTP stream, SSE, WebSocket, or WebTransport behavior.
487
+ - Do: Define the operation once, bind it through Tigrbl specs, and let kernel/runtime planning own protocol dispatch.
488
+ - Why: This preserves legality checks, lifecycle phases, transaction ownership, protocol framing policy, and fail-closed unsupported-combination handling.
489
+
490
+ ### Do not make lower-level frameworks the application surface
491
+
492
+ - Do not: Author Tigrbl application endpoints with FastAPI `FastAPI`, `APIRouter`, dependency wiring, route decorators, middleware registration, docs generation, or application lifecycle wiring.
493
+ - Do: Use Tigrbl app/router factories, decorators, tables, default canonical operations, operation specs, custom handlers, lifecycle hooks, schema helpers, and engine decorators.
494
+ - Why: FastAPI is a substrate here; Tigrbl is the application contract that keeps operations, bindings, hooks, schemas, docs, diagnostics, and tests together.
495
+
496
+ ### Do not route around the runtime substrate boundary
497
+
498
+ - Do not: Author application endpoints directly with Starlette route, request, response, middleware, background-task, or application lifecycle classes.
499
+ - Do: Express application behavior through Tigrbl operations, bindings, lifecycle hooks, and runtime-managed execution.
500
+ - Why: Starlette is a lower-level runtime substrate here, not the application-facing authoring surface.
501
+
502
+ ### Do not fragment behavior into Flask route objects
503
+
504
+ - Do not: Author application endpoints with Flask `Flask`, `Blueprint`, route decorators, request/response globals, `MethodView`, extension registration, or application lifecycle hooks.
505
+ - Do: Keep resources in tables, use default canonical operations where they fit, and use operation specs plus custom handlers for domain actions.
506
+ - Why: Flask route objects cannot preserve Tigrbl's shared operation inventory, schema generation, lifecycle phases, hook ordering, or transport plan.
507
+
508
+ ### Do not use raw ORM declarations as the primary application model
509
+
510
+ - Do not: Use raw SQLAlchemy `mapped_column(...)` or `Column(...)` as the primary application authoring surface when Tigrbl specs can represent the field behavior.
511
+ - Do: Describe field behavior through Tigrbl tables, `FieldSpec`, `ColumnSpec`, `StorageSpec`, and `IOSpec`.
512
+ - Why: Raw ORM declarations are only one lowering target and cannot carry the full storage, IO, validation, docs, hook, and runtime contract.
513
+
514
+ ### Do not manage database state inside handlers
515
+
516
+ - Do not: Call direct database/session methods such as `flush()` or `commit()` from application hooks or handlers.
517
+ - Do: Let lifecycle phases such as `START_TX`, `PRE_HANDLER`, `HANDLER`, `POST_HANDLER`, `PRE_COMMIT`, and `TX_COMMIT` own transaction progression.
518
+ - Why: Direct calls bypass lifecycle guards and can commit partial state before hooks, errors, rollback handlers, or response shaping have run.
519
+
520
+ ### Do not blur package boundaries
521
+
522
+ - Do not: Widen a package boundary by adding dependencies, imports, examples, or docs that belong in another split package.
523
+ - Do: Keep facade guidance in `tigrbl`, framework internals in the lower-level packages that own them, and package-specific usage in package-local READMEs.
524
+ - Why: Clear package boundaries make the split distribution convenient instead of surprising, especially for users installing only one package.
525
+
526
+ ### Keep release and certification claims governed
527
+
528
+ - Avoid: Duplicating release, certification, target-state, or conformance claims outside governed evidence records.
529
+ - Do: Use `.ssot/`, conformance docs, release evidence, and certification reports for governed feature, claim, release, evidence, and target-state questions.
530
+ - Why: Release status and proof chains need one source of truth so package docs do not drift from CI and certification evidence.
461
531
 
462
532
  ## Default CRUD and Operation Semantics
463
533
 
@@ -715,6 +785,14 @@ Choose `tigrbl` when you want the full public facade: app composition, schema-fi
715
785
 
716
786
  This file is a package-local distribution entry point. This README is the package-local distribution entry point for `tigrbl`. It answers install, usage, API, ownership, and certification-orientation questions for this package. Broader architectural decisions, release status, and cross-package proof chains remain in the repository-level docs and SSOT registry.
717
787
 
788
+ ## Certification Status
789
+
790
+ - Package status: governed package in the `tigrbl/tigrbl` workspace.
791
+ - Governance source: [SSOT registry](https://github.com/tigrbl/tigrbl/blob/master/.ssot/registry.json).
792
+ - Release evidence: [publish workflow](https://github.com/tigrbl/tigrbl/actions/workflows/publish.yml) validates package builds, tests, GitHub release assets, and PyPI publication for managed packages.
793
+ - Local certification guard: `pkgs/core/tigrbl_tests/tests/unit/test_package_badges_and_notices.py` verifies every package README keeps the Discord badge, Apache 2.0 badge, explicit Python-version badge, `LICENSE`, and `NOTICE`.
794
+ - Scope note: this README documents the package boundary. Runtime feature support remains governed by `.ssot/` entities and the conformance docs linked below.
795
+
718
796
  ## License
719
797
 
720
798
  Licensed under the Apache License, Version 2.0. See `LICENSE`, `NOTICE`, and the official [Apache 2.0 license text](https://www.apache.org/licenses/LICENSE-2.0).
@@ -35,13 +35,6 @@ Application developers, platform teams, and service owners building schema-first
35
35
 
36
36
  It re-exports stable author-facing classes and decorators while delegating resident behavior to core, base, runtime, kernel, atoms, ORM, and operation packages.
37
37
 
38
- ## Certification Status
39
-
40
- - Package status: governed package in the `tigrbl/tigrbl` workspace.
41
- - Governance source: [SSOT registry](https://github.com/tigrbl/tigrbl/blob/master/.ssot/registry.json).
42
- - Release evidence: [publish workflow](https://github.com/tigrbl/tigrbl/actions/workflows/publish.yml) validates package builds, tests, GitHub release assets, and PyPI publication for managed packages.
43
- - Local certification guard: `pkgs/core/tigrbl_tests/tests/unit/test_package_badges_and_notices.py` verifies every package README keeps the Discord badge, Apache 2.0 badge, explicit Python-version badge, `LICENSE`, and `NOTICE`.
44
- - Scope note: this README documents the package boundary. Runtime feature support remains governed by `.ssot/` entities and the conformance docs linked below.
45
38
 
46
39
  ## Install
47
40
 
@@ -154,46 +147,123 @@ Tigrbl is organized as a split framework behind this facade:
154
147
 
155
148
  Use the facade for application code unless you are maintaining a framework layer, testing a boundary in isolation, or writing a package that intentionally plugs into one of the lower layers.
156
149
 
157
- ## Authoring BCP
150
+ ## Convenient Authoring Path and Best Current Practice (BCP)
158
151
 
159
- The facade is the normal application authoring surface. Use `docs/developer/AUTHORING_BCP.md` for the full policy; this package README keeps the public-package guidance explicit because it is the README most application developers see first.
152
+ Tigrbl is most convenient when application code describes behavior once and lets the framework project that behavior into routes, RPC methods, schemas, docs, lifecycle hooks, diagnostics, tests, and transport-aware runtime plans. The best current practice is to use tables, default canonical operations, operation specs, custom handlers, and lifecycle hooks together instead of spreading one behavior across lower-level framework surfaces. The detailed policy is in [`docs/developer/AUTHORING_BCP.md`](https://github.com/tigrbl/tigrbl/blob/master/docs/developer/AUTHORING_BCP.md).
160
153
 
161
- If you are translating concepts from Starlette, FastAPI, Flask, ASGI 3,
162
- WebSocket, WebTransport, SQLAlchemy, or backend-specific SQL engines, start with
154
+ For readers translating from Starlette, FastAPI, Flask, ASGI 3, WebSocket,
155
+ WebTransport, SQLAlchemy, or database-engine concepts, use
163
156
  [`docs/developer/EQUIVALENCE_INDEX.md`](https://github.com/tigrbl/tigrbl/blob/master/docs/developer/EQUIVALENCE_INDEX.md).
164
- Those guides describe analogous lower-layer concepts while keeping Tigrbl-owned
165
- authoring surfaces as the application contract.
166
-
167
- Do:
168
-
169
- - Do import application-facing classes, decorators, helpers, and shortcuts from `tigrbl` unless you are intentionally maintaining a lower-level package. Why: the facade is the supported application contract and hides lower-layer package splits.
170
- - Do create services with `TigrblApp`, `TigrblRouter`, facade route/operation decorators, table helpers, column helpers, hook decorators, response decorators, schema helpers, and engine decorators. Why: these entry points are visible to runtime planning, docs, diagnostics, schemas, and tests.
171
- - Do model domain actions as Tigrbl operations, including canonical CRUD operations, operation-pack verbs, or explicit custom operation specs. Why: operations are the unit Tigrbl can project consistently across protocol surfaces.
172
- - Do use operation handlers through Tigrbl specs and kernel/runtime dispatch so REST, JSON-RPC, HTTP streams, SSE, WebSocket, WebTransport-aware runtime units, OpenAPI, OpenRPC, diagnostics, schemas, hooks, and tests stay aligned. Why: handler dispatch is where protocol projection and lifecycle guarantees meet.
173
- - Do express field behavior through Tigrbl table, column, datatype, storage, IO, request, response, and operation specs. Why: specs are the shared source for storage lowering, wire schemas, docs, runtime planning, hooks, and diagnostics.
174
- - Do use `get_schema(...)` or schema helpers for operation request/response payloads. Why: generated schemas keep payloads aligned with operation specs and docs.
175
- - Do bind engines declaratively at app, router, table, or operation scope. Why: declarative binding lets the runtime own session selection, transaction scope, diagnostics, and backend-specific behavior.
176
- - Do use lifecycle hooks for policy, validation, enrichment, audit, response shaping, and post-response work. Why: hooks make policy visible to lifecycle ordering, diagnostics, tests, and transport-independent execution.
177
- - Do use `/system/methodz`, `/system/hookz`, `/system/kernelz`, OpenAPI, and OpenRPC to inspect the registered framework state. Why: these surfaces show the compiled Tigrbl state instead of a lower-level framework's partial view.
178
-
179
- Do not:
180
-
181
- - Do not author application endpoints with FastAPI `FastAPI`, `APIRouter`, dependency wiring, route decorators, middleware registration, docs generation, or lifecycle hooks. Why: that makes FastAPI the application contract instead of Tigrbl's operation, binding, hook, schema, docs, and diagnostics contract.
182
- - Do not author application endpoints with Starlette route, request, response, middleware, background-task, or lifecycle classes. Why: Starlette is a lower-level runtime substrate here, not the application-facing authoring surface.
183
- - Do not author application endpoints with Flask `Flask`, `Blueprint`, route decorators, request/response globals, `MethodView`, extension registration, or lifecycle hooks. Why: Flask route objects cannot preserve Tigrbl's shared operation inventory, schema generation, lifecycle phases, or transport plan.
184
- - Do not use raw SQLAlchemy `mapped_column(...)` or `Column(...)` as the primary application authoring surface when Tigrbl column helpers or specs can represent the field behavior. Why: raw ORM declarations are only one lowering target and cannot carry the full storage, IO, validation, docs, hook, and runtime contract.
185
- - Do not build ad-hoc SQLAlchemy engines, sessions, or sessionmakers inside request handlers. Why: ad-hoc construction bypasses declarative engine binding, session policy, pooling, diagnostics, tests, and backend adapters.
186
- - Do not call direct database/session methods such as `flush()` or `commit()` from application hooks or handlers unless you are implementing a framework-level atom with the correct lifecycle guard contract. Why: direct calls bypass lifecycle guards and can commit partial state before hooks, errors, rollback handlers, or response shaping have run.
187
- - Do not wrap model behavior in one-off route handlers when an operation spec can represent the behavior. Why: route wrappers hide behavior from protocol projection, docs, hooks, diagnostics, and tests.
188
- - Do not bypass kernel/runtime plans when wiring REST, JSON-RPC, HTTP stream, SSE, WebSocket, or WebTransport behavior. Why: bypasses skip legality checks, lifecycle phases, transaction ownership, protocol framing policy, and fail-closed unsupported-combination handling.
189
-
190
- Avoid:
191
-
192
- - Avoid treating ASGI, FastAPI, Flask, Starlette, SQLAlchemy ORM materialization, or direct DB methods as the user-facing application contract. Tigrbl owns the authoring contract; lower-level libraries are implementation substrates behind Tigrbl-owned adapters, engines, tests, or benchmarks. Why: lower-level substrates are legal implementation tools, but not the supported application API.
193
- - Avoid duplicating field behavior in SQLAlchemy, Pydantic, docs, and route handlers. Put reusable behavior in Tigrbl specs so storage, schema, docs, runtime, hooks, and diagnostics read the same source. Why: duplicated rules create stale validation, stale docs, and protocol-specific behavior differences.
194
- - Avoid hand-written Pydantic envelopes for payloads that belong to a Tigrbl operation. Why: generated schemas keep request/response payloads aligned with operation specs and docs.
195
- - Avoid transport-specific wrappers for authentication, authorization, validation, or dispatch when security dependencies, hooks, operation specs, or lifecycle phases can express the rule once. Why: transport-layer policy can make REST, JSON-RPC, streams, SSE, WebSocket, and WebTransport disagree about the same domain operation.
196
- - Avoid teaching lower-level internals in application README examples unless the example is clearly marked as a test, benchmark, migration, engine adapter, or framework-internal compatibility surface. Why: examples without a boundary marker become accidental guidance.
157
+ Those guides explain nearby concepts without making lower-layer frameworks the
158
+ Tigrbl application authoring contract.
159
+
160
+ ### Keep the facade as the application contract
161
+
162
+ - Avoid: Treating ASGI, FastAPI, Flask, Starlette, SQLAlchemy ORM materialization, or direct database/session calls as the user-facing application contract.
163
+ - Do: Build application services with `TigrblApp`, `TigrblRouter`, facade decorators, table helpers, column helpers, operation specs, hook specs, binding specs, engine specs, and generated schemas.
164
+ - Why: Tigrbl-owned authoring surfaces are the entry points that runtime planning, docs, diagnostics, schemas, and tests understand.
165
+
166
+ ### Start with tables and default canonical operations
167
+
168
+ - Avoid: Hand-writing endpoint-specific behavior before checking whether table-backed default operations already express it.
169
+ - Do: Model resources with Tigrbl tables and use default canonical operations such as `create`, `read`, `update`, `replace`, `delete`, `list`, and `clear` where they fit.
170
+ - Why: Tables plus canonical operations give Tigrbl a durable resource model that can be projected consistently across REST, JSON-RPC, schemas, docs, hooks, diagnostics, and tests.
171
+
172
+ ### Use operations and custom handlers for domain actions
173
+
174
+ - Avoid: Splitting one domain action across separate REST handlers, JSON-RPC handlers, stream handlers, docs snippets, and protocol-specific wrappers.
175
+ - Do: Model domain actions as Tigrbl operations with operation specs and custom handlers when the default canonical operations are not enough.
176
+ - Why: Operations are the unit Tigrbl can bind, document, inspect, test, and project across protocol surfaces.
177
+
178
+ ### Use lifecycle hooks around operations
179
+
180
+ - Avoid: Embedding lifecycle policy directly inside transport-specific handlers or lower-level framework middleware.
181
+ - Do: Use lifecycle hooks around operations for validation, authorization, enrichment, auditing, response shaping, rollback handling, and post-response work.
182
+ - Why: Hooks make behavior visible before and after the operation, while preserving lifecycle ordering across REST, JSON-RPC, streams, SSE, WebSocket, and WebTransport-aware runtime plans.
183
+
184
+ ### Support persistence and non-persistence operations
185
+
186
+ - Avoid: Assuming every operation or custom handler must be database-backed.
187
+ - Do: Use operations and custom handlers for persistence workflows and for non-persistence workflows such as computed responses, orchestration, control-plane commands, stream/session commands, or external-service actions.
188
+ - Why: The operation model gives both persistence and non-persistence behavior the same docs, hooks, diagnostics, protocol projection, and runtime planning path.
189
+
190
+ ### Put field behavior in Tigrbl specs
191
+
192
+ - Avoid: Duplicating field behavior across SQLAlchemy declarations, Pydantic models, route handlers, and docs.
193
+ - Do: Describe field behavior through Tigrbl tables, `FieldSpec`, `ColumnSpec`, `StorageSpec`, and `IOSpec`.
194
+ - Why: These specs keep field semantics aligned for storage lowering, validation, schemas, docs, hooks, diagnostics, and runtime planning.
195
+
196
+ ### Use generated schemas for operation payloads
197
+
198
+ - Avoid: Hand-written Pydantic envelopes for payloads that belong to a Tigrbl operation.
199
+ - Do: Use `get_schema(...)` or other Tigrbl schema helpers for operation request and response payloads.
200
+ - Why: Generated schemas keep payloads aligned with operation specs, docs, validation, and protocol projections.
201
+
202
+ ### Keep engines and transactions declarative
203
+
204
+ - Avoid: Creating ad-hoc SQLAlchemy engines, sessions, sessionmakers, commits, or flushes inside application handlers.
205
+ - Do: Bind engines declaratively at app, router, table, or operation scope, and let kernel/runtime phases own dispatch and transaction progression.
206
+ - Why: Declarative binding lets the runtime own session selection, transaction scope, rollback behavior, pooling, diagnostics, backend adapters, and post-response work.
207
+
208
+ ### Keep examples in Tigrbl style
209
+
210
+ - Avoid: README examples that present lower-level framework internals as normal application style.
211
+ - Do: Use Tigrbl facade imports and Tigrbl-owned authoring surfaces in application examples unless the example is explicitly marked as a lower-layer test, benchmark, migration, engine adapter, or framework-internal compatibility example.
212
+ - Why: Examples should show the framework path that keeps operations, schemas, docs, hooks, diagnostics, and runtime planning aligned.
213
+
214
+ ### Keep workspace docs in their right lanes
215
+
216
+ - Avoid: Using the root README as the only documentation for a distributable package.
217
+ - Do: Use package-local README files to explain package boundaries, install targets, import roots, dependency surfaces, usage examples, and links to governed docs.
218
+ - Why: The root README orients the workspace, while package READMEs serve PyPI users who arrive at one install target.
219
+
220
+ ### Do not wire endpoints around the operation plan
221
+
222
+ - Do not: Bypass operation specs, handlers, kernel plans, runtime atoms, or lifecycle phases with one-off route wrappers for REST, JSON-RPC, HTTP stream, SSE, WebSocket, or WebTransport behavior.
223
+ - Do: Define the operation once, bind it through Tigrbl specs, and let kernel/runtime planning own protocol dispatch.
224
+ - Why: This preserves legality checks, lifecycle phases, transaction ownership, protocol framing policy, and fail-closed unsupported-combination handling.
225
+
226
+ ### Do not make lower-level frameworks the application surface
227
+
228
+ - Do not: Author Tigrbl application endpoints with FastAPI `FastAPI`, `APIRouter`, dependency wiring, route decorators, middleware registration, docs generation, or application lifecycle wiring.
229
+ - Do: Use Tigrbl app/router factories, decorators, tables, default canonical operations, operation specs, custom handlers, lifecycle hooks, schema helpers, and engine decorators.
230
+ - Why: FastAPI is a substrate here; Tigrbl is the application contract that keeps operations, bindings, hooks, schemas, docs, diagnostics, and tests together.
231
+
232
+ ### Do not route around the runtime substrate boundary
233
+
234
+ - Do not: Author application endpoints directly with Starlette route, request, response, middleware, background-task, or application lifecycle classes.
235
+ - Do: Express application behavior through Tigrbl operations, bindings, lifecycle hooks, and runtime-managed execution.
236
+ - Why: Starlette is a lower-level runtime substrate here, not the application-facing authoring surface.
237
+
238
+ ### Do not fragment behavior into Flask route objects
239
+
240
+ - Do not: Author application endpoints with Flask `Flask`, `Blueprint`, route decorators, request/response globals, `MethodView`, extension registration, or application lifecycle hooks.
241
+ - Do: Keep resources in tables, use default canonical operations where they fit, and use operation specs plus custom handlers for domain actions.
242
+ - Why: Flask route objects cannot preserve Tigrbl's shared operation inventory, schema generation, lifecycle phases, hook ordering, or transport plan.
243
+
244
+ ### Do not use raw ORM declarations as the primary application model
245
+
246
+ - Do not: Use raw SQLAlchemy `mapped_column(...)` or `Column(...)` as the primary application authoring surface when Tigrbl specs can represent the field behavior.
247
+ - Do: Describe field behavior through Tigrbl tables, `FieldSpec`, `ColumnSpec`, `StorageSpec`, and `IOSpec`.
248
+ - Why: Raw ORM declarations are only one lowering target and cannot carry the full storage, IO, validation, docs, hook, and runtime contract.
249
+
250
+ ### Do not manage database state inside handlers
251
+
252
+ - Do not: Call direct database/session methods such as `flush()` or `commit()` from application hooks or handlers.
253
+ - Do: Let lifecycle phases such as `START_TX`, `PRE_HANDLER`, `HANDLER`, `POST_HANDLER`, `PRE_COMMIT`, and `TX_COMMIT` own transaction progression.
254
+ - Why: Direct calls bypass lifecycle guards and can commit partial state before hooks, errors, rollback handlers, or response shaping have run.
255
+
256
+ ### Do not blur package boundaries
257
+
258
+ - Do not: Widen a package boundary by adding dependencies, imports, examples, or docs that belong in another split package.
259
+ - Do: Keep facade guidance in `tigrbl`, framework internals in the lower-level packages that own them, and package-specific usage in package-local READMEs.
260
+ - Why: Clear package boundaries make the split distribution convenient instead of surprising, especially for users installing only one package.
261
+
262
+ ### Keep release and certification claims governed
263
+
264
+ - Avoid: Duplicating release, certification, target-state, or conformance claims outside governed evidence records.
265
+ - Do: Use `.ssot/`, conformance docs, release evidence, and certification reports for governed feature, claim, release, evidence, and target-state questions.
266
+ - Why: Release status and proof chains need one source of truth so package docs do not drift from CI and certification evidence.
197
267
 
198
268
  ## Default CRUD and Operation Semantics
199
269
 
@@ -451,6 +521,14 @@ Choose `tigrbl` when you want the full public facade: app composition, schema-fi
451
521
 
452
522
  This file is a package-local distribution entry point. This README is the package-local distribution entry point for `tigrbl`. It answers install, usage, API, ownership, and certification-orientation questions for this package. Broader architectural decisions, release status, and cross-package proof chains remain in the repository-level docs and SSOT registry.
453
523
 
524
+ ## Certification Status
525
+
526
+ - Package status: governed package in the `tigrbl/tigrbl` workspace.
527
+ - Governance source: [SSOT registry](https://github.com/tigrbl/tigrbl/blob/master/.ssot/registry.json).
528
+ - Release evidence: [publish workflow](https://github.com/tigrbl/tigrbl/actions/workflows/publish.yml) validates package builds, tests, GitHub release assets, and PyPI publication for managed packages.
529
+ - Local certification guard: `pkgs/core/tigrbl_tests/tests/unit/test_package_badges_and_notices.py` verifies every package README keeps the Discord badge, Apache 2.0 badge, explicit Python-version badge, `LICENSE`, and `NOTICE`.
530
+ - Scope note: this README documents the package boundary. Runtime feature support remains governed by `.ssot/` entities and the conformance docs linked below.
531
+
454
532
  ## License
455
533
 
456
534
  Licensed under the Apache License, Version 2.0. See `LICENSE`, `NOTICE`, and the official [Apache 2.0 license text](https://www.apache.org/licenses/LICENSE-2.0).
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "tigrbl"
3
- version = "0.4.4.dev7"
3
+ version = "0.4.5.dev1"
4
4
  description = "Schema-first ASGI framework for REST, JSON-RPC, streaming, SSE, WebSocket, runtime plans, hooks, diagnostics, and engine plugins."
5
5
  readme = "README.md"
6
6
  license = { file = "LICENSE" }
File without changes
File without changes
File without changes
File without changes