Yes, that question exposed that my previous description was too strong.
The strip list was not closed over every route that can reach Git configuration. GIT_CONFIG_PARAMETERS was indeed missing, and treating the existing list as “the Git Authority/config override surfaces” overstated what it actually established.
I also do not think the right replacement boundary is “everything currently demonstrated to change the ls-files --sparse -z answer.”
I still do not have a GIT_CONFIG_PARAMETERS key that changes the tracked-path set of the full-index fixture, so I am not claiming that witness.
Instead, I followed the broader question you raised: what configuration sources are allowed to participate in interpreting Profile A's local Git Authority at all?
That turned up two additional gaps with no ambient environment variable involved.
First, extensions.worktreeConfig=true can make config.worktree participate in effective configuration. I reproduced:
local core.bare=false
worktree core.bare=true
where git config --local --bool --get core.bare reports false, but ordinary effective config reports true.
Second, a repository-local include.path can produce the same split: the direct local file says core.bare=false, while an included file says true. A --local query without include-following sees only the former; effective Git configuration sees the latter.
Neither fixture changes the full-index ls-files --sparse -z path set as constructed. The issue is the qualification/consumption interpretation mismatch itself.
So I changed the Profile A boundary from a variable-strip list to a configuration-source closure.
The allowed configuration sources are now:
- the qualified repository-local config;
- the qualified worktree config when
extensions.worktreeConfig enables it.
System, global/user, command-scope, and environment-injected config are excluded from the Authority interpretation context.
That means GIT_CONFIG_PARAMETERS and GIT_CONFIG are stripped, while system/global scope is deliberately bound to a known-empty source rather than merely removing caller overrides and falling back to the host's real configuration.
Config include / includeIf is currently rejected as an unsupported representation rather than recursively followed, because it introduces another configuration dependency outside Profile A's qualification closure.
There were two more subtleties while implementing that.
One was the same:
qualified container
!=
qualified consumed object
pattern again.
Qualifying the git-dir does not qualify its config file. I confirmed that an ordinary .git/config symlink to an external file is transparently followed by Git, so the actual local-config pathname is now qualified before any Git config query reads it.
For a linked worktree, that actual local-config source is not <private-gitdir>/config; Git reads the common Git directory's config. The common-config locator is therefore the object Profile A qualifies there, while the per-worktree config.worktree, when enabled, remains attached to the private gitdir.
The other subtlety was config precedence. My first implementation switched the final binding check from --local to --worktree when worktree config was enabled. That was also wrong: --worktree is worktree-only, not a merged local+worktree view.
For example:
local core.bare=true
worktree core.bare=unset
gives:
--local → true
--worktree → unset
effective config → true
So the final core.bare / core.worktree verdict now uses Git's unscoped effective configuration, but only after the allowed local/worktree sources have been qualified and every other config source has been closed. That lets Git perform its own precedence merge rather than Profile A trying to reproduce it.
The resulting boundary is roughly:
qualified Authority object
+ qualified allowed configuration sources
+ closed configuration-source universe
+ Git-native effective merge semantics
→ qualified interpretation context
The focused Git Authority suite is now 81/81 with these source-closure cases pinned.
So the answer to your original question is now: neither “only what I have already shown changes the answer” nor “arbitrarily everything that can reach config.”
The intended closure is over the configuration sources Profile A permits to participate in Authority interpretation. Individual environment variables are then just carriers that either belong inside or outside that declared boundary.
Your GIT_CONFIG_PARAMETERS example was what exposed that the earlier abstraction had not actually reached that closure yet.