Skip to content

Promote Develop to Main - #90

Closed
ptr727 wants to merge 5 commits into
mainfrom
develop
Closed

Promote Develop to Main#90
ptr727 wants to merge 5 commits into
mainfrom
develop

Conversation

@ptr727

Copy link
Copy Markdown
Owner

Promotes the hub resync (#86, #87, #89) plus two pending Dependabot bumps (#79, #74) from
develop to main.

Resync summary

Converges AGENTS.md/GOVERNANCE.md's verbatim sections, the .github/skills/ tree, and the
remaining intent files (CODESTYLE.md, WORKFLOW.md, .gitattributes/.editorconfig,
cspell.json) against the current hub canonical (ptr727/ProjectTemplatemain@b823bc4).
Retires the hub-hosted repo-config/* payloads and spec/secrets.json (now checked from a hub
checkout rather than carried locally). Rewrites .github/copilot-instructions.md to the hub's
condensed runbook and extracts this project's architecture/pipeline/test-layout content into a
new ARCHITECTURE.md. Fixes two real bugs along the way: publish-release.yml's publish job
was missing a needs.validate.result == 'success' gate, and .vscode/tasks.json's .NET Format
task had an unordered CSharpier/build race. Also fixes roughly two dozen content-accuracy bugs in
ARCHITECTURE.md/WORKFLOW.md that review caught along the way, several pre-dating the resync
(stale file/test references, a wrong extension list, wrong video-conversion tiers, a missing
metadata-write step, WORKFLOW.md describing a paths-filter/plan-job shape this repo had already
migrated away from).

Live settings/rulesets converged separately (repo-config/configure.sh apply): has_discussions
enabled to match this repo's now-public visibility.

Three upstream hub defects filed and confirmed real along the way:
ptr727/ProjectTemplate#1075, #1078, #1082.

🤖 Generated with Claude Code

dependabotBotand others added 5 commits August 19, 2026 10:55
Bumps the actions-deps group with 2 updates: [ptr727/ProjectTemplate/.github/workflows/merge-bot-task.yml](https://github.com/ptr727/projecttemplate) and [dorny/paths-filter](https://github.com/dorny/paths-filter).
Updates `ptr727/ProjectTemplate/.github/workflows/merge-bot-task.yml` from 2.0.338 to 2.0.357
- [Release notes](https://github.com/ptr727/projecttemplate/releases)
- [Changelog](https://github.com/ptr727/ProjectTemplate/blob/main/HISTORY.md)
- [Commits](ptr727/ProjectTemplate@20616e0...5d0fa7f)
Updates `dorny/paths-filter` from 4.0.1 to 4.0.3
- [Release notes](https://github.com/dorny/paths-filter/releases)
- [Changelog](https://github.com/dorny/paths-filter/blob/master/CHANGELOG.md)
- [Commits](dorny/paths-filter@fbd0ab8...ceb8a2b)
---
updated-dependencies:
- dependency-name: ptr727/ProjectTemplate/.github/workflows/merge-bot-task.yml
dependency-version: 2.0.357
dependency-type: direct:production
update-type: version-update:semver-patch
dependency-group: actions-deps
- dependency-name: dorny/paths-filter
dependency-version: 4.0.3
dependency-type: direct:production
update-type: version-update:semver-patch
dependency-group: actions-deps
...
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Bumps the actions-deps group with 4 updates: [ptr727/ProjectTemplate/.github/workflows/merge-bot-task.yml](https://github.com/ptr727/projecttemplate), [ptr727/ProjectTemplate/.github/workflows/publish-plan-task.yml](https://github.com/ptr727/projecttemplate), [ptr727/ProjectTemplate/.github/workflows/validate-task.yml](https://github.com/ptr727/projecttemplate) and [ptr727/ProjectTemplate/.github/workflows/build-release-task.yml](https://github.com/ptr727/projecttemplate).
Updates `ptr727/ProjectTemplate/.github/workflows/merge-bot-task.yml` from 2.0.357 to 2.0.380
- [Release notes](https://github.com/ptr727/projecttemplate/releases)
- [Changelog](https://github.com/ptr727/ProjectTemplate/blob/main/HISTORY.md)
- [Commits](ptr727/ProjectTemplate@5d0fa7f...74ef727)
Updates `ptr727/ProjectTemplate/.github/workflows/publish-plan-task.yml` from 2.0.376 to 2.0.380
- [Release notes](https://github.com/ptr727/projecttemplate/releases)
- [Changelog](https://github.com/ptr727/ProjectTemplate/blob/main/HISTORY.md)
- [Commits](ptr727/ProjectTemplate@537b183...74ef727)
Updates `ptr727/ProjectTemplate/.github/workflows/validate-task.yml` from 2.0.376 to 2.0.380
- [Release notes](https://github.com/ptr727/projecttemplate/releases)
- [Changelog](https://github.com/ptr727/ProjectTemplate/blob/main/HISTORY.md)
- [Commits](ptr727/ProjectTemplate@537b183...74ef727)
Updates `ptr727/ProjectTemplate/.github/workflows/build-release-task.yml` from 2.0.376 to 2.0.380
- [Release notes](https://github.com/ptr727/projecttemplate/releases)
- [Changelog](https://github.com/ptr727/ProjectTemplate/blob/main/HISTORY.md)
- [Commits](ptr727/ProjectTemplate@537b183...74ef727)
---
updated-dependencies:
- dependency-name: ptr727/ProjectTemplate/.github/workflows/merge-bot-task.yml
dependency-version: 2.0.380
dependency-type: direct:production
update-type: version-update:semver-patch
dependency-group: actions-deps
- dependency-name: ptr727/ProjectTemplate/.github/workflows/publish-plan-task.yml
dependency-version: 2.0.380
dependency-type: direct:production
update-type: version-update:semver-patch
dependency-group: actions-deps
- dependency-name: ptr727/ProjectTemplate/.github/workflows/validate-task.yml
dependency-version: 2.0.380
dependency-type: direct:production
update-type: version-update:semver-patch
dependency-group: actions-deps
- dependency-name: ptr727/ProjectTemplate/.github/workflows/build-release-task.yml
dependency-version: 2.0.380
dependency-type: direct:production
update-type: version-update:semver-patch
dependency-group: actions-deps
...
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
…ets (#86)
* Converge instruction set with hub, retire hub-hosted repo-config/secrets
Re-vendor AGENTS.md and GOVERNANCE.md's declared-verbatim sections from
the current hub canonical (hub main@b823bc4). Delete repo-config/*.json,
repo-config/README.md, and spec/secrets.json: per spec/divergences.json
these are 'retire' dispositions, hub-hosted and checked from a hub
checkout (repo-config/configure.sh, spec/audit.py) rather than carried
here. Rewrite AUDIT.md's General Settings/Rulesets/Secrets sections to
point at those hub tools instead of the now-deleted local payloads, add
the now-required OPERATIONS.md 'Local Verification' leading section,
and sweep every other inbound reference to the deleted paths across
GOVERNANCE.md, WORKFLOW.md, and host-tools.json.
Also fix publish-release.yml's 'publish' job: its explicit if: bypassed
the implicit needs-succeeded gate, so a failed validate job would not
have blocked a publish. Add needs.validate.result == 'success'.
Audit run 2026-08-29T01:09:26Z | hub b823bc4
* Bump the hub-hosted workflow pin past the retire dead-path exemption
CI's prose gate (validate-task.yml) flagged 6 dead-path findings against
spec/secrets.json and repo-config/README.md, both deleted by the prior
commit. Per RESYNC.md section 4: a repo's pinned validate-task.yml SHA
can predate the retire disposition's own dead-path exemption in
prose_lint.py's HUB_HOSTED set. Confirmed: the previous pin
(74ef727a7aa96493bcd5bc2ce49b2977721678a3) predates both exemption
commits (7787662 for spec/secrets.json, e31d3fc for repo-config/), per
git merge-base --is-ancestor. Bump every ptr727/ProjectTemplate
reusable-workflow uses: in this repo's own workflows to the current hub
main (b823bc493fcdc47e9d9d9d2fc183e3ca10114146), which contains both.
Verified locally: running the current hub prose_lint.py against this
branch's diff now finds 0 violations.
* Fix .NET Format task's unordered CSharpier/build race
.vscode/tasks.json's .NET Format task declared dependsOn
[CSharpier Format, .NET Build] with no dependsOrder, so VS Code's
default (parallel) let the build read source while CSharpier was still
rewriting it, producing a nondeterministic local run. Add
dependsOrder: sequence so CSharpier finishes before the build starts,
matching OPERATIONS.md 'Local Verification''s documented ordering.
* Silence SC1091 on the Husky-generated pre-commit hook's sourced line
The pin bump in a72c48c reaches the hub's newer validate-task.yml, whose
shellcheck/shfmt discovery now correctly picks up .husky/pre-commit as
a shebang-executed extensionless script (per the shell-codestyle
skill's discovery rule) and lints it for the first time. It found
SC1091 on the '. $(dirname "$0")/_/husky.sh' line, which shellcheck
can't follow since that file is generated at husky-install time and
absent at lint time.
Not a hub defect: the hub's own canonical
catalog/snippets/husky/pre-commit template already carries this exact
directive comment. PhotoCleaner's actual generated hook was just
missing it. Verified dotnet husky install does not overwrite an
existing .husky/pre-commit, so the fix is stable across reinstalls.
Confirmed clean locally: shellcheck and shfmt both exit 0 on the file
now.
* Adopt the hub's simplified .gitattributes, required by the bumped pin
CI's repo_gate.py --check eol/eol-coverage (reached via the pin bumped
in a72c48c) now requires a '* text=auto eol=<ending>' default plus
explicit *.bat/*.cmd CRLF pins, the hub's new .gitattributes shape.
The old '* -text' plus per-path LF pins model this PR left untouched
fails both checks. Confirmed byte-identical via --renormalize (no file
content changes, policy-text only), and confirmed clean locally against
the same repo_gate.py checks CI runs.
This duplicates one commit from the intent-files PR (#88, stacked on
this branch), which will become empty and drop out once that branch is
rebased onto this commit.
* Sync .editorconfig's line-ending comment with the new .gitattributes
The prior commit adopted the hub's simplified .gitattributes but left
.editorconfig's comment block describing the superseded per-type-pin
model (shell/Dockerfiles/uv.lock/.py-by-path/husky hook pins), which a
review caught as now internally inconsistent within this PR. Sync it to
the same hub canonical wording used for .gitattributes.
This duplicates the matching hunk in the stacked intent-files PR (#88),
which will become empty and drop out once that branch is rebased onto
this commit.
python3 scripts/carry.py apply PhotoCleaner: 26 files stale against the
current hub canonical re-vendored verbatim, plus 3 new skills the hub
added (drive-pr, local-strict-review, merge-and-release). Fully
hub-owned tree, no repo-local content to preserve.
Audit run 2026-08-29T01:09:26Z | hub b823bc4
* Converge copilot-instructions.md and remaining intent files with hub
Rewrite .github/copilot-instructions.md's four declared sections to the
current hub canonical (the review runbook shrank substantially, its
mechanics now delegated to scripts/pr_review.py). Move this file's nine
undeclared, repo-specific sections (architecture, patterns, processing
pipeline, per-command implementation detail, test layout) into a new
ARCHITECTURE.md, the destination spec/section-model.md declares for
this content; drop the 'Command Line Usage' section outright as a
duplicate of README.md's own Usage section. Preserve the (currently
empty) Disproved Claims ledger.
Fix a round of real staleness bugs review caught along the way, several
pre-dating this resync: nine in the newly-extracted ARCHITECTURE.md
(dead file/test references, an incomplete extensions list, wrong video
conversion tiers, a wrong JSON context name, a stale trim pattern, a
broken relative link, hard-coded test counts already drifted twice),
plus WORKFLOW.md's D1.1/D1.4/D1.5/D4.1 clauses and their S1/S2/S3/S5/S6
scenario rows, which described a paths-filter/plan-job shape this repo
had already migrated away from (verified directly against the current
test-pull-request.yml and publish-release.yml), and AGENTS.md's own
preamble, which still routed architecture content at
.github/copilot-instructions.md after this same change moved it.
Re-vendor CODESTYLE.md (repoint two dead GOVERNANCE.md 'Running the
Linters Locally' links at OPERATIONS.md 'Local Verification', which now
holds that content since that section moved hub-only; adopt the hub's
stronger pre-commit-gate wording; keep the repo's own 'The Full
Post-Change Set' subsection) and cspell.json's fleet word list
(opencode, Qodo added; nugetlibrary, pypilibrary dropped, matching the
WORKFLOW.md artifact rename).
Rebuilt as a single commit on the current develop tip after the earlier
PR's multi-commit history (originally stacked on the instruction-set
PR) stopped applying once that PR's squash-merge rewrote its commits;
the diff is unchanged, verified against the prior branch tip.
Audit run 2026-08-29T01:09:26Z | hub b823bc4
* Fix more ARCHITECTURE.md/AGENTS.md content bugs review caught
- Metadata Preservation was flatly wrong: ProcessTask does call a
separate SetCreateDateAsync after CopyMetadataAsync/TagsFromFile
(confirmed at ProcessTask.cs ~line 610), contra the doc's 'no
separate date-setting step is needed' claim. Also clarified the
metadata source under --skipbackup (the still-live original, deleted
only after the copy runs, not the .bak file the old text implied
universally).
- Command Line Testing Patterns described a test suite that does not
exist: CommandLineTests.cs constructs CommandLine directly (no
CreateTestCommand() helper), and --path is a single Option<DirectoryInfo>
(confirmed at CommandLine.cs), not the Option<List<DirectoryInfo>>
multi-path suite the old text described in detail. Rewrote to match
the actual test file, and dropped the same stale 'multiple paths'
claim from the Coverage Areas line above it.
- AGENTS.md's CODESTYLE.md/ARCHITECTURE.md ownership statement read as
contradictory once architecture content moved out of
copilot-instructions.md: 'this project's own conventions... live in
CODESTYLE.md' read as claiming code-style AND design conventions,
while ARCHITECTURE.md's own 'Key Patterns & Conventions' section
covers the latter. Narrowed the CODESTYLE.md sentence to code-style
specifically and added an explicit ARCHITECTURE.md pointer for
design conventions.
CopilotAI lite review requested due to automatic review settings August 29, 2026 04:01
@coderabbitai

Copy link
Copy Markdown

Warning

Review limit reached

Next included review available in 2 minutes.

View limit details

Limit details: You’ve used all 10 included reviews currently available.

Enable usage-based reviews in Billing to review now. Otherwise, wait until the next included review is available.
You're only billed for reviews past your plan's rate limits ($0.25/file).

Learn how review limits work.

Review configuration:

⚙️ Run configuration

Configuration used: Organization UI

Review profile: ASSERTIVE

Plan: Pro Plus

Run ID: d28ccb54-fba3-4327-ac49-a719e1f4fae0

📥 Commits

Reviewing files that changed from the base of the PR and between b62b3a7 and 774d2b0.

📒 Files selected for processing (49)
  • .editorconfig
  • .gitattributes
  • .github/copilot-instructions.md
  • .github/skills/agent-conduct/SKILL.md
  • .github/skills/audit-a-repo/SKILL.md
  • .github/skills/comment-and-doc-style/SKILL.md
  • .github/skills/comment-and-doc-style/references/carried-doc-references.md
  • .github/skills/comment-and-doc-style/references/line-endings.md
  • .github/skills/copilot-instructions-keeper/SKILL.md
  • .github/skills/dotnet-codestyle/SKILL.md
  • .github/skills/dotnet-codestyle/references/conventions.md
  • .github/skills/dotnet-codestyle/references/project-config.md
  • .github/skills/drive-pr/SKILL.md
  • .github/skills/git-commit-conventions/SKILL.md
  • .github/skills/local-strict-review/SKILL.md
  • .github/skills/merge-and-release/SKILL.md
  • .github/skills/operational-vs-release-workflow/SKILL.md
  • .github/skills/operational-vs-release-workflow/references/branch-protection-and-promotion.md
  • .github/skills/operational-vs-release-workflow/references/release-publish-mechanics.md
  • .github/skills/pr-review-conduct/SKILL.md
  • .github/skills/python-codestyle/SKILL.md
  • .github/skills/python-codestyle/references/code-style.md
  • .github/skills/python-codestyle/references/testing.md
  • .github/skills/repo-worktree/SKILL.md
  • .github/skills/resync-a-repo/SKILL.md
  • .github/skills/shell-codestyle/SKILL.md
  • .github/skills/skill-lifecycle/SKILL.md
  • .github/skills/standup-a-repo/SKILL.md
  • .github/skills/upstream-contribution-workflow/SKILL.md
  • .github/skills/workflow-ci-contract/SKILL.md
  • .github/workflows/merge-bot-pull-request.yml
  • .github/workflows/publish-release.yml
  • .github/workflows/test-pull-request.yml
  • .husky/pre-commit
  • .vscode/tasks.json
  • AGENTS.md
  • ARCHITECTURE.md
  • AUDIT.md
  • CODESTYLE.md
  • GOVERNANCE.md
  • OPERATIONS.md
  • WORKFLOW.md
  • cspell.json
  • host-tools.json
  • repo-config/README.md
  • repo-config/develop.json
  • repo-config/main.json
  • repo-config/settings.json
  • spec/secrets.json

Comment @coderabbitai help to get the list of available commands.

@qodo-code-review

Copy link
Copy Markdown

PR Summary by Qodo

Resync Fleet Governance and Harden Release Validation

🐞 Bug fix✨ Enhancement📝 Documentation⚙️ Configuration changes🕐 40+ Minutes

Grey Divider

AI Description

• Resync governance, skills, and intent files with the current hub canonical.
• Move project architecture into a dedicated, accuracy-corrected reference.
• Gate publishing on validation success and serialize the local format workflow.
Diagram

graph TD
H["Hub Canonical"] --> G["Governance Docs"] --> A["Agent Skills"]
H --> W["CI Workflows"] --> R["Release Pipeline"]
G --> P["Project Architecture"]
A --> L["Local Tooling"]
W --> L
Loading
High-Level Assessment

The chosen approach is appropriate: keep shared rulesets, secret specifications, and executable gates centralized in the hub while retaining repository-specific architecture locally. Keeping duplicate repo-config payloads was considered but would restore drift and competing sources of truth; the workflow validation gate and sequential format task are narrow fixes to the actual failure modes.

Files changed (44) +1072 / -1013

Enhancement (3) +428 / -0
SKILL.mdAdd end-to-end pull request driving procedure+131/-0

Add end-to-end pull request driving procedure

• Introduces a skill for driving feature PRs through review into 'develop' and, when requested, preparing a mergeable promotion PR. Defines authorization boundaries, finding disposition, safe branch cleanup, and promotion-fix loops.

.github/skills/drive-pr/SKILL.md

SKILL.mdAdd adversarial pre-push review procedure+72/-0

Add adversarial pre-push review procedure

• Introduces a read-only, full-context review pass against the target merge base before PR-bound pushes and completion claims. Covers untracked files, model selection, finding disposition, and execution boundaries.

.github/skills/local-strict-review/SKILL.md

SKILL.mdAdd guarded promotion merge and release procedure+225/-0

Add guarded promotion merge and release procedure

• Introduces a procedure that verifies the merge gate, safely merges 'develop' to 'main', correlates and watches explicit release runs, refreshes hub skills, and cleans completed worktrees and branches.

.github/skills/merge-and-release/SKILL.md

Bug fix (2) +7 / -5
publish-release.ymlBlock publishing unless validation succeeds+5/-4

Block publishing unless validation succeeds

• Updates reusable release workflow pins to the synchronized hub commit. Adds an explicit successful-validation condition so a skipped or failed validation job cannot permit publishing.

.github/workflows/publish-release.yml

tasks.jsonSerialize CSharpier before the .NET build+2/-1

Serialize CSharpier before the .NET build

• Sets dependency execution order to sequence so formatting completes before build and style verification, eliminating the prior race.

.vscode/tasks.json

Documentation (33) +621 / -965
copilot-instructions.mdCondense Copilot instructions to a focused review runbook+38/-630

Condense Copilot instructions to a focused review runbook

• Removes duplicated governance and PhotoCleaner implementation material, routing those subjects to canonical documents. Retains concise Copilot bootstrap, review output requirements, automation usage, effort handling, and the disproved-claims ledger.

.github/copilot-instructions.md

SKILL.mdStrengthen verification and repository-read discipline+4/-1

Strengthen verification and repository-read discipline

• Adds safeguards for untrusted existing checkouts, private raw-file reads, and mandatory local strict review before PR-bound completion claims. Directs durable hub defects to tracked ProjectTemplate issues.

.github/skills/agent-conduct/SKILL.md

SKILL.mdRoute configuration audits through hub-owned tooling+1/-1

Route configuration audits through hub-owned tooling

• Replaces local payload comparison guidance with hub 'configure.sh' and 'spec/audit.py' checks for settings, rulesets, and secrets.

.github/skills/audit-a-repo/SKILL.md

SKILL.mdDocument constrained Docker linting and title casing+27/-7

Document constrained Docker linting and title casing

• Adds the approved Docker lint wrapper and restricted-executor authorization model. Updates carried-file scope and standardizes title-case examples for PR titles and commits.

.github/skills/comment-and-doc-style/SKILL.md

carried-doc-references.mdRemove retired repo-config files from carried-doc scope+1/-1

Remove retired repo-config files from carried-doc scope

• Updates the carried-content inventory after repository configuration payloads moved exclusively to the hub.

.github/skills/comment-and-doc-style/references/carried-doc-references.md

line-endings.mdAdopt paired global line-ending normalization rules+21/-39

Adopt paired global line-ending normalization rules

• Documents global LF normalization in EditorConfig and Git attributes, CRLF overrides, operational-repository exceptions, and nested byte-preservation patterns.

.github/skills/comment-and-doc-style/references/line-endings.md

SKILL.mdExpand synchronized Copilot instruction section coverage+9/-9

Expand synchronized Copilot instruction section coverage

• Adds 'When in Doubt' to the intent-managed section set and clarifies use of the carried-instruction guard when preserving repository-specific claims.

.github/skills/copilot-instructions-keeper/SKILL.md

SKILL.mdRecommend canonical Husky pre-commit enforcement+5/-4

Recommend canonical Husky pre-commit enforcement

• Changes local .NET hooks from optional guidance to a strong recommendation and points to the canonical shared configuration.

.github/skills/dotnet-codestyle/SKILL.md

conventions.mdMake the XML documentation example executable+11/-1

Make the XML documentation example executable

• Replaces an empty async method body with validation, cancellation, asynchronous work, and a concrete return value matching the documented contract.

.github/skills/dotnet-codestyle/references/conventions.md

project-config.mdRequire nullable analysis and XML documentation output+4/-0

Require nullable analysis and XML documentation output

• Adds standard project configuration for nullable reference types and generated XML documentation on public surfaces.

.github/skills/dotnet-codestyle/references/project-config.md

SKILL.mdDefine verified cleanup exception for squashed branches+1/-3

Define verified cleanup exception for squashed branches

• Permits force-deleting only an exact local task branch after live merged-PR and clean-worktree verification. Destructive operations remain prohibited for all other cases.

.github/skills/git-commit-conventions/SKILL.md

SKILL.mdRequire post-merge worktree and base-clone cleanup+1/-0

Require post-merge worktree and base-clone cleanup

• Adds cleanup as the terminal step after feature merges, promotions, and releases while explicitly preserving 'develop'.

.github/skills/operational-vs-release-workflow/SKILL.md

branch-protection-and-promotion.mdUse hub configuration for branch protection and promotion+15/-19

Use hub configuration for branch protection and promotion

• Replaces hand-built or locally carried ruleset instructions with hub-owned configuration commands. Tightens safe promotion recovery and EOL conflict examples.

.github/skills/operational-vs-release-workflow/references/branch-protection-and-promotion.md

release-publish-mechanics.mdAlign release mechanics with reusable hub workflows+7/-9

Align release mechanics with reusable hub workflows

• Renames standardized .NET and PyPI artifacts and documents source-only releases through the hub-hosted reusable release task instead of inlined publishing.

.github/skills/operational-vs-release-workflow/references/release-publish-mechanics.md

SKILL.mdExpand review coverage and cleanup requirements+26/-5

Expand review coverage and cleanup requirements

• Adds CodeRabbit and Qodo body-only finding handling, local strict review before pushes, user-controlled Copilot effort semantics, ready-by-default internal PRs, and post-merge cleanup.

.github/skills/pr-review-conduct/SKILL.md

SKILL.mdDifferentiate build and lint-only Python profiles+27/-16

Differentiate build and lint-only Python profiles

• Separates pytest-based build projects from unittest-based lint-only scripts, updates clean-compile commands, and strongly recommends canonical pre-commit hooks.

.github/skills/python-codestyle/SKILL.md

code-style.mdDocument the Python 3.13 syntax baseline+13/-0

Document the Python 3.13 syntax baseline

• Prevents unnecessary compatibility syntax while identifying the few bootstrap files that intentionally support older interpreters.

.github/skills/python-codestyle/references/code-style.md

testing.mdScope pytest conventions to build-profile projects+4/-0

Scope pytest conventions to build-profile projects

• Clarifies that lint-only script projects use unittest and profile-specific coverage commands instead of pytest.

.github/skills/python-codestyle/references/testing.md

SKILL.mdPrefer registered worktrees and verify cleanup+51/-26

Prefer registered worktrees and verify cleanup

• Makes scoped approval the preferred response to write boundaries before falling back to temporary clones. Adds provider-specific guidance and a live-state-verified post-merge cleanup procedure.

.github/skills/repo-worktree/SKILL.md

SKILL.mdTrack hub defects and audit secrets during resync+9/-3

Track hub defects and audit secrets during resync

• Requires resync-discovered hub defects to become ProjectTemplate issues with evidence. Updates configuration and secret checks to run from the hub canonical.

.github/skills/resync-a-repo/SKILL.md

SKILL.mdAdd shfmt to the shell clean-compile contract+9/-2

Add shfmt to the shell clean-compile contract

• Defines shellcheck plus shfmt as the shell verification pair and includes extensionless shell scripts in its scope.

.github/skills/shell-codestyle/SKILL.md

SKILL.mdRequire commit authorization for generated skill trees+1/-1

Require commit authorization for generated skill trees

• Clarifies that regenerated source and distribution trees are committed together only after authorization under commit conventions.

.github/skills/skill-lifecycle/SKILL.md

SKILL.mdClarify hub configuration check and apply semantics+6/-3

Clarify hub configuration check and apply semantics

• Makes the repository model explicit, distinguishes detected drift from command failure, and describes idempotent full reconciliation.

.github/skills/standup-a-repo/SKILL.md

SKILL.mdDefine safe draft workflow for upstream contributions+5/-1

Define safe draft workflow for upstream contributions

• Allows drafts only from a clean published presentation branch while continued work and re-squashing remain isolated on the dirty branch.

.github/skills/upstream-contribution-workflow/SKILL.md

SKILL.mdReference hub-owned required-check payloads+1/-1

Reference hub-owned required-check payloads

• Updates workflow naming guidance so ruleset-bound job names remain synchronized with live rulesets and hub configuration payloads.

.github/skills/workflow-ci-contract/SKILL.md

AGENTS.mdRoute agents to architecture and new operational skills+14/-3

Route agents to architecture and new operational skills

• Moves project design guidance to 'ARCHITECTURE.md', adds execution-boundary rules, and routes linting, testing, review, PR driving, release, host-tool, and local-review tasks to their canonical skills.

AGENTS.md

ARCHITECTURE.mdAdd dedicated PhotoCleaner architecture reference+227/-0

Add dedicated PhotoCleaner architecture reference

• Extracts project structure, command behavior, processing pipelines, data stores, media conversion, undo logic, and testing patterns from Copilot instructions. Corrects stale file references, supported extensions, conversion tiers, and metadata-write behavior.

ARCHITECTURE.md

AUDIT.mdSwitch repository audits to hub-owned baselines+6/-58

Switch repository audits to hub-owned baselines

• Replaces embedded settings, ruleset, and secret comparison procedures with canonical hub commands. Keeps repository-specific scope, expected ruleset count, and verdict handling concise.

AUDIT.md

CODESTYLE.mdRoute verification to operations and strengthen hooks+4/-4

Route verification to operations and strengthen hooks

• Moves known-working local verification references to 'OPERATIONS.md', strongly recommends canonical pre-commit gates, and adds shfmt to shell clean compilation.

CODESTYLE.md

GOVERNANCE.mdResync fleet governance and centralize configuration ownership+35/-76

Resync fleet governance and centralize configuration ownership

• Adds connector write-safety, repo-scoped secret conventions, stronger verification rules, and expanded PR review behavior. Updates reusable workflow guidance and removes local ruleset and secret payloads from the repository layout.

GOVERNANCE.md

OPERATIONS.mdPromote local verification to an explicit operational contract+4/-3

Promote local verification to an explicit operational contract

• Renames and expands local verification to distinguish CI coverage from manual media and Immich checks. Removes the retired local repo-config directory from the layout.

OPERATIONS.md

WORKFLOW.mdCorrect PhotoCleaner CI and release contract documentation+33/-38

Correct PhotoCleaner CI and release contract documentation

• Aligns path filtering, aggregator dependencies, release planning, artifact names, source-only reuse, and target descriptions with the current workflow architecture. Corrects stale scenarios that described an older unconditional smoke-build and publisher shape.

WORKFLOW.md

host-tools.jsonRemove the obsolete local secret-manifest reference+1/-1

Remove the obsolete local secret-manifest reference

• Updates the host-tool note after 'spec/secrets.json' moved to hub-only ownership.

host-tools.json

Other (6) +16 / -43
.editorconfigAlign editor defaults with fleet-wide LF normalization+3/-7

Align editor defaults with fleet-wide LF normalization

• Condenses line-ending guidance around LF defaults, Git fallback normalization, and CI byte verification. Clarifies that non-.NET repositories retain the inert .NET section under the whole-file model.

.editorconfig

.gitattributesNormalize detected text globally with explicit Windows exceptions+6/-30

Normalize detected text globally with explicit Windows exceptions

• Replaces byte-preserving defaults and path-specific LF pins with global 'text=auto eol=lf'. Keeps '.bat' and '.cmd' files on CRLF.

.gitattributes

merge-bot-pull-request.ymlBump the reusable merge-bot workflow+1/-1

Bump the reusable merge-bot workflow

• Updates the pinned ProjectTemplate merge-bot workflow from 2.0.338 to 2.0.380.

.github/workflows/merge-bot-pull-request.yml

test-pull-request.ymlRefresh PR filter, validation, and build dependencies+3/-3

Refresh PR filter, validation, and build dependencies

• Bumps 'dorny/paths-filter' to 4.0.3 and updates reusable validation and release-build workflows to the synchronized hub commit.

.github/workflows/test-pull-request.yml

pre-commitSuppress the generated Husky source warning+1/-0

Suppress the generated Husky source warning

• Documents and suppresses shellcheck SC1091 for the generated Husky helper that is absent during linting.

.husky/pre-commit

cspell.jsonRefresh the shared spelling vocabulary+2/-2

Refresh the shared spelling vocabulary

• Removes obsolete generated artifact terms and adds current agent and reviewer names.

cspell.json

@ptr727

Copy link
Copy Markdown
OwnerAuthor

Closing: develop -> main has a real conflict in 3 workflow files (main independently bumped the same hub-workflow pins via its own Dependabot; develop's resync bumped them further along the same lineage, confirmed via git merge-base --is-ancestor - pure supersession). develop's required_linear_history/PR-only ruleset forbids resolving the conflict on develop itself, so per the branch-protection-and-promotion skill's documented procedure, resolving on a throwaway branch off main instead: #91.

@ptr727ptr727 closed this Aug 29, 2026
@ptr727ptr727 mentioned this pull request Aug 29, 2026

CopilotAI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

🟡 Changes recommended

Two Markdown files introduce inline links where the repo’s doc-style contract requires reference-style links, and the missing reference definitions would leave inconsistent navigation/style.

Once you've addressed the issues Copilot identified, you can request another Copilot review.

Pull request overview

Promotes the current develop branch to main, bringing the repository’s carried governance/skills/workflow contract and CI wiring in line with the latest hub state, while retiring previously-carried hub payloads now meant to be checked from a hub checkout.

Changes:

  • Converge workflow/governance/skills documentation and contracts to the latest hub canonical.
  • Retire carried repo-config/* and spec/secrets.json payloads in favor of hub-hosted checks.
  • Update GitHub Actions callers/pins and related operational documentation; add ARCHITECTURE.md.
File summaries
FileDescription
WORKFLOW.mdUpdate CI/CD workflow contract text
spec/secrets.jsonRemove retired carried secrets manifest
repo-config/settings.jsonRemove retired carried settings payload
repo-config/README.mdRemove retired carried repo-config docs
repo-config/main.jsonRemove retired carried ruleset payload
repo-config/develop.jsonRemove retired carried ruleset payload
OPERATIONS.mdAdd local verification section; adjust pointers
host-tools.jsonUpdate/normalize host tool note formatting
GOVERNANCE.mdRefresh governance wording and references
cspell.jsonUpdate cspell word list entries
CODESTYLE.mdUpdate style guidance and references
AUDIT.mdSwitch audit procedure to hub-hosted tooling
ARCHITECTURE.mdAdd architecture/pipeline/test layout doc
AGENTS.mdRoute architecture content to ARCHITECTURE.md
.vscode/tasks.jsonSequence .NET format/build task dependencies
.husky/pre-commitAdd shellcheck directive for Husky bootstrap
.github/workflows/test-pull-request.ymlBump pinned actions / hub workflow SHAs
.github/workflows/publish-release.ymlBump pins; gate publish on validate success
.github/workflows/merge-bot-pull-request.ymlBump merge-bot reusable workflow pin
.github/skills/workflow-ci-contract/SKILL.mdResync workflow CI contract skill text
.github/skills/upstream-contribution-workflow/SKILL.mdClarify upstream draft iteration procedure
.github/skills/standup-a-repo/SKILL.mdUpdate standup procedure for hub checks
.github/skills/skill-lifecycle/SKILL.mdClarify commit authorization phrasing
.github/skills/shell-codestyle/SKILL.mdExpand shell formatting/linting contract
.github/skills/resync-a-repo/SKILL.mdAdd hub defect filing guidance; update checks
.github/skills/repo-worktree/SKILL.mdRefine worktree/clone guidance and cleanup rules
.github/skills/python-codestyle/SKILL.mdClarify build vs lint-only Python profiles
.github/skills/python-codestyle/references/testing.mdNote build-profile-only testing conventions
.github/skills/python-codestyle/references/code-style.mdDocument Python-version hedging rule
.github/skills/pr-review-conduct/SKILL.mdExpand review loop guidance and tooling notes
.github/skills/operational-vs-release-workflow/SKILL.mdAdd cleanup rule; clarify promotion guidance
.github/skills/operational-vs-release-workflow/references/release-publish-mechanics.mdUpdate publish mechanics terminology
.github/skills/operational-vs-release-workflow/references/branch-protection-and-promotion.mdUpdate branch protection/promotion procedure
.github/skills/merge-and-release/SKILL.mdAdd merge-and-release skill documentation
.github/skills/local-strict-review/SKILL.mdAdd local strict review skill documentation
.github/skills/git-commit-conventions/SKILL.mdAdd narrow post-squash cleanup exception
.github/skills/drive-pr/SKILL.mdAdd drive-pr skill documentation
.github/skills/dotnet-codestyle/SKILL.mdStrengthen local hook guidance for .NET
.github/skills/dotnet-codestyle/references/project-config.mdAdd nullable/XML-doc guidance note
.github/skills/dotnet-codestyle/references/conventions.mdExpand XML-doc example to full method
.github/skills/copilot-instructions-keeper/SKILL.mdUpdate section count and preservation guidance
.github/skills/comment-and-doc-style/SKILL.mdUpdate doc-style contract and examples
.github/skills/comment-and-doc-style/references/line-endings.mdUpdate line-ending contract and exceptions
.github/skills/comment-and-doc-style/references/carried-doc-references.mdRemove retired carried paths from list
.github/skills/audit-a-repo/SKILL.mdUpdate audit guidance to hub-hosted checks
.github/skills/agent-conduct/SKILL.mdAdd boundaries/verification clarifications
.gitattributesNormalize text to LF; CRLF for bat/cmd
.editorconfigAlign commentary with new gitattributes model
Review details

Suppressed comments (2)

ARCHITECTURE.md:227

  • After switching to a reference-style link, add the corresponding link definition at the bottom of the document (grouped under an HTML comment header).
    WORKFLOW.md:297
  • The [workflows] reference is used for the .github/workflows/ directory link but is missing from the link-definition block at the bottom of the file.
  • Files reviewed: 49/49 changed files
  • Comments generated: 2
  • Review effort level: Lite

💡 Configure MCP servers for context-aware, tailored reviews. Learn more in the docs.

Comment threadWORKFLOW.md
# WORKFLOW.md

The guide for CI/CD **workflows** (GitHub Actions): a deliberate mixture of code style, architecture, a **behavioral contract** (expected inputs and outputs), and a **test methodology**. Code style lives in [`CODESTYLE.md`][codestyle]. This file is its sibling for everything under [`.github/workflows/`][workflows].
The guide for CI/CD **workflows** (GitHub Actions): a deliberate mixture of code style, architecture, a **behavioral contract** (expected inputs and outputs), and a **test methodology**. Code style lives in [`CODESTYLE.md`][codestyle]. This file is its sibling for everything under `.github/workflows/`.
Comment threadARCHITECTURE.md

## Development Workflow

See [`CODESTYLE.md`](./CODESTYLE.md) for build requirements, formatting commands, and tooling.
@qodo-code-review

Copy link
Copy Markdown

Code Review by Qodo

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

Grey Divider


Remediation recommended

1. Import database can be clobbered 🐞 Bug⚙ Maintainability
Description
The new import documentation guarantees that process and index cannot write source-path rows,
but both use IndexTask against their supplied database path. A user following this guidance can
pass Import.db to either command and have an existing source row’s hashes/metadata updated (and
its processed state reset on a content change), invalidating the stated deduplication guarantee.
Code

ARCHITECTURE.md[133]

+- **`import` subcommand** (formerly `organize`): Copies (default) or moves supported media files from `--path` sources into `--outpath/date/filename` directory structure. Date comes from EXIF metadata (falls back to `DateTime.MinValue` -> `"0001/01/01"` bucket when absent). `--format` (default `"yyyy/MM/dd"`) controls subdirectory naming and is validated as a date-only format (no time components). Uses `GetUniqueFileName` for collision handling (`foo_1.jpg` etc.). Parallel via `--threads` (same as `process`). `--deleteempty` (default `false`) deletes empty child subdirectories from `--outpath` after all files are imported. `--move` (default `false`) moves files instead of copying. `--tagpath` (default `false`) splits the source sub-directory path into tokens and writes each token as an `XMP:Subject` tag on the destination file using exiftool. It is filtered by `s_exiftoolWriteExtensions` (`.3gp`, `.arw`, `.cr2`, `.dng`, `.gif`, `.heic`, `.heif`, `.jpeg`, `.jpg`, `.mov`, `.mp4`, `.nef`, `.orf`, `.png`, `.psd`, `.rw2`, `.tif`, `.tiff`) checked via `meta.FileTypeExtension`, and uses `-XMP:Subject-= / -XMP:Subject+=` to prevent duplicates while preserving existing tags. `--tags <string>` (optional) applies explicit comma-separated `XMP:Subject` tags to every imported file. `--datepath` (default `false`) infers the EXIF creation date from the source file path when no date is already embedded, then applies the date to the destination file before restoring mtime. **`--db <sqlite-file>` (Import.db) is the source-side dedup DB**: rows are keyed by `path = source_path` (NOT dest path) and hold the source file's hash/size/mtime. On each source file, import calls `GetByPathAsync(source_path)` for source-side hash caching, then `Sha256ExistsAsync(source_hash)` to skip already-imported sources. New imports insert a row at the source path. **No command outside `import` writes to source-keyed rows**, so dedup cannot be clobbered by later runs of `process`/`index`. `--trashdb <sqlite-file>` skips files whose **source-file** SHA-1 is in Trash.db. When import rewrites the destination via `--tags`/`--tagpath`/`--datepath`, its SHA-1 differs from the source SHA-1. Immich stored the destination SHA-1 from a prior upload, so the trash match is missed here and caught later by `process --trashdb`. `--skipdb <sqlite-file>` skips files whose SHA-256 matches a reference DB (read-only). Cross-collection dedup is typically implemented by pointing `--skipdb` at another collection's Import.db. `--rehash` forces recomputation of all hashes ignoring the size/mtime cache.
Evidence
The added statement asserts exclusivity that the database implementation and process pipeline do not
enforce: indexing is path-keyed against whichever database is provided, and processing invokes that
same indexing operation.

ARCHITECTURE.md[133-133]
PhotoCleaner/IndexTask.cs[25-46]
PhotoCleaner/IndexTask.cs[50-77]
PhotoCleaner/ProcessTask.cs[103-110]

Agent prompt
The issue below was found during a code review. Follow the provided context and guidance below and implement a solution
## Issue description
`ARCHITECTURE.md` incorrectly states that only `import` writes source-keyed rows and that later `process`/`index` runs therefore cannot clobber import deduplication records. Both commands use `IndexTask` with their caller-provided database, so they can modify the same `Import.db` when it is supplied.
## Issue Context
`IndexTask.IndexFileAsync` looks up, inserts, and updates records by the supplied file path. `process` invokes this task before processing each file. Revise the import database guidance to describe the isolation requirement (use separate DB files) rather than claiming command-level enforcement.
## Fix Focus Areas
- ARCHITECTURE.md[133-133]
- PhotoCleaner/IndexTask.cs[25-77]
- PhotoCleaner/ProcessTask.cs[103-110]

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


Grey Divider

Context sources
✅ Compliance rules (platform): 13 rules
✅ Web pages:
+2 more
Review mode: 🧠 Deep: This broad resync changes CI/release workflows, repository governance/configuration, and many independent skill/documentation paths across 49 files and 103 hunks, creating a dense set of easy-to-miss contract and behavior defects.

Grey Divider

Tip of the day
💡 Did you know, you can group findings by type and pick your Finding display, from Minimal to Full

More tips ↗ | Customize Qodo ↗ | Qodo docs ↗

Grey Divider

Qodo Logo

Comment threadARCHITECTURE.md
- **Optional `--threads` Parameter**: Controls parallel processing degree with `DefaultValueFactory = _ => Math.Min(Environment.ProcessorCount, 4)`. Validated to be > 0 and <= Environment.ProcessorCount using `Validators.Add()` (process, import, index)
- **Optional `--skipbackup` Flag** (process only): Skips all `.bak` file creation, originals are deleted/overwritten in-place. Logs a warning at startup. Disables undo.
- **Optional `--deleteempty` Flag** (process, import): After the command completes, deletes empty child subdirectories from the target directory (deepest first, while the target root is never deleted). For `process` the target is `--path` (operated on in-place), and for `import` it is `--outpath`. Implemented by `DirectoryCleaner.DeleteEmptyDirectories(root, dryRun)`.
- **`import` subcommand** (formerly `organize`): Copies (default) or moves supported media files from `--path` sources into `--outpath/date/filename` directory structure. Date comes from EXIF metadata (falls back to `DateTime.MinValue` -> `"0001/01/01"` bucket when absent). `--format` (default `"yyyy/MM/dd"`) controls subdirectory naming and is validated as a date-only format (no time components). Uses `GetUniqueFileName` for collision handling (`foo_1.jpg` etc.). Parallel via `--threads` (same as `process`). `--deleteempty` (default `false`) deletes empty child subdirectories from `--outpath` after all files are imported. `--move` (default `false`) moves files instead of copying. `--tagpath` (default `false`) splits the source sub-directory path into tokens and writes each token as an `XMP:Subject` tag on the destination file using exiftool. It is filtered by `s_exiftoolWriteExtensions` (`.3gp`, `.arw`, `.cr2`, `.dng`, `.gif`, `.heic`, `.heif`, `.jpeg`, `.jpg`, `.mov`, `.mp4`, `.nef`, `.orf`, `.png`, `.psd`, `.rw2`, `.tif`, `.tiff`) checked via `meta.FileTypeExtension`, and uses `-XMP:Subject-= / -XMP:Subject+=` to prevent duplicates while preserving existing tags. `--tags <string>` (optional) applies explicit comma-separated `XMP:Subject` tags to every imported file. `--datepath` (default `false`) infers the EXIF creation date from the source file path when no date is already embedded, then applies the date to the destination file before restoring mtime. **`--db <sqlite-file>` (Import.db) is the source-side dedup DB**: rows are keyed by `path = source_path` (NOT dest path) and hold the source file's hash/size/mtime. On each source file, import calls `GetByPathAsync(source_path)` for source-side hash caching, then `Sha256ExistsAsync(source_hash)` to skip already-imported sources. New imports insert a row at the source path. **No command outside `import` writes to source-keyed rows**, so dedup cannot be clobbered by later runs of `process`/`index`. `--trashdb <sqlite-file>` skips files whose **source-file** SHA-1 is in Trash.db. When import rewrites the destination via `--tags`/`--tagpath`/`--datepath`, its SHA-1 differs from the source SHA-1. Immich stored the destination SHA-1 from a prior upload, so the trash match is missed here and caught later by `process --trashdb`. `--skipdb <sqlite-file>` skips files whose SHA-256 matches a reference DB (read-only). Cross-collection dedup is typically implemented by pointing `--skipdb` at another collection's Import.db. `--rehash` forces recomputation of all hashes ignoring the size/mtime cache.

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

1. Import database can be clobbered 🐞 Bug⚙ Maintainability

The new import documentation guarantees that process and index cannot write source-path rows,
but both use IndexTask against their supplied database path. A user following this guidance can
pass Import.db to either command and have an existing source row’s hashes/metadata updated (and
its processed state reset on a content change), invalidating the stated deduplication guarantee.
Agent Prompt
## Issue description
`ARCHITECTURE.md` incorrectly states that only `import` writes source-keyed rows and that later `process`/`index` runs therefore cannot clobber import deduplication records. Both commands use `IndexTask` with their caller-provided database, so they can modify the same `Import.db` when it is supplied.
## Issue Context
`IndexTask.IndexFileAsync` looks up, inserts, and updates records by the supplied file path. `process` invokes this task before processing each file. Revise the import database guidance to describe the isolation requirement (use separate DB files) rather than claiming command-level enforcement.
## Fix Focus Areas
- ARCHITECTURE.md[133-133]
- PhotoCleaner/IndexTask.cs[25-77]
- PhotoCleaner/ProcessTask.cs[103-110]

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

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

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@ptr727