@robot-inventor/agent-skills 0.0.0 → 0.7.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -21
- package/README.md +31 -31
- package/package.json +34 -33
- package/plugin.json +11 -11
- package/scripts/codex.ts +35 -0
- package/scripts/opencode.ts +26 -26
- package/scripts/skills.ts +6 -0
- package/scripts/syncVersion.ts +10 -0
- package/skills/cleanup-changes/SKILL.md +33 -33
- package/skills/identify-search-maintenance/SKILL.md +78 -78
- package/skills/identify-search-maintenance/references/selection-rubric.md +45 -45
- package/skills/identify-search-maintenance/scripts/select_rank_led_candidates.py +212 -212
- package/skills/prove-it-diagnostics/SKILL.md +60 -60
- package/skills/review-loop/SKILL.md +45 -45
- package/skills/simple-engineering/SKILL.md +27 -27
- package/skills/web-master/SKILL.md +109 -109
package/LICENSE
CHANGED
|
@@ -1,21 +1,21 @@
|
|
|
1
|
-
MIT License
|
|
2
|
-
|
|
3
|
-
Copyright (c) 2026 roboin
|
|
4
|
-
|
|
5
|
-
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
-
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
-
in the Software without restriction, including without limitation the rights
|
|
8
|
-
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
-
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
-
furnished to do so, subject to the following conditions:
|
|
11
|
-
|
|
12
|
-
The above copyright notice and this permission notice shall be included in all
|
|
13
|
-
copies or substantial portions of the Software.
|
|
14
|
-
|
|
15
|
-
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
-
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
-
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
-
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
-
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
-
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
-
SOFTWARE.
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 roboin
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
CHANGED
|
@@ -1,31 +1,31 @@
|
|
|
1
|
-
# Roboin Agent Skills
|
|
2
|
-
|
|
3
|
-
My personal collection of Agent Skills.
|
|
4
|
-
|
|
5
|
-
- [cleanup-changes](skills/cleanup-changes/SKILL.md): The skill to revert unnecessary changes and leave only essential changes.
|
|
6
|
-
- [identify-search-maintenance](skills/identify-search-maintenance): The skill to identify web pages that are performing poorly in search results and require maintenance.
|
|
7
|
-
- [prove-it-diagnostics](skills/prove-it-diagnostics/SKILL.md): The skill to fix bugs and improve performance by proving the root cause through minimal reproduction code or benchmarks, rather than relying on speculation based solely on reading the code.
|
|
8
|
-
- [review-loop](skills/review-loop/SKILL.md): Thoroughly improve code quality by requesting a review from a sub-agent.
|
|
9
|
-
- [simple-engineering](skills/simple-engineering/SKILL.md): A skill outlining the fundamental principles to keep in mind when writing or editing code.
|
|
10
|
-
- [web-master](skills/web-master/SKILL.md): A skill outlining the fundamental principles to keep in mind when writing or editing web-related code.
|
|
11
|
-
|
|
12
|
-
## Installation
|
|
13
|
-
|
|
14
|
-
```bash
|
|
15
|
-
# Install all skills
|
|
16
|
-
npx skills add Robot-Inventor/agent-skills
|
|
17
|
-
|
|
18
|
-
# Install a specific skill
|
|
19
|
-
npx skills add Robot-Inventor/agent-skills --skill <skill-name>
|
|
20
|
-
```
|
|
21
|
-
|
|
22
|
-
## Plugins
|
|
23
|
-
|
|
24
|
-
```bash
|
|
25
|
-
# Codex
|
|
26
|
-
codex plugin marketplace add Robot-Inventor/agent-skills
|
|
27
|
-
codex plugin add agent-skills@robot-inventor
|
|
28
|
-
|
|
29
|
-
# OpenCode
|
|
30
|
-
opencode plugin @robot-inventor/agent-skills --global
|
|
31
|
-
```
|
|
1
|
+
# Roboin Agent Skills
|
|
2
|
+
|
|
3
|
+
My personal collection of Agent Skills.
|
|
4
|
+
|
|
5
|
+
- [cleanup-changes](skills/cleanup-changes/SKILL.md): The skill to revert unnecessary changes and leave only essential changes.
|
|
6
|
+
- [identify-search-maintenance](skills/identify-search-maintenance): The skill to identify web pages that are performing poorly in search results and require maintenance.
|
|
7
|
+
- [prove-it-diagnostics](skills/prove-it-diagnostics/SKILL.md): The skill to fix bugs and improve performance by proving the root cause through minimal reproduction code or benchmarks, rather than relying on speculation based solely on reading the code.
|
|
8
|
+
- [review-loop](skills/review-loop/SKILL.md): Thoroughly improve code quality by requesting a review from a sub-agent.
|
|
9
|
+
- [simple-engineering](skills/simple-engineering/SKILL.md): A skill outlining the fundamental principles to keep in mind when writing or editing code.
|
|
10
|
+
- [web-master](skills/web-master/SKILL.md): A skill outlining the fundamental principles to keep in mind when writing or editing web-related code.
|
|
11
|
+
|
|
12
|
+
## Installation
|
|
13
|
+
|
|
14
|
+
```bash
|
|
15
|
+
# Install all skills
|
|
16
|
+
npx skills add Robot-Inventor/agent-skills
|
|
17
|
+
|
|
18
|
+
# Install a specific skill
|
|
19
|
+
npx skills add Robot-Inventor/agent-skills --skill <skill-name>
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
## Plugins
|
|
23
|
+
|
|
24
|
+
```bash
|
|
25
|
+
# Codex
|
|
26
|
+
codex plugin marketplace add Robot-Inventor/agent-skills
|
|
27
|
+
codex plugin add agent-skills@robot-inventor
|
|
28
|
+
|
|
29
|
+
# OpenCode
|
|
30
|
+
opencode plugin @robot-inventor/agent-skills --global
|
|
31
|
+
```
|
package/package.json
CHANGED
|
@@ -1,33 +1,34 @@
|
|
|
1
|
-
{
|
|
2
|
-
"name": "@robot-inventor/agent-skills",
|
|
3
|
-
"version": "0.
|
|
4
|
-
"description": "Roboin's personal collection of Agent Skills.",
|
|
5
|
-
"homepage": "https://github.com/Robot-Inventor/agent-skills#readme",
|
|
6
|
-
"bugs": {
|
|
7
|
-
"url": "https://github.com/Robot-Inventor/agent-skills/issues"
|
|
8
|
-
},
|
|
9
|
-
"repository": {
|
|
10
|
-
"type": "git",
|
|
11
|
-
"url": "git+https://github.com/Robot-Inventor/agent-skills.git"
|
|
12
|
-
},
|
|
13
|
-
"license": "MIT",
|
|
14
|
-
"author": "Robot-Inventor",
|
|
15
|
-
"type": "module",
|
|
16
|
-
"
|
|
17
|
-
"
|
|
18
|
-
|
|
19
|
-
"
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
"ci:
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
"@changesets/
|
|
28
|
-
"@
|
|
29
|
-
"@
|
|
30
|
-
"@
|
|
31
|
-
"@types/
|
|
32
|
-
|
|
33
|
-
}
|
|
1
|
+
{
|
|
2
|
+
"name": "@robot-inventor/agent-skills",
|
|
3
|
+
"version": "0.7.1",
|
|
4
|
+
"description": "Roboin's personal collection of Agent Skills.",
|
|
5
|
+
"homepage": "https://github.com/Robot-Inventor/agent-skills#readme",
|
|
6
|
+
"bugs": {
|
|
7
|
+
"url": "https://github.com/Robot-Inventor/agent-skills/issues"
|
|
8
|
+
},
|
|
9
|
+
"repository": {
|
|
10
|
+
"type": "git",
|
|
11
|
+
"url": "git+https://github.com/Robot-Inventor/agent-skills.git"
|
|
12
|
+
},
|
|
13
|
+
"license": "MIT",
|
|
14
|
+
"author": "Robot-Inventor",
|
|
15
|
+
"type": "module",
|
|
16
|
+
"main": "./scripts/opencode.ts",
|
|
17
|
+
"files": ["./plugin.json", "./skills/", "./scripts/"],
|
|
18
|
+
"publishConfig": {
|
|
19
|
+
"access": "public",
|
|
20
|
+
"provenance": true
|
|
21
|
+
},
|
|
22
|
+
"scripts": {
|
|
23
|
+
"ci:version": "changeset version && bun ./scripts/syncVersion.ts && git add .",
|
|
24
|
+
"ci:publish": "changeset publish"
|
|
25
|
+
},
|
|
26
|
+
"devDependencies": {
|
|
27
|
+
"@changesets/changelog-github": "^1.0.0",
|
|
28
|
+
"@changesets/cli": "^3.0.0",
|
|
29
|
+
"@opencode-ai/plugin": "^1.18.18",
|
|
30
|
+
"@robot-inventor/tsconfig-base": "^7.1.0",
|
|
31
|
+
"@types/bun": "^1.3.14",
|
|
32
|
+
"@types/node": "^26.2.0"
|
|
33
|
+
}
|
|
34
|
+
}
|
package/plugin.json
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
|
-
{
|
|
2
|
-
"$schema": "https://agent-plugins.org/schemas/1.0.0/plugin.schema.json",
|
|
3
|
-
"name": "
|
|
4
|
-
"version": "0.7.
|
|
5
|
-
"description": "My personal collection of Agent Skills.",
|
|
6
|
-
"author": {
|
|
7
|
-
"name": "Robot-Inventor",
|
|
8
|
-
"url": "https://roboin.io/"
|
|
9
|
-
},
|
|
10
|
-
"repository": "https://github.com/Robot-Inventor/agent-skills",
|
|
11
|
-
"license": "MIT"
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://agent-plugins.org/schemas/1.0.0/plugin.schema.json",
|
|
3
|
+
"name": "agent-skills",
|
|
4
|
+
"version": "0.7.1",
|
|
5
|
+
"description": "My personal collection of Agent Skills.",
|
|
6
|
+
"author": {
|
|
7
|
+
"name": "Robot-Inventor",
|
|
8
|
+
"url": "https://roboin.io/"
|
|
9
|
+
},
|
|
10
|
+
"repository": "https://github.com/Robot-Inventor/agent-skills",
|
|
11
|
+
"license": "MIT"
|
|
12
12
|
}
|
package/scripts/codex.ts
ADDED
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { exists, readFile } from "node:fs/promises";
|
|
2
|
+
import { dirname, join, parse } from "node:path";
|
|
3
|
+
import { SKILLS } from "./skills";
|
|
4
|
+
|
|
5
|
+
const main = async () => {
|
|
6
|
+
let input = "";
|
|
7
|
+
process.stdin.setEncoding("utf8");
|
|
8
|
+
for await (const chunk of process.stdin) {
|
|
9
|
+
input += chunk;
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
const { cwd } = JSON.parse(input) as { cwd: string };
|
|
13
|
+
|
|
14
|
+
const isWebProject = await exists(join(cwd, "package.json"));
|
|
15
|
+
const skills = isWebProject ? SKILLS.web : SKILLS.nonWeb;
|
|
16
|
+
|
|
17
|
+
const pluginRoot = process.env.PLUGIN_ROOT;
|
|
18
|
+
if (!pluginRoot) {
|
|
19
|
+
throw new Error("PLUGIN_ROOT is not set");
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
const skillContentPromises = skills.map(async (skill) => {
|
|
23
|
+
const skillPath = join(pluginRoot, "skills", skill, "SKILL.md");
|
|
24
|
+
const skillContent = await readFile(skillPath, "utf8");
|
|
25
|
+
|
|
26
|
+
return [`<forced-skill name="${skill}">`, skillContent, "</forced-skill>"].join("\n");
|
|
27
|
+
});
|
|
28
|
+
|
|
29
|
+
const skillContents = await Promise.all(skillContentPromises);
|
|
30
|
+
const content = skillContents.join("\n\n");
|
|
31
|
+
|
|
32
|
+
process.stdout.write(content);
|
|
33
|
+
};
|
|
34
|
+
|
|
35
|
+
await main();
|
package/scripts/opencode.ts
CHANGED
|
@@ -1,26 +1,26 @@
|
|
|
1
|
-
import type { Plugin } from "@opencode-ai/plugin";
|
|
2
|
-
import { SKILLS } from "./skills";
|
|
3
|
-
import { exists } from "node:fs/promises";
|
|
4
|
-
import { join } from "node:path";
|
|
5
|
-
import { fileURLToPath } from "node:url";
|
|
6
|
-
|
|
7
|
-
const plugin: Plugin = async ({ project, directory }) => {
|
|
8
|
-
const isWebProject = await exists(join(directory, "package.json"));
|
|
9
|
-
const skills = isWebProject ? SKILLS.web : SKILLS.nonWeb;
|
|
10
|
-
|
|
11
|
-
return {
|
|
12
|
-
config: async (config) => {
|
|
13
|
-
config.instructions ??= [];
|
|
14
|
-
|
|
15
|
-
for (const skill of skills) {
|
|
16
|
-
const path = fileURLToPath(new URL(`../skills/${skill}/SKILL.md`, import.meta.url));
|
|
17
|
-
|
|
18
|
-
if (!config.instructions.includes(path)) {
|
|
19
|
-
config.instructions.push(path);
|
|
20
|
-
}
|
|
21
|
-
}
|
|
22
|
-
}
|
|
23
|
-
};
|
|
24
|
-
};
|
|
25
|
-
|
|
26
|
-
export { plugin };
|
|
1
|
+
import type { Plugin } from "@opencode-ai/plugin";
|
|
2
|
+
import { SKILLS } from "./skills";
|
|
3
|
+
import { exists } from "node:fs/promises";
|
|
4
|
+
import { join } from "node:path";
|
|
5
|
+
import { fileURLToPath } from "node:url";
|
|
6
|
+
|
|
7
|
+
const plugin: Plugin = async ({ project, directory }) => {
|
|
8
|
+
const isWebProject = await exists(join(directory, "package.json"));
|
|
9
|
+
const skills = isWebProject ? SKILLS.web : SKILLS.nonWeb;
|
|
10
|
+
|
|
11
|
+
return {
|
|
12
|
+
config: async (config) => {
|
|
13
|
+
config.instructions ??= [];
|
|
14
|
+
|
|
15
|
+
for (const skill of skills) {
|
|
16
|
+
const path = fileURLToPath(new URL(`../skills/${skill}/SKILL.md`, import.meta.url));
|
|
17
|
+
|
|
18
|
+
if (!config.instructions.includes(path)) {
|
|
19
|
+
config.instructions.push(path);
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
};
|
|
24
|
+
};
|
|
25
|
+
|
|
26
|
+
export { plugin };
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import fs from "fs/promises";
|
|
2
|
+
import packageJson from "../package.json";
|
|
3
|
+
import pluginJson from "../plugin.json";
|
|
4
|
+
|
|
5
|
+
const main = async () => {
|
|
6
|
+
pluginJson.version = packageJson.version;
|
|
7
|
+
await fs.writeFile("plugin.json", JSON.stringify(pluginJson, null, 4));
|
|
8
|
+
};
|
|
9
|
+
|
|
10
|
+
await main();
|
|
@@ -1,33 +1,33 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: cleanup-changes
|
|
3
|
-
description: The skill to revert unnecessary changes and leave only essential changes when a user requests a cleanup of changes, or before committing and creating a pull request.
|
|
4
|
-
license: MIT
|
|
5
|
-
metadata:
|
|
6
|
-
author: Robot-Inventor
|
|
7
|
-
---
|
|
8
|
-
|
|
9
|
-
# Cleanup Changes Skill
|
|
10
|
-
|
|
11
|
-
Both humans and agents typically go through a trial-and-error process when writing code, making numerous changes (including non-essential and unnecessary ones) to achieve their final goals. However, non-essential and unnecessary changes resulting from this trial-and-error process should not be included in the final code. Changes should be reviewed as needed, and unnecessary changes should be reversed to focus only on essential ones.
|
|
12
|
-
|
|
13
|
-
## When to apply
|
|
14
|
-
|
|
15
|
-
You should perform this skill when a user requests a cleanup of changes, or before creating a commit or pull request.
|
|
16
|
-
|
|
17
|
-
## Steps
|
|
18
|
-
|
|
19
|
-
The following is the core of this skill; please follow the specified steps. Do not change the Git staging state unless explicitly instructed to do so by the user. Users may have staged their changes as a snapshot of the code in its last expected state.
|
|
20
|
-
|
|
21
|
-
### 1. Looking back on the trial-and-error process
|
|
22
|
-
|
|
23
|
-
Reflect on the trial-and-error process of the task and distinguish between changes that were essentially necessary and changes that, despite being tried, ultimately proved ineffective and unnecessary.
|
|
24
|
-
|
|
25
|
-
You shouldn't make assumptions about whether a change is essentially necessary. For example, when fixing a bug, review the changes made when the bug was finally fixed, understand the essential and root cause of the bug, and then, based on that, determine whether each change is essentially necessary.
|
|
26
|
-
|
|
27
|
-
When determining whether each change is necessary, pay particular attention to bugs caused by multiple factors. Bugs can be caused by a single, simple cause, or by multiple factors. If it's caused by a single, simple cause, the last change made when the bug is fixed may be sufficient, and previous changes may be unnecessary. If it's a bug caused by multiple factors, the last change alone may not be enough, and some of the changes made during the trial-and-error process leading up to it may also be necessary. Carefully consider the underlying cause of the bug, including whether it's due to a single cause or multiple factors, and then determine which changes are necessary and which are not.
|
|
28
|
-
|
|
29
|
-
### 2. Undo unnecessary changes
|
|
30
|
-
|
|
31
|
-
Revert any changes you determined were unnecessary in the previous step, leaving only the essential changes.
|
|
32
|
-
|
|
33
|
-
However, even if a change isn't strictly necessary, minor corrections to typos around the current change or small refactorings are acceptable. Generally, in coding, correcting typos found around a change or making small refactorings related to the current change are generally tolerated, even if they aren't strictly necessary.
|
|
1
|
+
---
|
|
2
|
+
name: cleanup-changes
|
|
3
|
+
description: The skill to revert unnecessary changes and leave only essential changes when a user requests a cleanup of changes, or before committing and creating a pull request.
|
|
4
|
+
license: MIT
|
|
5
|
+
metadata:
|
|
6
|
+
author: Robot-Inventor
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
# Cleanup Changes Skill
|
|
10
|
+
|
|
11
|
+
Both humans and agents typically go through a trial-and-error process when writing code, making numerous changes (including non-essential and unnecessary ones) to achieve their final goals. However, non-essential and unnecessary changes resulting from this trial-and-error process should not be included in the final code. Changes should be reviewed as needed, and unnecessary changes should be reversed to focus only on essential ones.
|
|
12
|
+
|
|
13
|
+
## When to apply
|
|
14
|
+
|
|
15
|
+
You should perform this skill when a user requests a cleanup of changes, or before creating a commit or pull request.
|
|
16
|
+
|
|
17
|
+
## Steps
|
|
18
|
+
|
|
19
|
+
The following is the core of this skill; please follow the specified steps. Do not change the Git staging state unless explicitly instructed to do so by the user. Users may have staged their changes as a snapshot of the code in its last expected state.
|
|
20
|
+
|
|
21
|
+
### 1. Looking back on the trial-and-error process
|
|
22
|
+
|
|
23
|
+
Reflect on the trial-and-error process of the task and distinguish between changes that were essentially necessary and changes that, despite being tried, ultimately proved ineffective and unnecessary.
|
|
24
|
+
|
|
25
|
+
You shouldn't make assumptions about whether a change is essentially necessary. For example, when fixing a bug, review the changes made when the bug was finally fixed, understand the essential and root cause of the bug, and then, based on that, determine whether each change is essentially necessary.
|
|
26
|
+
|
|
27
|
+
When determining whether each change is necessary, pay particular attention to bugs caused by multiple factors. Bugs can be caused by a single, simple cause, or by multiple factors. If it's caused by a single, simple cause, the last change made when the bug is fixed may be sufficient, and previous changes may be unnecessary. If it's a bug caused by multiple factors, the last change alone may not be enough, and some of the changes made during the trial-and-error process leading up to it may also be necessary. Carefully consider the underlying cause of the bug, including whether it's due to a single cause or multiple factors, and then determine which changes are necessary and which are not.
|
|
28
|
+
|
|
29
|
+
### 2. Undo unnecessary changes
|
|
30
|
+
|
|
31
|
+
Revert any changes you determined were unnecessary in the previous step, leaving only the essential changes.
|
|
32
|
+
|
|
33
|
+
However, even if a change isn't strictly necessary, minor corrections to typos around the current change or small refactorings are acceptable. Generally, in coding, correcting typos found around a change or making small refactorings related to the current change are generally tolerated, even if they aren't strictly necessary.
|
|
@@ -1,78 +1,78 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: identify-search-maintenance
|
|
3
|
-
description: Identify and diagnose organic-search articles that need maintenance. Use when asked to find pages whose organic traffic declined mainly from ranking loss rather than search-demand decline, analyze Search Console or GA4 data across recent and year-over-year periods, prioritize a maintenance backlog, or compare target pages with current Google results. Do not use this skill to edit article content.
|
|
4
|
-
---
|
|
5
|
-
|
|
6
|
-
# Identify Search Maintenance
|
|
7
|
-
|
|
8
|
-
Find pages that merit search-maintenance work, with evidence that separates rank-driven losses from changes in demand. The deliverable is a ranked investigation backlog and diagnosis; it is never an article rewrite or publishing task.
|
|
9
|
-
|
|
10
|
-
## Scope and guardrails
|
|
11
|
-
|
|
12
|
-
- Confirm the property, traffic channel, dates, locale/device, and whether Google must be inspected through the user's signed-in Chrome session.
|
|
13
|
-
- Use both recent comparison (normally the latest 3 months vs. the preceding 3 months) and a year-over-year comparison (normally the same recent 3 months one year earlier). End periods on the latest Search Console date that is complete enough to compare, use equal day counts and comparable weekday mix, and state any unavailable baseline as `N/A`, never as zero.
|
|
14
|
-
- Fix the Search Console search type, country, device, property scope, canonical-URL handling, and any brand-query exclusion across each comparison. Record GA4 timezone, Organic Search channel definition, and landing-page URL normalization.
|
|
15
|
-
- Treat a page as a candidate only after checking page-level **and** query-level Search Console data. GA4 is corroborating traffic evidence, not a substitute for query and rank data.
|
|
16
|
-
- Do not attribute a loss to rankings from clicks alone. URL-filtered and property-wide Search Console impressions are affected by the site's own visibility and are not standalone demand measures. Check an independent demand proxy (for example Google Trends for the query/topic, Keyword Planner where available, or a documented market-data source), then use property-wide query data only as corroboration. Also check URL/query rank changes, cannibalization, and live SERP composition.
|
|
17
|
-
- Do not alter CMS content, metadata, internal links, or publish settings. If the user asks for changes, finish this investigation first and obtain a separate article-update scope.
|
|
18
|
-
|
|
19
|
-
## Workflow
|
|
20
|
-
|
|
21
|
-
### 1. Collect comparable evidence
|
|
22
|
-
|
|
23
|
-
1. Export Search Console performance by **page** for the two period pairs. Prefer an export/CSV over manually paging a truncated table.
|
|
24
|
-
2. Retain clicks, impressions, CTR, and average position for each period. Record filters, property, and export dates.
|
|
25
|
-
3. Obtain GA4 organic-search landing-page sessions or views for the same dates when available. Note that GA4 and Search Console count different things.
|
|
26
|
-
4. Normalize both the recent-pair and year-over-year page exports to the columns in [selection-rubric.md](references/selection-rubric.md). Run the bundled filter on each, take the union of the two candidate lists, and label the comparison(s) that surfaced each URL. A page that only passes one comparison still needs the full evidence checks in both.
|
|
27
|
-
|
|
28
|
-
```powershell
|
|
29
|
-
python "<skill-directory>/scripts/select_rank_led_candidates.py" normalized-pages.csv --format markdown
|
|
30
|
-
```
|
|
31
|
-
|
|
32
|
-
Replace `<skill-directory>` with the directory containing this `SKILL.md`. Use the script to screen candidates, not to make the final decision. Tune its thresholds only if the report explains why.
|
|
33
|
-
|
|
34
|
-
### 2. Separate causes before selecting pages
|
|
35
|
-
|
|
36
|
-
Classify each materially declining page into one of these mutually exclusive buckets:
|
|
37
|
-
|
|
38
|
-
| Bucket | Evidence | Action |
|
|
39
|
-
| ------------------------------------ | ---------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------- |
|
|
40
|
-
| Rank-led maintenance candidate | Clicks materially down; impressions broadly stable; average position/query ranks worsen | Investigate and prioritize |
|
|
41
|
-
| Demand/obsolescence decline | Impressions and clicks fall together, or the task/query has ended | Exclude from the rank-led list |
|
|
42
|
-
| CTR/SERP change | Position broadly stable but CTR falls; SERP features or title/snippet changes explain it | Keep separate; do not call it rank-led |
|
|
43
|
-
| Technical/indexing issue | Indexing, canonical, rendering, or availability evidence | Escalate separately |
|
|
44
|
-
| Cannibalization/internal competition | Another site URL gained the same query or intent | Exclude from this content-maintenance list; route for consolidation/targeting decision |
|
|
45
|
-
| Insufficient evidence | Low volume or no comparable baseline | Do not force into the top 10 |
|
|
46
|
-
|
|
47
|
-
For every selected URL, verify at least three previously valuable declined queries. For each query, collect three views with identical search type/country/device/date filters: (a) the target URL's query metrics and position, (b) the **whole property** query metrics without a page filter, and (c) an independent demand proxy. Treat (c) as the demand evidence; use (b) only to understand the site's overall visibility. Use year-over-year data to catch longer-running changes. Check whether another URL in the property gained the same query; classify confirmed cannibalization in its own exclusion bucket. If the query mix changed, say so.
|
|
48
|
-
|
|
49
|
-
Before retaining a content-maintenance candidate, perform a minimum health check: URL Inspection/index status, user-selected canonical, HTTP availability, and rendered-page accessibility. Classify a failing page as a technical/indexing issue instead of diagnosing an editorial gap.
|
|
50
|
-
|
|
51
|
-
### 3. Diagnose each selected page in Google
|
|
52
|
-
|
|
53
|
-
When the user specifies Chrome or Google, use the Chrome browser, not a general web-search backend. For each selected URL:
|
|
54
|
-
|
|
55
|
-
1. Search at least three declined, historically valuable queries in Google, using the required locale/device context where possible.
|
|
56
|
-
2. Capture the target URL's visible rank or absence, the top competing URLs, and material SERP features (AI Overview, official result, video carousel, PAA, news, forums, etc.). Use fresh tabs and do not change account or site settings.
|
|
57
|
-
3. Compare the target and the leading pages on search intent, freshness, direct answer quality, task completion, factual completeness, first-party evidence, visual/media support, structure, and trust signals. Base observations on actual page content; distinguish observed facts from inference.
|
|
58
|
-
4. Identify the gap to investigate, not the edit itself. Examples: outdated UI steps, missing current constraints, poor intent match, weak original evidence, or a SERP now dominated by official sources.
|
|
59
|
-
|
|
60
|
-
If parallel agents are available, assign no more than two pages to each agent. Require each agent to return the period metrics, three or more queries, Google competitors, SERP features, observed content gaps, exclusions, and source URLs. Consolidate only after all agents return evidence.
|
|
61
|
-
|
|
62
|
-
### 4. Produce the maintenance report
|
|
63
|
-
|
|
64
|
-
Create or append to `report.md`; preserve earlier findings unless the user asks to replace them. Use this structure:
|
|
65
|
-
|
|
66
|
-
1. Scope, dates, data sources, filters, and limitations.
|
|
67
|
-
2. Selection method and explicit rank-led thresholds.
|
|
68
|
-
3. A prioritized table of up to the requested number of rank-led pages (default 10): URL, recent metrics, year-over-year metrics, property-wide query-demand evidence, ranking evidence, priority, and confidence. If fewer pages meet the evidence threshold, report fewer and explain the shortfall.
|
|
69
|
-
4. Per-page diagnosis: three or more declined queries, current Google competitors/SERP observations, and content gaps to investigate.
|
|
70
|
-
5. Excluded near-misses with the evidence for demand decline, obsolete intent, CTR-only loss, technical issue, cannibalization, or insufficient data.
|
|
71
|
-
6. A separate follow-up queue for work that needs a technical or editorial decision.
|
|
72
|
-
|
|
73
|
-
Before delivery, verify that every page in the final rank-led list has stable-enough independent demand evidence, a documented query-level rank deterioration, and a passing health check. Never fill a quota with demand-led losses.
|
|
74
|
-
|
|
75
|
-
## Resources
|
|
76
|
-
|
|
77
|
-
- [selection-rubric.md](references/selection-rubric.md): normalization schema, default thresholds, and report checklist.
|
|
78
|
-
- `scripts/select_rank_led_candidates.py`: deterministic first-pass filter for normalized Search Console page exports.
|
|
1
|
+
---
|
|
2
|
+
name: identify-search-maintenance
|
|
3
|
+
description: Identify and diagnose organic-search articles that need maintenance. Use when asked to find pages whose organic traffic declined mainly from ranking loss rather than search-demand decline, analyze Search Console or GA4 data across recent and year-over-year periods, prioritize a maintenance backlog, or compare target pages with current Google results. Do not use this skill to edit article content.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Identify Search Maintenance
|
|
7
|
+
|
|
8
|
+
Find pages that merit search-maintenance work, with evidence that separates rank-driven losses from changes in demand. The deliverable is a ranked investigation backlog and diagnosis; it is never an article rewrite or publishing task.
|
|
9
|
+
|
|
10
|
+
## Scope and guardrails
|
|
11
|
+
|
|
12
|
+
- Confirm the property, traffic channel, dates, locale/device, and whether Google must be inspected through the user's signed-in Chrome session.
|
|
13
|
+
- Use both recent comparison (normally the latest 3 months vs. the preceding 3 months) and a year-over-year comparison (normally the same recent 3 months one year earlier). End periods on the latest Search Console date that is complete enough to compare, use equal day counts and comparable weekday mix, and state any unavailable baseline as `N/A`, never as zero.
|
|
14
|
+
- Fix the Search Console search type, country, device, property scope, canonical-URL handling, and any brand-query exclusion across each comparison. Record GA4 timezone, Organic Search channel definition, and landing-page URL normalization.
|
|
15
|
+
- Treat a page as a candidate only after checking page-level **and** query-level Search Console data. GA4 is corroborating traffic evidence, not a substitute for query and rank data.
|
|
16
|
+
- Do not attribute a loss to rankings from clicks alone. URL-filtered and property-wide Search Console impressions are affected by the site's own visibility and are not standalone demand measures. Check an independent demand proxy (for example Google Trends for the query/topic, Keyword Planner where available, or a documented market-data source), then use property-wide query data only as corroboration. Also check URL/query rank changes, cannibalization, and live SERP composition.
|
|
17
|
+
- Do not alter CMS content, metadata, internal links, or publish settings. If the user asks for changes, finish this investigation first and obtain a separate article-update scope.
|
|
18
|
+
|
|
19
|
+
## Workflow
|
|
20
|
+
|
|
21
|
+
### 1. Collect comparable evidence
|
|
22
|
+
|
|
23
|
+
1. Export Search Console performance by **page** for the two period pairs. Prefer an export/CSV over manually paging a truncated table.
|
|
24
|
+
2. Retain clicks, impressions, CTR, and average position for each period. Record filters, property, and export dates.
|
|
25
|
+
3. Obtain GA4 organic-search landing-page sessions or views for the same dates when available. Note that GA4 and Search Console count different things.
|
|
26
|
+
4. Normalize both the recent-pair and year-over-year page exports to the columns in [selection-rubric.md](references/selection-rubric.md). Run the bundled filter on each, take the union of the two candidate lists, and label the comparison(s) that surfaced each URL. A page that only passes one comparison still needs the full evidence checks in both.
|
|
27
|
+
|
|
28
|
+
```powershell
|
|
29
|
+
python "<skill-directory>/scripts/select_rank_led_candidates.py" normalized-pages.csv --format markdown
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
Replace `<skill-directory>` with the directory containing this `SKILL.md`. Use the script to screen candidates, not to make the final decision. Tune its thresholds only if the report explains why.
|
|
33
|
+
|
|
34
|
+
### 2. Separate causes before selecting pages
|
|
35
|
+
|
|
36
|
+
Classify each materially declining page into one of these mutually exclusive buckets:
|
|
37
|
+
|
|
38
|
+
| Bucket | Evidence | Action |
|
|
39
|
+
| ------------------------------------ | ---------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------- |
|
|
40
|
+
| Rank-led maintenance candidate | Clicks materially down; impressions broadly stable; average position/query ranks worsen | Investigate and prioritize |
|
|
41
|
+
| Demand/obsolescence decline | Impressions and clicks fall together, or the task/query has ended | Exclude from the rank-led list |
|
|
42
|
+
| CTR/SERP change | Position broadly stable but CTR falls; SERP features or title/snippet changes explain it | Keep separate; do not call it rank-led |
|
|
43
|
+
| Technical/indexing issue | Indexing, canonical, rendering, or availability evidence | Escalate separately |
|
|
44
|
+
| Cannibalization/internal competition | Another site URL gained the same query or intent | Exclude from this content-maintenance list; route for consolidation/targeting decision |
|
|
45
|
+
| Insufficient evidence | Low volume or no comparable baseline | Do not force into the top 10 |
|
|
46
|
+
|
|
47
|
+
For every selected URL, verify at least three previously valuable declined queries. For each query, collect three views with identical search type/country/device/date filters: (a) the target URL's query metrics and position, (b) the **whole property** query metrics without a page filter, and (c) an independent demand proxy. Treat (c) as the demand evidence; use (b) only to understand the site's overall visibility. Use year-over-year data to catch longer-running changes. Check whether another URL in the property gained the same query; classify confirmed cannibalization in its own exclusion bucket. If the query mix changed, say so.
|
|
48
|
+
|
|
49
|
+
Before retaining a content-maintenance candidate, perform a minimum health check: URL Inspection/index status, user-selected canonical, HTTP availability, and rendered-page accessibility. Classify a failing page as a technical/indexing issue instead of diagnosing an editorial gap.
|
|
50
|
+
|
|
51
|
+
### 3. Diagnose each selected page in Google
|
|
52
|
+
|
|
53
|
+
When the user specifies Chrome or Google, use the Chrome browser, not a general web-search backend. For each selected URL:
|
|
54
|
+
|
|
55
|
+
1. Search at least three declined, historically valuable queries in Google, using the required locale/device context where possible.
|
|
56
|
+
2. Capture the target URL's visible rank or absence, the top competing URLs, and material SERP features (AI Overview, official result, video carousel, PAA, news, forums, etc.). Use fresh tabs and do not change account or site settings.
|
|
57
|
+
3. Compare the target and the leading pages on search intent, freshness, direct answer quality, task completion, factual completeness, first-party evidence, visual/media support, structure, and trust signals. Base observations on actual page content; distinguish observed facts from inference.
|
|
58
|
+
4. Identify the gap to investigate, not the edit itself. Examples: outdated UI steps, missing current constraints, poor intent match, weak original evidence, or a SERP now dominated by official sources.
|
|
59
|
+
|
|
60
|
+
If parallel agents are available, assign no more than two pages to each agent. Require each agent to return the period metrics, three or more queries, Google competitors, SERP features, observed content gaps, exclusions, and source URLs. Consolidate only after all agents return evidence.
|
|
61
|
+
|
|
62
|
+
### 4. Produce the maintenance report
|
|
63
|
+
|
|
64
|
+
Create or append to `report.md`; preserve earlier findings unless the user asks to replace them. Use this structure:
|
|
65
|
+
|
|
66
|
+
1. Scope, dates, data sources, filters, and limitations.
|
|
67
|
+
2. Selection method and explicit rank-led thresholds.
|
|
68
|
+
3. A prioritized table of up to the requested number of rank-led pages (default 10): URL, recent metrics, year-over-year metrics, property-wide query-demand evidence, ranking evidence, priority, and confidence. If fewer pages meet the evidence threshold, report fewer and explain the shortfall.
|
|
69
|
+
4. Per-page diagnosis: three or more declined queries, current Google competitors/SERP observations, and content gaps to investigate.
|
|
70
|
+
5. Excluded near-misses with the evidence for demand decline, obsolete intent, CTR-only loss, technical issue, cannibalization, or insufficient data.
|
|
71
|
+
6. A separate follow-up queue for work that needs a technical or editorial decision.
|
|
72
|
+
|
|
73
|
+
Before delivery, verify that every page in the final rank-led list has stable-enough independent demand evidence, a documented query-level rank deterioration, and a passing health check. Never fill a quota with demand-led losses.
|
|
74
|
+
|
|
75
|
+
## Resources
|
|
76
|
+
|
|
77
|
+
- [selection-rubric.md](references/selection-rubric.md): normalization schema, default thresholds, and report checklist.
|
|
78
|
+
- `scripts/select_rank_led_candidates.py`: deterministic first-pass filter for normalized Search Console page exports.
|