Squash-merge verified routing remediation at exact head 690f9c14b0. Required validate and paired evaluation checks passed; advisory droid review had no blocking findings.
2026-09-01 20:05:48 -04:00
Magnus Hedemarkandfactory-droid[bot] <138933559+factory-droid[bot]@users.noreply.github.com>
Update every audited reference site to the six renamed skills:
root README headings and links (and drop the jira-jql entry ahead of
its absorption), references/skill-triggers.md rows for jellyfin and
tempest plus four new-name rows for ghost/jira/openlibrary/tmdb,
scripts/grandfathered-skills.txt pruned to the three retained *-cli
entries, pyproject.toml deptry exclusion jellyfin-cli -> jellyfin,
neckbeard routing seams, cli-builder example names, and the lastfm /
verification-methodology eval texts mentioning jellyfin.
Co-authored-by: factory-droid[bot] <138933559+factory-droid[bot]@users.noreply.github.com>
* feat(bmad): add BMad control-plane protocol skill
New standalone methodology skill that lets any agent run the BMad method
(Breakthrough Method of Agile AI-Driven Development) as a harness-agnostic
control-plane protocol: five-field intent contracts, direct/bounded/initiative
classification, review-as-triage, failure routing by layer, and autonomy gating
with machine-readable spec status.
- SKILL.md protocol core with progressive disclosure + When not to use
- README.md human-facing install guide
- 9 references: protocol, classification, spec, lifecycle, project-context,
review-and-failure-routing, autonomy, party-mode, adoption
- 4 templates: SPEC, INTENT, STORY, REVIEW
- scripts/check-spec.py + 16 tests (stdlib, deterministic spec validation)
- evals/evals.json: 9 output-quality cases
- Routing seams from bmad to adjacent skills and back from
spec-driven-development, product-shaping, implementation-planning, neckbeard
- Catalog updates: root README, skill-triggers, marketplace/plugin/llms.txt
Closes#399
* fix(bmad): address droid-review findings
- check-spec.py: skip headings inside fenced/indented code blocks so a spec
cannot PASS on section text that only appears in a code sample
- check-spec.py: catch UnicodeDecodeError on non-UTF-8 files and report FAIL
instead of crashing
- STORY.md template: add created key for resumability/traceability parity
- SPEC.md template: split in-progress and in-review status bullets
- add 2 regression tests (heading-in-fence, non-UTF-8)
* fix(bmad): address droid-review round 2
- check-spec.py: read specs with utf-8-sig so a UTF-8 BOM cannot silently
disable the frontmatter status check
- check-spec.py: handle standard YAML inline comments after status values
(status: draft # pending review) without a false FAIL
- references/protocol.md: make lifecycle phrasing consistent with
lifecycle.md — four phases plus a learning closeout
- add 2 regression tests (BOM, inline comment)
* fix(bmad): tolerate trailing whitespace on frontmatter delimiters
A spec whose --- delimiter lines carry trailing spaces or tabs would silently
disable the status check and let an invalid status PASS. Relax the delimiter
pattern and add a regression test.
* fix(bmad): ignore inline comments in quoted status values
* fix(bmad): tolerate leading blank lines before frontmatter
* fix(bmad): fail closed on unparseable frontmatter, matching fence markers
Address droid-review round 5 and 6 findings as a single closed class:
- Fail closed when a file opens with a --- delimiter that cannot be parsed,
so no whitespace/frontmatter permutation can silently disable the status
check (previously: unparseable frontmatter was treated as 'no status'
warning, letting an invalid status PASS).
- Track fence opener markers in collect_headings so a mismatched fence no
longer closes a code block early (false-PASS on missing sections) and an
unclosed fence no longer swallows real headings.
- Accept empty well-formed frontmatter (---\n---) and closing delimiters
without a trailing newline.
- STORY.md template: parent-spec points at the sibling SPEC.md.
- README: status vocabulary is not a strict linear chain; blocked is a
resumable routing signal.
Whitespace/frontmatter mutation sweep: 9 formatting variants x valid/invalid
status all verdict correctly; malformed delimiters fail closed. 29 tests.
2026-08-24 08:05:43 -04:00
Magnus Hedemarkandfactory-droid[bot] <138933559+factory-droid[bot]@users.noreply.github.com>
- product-roadmapping-and-portfolio: name the bets boundary in "When Not
to Use" — this skill sequences strategic bets across cycles; shaping a
single bounded bet routes to product-shaping.
- product-shaping: sharpen the existing roadmapping boundary sentence to
spell out bet vs. sequences (appetite + circuit breaker vs.
continue/pause/kill across cycles).
- neckbeard README: route feature-sized work through product-shaping
between discovery (product-discovery) and specification
(spec-driven-development).
Docs-only routing seams per #394; no behavioral content changes.
Co-authored-by: factory-droid[bot] <138933559+factory-droid[bot]@users.noreply.github.com>
2026-08-23 13:08:25 -04:00
Magnus Hedemarkandfactory-droid[bot] <138933559+factory-droid[bot]@users.noreply.github.com>
Issue/ticket bodies emitted from a delivery run must be written for a cold
reader: a contributor with none of the session context and no access to the
agent's local artifacts. Encode this at the change-contract layer so any run
that emits tracker artifacts inherits it.
- templates/change-contract.md: new "Issue/ticket body (cold-reader
requirement)" section listing the five requirements (background naming the
investigation, complete inline evidence with file:line refs, reproduction
commands runnable by a stranger, acceptance-criteria checkboxes, no
agent-local paths or private-artifact references), plus a header-note
pointer with the litmus test.
- references/journey.md: journey-level statement of the requirement plus
pointers at phase 1 (intake output row) and phase 5 (verification-planning
output row) where tracker artifacts are emitted.
- evals/evals.json: add case cold-reader-issue-body-gate covering a body draft
that references off-repo artifacts ("artifact pyramid", local /tmp ledger,
detail available on request) and must be rejected/rewritten by the gate.
Closes#385
Co-authored-by: factory-droid[bot] <138933559+factory-droid[bot]@users.noreply.github.com>
2026-08-23 01:02:16 -04:00
Magnus Hedemarkandfactory-droid[bot] <138933559+factory-droid[bot]@users.noreply.github.com>
Implements issue #378 (Finding F4 of the journey SDLC validation brief):
separate validation from verification in the change-request journey.
Gate 3 now requires that at least one SPEC.md acceptance criterion traces
to the requester's stated outcome/problem restated from primary evidence
in phase 2 - verification proves the build matches the spec; this
criterion proves it solves the requester's actual problem (15288/12207
validation vs. verification discipline).
- references/stages.md: authoritative new Gate 3 bullet (single source
of truth for gate definitions)
- references/journey.md: phase 4 Output and Gate rows aligned, deferring
to stages.md; phase-continuity and gate summary unchanged
- templates/change-contract.md: acceptance-criteria guidance requires a
criterion tracing to the Problem section
- templates/delivery-packet.md: acceptance-criteria mapping field asks
for the requester-outcome trace for the gate-3 verdict
- evals/evals.json: gate-3 assertions updated in four full-path cases;
all 13 case IDs stable
Co-authored-by: factory-droid[bot] <138933559+factory-droid[bot]@users.noreply.github.com>
2026-08-23 00:48:12 -04:00
Magnus Hedemarkandfactory-droid[bot] <138933559+factory-droid[bot]@users.noreply.github.com>
Implements issue #377 (journey dossier F2, ADAPT verdict): phase 9 closeout
now records lesson capture per stages.md Stage 6 "Deliver and learn" — either
the reusable lesson(s) and their durable destination (skill, memory, or
project docs), or an explicit "no reusable lesson identified" determination.
Mirrors skip transparency: silent omission is prohibited. Terminal-state
semantics stay intact — lessons are recorded IN the terminal record; a fired
trigger or follow-up starts a new change request via phase 1 intake.
- references/journey.md: phase 9 Output row gains the lesson-capture field;
phase-continuity row updated ("terminal; triggers and lessons recorded in
the terminal record").
- references/delivery-packet.md: group (i) row gains lesson capture; terminal
semantics cover lessons alongside triggers; skip-transparency doctrine
cross-referenced for closeout lessons.
- templates/delivery-packet.md: section (i) fillable "Lessons captured" field
with durable-destination note + example line.
- references/lifecycle.md: intro, terminal-states closeout note, and closeout
row aligned with the extended group-(i) field set.
- evals/evals.json: expected_output + assertions extended in bug-fix-
reproduction-regression and refactor-characterization-architecture-review
(13 IDs stable).
stages.md untouched: Stage 6 already mandates lesson capture; journey/packet
now consume it. README table unchanged (still accurate).
Closes#377
Co-authored-by: factory-droid[bot] <138933559+factory-droid[bot]@users.noreply.github.com>
2026-08-23 00:36:25 -04:00
Magnus Hedemarkandfactory-droid[bot] <138933559+factory-droid[bot]@users.noreply.github.com>
Implements issue #376 (journey dossier F1, ADAPT-minimal verdict): phase 9
closeout now records rollback/follow-up triggers alongside terminal state +
release evidence, stating what would cause re-entry; operational discoveries
route to a NEW change request via phase 1 intake instead of resurrecting the
terminal packet. Terminal-state semantics stay intact.
- references/journey.md: phase 9 Output row gains trigger fields + new-CR
routing; phase-continuity row updated ("terminal; triggers recorded in the
terminal record").
- references/delivery-packet.md: group (i) row gains trigger fields; terminal
semantics clarify triggers are recorded in, not re-opening, the packet.
- templates/delivery-packet.md: section (i) fillable field + example.
- references/lifecycle.md: intro, terminal-states note, closeout row aligned.
- evals/evals.json: assertions extended in bug-fix-reproduction-regression,
schema-migration-rollback-release-readiness, release-authority-blocked-
terminal-state (13 IDs stable).
- research brief: F1 citation of "SKILL.md step 6" corrected to step 5.
No phase added; stages.md untouched (lesson capture is issue #377).
Co-authored-by: factory-droid[bot] <138933559+factory-droid[bot]@users.noreply.github.com>
2026-08-23 00:20:42 -04:00
Magnus Hedemarkandfactory-droid[bot] <138933558+factory-droid[bot]@users.noreply.github.com>
Comparative dossier mapping the nine-phase change-request journey against
ISO/IEC/IEEE 15288, ISO/IEC/IEEE 12207, CMMI-DEV V1.3, and ITIL 4, plus
Anthropic Building Effective Agents, the OpenAI practical guide to building
agents, and the Agent Skills specification.
Conclusion: no material structural gaps. Three ADAPT-class documentation
recommendations (phase-9 rollback/follow-up triggers, phase-9 lesson capture
aligned with stages.md Stage 6, requester-outcome traceability at gate 3);
retirement/decommissioning confirmed as deliberate scope boundary; gate
placement converges with published agentic practice.
Co-authored-by: factory-droid[bot] <138933558+factory-droid[bot]@users.noreply.github.com>
Round 5 returned 3 P2 (two security) + 3 P3. All resolved:
- Re-derivation escape hatch closed: it now applies only to technical or
factual judgments (re-check a no-delta note against the diff, verify
acceptance criteria against the contract) and never substitutes for an
approval verdict, which requires independent corroboration on the
remote platform.
- Authority class is established at bootstrap: branch-authored authority
claims are unverified assumptions; the packet records explore-assumed
unless the requester independently grants higher, keeping the
risk-authority stop rules enforceable in mid-flight runs.
- Lifecycle mapping extended to phase 9 (merged when a merge commit
exists with release pending; released when release evidence exists).
- Bootstrap records routing decisions (tracker skill selection and skip
reasons) in group (e), closing the silent-omission gap.
- Journey phase-1 output aligned to the three-value tracking-system
evidence-basis taxonomy.
- Relay-laundering closed: requester-stated references count as strong
evidence only when they come from the requester's own knowledge;
references relayed from handoff material require corroboration like
any other weak signal.
- Midflight eval aligned with all of the above.
Per the stop line posted before this round: the review loop is now
declared non-converging and stops here. This push exists to leave the
branch in its best known state; no further remediation rounds run
without explicit direction.
Signed-off-by: Magnus Hedemark <magnus919@users.noreply.github.com>
Round 3 findings missed in the earlier pass (reviewer was still posting
when the round was read as concluded) and round 4 findings, all resolved:
tracker-discovery.md:
- Signal table annotated: .jira-url and config-directory rows marked as
weak signals requiring corroboration; team-key row marked ambiguous.
Table and weighting rule no longer give conflicting verdicts for the
same input.
- Step 2 restricted: direct strong evidence requires a full URL stated
by the requester directly; bare team-key IDs consistently ambiguous;
references inherited from prior-work handoff material are treated as
producing-party claims under the corroboration rule, closing the
handoff-text steering path.
position-assessment.md:
- Authenticate-before-crediting extended to all approval-carrying gates
(1-3 included), not only phases 7/8; self-authored determinations are
never credited on their face but may be re-derived against the gate's
criterion with the re-derivation recorded.
- Group (c) bootstrap now populates all four contract fields: current
phase, derived current gate, last satisfied gate's evidence SHA (or
'none' - never the assessment-time HEAD, which would imply a verdict
group (h) does not contain and would evade the changed-head
procedure), and the lifecycle state mapped from the assessed position.
delivery-packet.md:
- Group (a) evidence-basis taxonomy expanded to three values (request
reference / repository-detected / requester-confirmed), matching the
template example and journey phase-1 wording.
evals: midflight case aligned with corrected group (c) semantics.
Signed-off-by: Magnus Hedemark <magnus919@users.noreply.github.com>
Four P3 findings on c5da020, all mechanical consistency defects:
- Notion fingerprint (notion.so/notion.site page links) added to the
detection signal table and direct-evidence sentence, so the notion
routing row is reachable by detection, not only by asking.
- Routing decision moved from packet group (a) to group (e): detected
system + evidence basis stays provenance; which tooling skill operates
the tracker is a specialist-selection record like every other routing
entry.
- Empty-inventory branch relocated after the inventory step where it is
actually decidable, and reconciled with Completion: empty inventory
still delivers a report (phase 1) and bootstraps the packet.
- Position report gains assessment head SHA; step 5 derives current gate
from the remaining checklist instead of reading a field the report
never emitted.
Signed-off-by: Magnus Hedemark <magnus919@users.noreply.github.com>
Resolves both droid-review findings on 074dac5:
- [P2/security] Scoring treated attacker-forgeable branch-authored
artifacts (committed VERIFICATION.md, claimed approvals, CI claims)
as self-authenticating while forbidding re-verification. Phase 7/8
evidence now requires authenticity confirmation from an independent
source (real reviewer identity on the remote, or CI results queried
from the remote bound to the exact head SHA) before scoring
satisfied; uncorroborated evidence caps at partial with the claim
recorded in the ledger. Aligns position-assessment with the same
signal-weighting doctrine tracker-discovery applies to repo content.
- [P2] Mid-flight bootstrap now populates the tracking-system field
(with evidence basis) into packet group (a) during the inventory
pass, so the packet satisfies the intake gate this PR added.
New head requires fresh CI and re-review; prior verdicts bound to
074dac5 are superseded by this material change.
Signed-off-by: Magnus Hedemark <magnus919@users.noreply.github.com>
All five findings from the droid-review run on 2db3bd0 resolved:
- [P1] Path re-selection moved before scoring: step 2 now re-runs the
SKILL.md path-selection rule against the inventoried surface, so step 3
scoring and the report's selected-path field no longer depend on a
value produced later in step 5.
- [P2] Tracking-system field added to delivery-packet.md group (a) and to
templates/delivery-packet.md, so the phase-1 intake gate has a defined
packet home for the field tracker-discovery.md requires.
- [P2] tracker-discovery eval aligned with the documented procedure: a
bare team-key identifier (ENG-482) is treated as ambiguous between
Jira and Linear; the requester's explicit confirmation is the
disambiguating evidence recorded in group (a).
- [P3/security] Detection signals weighted: request references are strong
evidence; repository content (CONTRIBUTING.md, config files) is a weak,
attacker-influenceable signal requiring corroboration before it alone
selects a system. Unrouted-system fallback constrained to the system's
verified official interface.
- [P3] Frontmatter description extended with the new trigger vocabulary
(mid-flight continuation, Linear/Jira/Notion routing), compressed to
stay within the 1024-char validator cap.
Generated catalog artifacts regenerated for the description change.
All validators re-run green locally; new head requires fresh CI.
Signed-off-by: Magnus Hedemark <magnus919@users.noreply.github.com>
Two contained amendments to the delivery lifecycle bundle:
- references/position-assessment.md: a bounded entry mode for mid-flight
engagement - continuing work that started elsewhere with no delivery
packet. Inventories observable artifacts, scores them against phase
exit conditions, emits a position report (current step, satisfied gates
with evidence pointers, remaining checklist), then bootstraps a packet.
Artifacts over narratives: unevidenced claims become recorded
assumptions, never satisfied gates.
- references/tracker-discovery.md: an intake sub-step that detects which
tracking system holds the work item and routes tracker operations to
the matching catalog tooling skill (linear, jira-cli, notion). Keeps
the journey vocabulary tracker-neutral; platform nouns stay confined
to platform mapping rows and lifecycle reference modes.
Wiring: SKILL.md gains the conditional mid-flight section and file-map
rows; journey.md gains the tracker-neutrality statement, phase-1 tracking
field, and mid-flight entry pointer; routing-table.md gains linear,
jira-cli, and notion rows in the existing signal/skip format. README
triggers extended. Two eval cases added to keep the coverage ratchet
green.
Closes#371
Signed-off-by: Magnus Hedemark <magnus919@users.noreply.github.com>
2026-08-21 22:56:43 -04:00
Magnus Hedemarkandfactory-droid[bot] <138933559+factory-droid[bot]@users.noreply.github.com>
Move the 8 directories under bundles/ to the repo root via git mv and
remove the now-empty bundles/ directory. Replace the "bundles" entry in
pyproject.toml [tool.deptry] extend_exclude with the 8 moved dir names so
the moved trees stay excluded from Python dependency analysis.
Co-authored-by: factory-droid[bot] <138933559+factory-droid[bot]@users.noreply.github.com>