Skip to content

docs(adr): add ADR 0092 always-on harness skills - #6378

Closed
ascerra wants to merge 3 commits into
mainfrom
docs/adr-0091-always-on-skills
Closed

docs(adr): add ADR 0092 always-on harness skills#6378
ascerra wants to merge 3 commits into
mainfrom
docs/adr-0091-always-on-skills

Conversation

@ascerra

@ascerra ascerra commented Aug 19, 2026

Copy link
Copy Markdown
Contributor

Fixes #6380

Summary

Related: #6352 (symptom), #237 (orthogonal inclusion policy).

Test plan

  • Rebased onto main; merge conflicts resolved
  • Renumbered to ADR 0092; cross-refs updated
  • Decision is Option B; evidence linked from playground docs
  • Matrix HTML/JSON not committed to fullsend
  • Human skim: Ralph / Hector feedback addressed

@ascerra
ascerra requested a review from a team as a code owner August 19, 2026 12:03
@qodo-code-review

Copy link
Copy Markdown

PR Summary by Qodo

Document always-on harness skills via bootstrap context

📝 Documentation 🕐 20-40 Minutes

Grey Divider

AI Description

• Records apply: always bootstrap behavior for harness skills in ADR 0091.
• Documents on-demand defaults, companion handling, ordering, scanning, and context costs.
• Aligns architecture, user guidance, and open questions with the accepted decision.
Diagram

graph TD
  H["Harness skills"] --> R["Resolved skills"] --> S["Injection scan"] --> U["Sandbox skill dir"] --> L["Skill listing"]
  U --> D{"Apply mode"}
  D -->|always| A["Copied agent"] --> X["Agent run"]
  D -->|on-demand| X
  L --> X
Loading
High-Level Assessment

The following are alternative approaches to this PR:

1. Prompt every listed skill
  • ➕ Requires no bootstrap or metadata changes.
  • ➕ Keeps all skill selection inside the model prompt.
  • ➖ Reliably distinguishing mandatory and optional skills is difficult.
  • ➖ Harness lists may mix core, optional, and built-in skills.
  • ➖ Team-specific behavior remains dependent on model selection.
2. Fork the agent definition
  • ➕ Works with the current runtime behavior.
  • ➕ Makes team-specific instructions explicit in the prompt.
  • ➖ Creates derived agents that can drift from defaults.
  • ➖ Couples shared prompts to team-specific skill names.
  • ➖ Increases maintenance and upgrade overhead.
3. Enforce through schemas or post-scripts
  • ➕ Provides deterministic validation for structured outputs.
  • ➕ Avoids recurring prompt-context costs.
  • ➖ Cannot teach nuanced style, templates, or procedures.
  • ➖ Detects violations after generation rather than guiding behavior.
  • ➖ Does not replace instructional skill content.

Recommendation: The selected apply: always approach is the best fit because it makes mandatory behavior reliable without creating team-specific agent forks. Implementation should preserve the ADR's safeguards: inject only the scanned SKILL.md body, retain companion files on disk, preserve resolved list order, keep Skill-tool access harmlessly idempotent, and encourage short always-on bodies to control token usage.

Files changed (5) +176 / -3

Documentation (5) +176 / -3
0024-harness-definitions.mdClarify the remaining harness skill-loading question +4/-1

Clarify the remaining harness skill-loading question

• Annotates the existing skills-loading open question to separate skill inclusion and discovery from load mode. Links ADR 0091 as the decision for on-demand versus always-on behavior of harness-listed skills.

docs/ADRs/0024-harness-definitions.md

0091-always-on-harness-skills.mdRecord the always-on harness skills decision +139/-0

Record the always-on harness skills decision

• Adds accepted ADR 0091, selecting per-skill 'apply: always' bootstrap injection while retaining on-demand loading as the default. Defines body-only copying, companion-file retention, ordering, security scanning, token-cost guidance, and future implementation requirements.

docs/ADRs/0091-always-on-harness-skills.md

architecture.mdAdd always-on skills to the living architecture +6/-1

Add always-on skills to the living architecture

• Documents always-on harness skills as an accepted architectural behavior and links ADR 0091. Narrows the codebase-context open question by identifying harness skill load mode as resolved.

docs/architecture.md

customizing-with-skills.mdTeach always-on and on-demand skill configuration +26/-0

Teach always-on and on-demand skill configuration

