Onboard tenant-engine to the staged-promotion contract
All checks were successful
Build and Publish Container Image / build-and-push (push) Successful in 50s
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:
parent
f9f8e0c54f
commit
6644ad8402
19 changed files with 1053 additions and 18 deletions
85
docs/evidence/TEN-WP-0008-rollback-plan.json
Normal file
85
docs/evidence/TEN-WP-0008-rollback-plan.json
Normal 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"
|
||||
}
|
||||
116
docs/evidence/TEN-WP-0008-stage1-result.json
Normal file
116
docs/evidence/TEN-WP-0008-stage1-result.json
Normal 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
|
||||
}
|
||||
}
|
||||
87
docs/evidence/TEN-WP-0008-stage2-plan.json
Normal file
87
docs/evidence/TEN-WP-0008-stage2-plan.json
Normal 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"
|
||||
}
|
||||
92
docs/evidence/TEN-WP-0008-stage3-plan.json
Normal file
92
docs/evidence/TEN-WP-0008-stage3-plan.json
Normal 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"
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue