It looks like I may have found the problem.  The latest update from AT&T (4.5.141.MB860.ATT.en.US) which they pushed a few weeks ago appears to not handle a "Forever" DHCP lease properly or my router does not properly handle a DHCP lease renewal when configured for "Forever".  One does have to wonder why the phone was renewing a lease which had no timeout, and especially after only 150 seconds (allowing for the 30 second network request timeout).

Coincident with the WiFi dropping, the logs show the phone tearing down the WiFi service and restarting it after a failed lease renewal request.  Because the router has always had a "Forever" lease time, my money is on the update introducing a bug in the phone.

From my phone log (note there's a large time between the request and the renewal only because the log captures only a couple of minutes, so I had to capture a number of small log fragments before I tumbled to the DHCP connection):

    03-27 20:46:25.928 D/WifiStateTracker( 1637): DHCP request started
    ...
    03-27 20:46:27.931 D/WifiStateTracker( 1637): DHCP succeeded with lease: -1
    ...
    03-27 21:16:23.938 D/WifiStateTracker( 1637): DHCP renewal started
    ...
    03-27 21:16:53.947 D/WifiStateTracker( 1637): DHCP renewal failed: Timed out waiting for DHCP Renew to finish
    ...
    03-27 21:16:54.008 V/WifiMonitor( 1637): Event [CTRL-EVENT-STATE-CHANGE id=2 state=8 BSSID=00:00:00:00:00:00]
    03-27 21:16:54.018 V/WifiStateTracker( 1637): Changing supplicant state: COMPLETED ==> DORMANT
    03-27 21:16:54.018 I/wpa_supplicant(12515): CTRL-EVENT-DISCONNECTED - Disconnect event - remove keys
    03-27 21:16:54.018 V/WifiMonitor( 1637): Event [CTRL-EVENT-DISCONNECTED - Disconnect event - remove keys]
    03-27 21:16:54.018 I/wpa_supplicant(12515): CTRL-EVENT-STATE-CHANGE id=-1 state=8 BSSID=00:00:00:00:00:00
    03-27 21:16:54.018 D/WifiStateTracker( 1637): Reset connections and stopping DHCP
    03-27 21:16:54.028 V/WifiMonitor( 1637): Event [CTRL-EVENT-STATE-CHANGE id=-1 state=8 BSSID=00:00:00:00:00:00]
    03-27 21:16:54.048 W/Smack/Packet( 2186): notify conn break (IOEx), close connection
    ...
    03-27 21:16:55.084 D/WifiStateTracker( 1637): Disabling interface
    03-27 21:16:55.088 D/NetworkStateTracker( 1637): setDetailed state, old =CONNECTED and new state=FAILED

Since changing my router to use a two week DHCP lease, the phone has had a stable WiFi connection for an hour and a half, which is considerably longer than I have seen since I started monitoring this condition.

Assuming there are no further problems, I will accept this in a couple of days, indicating that the problem is indeed resolved.

(BTW, the log collector I used is "Log Collector" by Xtralogic Inc, and "WiFi Analyzer" is by farproc).

**Update: 2012-03-29 AM**: The root cause seems to be an inability to renew a DHCP lease - changing the lease time to 30 minutes caused the connection to drop precisely 30 minutes after connecting the phone to the router.

**Update: 2012-03-29 PM**: That there is a general problem renewing DHCP leases is born out by testing all day with a short lease time; every (or very nearly every) attempt at renewing the lease fails, and then disconnects and reconnects the WiFi service. Now knowing precisely what the problem is and what to search for, it may be that this is a long-standing problem with the Android WiFi service, present since 2.2 and still a problem even in 4.0.