Skip to main content

Designing Work Item Metadata: Lessons for Accounting Systems from Project Management Software

Project management software's work item metadata model—types, fields, workflows—offers accounting system designers a blueprint for handling complex rule changes like mandatory fields and configurable workflows.

The Hidden Complexity of a Simple Request

In project management software, a common request sounds deceptively simple: When a defect moves from 'Pending Verification' to 'Closed,' require the tester to fill in the verification result. It makes sense. The tester should state whether they confirmed the fix, couldn't reproduce it, or rejected it. That information forms the closing conclusion.

But swap 'verification result' for 'root cause,' and the rule starts to crumble. Root cause often emerges during analysis, possibly before the fix is submitted. Low-risk defects may not warrant a full root-cause investigation. A better design: require the verification result at closing, but only demand a root cause when severity reaches a certain threshold. The first is information collected by the closing action; the second is a quality rule that must be satisfied before closing.

This single field swap exposes the core objects of a work item platform: the defect type, the verification result attribute, the closing form, the workflow that governs the transition, and the rule that applies only to severe defects. The real design challenge isn't adding a required field. It's defining how a class of work objects is defined and how each work item follows deterministic rules.

Six Questions Every Work Item Metadata Model Must Answer

A work item stores a specific requirement, defect, or task. The metadata model defines how those types should be defined in the first place. From first principles, a work item type must answer six questions:

  • What is this object? Type identity: stable ID, name, icon, description, lifecycle.
  • What can it store? Attribute model: text, person, enum, effort, attachment, relationship, computed values.
  • How do users fill and read it? Form and page layouts: create, detail, edit, transition, list, card.
  • How can it change? Workflow: states, transitions, permissions, validations, post-actions, triggers.
  • What can it connect to? Relationship model: parent-child, dependency, blocking, generic links.
  • Where do these rules apply? Configuration scope: organization, space, work item type, business context, config version.

These six layers can combine, but they shouldn't be mashed into one giant type configuration table. Types identify objects; attributes express facts; layouts organize interaction; workflows constrain change; relationships link objects; scope decides who the rules affect. At runtime, the platform parses all six layers into the configuration a single work item actually uses.

Why separate them? Because they change at different frequencies and are reused differently. A 'defect' might be renamed to 'issue,' but API references can't break. A 'owner' attribute might appear on requirements, tasks, and defects, but each space may have different candidate pools. The same set of attributes can form a slim create page and a full detail page. The same workflow might be reused by multiple spaces, but an upgrade might only affect new instances.

If you copy all of this into the work item type, an admin changes one thing and must sync dozens of copies. If you make everything independent without clear mapping and explanations, the platform becomes a maze only experts can maintain. The challenge is balancing reuse, isolation, and understandability.

Type Defines Identity, Not Defaults

Many project management tools let you create a new type with just a name and icon, making it seem like a simple category. But a type is more than a label. It's the stable identity of a class of work objects and the entry point for all other configurations.

A critical boundary: the work item type itself should not own a 'default owner.' Ownership is an attribute on the work item instance. The default owner, the candidate pool, and whether it's required are rules for that attribute in a specific space, business line, or creation scenario. Hard-coding them into the type creates three problems:

  • Different teams often need different ownership rules for the same 'requirement.' A product space might default to the creator; a delivery space might use the business line owner; a functional space might have no default.
  • Defaults are computed at creation, not part of identity. If a fixed person leaves, the system should recalculate or prompt, not rewrite the type.
  • Person eligibility must intersect with permissions, space membership, and account status. 'Can be owner' is a type-level permission entry, but it constrains the candidate set—it's not identity.

So the model should be: type answers 'what is this object?' The owner attribute answers 'who is currently responsible?' Attribute rules answer 'how to get the default, who can be chosen.' Workflows and layouts also live outside the type—they're referenced, not embedded.

From Custom Fields to a Unified Attribute Model

Early tools called this 'custom fields.' The name is intuitive but limits thinking to text boxes, radio buttons, and date pickers. Real work items are more complex: owners are person objects; attachments are resources with name, size, uploader, and permissions; effort includes estimates, remaining, logs, and dates; parent items and iterations are references to other objects; sub-item progress can be computed.

