Skip to main content

Asdlc

@hivemq/asdlcv2026.07.22.1784724439beta· 20d agoMODELSWORKFLOWSREPORTSSKILLS
01README

Agent-friendly Software Development Lifecycle models

02Models9
@hivemq/asdlc/classifyv2026.07.17.1784299198asdlc/classify.ts
fn classify(issueId: string, identifier?: string, title: string, description: string)
Classify a Linear issue as bug, feature, maintenance, or investigation/research. Uses claude CLI locally (Claude Code subscription) or Anthropic API in CI.
ArgumentTypeDescription
issueIdstringLinear issue ID
identifier?stringIssue identifier (e.g. PLT-123)
titlestringIssue title
descriptionstringIssue description

Resources

classification(infinite)— Issue classification result with token usage
lifecycleTrace(infinite)— OTel trace context for cross-workflow lifecycle correlation
@hivemq/asdlc/linearv2026.07.21.1784665715asdlc/linear-issue.ts
fn getIssue(identifier: string)
Fetch a single Linear issue by ID or identifier (e.g. PLT-955)
ArgumentTypeDescription
identifierstringIssue identifier (e.g. PLT-955) or UUID
fn listIssueComments(issueId: string)
Fetch all comments on a Linear issue. Each entry carries parentId so reply-listener style code can walk the thread. Uses the model's globalArgs.apiKey so callers don't need to pipe a Linear key through method inputs.
ArgumentTypeDescription
issueIdstringLinear issue ID
fn listCommentReplies(issueId: string)
Fetch only the reply comments (children) whose parent is in the supplied set. Uses the Linear SDK's server-side filter sdk.comments({ filter: { parent: { id: { in: parentIds } } } }) — one query, no client-side filtering, and no need to page the entire issue comment thread. Returns parentId on each entry so callers can group replies back to their parent.
ArgumentTypeDescription
issueIdstringIssue id — used as the resource instance key for the returned issueCommentList record
fn listCommentRepliesBatch()
Fetch reply comments whose parent is in the supplied set, across any number of issues, in a single Linear query. Uses the SDK's server-side filter sdk.comments({ filter: { parent: { id: { in: parentIds } } } }) — the same shape as listCommentReplies, but without the per-issue scoping. Designed for driver loops that need replies for many tickets in one workflow step (in-process via task: model_method) instead of N subprocess calls. Returns a flat array of replies where each entry carries parentId
fn addComment(issueId: string, body: string, dryRun?: boolean)
Post a comment on a Linear issue
ArgumentTypeDescription
issueIdstringLinear issue ID
bodystringComment body (Markdown)
dryRun?booleanSkip mutation when true
fn updateComment(commentId: string, body: string, dryRun?: boolean)
Edit a Linear comment in place by id. Used by the factory driver to mutate a single per-ticket activity comment as the run progresses, rather than posting a new comment per lifecycle event.
ArgumentTypeDescription
commentIdstringLinear comment ID
bodystringFull new comment body (Markdown)
dryRun?booleanSkip mutation when true
fn deleteComment(commentId: string, dryRun?: boolean)
Delete a Linear comment by id. Used to remove a bot comment the workflow-driver superseded (e.g. a stale 'plan missing' notice). Authenticates as the vault api-key identity, so it can delete comments that identity authored.
ArgumentTypeDescription
commentIdstringLinear comment ID
dryRun?booleanSkip mutation when true
fn addLabel(issueId: string, labelName: string, dryRun?: boolean)
Add a label to a Linear issue by label name
ArgumentTypeDescription
issueIdstringLinear issue ID
labelNamestringLabel name to add
dryRun?booleanSkip mutation when true
fn removeLabel(issueId: string, labelName: string, dryRun?: boolean)
Remove a label from a Linear issue by label name
ArgumentTypeDescription
issueIdstringLinear issue ID
labelNamestringLabel name to remove
dryRun?booleanSkip mutation when true
fn setAssignee(issueId: string, assigneeId: string, dryRun?: boolean)
Set or change the assignee of a Linear issue
ArgumentTypeDescription
issueIdstringLinear issue ID
assigneeIdstringLinear user ID to assign
dryRun?booleanSkip mutation when true
fn setStatus(issueId: string, stateId: string, dryRun?: boolean)
Change the workflow state of a Linear issue
ArgumentTypeDescription
issueIdstringLinear issue ID
stateIdstringTarget workflow state ID
dryRun?booleanSkip mutation when true
fn listUnclassified()
List team issues that have no Issue Type label (Bug, Feature, Maintenance) and are not in completed or cancelled states. Returns an array of issue summaries for bulk classification.
fn getPlannable()
List team issues in Planning status assigned to the current user (API key owner). Returns an IssueBatchSchema resource.
fn assertStatus(issueIdentifier: string, currentStatus: string, expectedStatus: string)
Gate step: succeeds if Linear status matches expected value, throws with drift message otherwise
ArgumentTypeDescription
issueIdentifierstringIssue identifier for error message
currentStatusstringCurrent Linear status name
expectedStatusstringExpected status name
fn listProjectEligible(projectId: string)
Paginate all issues in a Linear project, filter to lifecycle-eligible tickets (Todo, Planning with approval comment, In Progress, In Review with merged PR, Validation), and write the result to the eligible resource spec at eligible-{projectId}.
ArgumentTypeDescription
projectIdstringLinear project ID (UUID)

