Repository navigation
Conversation
|
Important
This repository does not receive automatic reviews because it has fewer than 10 stars.
|
This was referenced Oct 12, 2026
Closed
lokewate
added a commit
to OpenNSW/nsw-srilanka
that referenced
this pull request
Oct 12, 2026
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
lokewate
force-pushed
the
feat/manifest-pinned-flows
branch
from
October 20, 2026 08:13
9bf9682 to
ba293b8
Compare
lokewate
added a commit
to OpenNSW/nsw-srilanka
that referenced
this pull request
Oct 20, 2026
Artifacts are published as manifest_v1.json, manifest_v2.json, … (core artifact.Set). A published manifest and its files never change; a change is a new file and a new manifest. Each flow records the version current when it started and resolves every template through it, so a deploy never changes the templates of a running flow. - Bootstrap loads every manifest and makes the highest current, or the one artifacts.manifestVersion pins. Unless artifacts.skipStartupValidation is set, it fetches every artifact of the current manifest and checks it parses and points only at listed artifacts: core's kinds (including render configs' section templates), task_config, static_data, and the templates step templates' notification extensions name. A broken manifest stops the deploy. - caseflow records the current version on the case_flows row and starts the flow with workflow.VarManifestVersion. A retry of a recorded flow resumes on its recorded version before the current manifest is consulted, so it still starts when the current manifest dropped its template. Only a new flow is checked against the current manifest. - Agency inject does the same on agency_workflow, and the officer case view reads each workflow's task_config from its own version. - The definition handler resolves a split's branch workflows in the calling workflow's version, and the template provider (form rendering, notification templates) resolves through the version core puts on the context. Without one it fails rather than fall back to the current version. - Static data is fetched by explicit version, from whichever manifest lists it. - Consignment flow listings name each flow from its own version. - The example configs and helm values read GitHub through the raw-content host: startup validation fetches every artifact, more than the unauthenticated REST limit allows. The replay harness skips startup validation, since every replay builds its own app. - go.mod pins core to the head of OpenNSW/core#306 until it merges. BREAKING CHANGE: the artifact source must publish manifest_v1.json in place of manifest.json. Migration 000025 adds manifest_version to case_flows, agency_workflow and task_records_v2. Flows started before it have no version and fail their next task. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
lokewate
added a commit
to OpenNSW/nsw-srilanka
that referenced
this pull request
Oct 20, 2026
Artifacts are published as manifest_v1.json, manifest_v2.json, … (core artifact.Set). A published manifest and its files never change; a change is a new file and a new manifest. Each flow records the version current when it started and resolves every template through it, so a deploy never changes the templates of a running flow. - Bootstrap loads every manifest and makes the highest current, or the one artifacts.manifestVersion pins. Unless artifacts.skipStartupValidation is set, it fetches every artifact of the current manifest and checks it parses and points only at listed artifacts: core's kinds (including render configs' section templates), task_config, static_data, and the templates step templates' notification extensions name. A broken manifest stops the deploy. - caseflow records the current version on the case_flows row and starts the flow with workflow.VarManifestVersion. A retry of a recorded flow resumes on its recorded version before the current manifest is consulted, so it still starts when the current manifest dropped its template. Only a new flow is checked against the current manifest. - Agency inject does the same on agency_workflow, and the officer case view reads each workflow's task_config from its own version. - The definition handler resolves a split's branch workflows in the calling workflow's version, and the template provider (form rendering, notification templates) resolves through the version core puts on the context. Without one it fails rather than fall back to the current version. - Static data is fetched by explicit version, from whichever manifest lists it. - Consignment flow listings name each flow from its own version. - The example configs and helm values read GitHub through the raw-content host: startup validation fetches every artifact, more than the unauthenticated REST limit allows. The replay harness skips startup validation, since every replay builds its own app. - go.mod pins core to the head of OpenNSW/core#306 until it merges. BREAKING CHANGE: the artifact source must publish manifest_v1.json in place of manifest.json. Migration 000025 adds manifest_version to case_flows, agency_workflow and task_records_v2. Flows started before it have no version and fail their next task. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
lokewate
changed the base branch from
feat/manifest-set
to
feat/manifest-version-engine
October 20, 2026 15:15
lokewate
force-pushed
the
feat/manifest-pinned-flows
branch
from
October 20, 2026 15:15
ba293b8 to
09f462c
Compare
This was referenced Oct 20, 2026
lokewate
added a commit
to OpenNSW/nsw-srilanka
that referenced
this pull request
Oct 20, 2026
Artifacts are published as manifest_v1.json, manifest_v2.json, … (core artifact.Set). A published manifest and its files never change; a change is a new file and a new manifest. Each flow records the version current when it started and resolves every template through it, so a deploy never changes the templates of a running flow. - Bootstrap loads every manifest and makes the highest current, or the one artifacts.manifestVersion pins. Unless artifacts.skipStartupValidation is set, it fetches every artifact of the current manifest and checks it parses and points only at listed artifacts: core's kinds (including render configs' section templates), task_config, static_data, and the templates step templates' notification extensions name. A broken manifest stops the deploy. - caseflow records the current version on the case_flows row and starts the flow with workflow.VarManifestVersion. A retry of a recorded flow resumes on its recorded version before the current manifest is consulted, so it still starts when the current manifest dropped its template. Only a new flow is checked against the current manifest. - Agency inject does the same on agency_workflow, and the officer case view reads each workflow's task_config from its own version. - The definition handler resolves a split's branch workflows in the calling workflow's version, and the template provider (form rendering, notification templates) resolves through the version core puts on the context. Without one it fails rather than fall back to the current version. - Static data is fetched by explicit version, from whichever manifest lists it. - Consignment flow listings name each flow from its own version. - The example configs and helm values read GitHub through the raw-content host: startup validation fetches every artifact, more than the unauthenticated REST limit allows. The replay harness skips startup validation, since every replay builds its own app. - go.mod pins core to the head of OpenNSW/core#306 until it merges. BREAKING CHANGE: the artifact source must publish manifest_v1.json in place of manifest.json. Migration 000025 adds manifest_version to case_flows, agency_workflow and task_records_v2. Flows started before it have no version and fail their next task. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
lokewate
force-pushed
the
feat/manifest-pinned-flows
branch
from
October 23, 2026 09:22
09f462c to
8a0f0a7
Compare
This was referenced Oct 23, 2026
lokewate
marked this pull request as ready for review
October 23, 2026 09:57
lokewate
added this pull request to stack #347
October 23, 2026 11:38
lokewate
force-pushed
the
feat/manifest-pinned-flows
branch
from
October 23, 2026 16:09
8a0f0a7 to
7f22780
Compare
lokewate
added a commit
to OpenNSW/nsw-srilanka
that referenced
this pull request
Oct 23, 2026
…version Pin core to the manifest versioning stack (OpenNSW/core#306): every workflow carries the artifact manifest version it started on, and every task, step, render and notification in it resolves its templates through that version. - TNSW case flows and agency injects start on the version current when they start, and load their definition from it. Recording the version on their rows, so a retried start keeps it, comes in the next change. - Template providers, step permissions, file fields and the payload schema extension resolve through the task's version. - task_records_v2 gets a manifest_version column (migration 000028). BREAKING CHANGE: migration 000028 adds task_records_v2.manifest_version. A task created before it has version 0 and fails its next step, so let open tasks finish, or cancel them, before upgrading. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
lokewate
added a commit
to OpenNSW/nsw-srilanka
that referenced
this pull request
Oct 24, 2026
…version Pin core to the manifest versioning stack (OpenNSW/core#306): every workflow carries the artifact manifest version it started on, and every task, step, render and notification in it resolves its templates through that version. - TNSW case flows and agency injects start on the version current when they start, and load their definition from it. Recording the version on their rows, so a retried start keeps it, comes in the next change. - Template providers, step permissions, file fields and the payload schema extension resolve through the task's version. - task_records_v2 gets a manifest_version column (migration 000028). BREAKING CHANGE: migration 000028 adds task_records_v2.manifest_version. A task created before it has version 0 and fails its next step, so let open tasks finish, or cancel them, before upgrading. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
mushrafmim
force-pushed
the
feat/manifest-pinned-flows
branch
from
October 24, 2026 19:20
7f22780 to
7786216
Compare
Each task records the manifest version its parent workflow carries (TaskPayload.ManifestVersion), so a task's steps, submissions, drafts and renders all resolve their templates through the version the flow started on. - NewTaskManager takes an *artifact.Set. - StartTask resolves the task template, its workflow and render config through the payload's version, stores it on the task record and seeds it into the task's own workflow. - StartTaskStep, CompleteTaskStep and SaveDraft resolve the step template through the record's version, not the payload's. GetTaskRenderInfo and ZoneViewAssembler.Assemble do the same for rendering. - Each puts the version on the context (artifact.WithManifestVersion), so plugins, extensions and the renderer's template provider resolve through it too. - A task without a version fails before anything is written, with a non-retryable error returned unwrapped: falling back to the current version would change templates under a running task. A version this replica has not loaded stays retryable. - TaskRecord.ManifestVersion is stored in column manifest_version. The task and step start logs name the manifest version, so a step's log says which templates it ran. BREAKING CHANGE: NewTaskManager takes an *artifact.Set, hosts add manifest_version INTEGER NOT NULL DEFAULT 0 to the task records table, and workflows already running fail their next task. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
lokewate
force-pushed
the
feat/manifest-pinned-flows
branch
from
October 25, 2026 05:00
7786216 to
28fd51e
Compare
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Each task records the manifest version its parent workflow carries, so a task's steps, submissions, drafts and renders all resolve their templates through the version the flow started on.
Stack
Manifest versioning, in five PRs to review and merge in order. Each one builds and passes its tests on its own.
#320 (validate every artifact a manifest lists) and #321 (
manifestcheck) are parked: pinning doesn't need them, and a release job can bring validation back later.Type of Change
Changes Made
NewTaskManagertakes an*artifact.Set.StartTaskresolves the task template, its workflow and render config through the payload's version. It stores the version on the task record and seeds it into the task's own workflow.StartTaskStep,CompleteTaskStepandSaveDraftresolve the step template through the record's version, not the payload's.GetTaskRenderInfoandZoneViewAssembler.Assemble(a host's task view) do the same for rendering.artifact.WithManifestVersion/ManifestVersionFrom. Each of those puts the version on the context, so plugins, extensions and the renderer's template provider can resolve through it too.ApplicationError, returned unwrapped because Temporal reads retryability off the top-level error only. A version this replica has not loaded stays retryable, sinceSet.Registryloads newer manifests on demand.TaskRecord.ManifestVersionis stored in columnmanifest_version.NewTaskManagertakes an*artifact.Set;manifest_version INTEGER NOT NULL DEFAULT 0to the task records table;Testing
Run with
go test -race ./taskflow/.... The tests cover a task that keeps its starting version after the current version moves (through start, step, submit and extensions),SaveDrafton a versioned task, missing-version refusal as an unwrapped non-retryable error with nothing written and the step never claimed, an unpublished version staying retryable, and the renderer receiving the task's version.Checklist
Related Issues
The host side is OpenNSW/nsw-srilanka#660. It records the version on each flow row, passes it at start, and adds the migration. Tracked in OpenNSW/one-trade-artifacts#243.
Screenshots/Demo
N/A
🤖 Generated with Claude Code