Conversation
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.
Warning Review limit reachedNext included review available in 2 minutes. View limit detailsLimit 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. Review configuration: ⚙️ Run configurationConfiguration used: Organization UI Review profile: ASSERTIVE Plan: Pro Plus Run ID: 📒 Files selected for processing (49)
Comment |
PR Summary by QodoResync Fleet Governance and Harden Release Validation
AI Description
Diagram
High-Level Assessment
Files changed (44) |
ptr727
commented
Aug 29, 2026
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. |
There was a problem hiding this comment.
🟡 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/*andspec/secrets.jsonpayloads in favor of hub-hosted checks. - Update GitHub Actions callers/pins and related operational documentation; add
ARCHITECTURE.md.
File summaries
| File | Description |
|---|---|
| WORKFLOW.md | Update CI/CD workflow contract text |
| spec/secrets.json | Remove retired carried secrets manifest |
| repo-config/settings.json | Remove retired carried settings payload |
| repo-config/README.md | Remove retired carried repo-config docs |
| repo-config/main.json | Remove retired carried ruleset payload |
| repo-config/develop.json | Remove retired carried ruleset payload |
| OPERATIONS.md | Add local verification section; adjust pointers |
| host-tools.json | Update/normalize host tool note formatting |
| GOVERNANCE.md | Refresh governance wording and references |
| cspell.json | Update cspell word list entries |
| CODESTYLE.md | Update style guidance and references |
| AUDIT.md | Switch audit procedure to hub-hosted tooling |
| ARCHITECTURE.md | Add architecture/pipeline/test layout doc |
| AGENTS.md | Route architecture content to ARCHITECTURE.md |
| .vscode/tasks.json | Sequence .NET format/build task dependencies |
| .husky/pre-commit | Add shellcheck directive for Husky bootstrap |
| .github/workflows/test-pull-request.yml | Bump pinned actions / hub workflow SHAs |
| .github/workflows/publish-release.yml | Bump pins; gate publish on validate success |
| .github/workflows/merge-bot-pull-request.yml | Bump merge-bot reusable workflow pin |
| .github/skills/workflow-ci-contract/SKILL.md | Resync workflow CI contract skill text |
| .github/skills/upstream-contribution-workflow/SKILL.md | Clarify upstream draft iteration procedure |
| .github/skills/standup-a-repo/SKILL.md | Update standup procedure for hub checks |
| .github/skills/skill-lifecycle/SKILL.md | Clarify commit authorization phrasing |
| .github/skills/shell-codestyle/SKILL.md | Expand shell formatting/linting contract |
| .github/skills/resync-a-repo/SKILL.md | Add hub defect filing guidance; update checks |
| .github/skills/repo-worktree/SKILL.md | Refine worktree/clone guidance and cleanup rules |
| .github/skills/python-codestyle/SKILL.md | Clarify build vs lint-only Python profiles |
| .github/skills/python-codestyle/references/testing.md | Note build-profile-only testing conventions |
| .github/skills/python-codestyle/references/code-style.md | Document Python-version hedging rule |
| .github/skills/pr-review-conduct/SKILL.md | Expand review loop guidance and tooling notes |
| .github/skills/operational-vs-release-workflow/SKILL.md | Add cleanup rule; clarify promotion guidance |
| .github/skills/operational-vs-release-workflow/references/release-publish-mechanics.md | Update publish mechanics terminology |
| .github/skills/operational-vs-release-workflow/references/branch-protection-and-promotion.md | Update branch protection/promotion procedure |
| .github/skills/merge-and-release/SKILL.md | Add merge-and-release skill documentation |
| .github/skills/local-strict-review/SKILL.md | Add local strict review skill documentation |
| .github/skills/git-commit-conventions/SKILL.md | Add narrow post-squash cleanup exception |
| .github/skills/drive-pr/SKILL.md | Add drive-pr skill documentation |
| .github/skills/dotnet-codestyle/SKILL.md | Strengthen local hook guidance for .NET |
| .github/skills/dotnet-codestyle/references/project-config.md | Add nullable/XML-doc guidance note |
| .github/skills/dotnet-codestyle/references/conventions.md | Expand XML-doc example to full method |
| .github/skills/copilot-instructions-keeper/SKILL.md | Update section count and preservation guidance |
| .github/skills/comment-and-doc-style/SKILL.md | Update doc-style contract and examples |
| .github/skills/comment-and-doc-style/references/line-endings.md | Update line-ending contract and exceptions |
| .github/skills/comment-and-doc-style/references/carried-doc-references.md | Remove retired carried paths from list |
| .github/skills/audit-a-repo/SKILL.md | Update audit guidance to hub-hosted checks |
| .github/skills/agent-conduct/SKILL.md | Add boundaries/verification clarifications |
| .gitattributes | Normalize text to LF; CRLF for bat/cmd |
| .editorconfig | Align 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.
| # 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/`. |
| ## Development Workflow | ||
| See [`CODESTYLE.md`](./CODESTYLE.md) for build requirements, formatting commands, and tooling. |
Code Review by Qodo
1. Import database can be clobbered |
| - **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. |
There was a problem hiding this comment.
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
Promotes the hub resync (#86, #87, #89) plus two pending Dependabot bumps (#79, #74) from
developtomain.Resync summary
Converges
AGENTS.md/GOVERNANCE.md's verbatim sections, the.github/skills/tree, and theremaining 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 andspec/secrets.json(now checked from a hubcheckout rather than carried locally). Rewrites
.github/copilot-instructions.mdto the hub'scondensed 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'spublishjobwas missing a
needs.validate.result == 'success'gate, and.vscode/tasks.json's.NET Formattask had an unordered CSharpier/build race. Also fixes roughly two dozen content-accuracy bugs in
ARCHITECTURE.md/WORKFLOW.mdthat 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_discussionsenabled 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