• Adds user guidance and an 'apply: always' frontmatter example. Explains that bootstrap injects the skill body while scripts, references, and other companions remain available on disk.

docs/guides/user/customizing-with-skills.md

codebase-context.mdScope the remaining context-loading questions +1/-1

Scope the remaining context-loading questions

• Annotates the CLAUDE.md versus BOOKMARKS.md question with ADR 0091's resolved harness skill behavior. Keeps the broader balance between repository context mechanisms explicitly open.

docs/problems/codebase-context.md

@github-actions

github-actions Bot commented Aug 19, 2026

Copy link
Copy Markdown

Site preview

Preview: https://4ec51e92-site.fullsend-ai.workers.dev

Commit: 94bd8d8ef8dba1112f7dd9b354e8d8d6e86487c2

@fullsend-ai-review

fullsend-ai-review Bot commented Aug 19, 2026

Copy link
Copy Markdown

🤖 Finished Review · ✅ Success · Started 12:05 PM UTC · Completed 12:20 PM UTC

Commit: 029de12 · View workflow run →

@codecov

codecov Bot commented Aug 19, 2026

Copy link
Copy Markdown

Codecov Report

✅ All modified and coverable lines are covered by tests.

📢 Thoughts on this report? Let us know!

@qodo-code-review

qodo-code-review Bot commented Aug 19, 2026

Copy link
Copy Markdown

Code Review by Qodo

🐞 Bugs (0) 📘 Rule violations (0) 📜 Skill insights (4)

Grey Divider


Action required

1. Unimplemented skill behavior presented as current 📜 Skill insight ≡ Correctness
Description
The guide and architecture documentation present apply: always as operational, claiming Bootstrap
pastes always-on skill bodies into the agent definition, even though ADR 0091 says the
implementation does not yet exist and the current parser/runtime silently treats these skills as
on-demand. Until SkillMeta parsing and Bootstrap composition are implemented, the behavior must be
documented as future functionality using a > **Planned:** callout with a tracking-issue link.
Code

docs/guides/user/customizing-with-skills.md[R83-87]

+Fullsend bootstrap pastes that `SKILL.md` body onto the copied agent
+definition for the run. The whole skill directory is still uploaded, so
+`scripts/`, `references/`, and other companions stay on disk for the agent to
+use by path. Keep always-on bodies short; put heavy procedure in companions.
+See [ADR 0091](../../ADRs/0091-always-on-harness-skills.md).
Relevance

●●● Strong

Team accepts qualifying documentation that presents target-state behavior as currently operational.

PR-#2743
PR-#5778

ⓘ Recommendations generated based on similar findings in past PRs

Evidence
The guide describes Bootstrap composition in the present tense, while ADR 0091 identifies extending
SkillMeta and Bootstrap as future work. The current metadata type has no apply field, so YAML
parsing discards it, and the runtime uploads the unchanged agent definition before separately
uploading skill directories; together, these citations show that no always-on composition occurs,
while rule 1062082 requires the unavailable functionality to be marked with the prescribed
planned-feature callout and an issue link.

docs/guides/user/customizing-with-skills.md[83-87]
docs/ADRs/0091-always-on-harness-skills.md[134-137]
internal/skill/skill.go[11-17]
internal/skill/skill.go[46-50]
internal/runtime/claude.go[37-71]
Skill: writing-user-docs

Agent prompt
The issue below was found during a code review. Follow the provided context and guidance below and implement a solution

## Issue description
The user-facing guide and architecture documentation describe `apply: always` as operational, but ADR 0091 confirms that the implementation has not landed. The current runtime ignores the metadata and does not append the skill body to the agent definition, causing users to receive an on-demand skill rather than rules applied on every run.

## Issue Context
Current `SkillMeta` has no `apply` field, so YAML parsing discards it, and Claude Bootstrap uploads the original agent definition and skill directories without composing them. Rewrite the affected documentation as future behavior—or defer it until the parser and Bootstrap implementation lands—and use the required `> **Planned:**` blockquote with a link to the tracking issue.

## Fix Focus Areas
- docs/guides/user/customizing-with-skills.md[63-87]
- docs/architecture.md[166-170]
- docs/ADRs/0091-always-on-harness-skills.md[134-137]

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools



Remediation recommended