So I prefer 'attribute model.' A powerful approach: everything is an attribute; attributes compose forms. Common attribute types include text, number, date, person, enum, effort, attachment, relation, and computed. This doesn't mean the database crams everything into one table. Attachments and effort logs still need separate resource tables and permission logic. But the product and API contract is unified: each attribute defines identity, type, value structure, cardinality, default rule, permission, query capability, layout, and change history.

This brings a direct benefit: create pages, detail pages, transition pages, and lists no longer implement their own field logic. They select attributes from a shared repository and configure different displays. APIs, import/export, automation, and agents all use the same attribute definitions.

Attribute definitions must be more stable than UI controls. A 'severity' might be a radio button on a page, but the platform also needs to filter, group, count, authorize, import, and trigger automation on it. Controls decide how users input; attributes decide how the system understands and stores the fact long-term.

A complete attribute definition includes: stable ID, name, description, owner; data type, value structure, single or multi-value; options, units, precision, timezone, valid range; default and null rules, server-side validation; applicable spaces, types, and business contexts; whether it supports filtering, sorting, grouping, statistics, computation, and API writes; which layouts, workflows, reports, automations, and interfaces reference it; and deactivation, migration, and backward-compatibility policies.

Once an attribute has data, changing its type isn't a normal edit. Changing a free-text priority to a single-select means mapping 'high,' 'urgent,' 'P0' to new options. Changing effort from hours to person-days requires a conversion rule. Changing a single-select to a person attribute may have no reliable mapping at all.

Scope: Global vs. Space Attributes

Many platforms historically used 'global fields' and 'project fields.' But if your product has a Space as the long-lived container, you shouldn't add a 'project field' layer below it. In this model, there are only two main configuration sources: the organization provides cross-space reusable attributes, and the space maintains team-specific or business-domain attributes. A one-off delivery's 'migration batch' or 'special acceptance number' is still a space attribute, just scoped via version, iteration, goal, or conditional layout.

A good governance principle: the organization maintains common language; the space maintains business language; the work item instance stores only current facts. Don't duplicate an attribute for a one-off need, and don't promote every local concept to global.

The real question isn't where the menu is, but how cross-space queries maintain semantics. Same-named attributes aren't necessarily the same. Only when data types and business semantics match should they be mapped to a unified aggregation field.

A quick test: can their values go into the same cross-space report? If one space's 'customer' means the contracting entity and another means the end-user brand, they shouldn't share an attribute ID just because they have the same name.

Page Layouts: Composing Attributes by Scenario

With a unified attribute repository, page layouts stop defining data and start answering: what should the user see, fill, and do in this scenario? Consider closing a defect:

  • On creation, verification result and root cause are not required.
  • After analysis, root cause and fix plan can be filled.
  • When moving from 'Pending Verification' to 'Closed,' the transition form requires verification result.
  • If severity is 'Critical' or 'High,' check that root cause exists before closing.
  • After closing, both fields remain visible but read-only for most members.

A mature layout model distinguishes at least five interface types: create layout, detail layout, transition layout, list/card layout, and import/export layout. The create page isn't a miniature detail page. It must first establish the object: space, type, title, necessary context. Then initial responsibility and process routing. If 'business line' determines the workflow, it must appear at creation. If root cause only emerges after analysis, don't make it a creation hurdle.

On the detail page, users first judge what it is, where it's stuck, who's responsible, and what's next. Then they read the description, acceptance criteria, sub-items, and history. A stable skeleton helps: identity, status, and legal actions at top; description and key attributes in the main area; owner, priority, iteration in a sidebar; sub-items, dependencies, attachments, comments, and change logs in tabs or below.

Attributes and page controls must keep boundaries. Attachments can be a resource attribute in a form; effort can be an aggregate attribute showing logs. Comments and change logs are collaboration and audit streams, not editable text fields. A useful division: attribute configuration handles long-term data rules; page layout handles interaction; workflow steps handle entry conditions for specific actions. 'Title always required' is an attribute rule. 'Fill verification result when closing' is a workflow step. 'Where the verification result appears on the detail page' is layout.

