Agent skill

Validate Bug

by openshift-eng in openshift-eng/ai-helpers

Diagnose and fix jira/invalid-bug on PRs by running the same 7 checks as the jira-lifecycle-plugin

Apache-2.0Auto-check passedDevelopment

Install Validate Bug

skills CLI
$ npx skills add openshift-eng/ai-helpers --skill validate-bug -a claude-code

Project install by default; add -g for ~/.claude/skills/.

GitHub CLI
$ gh skill install openshift-eng/ai-helpers validate-bug --agent claude-code

Project scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).

Manual copy
$ git clone --depth 1 https://github.com/openshift-eng/ai-helpers.git skills-src && mkdir -p .claude/skills && cp -r skills-src/plugins/jira/skills/validate-bug .claude/skills/validate-bug && rm -rf skills-src

Use ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.

Claude Code skills documentation · loads skills from .claude/skills/

Facts

Skill name
validate-bug
GitHub stars
120
Token cost
~3.6k tokens
SKILL.md length
1,628 words
Files
1
Skills in repo
118
Repo updated
First seen
Licence
Apache-2.0

At a glance

Diagnose and fix jira/invalid-bug on PRs by running the same 7 checks as the jira-lifecycle-plugin

  • Works in 5 steps: Resolve Input → Gather Data → Validate → …
  • Development work in your project
  • SKILL.md covers Custom Field Reference, The 7 Validation Checks, Branch-to-Version Mapping and Prerequisites, plus 3 more sections
  • Calls gh; reaches github.com; needs JIRA_KEY

What it does

Validate Bug is an agent skill from openshift-eng/ai-helpers. Diagnose and fix jira/invalid-bug on PRs by running the same 7 checks as the jira-lifecycle-plugin

Its SKILL.md is about 3.6k tokens, which your agent loads only when the skill is triggered. It is a single SKILL.md file with no bundled scripts.

It sits in Development. It works with Jira. The repository describes itself as: Developer productivity tools for Claude Code & other AI assistants. The licence is Apache-2.0.

When your agent uses it

  • Development work in your project

Example prompts

  • “/validate-bug”

Requirements

  • A credential in JIRA_KEY

Workflow steps

5 steps, taken from the step headings in SKILL.md.

  1. Resolve Input
  2. Gather Data
  3. Validate
  4. Report
  5. Offer Fixes

What it can do on your machine

Read from SKILL.md and the folder at commit a627176. It shows what the files ask for, not the result of running them.

  • Tool permissions

    Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.

    From allowed-tools in the SKILL.md frontmatter.

  • Runs code

    Shell commands in SKILL.md call:

    • gh

    From the folder's file list and the shell code blocks in SKILL.md.

  • Network

    Hosts in commands or code, which the agent is likely to contact:

    • github.com

    From URLs in SKILL.md, links to its own repository left out.

  • Credentials

    Names these keys or tokens, usually read from environment variables:

    • JIRA_KEY

    From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.

Context cost

Validate Bug loads about 3.6k tokens when it runs. Until then it costs about 28 tokens; SKILL.md has 1,628 words of instructions outside code blocks.

Always · name and description, kept in context so the agent knows when to use it
~28
When it runs · the whole SKILL.md, loaded when a task matches
~3.6k

Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.

Safety

Auto-check passed

The automated check found no risky patterns in SKILL.md.

Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.

SKILL.md

The full file from openshift-eng/ai-helpers at commit a627176, republished under its Apache-2.0 licence (© openshift-eng). 1,628 words, ~3,609 tokens.

