linersh 1.1.3 → 1.2.0

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.
Files changed (62) hide show
  1. package/README.md +12 -58
  2. package/bin/liner.js +15 -7
  3. package/package.json +10 -17
  4. package/cli-update-docs/README.md +0 -129
  5. package/cli-update-docs/SKILL.md +0 -294
  6. package/cli-update-docs/curator-notes.md +0 -85
  7. package/cli-update-docs/quality-check-tests.md +0 -435
  8. package/cli-update-docs/source-finding-tactics.md +0 -224
  9. package/cli-update-docs/source-quality-hierarchy.md +0 -209
  10. package/cli-update-docs/synthesis-guidance.md +0 -151
  11. package/dist/agents/artifact-validation.js +0 -567
  12. package/dist/agents/artifact-validation.js.map +0 -1
  13. package/dist/agents/candidate-longlist.js +0 -116
  14. package/dist/agents/candidate-longlist.js.map +0 -1
  15. package/dist/agents/detect.js +0 -169
  16. package/dist/agents/detect.js.map +0 -1
  17. package/dist/agents/evaluation-assembly.js +0 -270
  18. package/dist/agents/evaluation-assembly.js.map +0 -1
  19. package/dist/agents/events.js +0 -8
  20. package/dist/agents/events.js.map +0 -1
  21. package/dist/agents/headless-runner.js +0 -432
  22. package/dist/agents/headless-runner.js.map +0 -1
  23. package/dist/agents/jtbd-clarify.js +0 -169
  24. package/dist/agents/jtbd-clarify.js.map +0 -1
  25. package/dist/agents/models.js +0 -98
  26. package/dist/agents/models.js.map +0 -1
  27. package/dist/agents/parsers.js +0 -316
  28. package/dist/agents/parsers.js.map +0 -1
  29. package/dist/agents/prompts.js +0 -522
  30. package/dist/agents/prompts.js.map +0 -1
  31. package/dist/agents/run-log.js +0 -71
  32. package/dist/agents/run-log.js.map +0 -1
  33. package/dist/agents/runner.js +0 -906
  34. package/dist/agents/runner.js.map +0 -1
  35. package/dist/agents/types.js +0 -2
  36. package/dist/agents/types.js.map +0 -1
  37. package/dist/bin-resolver.js +0 -92
  38. package/dist/bin-resolver.js.map +0 -1
  39. package/dist/config.js +0 -282
  40. package/dist/config.js.map +0 -1
  41. package/dist/editor.js +0 -40
  42. package/dist/editor.js.map +0 -1
  43. package/dist/gates.js +0 -121
  44. package/dist/gates.js.map +0 -1
  45. package/dist/ipc.js +0 -145
  46. package/dist/ipc.js.map +0 -1
  47. package/dist/open-folder.js +0 -28
  48. package/dist/open-folder.js.map +0 -1
  49. package/dist/phases.js +0 -346
  50. package/dist/phases.js.map +0 -1
  51. package/dist/progress.js +0 -184
  52. package/dist/progress.js.map +0 -1
  53. package/dist/source-inbox.js +0 -297
  54. package/dist/source-inbox.js.map +0 -1
  55. package/dist/types.js +0 -3
  56. package/dist/types.js.map +0 -1
  57. package/dist/version.js +0 -18
  58. package/dist/version.js.map +0 -1
  59. package/dist/yaml-io.js +0 -376
  60. package/dist/yaml-io.js.map +0 -1
  61. package/maintenance-skill/SKILL.md +0 -18
  62. package/maintenance-skill/agents/openai.yaml +0 -4
package/README.md CHANGED
@@ -1,21 +1,13 @@
1
- # Liner NPM Shim And Runner Package
1
+ # Liner npm package
2
2
 
3
- This package is still named `linersh` because it owns the published `liner`
4
- binary. It is no longer the React/Ink TUI implementation.
3
+ This package is named `linersh` because it owns the published `liner` binary.
5
4
 
6
- Active responsibilities:
5
+ - `bin/liner.js`: the launcher. It opens the navigator, or forwards a subcommand
6
+ to Core.
7
+ - Optional per-platform packages hold the native CLI and navigator binaries.
7
8
 