Rules that affect data validity must be enforced server-side. Front-end required markers can be bypassed by bulk operations, import, API, automation, and agents.

Workflows: States and Transitions Define Legal Changes

A workflow isn't a side attachment to page layouts. A state represents a stable phase; a transition represents an action that moves an item from one state to another. 'Pending Verification' and 'Closed' are states. 'Verify and close' is a transition. That transition can require a test role, open a transition form, collect the verification result, check root cause for severe defects, update closer and close time, and write an audit record.

A transition definition includes: source and target states; action name shown to users; which roles or people can execute; which attributes to show and fill; preconditions and server-side validation; post-actions like field updates, notifications, automations, audit; and entry points from code, pipelines, or other systems. Just configuring a state list lets users flip states arbitrarily. Configuring transitions lets the platform explain who, under what conditions, performed what action, and why the item moved to the next state.

Different products model this differently. Jira calls them 'transitions.' ONES has a step connecting start and end states with validations, step attributes, and post-actions. The underlying model is the same: a transition is not another state; it's a constrained business action.

One type supporting multiple workflows can mean three different things: config layer allows multiple candidate workflows; creation-time selection picks one; and within a chosen workflow, multiple nodes may run in parallel. Jira uses a workflow scheme to map types to workflows in a space. ONES configures one workflow per type in a project. Feishu's project uses a 'business line' field to route to different flow templates. TAPD uses categories to select workflows, and those workflows can be serial or parallel.

Each approach has trade-offs. Fixed mapping is simple and auditable. Conditional routing adapts to multiple business lines but needs rule priority and conflict handling. Parallel nodes express cross-role collaboration but introduce node owners, merge conditions, rollback boundaries, and overall progress calculation. Whatever you choose, running instances must store the exact flow or flow version. Otherwise, an admin change can leave running work items without state, nodes, or actions.

Producing a Work Item: From Definition to Runtime

Configuring types, attributes, layouts, and workflows isn't enough. The runtime chain must tie management definitions, publish validation, creation-time parsing, and execution together. An admin defines the type identity, connects attribute sets, layouts, workflow mapping, relationships, and permissions. Before publishing, the platform checks that the initial state is unique, required attributes have a fillable entry, the default owner is in the legal candidate set, routing rules don't conflict, and relationship rules are consistent.

When a user clicks create, the system resolves the unique configuration based on organization, space, type, and business context. It computes attribute defaults and person candidates, matches the workflow version, and runs server-side validation before creating the instance. After creation, any change goes through transition permissions, action inputs, business validation, atomic updates, and audit logging.

Layouts aren't the source of runtime rules; they translate them into an interface. Pages, bulk operations, import, API, automation, and agents must all use the same server-side capabilities. Otherwise, 'required,' 'permission,' and 'workflow' only apply when someone clicks through the UI.

Relationships Turn Forms into a Business Network

Work items aren't isolated records. A requirement decomposes into product, frontend, backend, and test sub-items. A backend task may block integration testing. A defect may link to a requirement, test case, and release version. Two types of relationships matter: hierarchical (decomposition, ownership, rollup) and associative (named business links). Dependency, blocking, predecessor, successor are directed, constrained links—not the same as parent-child, even if both look like lines.

Hierarchical relationships need more than a parent_id. You must define which types can be parent/child, whether an item can have multiple parents, maximum depth, cross-space allowance, how progress and effort roll up, and whether child completion triggers parent validation. Associative relationships need name and reverse name, direction, allowed types, cardinality, cross-domain scope, permissions, and business effects. 'Blocks' and 'is blocked by' are two ends of the same directed link. 'Similar requirement' is undirected. 'Predecessor-successor' may affect scheduling conflict and critical path.

In a unified attribute model, parent and linked version can appear as reference attributes in a form, but legality is still checked by the relationship model. Attributes carry the entry point; relationships define semantics.

Configuration Scope: From Project to Space