2. harness jargon lacks definition 📜 Skill insight ✧ Quality
Description
The guide introduces the domain-specific term harness without defining it or linking to its
glossary entry. Readers unfamiliar with Fullsend's harness model lack the context needed to apply
the instructions.
Code

docs/guides/user/customizing-with-skills.md[R65-67]

+By default, a skill listed in the harness is **uploaded** and shown in the
+runtime skill list. The model opens the full `SKILL.md` with the Skill tool
+when it chooses to (`apply: on-demand`, or omit `apply`).
Relevance

●●● Strong

Team recently accepted defining an unfamiliar domain term on first use in a user guide.

PR-#5778

ⓘ Recommendations generated based on similar findings in past PRs

Evidence
The first occurrence of harness in this guide appears in the added section and is neither linked
nor defined, contrary to rule 1062083.

docs/guides/user/customizing-with-skills.md[63-67]
Skill: writing-user-docs

Agent prompt
The issue below was found during a code review. Follow the provided context and guidance below and implement a solution

## Issue description
The modified guide uses `harness` for the first time without a definition or glossary link.

## Issue Context
Link the first occurrence to the harness entry in `docs/glossary.md`, or define the term inline.

## Fix Focus Areas
- docs/guides/user/customizing-with-skills.md[63-67]

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools


3. Consequences contain multiple sentences ✓ Resolved 📜 Skill insight ⚙ Maintainability
Description
Several Consequences bullets contain two or more sentences rather than one sentence each. This
violates the required concise one-sentence bullet format.
Code

docs/ADRs/0091-always-on-harness-skills.md[R128-131]

+- Teams can change agent behavior without naming their add-on skills in default
+  prompts. Harness-driven paste keeps a **configured default** agent; only
+  replacing `agent:` in the harness makes a derived agent
+  ([default-vs-custom](../agents/topics/default-vs-custom.md)).
Relevance

●●● Strong

Concise ADR Consequences edits are straightforward convention fixes; recent ADR reviews actively
refine these bullets.

PR-#5328

ⓘ Recommendations generated based on similar findings in past PRs

Evidence
The first consequence contains separate sentences about changing behavior and preserving
configured-default status; subsequent bullets similarly combine multiple sentences. Rule 1062091
requires every consequence bullet to be a single sentence.

docs/ADRs/0091-always-on-harness-skills.md[128-135]
Skill: writing-adrs

Agent prompt
The issue below was found during a code review. Follow the provided context and guidance below and implement a solution

## Issue description
The Consequences section contains multi-sentence bullets.

## Issue Context
Keep three to five bullets and rewrite each bullet as exactly one sentence without changing the decision's meaning.

## Fix Focus Areas
- docs/ADRs/0091-always-on-harness-skills.md[126-139]

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools


4. Runtime contract inlined in ADR 📜 Skill insight ⚙ Maintainability
Description
The ADR inlines a field-level runtime contract for apply, including defaults, copy targets,
ordering, companion handling, and scanning semantics. This detailed contract should live under a
versioned docs/normative/ path and be linked from the ADR.
Code

docs/ADRs/0091-always-on-harness-skills.md[R77-80]

+1. **Default (no `apply`, or `apply: on-demand`)** — upload and list it.
+   The model opens it with the Skill tool when needed. Same as today.
+2. **`apply: always`** — after upload, bootstrap **pastes the `SKILL.md` body**
+   (markdown after the frontmatter) onto the **end of the copied agent
Relevance

●● Moderate

Team accepts ADR precision, but no close precedent requires relocating a decision contract to
normative docs.

PR-#1814
PR-#5798

ⓘ Recommendations generated based on similar findings in past PRs

Evidence
The Decision section specifies field-level behavior and exact runtime mechanics, and the
Consequences section explicitly calls this material a contract. Rule 1525847 requires detailed
contracts to be maintained in a versioned normative specification rather than inline in an ADR.

docs/ADRs/0091-always-on-harness-skills.md[74-97]
docs/ADRs/0091-always-on-harness-skills.md[103-117]
docs/ADRs/0091-always-on-harness-skills.md[136-137]
Skill: writing-adrs

Agent prompt
The issue below was found during a code review. Follow the provided context and guidance below and implement a solution

## Issue description
ADR 0091 embeds the detailed compatibility and runtime contract for the new `apply` field.

