After conversation on irc it appears there's some cases where Bitcoin core will serve feerate information even though it loaded a fairly old fee estimates file and is still syncing the chain. This is pretty dangerous for lightning nodes, at least on legacy channels or pre-package-relay.

The immediate improvement would be to store fee estimates to disk once an hour or so to reduce the chance of having an old file. From there this case could probably be detected and refuse to serve estimates until we sync.
connOptions.m_i2p_accept_incoming = args.GetBoolArg("-i2pacceptincoming", DEFAULT_I2P_ACCEPT_INCOMING);
    if (!node.connman->Start(*node.scheduler, connOptions)) {
        return false;
    }
     ********************************************************* Step 13: finished
     At this point, the RPC is "started", but still in warmup, which means it
     cannot yet be called. Before we make it callable, we need to make sure
     that the RPC's view of the best block is valid and consistent with
     ChainstateManager's active tip.
    
     If we do not do this, RPC's view of the best block will be height=0 and
     hash=0x0. This will lead to erroroneous responses for things like
     waitforblockheight.
    RPCNotifyBlockChange(WITH_LOCK(chainman.GetMutex(), return chainman.ActiveTip()));
    SetRPCWarmupFinished();
    uiInterface.InitMessage(_("Done loading").translated);
    for (const auto& client : node.chain_clients) {
        client->start(*node.scheduler);
    }
    BanMan* banman = node.banman.get();
    node.scheduler->scheduleEvery([banman]{
        banman->DumpBanlist();
    }, DUMP_BANS_INTERVAL);
    if (node.peerman) node.peerman->StartScheduledTasks(*node.scheduler);
#if HAVE_SYSTEM
    StartupNotify(args);
#endif
    return true;
}