Skip to content
Back to skills

Meta

ASecurity

ASE Skill Meta Information ========================== Skill Output ------------ - *IMPORTANT*: The following rules apply both to regular skill responses *and* to generated plan files (`EnterPlanMode` tool). - *IMPORTANT*: The syntax `<xxx>[...]</xxx>` is used to *set* the value of a placeholder named `xxx`, and the syntax `<xxx/>` is used to *get* the value of a placeholder named `xxx`. - *IMPORTANT*: *All* output is *exclusively* requested through <template/> sections. You *MUST* *NOT*...

  • 56 stars
  • 0 votes
  • 0 copies
  • 3 views
  • Added September 1, 2026
ai-agentspythongojavagitdocumentation

Works with

  • claude code
  • cursor
  • cli
  • mcp

Security analysis

A100/100

Pro scans all 15 files and shows the line behind each finding

Scanned September 22, 2026

npx -y skills add rse/ase --skill meta --agent claude-code

Installs into .claude/skills of the current project.

Are you the author of Meta?

Add the live security badge to your README. It updates with every re-scan.

Security grade badge for Meta
[![Security: A — Skills Directory](https://www.skillsdirectory.com/api/skills/rse-meta/badge)](https://www.skillsdirectory.com/skills/rse-meta)

More formats (shields.io, HTML) on the badges page. Keep it an A: scan every change in CI with Pro.

Download with Pro
SKILL.md

ASE Skill Meta Information
==========================

Skill Output
------------

-   *IMPORTANT*: The following rules apply both to regular skill responses
    *and* to generated plan files (`EnterPlanMode` tool).

-   *IMPORTANT*: The syntax `<xxx>[...]</xxx>` is used to *set* the value
    of a placeholder named `xxx`, and the syntax `<xxx/>` is used to *get*
    the value of a placeholder named `xxx`.

-   *IMPORTANT*: *All* output is *exclusively* requested through
    <template/> sections. You *MUST* *NOT* output anything *UNLESS* it
    is explicitly included in such a <template/> section. Especially,
    you *MUST* *NOT* output any explanations on your own, unless
    explicitly requested.

-   *IMPORTANT*: You *MUST* output all <template/> sections *EXACTLY* as provided
    (including newlines), *EXCEPT* for expanding control items, removing
    trailing spaces, replacing the placeholders `<xxx/>` and `[...]`,
    replacing XML entities (like `&#x25CB;`) with the corresponding
    Unicode characters, and the potential reduction of prose according
    to the currently defined persona style.

-   *IMPORTANT*: For *Final-Message-Only Display* ("focus mode"):
    some agent harnesses show the user only the *final* text message of
    a turn and *hide* all text emitted *between* tool calls. If your
    harness instructions indicate such a mode (e.g. *Anthropic Claude Code CLI* with
    "focus mode" enabled), you *MUST* repeat *all* <template/> outputs
    emitted since the last shown final text message -- *verbatim*, in
    their *original order*, and each only *once* -- at the *top* of the
    next final text message (i.e. the text after the last tool call of
    a turn). Never *drop* or *summarize* a <template/> output just
    because it would land between tool calls. If no such display mode
    is indicated, do *not* repeat anything.

-   *IMPORTANT*: The active *persona style* (see `ase-persona.md`) *MUST* be applied
    to all *free-text placeholders* within <template/> sections - i.e. any placeholder
    whose content you author yourself (such as `<description/>`, `<title/>`, `<objective/>`,
    `<summary/>`, `<explanation/>`, etc.). The *structure* of the template (fixed keywords,
    punctuation, labels) remains unchanged; only the *authored content* inside free
    placeholders carries the persona style.

-   *IMPORTANT*: For *Diagrams*: whenever the response needs a
    diagram (structural, control-flow, state, sequence, class,
    entity-relationship, or metrics), you *MUST* build a Mermaid
    specification and dispatch its rendering to the `ase-meta-diagram`
    sub-agent via the `Agent` tool (`subagent_type: "ase:ase-meta-diagram"`),
    then reproduce its returned fenced code block verbatim in the
    response text. All hand-drawn ASCII frames, raw Mermaid source as a
    substitute for a rendered block, and missing reproduction of the
    rendered block are defects defined by that agent.

-   *IMPORTANT*: For Markdown *Tables*:

    -   *Alignment is mandatory*: every vertical edge character
        (`|`, `│`, `+`) that belongs in the same column *must*
        sit at the same column across all rows. Determine box
        width from the *longest* content line plus 1-space
        padding, draw the top edge to that width, then keep every
        inner line (including annotations like `!`, `?`, `*`)
        within it. Count columns and verify before emitting; a
        one-space drift is a defect - re-render.

-   *IMPORTANT*: For *Findings* (problems, tradeoffs, warnings
    emitted by analysis skills):

    -   *Evidence-grounded (mandatory)*: each finding MUST cite
        the exact line range that triggers it AND the cited
        snippet must prove the claim *verbatim*. If the cited
        lines do not prove the claim, *re-investigate and
        re-cite correctly*. Drop the finding *only* if no code
        location in the scanned files proves it - never drop
        due to sloppy citation alone.

    -   *Documented-context alignment*: cross-check each
        finding against documented context - interface
        contracts, docstrings (Javadoc, JSDoc, Python
        docstring, ...), adjacent code comments, and
        project-level AI guidance files (`CLAUDE.md`,
        `AGENTS.md`, `GEMINI.md`, `MEMORY.md`,
        `.github/copilot-instructions.md`, `.cursor/rules/`,
        or similar). Two cases resolve via the same
        mechanism - do *not* drop, keep the finding visible
        for traceability:

        -   *Problem already addressed*: the finding's
            concern is explicitly stated in a contract or
            docstring (e.g. "MUST be non-blocking"). Mark
            severity `ACCEPTED` with note "contractually
            addressed".

        -   *Fix conflicts with documented priority*: the
            recommendation would violate a documented priority
            (hot-path, allocation-free, lock-free,
            latency-sensitive, sub-µs budget). Either weaken the
            recommendation, convert it to a tradeoff, or mark
            severity `ACCEPTED` with note "priority-conflict
            accepted".

        Skills that report severity MUST support `ACCEPTED`
        in addition to `LOW`, `MEDIUM`, and `HIGH`.

Skill Sequential Processing
---------------------------

-   *IMPORTANT*: For each given <flow/>, you *MUST* use the
    `TaskCreate` tool to create a corresponding set of processing steps.

    Each `<step id="xxx" [...]>...</step>` corresponds to a
    `TaskCreate({ subject: "xxx", description: "xxx" })`. In other
    words, use the text of the `id` attribute of <step/> exactly
    *as-is* for both the `subject` and the `description` fields of
    `TaskCreate`.

    For speed, emit *all* `TaskCreate` calls together in a *single* turn
    (issued in parallel), *not* one-per-turn sequentially. Do *not*
    rely on the call order to establish the step order, as the parallel
    results carry no guaranteed ordering.

    Instead, in the *single immediately following* turn, first
    reconstruct the step-id-to-taskId mapping: because each task's
    `subject` equals the originating <step/> `id` (and <step/> ids are
    unique), match every created task back to its <step/> by comparing
    the task's `subject` to the step `id` -- read the ids straight from
    the `TaskCreate` results, or call `TaskList` if the results are
    no longer at hand.

    Then establish the strict order explicitly by chaining the created
    tasks with `TaskUpdate`: for each <step/> after the first one, set
    <this/> to the mapped taskId of this step and <prev/> to the mapped
    taskId of the predecessor step from the reconstructed mapping, and
    call `TaskUpdate({ taskId: "<this/>", addBlockedBy: [ "<prev/>" ]
    })` so that every step (with `taskId` <this/>) is blocked by its
    predecessor step (with `taskId` <prev/>).

-   *IMPORTANT*: For each <step/> you *MUST* use the `TaskUpdate` tool
    for updating its status *during* processing, once a <step/> has finished.

-   *IMPORTANT*: Whenever a skill *stops early* -- because a <step/>
    instructed you to *STOP* processing (on an error, a cancelled
    dialog, a short-circuit branch, or any other early exit) -- you
    *MUST*, *before* emitting the final <template/>, use the `TaskUpdate`
    tool to set the status of *every* still `pending` or `in_progress`
    task of the current <flow/> to `deleted`, so that no task of a
    finished skill remains open. Steps that were *skipped* because their
    `condition` attribute was not met *MUST* be treated the same way.

-   *IMPORTANT*: You *MUST* *strictly sequentially* execute every <step/> in
    a <flow/>. You *MUST* not implicitly skip any <step/> during
    processing, unless you were explicitly requested to do this or the
    step is configured to be a conditional step!

-   *IMPORTANT*: You *MUST* *strictly sequentially* execute every numbered
    item in a <step/>. You *MUST* not implicitly skip any numbered item during
    processing, unless you were explicitly requested to do this!

-   *IMPORTANT*: For any <step/> that specifies an *agent* in its
    `agent="[...]"` XML attribute, you *MUST* use the specified
    *agent* to execute the instructions for that <step/>.

-   *IMPORTANT*: If you need clarification on any details of your current
    <step/>, temporarily stop and immediately ask the user specific
    numbered questions, and then continue immediately once you have all
    of the information you need.

-   *IMPORTANT*: You *MUST* output the result of all <step/> *EXACTLY* as
    provided, without any further text interpretations and modifications.

MCP Tool Calls
--------------

-   *IMPORTANT*: Whenever you call *any* tool from the `ase` MCP server,
    you *MUST* check the response immediately:

    -   If the call fails because the `ase` MCP server is not running
        (tool not found, connection refused, server not connected, internal
        error), output the following and stop immediately:

        <template>
        ⧉ **ASE**: **ERROR:** MCP server not running - please start it via `ase service start` and reconnect via `/mcp`, then retry.
        </template>

    -   If the call fails for any other reason (timeout, transport error,
        or other infrastructure problem), output the following and stop immediately:

        <template>
        ⧉ **ASE**: **ERROR:** MCP tool unavailable
        </template>

    -   If the response `text` starts with or contains `ERROR: <info/>`,
        output the following and stop immediately:

        <template>
        ⧉ **ASE**: **ERROR:** MCP tool failed: <info/>
        </template>

        *EXCEPTION*: this rule does *NOT* apply to the `ase_getopt` tool,
        whose `ERROR:`-prefixed output is *expected* option-parsing
        feedback handled exclusively by step 4 of the `getopt` procedure
        (see `ase-getopt.md`); never emit this generic template for an
        `ase_getopt` response.

    -   Only on a clean response: proceed as the skill instructs.

Skill Identification
--------------------

-   *IMPORTANT*: Set <purpose></purpose> (set to empty)
    and <skill-name></skill-name> (set name to empty).

    In case <purpose/> later becomes *not* empty by defining it as
    <purpose name="<name/>"><body/></purpose>, set
    <skill-name><name/></skill-name> (set skill name to name), and then
    (but only if ((`$1` is *NOT* equal to `-h` or `--help`) *AND*
    (<ase-guidance-level/> is equal to `normal` or `verbose`))) you *MUST*
    once output the following output <template/>:

    <template>
    ⧉ **ASE**: ✪ skill: **<skill-name/>**, ✦ purpose: **<purpose/>**, ▶ status: **skill started**
    </template>

    Later (but only if ((`$1` is *NOT* equal to `-h` or `--help`) *AND*
    (<ase-guidance-level/> is equal to `normal` or `verbose`))), once
    this skill finally will stop processing, you *MUST* once output the
    following output <template/>:

    <template>
    ⧉ **ASE**: ✪ skill: **<skill-name/>**, ▶ status: **skill finished**
    </template>

-   *IMPORTANT*: Set <objective></objective> (set to empty).
    Then, in case <objective/> later becomes *not* empty
    (but only if <ase-guidance-level/> is equal to `normal` or `verbose`),
    you *MUST* once output the following output <template/>:

    <template>
    ⧉ **ASE**: ✪ skill: **<skill-name/>**, ◎ objective: **<objective/>**
    </template>

-   *IMPORTANT*:
    If `$1` (the first token of the skill arguments) is equal to `-h` or
    `--help`, you *MUST* once output the following output <template/> and
    then *IMMEDIATELY* *STOP* the further skill processing:

    <template>
    @${CLAUDE_SKILL_DIR}/help.md
    </template>

-   *IMPORTANT*:
    You *MUST* *NOT* output any summaries, explanations, or next
    steps at the end of a skill besides the explicit outputs via any
    <template/>.

Artifact Boxing Transparency
----------------------------

-   *IMPORTANT*: The *boxing* of a project (indicated by
    <ase-project-boxing/> configuration) classifies how *transparent*
    its *source artifacts* (specification, architecture, source code,
    documentation, infrastructure, task plan, and other artifacts) are,
    and thus how *deeply* you *MUST* inspect or produce them and how
    *much* of their internals you *MUST* surface.

-   *IMPORTANT*: Boxing modulates only the *work depth* (inspection and
    production thoroughness) and the *output visibility* (surfaced
    content and findings) of *artifact-touching* skills, per the three
    lists below. It *MUST* *NOT* alter the *communication style*
    (governed exclusively by the persona), and it *MUST* *NOT* apply to
    skills that neither read, critique, nor write any project source
    artifact.

    -   If <ase-project-boxing/> is `white`:
        -   Transparency:      *fully*
        -   Work depth:        inspect *fully*, produce *thoroughly*
        -   Findings surfaced: *all*
        -   Internals exposed: *full* (complete diffs, exhaustive rationale)

    -   If <ase-project-boxing/> is `grey`:
        -   Transparency:      *partially*
        -   Work depth:        inspect *significant* parts, produce *reasonably*
        -   Findings surfaced: *essentials*, summarize rest
        -   Internals exposed: *key* only (essential hunks, condensed rationale), summarize rest

    -   If <ase-project-boxing/> is `black`:
        -   Transparency:      *none*
        -   Work depth:        *minimum* work to satisfy the request
        -   Findings surfaced: *none* (report only the *outcome*)
        -   Internals exposed: *none* (no diffs, no code, no per-artifact explanation)

-   *IMPORTANT*: Precedence rule: a skill's *explicit* `black` branches
    and a skill's *explicit* output suppression instructions
    deterministically skip or suppress and *win* over the implicit decisions
    above. Where no such branches or instructions exist, the decisions
    above apply.

Guidance Hint Level
-------------------

-   *IMPORTANT*: The *guidance* of the agent (indicated by
    <ase-guidance-level/> configuration) classifies how many
    *unsolicited hints* -- pointers to the available *ASE* skills, to
    their options, and to the recommended next operations, which the
    user did *not* explicitly ask for -- you *MUST* emit in addition to
    the requested result.

-   *IMPORTANT*: Guidance modulates only the *hints*, per the four
    levels below. It *MUST* *NOT* alter the *communication style*
    (governed exclusively by the persona), it *MUST* *NOT* alter the
    *work depth* or the *output visibility* (governed exclusively by the
    boxing), and it *MUST* *NOT* suppress, reduce, or expand any
    *requested* output. In particular, guidance *MUST* *NOT* apply to:

    -   the *manual page* emitted for `-h`/`--help`, which is
        explicitly requested,
    -   the *skill catalog*, *manual page*, and *command proposal*
        results of the `ase-help-skill` and `ase-help-intent` skills,
        which are explicitly requested,
    -   the *option affordance* lines of a user dialog (e.g. `Please
        choose *one* option by typing ...`), which are functional parts
        of the dialog and not hints,
    -   the *artifact state* lines of a skill (e.g. `plan loaded`, `plan
        created`, `task given`) and every `ERROR:` line, which carry
        state rather than pointers.

    The *skill identification* chrome (the `skill started`, `skill
    finished`, and `objective` lines) is the sole exception: it is
    *decoration* rather than result, so it is gated on `normal` and
    `verbose` directly in the `Skill Identification` section above.

-   *IMPORTANT*: Every hint carries a *level* -- `minimal`, `normal`,
    or `verbose` -- and is emitted only if the configured
    <ase-guidance-level/> *includes* that level:

    -   If <ase-guidance-level/> is `none`:
        -   Hints emitted: *none*
    -   If <ase-guidance-level/> is `minimal`:
        -   Hints emitted: `minimal` -- the *essential* pointers only,
            i.e. those without which the just-produced result cannot be
            consumed at all (such as the follow-up command that turns
            persisted findings into actual changes)
    -   If <ase-guidance-level/> is `normal`:
        -   Hints emitted: `minimal` *and* `normal` -- additionally the
            *canonical next step* of the finished skill
    -   If <ase-guidance-level/> is `verbose`:
        -   Hints emitted: `minimal`, `normal`, *and* `verbose` --
            additionally the *unused options* of the current skill, the
            *related* skills, and the *configuration* skills
    -   If <ase-guidance-level/> is empty or not set:
        -   Treat it as `normal`

-   *IMPORTANT*: A hint *MUST* be emitted *exclusively* through the
    `<ase-tpl-hint/>` template pattern below, and *never* as free-text
    prose, so that its suppression is uniform across all skills.

Template Patterns
-----------------

-   *IMPORTANT*: In every `<template/>` below you *MUST* reproduce all
    box-drawing and decorative glyphs *verbatim*, character-for-character,
    exactly as written. This especially includes the corner and edge
    characters `╭`, `╰`, and `│`, the shoulder character `━`, the bar
    character `─`, and the trailing dotted character `┈`. You *MUST* *NOT*
    substitute visually similar ASCII fallbacks (e.g. `+`, `|`, `-`) or
    other Unicode look-alikes, and you *MUST* *NOT* drop, add, or reorder
    any of these glyphs.

-   When `<ase-tpl-head/>` (no title attribute) should be expanded, use:

    <template>

    ╭───────────────────────────────────────────────────────────────────┈┈┈┈┈┈┈┈┈┈

    </template>

-   When `<ase-tpl-head title="<title/>"[ subtitle="<subtitle/>"]/>`
    should be expanded use the following helper placeholders and then
    the following <template/>:

    -   <if condition="<subtitle/> is not empty">
            Set <raw-title>⧉ ASE: <title/>: <subtitle/></raw-title>.
            Set <render-title>⧉ ASE: **`<title/>`**: `<subtitle/>`</render-title>.
        </if>
        <else>
            Set <raw-title>⧉ ASE: <title/></raw-title>.
            Set <render-title>⧉ ASE: **`<title/>`**</render-title>.
        </else>
    -   Set <raw-title-len/> to the number of characters in the visible
        un-styled text <raw-title/>.
    -   Set <bar/> to the `─` character repeated exactly max(0, 67 - <raw-title-len/>)
        times -- clamped to zero so an over-long title never yields a
        negative count -- the very same bar-width rule as `<ase-tpl-foot/>`
        and `<ase-tpl-boxed/>`, so equal visible text yields equal total
        width.

    <template>

    ╭────━━━━**(** <render-title/> **)**━━━━────<bar/>┈┈┈┈┈┈┈┈┈┈

    </template>

-   When `<ase-tpl-foot/>` (no title attribute) should be expanded, use:

    <template>

    ╰───────────────────────────────────────────────────────────────────┈┈┈┈┈┈┈┈┈┈

    </template>

-   When `<ase-tpl-foot title="<title/>"[ subtitle="<subtitle/>"]/>`
    should be expanded use the following helper placeholders and then
    the following <template/>:

    -   <if condition="<subtitle/> is not empty">
            Set <raw-title>⧉ ASE: <title/>: <subtitle/></raw-title>.
            Set <render-title>⧉ ASE: **`<title/>`**: `<subtitle/>`</render-title>.
        </if>
        <else>
            Set <raw-title>⧉ ASE: <title/></raw-title>.
            Set <render-title>⧉ ASE: **`<title/>`**</render-title>.
        </else>
    -   Set <raw-title-len/> to the number of characters in the visible
        un-styled text <raw-title/>.
    -   Set <bar/> to the `─` character repeated exactly max(0, 67 - <raw-title-len/>)
        times -- clamped to zero so an over-long title never yields a
        negative count.

    <template>

    ╰────━━━━**(** <render-title/> **)**━━━━────<bar/>┈┈┈┈┈┈┈┈┈┈

    </template>

-   When `<ase-tpl-hint level="<level/>"><content/></ase-tpl-hint>`
    should be expanded, first determine whether the hint passes the
    configured guidance level (see `Guidance Hint Level` above):

    -   Set <emit>false</emit>.
    -   If <ase-guidance-level/> is `minimal` and <level/> is `minimal`,
        set <emit>true</emit>.
    -   If <ase-guidance-level/> is `normal` and <level/> is `minimal`
        or `normal`, set <emit>true</emit>.
    -   If <ase-guidance-level/> is `verbose` and <level/> is `minimal`,
        `normal`, or `verbose`, set <emit>true</emit>.
    -   If <ase-guidance-level/> is empty or not set, treat it as
        `normal` and apply the corresponding decision above.

    Then dispatch on <emit/>:

    <if condition="<emit/> is `true`">
        <template>
        ⧉ **ASE**: ▷ hint [<level/>]: **<content/>**
        </template>
    </if>
    <else>
        This construct is expanded into *nothing*.
        Do not output anything.
    </else>

-   When `<ase-tpl-boxed title="<title/>"[ subtitle="<subtitle/>"]><content/></ase-tpl-boxed>`
    should be expanded use the following helper placeholders and then
    the following <template/>:

    -   <if condition="<subtitle/> is not empty">
            Set <raw-title>⧉ ASE: <title/>: <subtitle/></raw-title>.
            Set <render-title>⧉ ASE: **`<title/>`**: `<subtitle/>`</render-title>.
        </if>
        <else>
            Set <raw-title>⧉ ASE: <title/></raw-title>.
            Set <render-title>⧉ ASE: **`<title/>`**</render-title>.
        </else>
    -   Set <raw-title-len/> to the number of characters in the visible
        un-styled text <raw-title/>.
    -   Set <bar/> to the `─` character repeated exactly max(0, 67 - <raw-title-len/>)
        times -- clamped to zero so an over-long title never yields a negative count.
    -   Pre-wrap every line of <content/> at *96 visible columns* (the box
        width minus the `│ ` prefix, Markdown markup not counted), breaking
        only at word boundaries and never inside an identifier, path, URL,
        or quoted code: the agent tool wraps longer lines *without* the `│ `
        prefix and visibly breaks the box. Indent each continuation line to
        the text column of its first line (e.g. behind a key glyph, bullet,
        or padded label), so gutters stay aligned.
    -   Set <body/> to <content/> with all non-empty lines prefixed with
        `│ ` and all empty lines prefixed with just `│` (so no trailing
        whitespace is produced). Do *not* prefix any line twice -- the
        <content/> itself *MUST* *NOT* contain any `│` prefixes already.

    <template>

    ╭────━━━━**(** <render-title/> **)**━━━━────<bar/>┈┈┈┈┈┈┈┈┈┈
    │
    <body/>
    │
    ╰────━━━━**(** <render-title/> **)**━━━━────<bar/>┈┈┈┈┈┈┈┈┈┈

    </template>

-   When `<ase-tpl-key digit="<digit/>"/>` should be expanded, use:

    <if condition="<digit/> is '1'"><template>➊</template></if>
    <if condition="<digit/> is '2'"><template>➋</template></if>
    <if condition="<digit/> is '3'"><template>➌</template></if>
    <if condition="<digit/> is '4'"><template>➍</template></if>
    <if condition="<digit/> is '5'"><template>➎</template></if>
    <if condition="<digit/> is '6'"><template>➏</template></if>
    <if condition="<digit/> is '7'"><template>➐</template></if>
    <if condition="<digit/> is '8'"><template>➑</template></if>
    <if condition="<digit/> is '9'"><template>➒</template></if>

-   When `<ase-tpl-bullet-secondary/>` should be expanded, use:

    <template>⚪</template>

-   When `<ase-tpl-bullet-normal/>` should be expanded, use:

    <template>🔵</template>

-   When `<ase-tpl-bullet-signal/>` should be expanded, use:

    <template>🟠</template>

-   When `<ase-tpl-pad width="<width/>" text="<text/>"/>` should be expanded, use
    (where <ws/> = ` ` x max(0, <width/> - length("<text/>")), i.e., <ws/> is
    the ` ` character repeated max(0, <width/> - length("<text/>")) times --
    clamped to zero so an over-long text never yields a negative count):

    <template><text/><ws/></template>

Files in this skill

  • ase-common-code.md7.5 KB
  • ase-common-dissect.md4.8 KB
  • ase-common-grill.md3.2 KB
  • ase-common-task.md6.3 KB
  • ase-constitution.md3.3 KB
  • ase-control.md9.1 KB
  • ase-dialog.md6 KB
  • ase-format-meta.md1.4 KB
  • ase-format-spec.md1.2 KB
  • ase-format-task.md6.8 KB
  • ase-getopt.md5.3 KB
  • ase-persona.md5.8 KB
  • ase-skill.md23.6 KB
  • ase-tenets.md12.1 KB

Attribution

Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.

Comments

Loading comments…

Newsletter

Get the weekly list of safe new skills, and the ones we pulled.