To merge main branch, exact context and instructions
46
48%
Does it follow best practices?
Run evals on this skill
Adds up to 20 points to the overall score
View guide
Passed
No findings from the security scan
Fix and improve this skill with Tessl
tessl review fix ./.claude/skills/merge-main/SKILL.mdYou are a thoughtful and meticulous senior software engineer.
Sync+merge remote origin main into this branch.
On conflicts: understand what both parts did. Use 3 way merge logic. Not just selecting A vs B. Not extremes. Not mechanical.
Automatically resolve if you are 100% sure, otherwise MUST USE HITL.
Workspace root:
plugins are autogenerated => let user know to regenerate.docs/web is the web site content, which 99% follows original files.instructions is the actual instructions, use by plugin generator, which are sent to AI coding agents working on separate their own repositories.src contains MCPs, additional packages, and tools.If you learned something new which is reusable, there are process efficiency improvements, you can prevent faiures in the future, update ## Lessons learned below for self-improvement.
rosettify-plugins once cleaned the 7 standard trees but left all 6 core-*-light trees carrying pre-merge content, including frontmatter keys the merge had deleted. No conflict, no test failure — scripts/pre_commit.py runs the generator twice (standard, then --profile lightweight) and only both passes together make plugins/ consistent. Verify with diff -rq plugins/<t> plugins/<t>-light: anything differing beyond the profile-scoped files and the manifest name/description is stale.agents/ configure/ hooks/ rules/ skills/ workflows/ — nothing under docs/. A shipped instructions/ file that points at docs/… dangles for consumer repos, so "concise pointer vs inline contract" is a real HITL decision, not a style preference.instructions/ rule files whose generated copies survived in a branch-only plugin. Grep the merged tree for paths/claims each side touched, and always run both src/rosettify-plugins and src/hooks suites — a regression test caught the stale path a doc review missed."Rosetta 2.0" in the Codex manifest; git conflicted only on that line while cleanly taking main's version bump and the branch's new defaultPrompt. The resolution is per-field, and the one word neither side can decide (3 vs 3.0) is the HITL question — not the whole file.plugins/** conflict is a shadow of its preserved source. plugins/<t>/…/plugin.json is byte-copied from src/rosettify-plugins/plugins/<t>/…, so both conflict identically. Resolve them the same way, then tell the user to regenerate rather than hand-tuning the generated copy.src/rosettify-plugins/package.json to a new minor. No conflict, no test failure — the two just disagree afterwards. Compare package.json against the manifests post-merge and surface it.comm -12 on git diff --name-only <base> origin/main vs … <base> HEAD reduced 717+331 changed files to 15 real overlaps, which made the one genuine judgment call obvious immediately.docs/reviews/DOC-STRUCTURE-PLAN.md asserting llms-full.txt is "generated by the build pipeline (no manual facts)". It is hand-maintained: .github/workflows/pages.yml only cps it to docs/web/, no generator references it, and its history is all feature commits. A false generated-claim is high-damage — it invites treating hand-written content as disposable and skipping updates. Grep *.ts/js/json/sh/yml for the filename and check git log -- <file> before believing it.git diff --name-only <base> origin/main | grep ^plugins/ first: if the incoming side touches no plugin files, locally modified plugins/ neither blocks the merge nor needs discussion — the user regenerates it regardless.check_state→check_mode rename (each regenerating plugins to catch up with an instructions source that already had check_mode at the merge-base). git merge --ort merged them with zero conflict markers. Diff each overlapping file on both sides before assuming a HITL question exists — same-diff overlaps are free.scripts/bump_versions.sh is the ground truth: it bumps plugin.json+marketplace.json together as one group (kept equal to each other), and separately, opt-in, bumps src/rosettify/package.json, src/rosettify-plugins/package.json, src/rosettify-prompts/package.json, src/curiocity/package.json, and each pyproject.toml — with no expectation any of those match each other or the plugin/marketplace group. rosettify-plugins/package.json at 3.2.0 next to plugin.json at 3.1.8 is not drift, it's two unrelated counters — a genuine "did the user mean to conflate these" moment, corrected after the user pushed back with "solution has individual components with individual versions, you must think." The real post-merge check is per-track: diff each file in the list above at base vs main vs branch vs merged — a track is a problem only if main and branch both bumped the same file to different values, or one side bumped a track's file and the merge silently reverted it.profile-<name>-only token kind. The two hunks sit in different parts of directives.ts, so git merged both with zero conflict markers — and the build would have hard-failed on all 11 profile-scoped source files. The suites that build from the real instruction tree are what expose this; a unit test on the parser alone would not. After any merge that touches validation, run the generator end-to-end against the real tree and check the exit code, not just the tests.spec/target-names.ts (role-keyed object), this branch had put the same seven literals in types.ts (array + type + guard). Object.values recovers the list from the roles, but no expression recovers a role from a name string — so the role-keyed object is the literal home and the list/type/guard hang off it. Picking the other direction leaves the literals duplicated and free to drift.docs/hooks-verify.md under docs/ — no requirement unit at all, and the branch's shape-exemption was equally unspecified. git diff --name-only <base> origin/main | grep ^docs/requirements/ in one line tells you whether incoming behavior arrived with its spec.{overwrite} yet still appended the inert clause — so grep the claim, don't reason about where it "should" be. One instance began "The" rather than "the" and silently survived a case-sensitive replace.044d86c
If you maintain this skill, you can claim it as your own. Once claimed, you can manage eval scenarios, bundle related skills, attach documentation or rules, and ensure cross-agent compatibility.