8
- - `bin/liner.js`: npm binary shim
9
- - Go TUI launcher for `packages/go-tui/` in development
10
- - TypeScript headless methodology runner under `src/agents/`
11
- - packaged curation skill bundle copied from `../../docs/curation-skill/` into
12
- `cli-update-docs/`
13
- - optional per-platform packages that contain the native CLI and Go TUI
14
- binaries for installed users
15
-
16
- The old React/Ink TUI has been decommissioned and is no longer part of the
17
- active package shape. `LINER_TUI=ink` intentionally fails with a decommissioning
18
- message.
9
+ Every Core command has to be listed in `bin/liner.js`, or the launcher opens the
10
+ navigator instead. A test in `tests/test_library_view.py` checks this.
19
11
 
20
12
  ## Install
21
13
 
@@ -25,7 +17,7 @@ npm install -g linersh
25
17
  liner
26
18
  ```
27
19
 
28
- With no arguments, `liner` launches the Go TUI. CLI subcommands such as
20
+ With no arguments, `liner` opens the navigator. CLI subcommands such as
29
21
  `liner compile`, `liner share`, `liner import`, `liner project`,
30
22
  `liner sources`, `liner adapters`, `liner status`, and `liner setup-js` pass
31
23
  through to the Python core. If you are using one-shot
@@ -46,7 +38,7 @@ liner sources add <project> --type web --url <url> --note <note>
46
38
  liner project rename <project> --name <name>
47
39
  ```
48
40
 
49
- The Go TUI's `Maintain project` command uses the same contract. Optional Codex
41
+ Optional Codex
50
42
  and Claude Maintenance Adapters are explicit CLI-delegating installations:
51
43
 
52
44
  ```sh
@@ -75,46 +67,16 @@ rm -rf "$tmp"
75
67
  ```
76
68
 
77
69
  The second command opens the Go TUI. Create a test Liner Project, build the
78
- corpus with your configured OpenAI (Codex CLI) or Claude (Claude Code) runner,
70
+ corpus with your agent,
79
71
  then run Create Operating Layer. Because `HOME`, the npm cache, and `LINER_DIR`
80
72
  all point inside `$tmp`, cleanup is just `rm -rf "$tmp"`.
81
73
 
82
74
  ## Run Locally
83
75
 
84
- For normal repository testing, use the isolated launch so Projects and Settings
85
- cannot write to the production Liner library or profile:
86
-
87
76
  ```sh
88
77
  npm --prefix packages/tui run dev:isolated
89
78
  ```
90
79
 
91
- See [../../docs/development.md](../../docs/development.md) for explicit
92
- authenticated provider-home options and the offline runner-preferences smoke.
93
-
94
- From the repo root:
95
-
96
- ```sh
97
- npm --prefix packages/tui run dev
98
- ```
99
-
100
- From this package:
101
-
102
- ```sh
103
- npm run dev
104
- ```
105
-
106
- Override the projects folder:
107
-
108
- ```sh
109
- LINER_DIR=/path/to/projects node bin/liner.js
110
- ```
111
-
112
- Override the Python/core binary:
113
-
114
- ```sh
115
- LINER_BIN=/absolute/path/to/liner node bin/liner.js
116
- ```
117
-
118
80
  ## Build And Test
119
81
 
