Onboard tenant-engine to the staged-promotion contract
All checks were successful
Build and Publish Container Image / build-and-push (push) Successful in 50s

TEN-WP-0008. railiance/app.toml declares criticality=high, empty secrets,
isolated canary, and the live PostgreSQL digest as previous_stable.
Manifests render through kustomize (deploy/ and deploy/canary/). Stage 1
passed. Stage 2/3 Helm-only CLI gap requested as RAIL-BS-IN-0001 rather
than a dummy chart.

Assistant: grok
Assistant-Session: 01a04cea-e5e8-7081-a0fc-808ebbc35fa9
This commit is contained in:
tegwick 2026-08-29 14:51:27 +02:00
parent f9f8e0c54f
commit 6644ad8402
19 changed files with 1053 additions and 18 deletions

View file

@ -0,0 +1,85 @@
{
"actions": [],
"app": {
"criticality": "high",
"id": "tenant-engine",
"name": "tenant-engine",
"owner": "infotech",
"repo": "tenant-engine"
},
"app_dir": "/home/worsch/tenant-engine",
"approval_id": null,
"chart": "/home/worsch/tenant-engine/charts/tenant-engine",
"checks_expected": [
"stage2-accepted",
"rollback-target",
"cluster-health",
"operator-approval"
],
"contract": "/home/worsch/tenant-engine/railiance/app.toml",
"evidence_expected": [
"promotion commit",
"new stable digest in previous_stable and deploy/base/tenant-engine.yaml",
"post-promotion make verify-pin"
],
"generated_at": "2026-08-29T12:49:54Z",
"mode": "plan",
"namespace": "tenant-engine",
"planned_actions": [
{
"action_ref": "stage3.helm-rollback",
"namespace": "tenant-engine",
"release": "tenant-engine",
"revision": null,
"tool": "helm"
}
],
"prechecks": [
{
"name": "app.toml",
"required": true,
"status": "passed"
},
{
"detail": "image-digest",
"name": "rollback-strategy",
"required": true,
"status": "passed"
},
{
"detail": "plan mode does not execute helm",
"name": "helm",
"required": false,
"status": "not_required"
},
{
"name": "approval-id",
"required": false,
"status": "required_before_apply"
}
],
"previous_stable": "tenant-engine@sha256:a8e8086ffc5b772c1391b166f5e1884b90f7d327b152c205eceae129df555c24",
"promotion_mode": "release-replace",
"release": "tenant-engine",
"requires_approval": true,
"revision": null,
"rollback": {
"command_ref": "rollback.command",
"strategy": "image-digest",
"verification": "make verify-pin agrees repo, spec, and running pod; GET /health returns\n200 with store_backend=postgresql; lifecycle routes still present.\nDo not roll back to sha256:7dc9d7bf1fcbb3f3ad7035366f4cd44038322995a126b4423142e446ca5c9cd5\n(SQLite/PVC) after any PostgreSQL write. The TEN-WP-0007 ladder still\nholds for older images: rolling past a pre-lifecycle digest removes\nGET/PATCH/retire/reactivate that user-engine depends on.\n"
},
"schema_version": "railiance.stage3-rollback-result.v1",
"source": {
"artifact": "image",
"digest_policy": "required",
"revision": "git:main"
},
"stage": "stage3",
"status": "planned",
"summary": {
"actions_failed": 0,
"actions_total": 0,
"required_prechecks_failed": 0
},
"values": "/home/worsch/tenant-engine/values/stage3-production.yaml"
}

View file

@ -0,0 +1,116 @@
{
"app": {
"criticality": "high",
"id": "tenant-engine",
"name": "tenant-engine",
"owner": "infotech",
"repo": "tenant-engine"
},
"app_dir": "/home/worsch/tenant-engine",
"checks": [
{
"command_ref": "checks.unit-tests.command",
"duration_seconds": 78.242,
"exit_code": 0,
"id": "unit-tests",
"required": true,
"status": "passed",
"stderr_bytes": 0,
"stdout_bytes": 2453,
"type": "command"
},
{
"command_ref": "checks.contract-schema.command",
"duration_seconds": 1.703,
"exit_code": 0,
"id": "contract-schema",
"required": true,
"status": "passed",
"stderr_bytes": 0,
"stdout_bytes": 144,
"type": "command"
},
{
"command_ref": "checks.kustomize-production.command",
"duration_seconds": 1.021,
"exit_code": 0,
"id": "kustomize-production",
"required": true,
"status": "passed",
"stderr_bytes": 0,
"stdout_bytes": 4028,
"type": "command"
},
{
"command_ref": "checks.kustomize-canary.command",
"duration_seconds": 1.215,
"exit_code": 0,
"id": "kustomize-canary",
"required": true,
"status": "passed",
"stderr_bytes": 0,
"stdout_bytes": 3839,
"type": "command"
}
],
"commands": [
{
"command_ref": "stages.stage1.commands[0]",
"duration_seconds": 69.439,
"exit_code": 0,
"status": "passed",
"stderr_bytes": 0,
"stdout_bytes": 2453
},
{
"command_ref": "stages.stage1.commands[1]",
"duration_seconds": 1.526,
"exit_code": 0,
"status": "passed",
"stderr_bytes": 0,
"stdout_bytes": 144
},
{
"command_ref": "stages.stage1.commands[2]",
"duration_seconds": 1.48,
"exit_code": 0,
"status": "passed",
"stderr_bytes": 0,
"stdout_bytes": 4028
},
{
"command_ref": "stages.stage1.commands[3]",
"duration_seconds": 1.248,
"exit_code": 0,
"status": "passed",
"stderr_bytes": 0,
"stdout_bytes": 3839
}
],
"contract": "/home/worsch/tenant-engine/railiance/app.toml",
"duration_seconds": 155.875,
"evidence_expected": [
"pytest output",
"app.toml schema validation",
"kustomize render of deploy/ and deploy/canary"
],
"finished_at": "2026-08-29T12:49:41Z",
"namespace": "local",
"release": "tenant-engine-local",
"requires_approval": false,
"schema_version": "railiance.run-result.v1",
"source": {
"artifact": "image",
"digest_policy": "required",
"revision": "git:main"
},
"stage": "stage1",
"started_at": "2026-08-29T12:46:51Z",
"status": "passed",
"summary": {
"checks_total": 4,
"commands_failed": 0,
"commands_total": 4,
"required_checks_failed": 0
}
}