Resources

issue(infinite)— A Linear issue snapshot
comment(infinite)— A comment posted to a Linear issue
batch(infinite)— Batch query result (e.g. unclassified issue list)
eligible(infinite)— Eligible project tickets for lifecycle processing
issueCommentList(infinite)— All comments on a single Linear issue at a point in time. Used by reply-listener style code that wants to see threads (each entry carries parentId) without holding a Linear API key itself.
replyBatch(infinite)— Replies fetched in a single batched Linear query across one or more parent comments. Produced by listCommentRepliesBatch; consumed by drivers that need replies for many tickets in one workflow step without per-ticket fan-out.
@hivemq/asdlc/planv2026.07.17.1784299199asdlc/plan.ts
fn generate(issueId: string, identifier?: string, title: string, description: string, labels?: array, stateName?: string, replanPrompt?: string, priorFactoryFindings: array)
Generate a plan for a classified Linear ticket. Produces one draft, validates the JSON shape via retry-with-feedback (structural repair only), records the artifact. Plan acceptance is owned by the factory's plan-review stage — there is no internal adversarial review loop here (PLT-1141).
ArgumentTypeDescription
issueIdstringLinear issue ID
identifier?stringIssue identifier (e.g. PLT-941)
titlestringIssue title
descriptionstringIssue description
labels?arrayCurrent labels on the issue
stateName?stringCurrent Linear status name
replanPrompt?stringWhen set, bypasses the 'plan exists' guard and regenerates with this feedback as context. Provided by /replan <prompt> on the plan comment.
priorFactoryFindingsarrayFindings from the factory's plan-review stage in the previous cycle, forwarded so the planner can address them on replan. Re-lands PLT-1134.
fn review(issueId: string, identifier?: string, reviewType: enum, scope: string, approach: string, acceptanceCriteria: string, priorFindings: array, acceptanceCriteriaCheck: array)
Run one review pass against an existing plan JSON. `reviewType=adversarial` loads `prompts/adversarial-review.md` (7-dimension principal-engineer review); `reviewType=security` loads `prompts/security-review.md` (7-dimension security-engineer review). Returns findings; does not mutate the plan. Multi-cycle gating is the caller's responsibility (e.g. the factory's plan-review stage maxCycles).
ArgumentTypeDescription
issueIdstringLinear issue ID
identifier?stringIssue identifier (e.g. PLT-941)
reviewTypeenumWhich review prompt to run. `adversarial` is the 7-dim principal-engineer sweep; `security` is the 7-dim security-engineer sweep. Plan-review workflow runs both in parallel.
scopestringPlan scope
approachstringPlan approach
acceptanceCriteriastringPlan acceptance criteria
priorFindingsarrayFindings from earlier review cycles (for regression awareness).
acceptanceCriteriaCheckarrayPlanner's self-asserted AC -> construct mapping. Reviewer verifies these entries instead of re-deriving the mapping. PLT-1163.

Resources

