Skill flagged — suspicious patterns detected

ClawHub Security flagged this skill as suspicious. Review the scan results before using.

Aport Complete

v0.1.0

Verify a completed task against your APort passport's deliverable contract before marking it done. Enforces acceptance criteria, summary requirements, test s...

0· 259· 1 versions· 0 current· 0 all-time· Updated 14h ago· MIT-0
byUchi Uchibeke@uchibeke

Install

openclaw skills install aport-complete

/aport-complete — Verify Before Done

Your APort passport defines what you must deliver before a task is complete. This skill enforces that contract. Do not mark any task done without running this first.

When to use this skill

  • Before telling a user "I'm done" or "it's complete"
  • Before closing a task, ticket, or GitHub issue
  • Before opening a PR and considering work finished
  • Before handing off to another agent
  • Any time you would otherwise call a task complete

Prerequisites

You must have an APort passport with a deliverable contract.

If you don't have one, create a passport first:

You need APORT_AGENT_ID in your environment. This is returned when you create your passport and saved to aport-passport.json.

Step 1 — Compile your completion context

Before calling the API, gather:

FieldRequiredHow to get it
task_idYesThe task/ticket/issue identifier
output_typeYescode, document, analysis, plan, data, or other
summaryIf passport requires itWrite a clear summary of what you did
tests_passingIf passport requires itRun your test suite, report result
author_agent_idIf reviewer requiredYour own APORT_AGENT_ID
reviewer_agent_idIf reviewer requiredThe agent_id of the reviewing agent
criteria_attestationsAlwaysOne entry per criterion in your passport
output_contentIf scan_output enabledYour full output (for pattern scanning)

Step 2 — Build your attestations

Your passport defines acceptance criteria as a list of descriptions. Each criterion maps to a criterion_id — the description slugified to lowercase with spaces replaced by hyphens.

Example:

Criterion description: "A concrete output artifact must be produced"
criterion_id:          "a-concrete-output-artifact-must-be-produced"

For each criterion in your passport, you must submit:

{
  "criterion_id": "a-concrete-output-artifact-must-be-produced",
  "met": true,
  "evidence": "Concrete evidence — a file path, PR URL, CI run id, command output"
}

Evidence must be non-empty. "I believe this is met" is not evidence. Good evidence: PR #47 at github.com/org/repo/pull/47 Good evidence: grep -r "TODO" src/ returned 0 results Good evidence: CI run #1234 passed — https://ci.example.com/runs/1234

Step 3 — Call the verify endpoint

POST https://aport.io/api/verify/policy/deliverable.task.complete.v1
Content-Type: application/json

{
  "context": {
    "agent_id": "YOUR_APORT_AGENT_ID",
    "task_id": "TASK_IDENTIFIER",
    "output_type": "code",
    "author_agent_id": "YOUR_APORT_AGENT_ID",
    "summary": "What you did — must meet minimum word count in your passport",
    "tests_passing": true,
    "criteria_attestations": [
      {
        "criterion_id": "criterion-slug-here",
        "met": true,
        "evidence": "Concrete evidence string"
      }
    ]
  }
}

Note: agent_id goes inside context, alongside the policy-specific fields.

Step 4 — Handle the response

ALLOW response

{
  "decision": {
    "decision_id": "xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx",
    "allow": true,
    "reasons": [
      { "code": "capability_verified", "message": "...", "severity": "info" }
    ],
    "created_at": "2026-03-13T09:00:00Z",
    "signature": "...",
    "policy_id": "deliverable.task.complete.v1",
    "agent_id": "ap_..."
  },
  "request_id": "..."
}

The task is done. You may mark it complete, close the ticket, open the PR. Reference the decision_id in your completion message for the audit trail.

DENY response

{
  "decision": {
    "decision_id": "xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx",
    "allow": false,
    "reasons": [
      { "code": "oap.summary_insufficient", "message": "Summary is required...", "severity": "error" }
    ]
  },
  "request_id": "..."
}

Do not mark the task done. Check decision.reasons[].code for the deny code. Fix the issue and retry.

deny_codeWhat it meansWhat to do
oap.summary_insufficientSummary too short or missingRewrite summary with more detail
oap.tests_not_passingTests failing or not submittedFix tests, resubmit with tests_passing: true
oap.criteria_not_metA criterion has met: falseResolve the criterion, re-attest
oap.evidence_missingAn attestation has no evidenceAdd a concrete evidence string
oap.criteria_incompleteMissing attestation for a criterionAdd attestations for all passport criteria
oap.self_review_not_allowedReviewer and author are the sameGet a different agent to review
oap.blocked_pattern_detectedOutput contains blocked contentRemove blocked patterns, resubmit
oap.passport_suspendedPassport is suspendedContact APort — your passport needs attention
oap.unknown_capabilityPassport missing deliverable.task.completeCreate a new passport with a deliverable contract

Step 5 — Announce completion

Once you receive allow: true, tell the user:

  • What you completed
  • The decision_id (if they want the audit trail)
  • Any next steps

Do not say "done" before receiving allow: true. The contract defines done, not you.

Retry behaviour

The deny_code is designed for autonomous retry. If you receive:

  • oap.summary_insufficient → rewrite your summary and retry immediately
  • oap.evidence_missing → add evidence strings and retry immediately
  • oap.tests_not_passing → attempt to fix the failing tests, then retry
  • oap.blocked_pattern_detected → remove the blocked content, then retry
  • oap.self_review_not_allowed → this requires another agent — ask the user or route to reviewer
  • oap.criteria_not_met → attempt to resolve the criterion, then retry

Maximum retries: 3. After 3 denials on the same task, surface the issue to the user. Do not loop indefinitely.

Links

Version tags

latestvk97dy4t8tfnmz40epkd34z73ex82xr9a