Change:
<!-- Do Not Delete This! bugreporttemplate --<!-- Please read our Rules of Conduct: --<!-- Read our guide about submitting issues: --<!-- Search existing issues to avoid creating duplicates. --<!-- Test using the latest Insiders build to see if your issue has already been fixed: --<!-- Instead of creating your report here, use 'Report Issue' from the 'Help' menu in VS Code to pre-fill useful information. --<!-- Launch with to check. --Does this issue occur when all extensions are disabled?: No Problem with default extension settings. <!-- If you answered No above, use 'Help: Start Extension Bisect' from Command Palette to try to identify the cause. --<!-- Issues caused by an extension need to be reported directly to the extension publisher. The 'Help Report Issue' dialog can assist with this. --- VS Code Version: 1.64.2 OS Version: Windows 10 Pro x64 Steps to Reproduce: Behavior before updating to 1.64 version (and it's an expected result) I create extension settings in in contributes section (according to ) user opens Settings -Extensions -~someExtension~Settings user cannot delete default settings Behavior after updating to 1.64 version (and it's an actual result) I create extension settings in in contributes section (according to ) user opens Settings -Extensions -~someExtension~Settings user can delete default settings (it's a 1st issue) if get all settings by vscode.workspace.getConfiguration() - we get these deleted default settings (it's a 2nd issue) As result, the user deleted default settings, but it's still there, but not visible Video:
I think it is fine for the user to delete default settings to change the setting value away from the default. That change comes from But, the deleted settings still showing up when we fetch the configuration doesn't seem correct.
It is because of merging strategy of object value settings. For eg merging following objects results to So, this is expected. Not sure what changed in UI so leaving to you
Verification steps: and run the extension to the JSON Settings editor. the following: over to the GUI Settings editor. for the setting . that a row with the key still shows up.

Discussion:
? element.defaultValue ?? {} : {}; <ins> const elementScopeValue: Record<string, unknown> = typeof element.scopeValue === 'object' ? element.scopeValue ?? {} : {}; const data = element.isConfigured ? { ...elementDefaultValue, ...elementScopeValue } : elementDefaultValue; </ins> const { objectProperties, objectPatternProperties, objectAdditionalProperties } = element.setting; const patternsAndSchemas = Object .entries(objectPatternProperties ?? {})

([key, schema]) => ({ value: key, description: schema.description }) ); <del> let data: Record<string, unknown> = element.value ?? {}; if (element.setting.allKeysAreBoolean) { // Add on default values, because we want to display all checkboxes. data = { ...elementDefaultValue, ...data }; } </del> return Object.keys(data).map(key => { if (isDefined(objectProperties) && key in objectProperties) { <ins> const defaultValue = elementDefaultValue[key]; </ins> if (element.setting.allKeysAreBoolean) { return { key: {

} as IObjectDataItem; } <del> const defaultValue = elementDefaultValue[key]; </del> const valueEnumOptions = getEnumOptionsFromSchema(objectProperties[key]); return { key: {

newItems.push(e.item); } <ins> Object.entries(newValue).forEach(([key, value]) => { // value from the scope has changed back to the default if (scopeValue[key] !== value && defaultValue[key] === value) { delete newValue[key]; } }); const newObject = Object.keys(newValue).length === 0 ? undefined : newValue; </ins> if (template.objectCheckboxWidget) { <del> Object.entries(newValue).forEach(([key, value]) => { // A value from the scope has changed back to the default. // For the bool object renderer, we don't want to save these values. if (scopeValue[key] !== value && defaultValue[key] === value) { delete newValue[key]; } }); </del> template.objectCheckboxWidget.setValue(newItems); } else { template.objectDropdownWidget!.setValue(newItems); } <del> template.onChange?.(newValue); </del> <ins> template.onChange?.(newObject); </ins> } }