Skill Tracer
Skills › Skills For Real Engineers › software-factory

software-factory

skill · 98 lines · MIT · skills/in-progress/software-factory/SKILL.md

The facts

Its description

Shared language for designing a software factory: the tasks it runs and the services it plugs into.

The description the agent reads to decide when to use it.

From its settingsline 3

When it starts

This skill is not model-invoked: its frontmatter sets disable-model-invocation, so the agent never picks it up from what a person says. It is loaded only when something else invokes it directly, such as the user running the skill by name, and it then supplies the shared vocabulary for designing a software factory.

A model's summary of when it is used.

A model's reading

Who can start it

Only you

Only you can start it. The agent never picks it on its own.

From its settingsline 4

Files it mentions

EXAMPLE-TASKS.md, TICKET-TRACKERS.md, GIT-HOSTS.md, RUNNERS.md, OBSERVABILITY-PLATFORMS.md

Files the text names, such as ones to read or write. Found by matching words, so treat them as pointers.

Found by matching wordsline 52 line 79 line 80 line 81 line 82

Licence

MIT, from LICENSE

The terms its author shares it under, which let it be shown here.

From the repositorylicence text
Other files in this skill (5) Close

The text

Open on GitHub

Most marks come from matching words in the file, so treat them as pointers.

1---
2name: software-factory
3description: Shared language for designing a software factory: the tasks it runs and the services it plugs into.
4disable-model-invocation: true
5---
6
7A **software factory** is a system of agents that turns tickets, PRs and schedules into merged code, deployed on remote infrastructure the user chooses. This skill is the language for designing one. Use these terms, and only these, when discussing or whiteboarding a factory; when the user reaches for a word under _Avoid_, name the canonical term.
8

A software factory is a system of agents that turns tickets, PRs and schedules into merged code, deployed on remote infrastructure the user chooses. This skill is the language for designing one. Use these terms, and only these, when discussing or whiteboarding a factory; when the user reaches for a word under Avoid, name the canonical term.

Raw lines 1 to 8
9## Tasks and runs
11**Task**:
12A kind of work the factory performs, defined once and run many times: review, explore, implement, ratchet. A task may work on a ticket, a PR, or the codebase as a whole.
13_Avoid_: job, workflow, action
15**Trigger**:
16The event that starts a run: a change in the ticket tracker or git host, a clock in the orchestrator, or another run.
18**Run**:
19One execution of a task on one runner, from its trigger to its finish, treated as a black box. A run triggers further runs either directly, through logic in the orchestrator, or by changing the ticket tracker or git host. A run never waits for a human: it ends, and the human's later change to the ticket tracker or git host triggers a new run.
20_Avoid_: session
22**Runner**:
23The disposable machine a run executes on. Nothing on it survives the run, even when the machine itself is long-lived: a run's only memory of earlier runs is the ticket tracker, the git host and the orchestrator.
24_Avoid_: server, host, box, compute, sandbox

Tasks and runs

Task: A kind of work the factory performs, defined once and run many times: review, explore, implement, ratchet. A task may work on a ticket, a PR, or the codebase as a whole. Avoid: job, workflow, action

Trigger: The event that starts a run: a change in the ticket tracker or git host, a clock in the orchestrator, or another run.

Run: One execution of a task on one runner, from its trigger to its finish, treated as a black box. A run triggers further runs either directly, through logic in the orchestrator, or by changing the ticket tracker or git host. A run never waits for a human: it ends, and the human's later change to the ticket tracker or git host triggers a new run. Avoid: session

Runner: The disposable machine a run executes on. Nothing on it survives the run, even when the machine itself is long-lived: a run's only memory of earlier runs is the ticket tracker, the git host and the orchestrator. Avoid: server, host, box, compute, sandbox

Raw lines 9 to 25
26## Services
28**Ticket tracker**:
29Where tickets live, and the factory's human interface: humans schedule work by filing tickets, talk to agents in their comments, and their changes to tickets trigger runs.
30_Avoid_: issue tracker, ticket manager, project board
32**Ticket source**:
33Anything outside the factory that creates tickets in the ticket tracker: a feedback button, a monitor, an error tracker, an inbox.
34_Avoid_: data source, trigger source, intake
36**Git host**:
37Where branches, PRs and reviews live.
38_Avoid_: code host, forge, repo
40**Orchestrator**:
41The component that receives triggers, starts runs on runners, and records which runs are queued, in flight or finished.
42_Avoid_: dispatcher, scheduler, control plane
44**Observability platform**:
45Where runners send logs, traces and status, so a human can see what happened inside each run. Optional: the product filling the runner or orchestrator slot often shows enough on its own. A run never decides on it until something writes it into the ticket tracker or git host.
46_Avoid_: observability, logs, monitoring, dashboard

Services

Ticket tracker: Where tickets live, and the factory's human interface: humans schedule work by filing tickets, talk to agents in their comments, and their changes to tickets trigger runs. Avoid: issue tracker, ticket manager, project board

Ticket source: Anything outside the factory that creates tickets in the ticket tracker: a feedback button, a monitor, an error tracker, an inbox. Avoid: data source, trigger source, intake

Git host: Where branches, PRs and reviews live. Avoid: code host, forge, repo

Orchestrator: The component that receives triggers, starts runs on runners, and records which runs are queued, in flight or finished. Avoid: dispatcher, scheduler, control plane

Observability platform: Where runners send logs, traces and status, so a human can see what happened inside each run. Optional: the product filling the runner or orchestrator slot often shows enough on its own. A run never decides on it until something writes it into the ticket tracker or git host. Avoid: observability, logs, monitoring, dashboard

