perf: strip documentation-only fields from resolved status snapshots
#10,321 opened on Jun 19, 2026
Repository metrics
- Stars
- (9,013 stars)
- PR merge metrics
- (PR metrics pending)
Description
Feature request
Strip description fields from params, workspaces, and results when copying resolved specs into status.taskSpec and status.pipelineSpec.
Problem
When Tekton resolves a Task or Pipeline, it snapshots the full spec into the object's status (status.taskSpec, status.pipelineSpec). This snapshot includes description fields on params, workspaces, and results — fields that are purely informational and never read by the controller during execution.
These description fields are copied into every revision of the object in etcd. Since etcd stores full object copies per revision (not diffs), and a TaskRun may accumulate 10-20 revisions during its lifecycle, the overhead is multiplied significantly.
Impact
The actual savings depend on how verbose the task/pipeline descriptions are. Some examples:
tektoncd/catalog (475 tasks/stepactions):
- 15.8% of total spec size is descriptions
- 65% of objects have >5% description overhead
- Highest:
git-batch-merge(30%),git-clone(21-28%),buildpacks-phases(15%)
konflux-ci/build-definitions (176 tasks/pipelines):
- 8.3% of total spec size is descriptions (lower ratio because tasks contain large inline scripts)
- 63% of objects have >5% description overhead
- Highest:
ecosystem-cert-preflight-checks(36%),buildahvariants (7-14%)
The key insight is that these bytes are amplified by revision count. A TaskRun with 10-20 revisions stores 10-20 full copies of the object. So 5 KB of descriptions becomes 50-100 KB of etcd storage per TaskRun. At scale (e.g., 300 concurrent PipelineRuns × 20 TaskRuns each), this adds up to hundreds of MB of etcd space used purely for documentation strings.
Proposed change
During task/pipeline resolution, when populating status.taskSpec / status.pipelineSpec, strip the description field from:
params[*].descriptionworkspaces[*].descriptionresults[*].description- Any other spec-level fields carrying
descriptionpurely for documentation
The original Task/Pipeline objects retain their descriptions — only the resolved snapshot in status is stripped.
Why this is safe
- The controller reads exclusively from
status.taskSpec/status.pipelineSpecfor execution - It never uses
descriptionfields for any runtime decision - These fields exist solely for UI display and human documentation, so we just need to verify that clients like the cli and dashboard do not rely on those
statusspec fields. - The original Task/Pipeline objects retain their descriptions for anyone who needs them
Fields to audit
A full audit should identify all description-carrying fields in the resolved spec. Known candidates:
spec.params[*].description(ParamSpec)spec.workspaces[*].description(WorkspaceDeclaration)spec.results[*].description(TaskResult/PipelineResult)- Any nested descriptions in step or sidecar specs
Related
- #9573 — strip
managedFieldsfrom informer caches (addresses controller memory, not etcd size)