## Issue Context
Create a versioned normative specification containing field values, defaults, copy behavior, ordering, and security-processing requirements; leave the ADR with the architectural decision and a link to that specification.

## Fix Focus Areas
- docs/ADRs/0091-always-on-harness-skills.md[74-117]
- docs/ADRs/0091-always-on-harness-skills.md[136-137]

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools



Informational

5. relates_to lists four problems 📜 Skill insight ⚙ Maintainability
Description
ADR 0091 references four problem documents in relates_to, exceeding the recommended maximum of
three. Narrow the ADR's scope or split the decision if all four areas are essential.
Code

docs/ADRs/0091-always-on-harness-skills.md[R5-8]

+  - agent-architecture
+  - codebase-context
+  - agent-infrastructure
+  - security-threat-model
Relevance

●● Moderate

No close precedent establishes enforcing the three-reference cap when all topics appear relevant.

PR-#5016

ⓘ Recommendations generated based on similar findings in past PRs

Evidence
The frontmatter lists agent-architecture, codebase-context, agent-infrastructure, and
security-threat-model; rule 1525848 limits non-wildcard entries to three.

docs/ADRs/0091-always-on-harness-skills.md[4-8]
Skill: writing-adrs

Agent prompt
The issue below was found during a code review. Follow the provided context and guidance below and implement a solution

## Issue description
The ADR's `relates_to` frontmatter contains four problem areas, exceeding the recommended maximum of three.

## Issue Context
Retain only directly governed problem areas, or split the decision if its scope genuinely spans all four.

## Fix Focus Areas
- docs/ADRs/0091-always-on-harness-skills.md[4-8]

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools


6. ADR exceeds 100 lines ✓ Resolved 📜 Skill insight ⚙ Maintainability
Description
ADR 0091 contains 124 lines after its 15-line frontmatter, exceeding the 100-line maximum. The
excess detail makes the decision harder to review and suggests implementation-contract material
should be moved elsewhere.
Code

docs/ADRs/0091-always-on-harness-skills.md[R136-139]

+- Implementation must extend `SkillMeta` and Bootstrap; this ADR records the
+  contract, not the code yet.
+- Living docs (`docs/architecture.md`, related problem-doc open questions) must
+  be updated in the same PR that lands this Accepted ADR.
Relevance

● Weak

A closely matching recent request to cut an ADR below 100 content lines was rejected.

PR-#2582

ⓘ Recommendations generated based on similar findings in past PRs

Evidence
The new file ends at line 139 and its YAML frontmatter ends at line 15, leaving 124 lines of ADR
content against rule 1062092's 100-line maximum.

docs/ADRs/0091-always-on-harness-skills.md[136-139]
Skill: writing-adrs

Agent prompt
The issue below was found during a code review. Follow the provided context and guidance below and implement a solution

## Issue description
ADR 0091 exceeds the 100-line content limit after excluding frontmatter.

## Issue Context
Condense repeated explanation and move detailed implementation contracts into an appropriate normative document.

## Fix Focus Areas
- docs/ADRs/0091-always-on-harness-skills.md[17-139]

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools


Grey Divider

Context sources
✅ Compliance rules (platform): 56 rules

Grey Divider

Tip of the day
💡 Did you know, you can hide the parts of a finding you never read, like the evidence or the agent prompt

More tips ↗ | Customize Qodo ↗ | Qodo docs ↗

Grey Divider

Qodo Logo

Comment on lines +83 to +87
Fullsend bootstrap pastes that `SKILL.md` body onto the copied agent
definition for the run. The whole skill directory is still uploaded, so
`scripts/`, `references/`, and other companions stay on disk for the agent to
use by path. Keep always-on bodies short; put heavy procedure in companions.
See [ADR 0091](../../ADRs/0091-always-on-harness-skills.md).

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Action required

1. Unimplemented skill behavior presented as current 📜 Skill insight ≡ Correctness

The guide and architecture documentation present apply: always as operational, claiming Bootstrap
pastes always-on skill bodies into the agent definition, even though ADR 0091 says the
implementation does not yet exist and the current parser/runtime silently treats these skills as
on-demand. Until SkillMeta parsing and Bootstrap composition are implemented, the behavior must be
documented as future functionality using a > **Planned:** callout with a tracking-issue link.
Agent Prompt
## Issue description
The user-facing guide and architecture documentation describe `apply: always` as operational, but ADR 0091 confirms that the implementation has not landed. The current runtime ignores the metadata and does not append the skill body to the agent definition, causing users to receive an on-demand skill rather than rules applied on every run.