plan(infinite)— Plan artifact with 6 structured sections
review(infinite)— Adversarial review findings for a plan version
@hivemq/asdlc/implementv2026.07.22.1784711835asdlc/implement.ts
fn implement(issueId: string, identifier?: string, title?: string, planScope?: string, planApproach?: string, planRisks?: array)
Implement an approved plan: spawn headless claude session, create branch, write code, open PR, post URL to Linear.
ArgumentTypeDescription
issueIdstringLinear issue ID
identifier?stringIssue identifier (e.g. PLT-941)
title?stringIssue title
planScope?stringPlan scope text
planApproach?stringPlan approach text
planRisks?arrayPlan risks bullets

Resources

implementation(infinite)— Implementation artifact tracking agent work, branch, and PR
lifecycleTrace(infinite)— OTel trace context for cross-workflow lifecycle correlation
@hivemq/asdlc/githubv2026.07.18.1784378975asdlc/github.ts
fn fetchPrDiff(prNumber: number, issueId: string, identifier?: string)
Fetch the diff for a GitHub PR and persist it in the swamp datastore.
ArgumentTypeDescription
prNumbernumberGitHub PR number
issueIdstringLinear issue ID — used to scope the datastore entry
identifier?stringIssue identifier (e.g. PLT-973)

Resources

prDiff(infinite)— PR diff fetched from GitHub, scoped per issue ID
@hivemq/asdlc/reviewv2026.07.17.1784299201asdlc/review.ts
fn review(issueId: string, identifier?: string, prNumber: number, prUrl: string, planVersion: number, stateName?: string)
Review a draft PR's diff against plan acceptance criteria. Approves or posts inline findings.
ArgumentTypeDescription
issueIdstringLinear issue ID
identifier?stringIssue identifier (e.g. PLT-973)
prNumbernumberGitHub PR number
prUrlstringGitHub PR URL
planVersionnumberPlan version the implementation was built against
stateName?stringCurrent Linear status name

Resources

review(infinite)— Adversarial code review result
@hivemq/asdlc/validatev2026.07.18.1784379020asdlc/validate.ts
fn validate(issueId: string, identifier?: string, prNumber?: number, prNumbers?: string, stateName?: string, planModelName: string, validatorModelName?: string, lifecycleTraceId?: string, lifecycleClassifySpanId?: string, lifecycleClassifiedAt?: string)
Validate a merged PR by checking CI deploy status and telemetry health. Posts report to Linear and transitions to Done on all-PASS.
ArgumentTypeDescription
issueIdstringLinear issue ID
identifier?stringIssue identifier (e.g. PLT-980)
prNumber?numberGitHub PR number (from implement data)
prNumbers?stringComma-separated PR numbers (fallback)
stateName?stringCurrent Linear status name
planModelNamestringName of the asdlc-plan instance to read the plan's acceptance criteria from when assembling the validator brief.
validatorModelName?stringName of this validator instance (e.g. asdlc-validate-PLT-123). Used to look up prior validation attempts for the same issueId. Defaults to a shared instance lookup if omitted.
lifecycleTraceId?stringOTel traceId from classification
lifecycleClassifySpanId?stringOTel spanId from classification
lifecycleClassifiedAt?stringISO timestamp of classification

Resources

validation(infinite)— Post-merge validation result with CI and telemetry checks
lifecycleTrace(infinite)— OTel trace context for cross-workflow lifecycle correlation
@hivemq/asdlc/approvalsv2026.07.14.1784053468asdlc/approvals.ts

Global Arguments