Raw lines 26 to 47
48## Designing a factory
50A design has two halves: the **services**, each a slot filled with a product, and the **tasks** whose runs move work through them.
52Start from the user's problem, not the factory: untriaged tickets, PRs waiting for automated review, a stricter automated check to migrate to, bugs nobody reads. When the user names a problem or doesn't know what to build, read [EXAMPLE-TASKS.md](EXAMPLE-TASKS.md) for the tasks that solve common ones.

Designing a factory

A design has two halves: the services, each a slot filled with a product, and the tasks whose runs move work through them.

Start from the user's problem, not the factory: untriaged tickets, PRs waiting for automated review, a stricter automated check to migrate to, bugs nobody reads. When the user names a problem or doesn't know what to build, read EXAMPLE-TASKS.md for the tasks that solve common ones.

Raw lines 48 to 53
Reads a file EXAMPLE-TASKS.md :52
54### Start slow
56Every trigger is an accelerator. Accelerators without brakes make a slop cannon. There are three brakes:
58- **Automated checks**: deterministic gates (types, lint, tests) that every run must pass.
59- **Automated review**: a separate run that reads the diff cold against the codebase's standards and the ticket, when there is one.
60- **Human review**: a human reads the PR before it merges; what it catches becomes new automated checks and sharper automated review.
62Add one automated trigger at a time, throttled at first (one bug report in ten, a clock once a day), with human review on every PR. Open the throttle as the brakes earn trust, and cap every loop of runs at a few tries before a human.

Start slow

Every trigger is an accelerator. Accelerators without brakes make a slop cannon. There are three brakes:

  • Automated checks: deterministic gates (types, lint, tests) that every run must pass.
  • Automated review: a separate run that reads the diff cold against the codebase's standards and the ticket, when there is one.
  • Human review: a human reads the PR before it merges; what it catches becomes new automated checks and sharper automated review.

Add one automated trigger at a time, throttled at first (one bug report in ten, a clock once a day), with human review on every PR. Open the throttle as the brakes earn trust, and cap every loop of runs at a few tries before a human.

Raw lines 54 to 63
64### Fill every slot
66Each service is a slot. One product can fill several slots, and one server can host several services. Three designs, side by side:
68| Service | All on GitHub | Linear tickets | Own tracker |
69| ---------------------- | ------------------------------- | ------------------------------ | ------------------------ |
70| Ticket tracker | GitHub Issues | Linear | own app |
71| Ticket source | feedback button | feedback button, monitor | feedback button, monitor |
72| Git host | GitHub | GitHub | GitHub |
73| Orchestrator | GitHub Actions | own server + database | own app |
74| Runner | Actions runner | Actions, E2B, Daytona or a VPS | own app, or sandboxes |
75| Observability platform | none: Actions run pages suffice | an LLM tracing platform | own app |
77When the user is choosing a product for a slot, read that slot's survey to get oriented, then research the current options yourself; each survey groups the options by type and lists the questions that decide the slot:
79- [TICKET-TRACKERS.md](TICKET-TRACKERS.md)
80- [GIT-HOSTS.md](GIT-HOSTS.md)
81- [RUNNERS.md](RUNNERS.md)
82- [OBSERVABILITY-PLATFORMS.md](OBSERVABILITY-PLATFORMS.md)
84Buy the services and build the tasks: the tasks carry the user's design, the services are generic. Favour an off-the-shelf ticket tracker: it is robust, people already know it, and outside users are easy to let in.

Fill every slot

Each service is a slot. One product can fill several slots, and one server can host several services. Three designs, side by side:

ServiceAll on GitHubLinear ticketsOwn tracker
Ticket trackerGitHub IssuesLinearown app
Ticket sourcefeedback buttonfeedback button, monitorfeedback button, monitor
Git hostGitHubGitHubGitHub
OrchestratorGitHub Actionsown server + databaseown app
RunnerActions runnerActions, E2B, Daytona or a VPSown app, or sandboxes
Observability platformnone: Actions run pages sufficean LLM tracing platformown app

When the user is choosing a product for a slot, read that slot's survey to get oriented, then research the current options yourself; each survey groups the options by type and lists the questions that decide the slot:

  • TICKET-TRACKERS.md
  • GIT-HOSTS.md
  • RUNNERS.md
  • OBSERVABILITY-PLATFORMS.md

Buy the services and build the tasks: the tasks carry the user's design, the services are generic. Favour an off-the-shelf ticket tracker: it is robust, people already know it, and outside users are easy to let in.

Raw lines 64 to 85
Reads a file TICKET-TRACKERS.md :79
Reads a file GIT-HOSTS.md :80
Reads a file RUNNERS.md :81
86### Question every task
88For each task, answer:
901. What triggers it?
912. What does it do, and which services does it read and write?
923. What does it trigger next?
934. Where does a human re-enter?
945. What stops two runs doing the same work?
96For each ticket source, answer: what stops it filing the same ticket twice?
98A design is finished when every slot names a product (or, for the observability platform, a deliberate none) and every task and ticket source has an answer to every question.

Question every task

For each task, answer:

  1. What triggers it?
  2. What does it do, and which services does it read and write?
  3. What does it trigger next?
  4. Where does a human re-enter?
  5. What stops two runs doing the same work?

For each ticket source, answer: what stops it filing the same ticket twice?

A design is finished when every slot names a product (or, for the observability platform, a deliberate none) and every task and ticket source has an answer to every question.

Raw lines 86 to 98

From mattpocock/skills at 4ae2317, 2026-10-31. Skills read by DeepSeek V4.1 Flash on 2026-11-04. Summary and techniques by Claude Opus 5.5 on 2026-11-06.