## Issue Context
Current `SkillMeta` has no `apply` field, so YAML parsing discards it, and Claude Bootstrap uploads the original agent definition and skill directories without composing them. Rewrite the affected documentation as future behavior—or defer it until the parser and Bootstrap implementation lands—and use the required `> **Planned:**` blockquote with a link to the tracking issue.

## Fix Focus Areas
- docs/guides/user/customizing-with-skills.md[63-87]
- docs/architecture.md[166-170]
- docs/ADRs/0091-always-on-harness-skills.md[134-137]

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools

Comment on lines +5 to +8
- agent-architecture
- codebase-context
- agent-infrastructure
- security-threat-model

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Informational

2. relates_to lists four problems 📜 Skill insight ⚙ Maintainability

ADR 0091 references four problem documents in relates_to, exceeding the recommended maximum of
three. Narrow the ADR's scope or split the decision if all four areas are essential.
Agent Prompt
## Issue description
The ADR's `relates_to` frontmatter contains four problem areas, exceeding the recommended maximum of three.

## Issue Context
Retain only directly governed problem areas, or split the decision if its scope genuinely spans all four.

## Fix Focus Areas
- docs/ADRs/0091-always-on-harness-skills.md[4-8]

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools

Comment thread docs/ADRs/0091-always-on-harness-skills.md Outdated
Comment on lines +65 to +67
By default, a skill listed in the harness is **uploaded** and shown in the
runtime skill list. The model opens the full `SKILL.md` with the Skill tool
when it chooses to (`apply: on-demand`, or omit `apply`).

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Remediation recommended

5. harness jargon lacks definition 📜 Skill insight ✧ Quality

The guide introduces the domain-specific term harness without defining it or linking to its
glossary entry. Readers unfamiliar with Fullsend's harness model lack the context needed to apply
the instructions.
Agent Prompt
## Issue description
The modified guide uses `harness` for the first time without a definition or glossary link.

## Issue Context
Link the first occurrence to the harness entry in `docs/glossary.md`, or define the term inline.

## Fix Focus Areas
- docs/guides/user/customizing-with-skills.md[63-67]

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools

Comment on lines +77 to +80
1. **Default (no `apply`, or `apply: on-demand`)** — upload and list it.
The model opens it with the Skill tool when needed. Same as today.
2. **`apply: always`** — after upload, bootstrap **pastes the `SKILL.md` body**
(markdown after the frontmatter) onto the **end of the copied agent

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Remediation recommended

6. Runtime contract inlined in adr 📜 Skill insight ⚙ Maintainability

The ADR inlines a field-level runtime contract for apply, including defaults, copy targets,
ordering, companion handling, and scanning semantics. This detailed contract should live under a
versioned docs/normative/ path and be linked from the ADR.
Agent Prompt
## Issue description
ADR 0091 embeds the detailed compatibility and runtime contract for the new `apply` field.

## Issue Context
Create a versioned normative specification containing field values, defaults, copy behavior, ordering, and security-processing requirements; leave the ADR with the architectural decision and a link to that specification.

## Fix Focus Areas
- docs/ADRs/0091-always-on-harness-skills.md[74-117]
- docs/ADRs/0091-always-on-harness-skills.md[136-137]

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools

@fullsend-ai-review

fullsend-ai-review Bot commented Aug 19, 2026

Copy link
Copy Markdown

Looks good to me

Previous run

Looks good to me

Previous run (2)

Review

Findings

Low

  • [stale-reference] docs/problems/testing-agents.md:339 — The token budget distribution paragraph treats skills as categorically on-demand ("skills triggered by specific situations"), but ADR 0091 introduces apply: always skills whose bodies are pasted into the agent definition at bootstrap. The parenthetical framing is now incomplete. The ADR's own consequences section states that living docs must be updated in the same PR, and testing-agents.md is a problem doc whose token-budget discussion directly concerns the always-loaded vs on-demand distinction this ADR changes.
    Remediation: Add "always-on skills (apply: always)" to the parenthetical list of always-loaded content, e.g.: "some instructions are always loaded (system prompts, CLAUDE.md, always-on skills), while others load on demand (skills triggered by specific situations)."

fullsend-ai-review[bot]