View file

@ -0,0 +1,87 @@
{
"actions": [],
"app": {
"criticality": "high",
"id": "tenant-engine",
"name": "tenant-engine",
"owner": "infotech",
"repo": "tenant-engine"
},
"app_dir": "/home/worsch/tenant-engine",
"approval_id": null,
"canary_mode": "isolated",
"chart": "/home/worsch/tenant-engine/charts/tenant-engine",
"checks_expected": [
"server-dry-run",
"canary-ready",
"canary-health",
"operator-approval"
],
"contract": "/home/worsch/tenant-engine/railiance/app.toml",
"evidence_expected": [
"server-side dry-run of isolated canary",
"deploy/tenant-engine-canary Available",
"canary /health 200",
"State Hub approval id"
],
"generated_at": "2026-08-29T12:49:53Z",
"mode": "plan",
"namespace": "tenant-engine",
"observation_minutes": 15,
"planned_actions": [
{
"action_ref": "stage2.helm",
"chart": "/home/worsch/tenant-engine/charts/tenant-engine",
"mode": "plan",
"namespace": "tenant-engine",
"release": "tenant-engine-canary",
"tool": "helm",
"values": "/home/worsch/tenant-engine/values/stage2-canary.yaml"
}
],
"prechecks": [
{
"name": "app.toml",
"required": true,
"status": "passed"
},
{
"detail": "no Stage 2 helm check declared",
"name": "stage2-helm-check",
"required": true,
"status": "failed"
},
{
"detail": "plan mode does not execute helm",
"name": "helm",
"required": false,
"status": "not_required"
},
{
"name": "approval-id",
"required": false,
"status": "required_before_apply"
},
{
"name": "stage1-result",
"required": false,
"status": "recommended_before_apply"
}
],
"release": "tenant-engine-canary",
"requires_approval": true,
"schema_version": "railiance.stage2-deploy-result.v1",
"source": {
"artifact": "image",
"digest_policy": "required",
"revision": "git:main"
},
"stage": "stage2",
"status": "blocked",
"summary": {
"actions_failed": 0,
"actions_total": 0,
"required_prechecks_failed": 1
},
"values": "/home/worsch/tenant-engine/values/stage2-canary.yaml"
}

View file

@ -0,0 +1,92 @@
{
"actions": [],
"app": {
"criticality": "high",
"id": "tenant-engine",
"name": "tenant-engine",
"owner": "infotech",
"repo": "tenant-engine"
},
"app_dir": "/home/worsch/tenant-engine",
"approval_id": null,
"chart": "/home/worsch/tenant-engine/charts/tenant-engine",
"checks_expected": [
"stage2-accepted",
"rollback-target",
"cluster-health",
"operator-approval"
],
"contract": "/home/worsch/tenant-engine/railiance/app.toml",
"evidence_expected": [
"promotion commit",
"new stable digest in previous_stable and deploy/base/tenant-engine.yaml",
"post-promotion make verify-pin"
],
"generated_at": "2026-08-29T12:49:53Z",
"mode": "plan",
"namespace": "tenant-engine",
"planned_actions": [
{
"action_ref": "stage3.helm-promote",
"chart": "/home/worsch/tenant-engine/charts/tenant-engine",
"namespace": "tenant-engine",
"release": "tenant-engine",
"tool": "helm",
"values": "/home/worsch/tenant-engine/values/stage3-production.yaml"
}
],
"prechecks": [
{
"name": "app.toml",
"required": true,
"status": "passed"
},
{
"detail": "/home/worsch/tenant-engine/charts/tenant-engine",
"name": "stage3-chart",
"required": true,
"status": "failed"
},
{
"detail": "/home/worsch/tenant-engine/values/stage3-production.yaml",
"name": "stage3-values",
"required": true,
"status": "failed"
},
{
"detail": "Stage 3 must record the rollback target before promotion",
"name": "previous-stable",
"required": true,
"status": "passed"
},
{
"detail": "plan mode does not execute helm",
"name": "helm",
"required": false,
"status": "not_required"
},
{
"name": "approval-id",
"required": false,
"status": "required_before_apply"
}
],
"previous_stable": "tenant-engine@sha256:a8e8086ffc5b772c1391b166f5e1884b90f7d327b152c205eceae129df555c24",
"promotion_mode": "release-replace",
"release": "tenant-engine",
"requires_approval": true,
"schema_version": "railiance.stage3-promote-result.v1",
"source": {
"artifact": "image",
"digest_policy": "required",
"revision": "git:main"
},
"stage": "stage3",
"status": "blocked",
"summary": {
"actions_failed": 0,
"actions_total": 0,
"required_prechecks_failed": 2
},
"values": "/home/worsch/tenant-engine/values/stage3-production.yaml"
}