feat(layers): add HarnessWrappersLayer for install-time base composition - #2300
Conversation
Site previewPreview: https://e13b7d7b-site.fullsend-ai.workers.dev Commit: |
|
🤖 Finished Review · ✅ Success · Started 4:06 PM UTC · Completed 4:21 PM UTC |
Codecov Report❌ Patch coverage is
📢 Thoughts on this report? Let us know! |
ReviewFindingsLow
Info
Previous runReviewFindingsLow
Info
Previous run (2)ReviewFindingsMedium
Low
Info
Previous run (3)ReviewFindingsMedium
Low
Info
Previous run (4)ReviewFindingsLow
Info
Previous run (5)ReviewFindingsLow
Info
Previous run (6)ReviewFindingsHigh
Medium
Low
Info
Previous run (7)ReviewFindingsLow
Info
Previous run (8)ReviewFindingsLow
Info
Previous run (9)ReviewFindingsHigh
Medium
Low
Info
|
ralphbean
left a comment
There was a problem hiding this comment.
I think the managed header and the overwrite logic need a rethink before this can merge. See inline.
94735b6 to
de440f8
Compare
|
🤖 Review · |
de440f8 to
1dbe12e
Compare
|
🤖 Finished Review · ✅ Success · Started 8:38 PM UTC · Completed 8:50 PM UTC |
1dbe12e to
5625e13
Compare
|
🤖 Finished Review · ✅ Success · Started 8:58 PM UTC · Completed 9:11 PM UTC |
ralphbean
left a comment
There was a problem hiding this comment.
LGTM — 1dbe12e fixed the header issue.
One thing I'm mulling over: the wrapper is four lines (header, base URL, role, slug). If we gave users that file directly and let them add overrides below base:, we'd have one file per agent instead of two. No customized/harness/ indirection to learn.
The cost is Install can't freely update the base: URL on upgrades if the user edits the file. But could something like fullsend lock --update handle that?
|
@ralphbean Thanks for the approval and the thoughtful design note. The single-file approach has real appeal — simpler mental model, one file per agent, no That said, this is exactly the kind of thing Phase 4 ("collapse dual-write") should evaluate — whether we can merge the managed/customized split once the composition model is proven. I'd rather ship the safer default now and simplify later with real usage data. |
803f4a8 to
782b71c
Compare
|
🤖 Finished Review · ✅ Success · Started 9:51 PM UTC · Completed 10:07 PM UTC |
782b71c to
3f46cfe
Compare
|
🤖 Finished Review · ✅ Success · Started 10:40 PM UTC · Completed 10:55 PM UTC |
3f46cfe to
32ec577
Compare
|
🤖 Finished Review · ✅ Success · Started 11:01 PM UTC · Completed 11:13 PM UTC |
…ion (ADR-0045 Phase 2 PR 4) Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> Signed-off-by: Greg Allen <gallen@redhat.com>
32ec577 to
ca32f36
Compare
|
🤖 Finished Review · ✅ Success · Started 11:51 PM UTC · Completed 12:03 AM UTC |
|
🤖 Finished Retro · ✅ Success · Started 2:08 AM UTC · Completed 2:17 AM UTC |
Retro: PR #2300 — HarnessWrappersLayerTimeline: Human-authored PR by ggallen adding What went well:
Known issues observed (already tracked):
One new proposal below about the review agent missing contradictions between generated code comments and stated design intent. Proposals filed
|
Summary
HarnessWrappersLayerto the install layer stack that generates thin harness wrapper files in the.fullsendconfig repobase:URL (with#sha256=integrity hash) and setsrole:/slug:locallycommitSHAbuild-time variable toroot.goand.goreleaser.ymlso wrappers reference the exact release commitallowed_remote_resourcesprefix inNewOrgConfig()so generated base URLs pass the allowlist checkcoder→code.yaml+fix.yaml,fullsend→ skip)commitSHA="dev") skip wrapper generation gracefullyADR-0045 Phase 2 PR 4 — depends on PR 3 (base URL generation, merged).
Test plan
harnessesForRolereturns correct harness names for each role (coder→[code,fix], fullsend→nil, others→[role])commitSHA="dev") → no wrappers generated, no errorcommitSHA→ no wrappers generated, no error#sha256=integrity hashCommitFileserror → propagated with contextharness.LoadRaw()with correct Role/Slug/Basescaffold.HarnessBaseURLWithHash()output100644(regular file)TestCheckInstallScopes_SyncWithLayersupdated with new layermake go-testpasses (all packages)make go-vetpassesmake lintpassesharnesswrappers.go97-100% across all functions🤖 Generated with Claude Code