This comment was marked as outdated.


1. **Default (no `apply`, or `apply: on-demand`)** — upload and list it.
The model opens it with the Skill tool when needed. Same as today.
2. **`apply: always`** — after upload, bootstrap **pastes the `SKILL.md` body**

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pasting the SKILL.md body feels weird. There are other things in the skill. Sometimes references/. Sometimes scripts/. By pasting the content, the agent is exposed to the SKILL.md content without ever recording that it "used" the skill in claude codes own logs and traces.

What about adding a shorter line to the default prompt that just says:

ALWAYS use the following skills: `<user-provided-skill-a>`, `<user-provided-skill-b>`.

The user wants you to use those without fail.

@ascerra ascerra Aug 23, 2026

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Agreed — we dropped body paste.

ADR 0091 is now the soft “ALWAYS use these skills …” path: names only in the prompt, open via the Skill tool.

Proof write-up (playground): https://github.com/fullsend-playground/python-app/blob/main/docs/adr-0091-skill-activation-matrix.html


**Trade-offs:** Works today. Couples defaults to one team. Derived agent.

### Option C: `apply: always` + load at bootstrap (chosen)

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

See https://agentskills.io/specification

Perhaps this should be metadata.apply, like this:

name: cool-skill
description: something
metadata:
  apply: always

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Taken — Decision now uses metadata.apply: always (agentskills.io-style), with legacy top-level apply accepted for compatibility. Guide example updated to match.

@rh-hemartin

Copy link
Copy Markdown
Member

I agree with Ralph, but I would go even further by injecting the phrase always and do not introduce a new key in the skill. Just

Your agent definition lists the skills: `A`, `B` and `C`, load them and see and use them if it makes sense.

And that is it. We can test how it goes.

@ascerra

ascerra commented Aug 20, 2026

Copy link
Copy Markdown
Contributor Author

@ralphbean @rh-hemartin tossing this in now so you can react while I’m still testing — not waiting until I have a clean result.

I’m leaning your way: don’t paste SKILL.md into the agent. Keep a placeholder on the default prompt, fill it at bootstrap with skill names (ALWAYS use these skills: …), leave the body on the Skill / slash path so companions and traces still work.

  • Ralph: that’s basically your “ALWAYS use these skills” note, plus metadata.apply: always as the opt-in.
  • Hector: I hear you on maybe not even needing a new key — just tell the agent the listed skills and to load them. That’s still in play; I’m not married to the metadata field.

I’m running this on playground, not changing the ADR Decision yet:

Early read (very not done): upload/list works. Soft “ALWAYS use this skill” was not enough on these triage runs — tools were Bash-only, so the model never actually opened the skill. Same “team add-on skills get skipped” thing we’ve seen with Caveman.

If you hate the placeholder, the metadata key, or want a different experiment, yell now. I’ll keep iterating either way.

@ascerra

ascerra commented Aug 23, 2026

Copy link
Copy Markdown
Contributor Author

@ralphbean @rh-hemartin

What I tested in the playground org

Make triage use a Caveman skill every time: comment must start with CAVEMAN:. This example is testing to proof the chosen ADR proposal which could allow teams to make sure the skill they add via their harness file is always going to be used not just loaded.

Always-on = metadata.apply: always + fill the skill name into the agent prompt before the run; open via Skill tool. No body paste.

Results

Setup CAVEMAN: on triage comment?
Baseline n/a
Listed only No — 0/3
Always-on Yes — 3/3

What “Listed only” vs “Always-on” means

Both put Caveman on the harness so it gets uploaded. The difference is whether we force the model to open it.

Listed only — skill on harness skills: only. Shows up in the list; model can ignore it.

Always-on — same Caveman rules, plus opt-in flag and name filled into the prompt.

Always-on worked

Listed only failed (no CAVEMAN:)

Write-up + commits

https://github.com/fullsend-playground/python-app/blob/main/docs/adr-0091-skill-activation-matrix.html

@fullsend-ai-review

fullsend-ai-review Bot commented Aug 23, 2026

Copy link
Copy Markdown

🤖 Review · ⚠️ Cancelled · Started 5:32 PM UTC · Ended 5:44 PM UTC

Commit: b7097cf · View workflow run →

@fullsend-ai-review

fullsend-ai-review Bot commented Aug 23, 2026

Copy link
Copy Markdown