Download SKILL.mdSave it as .claude/skills/validate-bug/SKILL.md (or your agent's skills folder).
name
validate-bug
description
Diagnose and fix jira/invalid-bug on PRs by running the same 7 checks as the jira-lifecycle-plugin
command
/jira:validate-bug

JIRA Bug Validator — Implementation Guide

IMPORTANT FOR AI: This is a procedural skill. Execute each phase in order. Do not skip steps. Do not invent field IDs — use only the documented custom field IDs below.

This skill replicates the validation logic of the jira-lifecycle-plugin (Prow external plugin) that applies the jira/invalid-bug label to PRs in OpenShift repositories.

Custom Field Reference

FieldCustom Field IDJQL Name
Target Versioncustomfield_10855"Target Version"
Release Note Textcustomfield_10783—
Release Note Typecustomfield_10785—
Severitycustomfield_10840—

The 7 Validation Checks

The jira-lifecycle-plugin runs these checks in order. A bug must pass ALL checks to get jira/valid-bug.

#CheckWhat it validates
1Bug is openStatus is not "Closed"
2Target version matches branchBug's Target Version matches the expected version for the PR's base branch
3Bug in valid stateStatus is one of: NEW, ASSIGNED, POST
4Release notes setRelease note text is non-empty and doesn't match the default template, OR release note type is "Release Note Not Required"
5Dependent bug statesEach dependent (linked via "Blocks") is in an allowed state
6Dependent bug target versionsEach dependent targets an allowed version
7Dependents existAt least one "Blocks" link exists to a bug in the same project

Checks 5-7 only apply to release branches (release-4.X), not main/master.

Branch-to-Version Mapping

The plugin config follows a mechanical pattern:

Target version (what the bug on the PR's branch must target):

  • release-4.X → 4.X.z (prefix match — 4.X.0 also accepted)
  • main / master → 5.0.0 (prefix match — 5.0 also accepted). Update when main targets a new major version — check openshift/release/core-services/jira-lifecycle-plugin/config.yaml for the current value.

Dependent target version (what the "Blocks" linked bug must target):

  • release-4.X → 4.(X+1).0 or 4.(X+1).z

Valid states for the bug itself (all branches):

  • NEW, ASSIGNED, POST

Valid states for dependent bugs (varies by branch — check openshift/release/core-services/jira-lifecycle-plugin/config.yaml for current boundaries):

  • release-4.22 and newer: MODIFIED, ON_QA, VERIFIED
  • release-4.6 through release-4.21: VERIFIED, RELEASE PENDING, CLOSED (ERRATA), CLOSED (CURRENT RELEASE), CLOSED (DONE), CLOSED (DONE-ERRATA)

Dependent bug checks (checks 5-7):

  • Required for release-4.X branches
  • NOT required for main / master (config sets exclude_defaults: true)

Release notes:

  • Required by default (require_release_notes: true)
  • Default template text (must NOT match this): "Cause: What actions or circumstances cause this bug to present.\r\nConsequence: What happens when the bug presents.\r\nFix: What was done to fix the bug.\r\nResult: Bug doesn't present anymore."

Prerequisites

  • gh CLI authenticated with GitHub
  • Jira MCP server configured (Atlassian Rovo MCP)
  • cloudId: use redhat.atlassian.net

Detailed Implementation Steps

Phase 1: Resolve Input

Parse the argument to determine input type:

  1. PR URL — matches https://github.com/{org}/{repo}/pull/{number}

    • Extract org, repo, and PR number from the URL
    • Run: gh pr view {number} --repo {org}/{repo} --json title,baseRefName,state
    • Extract JIRA key from PR title using regex: first match of [A-Z]+-[0-9]+ (e.g., OCPBUGS-85778)
    • Extract base branch from baseRefName (e.g., release-4.20, main)
  2. PR number — plain integer

    • Determine repo from current git remote: gh repo view --json nameWithOwner -q .nameWithOwner
    • Then same as PR URL flow above
  3. JIRA key — matches [A-Z]+-[0-9]+

    • Require --branch argument (no PR context to infer branch)
    • If --branch not provided, error: "JIRA key input requires --branch (e.g., --branch release-4.20)"

Validate the JIRA key project:

  • Must be a bug project: OCPBUGS, DFBUGS, or PROJQUAY
  • If not, warn: "Project {PROJECT} is not a bug project. The jira-lifecycle-plugin only validates bugs in OCPBUGS, DFBUGS, and PROJQUAY."

Compute expected values from branch:

  • Parse branch name to extract version number
  • Compute expected_target_version, expected_dependent_versions, valid_states, dependent_valid_states, dependents_required using the mapping above
Phase 2: Gather Data

Fetch the primary bug:

Use mcp__atlassian__getJiraIssue:

  • cloudId: redhat.atlassian.net
  • issueIdOrKey: the JIRA key
  • fields: ["summary", "status", "issuetype", "fixVersions", "issuelinks", "customfield_10855", "customfield_10783", "customfield_10785", "customfield_10840", "labels", "components"]
  • responseContentFormat: markdown

Extract key data from response:

  • status.name — bug status (e.g., "New", "Verified")
  • customfield_10855 — Target Version array (each entry has .name)
  • customfield_10783 — Release Note Text (string or ADF doc)
  • customfield_10785 — Release Note Type (object with .value)
  • issuelinks — array of issue links

Find dependent bugs:

Filter issuelinks for links where:

  • Link type name is "Blocks" AND direction is outwardIssue (this bug blocks the dependent)
  • The linked issue's project key matches the original bug's project (e.g., both are OCPBUGS-*)

For each dependent found:

  • Record the dependent's key, status, and priority from the link data
  • If the link data doesn't include Target Version, fetch the dependent with getJiraIssue:
    • fields: ["summary", "status", "customfield_10855", "fixVersions"]
Phase 3: Validate

Run each check and record the result:

text
results = []

Check 1: Bug is open

  • PASS if status.name is NOT "Closed"
  • FAIL if status.name is "Closed"
  • Pass message: "bug is open, matching expected state (open)"
  • Fail message: "bug is closed, expected it to be open"

Check 2: Target version matches branch

  • Get target versions from customfield_10855 (array)
  • FAIL if no target version is set: "expected the bug to target the '{expected}' version, but no target version was set"
  • FAIL if multiple target versions are set (only one allowed)
  • PASS if exactly one target version and its .name starts with the expected prefix (e.g., "4.20" for release-4.20)
  • FAIL otherwise: "expected the bug to target either version '{expected}' or 'openshift-{expected}', but it targets '{actual}' instead"

Check 3: Bug in valid state

  • PASS if status.name (uppercased) is in ["NEW", "ASSIGNED", "POST"]
  • FAIL otherwise: "bug is in state {actual}, which is not one of the valid states (NEW, ASSIGNED, POST)"

Check 4: Release notes

  • Get release note text from customfield_10783
    • If it's an ADF document, extract the plain text content
    • If it's a string, use directly
  • Get release note type from customfield_10785
  • PASS if release note type .value equals "Release Note Not Required"
  • PASS if release note text is non-empty AND does NOT start with "Cause: What actions or circumstances"
  • FAIL otherwise: "release note text must be set and not match the template OR release note type must be set to 'Release Note Not Required'"

Check 5: Dependent bug states (skip if dependents_required is false)

  • For each dependent bug found via "Blocks" links:
    • PASS if dependent's status.name (uppercased) is in the allowed dependent_valid_states list
    • FAIL otherwise: "expected dependent Jira Issue {key} to be in one of the following states: {allowed}, but it is {actual} instead"
  • If no dependents exist, this check is implicitly skipped (check 7 handles that)

Check 6: Dependent bug target versions (skip if dependents_required is false)

  • For each dependent bug:
    • Get its Target Version from customfield_10855
    • PASS if target version starts with one of the expected_dependent_versions prefixes
    • FAIL otherwise: "expected dependent Jira Issue {key} to target a version in {allowed}, but it targets '{actual}' instead"

Check 7: Dependents exist (skip if dependents_required is false)

  • PASS if at least one "Blocks" link exists to a bug in the same project
  • FAIL otherwise: "expected Jira Issue to depend on a bug targeting a version in {allowed} and in one of the following states: {allowed_states}, but no dependents were found"
Show full SKILL.md (535 more words)Show less
Phase 4: Report

Render results as a markdown table:

markdown
## Validating {JIRA_KEY} against branch {BRANCH}

**Bug**: {summary}
**Status**: {status} | **Target Version**: {target_version} | **Project**: {project}

| # | Check                          | Expected                | Actual             | Result |
|---|--------------------------------|-------------------------|--------------------| -------|
| 1 | Bug is open                    | Open                    | {status}           | {P/F}  |
| 2 | Target version                 | {expected_tv}           | {actual_tv}        | {P/F}  |
| 3 | Valid state                    | NEW/ASSIGNED/POST       | {status}           | {P/F}  |
| 4 | Release notes                  | Set (not template)      | {actual_rn}        | {P/F}  |
| 5 | Dependent bug states           | {allowed_states}        | {actual_dep_state} | {P/F}  |
| 6 | Dependent bug target version   | {allowed_dep_tv}        | {actual_dep_tv}    | {P/F}  |
| 7 | Dependents exist               | At least one            | {count} found      | {P/F}  |

Result: {N} of 7 checks passed

For checks that were skipped (main branch, no dependents required), show SKIP in the Result column.

For each failure, list the specific fix instruction:

markdown
### Fixes needed

1. **Target version**: Set Target Version to `{expected}` (currently `{actual}`)
2. **Status**: Transition to NEW, ASSIGNED, or POST (currently `{actual}`)
3. **Release notes**: Set release note text or set Release Note Type to "Release Note Not Required"
4. **Dependents**: Create or link a bug in {PROJECT} targeting `{expected_dep_version}`

If all checks pass:

markdown
All 7 checks passed. If the PR still shows `jira/invalid-bug`, comment `/jira refresh` on the PR.
Phase 5: Offer Fixes

After reporting, offer to fix each failing check. List the fixes and ask for confirmation before proceeding.

Fix: Target version (checks 2, 6)

  1. Resolve the version ID: use mcp__atlassian__getJiraIssueTypeMetaWithFields with projectIdOrKey: {PROJECT}, issueTypeId from the bug's issuetype.id, and requiredFieldsOnly: false
  2. Find customfield_10855 in the response fields — its allowedValues array contains all available versions. Match the entry whose .name equals the expected version string (e.g., 4.20.z) and extract its .id
  3. Update: mcp__atlassian__editJiraIssue with fields: {"customfield_10855": [{"id": "{version_id}"}]}

Fix: Status (checks 1, 3)

  1. Get available transitions: mcp__atlassian__getTransitionsForJiraIssue
  2. Find transition to a valid state (prefer "New" or "POST")
  3. Transition: mcp__atlassian__transitionJiraIssue with the transition ID

Fix: Release notes (check 4)

  1. Ask the user for release note text. Suggest format:
    text
    Cause: {what causes the bug}
    Consequence: {what happens}
    Fix: {what was done}
    Result: {the fix resolves it}
  2. Update: mcp__atlassian__editJiraIssue with fields: {"customfield_10783": "{text}"}
  3. Alternative: if user wants to skip release notes, set release note type: fields: {"customfield_10785": {"value": "Release Note Not Required"}}

Fix: Missing dependents (check 7)

  1. Check if a "Blocks" linked dependent already exists in the issue's issuelinks (same project, outward direction)
  2. If no dependent exists, offer to create one:
    • Create a new bug in the same project with:
      • Same summary (prefixed with branch info if needed)
      • Target Version set to the expected dependent version
    • Link with a "Blocks" relationship: mcp__atlassian__createIssueLink with type: "Blocks", inwardIssue: {original_bug}, outwardIssue: {new_bug} (original bug blocks the new dependent)
    • Use mcp__atlassian__createJiraIssue then mcp__atlassian__createIssueLink
  3. If a dependent exists but targets wrong version or is in wrong state, offer to fix it

Fix: Dependent bug state (check 5)

  1. For each dependent in wrong state:
    • Get transitions: mcp__atlassian__getTransitionsForJiraIssue for the dependent
    • Find transition to an allowed state
    • Transition: mcp__atlassian__transitionJiraIssue

After all fixes applied:

  1. Re-run all 7 checks to confirm everything passes
  2. Display updated results table
  3. Remind user: "Comment /jira refresh on the PR to have the bot re-validate."

Error Handling

ErrorHandling
PR not foundDisplay error with PR URL, suggest checking the URL
No JIRA key in PR titleDisplay the PR title, explain the expected format: {JIRA-KEY}: description
JIRA issue not foundCheck if key is correct, check project access
MCP tool unavailableFall back to gh CLI for GitHub data; for JIRA, display manual fix instructions
Branch not recognizedWarn that branch {name} doesn't match expected patterns, ask for --branch override
Version ID not foundDisplay the expected version string, instruct user to set it manually in JIRA
Transition not availableList available transitions, explain which one is needed and why it might be blocked

Notes

  • The jira-lifecycle-plugin config lives at openshift/release/core-services/jira-lifecycle-plugin/config.yaml. If validation rules change, update the mapping in this skill.
  • If a human manually adds jira/valid-bug, the bot will not remove it.
  • For cherry-pick PRs, the plugin may auto-clone the parent JIRA bug. Check for existing "Blocks" links before creating new dependents.
  • The main branch uses exclude_defaults: true, which disables dependent bug checks (5-7).

© openshift-eng, Apache-2.0. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file

Files

Just SKILL.md in plugins/jira/skills/validate-bug of openshift-eng/ai-helpers.

Open the folder on GitHubat commit a627176

Compare with similar skills

Validate Bug next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.

Validate Bug compared with similar skills
SkillStarsUsed inTokensAuto-checkLicenceRepo updated
Validate Bug this skillopenshift-eng/ai-helpers120—~3.6kAutomated safety check: PassApache-2.0
YugabyteDB Issue Creatoryugabyte/yugabyte-db11k—~2kAutomated safety check: PassCustom licence
Code Reviewcroffasia/itsaplan895—~2kAutomated safety check: PassAGPL-3.0
PR BodySAP/spartacus784—~499Automated safety check: PassApache-2.0
Link Ticket To SessionJayantDevkar/claude-code-karma329—~1.8kAutomated safety check: NotesApache-2.0
SDK Changelogbouffalolab/bouffalo_sdk501—~1.1kAutomated safety check: PassApache-2.0

Similar skills

  • YugabyteDB Issue Creator

    yugabyte/yugabyte-db

    Creates a GitHub issue or JIRA ticket for a YugabyteDB change or bug, after scrubbing customer data, secrets and unreleased details from anything public.

    11k GitHub stars~2k tokensUpdated today
    DevelopmentAuto-check passed
  • Code Review

    croffasia/itsaplan

    A skill your agent uses when reviewing code — a diff, a merge request, a file, a directory, or a feature.

    895 GitHub stars~2k tokensUpdated yesterday
    DevelopmentAuto-check passed
  • PR Body

    SAP/spartacus

    Official

    A skill your agent uses when the user asks to generate, write, or draft a pull request (PR) body or description for the current branch.

    784 GitHub stars~499 tokensUpdated today
    DevelopmentAuto-check passed
  • Link Ticket To Session

    JayantDevkar/claude-code-karma

    Link the current Claude Code session to a ticket (Linear, Jira, GitHub Issues, or GitHub Pull Requests) and cache its title/status in karma.

    329 GitHub stars~1.8k tokensUpdated 9 days ago
    DevelopmentAuto-check: notes
  • SDK Changelog

    bouffalolab/bouffalo_sdk

    A skill your agent uses when generating a customer-facing CHANGELOG between two SDK release tags.

    501 GitHub stars~1.1k tokensUpdated 4 days ago
    DevelopmentAuto-check passed
  • Issue Triage Loop

    cobusgreyling/loop-engineering

    Scans open GitHub issues and discussions, flags duplicates, scores priority and proposes labels into issue-triage-state.md without ever labeling or closing.

    11k GitHub stars~522 tokensUpdated today
    DevelopmentAuto-check passed

More from openshift-eng/ai-helpers

All 118 skills in this repo
  • Investigate CI Reliability

    openshift-eng/ai-helpers

    Find and independently validate actionable reliability defects across OpenShift release jobs and presubmits, then export portable issue handoffs.

    120 GitHub stars~1.9k tokensUpdated yesterday
    Auto-check passed
  • Address Review PR

    openshift-eng/ai-helpers

    Fetch and address all PR review comments — categorize by priority, make code changes, post replies, and push.

    120 GitHub stars~2.9k tokensUpdated yesterday
    Auto-check passed
  • Categorize Activity Types

    openshift-eng/ai-helpers

    Categorize Jira issues into Red Hat Sankey Activity Type categories using MCP Jira tools.

    120 GitHub stars~2.4k tokensUpdated yesterday
    Auto-check passed
  • Has Review Work

    openshift-eng/ai-helpers

    Decide whether a GitHub PR has unanswered authorized review comments or new required CI failures worth a follow-up agent.

    120 GitHub stars~1.9k tokensUpdated yesterday
    Auto-check passed
  • Must Gather Analyzer

    openshift-eng/ai-helpers

    Analyze OpenShift must-gather diagnostic data including cluster operators, pods, nodes, and network components.

    120 GitHub stars~2.3k tokensUpdated yesterday
    Auto-check passed
  • Payload Autodl JSON

    openshift-eng/ai-helpers

    Schema for the autodl JSON data file produced by payload-analysis for database ingestion — you must use this skill whenever generating the autodl JSON file

    120 GitHub stars~2.6k tokensUpdated yesterday
    Auto-check passed

Works with

Categories

Questions about Validate Bug

What does Validate Bug do?

Diagnose and fix jira/invalid-bug on PRs by running the same 7 checks as the jira-lifecycle-plugin. Validate Bug is an agent skill from openshift-eng/ai-helpers.

When should I use Validate Bug?

Validate Bug fits situations like: development work in your project.

How do I install Validate Bug in Claude Code?

Run `npx skills add openshift-eng/ai-helpers --skill validate-bug -a claude-code`. Or copy the skill folder (plugins/jira/skills/validate-bug in openshift-eng/ai-helpers) into .claude/skills/validate-bug in your project. Claude Code loads it when a task matches its description.

How do I install Validate Bug in Codex?

Run `npx skills add openshift-eng/ai-helpers --skill validate-bug -a codex`. Or copy the skill folder (plugins/jira/skills/validate-bug in openshift-eng/ai-helpers) into .agents/skills/validate-bug in your project. Codex loads it when a task matches its description.

Can I use Validate Bug in Cursor, Gemini CLI or GitHub Copilot?

Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add openshift-eng/ai-helpers --skill validate-bug -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/validate-bug, .gemini/skills/validate-bug, .github/skills/validate-bug and .opencode/skills/validate-bug in your project.

What does Validate Bug need to run?

Going by SKILL.md and its folder, Validate Bug needs the command-line tools its instructions call (gh) and credentials named JIRA_KEY. Our summary lists: A credential in JIRA_KEY.

Does Validate Bug access the network?

SKILL.md names 1 domain. In commands or code: github.com; the agent is likely to contact it when it follows the instructions. This is read from the text; nothing was executed.

Is Validate Bug safe to install?

Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. Review the folder before installing.

What licence does Validate Bug use?

Validate Bug is published under the Apache-2.0 licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.

How many tokens does Validate Bug use?

About 3.6k tokens (SKILL.md is roughly 14k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.

What are the alternatives to Validate Bug?

Skills that share tags, products or a category with Validate Bug: YugabyteDB Issue Creator (yugabyte/yugabyte-db, 11k stars), Code Review (croffasia/itsaplan, 895 stars), PR Body (SAP/spartacus, 784 stars) and Link Ticket To Session (JayantDevkar/claude-code-karma, 329 stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.

Who maintains Validate Bug?

openshift-eng (a GitHub organization) maintains it in openshift-eng/ai-helpers, which has 120 GitHub stars. The repository holds 118 skills in this directory. The repository was last updated on October 6, 2026.

Source: openshift-eng/ai-helpers on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.