Skip to content

fix(manifest): restore agentGlobalFreezeOverride for the operator-private config source - #4410

Merged
JSONbored merged 1 commit into
mainfrom
claude/fix-freeze-override-private-yml-only
Jul 9, 2026
Merged

fix(manifest): restore agentGlobalFreezeOverride for the operator-private config source#4410
JSONbored merged 1 commit into
mainfrom
claude/fix-freeze-override-private-yml-only

Conversation

@JSONbored

Copy link
Copy Markdown
Owner

Summary

  • fix(manifest): keep freeze override operator-only #4391 correctly closed a scope leak where a repo's own committed .gittensory.yml could grant itself an exemption from the operator's fleet-wide agent freeze — but it removed agentGlobalFreezeOverride from manifest parsing entirely, leaving raw, undocumented DB writes as the only way to set it at all, even for the operator's own private self-host config.
  • The operator's private, container-local config (source: "api_record", produced by loadRepoFocusManifestWithCachePolicy for self-host installs) is a fundamentally different trust boundary from a repo maintainer's public, git-committed manifest (source: "repo_file") — it's edited only by whoever has filesystem access to the operator's own config directory, never by a repo's maintainers.
  • Restores parsing of settings.agentGlobalFreezeOverride, gated strictly on source === "api_record". A repo-owned manifest still has the field silently dropped (with a new operator-only warning, not a normal "invalid value" one, so a contributor-facing preview never teaches a non-operator the field exists), preserving fix(manifest): keep freeze override operator-only #4391's fix exactly. The operator's own private config can set it again as config-as-code, matching this project's "every operator-facing control is global-default + per-repo-override config, not raw DB writes" convention — instead of the emergency-only direct-DB-UPDATE workaround this bug forced.

Scope

Validation

  • git diff --check
  • npm run typecheck
  • npx vitest run test/unit/focus-manifest.test.ts — 570/570 pass (includes 2 new dedicated tests for both source paths, plus the doc-drift exhaustiveness check updated for the new operator-only exclusion)
  • npm run actionlint / npm run test:workers / npm run build:mcp / npm run test:mcp-pack / npm run ui:openapi:check / npm run ui:lint / npm run ui:typecheck / npm run ui:build / npm audit — not run locally for this focused change; relying on CI (validate) for the full gate.
  • New or changed behavior has unit/integration tests for new branches, fallback paths, and sanitizer boundaries — added a dedicated describe block covering both source: "api_record" (allowed) and source: "repo_file" (dropped + warned) explicitly, plus updated the pre-existing multi-field parse test and the docs-drift exhaustiveness check.

If any required check was skipped, explain why:

  • This is a narrow, single-file-pair fix; the full npm run test:ci gate is left to CI per the repo's own established practice for this size of change.

Safety

  • No secrets, wallet details, hotkeys, coldkeys, user PATs, private keys, raw trust scores, private rankings, or private maintainer evidence are exposed.
  • Public GitHub text stays sanitized — the new warning message is deliberately generic ("operator-only, not settable from a repo-owned manifest") and never echoes an operator's actual config.
  • Auth, cookie, CORS, GitHub App, Cloudflare, or session changes include negative-path tests. — N/A, no auth/session surface touched.
  • API/OpenAPI/MCP behavior is updated and tested where needed. — N/A, this field was never exposed via OpenAPI/the dashboard API (confirmed via grep); only the yml-parsing layer changed.
  • UI changes use live API data or real empty/error/loading states, not production mock/demo fallbacks. — N/A, no UI changes.
  • Visible UI changes include a UI Evidence section. — N/A, no UI changes.
  • Public docs/changelogs are updated where needed. — N/A; deliberately did NOT re-add this field to .gittensory.yml.example/config/examples/gittensory.full.yml (the public templates), since it must never appear as something a repo maintainer can self-serve.

Notes

…vate config source

#4391 correctly closed the scope leak where a repo's own committed .gittensory.yml
could grant itself an exemption from the operator's fleet-wide freeze, but it also
removed the field from parsing entirely -- leaving raw DB writes as the only way to
set it, even for the operator's own private self-host config (source: "api_record"),
which is a different, already-trusted actor from a repo maintainer.

Restores parsing gated strictly on source === "api_record": a repo-owned manifest
(source: "repo_file") still has the field silently dropped with an operator-only
warning, preserving #4391's fix, while the operator's private container-local yml
can set it again as config-as-code instead of an undocumented DB write.
@superagent-security

Copy link
Copy Markdown
Contributor

Superagent didn't find any vulnerabilities or security issues in this PR.

@cloudflare-workers-and-pages

Copy link
Copy Markdown

Deploying with  Cloudflare Workers  Cloudflare Workers

The latest updates on your project. Learn more about integrating Git with Workers.

Status Name Latest Commit Preview URL Updated (UTC)
✅ Deployment successful!
View logs
gittensory-ui d0c4dd9 Commit Preview URL

Branch Preview URL
Jul 09 2026, 10:47 AM

@JSONbored
JSONbored merged commit 9ab4146 into main Jul 9, 2026
9 checks passed
@JSONbored
JSONbored deleted the claude/fix-freeze-override-private-yml-only branch July 9, 2026 10:47
@codecov

codecov Bot commented Jul 9, 2026

Copy link
Copy Markdown

Codecov Report

✅ All modified and coverable lines are covered by tests.
✅ Project coverage is 93.96%. Comparing base (90943c9) to head (d0c4dd9).
⚠️ Report is 3 commits behind head on main.
✅ All tests successful. No failed tests found.

Additional details and impacted files
@@           Coverage Diff           @@
##             main    #4410   +/-   ##
=======================================
  Coverage   93.96%   93.96%           
=======================================
  Files         401      401           
  Lines       36902    36908    +6     
  Branches    13494    13497    +3     
=======================================
+ Hits        34676    34682    +6     
  Misses       1570     1570           
  Partials      656      656           
Files with missing lines Coverage Δ
packages/gittensory-engine/src/focus-manifest.ts 99.09% <100.00%> (+<0.01%) ⬆️
🚀 New features to boost your workflow:
  • 📦 JS Bundle Analysis: Save yourself from yourself by tracking and limiting bundle sizes in JS merges.

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

Labels

None yet

Development

Successfully merging this pull request may close these issues.

1 participant