🤖 Finished Review · ✅ Success · Started 5:45 PM UTC · Completed 6:02 PM UTC

Commit: c3ace2b · View workflow run →

Runtime: claude · Model: opus → claude-opus-4-6 · Cost: $4.45

fullsend-ai-review[bot]

This comment was marked as outdated.

@rh-hemartin

Copy link
Copy Markdown
Member

What about the placeholder minus the metadata key?

@ascerra

ascerra commented Aug 25, 2026

Copy link
Copy Markdown
Contributor Author

@rh-hemartin on “placeholder minus the metadata key”

What that version would mean

Keep the placeholder in the agent file (e.g. __FULLSEND_ALWAYS_ON_SKILLS__ in triage.md). Before the run, bootstrap fills it with skill names.

In your version there is no metadata.apply on the skill. Bootstrap would fill the placeholder from every entry on the harness skills: list — soft “ALWAYS use / open these…” for the whole list. No new frontmatter key.

That is simpler. It is also a different product choice than what we proved with Caveman.

What we proved (for context)

Configs for those two tips:

So: listing alone does not open the skill. Naming it in the prompt (via the placeholder) does. The open question is only how we decide which names go into the placeholder.

The case I want your take on

Should we support: a team puts a skill on harness skills: so it is uploaded / available, but they do not want it soft-forced every run? The agent can open it when it wants. Consistency does not matter for that skill — only for a few must-use ones.

Example: triage skills: has issue-labels, github-forge, and a team “style” skill. They want labels/forge available; they only want the style skill always nudged (like Caveman in the proof).

  • If we do not need that case → I’m fine with your design: placeholder only, no metadata key, inject names for everything on skills:.
  • If we do need that case → we still need an opt-in (or opt-out) for always-on. Two shapes:
    • A. On the skillmetadata.apply: always (what ADR 0091 has now). Skill says “when listed, put my name in the placeholder.”
    • B. On the harness — e.g. always_on: [caveman] next to skills:. Harness says which listed names get the always-on directive; skills stay plain.

Which way do you lean — Having all skills listed under skills be always on or keep an opt-in (A or B)?

ascerra and others added 3 commits August 25, 2026 16:10
Record Option B: metadata.apply always fills a soft Skill-tool directive
with skill names (no SKILL.md body paste). Include playground activation
matrix evidence and update architecture plus skills guide.

Signed-off-by: Adam Scerra <ascerra@redhat.com>
Co-authored-by: Cursor <cursoragent@cursor.com>
Keep ADR 0091 evidence out of fullsend; link the public playground
HTML report instead of shipping the activation matrix in this PR.

Signed-off-by: Adam Scerra <ascerra@redhat.com>
Co-authored-by: Cursor <cursoragent@cursor.com>
0091 on main is now per-agent runtime/model/effort; renumber this ADR
and update cross-references accordingly.

Signed-off-by: Adam Scerra <ascerra@redhat.com>
Co-authored-by: Cursor <cursoragent@cursor.com>
@ascerra ascerra changed the title docs(adr): add ADR 0091 always-on harness skills docs(adr): add ADR 0092 always-on harness skills Aug 25, 2026
@ascerra
ascerra force-pushed the docs/adr-0091-always-on-skills branch from c3ace2b to 94bd8d8 Compare August 25, 2026 20:11
@fullsend-ai-review

fullsend-ai-review Bot commented Aug 25, 2026

Copy link
Copy Markdown

🤖 Finished Review · ✅ Success · Started 8:12 PM UTC · Completed 8:30 PM UTC

Commit: 94bd8d8 · View workflow run →

Runtime: claude · Model: opus → claude-opus-4-6 · Effort: high · Cost: $4.78

@fullsend-ai-review fullsend-ai-review Bot added the risk/low PR risk: low label Aug 25, 2026
@fullsend-ai-review

Copy link
Copy Markdown

Risk Assessment: low (1/5)

Details

Documentation-only PR adding ADR 0092 with cross-reference updates. Small change size, no protected paths, no security-sensitive files, docs-only with appropriate issue linkage.

@rh-hemartin

Copy link
Copy Markdown
Member

We are coming with this solution because we want to steer users to provide skills rather than modifying the system prompt. The problem here is that the agent is not using its skills when it should, because having it on the list does not make the agent explore and decide if a skill should be used. If you add a skill to an agent in Fullsend I think you care about consistency, as you took the effort to add it to the list.

