You need to sign in before continuing.
  • The previous docs commit fixed README + CLAUDE + the three "scope note"
    guides but explicitly left the deeper how-to docs as-is, claiming the
    architecture hadn't changed. That was wrong on closer reading: those
    docs still described the pre-single-tenant world (tenant_id columns,
    two-wall isolation, per-tenant routing) and the pre-implementation
    plug-in API (class-based @PluginEndpoint controllers, ResponseBuilder,
    context.log instead of context.logger, plugin.yml entryClass field).
    A reader following any of those guides would write code that doesn't
    compile.
    
    This commit aligns them with what the framework actually does today.
    
    What changed:
    
    * docs/architecture/overview.md
      - Guardrail #5 rewritten from "Multi-tenant in spirit from day one"
        to "Single-tenant per instance, isolated database" matching
        CLAUDE.md.
      - The api.v1 package layout updated to match the actual current
        surface: dropped `Tenant`, added `PrincipalId`,
        `PersistenceExceptions`, the full plug-in package
        (PluginContext, PluginEndpointRegistrar, PluginRequest/Response,
        PluginJdbc, PluginRow), and the two live cross-PBC facades
        (IdentityApi, CatalogApi).
      - The whole "Multi-tenancy" section replaced with
        "Single-tenant per instance" — drops the two-wall framing,
        drops per-region routing, drops tenant_id columns and RLS.
        The single-tenant rationale is explained in line with the
        rest of the framework.
      - Custom fields and metadata store sections drop "per tenant"
        and tenant_id from their column lists.
      - Audit row in the cross-cutting table drops tenant_id from
        the column list and adds the PrincipalContext bridge note
        that's actually live as of P4.1.
      - "Tier 1 — Key user, no-code" intro drops "scoped to their tenant".
    
    * docs/plugin-api/overview.md
      - api.v1 package layout updated to match the real current surface
        (same set of additions and deletions as the architecture
        overview).
      - Per-package orientation table rewritten to describe what is
        actually in each package today, including which parts are
        live (event/, plugin/, http/) and which are stubbed (i18n/,
        workflow/, form/) with the relevant implementation-plan unit
        referenced.
    
    * docs/plugin-author/getting-started.md — full rewrite. The previous
      version walked an author through APIs that don't exist:
        • `Plugin.start(context: PluginContext)` and
          `Plugin.stop(context: PluginContext)` — actual API is
          `start(context)` and `stop()` (no arg), with the Pf4jPlugin +
          VibeErpPlugin dual-supertype trick using import aliases.
        • `context.log` — actual is `context.logger` (PluginLogger
          interface).
        • `plugin.yml` with `entryClass:` field and a structured
          `metadata.i18n:` subkey — actual schema has no entryClass
          (PF4J reads `Plugin-Class` from MANIFEST.MF) and `metadata:`
          is a flat list of paths.
        • Class-based `@PluginEndpoint` controllers with `ResponseBuilder`
          — actual is lambda-based registration via
          `context.endpoints.register(method, path, handler)` returning
          `PluginResponse`.
        • `request.translator.format(...)` — translator currently
          throws UnsupportedOperationException; the example would crash.
    
      The new version walks through:
        1. The compileOnly api.v1 + pf4j dependency setup.
        2. The dual-supertype Pf4jPlugin + VibeErpPlugin trick with
           import aliases (matches the actual reference plug-in).
        3. The real JAR layout (META-INF/MANIFEST.MF for PF4J,
           plugin.yml for human metadata, META-INF/vibe-erp/db/changelog.xml
           for Liquibase, META-INF/vibe-erp/metadata/<id>.yml for the
           metadata loader).
        4. Liquibase changelog at the unique META-INF path (not the
           host's `db/changelog/master.xml` path which would collide
           on parent-first classloader lookup — the bug we hit and
           fixed in commit 1ead32d7).
        5. Lambda-based endpoint registration with real working
           examples (path templates, queryForObject, update, JSON
           body parsing).
        6. Metadata YAML shape matching what MetadataLoader actually
           parses.
        7. The boot-log sequence the operator will see, taken from
           a real smoke run.
        8. An honest "what this guide does not yet cover" list with
           implementation-plan unit references.
    
    * docs/i18n/guide.md
      - Added a "Status" callout at the top: the api.v1 contract is
        locked, the ICU4J implementation is P1.6 and not yet wired,
        `context.translator` currently throws.
      - Bundle filename convention corrected from `<locale>.properties`
        to `messages_<locale>.properties` (matches what the reference
        plug-in actually ships).
      - plugin.yml example updated to show the flat `metadata:` array
        that PluginManifest actually parses (the previous structured
        `metadata.i18n:` subkey doesn't exist in the schema).
      - Merge precedence renamed "tenant overrides" → "operator
        overrides" since vibe_erp is single-tenant per instance.
      - LocaleProvider resolution chain updated to drop "tenant default"
        and reference `vibeerp.i18n.default-locale` configuration.
      - "Time zones are per-tenant" → "per-user with an instance default".
      - Locale-add reference to "i18n-overrides volume" annotated as
        "once P1.6 lands".
    
    * docs/customer-onboarding/guide.md
      - Section 3 "Create a tenant" deleted; replaced with
        "Configure the instance" pointing at vibeerp.instance.* config.
      - First-boot bullet list rewritten to drop the bogus
        "create default tenant row in identity__tenant" step (no such
        table) and add the real metadata-loader and per-plug-in lifecycle
        steps that happen.
      - Mounted-volume table updated: `i18n-overrides/` is "operator
        translation overrides", not "tenant-level".
      - "Bind users to roles, bind roles to tenants" simplified;
        OIDC group claims annotated as P4.2 (not yet wired).
      - Go-live checklist drops "non-production tenant" wording and
        "tenant locale defaults" (now instance-level config).
      - "Hosted multi-tenant operations" deferred-list item rewritten
        to "hosted operations: provisioning many independent vibe_erp
        instances", matching the new single-tenant deployment model.
    
    * docs/form-authoring/guide.md
      - Tier 1 section drops "scoped to the tenant",
        "tweaking for a specific tenant", "tenant-specific custom field".
    
    * docs/workflow-authoring/guide.md
      - "Approval chains that vary per tenant" → "Approval chains the
        customer wants to author themselves".
    
    * docs/index.md
      - Architecture overview row description updated from
        "multi-tenancy" to "single-tenant deployment model".
      - i18n guide row description updated from "tenant overrides"
        to "operator overrides".
    
    Build: ./gradlew build still green (no source touched).
    
    The remaining `tenant` references in docs are now ALL intentional —
    they appear in sentences like "vibe_erp is single-tenant per instance",
    "there is no create-a-tenant step", "no per-tenant bundles". The
    historical specs under docs/superpowers/specs/ were intentionally
    NOT touched: those are dated design records, and the implementation
    plan already had the single-tenant refactor noted at the top.
    vibe_erp authored
     
    Browse Code »
  • The README and CLAUDE.md "Repository state" sections were both stale —
    they still claimed "v0.1 skeleton, one PBC implemented" and "no source
    code yet" when in reality the framework is at v0.6+P1.5 with 92 unit
    tests, 11 modules, 7 cross-cutting platform services live, 2 PBCs, and
    a real customer-style plug-in serving HTTP from its own DB tables.
    
    What landed:
    
    * New PROGRESS.md at the repo root. Single-page progress tracker that
      enumerates every implementation-plan unit (P1.x, P2.x, P3.x, P4.x,
      P5.x, R, REF.x, H/A/M.x) with status badges, commit refs for the
      done units, and the "next priority" call. Includes a snapshot table
      (modules / tests / PBCs / plug-ins / cross-cutting services), a
      "what's live right now" table per service, a "what the reference
      plug-in proves end-to-end" walkthrough, the "what's not yet live"
      deferred list, and a "how to run what exists today" runbook.
    
    * README.md "Building" + "Status" rewritten. Drops the obsolete
      "v0.1 skeleton" claim. New status table shows current counts.
      Adds the dev workflow (`installToDev` → `bootRun`) and points at
      PROGRESS.md for the per-feature view.
    
    * CLAUDE.md "Repository state" section rewritten from "no source
      code, build system, package manifest, test suite, or CI yet" to
      the actual current state: 11 subprojects, 92 tests, 7 services
      live, 2 PBCs, build commands, package root, and a pointer at
      PROGRESS.md.
    
    * docs/customer-onboarding/guide.md, docs/workflow-authoring/guide.md,
      docs/form-authoring/guide.md: replaced "v0.1: API only" annotations
      with "current: API only". The version label was conflating
      "the v0.1 skeleton" with "the current build" — accurate in spirit
      (the UI layer still hasn't shipped) but misleading when readers
      see the framework is on commit 18, not commit 1. Pointed each
      guide at PROGRESS.md for live status.
    
    Build: ./gradlew build still green (no source touched, but verified
    that nothing in the docs change broke anything).
    
    The deeper how-to docs (architecture/overview.md, plugin-api/overview.md,
    plugin-author/getting-started.md, i18n/guide.md, docs/index.md) were
    left as-is. They describe HOW the framework is supposed to work
    architecturally, and the architecture has not changed. Only the
    status / version / scope statements needed updating.
    vibe_erp authored
     
    Browse Code »