text: Title: Fact caching with smart gathering can miss facts when plays use different gather_subset sets
  Body: ### Summary
  
  The lack of ability to set a global `gather_subset` means that when using fact caching with `gather_facts: smart`, the facts collected are determined by the `gather_subset` of the first play that runs. Subsequent plays that request different fact subsets via their own `gather_subset` configuration will not receive those additional facts because:
  
  1. The first play/block/task caches its collected facts based on its `gather_subset`
  2. Later plays/blocks/tasks see the facts are cached (due to smart gathering)
  3. No new fact gathering occurs until the cache times out even though different subsets are requested
  4. This leads to missing facts that were explicitly requested by later plays
  
  This creates a potential issue where plays/blocks/tasks using the same cache location must maintain identical `gather_subset` configurations to ensure all required facts are available when using fact caching with smart gathering. It seems like there should either be a way to specify a global `gather_subset` or smart gathering should be able to determine if some new facts need to be added to the facts cache due to the subset being expanded on later plays.
  
  
  
  ### Issue Type
  
  Bug Report
  
  ### Component Name
  
  lib/ansible/module_utils/facts/collector.py
  
  ### Ansible Version
  
  ```console
  $ ansible --version
  ansible [core 2.18.1]
    config file = None
    configured module search path = ['/home/raddessi/.ansible/plugins/modules', '/usr/share/ansible/plugins/modules']
    ansible python module location = /home/raddessi/.conda/envs/ansible-3.11/lib/python3.11/site-packages/ansible
    ansible collection location = /home/raddessi/.ansible/collections:/usr/share/ansible/collections
    executable location = /home/raddessi/.conda/envs/ansible-3.11/bin/ansible
    python version = 3.11.11 | packaged by conda-forge | (main, Dec  5 2024, 14:17:24) [GCC 13.3.0] (/home/raddessi/.conda/envs/ansible-3.11/bin/python3.11)
    jinja version = 3.1.5
    libyaml = True
  ```
  
  
  ### Configuration
  
  ```console
  # if using a version older than ansible-core 2.12 you should omit the '-t all'
  $ ansible-config dump --only-changed -t all
  CONFIG_FILE() = None
  EDITOR(env: EDITOR) = code
  PAGER(env: PAGER) = less
  ```
  
  
  ### OS / Environment
  
  not relevant but confirmed on fedora 41 and debian 10
  
  ### Steps to Reproduce
  
  I've set up an integration test to document the failure that you can see [at this branch](https://github.com/ansible/ansible/compare/devel...raddessi:ansible:devel.gather_subset_caching?expand=1), here is a high level summary:
  
  env settings
  ```bash
  ANSIBLE_GATHERING=smart
  ANSIBLE_CACHE_PLUGIN=jsonfile
  ANSIBLE_CACHE_PLUGIN_CONNECTION=./cache
  ```
  
  playbook1
  ```yaml
  # First play, facts cached here will be minimal
  - hosts: testhost
    module_defaults:
      ansible.builtin.gather_facts:
        gather_subset: ["!all"]  # can be changed to  ["!all", "hardware"] to resolve the issue
    tasks:
      - name: ensure facts are gathered
        assert:
          that:
              - ansible_facts is defined and 'fqdn' in ansible_facts
  ```
  
  ```yaml
  # Second play, hardware facts not available despite being requested
  - hosts: testhost
    module_defaults:
      ansible.builtin.gather_facts:
        gather_subset: ["hardware"]
    tasks:
      - name: ensure the hardware facts are present
        assert:
          that:
              - ansible_facts is defined and 'processor_cores' in ansible_facts
  ```
  
  
  
  ### Expected Results
  
  I expected to be able to use facts that were specified but since the cache already exists it was returned as-is even though it only contains a subset of the facts that were requested.
  
  ### Actual Results
  
  ```console
  TASK [ensure the hardware facts are present] ***********************************
  fatal: [testhost]: FAILED! => {
      "assertion": "ansible_facts is defined and 'processor_cores' in ansible_facts",
      "changed": false,
      "evaluated_to": false,
      "msg": "Assertion failed"
  }
  
  PLAY RECAP *********************************************************************
  testhost                   : ok=0    changed=0    unreachable=0    failed=1    skipped=0    rescued=0    ignored=0   
  
  NOTICE: To resume at this test target, use the option: --start-at gather_subset_caching
  FATAL: Command "./runme.sh" returned exit status 2.
  FATAL: Command "podman exec ansible-test-controller-uYaUDvjx /usr/bin/env ANSIBLE_TEST_CONTENT_ROOT=/root/ansible LC_ALL=en_US.UTF-8 /usr/bin/python3.13 /root/ansible/bin/ansible-test integration --allow-destructive --containers '{}' --truncate 187 --color yes --host-path test/results/.tmp/host-a2osvri4 --metadata test/results/.tmp/metadata-yyow8ew_.json -- gather_subset_caching" returned exit status 1.
  ```
  
  
  ### Code of Conduct
  
  - [X] I agree to follow the Ansible Code of Conduct