So I don't think the use-case you proposed makes sense in Fullsend. It makes sense locally and even then you would prompt the agent to use it instead of adding frontmatter to the skill.

Another topic is skills that are not uploaded from the Fullsend side, but already exist on the target repo. Maybe folks want those used as well. I'm not sure if this PR is worth pursuing or we need to fallback to another approach, for example allowing users to add a "pre-prompt" so they can add "Agent please use these skills available on the repository" or just telling them directly to modify the system prompt.

I will add this topic to today's meeting.

@ascerra

ascerra commented Aug 28, 2026

Copy link
Copy Markdown
Contributor Author

Closing this issue as we have decided to go with a slightly different strategy outline here in this comment which led to 2 new issues being created and the closing of the original issue this PR set out to solve. #6380 (comment)

@ascerra ascerra closed this Aug 28, 2026
@fullsend-ai-retro

fullsend-ai-retro Bot commented Aug 28, 2026

Copy link
Copy Markdown

🤖 Finished Retro · ✅ Success · Started 1:09 AM UTC · Completed 1:21 AM UTC

Commit: 94bd8d8 · View workflow run →

Runtime: claude · Model: opus → claude-opus-4-6 · Effort: high · Cost: $4.24

@fullsend-ai-retro

Copy link
Copy Markdown

Retro: PR #6378 — ADR 0092 Always-On Harness Skills

Human-authored docs PR proposing ADR 0092 (always-on harness skills). Over 9 days, human reviewers challenged the fundamental design approach, ultimately leading to the PR being closed without merge in favor of a different strategy.

Timeline

  1. Aug 19: PR opened by ascerra with Option C design (paste SKILL.md body into agent prompt)
  2. Aug 19: Review agent (run 32250670491) approved; Qodo flagged 6 issues including a HIGH about documenting unimplemented behavior
  3. Aug 19–20: Human reviewers (ralphbean, rh-hemartin) rejected the design approach, proposed simpler alternatives
  4. Aug 20–23: Author pivoted to Option B (name-only directive with metadata.apply: always), tested in playground
  5. Aug 23: Review agent (run 32655760514) approved again with no findings
  6. Aug 25: Review agent (run 32893860881) approved a third time, risk assessment: low (1/5)
  7. Aug 27: rh-hemartin questioned whether the whole approach was right, added to team meeting agenda
  8. Aug 28: PR closed without merge; team decided on a different strategy (captured in new issues #6681, #6682)

Review Agent Performance

The review agent (from fullsend-ai/agents@main, commit b9c07455) approved 3 times while humans identified fundamental design problems. Qodo outperformed on tactical findings.

  • Missed correctness issue: Qodo caught that apply: always metadata is documented as working but isn't implemented in the runtime. The review agent didn't flag this.
  • Missed design concerns: Humans identified that Option C bypasses the Skill tool's trace/usage contract, loses companion resources (references, scripts), and is unnecessarily complex.
  • Inappropriate approval: Approved an ADR under active design dispute from senior reviewers.

Evidence for Existing Issues

  • #1659 (comment-only on ADR PRs): Strong evidence — agent approved 3× on an ADR closed without merge after human design critique. Had the agent only commented, it wouldn't have contributed a misleading approval signal or the ready-for-merge label.
  • #2835 (verify docs reference existing features): Agent missed that apply: always metadata behavior doesn't exist in the codebase. Qodo caught this as HIGH severity.
  • #1906 (detect omissions in ADRs): Agent missed that Option C loses companion resources and breaks trace visibility — information available in existing skill architecture docs.
  • #3030 (ADR design-depth checklist): A checklist would have prompted the agent to evaluate whether the proposed mechanism aligns with existing skill loading patterns.
  • #4463 (withhold ready-for-merge on advisory concerns): The ready-for-merge label was present despite unresolved human design discussions. In this case the deeper issue is that the agent detected no concerns at all, but the label-gating pattern from Review agent should withhold ready-for-merge label when it detects advisory-level concerns in approved PRs #4463 would still help if combined with ADR-aware review (Review agent should comment-only (not approve) on ADR PRs #1659).

Proposals filed

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

ready-for-merge All reviewers approved — ready to merge risk/low PR risk: low

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Harness-listed team skills do not reliably apply without default-prompt naming

3 participants