In this model, a Space and a Project are not two nested containers. In Jira Cloud, Space is the new name for Project—same container. Atlassian renamed it because 'project' implies a start and end date, but the Jira Project actually hosts work indefinitely. A Space better expresses a long-term collaboration boundary: a product team, business line, or functional team can iterate for years. Work item types, attributes, workflows, layouts, views, roles, permissions, automations, and the work items they create are all managed by the Space.

Where does a one-time project delivery go? Not in a new 'project' entity. You organize a set of work with a common goal and time boundary within the Space—via goals, versions, iterations, milestones, labels, parent items, or combined views. For example, 'Payment Internationalization Phase 1' could be a goal, two versions, and a set of requirements and defects. After delivery, those are archived or closed, and the Space continues.

Configuration scope should be three layers: organizational standards, space-enabled configurations, and delivery context (versions, iterations, goals). Delivery context can participate in filtering, routing, permissions, and statistics, but it shouldn't become another config container. Otherwise, each new initiative copies fields and workflows, and soon you have same-named fields with different meanings, workflow version forks, and unreconcilable cross-initiative reports.

At runtime, the platform reads organizational standards, resolves the space's enabled configurations, selects rules based on type and business context, and overlays user permissions to produce a single page and behavior. It should also explain the result: whether an attribute comes from the organization or the space, why this type hit this workflow, why only three people are selectable as owner, and which workflow version is running. Without this diagnostic ability, flexible configuration becomes a black box that only a few experts can troubleshoot.

Configuration Changes Are Runtime Rule Changes

Attributes, workflows, layouts, and relationships are referenced by many existing work items. Making 'verification result' required on close might break a bulk-close API. Deleting the 'Pending Verification' state could leave existing defects without a valid status. Changing a 1:n hierarchy to n:n alters rollup and permission semantics.

So the metadata model must include the lifecycle of configuration itself. Use stable IDs and reference analysis. Types, attributes, states, transitions, layouts, relationships, and schemes need stable IDs. The config center should show which spaces, filters, reports, automations, APIs, and running instances reference each item. Without reference analysis, impact assessment is guesswork.

High-risk changes shouldn't take effect immediately after saving. Adding an optional attribute or changing help text can propagate quickly. Deleting a state, changing an attribute type, adding a required transition field, modifying routing rules, or changing relationship cardinality should default to a new version, with explicit migration for spaces and instances. Prefer deactivating over deleting. Type conversion and cross-space moves must handle attribute, state, workflow, hierarchy, relationship, and permission mapping. Workflow upgrades should specify whether existing instances stay on the old version or map to the new one.

Converting a Task to a Bug seems like a simple type change, but it re-resolves target attributes, layouts, workflow, and relationships. What if a required target attribute is missing? How do you map a source state that doesn't exist in the target workflow? Are parent-child relationships still valid? Do attachments and effort remain? Type conversion is a constrained data migration, not a free dropdown.

Conclusion: Type Is the Entry, Attribute Is the Fact, Workflow Is the Rule

From the product surface, work item configuration looks like creating types, dragging fields, adjusting pages, and drawing a flowchart. The real ceiling is set by the boundaries between these capabilities. Types define stable identity without absorbing default owners or workflow states. Attributes use a unified contract to carry titles, people, effort, attachments, references, and computed values, and layouts compose them into create, detail, and transition forms. Workflows constrain change with states and transitions. Relationships define decomposition and connection. Spaces separate long-term team rules from one-off delivery scope. Configuration versions protect running work items from sudden breakage.

Returning to the opening request: 'Require verification result when closing a defect' isn't adding a required box to the detail page. It's adding an action input to the 'close defect' transition. 'Severe defects must have root cause before closing' isn't making root cause globally required. It's adding a conditional server-side validation. Both appear on the same transition form, but they belong to different rules.

When a project management platform can consistently answer 'what is this object, what facts does it store, how does it interact now, how can it change, what can it connect to, and where do rules apply,' it becomes more than a configurable table—it becomes an enterprise-grade work item platform. The same principles apply to accounting systems, where transactions, ledgers, and compliance rules demand the same clarity between type, attribute, and workflow.

Share this article:

Comments (0)

No comments yet. Be the first to comment!