diff --git a/WORK-RECORDS.md b/WORK-RECORDS.md index e1034b8..ab79090 100644 --- a/WORK-RECORDS.md +++ b/WORK-RECORDS.md @@ -18,7 +18,7 @@ | workplan | TREV-WP-0008 | finished | — | workplans/TREV-WP-0008-governance-and-pilot-rollout.md | | workplan | TREV-WP-0009 | finished | — | workplans/TREV-WP-0009-target-revenue-control-plane.md | | workplan | TREV-WP-0010 | finished | — | workplans/TREV-WP-0010-development-effort-calculator.md | -| workplan | TREV-WP-0011 | active | — | workplans/TREV-WP-0011-railiance-reef-deployment.md | +| workplan | TREV-WP-0011 | finished | — | workplans/TREV-WP-0011-railiance-reef-deployment.md | | workplan | TREV-WP-0012 | finished | — | workplans/TREV-WP-0012-phase-provenance-and-policy-modeling.md | | workplan | TREV-WP-0013 | finished | — | workplans/TREV-WP-0013-remission-credit-automation.md | | workplan | TREV-WP-0014 | finished | — | workplans/TREV-WP-0014-control-plane-extensions-breach-attestation-ui.md | @@ -90,7 +90,7 @@ | task | TREV-WP-0011-T02 | done | — | workplans/TREV-WP-0011-railiance-reef-deployment.md | | task | TREV-WP-0011-T03 | done | — | workplans/TREV-WP-0011-railiance-reef-deployment.md | | task | TREV-WP-0011-T04 | done | — | workplans/TREV-WP-0011-railiance-reef-deployment.md | -| task | TREV-WP-0011-T05 | todo | — | workplans/TREV-WP-0011-railiance-reef-deployment.md | +| task | TREV-WP-0011-T05 | done | — | workplans/TREV-WP-0011-railiance-reef-deployment.md | | task | TREV-WP-0012-T01 | done | — | workplans/TREV-WP-0012-phase-provenance-and-policy-modeling.md | | task | TREV-WP-0012-T02 | done | — | workplans/TREV-WP-0012-phase-provenance-and-policy-modeling.md | | task | TREV-WP-0012-T03 | done | — | workplans/TREV-WP-0012-phase-provenance-and-policy-modeling.md | diff --git a/docs/deployment.md b/docs/deployment.md index 0f40c18..9cfef68 100644 --- a/docs/deployment.md +++ b/docs/deployment.md @@ -41,8 +41,19 @@ Coulombcore ArgoCD Application exists for future multi-cluster sync but was `platform/workloads/target-revenue/runtime-secrets` (signing key, session secret, DSNs). 4. **Image:** `docker build/push …:0.1.1` (0.1.0 had schema-path bug; fixed). 5. **`kubectl apply -k k8s/railiance/`** on railiance01. -6. **Founding token:** bootstrap Job log → - `~/.config/target-revenue/revenue-coulomb-binky.token` (chmod 600; never commit). +6. **Founding token:** bootstrap Job mints `founding-admin`. Canonical copy + lives in OpenBao (never commit): + + ```text + platform/operators/founding-admin/revenue + fields: token, credential_label, licensor_id, rights, host, ... + ``` + + ```bash + bao kv get -mount=platform operators/founding-admin/revenue + ``` + + Optional local cache: `~/.config/target-revenue/revenue-coulomb-binky.token`. 7. **Phase POR:** re-registered `trsl:phase:info-tech-canon-service-surface` on the public API; local `trf-pilot-pg` is superseded (ledger was empty, so no entry migration). diff --git a/k8s/railiance/bootstrap-job.yaml b/k8s/railiance/bootstrap-job.yaml index 4f76169..aef4999 100644 --- a/k8s/railiance/bootstrap-job.yaml +++ b/k8s/railiance/bootstrap-job.yaml @@ -30,7 +30,7 @@ spec: fsGroup: 10001 containers: - name: bootstrap - image: forgejo.coulomb.social/coulomb/target-revenue:0.1.1 + image: forgejo.coulomb.social/coulomb/target-revenue:0.1.3 imagePullPolicy: IfNotPresent env: - name: TRF_BOOTSTRAP_BINKY diff --git a/k8s/railiance/deployment.yaml b/k8s/railiance/deployment.yaml index 2ab4302..7c37cab 100644 --- a/k8s/railiance/deployment.yaml +++ b/k8s/railiance/deployment.yaml @@ -25,7 +25,7 @@ spec: fsGroup: 10001 containers: - name: target-revenue - image: forgejo.coulomb.social/coulomb/target-revenue:0.1.1 + image: forgejo.coulomb.social/coulomb/target-revenue:0.1.3 imagePullPolicy: IfNotPresent ports: - name: http diff --git a/k8s/railiance/migrate-job.yaml b/k8s/railiance/migrate-job.yaml index 80b38e2..ff8f1c1 100644 --- a/k8s/railiance/migrate-job.yaml +++ b/k8s/railiance/migrate-job.yaml @@ -28,7 +28,7 @@ spec: fsGroup: 10001 containers: - name: migrate - image: forgejo.coulomb.social/coulomb/target-revenue:0.1.1 + image: forgejo.coulomb.social/coulomb/target-revenue:0.1.3 imagePullPolicy: IfNotPresent env: - name: TRF_RUN_MIGRATIONS diff --git a/src/target_revenue/service/combined.py b/src/target_revenue/service/combined.py index f59bf3c..e61baa0 100644 --- a/src/target_revenue/service/combined.py +++ b/src/target_revenue/service/combined.py @@ -15,6 +15,7 @@ default so a single Service port works without Traefik strip-prefix. from __future__ import annotations from fastapi import FastAPI +from fastapi.responses import RedirectResponse from .app import app as trust_service_app from .control_plane_app import app as control_plane_app @@ -27,6 +28,12 @@ def healthz() -> dict[str, str]: return {"status": "ok"} +@app.get("/ui") +def ui_no_trailing_slash() -> RedirectResponse: + """Browsers often hit /ui without a trailing slash; the mount needs /ui/.""" + return RedirectResponse(url="/ui/", status_code=307) + + # More specific mount first. app.mount("/ui", control_plane_app) app.mount("/", trust_service_app) diff --git a/src/target_revenue/service/control_plane_app.py b/src/target_revenue/service/control_plane_app.py index 402d646..2063317 100644 --- a/src/target_revenue/service/control_plane_app.py +++ b/src/target_revenue/service/control_plane_app.py @@ -166,11 +166,22 @@ def login_submit( token: str = Form(...), conn: Connection = Depends(get_connection), ): + # OpenBao / password-manager paste often includes trailing newlines or quotes. + cleaned = token.strip().strip('"').strip("'").strip() + if not cleaned: + return _redirect("/login", request, "Credential token is required.", "danger") try: - registry.authenticate(conn, token) + registry.authenticate(conn, cleaned) except registry.RegistrationError: - return _redirect("/login", request, "Invalid or revoked credential token.", "danger") - request.session["token"] = token + return _redirect( + "/login", + request, + "Invalid or revoked credential token. Use field `token` from " + "OpenBao path platform/operators/founding-admin/revenue " + "(not a runtime DSN or signing key).", + "danger", + ) + request.session["token"] = cleaned return _redirect("/", request) diff --git a/src/target_revenue/service/control_plane_templates/admin_credentials.html b/src/target_revenue/service/control_plane_templates/admin_credentials.html index f5c1f3f..d4a08fb 100644 --- a/src/target_revenue/service/control_plane_templates/admin_credentials.html +++ b/src/target_revenue/service/control_plane_templates/admin_credentials.html @@ -13,26 +13,26 @@ {% endif %}