ArgumentTypeDescription
linearApiKey?stringLinear API key for the in-process comment fetch on the sweep path
projectFilter?arrayAllowed Linear project UUIDs (instance ingress filter, legacy — prefer predicate)
assigneeFilter?arrayAllowed Linear assignee user ids (instance ingress filter, legacy — prefer predicate)
fn launch(identifier: string, dryRun: boolean, driverName: string)
Fire @hivemq/asdlc/driver for a work item (non-blocking). `process` later maps a Linear /approve reply to the suspended run by reading the run's `identifier` input, so no mapping is recorded here.
ArgumentTypeDescription
identifierstringLinear issue identifier (e.g. PLT-955)
dryRunboolean
driverNamestring
fn process(driverName: string, reworkDriverName: string, linearModelName: string, validateWorkflow: string, webhookBody: unknown)
Apply a Linear slash-command reply to a suspended driver gate, re-fire post-merge validation on /revalidate, or clear the per-ticket launch guard on /clear-guard. Payload path (webhookBody set): act on the delivered comment directly — no re-query, so it does not race Linear's read-after-write lag. Sweep path (no webhookBody): re-query each suspended run's comments, a periodic backstop.
ArgumentTypeDescription
driverNamestring
reworkDriverNamestringWorkflow launched fresh on /approve and /rework. /approve runs it with an empty reworkPrompt (implement the approved plan as-is). A fresh `workflow run` is unbounded, so it reaches rework-or-halt; `workflow resume` (the old /approve path) hardcodes a 10-minute timeout (swamp Lab #1136) that aborts a long drive first.
linearModelNamestring
validateWorkflowstringWorkflow re-fired by a /revalidate reply on a ticket in Validation. Re-runs post-merge validation for the ticket (the same workflow dispatch fires on the Issue->Validation transition), so a deferred/failed validate can reach a terminal verdict without a manual launch.
webhookBodyunknownVerified Linear webhook body from the triggering delivery. When a Comment create, its /approve|/replan|/rework|/retry|/halt|/revalidate|/clear-guard is applied from the payload directly. Empty for a periodic sweep.
fn dispatch(body: unknown, deliveryId: string, projectFilter: array, assigneeFilter: array, viewerId: string, driverName: string, validateWorkflow: string, linearModelName: string)
Route a verified Linear webhook body: issue-create (or a label-added update) matching the configured ingress predicate launches the driver (deduped by delivery id). Comment events are left to the paired `process` step. Registered as the first step of the linear webhook workflow.
ArgumentTypeDescription
bodyunknownVerified Linear webhook JSON body
deliveryIdstringLinear-Delivery header — idempotency key
projectFilterarrayAllowed Linear project UUIDs (legacy — prefer predicate). A ticket is eligible if its project is listed AND its assignee (if assigneeFilter is set) is in assigneeFilter.
assigneeFilterarrayAllowed Linear assignee user ids (legacy — prefer predicate). A ticket is eligible if its assignee is listed AND its project (if projectFilter is set) is in projectFilter.
viewerIdstring
driverNamestring
validateWorkflowstring
linearModelNamestringModel instance dispatch reads a ticket's persisted Linear snapshot from, for the merge-triggered validate path's predicate check (PLT-1429).

Resources

delivery(7d)— Processed Linear webhook delivery id (dispatch idempotency)
validatedMerge(infinite)— Ticket identifier already moved to Validation by a merge-triggered dispatch (PLT-1429) — per-ticket idempotency across a ticket's several merged PRs, independent of live Linear state.
@hivemq/asdlc/hardenv2026.07.13.1783943835asdlc/harden.ts
fn run(issueId: string, identifier: string, prNumber: number, prUrl: string, planVersion: number, maxCycles: number, dryRun: boolean, reviewModelName: string, implementModelName: string)
Run the adversarial review->fix loop over the work item's PR up to maxCycles times. Succeeds when review clears all HIGH/CRITICAL (PR opened for human review); throws when still stuck after maxCycles so the driver routes to the rework-or-halt gate.
ArgumentTypeDescription
issueIdstringLinear issue UUID (keys the review/implement resources)
identifierstringLinear identifier (e.g. PLT-955), for logs
prNumbernumberPR number; resolved from the implementation resource when 0
prUrlstring
planVersionnumber
maxCyclesnumberCycle budget override. Left at its default, harden resolves the budget from .harness.yaml's review_cycle_count; an explicit value here always wins.
dryRunboolean
reviewModelNamestring
implementModelNamestring

Resources

hardenResult(infinite)— Outcome of the adversarial hardening loop for a work item
03Workflows4
@hivemq/asdlc/driver3d59c48c-6d89-4861-a23d-e1af0d40377b

The unified Agent Harness workflow driver: classify -> plan -> [approve-plan] -> implement -> harden -> [validate | rework-or-halt]. Two native swamp `manual_approval` gates bracket the code work. At `approve-plan` (after the plan posts) a human replies /approve, /replan <guidance>, or /halt. implement then runs, followed by `harden` — the adversarial review<->fix loop (up to 3 cycles). When harden clears HIGH/CRITICAL it marks the PR ready for human review (approval happens in GitHub) and the r

lifecycleDrive one Linear work item classify -> plan -> [approve] -> implement -> review -> validate
1.fetch-issue— Fetch issue details from Linear
2.classify— Classify issue type, apply label, transition Todo -> Planning, post comment
3.generate-plan— Generate a plan (self-skips on terminal status or missing type label)
4.post-plan— Post the recorded plan comment to Linear so the approver can read it
5.approve-plan— Human approval before any code is written
6.implement— Implement the approved plan and open a PR (only runs on approval)
7.harden— Adversarial review->fix loop; opens the PR for humans when it clears
8.rework-or-halt— Implementation did not reach a clean PR; human chooses /rework or /halt
9.validate— Post-merge validation (self-skips until the PR is merged)
@hivemq/asdlc/driver-reworkdd047121-9fc4-4c7e-8b09-c98e5370f2c1

Rework relaunch for the Agent Harness driver. Entered from a `/rework <guidance>` reply at the full driver's `rework-or-halt` gate (the approvals bridge rejects that run and launches this one). It reuses the plan the human already approved: no classify, no plan, no plan-approval gate. implement runs with the operator guidance as revision context, then `harden` runs the adversarial review<->fix loop again. Clears -> validate; still stuck after 3 cycles -> the same `rework-or-halt` gate for anothe

reworkRedo implementation with operator guidance, then re-harden
1.fetch-issue— Refresh issue details from Linear (also the issueId join key)
2.implement— Revise the existing PR against the approved plan and the rework guidance
3.harden— Adversarial review->fix loop; opens the PR for humans when it clears
4.rework-or-halt— Implementation did not reach a clean PR; human chooses /rework or /halt
5.validate— Post-merge validation (self-skips until the PR is merged)
@hivemq/asdlc/validate-driver3a3e5443-bb6d-40b9-81a4-d3018c73e860

Post-merge validation entry point for the Agent Harness. Launched by the approvals dispatch step when a Linear Issue update moves a ticket into Validation (Linear's "On PR merge -> Validation" automation fires that update). The driver's own validate step self-skips until merge, and the run is not re-executed after a human merges, so this standalone workflow re-runs validate off the Validation transition. It re-fetches the issue (fresh stateName == Validation), then validates the merged PR whose

validate-mergedRe-fetch the issue, then validate the merged PR
1.fetch-issue— Fetch issue details from Linear (stateName is now Validation)
2.validate— Validate the merged PR and transition to Done on all-PASS
@hivemq/asdlc/approvals-webhook4a01dbce-bf2b-4152-90b7-3308e95ba608

Webhook entry point for the Agent Harness driver, registered on swamp serve twice: the Linear scheme `--webhook <route>:@hivemq/asdlc/approvals-webhook:@env=LINEAR_WEBHOOK_SECRET:linear` and the GitHub scheme `--webhook <route>:@hivemq/asdlc/approvals-webhook:@env=GITHUB_WEBHOOK_SECRET:github` (PLT-1429, a merged-pull-request delivery — the harness observing the merge itself rather than depending on Linear's own "On PR merge" automation to move the ticket). swamp serve HMAC-verifies the payload

handleLaunch on a new issue, then apply any reply command
1.dispatch— Issue-create or label-added matching the configured predicate launches the driver; a merged GitHub PR moves its ticket to Validation and fires the validate driver (PLT-1429). Deduped by delivery.
2.process-replies— Apply the ticket assignee's slash-command reply from the webhook body
04Reports1
@hivemq/asdlc/classificationworkflow
sweep-summary.ts

Summary table of issue classifications produced by classify-issues

asdlcclassification
05Skills2
asdlc-harness1 file
asdlc-report-issue1 file
06Previous Versions19
2026.07.22.1784716794
2026.07.22.1784711835
2026.07.22.1784710564
2026.07.22.1784710496
2026.07.21.1784668768
2026.07.21.1784665758
2026.07.21.1784664598
2026.07.21.1784644440
2026.07.21.1784644169
2026.07.21.1784642539
2026.07.21.1784642419
2026.07.21.1784642138
2026.07.21.1784637673
2026.07.21.1784626480
2026.07.20.1784572485
2026.07.19.1784447254
2026.07.18.1784401620
2026.07.18.1784396599
2026.07.17.1784307457
07Stats
Downloads
5,885
Archive size
3.0 MB

Not yet scored.

A score will be generated the next time this extension is published. The owner can also trigger scoring manually.

08Platforms