120
82
  ```sh
@@ -126,7 +88,7 @@ npm test
126
88
 
127
89
  Notes:
128
90
 
129
- - `build` compiles the TypeScript headless runner and shared runner utilities.
91
+ - `build` compiles the version helper.
130
92
  - `build:go` compiles `../go-tui/cmd/liner-tui` into `bin/liner-tui` for local
131
93
  development.
132
94
  - `build:package` runs both.
@@ -141,20 +103,12 @@ Notes:
141
103
 
142
104
  - `LINER_DIR=/path/to/projects`: change the projects folder.
143
105
  - `LINER_BIN=/path/to/liner`: force the Python/core binary.
144
- - `LINER_GO_TUI_BIN=/path/to/liner-tui`: force the Go TUI binary.
145
- - `LINER_HEADLESS_RUNNER=/path/to/headless-runner.js`: force the methodology
146
- runner script.
147
- - `LINER_AGENT=codex|claude`: override the agent selected by Liner config.
106
+ - `LINER_GO_TUI_BIN=/path/to/liner-tui`: force the navigator binary.
148
107
  - `LINER_TUI=go`: accepted for compatibility, but no longer required.
149
108
 
150
109
  ## Developer Gotchas
151
110
 
152
111
  - Rebuild `bin/liner-tui` after Go changes or the npm shim may launch an older
153
112
  binary.
154
- - Rebuild `dist/` after TypeScript runner changes or methodology will fail.
155
113
  - The published main package intentionally excludes `bin/liner-tui`; installed
156
114
  users get the native TUI from `linersh-<platform>-<arch>`.
157
- - If Project Health says `status failed`, check the resolved core. Older bundled
158
- cores may reject `--no-write`; the Go wrapper has a fallback, but direct
159
- `node bin/liner.js status ... --no-write` can still fail until platform cores
160
- are refreshed.
package/bin/liner.js CHANGED
@@ -43,6 +43,21 @@ const COMMAND_GROUPS = [
43
43
  { name: "status", description: "Show Liner Project status", owner: "core" },
44
44
  { name: "setup-js", description: "Set up JavaScript rendering support", owner: "core" },
45
45
  { name: "uninstall", description: "Remove local Liner state and caches", owner: "launcher" },
46
+ { name: "catalog", description: "List every liner in your library", owner: "core" },
47
+ { name: "search", description: "Search your liners", owner: "core" },
48
+ { name: "find-sources", description: "Find sources already in your library", owner: "core" },
49
+ { name: "library", description: "Report your whole library as JSON", owner: "core" },
50
+ { name: "handoff", description: "Write prompts for your agent", owner: "core" },
51
+ { name: "research", description: "Build a liner step by step with an agent", owner: "core" },
52
+ { name: "fetch", description: "Save a web page to a file in a liner", owner: "core" },
53
+ { name: "citations", description: "List a synthesis's citations", owner: "core" },
54
+ { name: "refresh", description: "Report what changed online", owner: "core" },
55
+ { name: "gaps", description: "Record what a liner couldn't answer", owner: "core" },
56
+ { name: "findings", description: "Review what real work learned", owner: "core" },
57
+ { name: "test", description: "Record with-and-without tests", owner: "core" },
58
+ { name: "use", description: "Point a repository at a liner", owner: "core" },
59
+ { name: "agent-skill", description: "Manage the liner skill", owner: "core" },
60
+ { name: "mcp", description: "Serve your liners over MCP", owner: "core" },
46
61
  {
47
62
  name: "--version",
48
63
  description: "Show installed launcher and core versions (-v)",
@@ -145,14 +160,12 @@ if (wantsCli(argv)) {
145
160
  }
146
161
 
147
162
  const resolved = resolveGoTuiBinary();
148
- const headlessRunner = tryResolveHeadlessRunnerScript();
149
163
  const child = spawn(resolved.command, resolved.args, {
150
164
  stdio: "inherit",
151
165
  cwd: resolved.cwd || process.cwd(),
152
166
  env: {
153
167
  ...process.env,
154
168
  LINER_BIN: process.env.LINER_BIN || tryResolveCliCommand() || "",
155
- LINER_HEADLESS_RUNNER: process.env.LINER_HEADLESS_RUNNER || headlessRunner || "",
156
169
  },
157
170
  });
158
171
  child.on("exit", (code, signal) => {
@@ -475,11 +488,6 @@ function tryResolveCliCommand() {
475
488
  return findRepoVenvBinary() || findBundledBinary() || findPathBinary() || null;
476
489
  }
477
490
 
478
- function tryResolveHeadlessRunnerScript() {
479
- const candidate = join(packageRoot, "dist", "agents", "headless-runner.js");
480
- return existsSync(candidate) ? candidate : null;
481
- }
482
-
483
491
  function printVersion() {
484
492
  const tui = readTuiVersion();
485
493
  let coreVer = null;
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "linersh",
3
- "version": "1.1.3",
4
- "description": "Liner — npm shim, Go TUI launcher, and headless methodology runner.",
3
+ "version": "1.2.0",
4
+ "description": "Liner — npm launcher for the terminal navigator and Core CLI.",
5
5
  "type": "module",
6
6
  "license": "MIT",
7
7
  "author": "cmdux-sh",
@@ -17,10 +17,7 @@
17
17
  "liner": "bin/liner.js"
18
18
  },
19
19
  "files": [
20
- "bin/liner.js",
21
- "dist/",
22
- "cli-update-docs/",
23
- "maintenance-skill/"
20
+ "bin/liner.js"
24
21
  ],
25
22
  "scripts": {
26
23
  "build": "tsc",
@@ -31,8 +28,7 @@
31
28
  "dev:go": "node bin/liner.js",
32
29
  "predev:isolated": "node scripts/unhide-venv.mjs && npm run build:package",
33
30
  "dev:isolated": "node scripts/dev-isolated.mjs",
34
- "smoke:runner-preferences": "node scripts/runner-preferences-smoke.mjs",
35
- "prepack": "npm run release:check && node scripts/copy-skill-bundle.mjs && npm run build:package",
31
+ "prepack": "npm run release:check && npm run build:package",
36
32
  "release:check": "uv run python ../../scripts/release-version.py --check",
37
33
  "release:check:publish": "uv run python ../../scripts/release-version.py --check --check-registry --registry-package linersh",
38
34
  "prepublishOnly": "npm run release:check:publish && npm run typecheck && npm test && npm run build:package",
@@ -44,20 +40,17 @@
44
40
  "typecheck": "tsc --noEmit",
45
41
  "test": "vitest run"
46
42
  },
47
- "dependencies": {
48
- "yaml": "^2.6.1"
49
- },
50
43
  "optionalDependencies": {
51
- "linersh-darwin-arm64": "1.1.3",
52
- "linersh-darwin-x64": "1.1.3",
53
- "linersh-linux-arm64": "1.1.3",
54
- "linersh-linux-x64": "1.1.3",
55
- "linersh-win32-x64": "1.1.3"
44
+ "linersh-darwin-arm64": "1.2.0",
45
+ "linersh-darwin-x64": "1.2.0",
46
+ "linersh-linux-arm64": "1.2.0",
47
+ "linersh-linux-x64": "1.2.0",
48
+ "linersh-win32-x64": "1.2.0"
56
49
  },
57
50
  "devDependencies": {
58
51
  "@types/node": "^22.10.0",
59
52
  "typescript": "^5.7.2",
60
- "vitest": "^3.2.6"
53
+ "vitest": "^4.1.11"
61
54
  },
62
55
  "engines": {
63
56
  "node": ">=18"
@@ -1,129 +0,0 @@
1
- # Curating Mixtapes — Skill Bundle
2
-
3
- This is the Liner methodology made executable by Claude or Codex. The bundle implements CURATION.md v2.0 as instructions to a running AI, drives the mixtape lifecycle from a task description to a project folder ready for `liner compile`, and supports both quick mode (the AI does most of the work, with lightweight gate review) and methodology mode (the curator engages substantively at every phase).
4
-
5
- It is one of Liner's authoring surfaces, alongside the CLI and TUI. The skill is
6
- the surface for Claude-Code-native and TUI-subprocess curation. Methodology-mode
7
- curators can also use it directly when working in a Claude Code session. It is
8
- not the Project Skill or the optional Maintenance Adapter.
9
-
10
- ## Bundle contents
11
-
12
- Six files in one directory:
13
-
14
- ```
15
- curating-mixtapes/
16
- ├── SKILL.md # the orchestrator
17
- ├── source-finding-tactics.md # Phase 2
18
- ├── source-quality-hierarchy.md # Phase 4
19
- ├── curator-notes.md # Phase 4
20
- ├── quality-check-tests.md # Phase 5
21
- └── synthesis-guidance.md # Phase 6
22
- ```
23
-
24
- `SKILL.md` is the orchestrator. It defines the trigger description, the two modes, the review gates, the lifecycle skeleton, the AI biases to compensate for, the boundaries (what the skill does NOT do), and the failure modes to watch. It is always loaded when the skill fires.
25
-
26
- The five companion files are loaded only at the phases that use them. Phases 1, 3, 7, and 8 have no companion file — their guidance fits inside SKILL.md.
27
-
28
- The split is deliberate. Every invocation pulls SKILL.md's ~2,300 words into context regardless. Companion files add 1,000–1,500 words each but only at the phase that needs them, so total context cost scales with where the user is in the lifecycle rather than with the bundle's full size.
29
-
30
- ## Where the bundle lives
31
-
32
- **Local testing.** Drop this directory into `~/.claude/skills/curating-mixtapes/`. Claude Code and Claude Desktop both look there for user-installed skills. The skill fires when the user says something the description matches — "help me make a mixtape on [topic]" is the canonical trigger.
33
-
34
- **Shipping.** The canonical bundle lives at `docs/curation-skill/`. The TUI copies this directory into `packages/tui/cli-update-docs/` during `prepack` and ships it inside the `linersh` npm package, so end users do not need a separate skill install for TUI-driven agent phases.
35
-
36
- **Direct skill use.** A documented copy/install flow for using the skill outside the TUI is still planned. Until then, direct local use is a developer workflow.
37
-
38
- **TUI subprocess.** The Liner TUI bundles the skill internally and invokes it via the local Claude or Codex CLI in quick mode. The user doesn't see the skill directly; they see the TUI's wizard UI. The methodology being applied is this skill's.
39
-
40
- The same file contents work in every location. Don't fork between a local-test version and the package-shipped version.
41
-
42
- ## Runtime requirements
43
-
44
- Filesystem access is required, not optional. The skill reads its own companion files at specific phases and writes mixtape artifacts to a project folder. It is designed for execution inside Claude Code or as a TUI subprocess, both of which have filesystem access by default. It is not designed for pure-chat (claude.ai) use.
45
-
46
- No MCP server is required. v1 uses Claude's own web search for candidate discovery and URL verification. When the Liner MCP server ships, a future skill version will use it for fetching and cache operations; v1 doesn't depend on it.
47
-
48
- ## How invocation works
49
-
50
- The user says something the description matches. Claude loads SKILL.md. Claude reads it, identifies which mode applies (quick by default unless the user says otherwise or asks for library contribution), and begins the lifecycle.
51
-
52
- At Phase 2, Claude reads `source-finding-tactics.md`. At Phase 4, Claude reads `source-quality-hierarchy.md` and `curator-notes.md`. At Phase 5, Claude reads `quality-check-tests.md`. At Phase 6, Claude reads `synthesis-guidance.md`. Each companion file is read at the start of its phase, before any work in that phase happens.
53
-
54
- The gates pause for user input. In quick mode, defaults can auto-continue while preserving project state. In methodology mode, the AI pauses for substantive review.
55
-
56
- The skill writes artifacts to a project folder named for the topic (e.g., `mobile-design-foundations/`) as it goes. The working notes are produced phase by phase, so the user can stop at any phase boundary and resume later — the working files are picked up where they were left.
57
-
58
- When all phases complete, the user runs `liner compile <project-folder>` themselves. The skill never compiles.
59
-
60
- ## How to test the bundle
61
-
62
- Pick a small topic the curator hasn't already researched. "Writing better LLM evals," "Notion API patterns," "designing for color blindness" — narrow, technical, with enough source material that the corpus has shape but not so much that the run takes hours. Run the skill end-to-end in quick mode. Note where Claude struggles, where the methodology produces friction, where the gates fire awkwardly.
63
-
64
- Run again in methodology mode on the same topic. Compare the artifacts. The two modes should produce same-shape folders with different depth of curator engagement showing through. If the methodology-mode output looks indistinguishable from the quick-mode output, that's a signal the skill isn't asking enough of methodology-mode curators.
65
-
66
- For higher signal: run the skill in quick mode on a topic that already has a hand-curated mixtape (the CLI/TUI corpus is the obvious one). Compare the skill's tape file and synthesis against the hand-curated version. This is the empirical test for the skill itself, structurally identical to the methodology's Phase 8 test for mixtapes. If the skill's quick-mode output is meaningfully worse than the hand-curated version, that's expected — quick mode targets "good enough for personal use." If the gap is larger than expected, the skill needs work.
67
-
68
- ## How to update or extend the bundle
69
-
70
- Three kinds of changes happen, each with a different shape.
71
-
72
- **Tightening SKILL.md.** Phase descriptions, gate behavior, trigger description, the AI-biases list, the failure-modes list. Edit in place. SKILL.md is the source of truth for the bundle's structure; everything else conforms to what SKILL.md says.
73
-
74
- **Editing a companion file.** Refinements to the tactics, hierarchy, notes guidance, tests, or synthesis advice. Edit in place. Keep the orchestrator references in SKILL.md unchanged unless the change affects when or how a companion gets read.
75
-
76
- **Adding a new companion file.** Two questions to answer first. Is the content concretely better than what could fit in SKILL.md? (Worked examples and pattern catalogs are the usual reasons.) Does the content apply to one specific phase rather than the whole lifecycle? If yes to both, add the companion and reference it from SKILL.md's lifecycle section. If no to either, the content probably belongs in SKILL.md itself or in CURATION.md.
77
-
78
- When adding a companion, update this README's "Bundle contents" section and the load-profile note in SKILL.md. Don't let the bundle's structure drift from how the README describes it.
79
-
80
- ## Current status
81
-
82
- The bundle is functional and ships inside the npm TUI package so agent-backed phases can run from `npx linersh` without a separate skill install. The TUI copies this directory into the package during `prepack` and resolves it from the installed package root.
83
-
84
- The bundle still benefits from more worked examples in the companion files, but it is no longer blocked by the old "second pass before any shipping" constraint. Current product risk lives more in curation quality and fetcher edge cases than in basic skill availability.
85
-
86
- In the local `1.1.0` release candidate, compilation is the Corpus Ready
87
- milestone and Create Operating Layer is the Project Complete milestone. A
88
- project can be usable when `MIXTAPE.md` is written but some Sources are missing
89
- or soft-failed after review. The TUI opens the existing compile result and
90
- requires an explicit retry or rerun. Phase 1 must produce a Capability Brief and
91
- Required source roles before discovery can proceed.
92
-
93
- ## Three Skill Surfaces
94
-
95
- - The **curating-mixtapes skill** authors the initial corpus recipe, synthesis,
96
- and working notes. It never performs post-creation maintenance.
97
- - The root **Project Skill** is created by the Operating Layer and teaches future
98
- sessions how to use one completed Project.
99
- - The optional **Maintenance Adapter** is installed explicitly for Codex or
100
- Claude and delegates supported changes to the installed CLI's current
101
- guidance. A `type: skill` Source remains inert evidence and is not installed.
102
-
103
- ## Versioning
104
-
105
- The skill bundle has its own version, independent of the CLI, TUI, and methodology document. Three version numbers track separately:
106
-
107
- - **Methodology version** is tracked in CURATION.md (`Current version: 2.0`).
108
- - **Skill bundle version** is the bundle's own — currently v0.3 internally, not yet stamped into SKILL.md frontmatter. Adding a `version` field to the frontmatter is a small open decision; the convention isn't established yet across Liner's surfaces.
109
- - **Methodology compatibility** is asserted by the `methodology_version` field the skill writes into generated `tape.yaml` files. The skill claims compatibility with the methodology version it was built against.
110
-
111
- When CURATION.md updates, the skill bundle may need a corresponding update. The question to ask: does the methodology change affect what the running AI should do, or just how a human reader explains the work? If the former, the skill needs an update; if the latter, the skill is fine as-is. Bias toward updating both together when in doubt.
112
-
113
- ## Relationship to other Liner pieces
114
-
115
- The skill is the methodology made executable. It sits alongside Liner's other surfaces and shares the format and methodology with them.
116
-
117
- **CURATION.md** is the methodology described to humans. The skill bundle implements it for an AI executor. The two are paired artifacts that update together when the methodology changes substantively.
118
-
119
- **The Liner CLI** runs `liner compile` against the project folder this skill
120
- produces and owns supported post-creation maintenance. The curation skill never
121
- compiles and never bypasses the Core maintenance contract.
122
-
123
- **The Liner TUI** invokes this skill internally for agent-backed authoring via the local Claude or Codex CLI. Same methodology, different UX.
124
-
125
- **The Liner MCP server** (planned) will expose mechanical operations — fetch this URL, validate this tape file, query the cache — as tools. A future skill version will use those tools where v1 uses Claude's own web search.
126
-
127
- **The Liner library** publishes methodology-mode mixtapes. The skill can produce library-eligible output if run in methodology mode and the empirical test passes — but the bar for library contribution is real curator engagement, not the skill's quick-mode default.
128
-
129
- Treat changes to the bundle the way you'd treat changes to the methodology: deliberately, with examples, with a clear reason. The skill is the methodology executed at scale; drift in the skill is drift in the methodology.