Version: 1.6 · Date: 2026-10-17
WingFoil is a harness for AI-assisted software development, built to make it deterministic. It manages its own development the same way it asks other projects to (dogfooding): every change flows through Project Memory — typed, versioned, git-backed artifacts — under an explicit Workflow and Directives. This document explains how you contribute to that flow.
The core idea: you contribute intent and decisions as Memory artifacts, and an AI agent turns them
into delivered work. You do not need to write the code, the tests, or run wingfoil yourself.
This is the demonstration of WingFoil’s thesis: structured, AI-mediated contribution is more reproducible than an unstructured pull-request inbox. Decision recorded in
dl-020-contribution-model.
Instead of a code pull request, you file one of the five base Memory documents, each via its capture (“ingest”) workflow:
| You want to… | File a… | Via workflow | Lands as |
|---|---|---|---|
| report a defect | Bug | bug-ingest |
docs/04_memory/bugs/{id}.md |
| propose a product/process decision | Decision-Log (DL) | decision-log-ingest |
…/design/dls/{id}.md |
| propose an architectural decision | ADR | adr-ingest |
…/design/adrs/{id}.md |
| define a shared format/schema/API | Tech-Spec | release-planning (identify-specs) |
…/design/specs/{id}.md |
| request a feature, or change the vision | Change-Proposal | vision-change |
…/change-proposals/{id}.md |
Each artifact starts at draft, then moves to its first working state (open / in-discussion /
pending / in-analysis) so there is content to discuss. A change-proposal names its impact on every
layer below the vision (features, user stories, BDD, SARD requirements, delivered work), “no impact”
included, and its work is finished once a release is scheduled to carry it (dl-132). From there:
release-planning (dl-016 — triage-bugs + reconcile-governance);vision-change’s impact analysis and scheduled by its
schedule step, which names the release; that release’s release-planning then sweeps it into the
release’s features at define-scope.An AI agent then implements the work under the dev-loop (TDD + BDD, code-review/code-quality
directives).
The wingfoil CLI ships (npm wingfoil) and keeps the bookkeeping of a workflow — wingfoil workflow
start bug-ingest records the run and wingfoil workflow next names its next step — but it does not
carry out the steps, so the ingest workflows are run by a maintainer or an agent. The current path is:
.github/ISSUE_TEMPLATE/):
bug element’s: the issue title is the bug’s
title, then severity, the WingFoil version (release-origin), Summary, Steps to Reproduce,
Expected Behavior, Actual Behavior and Notes. bug-ingest’s capture copies every answer
except two, which it maps: the title loses its bug: prefix, and the installed version you
give (wingfoil --version, e.g. 0.3.0 (<commit>); the commit part is dropped) becomes the
release-origin id of the release that published it (v0.3 for a minor’s build such as 0.3.0,
v0.2.2 for a patch release).decision-log-ingest’s capture records as the decision-log’s Context, Decision
and Rationale (the title loses its proposal: prefix).
A feature request uses this form too: it changes the vision, so the maintainer captures it as a
change-proposal through vision-change instead (dl-132, dl-163).Blank issues are off. Questions go to
Discussions, and a vulnerability
goes through SECURITY.md, never into a public issue.
contributor and the issue’s URL beside it (Credit, below).A pull request is welcome too: its template (.github/PULL_REQUEST_TEMPLATE.md) asks for the Memory
element the change implements, as the traceability directive requires. Everyone follows the
Code of Conduct. CONTRIBUTING.md is the short pointer to
this document that GitHub shows contributors (dl-127).
You (or an agent on your behalf) can start an ingest workflow yourself with
wingfoil workflow start <name> and follow it with wingfoil workflow next; its steps are still
carried out by hand.
WingFoil’s own Memory, DNA and workflows are read through a published, pinned WingFoil build
(dl-095); the Memory
operations that write a commit run on the code build compiled from your checkout (npm run build, then
node dist/cli.js …), as the wingfoil-cli directive
(.wingfoil/directives/custom/wingfoil-cli.md) states. It is
declared in package.json as the devDependency "wingfoil-released": "npm:wingfoil@<version>", so a
clone needs one command and no build step:
git clone <this repository> && cd <it>
npm ci # installs the pinned build with everything else
npm run -s wingfoil -- --version # prints the pinned version
npm run -s wingfoil -- memory search --type bug
Run it as npm run -s wingfoil -- …, not npx wingfoil: this package is itself named wingfoil, and
once npm run build has produced dist/, npx wingfoil runs that build instead. -s keeps npm’s
own banner off standard output, so --format json stays parseable.
The MCP server. The repository’s .mcp.json registers the pinned build’s server
(dl-026), so an agent
session opened at the repository root reads DNA, Memory and workflows through it with no setup:
{ "mcpServers": { "wingfoil": { "command": "node", "args": ["node_modules/wingfoil-released/dist/cli.js", "mcp"] } } }
.mcp.json is the Claude Code format. The server itself is plain MCP over stdio, so any other MCP
client registers the same thing: command node, arguments
node_modules/wingfoil-released/dist/cli.js mcp, working directory the repository root (the server
resolves the configuration from the git root). Use an absolute path to cli.js if your client starts
servers from another directory. npm run check:mcp starts the registered server and checks that it is
the pinned version and advertises the expected channels.
The pin moves forward only, to published builds, one commit per switch (dl-095 Q3): at the start of
each release’s planning (release-planning’s advance-pinned-build step) and after every published
patch.
Attribution in WingFoil rides on git identity: every state-change commit records its author and
timestamp as the audit trail
(adr-006-git-identity-role-based-authz).
That records who made the change. It does not, by itself, capture whose idea it was when an AI
agent — not the contributor — authors the commits.
So the contribution model layers a credit convention on top of git identity (it does not replace it, and it never rewrites git history):
bug, decision-log, adr, tech-spec, change-proposal) carries an optional
contributor: frontmatter field — your name/handle, set when the artifact originates from
someone other than the committing git identity — plus an optional credit: note.contributor: (your GitHub handle) and
the issue URL in credit: (e.g. reported in https://github.com/wingfoil/wingfoil/issues/<n>). A
GitHub issue is not a registered feedback inbox, so it never gets a reported_by: field: that field
is only for notes filed in a registered consumer repository’s inbox
(dl-163).feedback_inbox of a consumer repository
registered here as an active service of kind repository — is cited in the artifact’s optional
reported_by: list, one entry per note, as <service id>/F-<nnn>@<sha>: the service’s full id,
the note’s id in that inbox, and the full sha of the consumer commit read. contributor: says who
originated the contribution; reported_by: says where it was reported, in a form
test/docs/reported-by.test.ts checks against the registered services. It is provenance only: the
artifact restates the defect or request in its own words and reads on its own, a defect is reproduced
in this repository before it is filed, and the note’s text is never copied. The bug,
decision-log, adr, tech-spec and change-proposal templates carry the field.change-proposal through vision-change
(dl-132); a decision-log
is for input about the process or a decision.reported_by: survives an amendment. memory amend may rewrite the field like any
other content field, so a reviewer refuses an amendment that drops or changes a reported_by: entry
unless its Reason: says why (for example, the entry cited the wrong note or commit).done), you are
credited as the source of that AI-generated output. Because a task traces back to the artifact it
implements, the credit stays attached to the specific bug/DL/ADR/tech-spec/change-proposal id.This keeps credit machine-visible and git-versioned, consistent with WingFoil’s single-source-of- truth model — no external contributor database, no commit rewriting.
adr for architectural, decision-log for product/process — not
scattered in prose (the documentation directive).traceability
directive).AGENTS.md and
.wingfoil/README.md.dl-020-contribution-model.adr-006-git-identity-role-based-authz.